What this API does
You mint a verification against your tenant account, get back acapture_url, and send that link to your end-user (an insurance claimant, a marketplace seller, whoever needs to prove a photo is real). They open the link on their phone, capture the photos you asked for, and the verification’s status moves through:
completed, the verification carries a verdict (verified / suspicious / failed) built from on-device signals — screen-recapture detection and AI-generation detection — plus the captured images themselves. You can also attach a claimant narrative and finalize the case for deeper batch analysis (Case Analysis).
Base URLs
Authentication
Server-to-server calls use a tenant-scoped API key, formatpk_live_<ulid>, sent as a bearer token:
A rial operator mints your API key today. The plaintext key is returned once, at mint time; only its hash is stored afterwards. If you’re integrating and don’t have a key yet, ask your rial contact.
rk_secret_…) that must never leave your servers — see Authentication for the full breakdown of both key types, plus environments and how the same key authenticates the mobile SDKs.
The link you hand your end-user needs no key at all: possession of the verification id in the URL is the credential for the capture flow (same trust model as a Stripe payment-intent client_secret) — see the API reference for the full set of auth modes.
Quickstart: zero to a verification
1
Issue a verification
POST /v1/verifications with either max_captures: N (N anonymous shots) or a steps array for guided slots. This example asks for 3 photos and requests both fraud signals:id (vfy_<ulid>) and capture_url — a link on verify.get-rial.com.2
Share the capture link
Send
capture_url to your end-user however you’d send any link — SMS, WhatsApp, email. No app install, no account: it opens directly in their mobile browser.3
The claimant captures photos
The hosted capture flow walks them through each requested shot, runs the on-device fraud signals, and uploads directly to storage. You don’t need to build any of this — it’s rial’s hosted page at the
capture_url you already have.4
Read back the result
reason_code names which signal drove the label — here, the capture looked like a screen recapture rather than a live photo. See Verdicts for the full signal set and what each one checks.If the response doesn’t contain a verdict object yet, analysis is still processing — poll again.5
Optional: skip polling with a webhook
Set
webhook_url when you create the verification (as in the example above) and rial POSTs to it instead of making you poll — deliveries are HMAC-signed with your tenant’s webhook secret so you can verify they actually came from rial.6
Optional: finalize for Case Analysis
If you collect a written narrative from the claimant, attach it and close the case for deeper multi-image cross-reasoning:
Next steps
Authentication
Both key types, environments, and how the SDKs authenticate.
Verdicts
What
status and verdict mean, and what each signal checks.Kotlin SDK
Capture natively on Android instead of hosting the link.
API reference
Every endpoint, request/response schema, and error shape — generated straight from the API’s own OpenAPI document.