---
title: "Report actuals (hours, final cents, crew). Secret key only."
method: POST
path: "/jobs/{id}/outcome"
---

# Report actuals (hours, final cents, crew). Secret key only.

`POST /jobs/{id}/outcome`

## Request

- Base URL: `https://widget.reelquoteai.com/api/v1`
- URL: `https://widget.reelquoteai.com/api/v1/jobs/{id}/outcome`
- Auth: HTTP bearer

## Request body

- OutcomeRequest: At least one of actual_hours, actual_total_cents, actual_crew.
  - `actual_hours` number
  - `actual_total_cents` integer: What was actually billed, in integer cents. Currency travels beside it — never assume USD.
  - `actual_crew` integer
  - `notes` string: Up to 1000 chars

## Response `200`

Recorded; credit minted on the first report

- OutcomeResponse
  - `job_id` string
  - `outcome_captured_at` string, date-time
  - `credit_awarded` boolean: true on the FIRST report for this job
  - `credit_cents` integer: Outcome credit minted against the mover's bill (half the survey's billed rate), in integer cents. Currency travels beside it — never assume USD.
  - `accuracy` object, nullable: Present when a total was reported and a quote existed.
    - `predicted_total_cents` integer: What the quote said, in integer cents. Currency travels beside it — never assume USD.
    - `actual_total_cents` integer: What you reported, in integer cents. Currency travels beside it — never assume USD.
    - `delta_cents` integer: actual − predicted, in integer cents. Currency travels beside it — never assume USD.
    - `delta_pct` number, nullable: One decimal
    - `predicted_hours` number, nullable
    - `actual_hours` number, nullable
    - `predicted_crew` integer, nullable
    - `actual_crew` integer, nullable

## Other responses

- `400`: `invalid_request` — A field is missing, malformed or not allowed in this state. `message` says which. `secret_key_in_url` — A secret key was sent as `?k=`. Secret keys go in the Authorization header only.
- `401`: `unauthorized` — No key, an unknown key, or a revoked key.
- `403`: `secret_key_required` — The endpoint is server-only; a publishable key cannot reach it. `insufficient_scope` — The key does not carry the scope this call needs (named in `message`). Mint one that does from the keys page or POST /keys. `key_rotated` — The calling key has been rotated and is in its grace period: it still serves jobs and quotes, but key management and the delivery log belong to its replacement. `mode_mismatch` — A test key tried to manage a live key. Live keys manage both modes; test keys manage test keys only.
- `404`: `not_found` — No such job for this key, or no such endpoint.
- `429`: `rate_limited` — Per-key limit (60/min publishable, 300/min secret), the mover's daily ballpark or video-analysis cap, or a visitor's daily catalog-search cap. Obey `Retry-After`. Carries `Retry-After` in seconds.

---

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