---
title: "Keep focusing (the answer to \"Still focusing?\")"
method: POST
path: "/focus/{focus_id}/keep"
tags: ["focus"]
---

# Keep focusing (the answer to "Still focusing?")

`POST /focus/{focus_id}/keep`

## 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}/keep`
- Auth: HTTP bearer

The only thing that resets the check once it is due. At or after the check deadline the focus is dead: the release is materialized and this answers 409 `focus_changed` with the released record (a late Keep never revives it). A `focus_id` that is not the caller's, already released, or no longer inside the caller's current scope (it is then released as `scope_lost`) is 409 `focus_changed`; the body never describes an out-of-scope record.

## 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/00252d8227c1?raw)
