# Statuses

> The lifecycle of a session and of the checks inside it.

Source: https://docs.okyc.stream/concepts/statuses

## Session

```text
created ─(link opened)─▶ started ─▶ in_progress ─(all steps submitted)─▶ processing
                                                                          │ rules
                                         ┌────────────────────────────────┼─────────────────┐
                                         ▼                                ▼                 ▼
                                     approved                         declined            review
                                                                                            │ reviewer
                                                               approved · declined · resubmission_requested
                                                                                            │
                                                                     back to in_progress ◀──┘
created | started | in_progress ─(expires_at)─▶ expired        any active status ─(cancel)─▶ cancelled
```

| Status                   | Meaning                                                   | Webhook                          |
| ------------------------ | --------------------------------------------------------- | -------------------------------- |
| `created`                | Session created; the link hasn't been opened.             | `session.created`                |
| `started`                | The applicant opened the flow.                            | `session.started`                |
| `in_progress`            | The applicant is completing steps.                        | —                                |
| `processing`             | Everything is submitted; checks and rules are running.    | `session.processing`             |
| `approved`               | Final: approved by rules or a reviewer.                   | `session.approved`               |
| `declined`               | Final: declined by rules or a reviewer.                   | `session.declined`               |
| `review`                 | Waiting for a reviewer.                                   | `session.review`                 |
| `resubmission_requested` | A reviewer asked the applicant to redo some steps.        | `session.resubmission_requested` |
| `expired`                | Final: not finished before `expires_at` (default 7 days). | `session.expired`                |
| `cancelled`              | Final: cancelled via the API or dashboard.                | `session.cancelled`              |

Admins can override a final decision (audited) with `POST /v1/sessions/:id/decision`.

## Check

`pending` → `running` → `passed` | `failed` | `inconclusive` | `error`

`error` is retried (up to 3 times with backoff), then the session goes to `review`. `inconclusive` means the
check couldn't decide (for example an unreadable document), or — with `provider: "manual"` — that it is waiting
for a reviewer ([manual verification](https://docs.okyc.stream/concepts/manual-verification.md)).

`verified_by` says who decided a `passed` / `failed` check: `source` (the registry or a cryptographic check) or
`reviewer` (manual verification).

## In the SDKs

The mobile and web SDKs report `complete` with a status hint (often `processing`, since checks run after
submission). Always read the final status from the webhook or the API.
