create_verification
Initiates identity verification for a phone, email, domain, social handle, wallet, account, or Telegram bot via a chosen channel, returning the challenge needed to prove ownership.
Instructions
Create a new identity verification. Initiates a verification flow for an asset identifier (phone number, email, domain, social handle, wallet address, account, or Telegram bot).
Agent usage: pass the asset type, the delivery channel, and the identifier (e.g. type "phone", channel "sms", identifier "+37060000000"; or type "email", channel "email", identifier "user@example.com"). The response carries a challenge object with the instruction for the chosen channel — except a telegram_bot verification made with a LIVE key, which the server completes on the spot and answers with status: verified plus a proof token and no challenge at all; with a pk_test_ key that same call stays pending and does carry a challenge. On the messenger channels it also carries challenge.deep_link — pass THAT to render_auth_link to give the user a clickable link and a QR code. This endpoint returns no qr_text at all. For OTP-based flows (sms/email), the user receives a code — poll get_verification or use wait_for_verification to track completion. For Telegram/WhatsApp, the user clicks the deep link to verify.
The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox.
ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Asset type being verified | |
| channel | Yes | Verification channel (must match the asset type, e.g. sms/whatsapp/telegram for phone) | |
| bot_token | No | Telegram bot token (required for channel "telegram_bot_token") | |
| identifier | Yes | The asset identifier to verify (E.164 phone, email address, domain, handle, wallet address, ...) | |
| profile_id | No | The sub-account (24 hex characters) this is for; omitted, the key's own sub-account, else the primary. Its branding and templates are used for every message. | |
| dns_provider | No | DNS provider credentials (required for channel "auto") | |
| email_prefix | No | Mailbox prefix for domain email verification | |
| client_metadata | No | Custom key-value metadata | |
| external_user_id | No | Your application user ID for grouping verifications | |
| proof_expiry_days | No | Per-request proof expiry override in days (1-365) |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | MongoDB ObjectId | |
| type | No | Type of asset being verified. Not yet available — no channel of theirs can be completed, so a create or start answers 400 `channel_not_available`: social, wallet, account. | |
| proof | No | Proof token after successful verification | |
| status | No | Current status of the verification | |
| channel | No | Channel used for verification. Not yet available — a create or start naming one answers 400 `channel_not_available`: github, google, facebook, x, linkedin, instagram, youtube, tiktok, ethereum, solana, bitcoin, coinbase, kraken. | |
| attempts | No | ||
| challenge | No | Challenge details for verification | |
| created_at | No | ||
| identifier | No | The identifier being verified; absent for an identifier-free phone verification, whose number is learned only when the person completes it | |
| updated_at | No | ||
| verified_at | No | ||
| max_attempts | No | ||
| external_user_id | No |