> ## Documentation Index
> Fetch the complete documentation index at: https://docs.heretic.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Read the outcome

> Read a ceremony's status and the step it reached.

<ParamField path="challenge_id" type="string" required>
  `chg_` and 32 lowercase hex characters, from [mint](/api/challenge-mint).
</ParamField>

<ParamField header="Authorization" type="string" required>
  `Bearer hrtc_sk_…`
</ParamField>

## Response

```json theme={"dark"}
{
  "api_version": "2",
  "challenge_id": "chg_0123456789abcdef0123456789abcdef",
  "status": "passed",
  "step_reached": "completed",
  "findings": [],
  "mode": "phone",
  "created_at": "2026-09-01T12:00:00.000Z",
  "expires_at": "2026-09-01T12:10:00.000Z",
  "completed_at": "2026-09-01T12:01:12.000Z"
}
```

`status` is `pending`, `passed`, `contradicted`, or `not_completed`. There is no other state and no fallback.

`step_reached` names where a `not_completed` ceremony stopped:

| Step                                             | Meaning                                                                |
| ------------------------------------------------ | ---------------------------------------------------------------------- |
| `motion-permission`                              | The visitor declined motion access.                                    |
| `motion-idle`                                    | The device reported no motion. Usually a desktop opened a `phone` URL. |
| `tilt-timeout`, `rotate-timeout`                 | The phone was not held level, or not turned, in time.                  |
| `evidence-measured`                              | The measurement session could not be taken.                            |
| `ceremony-excluded`                              | The device's passkey is already registered to another `account_ref`.   |
| `bytes-issued`, `ceremony`, `assertion-received` | The passkey step did not finish.                                       |

A ceremony still `pending` at `expires_at` becomes `not_completed` on the next read. `findings` carry stable `id` and `tier` values; an `absolute` or `composite` finding makes the outcome `contradicted`.

## Status codes

| Code  | Meaning                                                               |
| ----- | --------------------------------------------------------------------- |
| `401` | Bearer token missing or malformed.                                    |
| `404` | Unknown key, or a challenge that is not yours.                        |
| `429` | More than 600 calls a minute from your address. `retry-after` is set. |
| `503` | Store failure. Never `passed`.                                        |


## Related topics

- [Mint a challenge](/api/challenge-mint.md)
- [Quickstart](/quickstart.md)
- [Siteverify endpoint](/api/siteverify-endpoint.md)
- [Dashboard, sites, and keys](/dashboard/dashboard-and-keys.md)
- [Privacy and retention](/data/privacy-and-retention.md)
