Manage verification profiles from the Configuration console
The Verify → Configuration tab is the profile-management surface of the Verify family. It lists every verification profile your organization owns (“Verification Profiles — Manage Your Verification Profiles”) and opens each one for create/edit through a guided dialog. The rest of the Verify surface is then built on top of those profiles: the console page walks a verification row into a fraud-review state, and the API send path runs against a profile’s saved rules. This page is the name-firm center of that: create a profile from the console, edit the profile card, bind it to a send, and gate a profile change through the two-officer flow.1. Where this page sits in the Verify family
The Verify pages split into three views, and this one is the profile-management view:- Verify console: fraud gate, fraud score, and fallback forensics — the operator fraud-review view: the on-demand Fraud Score and Fraud Gate dialogs, the code-attempts log, and the fallback execution timeline for a single verification row.
- Verify profiles: fallback chains and advanced factors — the API-side walk of a profile: the fallback chain
channels[], code settings, templates, and the factor suite that runs beside it. - Verify → Configuration (this page) — the operator profile-management view: the five-step Create Profile wizard, per-profile edit dialogs, and the card grid those dialogs feed.
/:locale/verify/configuration redirects to Verify with the Configuration tab selected, so deep links land in the tab-embedded surface rather than a 404.
Profile writes under
GET|POST|PATCH|DELETE /api/v1/verify/profiles are rate-limited at the tenant’s read/write scopes, and every dashboard mutation also enforces a caller role — an owner, admin, or developer role is required to write. A profile change on the console is a tenant-owned control; nothing in this guide mandates a platform-side gate.2. What a verification profile contains
A profile is a tenant-owned configuration record that controls how OTP verifications behave for sends that carry its id. The console tab and the API schema expose the same fields; the wizard below writes them all.Pair voice biometrics beside the chain, not inside it. The Verify page’s voice-biometrics module is a separate surface — enroll a voiceprint, run a check, and set the confidence threshold — and it does not appear as an entry in
channels[]. An OTP chain carries the delivery channels a voice check can fall back to. The module itself lives on the Verify → main page; pair it with a profile by keeping the same tenant’s settings card open beside the profile, not by trying to reorder biometrics into a fallback step.3. The create-profile wizard, step by step
Click Create Profile on the Configuration tab header. The dialog is a five-step wizard — Basic Info → Code Settings → Templates → Fraud Prevention → Webhook — and each step validates before Next advances, so a blankname (or an above-order step-up risk threshold) can’t be skipped to the final submit. The step indicator only green-checks a step once you’ve moved forward from it error-free; unvisited future steps are inert (disabled rather than merely non-responsive). The dialog also locks its close affordances while a create/update is in flight so an Escape or outside click can’t cancel a pending save and leave a toast telling the wrong story.
- Basic Info — name the profile (1–100 characters) and order the channel chain. The channel list is a drag-to-reorder list with per-channel move-up / move-down buttons and a numbered
A → B → Corder display; each channel chip is labelled with the channel it renders. The wizard must list at least one channel; the API rejects achannelsmember whose provider isn’t connected (422 WHATSAPP_NOT_CONNECTEDand similarly named envelopes per channel). - Code Settings — pick the code length (4 / 6 / 8), set
expirySeconds(60–3600), and setmaxAttempts(1–10). - Templates — for every channel in the chain, write the body in the channel’s template field. A channel template that is set must contain the
{{code}}placeholder; the wizard chips it inline if the mandatory token is missing, and an empty template falls through to the server-side default, so empty is allowed. WhatsApp is exempt — itstemplates.whatsappvalue is the name of a Meta-approved authentication template selected through a dedicated picker — and missed-call/factor channels (flashcall, SNA, TOTP, push, magic-link, backup-code) are exempt by construction. - Fraud Prevention — choose the geo mode (allowlist / blocklist / none) and countries, the velocity caps, any IP-restriction CIDR list, and the composite-risk Fraud Guard levers (MCC/MNC blocklist, risk-step-up threshold
≤risk-block threshold, a channel-escalation remap block). The wizard’s own geo-set state survives navigation between steps instead of resetting on the step unmount. - Webhook — one delivery URL for this profile’s verification events; https (or http on localhost). Finish with Create verification profile.
4. Read — and edit — a profile card
Back on the grid, a profile card compresses the profile into grouped chips so you read its effective chain and fraud-gate settings without opening the dialog:- Channels — channel chips ordered as the chain is ordered (the same ordering the API fallback engine consumes).
- Fraud guard — a geo chip (“Allowlist: DE, FR” / “Blocklist: XX” / a full “No geographic restrictions” tooltip), the velocity chip (“Velocity limit: 20 sends per hour, 100 per day”, or “No velocity limits” when off), and the IP chip (“IP allowlist: 203.0.113.0/24, …”, or “No IP restrictions — all source IPs allowed”) when the list is set.
- Linked module — the webhook footer shows whether the profile carries a delivery URL; the paired biometrics enablement stays on the Verify → main page beside the profile, as noted above.
PATCH /api/v1/verify/profiles/{id}. Put a profile’s status to inactive to stop new sends without deleting it.
5. Bind the profile to a send
Pass the profile id on each send that should follow the profile’s rules:/verify/send body that carries no profile_id can override every saved rule inline — pass ad-hoc channels and a fallback_config block (per-channel channel_timeout_seconds, 10–600s, default 60s) in the same body and the send synthesizes a transient profile in place of a stored one. When a stored profile_id is present the profile wins — the inline override is skipped and the stored chain is re-loaded. The profile also constrains the send’s channel — passing a channel that isn’t in the profile chain is rejected with a 422 naming the allowed channels — so bind the profile and the same first channel out of its chain.
The
costOptimization.enabled toggle is the third lever here. When a profile turns it on, the send engine re-orders the chain at each advance to try the cheapest route first, with maxCascadeCostCents capping the cascade’s cumulative spend. It’s a profile tenant-owned control — the send honors it only when the bound profile has it set.6. Two-officer flow — submit a change for approval
When your organization’s verify two-officer policy is on (org-level settings underverification), a non-supervisor save on this page does not apply the change — the dialog’s save is gated into the approvals queue instead. The gate exists for two cases:
- OTP template change — a per-channel body a non-supervisor tried to write on create or edit. The queue row of kind
otp_templatecarries the rendered body inline so the supervisor judges the exact copy the recipient would see. - Resend burst — a second Nth send of the same code inside the org’s resend-burst window. Queue row kind
resend_burst.
The replay semantics depend on the queue row’s kind. An OTP-template approval re-reads the profile’s current row and applies the approved rendered body — the queue row references the profile by template id and the replay is a plain profile update run on the supervisor’s behalf. A resend-burst approval replays the resend-handler the
/verify/:id/resend route takes; if the replay throws, the row stays pending and the supervisor can retry. Either kind writes an immutable audit entry for the decision — the same append-only audit hook every profile save already uses.7. API parity
Everything above runs against the same control surface the API exposes — the console just picks it up over the dialog:
The
/configs paths are an alias of /profiles with identical behavior — use whichever your integration already references. Profile reads default to the tenant read rate limit; writes run behind the write-rate-limit + write-guard the dashboard passes.
The canonical per-endpoint schemas live under the Verify API reference. Walk the full send/check lifecycle beside the profile on the Verify profiles: fallback chains guide.
Troubleshooting
Sovereign compliance controls. The geo allowlist/blocklist, IP restriction list, MCC/MNC blocklist, velocity caps, and risk thresholds above are tenant-owned — they constrain verification posture for your organization only, and do not impose a platform-wide country or OFAC gate beyond your own policy.
See also
- Verify overview — send model, the channel catalog, and rate limits.
- Verify console: fraud gate, fraud score, and fallback forensics — the operator fraud-review view this page’s profiles feed.
- Verify profiles: fallback chains and advanced factors — the API-side walk of the same profile.
- OTP approvals workflow — the four-eyes queue this page gates a template change into.
- Two-officer approval gates — the same control, combined.
- Verify API reference — profile CRUD and send/check endpoints.