# 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-request
```

Auth: 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 |

200:

```
{
  "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_71ac33
```

Polling, 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 |

200 — verified:

```
{
  "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](/mandates/issue) — and it still needs a live `capture_id` from a human surface.

- MCP server: https://docs.sidaxis.com/mcp
- Assurance: https://docs.sidaxis.com/assurance
