---
title: "Meaningful input from the focuser (resets the idle check)"
method: POST
path: "/focus/{focus_id}/input"
tags: ["focus"]
---

# Meaningful input from the focuser (resets the idle check)

`POST /focus/{focus_id}/input`

## Request

- Base URL: `https://api.verdun.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.verdun.ai/focus/{focus_id}/input`
- Auth: HTTP bearer

The console sends this on meaningful input, throttled to about one per 10 s (what counts is the console's call; a live call or open voice session should keep pinging). Accepted only BEFORE the check is due; once the check is showing it is ignored (200 with the current record), because only an explicit Keep answers it. At or after the check deadline the focus is dead: 409 `focus_changed` with the released record. A `focus_id` that is not the caller's is 409 `focus_changed` with the caller's own current focus or null.

## Path parameters

- `focus_id` string, required

## Response `200`

Successful Response

- FocusRecord: One Focus generation (`id` IS the generation: a restart is a new id).
  - `id` string, required: The focus generation id; a restart is a new id.
  - `site_id` string, required: The site the focus is on.
  - `scope` FocusScopeOut, required
    - `kind` 'site' | 'camera', required: Whether the focus covers the whole site or one camera.
    - `camera_id` string, nullable: Set iff `kind` is `camera`.
  - `operator_id` string, required: The focuser.
  - `operator_name` string, nullable: Their display name; null if the operator no longer exists.
  - `started_at` string, required: ISO 8601, UTC.
  - `last_input_at` string, required: Last accepted meaningful input or Keep (ISO 8601, UTC).
  - `check_due_at` string, required: `last_input_at` + FOCUS_CHECK_IDLE_SECONDS: when the console asks "Still focusing?".
  - `check_deadline` string, required: `check_due_at` + FOCUS_CHECK_ANSWER_SECONDS: with no explicit Keep by then the server releases the focus (and treats it as released at once, before any sweep).
  - `check_pending` boolean, required: True while the check is due and unanswered (active records only).
  - `check_due_in_seconds` integer, required: Seconds until `check_due_at`, computed server-side: time it from this against the local clock at receipt.
  - `check_deadline_in_seconds` integer, required: Seconds until `check_deadline`, computed server-side.
  - `state` 'active' | 'released', required: `active` while reserving alarms; `released` once it has ended.
  - `released_at` string, nullable: When the focus was released (ISO 8601, UTC); null while active.
  - `release_reason` 'manual' | 'check_timeout' | 'disabled' | 'scope_lost', nullable: Why it was released; null while active.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/verdun/apis/verdun-api.md) - [All operations](https://skmtc.dev/verdun/apis/verdun-api/llms.txt) - [OpenAPI document](https://skmtc.dev/verdun/apis/verdun-api/revisions/35a2a6ebedda?raw)
