One Face for agents
An agent asks for a verification and receives a card; the person opens it on her own device and proves she is present; the agent reads the result.
The agent never touches a camera or a microphone, and the card grants no authority — it is a verification of presence, not a mandate.
1. Ask for a verification
POST /functions/v1/agent-verification-requestAuth: a first-party Sieve ID JWT in Authorization: Bearer, or the OAuth 2.1 bearer issued to an MCP client. A merchant API key is refused with USER_TOKEN_REQUIRED, because the card belongs to the merchant the agent represents and only an owner of that merchant may mint one.
| Field | Type | Notes |
|---|---|---|
merchant_id | string, required | |
external_ref | string | Your own reference |
purpose | string ≤140 | Shown to the person |
ttl_seconds | 60–900 | Default 300 |
{
"verification_id": "avr_71ac33",
"url": "https://id.sidaxis.com/capture?hs=...",
"merchant_id": "mrc_9f2c",
"external_ref": "support-ticket-4471",
"expires_at": "2026-09-16T12:06:03Z",
"ttl_seconds": 300
}The url is single-use on the hosted surface.
2. Read the outcome
GET /functions/v1/agent-verification-result?verification_id=avr_71ac33Polling, not webhooks. Every state is HTTP 200 with three message layers — reason, developer_message, user_message — never an error.
| State | Means |
|---|---|
pending | The card was never opened |
opened | The person is in the capture |
verified | She proved she was present; carries the assurance level and the receipt |
refused | The capture did not prove presence, with a named reason |
expired | The card's TTL passed |
{
"verification_id": "avr_71ac33",
"state": "verified",
"reason": "verified",
"developer_message": "Capture verified a live person at 2026-09-16T12:03:11Z.",
"user_message": "You are verified.",
"assurance_level": "face_voice",
"receipt_code": "RCP-4K2M-9QX7"
}Two guarantees
- The result is derived from what the capture recorded. Nothing and nobody can declare “verified” on its own, including the agent that asked.
- Every state is a refusal or a fact with a named reason, never an exception to catch.
What this is not
It does not issue a mandate, does not move money, and does not make the agent an authority. When the agent needs standing authority, that is mandates/issue — and it still needs a live capture_id from a human surface.