Intent Verification
Verify a user’s identity by sending them a magic link or OTP code. Get the result via webhook or a signed JWT on redirect.Flow
Setup
Create a child workspace
One per organization. Returns API credentials.app_id and api_key_token. Save both.
Skip this if you’re using a single app — just use your existing credentials.
Get an M2M token
short_token (scm2m_...) in X-Authorization for all verification requests.
Send a verification
| Field | Required | Description |
|---|---|---|
intent_name | yes | e.g. “Password Reset”, “Approve Ticket” |
method | no | email (default) or sms |
verification_type | no | magic_link or otp |
redirect_url | no | Where to send the user after verification |
meta_data.contact_email | for email | Recipient email |
meta_data.contact_phones | for sms | [{ "phone_number": "+15551234567", "phone_type": "mobile" }] |
meta_data.contact_name | no | Display name |
meta_data.ticket_id | no | Your reference ID — returned in webhooks and JWT |
meta_data.contact_id | no | Your user ID — returned in webhooks and JWT |
meta_data — they’re all echoed back.
Email magic link
SMS OTP
Getting the result
Option A: Redirect with JWT
After verification, the user is redirected to:scute_token is an RS256 JWT signed with your app’s key. Verify it against your JWKS:
scute_token is appended automatically.
Option B: Webhook
Events fire to your registered webhook URL.| Event | When |
|---|---|
verification.*.requested | Sent |
verification.*.verified | Confirmed |
verification.*.expired | Timed out |
verification.*.failed | OTP max attempts |
verification.*.denied | Contact denied (consent mode) |
verification.*.delivery_failed | SMS/email didn’t send |
* with email or sms.
Payload:
was_opened: true/false so you know if the link was ever clicked.
Signature: X-Webhook-Signature: t={timestamp},v1={hmac} — verify with HMAC-SHA256("{timestamp}.{payload}", webhook_secret).
Verification modes
Set in Settings > Verification. Dismiss (default) — confirm identity, redirect. Done. Consent — confirm identity, then ask the user to approve or deny the action. Webhook includesconsent_decision: "approved" or "denied".
Managing verifications
| Action | Endpoint |
|---|---|
| Check status | GET /v1/verify/{app_id}/verifications/{id} |
| Cancel | DELETE /v1/verify/{app_id}/verifications/{id} |
| Resend | POST /v1/verify/{app_id}/verifications/{id}/resend |
| Deny | POST /v1/verify/{app_id}/verifications/{id}/deny |
Settings
| Setting | Default |
|---|---|
| Tenant mode | full or verify_only |
| Verification mode | dismiss or consent |
| Redirect URL template | — |
| Redirect delay | 4s |
| Success message | ”Your identity has been successfully verified.” |
| Rate limit | 10/hour per contact |
Testing
Scute Testbench — connect with M2M token, search users, send verifications, watch webhooks live. Local webhooks:ngrok http 3000