Verifier API
Plain HTTP. Uploads are multipart forms; responses are JSON. Errors return { detail }.
POST /challenge
A phrase to read. Single use; expires 60 seconds after it is issued.
{ "challenge_id": "3f9a…", "phrase": "island lemon wagon anchor doctor", "expires_at": 1792841214 }POST /enroll
| Field | Value |
|---|---|
wallet | Base58 Solana address. |
challenge_ids ×2 | One per recording, in the same order as audio. |
audio ×2 | WAV, FLAC or OGG; 1–15 seconds; at most 2 MB. Any sample rate, resampled to 16 kHz mono. |
signature | Base58 ed25519 signature by wallet over the message below. |
voicegate enroll wallet: <wallet> challenges: <challenge_id_1> <challenge_id_2>
Success:
{ "wallet": "8vT3…", "person_id": "6620d83dfc77d7f6…", "signature": null }signature is the Solana transaction that issued the credential, and null while credentials are recorded by the verifier only.
| Status | When |
|---|---|
| 400 | Bad request, wrong words, takes don't match, unreadable audio, expired or reused challenge. |
| 401 | Signature isn't from wallet. |
| 409 | Voice already verified on another wallet, or this wallet already verified. |
| 413 | Recording over 2 MB. |
| 429 | Rate limited: 20 requests a minute per IP, 10 attempts an hour per wallet. |
| 502 | On-chain issuance failed; nothing was kept, try again. |
POST /enrollment/delete
Fields wallet, issued_at (unix seconds, within five minutes of now) and signature over:
voicegate delete wallet: <wallet> issued: <issued_at>
GET /status/:wallet
Whether a wallet is verified. Public: the airdrop list is one wallet per verified human.
{ "wallet": "8vT3…", "verified": true, "verified_at": 1792841154, "revoked": false }GET /stats
What the Network page shows. Contains no wallets.
{
"enrolled": 12, "attempts": 31, "threshold": 0.5, "liveness": "…",
"outcomes": { "enrolled": 12, "duplicate": 9, "words": 6, … },
"recent": [ { "at": 1792841214, "outcome": "duplicate", "score": 0.92 }, … ]
}POST /attest
For buying: a fresh recording from an already verified wallet returns a 60-second, single-use pass signed by the verifier. Fields wallet, challenge_id, audio. Returns 503 until buying is live. The pass format is in On-chain program.