For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
Persona offers three main ways to integrate an identity verification flow into your frontend: Hosted Flow, Embedded Flow, and Mobile SDK. These methods all provide UIs that your end users use to complete Persona inquiries. You’ll see these methods referred to as “Inquiry-based” integrations (also known as “Client-side” integrations).
This guide helps you choose the Inquiry-based integration method that best fits your technical resources, timeline, and product needs.
Transactions-based integrations
If you want to provide your own identity verification UI, you need to use a “Transactions-based” integration (also known as an “API-based” integration). To learn more or to get started, contact the customer support engineering team.
At a glance
At a glance, here’s how the main Inquiry-based integration methods compare:
Hosted Flow
Embedded Flow
Mobile SDK
Setup time
Minutes
Minutes-Days
Hours-Days
Engineering required
None-Low
Low-Medium
Medium-High
Platform
Web
Web
iOS/Android/React Native
Users stay in your app
No
Yes
Yes (in-app)
Best for
Quickest start; distributing via email/SMS
Web apps
Mobile apps
These key questions may help you make a quick decision:
┌─ Do you have engineering resources available?
├─ NO → Hosted Flow (fastest, no code required)
└─ YES → Do you have a native mobile app?
├─ YES → Mobile SDK (iOS/Android/React Native)
└─ NO → Do you want to keep users on your domain?
├─ YES → Embedded Flow (seamless web integration)
└─ NO → Hosted Flow with API (fast implementation, scalable)
Below, learn more about how each integration method works and how they compare.
When you use a Hosted Flow, users are redirected to a Persona-hosted page to complete verification. This page can be customized with your branding, but it lives on Persona’s domain.
How Hosted Flow works
Here is how you verify a user using Hosted Flow:
You send the user a URL (via email, SMS, or linked from your app).
The user clicks the link and is taken to <your custom subdomain>.withpersona.com/verify.
After the user completes verification, they can be redirected back to your site.
Technical implementation
There are three ways to use Hosted Flow:
Create a generic link (No code)
Use one link that autogenerates a new inquiry for each user
Best for: Sharing with small groups, simple use cases
Warning: Users who click the link multiple times will create duplicate inquiries
Create unique links manually (No code)
Create unique inquiry links one-by-one in the Persona Dashboard
Best for: Testing, very low volume (less than ~10 inquiries/month)
Create unique links via API (Some code required)
Programmatically create a unique inquiry link for each user
Best for: High volume and/or personalized experiences
Recommended for production use
Note that you can get started with a no-code approach, and migrate to the more scalable code-based approach later.
When to choose Hosted Flow
Hosted Flow may be a good choice if you have these constraints:
It’s acceptable for users to leave your site temporarily. (Required)
An Embedded Flow embeds Persona’s verification UI directly into your website as an iframe. Users never leave your domain, creating a seamless experience within your content.
How Embedded Flow works
Here’s how you verify a user using Embedded Flow:
Install Persona’s JavaScript SDK (~10 lines of code).
When a user visits your website, the SDK opens a modal or inline frame on your page.
The user completes verification without leaving your page.
Your code can receive callbacks when the user finishes verification.
Technical implementation
There are two ways to use Embedded Flow. Both require some code:
Generate inquiries from an inquiry template (Minimal code required)
Embed the web SDK and configure it with your inquiry template ID.
A new inquiry is created each time a user starts the flow.
Best for: small numbers of users, simple use cases
Warning: Users who load your page multiple times will create duplicate inquiries.
Pre-create inquiries via API (More code required)
Embed the web SDK.
For each new user, create a new inquiry ID via API, then pass the inquiry ID to the SDK.
Best for: High volume and/or personalized experiences
Recommended for production use
Note that you can get started with the simpler implementation, and build up to the more scalable approach later.
Here’s an example of the web SDK code that you would embed into your frontend:
1
import Persona from 'persona';
2
3
const client = new Persona.Client({
4
templateId: '<a Persona inquiry template ID starting with itmpl_>',
5
referenceId: "<a unique ID for the current user>",
6
environmentId: '<a Persona environment ID starting with env_>',