# rial > Verify that a photo is real, at the moment of capture. Developer documentation for the rial API, Kotlin SDK, and CLI. ## Docs - [rial developer documentation](https://docs.get-rial.com/index.md): Verify that a photo is real, at the moment of capture. - [Quickstart](https://docs.get-rial.com/quickstart.md): Zero to a verification with the rial API. - [Authentication](https://docs.get-rial.com/authentication.md): The two key types, and which environment to use them against. - [Verdicts](https://docs.get-rial.com/verdicts.md): How a verification's status and verdict are built, and what each signal means. - [Kotlin SDK](https://docs.get-rial.com/sdks/kotlin.md): Native Android capture for rial — v0.10.1. - [Swift SDK](https://docs.get-rial.com/sdks/swift.md): Native iOS capture for rial — coming soon. - [React Native SDK](https://docs.get-rial.com/sdks/react-native.md): Cross-platform capture for rial — coming soon. - [CLI](https://docs.get-rial.com/cli.md): Ad-hoc calls and scripting against the rial API. - [List (and search) tenant verifications, newest first](https://docs.get-rial.com/api-reference/verifications/list-and-search-tenant-verifications-newest-first.md): Newest-first list, opaque-cursor paginated. `next_cursor` from the previous page round-trips back as `?cursor=`; absent means the list is exhausted. - [Issue a new verification token](https://docs.get-rial.com/api-reference/verifications/issue-a-new-verification-token.md): Mints a verification the tenant's end-user redeems by uploading photos against the returned `capture_url`. The configuration (capture spec, required fraud signals, optional tenant `context`, optional `webhook_url`, optional `notify_email`) is immutable after issue — to change anything, issue a new v… - [Fetch a verification with its captures](https://docs.get-rial.com/api-reference/verifications/fetch-a-verification-with-its-captures.md): Returns the verification and every capture submitted against it (inlined). Capture `image_url` fields are presigned with a 1-hour TTL — the dashboard can drop them into `` with no auth handshake. The S3 bucket policy itself stays private. - [Public verification projection for the certificate page](https://docs.get-rial.com/api-reference/verifications/public-verification-projection-for-the-certificate-page.md): No auth required. Returns a **narrower** projection than `/v1/verifications/:id` — strips operator-only fields (attestation, telemetry, internal capture metadata). Audience is the public reader of `get-rial.com/v/:id` confirming a completed verification certificate. - [Audit timeline for a verification](https://docs.get-rial.com/api-reference/verifications/audit-timeline-for-a-verification.md): Every domain event the worker recorded against this verification, in chronological order. Powers the dashboard "Audit timeline" card. Read-only. - [Close a case for batch analysis](https://docs.get-rial.com/api-reference/case-analysis/close-a-case-for-batch-analysis.md): **New in GET-59.** Attaches the claimant's written `narrative` to the verification and emits `verification.case.completed` on the internal EventBridge bus. The case-analysis worker (`rial-platform-worker-staging` only today) picks that event up, fetches every capture associated with the verification… - [Mint a presigned S3 URL the client uploads bytes to](https://docs.get-rial.com/api-reference/captures/mint-a-presigned-s3-url-the-client-uploads-bytes-to.md): Stage 1 of the upload flow. Returns a single-use presigned PUT URL (5-minute TTL, locked to the specified `contentType`) the SPA / SDK uploads raw bytes to. Bypassing the Lambda avoids the 6 MB sync-invocation cap; the Lambda only sees the resulting `image_key` reference on stage 3 (`POST /captures`… - [Submit a capture against the verification](https://docs.get-rial.com/api-reference/captures/submit-a-capture-against-the-verification.md): Stage 3 of the upload flow (or stage 1 for inline-base64 payloads ≤ 6 MB). Two body shapes, discriminated by which field is present: - [Answer one text step of the capture spec](https://docs.get-rial.com/api-reference/captures/answer-one-text-step-of-the-capture-spec.md): Submit the answer to a TEXT step of the verification's `steps`. Same trust model as `/captures`: the path's token is the credential. - [Report a funnel-progress snapshot (GET-87)](https://docs.get-rial.com/api-reference/captures/report-a-funnel-progress-snapshot-get-87.md): Best-effort telemetry from the hosted-capture screen — powers "know when/where someone abandons a verification". Same trust model as `/captures`/`/answers`: the path's token is the credential. - [Mint a trial verification (no auth)](https://docs.get-rial.com/api-reference/public-trial/mint-a-trial-verification-no-auth.md): Powers the `get-rial.com/trial` QR-driven landing flow. Each visit mints a fresh verification under the rial. tenant (`tnt_rial`) tagged `originChannel='wa'` so the WA-completion worker delivers the verdict to the configured trial phone number once the user uploads a photo. - [List published link templates](https://docs.get-rial.com/api-reference/templates/list-published-link-templates.md): Newest-first list of the tenant's published templates, each with live `started_total` / `started_today` counters. - [Publish a link template](https://docs.get-rial.com/api-reference/templates/publish-a-link-template.md): Creates the template and its public link in one step — the link starts `active` (unless `status: "paused"` is sent) at `/l/{org}/{slug}`. The published snapshot starts at `version: 1` (GET-83); every verification minted from the link records the version it ran against. - [Revoke a template](https://docs.get-rial.com/api-reference/templates/revoke-a-template.md): Deletes the record and frees the slug. The public link starts returning 404 immediately; verifications already minted from it are untouched. - [Update a template (pause/resume, caps, republish snapshot)](https://docs.get-rial.com/api-reference/templates/update-a-template-pauseresume-caps-republish-snapshot.md): Partial update. Two classes of field behave differently (GET-83): - [Preview a CSV batch import](https://docs.get-rial.com/api-reference/templates/preview-a-csv-batch-import.md): Dry-run of `POST /v1/link-templates/{slug}/import` (GET-69/B6): parses the CSV, reports the resolved column mapping, row counts and per-row problems. Persists NOTHING — no job, no file, no worker trigger. The dashboard always calls this before submit so a bad file (wrong column, typo'd header) is ca… - [Poll an import job](https://docs.get-rial.com/api-reference/templates/poll-an-import-job.md): Progress of an async CSV import: `processing` → `completed` | `failed` | `aborted`, with bounded per-row errors (`invalid_rows` is capped at import time so this response never grows unbounded). ## OpenAPI Specs - [openapi](https://docs.get-rial.com/api-reference/openapi.json)