---
title: "Inventory analysed and priced."
method: POST
path: "job.complete"
---

# Inventory analysed and priced.

`POST job.complete` (webhook)

Signed: `X-ReelQuote-Signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body)`. Verify before trusting. Delivered with two quick retries.

## Payload

- object: Every webhook POST body. Signed: `X-ReelQuote-Signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body)` — verify before trusting, reject a `t` older than a few minutes. Delivered with two quick retries; answer 2xx fast and do the work afterwards.
  - `id` string, required: ULID, unique per delivery attempt set — dedupe on it
  - `event` 'job.complete', required
  - `created` integer, required: Unix seconds; the `t` in the signature
  - `livemode` boolean, required: false when the event comes from a sandbox job (a test key). Same envelope, same signature — branch on this.
  - `data` object, required: Per-event payload, documented under each webhook below
    - `job_id` string
    - `status` 'created' | 'uploading' | 'uploaded' | 'queued' | 'processing' | 'complete' | 'quoted' | 'booked_requested' | 'booked' | 'declined' | 'error': Funnel order. **created** — The job exists. Nothing uploaded yet. **uploading** — An upload URL was issued; the video is on its way. **uploaded** — A chunked upload was assembled (a single PUT skips this state). **queued** — POST /submit accepted; waiting its turn to be analysed. **processing** — The walkthrough is being analysed. Poll GET /jobs/{id}; typically 1–4 minutes. **complete** — Inventory ready. The firm quote is computed on the first read. **quoted** — A firm, bookable quote exists (set by the first GET after complete). **booked_requested** — The customer asked to book; the mover has not answered yet. **booked** — The mover confirmed the booking. **declined** — The mover turned the request down. `decline_reason` may say why. **error** — Analysis failed. `error` carries a message; upload again or contact the mover.
    - `move_date` string, date, nullable: YYYY-MM-DD
    - `customer` object, nullable: null until the customer has given contact details
      - `name` string
      - `email` string, nullable
      - `phone` string, nullable
    - `item_count` integer
    - `total_cuft` number
    - `quote_total_cents` integer: The firm price, in integer cents. Currency travels beside it — never assume USD.
    - `currency` string

## Acknowledgement `2XX`

Acknowledged. Answer fast; do the work afterwards.

## Other responses

- `default`: Anything else is retried twice, then recorded as the endpoint's last_error.

---

[API](https://skmtc.dev/reelquoteai/apis/reelquoteai-us-api.md) · [All operations](https://skmtc.dev/reelquoteai/apis/reelquoteai-us-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reelquoteai/apis/reelquoteai-us-api/revisions/56c304752192?raw)
