---
title: "Start Website Snapshot Route"
method: POST
path: "/api/v1/website/properties/{property_id}/snapshots"
tags: ["website"]
---

# Start Website Snapshot Route

`POST /api/v1/website/properties/{property_id}/snapshots`

Kick off a website capture; returns a snapshot to poll.

Idempotent while a capture is running: a second kickoff returns the
running snapshot. Verification is a hard 422 — the URL (given or stored)
must match the property's verified website, and a property with no
verified website is refused with the fix named (Locked Decision 4).

## Path parameters

- `property_id` string, uuid, required

## Request body

- StartWebsiteSnapshotRequest
  - `url` string, nullable

## Response `202`

Successful Response

- WebsiteSnapshotRead
  - `id` string, uuid, required
  - `property_id` string, uuid, required
  - `base_url` string, required
  - `registrable_domain` string, required
  - `status` 'queued' | 'discovering' | 'capturing' | 'completed' | 'failed', required — Lifecycle of a website capture run (see ``WebsiteSnapshot``). A real capture (discovery + rendering up to 60 pages in a browser) takes minutes, so the work runs on the arq worker and callers poll this status. QUEUED → DISCOVERING → CAPTURING → COMPLETED, or → FAILED at any point with a human-readable ``error_message``.
  - `pages_discovered` integer, required
  - `pages_captured` integer, required
  - `error_message` string, nullable, required
  - `design_tokens` WebsiteDesignTokens, required — Brand facts extracted from the rendered site (PR 7 fills these). The DB column is JSONB but this mirror is the only shape that crosses the API — never a raw dict (AGENTS.md: dict-typed response fields generate Record<string, unknown> and TS callers lose structural access).
    - `body_font` string, nullable
    - `heading_font` string, nullable
    - `text_color` string, nullable
    - `background_color` string, nullable
    - `link_color` string, nullable
    - `palette` PaletteEntry[]
      - `hex` string, required
      - `count` integer, required
    - `logo_url` string, nullable
    - `favicon_url` string, nullable
  - `started_at` string, date-time, nullable, required
  - `completed_at` string, date-time, nullable, required

## Other responses

- `403` — Error
- `404` — Error
- `422` — Error
- `503` — Error

---

[API](https://skmtc.dev/getanana/apis/cleon-api.md) · [All operations](https://skmtc.dev/getanana/apis/cleon-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getanana/apis/cleon-api/revisions/202b7d85683e?raw)
