---
title: "Set one onboarding mark (staff tick or customer skip)"
method: PUT
path: "/sites/{site_id}/onboarding-marks/{mark_key}"
tags: ["sites"]
---

# Set one onboarding mark (staff tick or customer skip)

`PUT /sites/{site_id}/onboarding-marks/{mark_key}`

## 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/sites/{site_id}/onboarding-marks/{mark_key}`
- Auth: HTTP bearer

Sets `mark_key` to now (UTC), stamped with the caller; setting it again refreshes it. `mark_key` is one of `setup_call`, `first_night`, `streaming_test` (staff ticks: owner, monitoring manager, operator, support) or `skip:setup_call`, `skip:instructions`, `skip:passcode`, `skip:speakers`, `skip:holidays` (customer skips: owner, monitoring manager, site manager within scope) or `completed` (the console's onboarding-complete latch: either set of roles). Any other key is 422. Returns the site's full projected map; who set a mark is never returned. Unknown or retired site is 404, and so is a site outside the caller's scope (a wrong role is 403). For streaming_test or first_night, send camera_ids with the exact tested or reviewed camera row IDs. A legacy write without coverage is accepted but cannot complete the streaming checklist.

## Path parameters

- `site_id` string, required
- `mark_key` 'setup_call' | 'first_night' | 'streaming_test' | 'skip:setup_call' | 'skip:instructions' | 'skip:passcode' | 'skip:speakers' | 'skip:holidays' | 'completed', required

## Request body

- SetOnboardingMarkRequest
  - `camera_ids` string[], required: For streaming_test or first_night: the exact camera row IDs covered by the connection test or first-night review. Other marks do not use a body.

## Response `200`

Successful Response

- OnboardingMarksResponse
  - `onboarding_marks` object: The site's full onboarding marks after the write: mark key -> when it was set (ISO-8601 UTC). Who set a mark is never exposed.
  - `streaming_test_camera_ids` string[], nullable: On streaming_test writes only: exact camera IDs covered by the saved test, or [] after clearing. Legacy marks without coverage return [].
  - `first_night_camera_ids` string[], nullable: On first_night writes only: exact camera IDs covered by the saved review, or [] after clearing. Legacy marks without coverage return [].

## 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)
