Skip to main content
Languages: every operation supports cURL, Node.js (TypeScript), Python, Go, Ruby, and PHP. The first 15 operations on this page show all six languages; the remaining 24 show cURL and TypeScript — the two most-used.

Verify API

Send and check OTP verification codes via SMS, WhatsApp, Email, Voice, Viber, or Telegram Base path: /api/v1/verify Endpoint count: 39

title: “Worked request and response samples” description: “Worked samples for the OTP verification flow: send a verifiable code, and check it. Each sample shows the request, the success envelope, and the error envelope to expect.”

Worked request and response samples

Copy a request body as written, substitute your own ids, and compare the response envelope. Errors follow Devotel Orbit’s { error, meta } envelope, shown once below under Error envelope.

Send a verification code

POST /api/v1/verify/send
Pick the channel you deliver the code on, and hold onto the returned verification_id for the check call. Request

Check a code

POST /api/v1/verify/check
Send the verification_id from the send call and the code the user typed. Request

Error envelope

An expired or wrong code returns 422 with VALIDATION_ERROR; repeated wrong codes are rate-limited.
422

Gate a verification on identity signals

POST /api/v1/verify/fraud-gate
Decide whether to trust a number before sending the OTP. One call fuses the three carrier-asserted takeover signals — SIM-swap recency, port-event (number recycling), and silent network auth possession — into a single allow / review / deny decision. Request
Add a device-bound access_token (from the three-legged Silent Auth flow) to also check possession, and pass any backups you already hold — number_recycled, roaming, reputation_risk_level, call_forwarding_unconditional. Operator-asserted results always win over the backups you supply; when no carrier integration is configured, the gate still answers from your backups and lists the operator signals under signals_unavailable.
The three headline signals are audited in headline_signals so you can tell “SIM-swap came back clean” apart from “SIM-swap was not evaluated”. A missing signal always contributes zero risk in either direction — you can tune the fusion per request with weights (0-100 per signal) and thresholds (the review / deny cut points on the 0-100 score). Nothing is ever sent to the subscriber by this call; it is a read-only network check.
GET /api/v1/public/verify/magic-link/consume
Public, unauthenticated endpoint that consumes a single-use magic-link token emitted by POST /verify/send with channel: "magic_link". Validates the HMAC + expiry in constant time, then approves the underlying verification row by replaying the embedded OTP code through VerifyService.checkVerification. Single-use, brute-force lockout, and PSD2 SCA binding are enforced by the same row-state machine every other Verify channel uses.

List verifications

GET /api/v1/verify
Retrieve verification records with cursor-based pagination.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Get verification

GET /api/v1/verify/{id}
Retrieve a single verification record by ID.
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Get verification detail

GET /api/v1/verify/{id}/detail
Consolidated detail DTO for the verification-request drawer. Returns the verification row plus fallback timeline, profile name, and a masked code-attempt log (submitted digits limited to the trailing 4 characters only).
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Verification analytics

GET /api/v1/verify/analytics
Aggregate totals, status, and channel breakdown for verifications over a rolling look-back window. Optional window_days query (1-90, default 30); the applied window is echoed back as window_days. Optionally narrow the aggregate with channel, status (pending | verified | approved | expired | failed), and from / to ISO-8601 bounds — the counts are then a server-side COUNT(*) for that filter rather than for the whole org.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

List pending

GET /api/v1/verify/approvals/pending
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

List settings

GET /api/v1/verify/approvals/settings
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

List verification configs

GET /api/v1/verify/configs
Retrieve every verification config configured for the tenant. The /configs paths are a frontend-facing alias of /profiles with identical payloads and behaviour.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Get verification config

GET /api/v1/verify/configs/{id}
Retrieve a single verification config by ID. The /configs paths are a frontend-facing alias of /profiles with identical payloads and behaviour.
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Verify Fraud Shield conversion anomaly

GET /api/v1/verify/conversion-anomaly
Detect artificially-inflated traffic (AIT / SMS-pumping) on the Verify product via per-destination OTP completion-rate anomaly (verified vs sent): destinations converting far below the tenant baseline against a material send volume are flagged, with an estimated carrier spend-at-risk figure. Optional window_days query (1-90, default 30).
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Export AIT chargeback evidence (CSV)

GET /api/v1/verify/conversion-anomaly/evidence-export.csv
Download the flagged (AIT-suspect) destinations from the conversion-anomaly report — plus the Fraud Guard block/step-up ledger totals for the same window — as an RFC-4180 CSV evidence pack suitable for a carrier/MNO chargeback dispute. Optional window_days query (1-90, default 30). A tenant with no flagged destinations downloads a header-only file.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

List backup-codes

GET /api/v1/verify/factors/backup-codes
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

List totp

GET /api/v1/verify/factors/totp
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Verify Fraud Guard analytics

GET /api/v1/verify/fraud-analytics
Aggregate AIT / SMS-pumping defense metrics from the persisted fraud-event ledger: blocked + step-up totals, per-channel and per-reason breakdowns, a per-day time series, and estimated blocked spend saved. Optional window_days query (1-90, default 30).
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

List verification profiles

GET /api/v1/verify/profiles
Retrieve every verification profile configured for the tenant.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Get verification profile

GET /api/v1/verify/profiles/{id}
Retrieve a single verification profile by ID.
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Cancel verification

POST /api/v1/verify/{id}/cancel
Cancel a pending verification.
string
required
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Resend verification

POST /api/v1/verify/{id}/resend
Resend a verification code for a pending verification.
string
required
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Create approve

POST /api/v1/verify/approvals/{id}/approve
string
required
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Create reject

POST /api/v1/verify/approvals/{id}/reject
string
required
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Send bulk verifications

POST /api/v1/verify/bulk
High-throughput OTP fan-out for login surges / password-reset campaigns. Accepts an array of up to 1000 recipients sharing one channel + optional profile/template. Each recipient flows through the same per-recipient send pipeline as POST /verify/send (rate limit, fraud velocity, wallet deduct, MessageRouter dispatch), so invariant #45 (SMS/voice via Devotel softswitch only) is preserved. Returns 201 when all sent, 207 (Multi-Status) on partial success, 400 when every recipient failed for a caller reason (invalid recipients, rejected profile/channel, rate limit, insufficient funds), or 503 when every recipient failed because of a genuine upstream delivery outage (SDK-retryable, matching POST /verify/send’s contract for the same failure).
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Check a verification code

POST /api/v1/verify/check
Validate a verification code against the stored record.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
string
required
ID returned from the send step. Format is vrf_<hex> (per generateId('verification')); NOT a bare UUID — paired with the matching loosening on profile_id to prevent the same format: uuid mismatch (DEVOTEL-ORBIT-28 family).
string
required
Verification code entered by the user

Create verification config

POST /api/v1/verify/configs
Create a new verification config describing OTP delivery behaviour: an ordered fallback chain over the supported channels (sms, whatsapp, email, viber, voice, telegram, …), code length, expiry, max attempts, per-recipient rate limit, and optional per-channel templates overrides (e.g. templates.sms, templates.voice). A template body may reference , , , , — every one of those resolves on every channel EXCEPT {{magic_link_url}}, which is only supplied on the magic_link channel’s template. Any other {{…}} token is left in the message exactly as written and delivered to the recipient verbatim. The /configs paths are a frontend-facing alias of /profiles with identical payloads and behaviour.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Create backup-code factor

POST /api/v1/verify/factors/backup-codes
Mint 10 single-use backup codes for an end-tenant user. The plaintext codes are returned ONCE in the response; the server stores SHA-256 hashes only and cannot recover plaintext. Use this surface for recovery flows when the user has lost their device + SMS access (Twilio/Auth0/Authy parity).
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
string
required
Identifier for the end user these backup codes belong to, such as their email or username. Required, 1 to 200 characters.
string
Optional label stored with the factor for display in your own factor-management UI. Up to 200 characters.

Verify backup code

POST /api/v1/verify/factors/backup-codes/{id}/verify
Consume one backup code against a provisioned factor. The same code cannot succeed twice (single-use, enforced via an UPDATE … WHERE consumed_at IS NULL gate). Returns remaining_count so the FE can prompt regeneration when the user is low on codes.
string
required
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Create TOTP factor

POST /api/v1/verify/factors/totp
Provision an authenticator-app (RFC 6238) factor. Returns the otpauth:// URI for QR rendering plus the base32 secret for manual entry. The secret is surfaced ONCE — subsequent list/get calls return metadata only.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
string
required
Identifier for the end user this authenticator factor belongs to, such as their email or username. It is written into the otpauth:// URI and shown beside the generated code in the user’s authenticator app. Required, 1 to 200 characters.
string
Optional label stored with the factor for display in your own factor-management UI. Up to 200 characters.

Regenerate TOTP recovery codes

POST /api/v1/verify/factors/totp/{id}/recovery-codes/regenerate
Invalidate the factor’s existing recovery codes and return a fresh batch of 10 single-use codes. The new plaintexts are surfaced ONCE — only their SHA-256 hashes are persisted at rest. Used after a device is restored or the prior codes are suspected exposed.
string
required
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Verify TOTP code

POST /api/v1/verify/factors/totp/{id}/verify
Validate a 6-digit code against a provisioned TOTP factor (RFC 6238, 30s step, ±1 step skew window).
string
required
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Identity-verification fraud gate

POST /api/v1/verify/fraud-gate
Fuse SIM-swap recency, port-event reassignment (number recycling), and silent-network-auth possession into ONE composite risk verdict (decision / risk_score / risk_level / reasons) for fraud gating. Caller-held backups (roaming, reputation, recycling) fill operator gaps; a device-bound access_token unlocks the silent-network-auth possession dip. Operator-asserted CAMARA signals win over caller-held backups; an unconfigured deployment degrades to caller-held evidence with operator signals in signals_unavailable (fail-closed). Read-only identity signals only — nothing is sent outbound.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
string
required
The phone number to gate, in E.164 format (e.g. +14155550100).
string
Device-bound access token from the 3-legged Number Verification flow. When present, possession is checked; otherwise the silent-network-auth signal is not evaluated.
number
SIM Swap look-back window in hours (CAMARA range 1..2400). Default 240.
number
Number Recycling / port-event look-back window in days (CAMARA range 1..2555). Default 30.
boolean
Caller-held port-event / recycling backup assertion.
boolean
Caller-held HLR roaming flag.
string (enum: low|medium|high|unknown)
Caller-held line-type / reputation bucket.
boolean
Caller-held unconditional call-forwarding assertion.
object
Per-request fusion weight overrides (0-100 each); merged onto defaults.
object
Per-request decision-threshold overrides on the composite 0-100 score.

Score phone-number fraud risk

POST /api/v1/verify/fraud-score
Verify Fraud Scoring add-on. Pre-screen a phone number for SIM-swap & line-type fraud risk from a live number-intelligence dip WITHOUT sending an OTP. Returns a transparent composite 0-100 risk_score, a coarse risk_level (low/medium/high), an advisory recommendation (allow/step_up/block), the contributing reasons, and the underlying SIM-swap / line-type / roaming detail. Fail-open: an upstream lookup outage returns a 0 / allow score flagged lookup_available: false rather than an error, so a flaky HLR can never brick the caller.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
string
required
The phone number to score, in E.164 format (e.g. +14155550100).

Create verification profile

POST /api/v1/verify/profiles
Create a new verification profile describing OTP delivery behaviour: an ordered fallback chain over the supported channels (sms, whatsapp, email, viber, voice, telegram, …), code length, expiry, max attempts, per-recipient rate limit, and optional per-channel templates overrides (e.g. templates.sms, templates.voice). A template body may reference , , , , — every one of those resolves on every channel EXCEPT {{magic_link_url}}, which is only supplied on the magic_link channel’s template. Any other {{…}} token is left in the message exactly as written and delivered to the recipient verbatim.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Send a verification code

POST /api/v1/verify/send
Generate and deliver a one-time verification code via the specified channel.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
string
required
Recipient (E.164 phone or email)
string (enum: sms|whatsapp|email|viber|voice|telegram|…)
Delivery channel for the OTP (defaults to sms)
string (enum: sms|whatsapp|email|voice|viber|telegram|…)[]
Optional ad-hoc fallback channel chain (overlays the send when no profile_id is set)
object
Optional async fallback engine config (pairs with channels)
integer
Max verification attempts
string
Optional verification profile ID. Format is vprof_<hex> (per generateId("vprof")); NOT a bare UUID — the prior format: uuid constraint here was the root cause of DEVOTEL-ORBIT-28 (27 events in 11 days) where every FE call with a real profile id 422’d before reaching the Zod parse.
string
Optional ISO 3166-1 alpha-2 country hint (e.g. TR) so national-format phone numbers normalise to the E.164 form OTP providers require. Not needed for clean E.164 input.
integer
Number of digits in the generated OTP (defaults to 6). Must equal custom_code length when a custom code is supplied.
object
Optional PSD2 SCA dynamic-linking binding. Replay the SAME object on POST /verify/check; a mismatch rejects with BINDING_MISMATCH. Omit for non-PSD2 flows.
string (enum: en|es|fr|de|it|pt|…)
Optional 2-letter language code selecting the localized voice TTS and SMS body for the built-in fallback message. Profile-defined templates override it. Region tags (e.g. es-MX) are rejected — use es.
string
Optional caller-supplied OTP (4–8 digits, digits only) for sandbox / test-mode QA. Rejected on live keys. Its length must equal code_length.
string
Device-bound network access token for the sna channel (Silent Network Authentication), obtained via the GSMA Open Gateway / CAMARA flow. When present on an sna send, verification completes via a network possession-proof and no OTP is minted.

Update settings

PUT /api/v1/verify/approvals/settings
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Update verification config

PATCH /api/v1/verify/configs/{id}
Partially update an existing verification config. templates overrides follow the same placeholder contract as create: , , , , , with {{magic_link_url}} resolving only on the magic_link channel’s template. The /configs paths are a frontend-facing alias of /profiles with identical payloads and behaviour.
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Update verification profile

PATCH /api/v1/verify/profiles/{id}
Partially update an existing verification profile. templates overrides follow the same placeholder contract as create: , , , , , with {{magic_link_url}} resolving only on the magic_link channel’s template.
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Delete verification config

DELETE /api/v1/verify/configs/{id}
Delete a verification config. The /configs paths are a frontend-facing alias of /profiles with identical payloads and behaviour.
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Delete backup-codes

DELETE /api/v1/verify/factors/backup-codes/{id}
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Delete totp

DELETE /api/v1/verify/factors/totp/{id}
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Delete verification profile

DELETE /api/v1/verify/profiles/{id}
Delete a verification profile.
string
required
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.