# Verified Docs > Documentation for the Verified platform Full documentation, 49 pages, one per section below. Index: https://docs.verified.inc/llms.txt --- # Welcome to Verified Source: https://docs.verified.inc/index.md Welcome! At Verified, we help companies like yours **onboard real people faster.** We provide 4 products you can combine like puzzle pieces: **[Text to Signup](https://docs.verified.inc/text-to-signup.md) is a marketing superpower.** It lets you create magical ads that convert verified users instantly, both online and offline. _Try it yourself [here](https://1-click.demo.verified.inc/register?product=TextToSignup)!_ **[1-Click Verify](https://docs.verified.inc/1-click-verify.md) is the easiest way to verify a user's phone number.** This allows you to then easily take the user into 1-Click Signup and 1-Click Health. For some users, we can even autofill their verified phone number _from nothing!_ **[1-Click Signup](https://docs.verified.inc/1-click-signup.md) is the fastest way to sign up new users.** From just a verified phone number, Verified can autofill a user's info (Name, Birthday, Address, Sex, and SSN) so they can share it in less than 10 seconds. _Try it yourself [here](https://1-click.demo.verified.inc/register?product=1ClickSignup)!_ **[1-Click Health](https://docs.verified.inc/1-click-health.md) is a magical way to find a user's health insurance.** From just name and birthday, Verified can autofill a user's health insurance and run eligibility checks for it, so the user can have their insurance on file in less than 30 seconds. If you use 1-Click Signup to autofill the inputs, the user doesn't have to enter _any_ additional info to have their insurance autofilled! **When multiple of these products are combined, they provide a full stack growth solution:** - Text to Signup is for **marketing:** it helps you make users want to sign up. - 1-Click Verify and 1-Click Signup are for **onboarding:** they help you convert users who already want to sign up. - 1-Click Health is for **healthcare:** it helps you (if you're a healthcare company) turn users who signed up into active patients. If you have any questions, [book a call with us](https://calendly.com/verified-inc/intro-with-verified) or email us at [Support@Verified.inc](mailto:Support@Verified.inc) anytime. We're excited to support your growth! ✅ --- Source: https://docs.verified.inc/ Next: Custom Demo — https://docs.verified.inc/custom-demo.md --- # Custom Demo Source: https://docs.verified.inc/custom-demo.md Our [Demo](https://1-click.demo.verified.inc/) lets you experience [1-Click Signup](https://docs.verified.inc/1-click-signup.md) and [Text to Signup](https://docs.verified.inc/text-to-signup.md) firsthand. You can use it both in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) (with mock data) and [Production](https://docs.verified.inc/reference/api/environments.md#production) (with your real, verified data). ## Generate a Custom Demo You can instantly generate a custom version of the Demo anytime on our [website](https://verified.inc/) or using the form below. Just enter your work email, and we'll brand the Demo with your company's name, logo, and color: The form on this page does this for you. To do it by hand, note that a demo that works across **both** environments needs the brand-creation endpoint called **twice**, once per environment with the same email, and the two resulting brand ids combined into a single URL. ### Step 1: Create the brand in both environments Call both endpoints with the same email address: | Environment | Endpoint | | --- | --- | | Sandbox | `POST https://sales-tools-service-api.sandbox-verifiedinc.com/customers/brands` | | Production | `POST https://sales-tools-service-api.verified.inc/customers/brands` | Body is `{"email":"you@company.com"}`, content type `application/json`. Each returns a response shaped like: ```json { "1ClickDemoUrl": "https://1-click.demo./register?brand=", "brandInfo": { } } ``` ### Step 2: Extract the brand id from each response The value you need is the `brand` query parameter off each response's own `1ClickDemoUrl`, not the full URL: ```bash prod_brand=$(curl -s -X POST https://sales-tools-service-api.verified.inc/customers/brands \ -H 'Content-Type: application/json' -d '{"email":"you@company.com"}' \ | jq -r '.["1ClickDemoUrl"]' | sed -n 's/.*brand=//p') sandbox_brand=$(curl -s -X POST https://sales-tools-service-api.sandbox-verifiedinc.com/customers/brands \ -H 'Content-Type: application/json' -d '{"email":"you@company.com"}' \ | jq -r '.["1ClickDemoUrl"]' | sed -n 's/.*brand=//p') ``` ### Step 3: Build the combined demo URL Production's brand id maps to `primaryEnvBrand`, sandbox's to `secondaryEnvBrand`. The base is production's own `1ClickDemoUrl` without its query string, which today is `https://1-click.demo.verified.inc/register`: ``` https://1-click.demo.verified.inc/register?primaryEnvBrand=${prod_brand}&secondaryEnvBrand=${sandbox_brand}&configOpen=true ``` `configOpen=true` opens the demo's configuration panel on load, and is optional. > ⚠️ The two single-env `1ClickDemoUrl` values you get back in Step 1 are **not** > directly usable as the combined link: they're per-environment demo links in their > own right (e.g. `1-click.demo.sandbox-verifiedinc.com?brand=...`). The combined, > environment-toggling demo lives only at `1-click.demo.verified.inc/register` and > needs both ids assembled as shown above. > **Tip** > > **Use your work email.** We use AI to auto-magically set brand information based on your email domain, so you don't have to manually enter it! ## Access the Demo from the Dashboard You can also open versions of the Demo specific to your brand settings from within the [Dashboard](https://dashboard.verified.inc/): 1. Log into your Dashboard account. 2. Go to the Brand Details page for one of your brands. 3. Click the **Open Demo with These Settings** button. This will open a version of the Demo that reflects the brand settings you have configured in the Dashboard, making it easy to test that the flow works as you want it to. --- Source: https://docs.verified.inc/custom-demo Previous: Welcome to Verified — https://docs.verified.inc/index.md Next: Dashboard SSO Guide — https://docs.verified.inc/dashboard-sso-guide.md --- # Dashboard SSO Guide Source: https://docs.verified.inc/dashboard-sso-guide.md The Verified [Dashboard](https://dashboard.verified.inc/) supports SSO. This guide explains how to enable it for your company's account, using Okta as an example identity provider. > **OIDC Support is Coming Soon** > > **We currently only support SAML.** OIDC support is coming soon. ## 1. Access the Dashboard. **Create or log into your Verified [Dashboard](https://dashboard.verified.inc/) account.** **How to Create a Dashboard Account** ### a. Enter your email and click the 1-Click Login button. We'll send you a verification code by email. > **Tip** > > **Use your work email.** We use AI to auto-magically set brand information based on your email domain, so you don't have to manually enter it! ### b. Complete the verification step. Click the verification button in the email or enter the verification code. We'll automatically log you in. _It's a 1-click experience, as promised!_ ### c. (optional) Set up MFA. Set up multi-factor authentication with an authenticator app. This is optional until you request approval for [Production](https://docs.verified.inc/reference/api/environments.md#production) access, at which point it's required. ### d. (if necessary) Confirm your company name. If you're creating the Dashboard account for your company, we'll ask you to confirm your company name. _If someone on your team has already created your account, you won't need to do this._ If your account doesn't have a brand yet, we'll automatically create one for you and take you to its Brand Details page. > **Why Multiple Brands?** > > Your company account can have one or more brands. Generally, you'll only need one brand, but there are some cases where it's helpful to use multiple. For example: > > > - **If you have multiple products:** If you have products that go by different names, it can be useful to create different brands to help users know which product they're using 1-Click Signup for — and to help your team track metrics specific to that product. > - **If you want to try different brand settings:** If you want to change brand settings without affecting your existing implementation (even in Sandbox), you can duplicate your brand and configure different settings on the new brand. ### e. (optional) Invite team members. Invite your team members to join your Dashboard account. ## 2. Create an SSO organization. 1. Click Account in the left menu. 2. Click the SSO tab. 3. Click the Create Organization button. 4. Click the Enable button. Then, you'll see Configuration and Identities tables on the page. ## 3. Create a configuration. **Click the Create button next to Configurations.** This will create a new configuration with service provider information that you'll use to set up your identity provider (for example Okta). ## 4. Set up your identity provider. > **Tip** > > The steps below describe how to do this in Okta, but the same basic steps apply to any identity provider. In Okta: 1. Click Applications and then Applications again in the left menu. 2. Click the Create App Integration button. 3. Select SAML 2.0 and click the Next button. 4. Copy values from the Verified Dashboard into Okta's SAML settings and click the Next button. 5. Click the Finish button. 6. Click the Sign On tab. 7. Copy the Metadata URL under "Metadata details". ## 5. Edit your configuration. Back in the Verified Dashboard (on the Accounts page, with the SSO tab active): 1. Click the arrow on the left of your configuration. 2. Click the Edit button. 3. Paste the Metadata URL (copied in the previous step). 4. Click the Update button. ## 6. Assign users in your identity provider. Now, you can assign users to your Verified Dashboard account using your identity provider. **That's it! SSO will be enabled for your account. ✅** --- Source: https://docs.verified.inc/dashboard-sso-guide Previous: Custom Demo — https://docs.verified.inc/custom-demo.md Next: Text to Signup — https://docs.verified.inc/text-to-signup.md --- # Text to Signup: Overview Source: https://docs.verified.inc/text-to-signup/overview.md | | | | --- | --- | | Speed | <10 seconds to complete Text to Signup | | Benefits | - Convert verified users both offline and online - Make offline ads trackable and high converting - Give users a magical first interaction with your brand | | Coverage | ~99% of US adults (>264M people) | | Setup Time | 5 minutes — _no code!_ | | Integration Time | 1-2 hours (integration is optional) | ## About Text to Signup **Text to Signup is a marketing _superpower_.** It lets you create magical ads that convert verified users instantly, both online and offline. Try it yourself using the examples below: [![](https://docs.verified.inc/assets/images/email-with-qr-code-cba767aa4f35b7689c46c099ed37b222.png)](https://1-click.verified.inc/tts/84fdts) _Example online ad using a [magic button](https://docs.verified.inc/text-to-signup/guide.md#magic-button) and [magic QR code](https://docs.verified.inc/text-to-signup/guide.md#magic-qr-code)_ _Example offline ad using a [magic QR code](https://docs.verified.inc/text-to-signup/guide.md#magic-qr-code)_ You can use Text to Signup with no code and be live in a matter of minutes! Or, you can do some (low code) integration work if it's helpful for your use case. This allows you to check that users' phone numbers are verified or take users through a [1-Click Signup](https://docs.verified.inc/1-click-signup.md) flow, where we can autofill verified data for them (such as Name, Address, Date of Birth, Full SSN, and more). See the Text to Signup [Guide](https://docs.verified.inc/text-to-signup/guide.md) for details. ## SMS Compliance SMS campaigns in the US — especially those that use short code phone numbers — are subject to onerous compliance reviews by SMS platforms and phone carriers. We handle all of this complexity, so you don't have to. > **Marketing SMS** > > When a user goes through a Text to Signup flow, you'll receive their phone number. If you want to send marketing SMS to that number, it's your responsibility to get their consent to do so and handle any additional compliance that's required. Text to Signup doesn't collect such consent on your behalf, since Text to Signup doesn't send marketing SMS. ## User Experience A user sees a Text to Signup ad. To respond to a Text to Signup powered ad, all a user needs to do is: 1. Text a keyword to a number (e.g. Text HOOLI to 50555) 2. Click a verification they receive in an auto reply text The [magic link](https://docs.verified.inc/text-to-signup/guide.md#magic-link), [magic button](https://docs.verified.inc/text-to-signup/guide.md#magic-button), and [magic QR code](https://docs.verified.inc/text-to-signup/guide.md#magic-qr-code) we provide make this even easier: They autofill the number and an SMS draft, so the user doesn't even have to type anything. _It takes less than 10 seconds, end to end!_ See [User Experience](https://docs.verified.inc/text-to-signup/user-experience.md) for full details. ## Benefits - **Convert verified users both offline and online:** Each user that goes through Text to Signup is a _verified_ user, making them a far more valuable lead. - **Make offline ads trackable and high converting:** Make offline ads useful for more than brand awareness, by giving users an immediate way to respond. - **Give users a magical first interaction with your brand:** Show you're at the cutting edge, and delight users with a special experience. ## Coverage Text to Signup works for 99% of US adults (264M people): anyone with a cell phone! > **Important** > > **We currently only cover people in the United States,** but we're soon adding new geographies. If there are particular geographies that would be most helpful for your use case, please let us know by emailing [Support@Verified.inc](mailto:Support@Verified.inc), and we'll prioritize accordingly. --- Source: https://docs.verified.inc/text-to-signup/overview Section: Text to Signup — https://docs.verified.inc/text-to-signup.md Next: User Experience — https://docs.verified.inc/text-to-signup/user-experience.md --- # Text to Signup Source: https://docs.verified.inc/text-to-signup.md - [Overview](https://docs.verified.inc/text-to-signup/overview.md): Overview of Text to Signup - [User Experience](https://docs.verified.inc/text-to-signup/user-experience.md): User Experience for Text to Signup - [Guide](https://docs.verified.inc/text-to-signup/guide.md): How to set up and integrate Text to Signup --- Source: https://docs.verified.inc/text-to-signup Previous: Dashboard SSO Guide — https://docs.verified.inc/dashboard-sso-guide.md Next: Overview — https://docs.verified.inc/text-to-signup/overview.md --- # Text to Signup: Guide Source: https://docs.verified.inc/text-to-signup/guide.md | | | | --- | --- | | Time to Complete | Depends on integration work (which is optional): - 5 minutes if no integration work - 1-2 hours if some integration work | | Skills Required | Depends on integration work (which is optional): - No technical skills if no integration work - Make API calls if some integration work | This Guide includes lots of detail so you have all the information you might need. But don't let it scare you! **Using Text to Signup is extremely easy and intuitive, and you can go live with it in a matter of minutes.** If you spend a couple minutes clicking around in the [Dashboard](https://dashboard.verified.inc/), you'll see how it works. You can try it yourself and go live immediately! ## 1. Access the Dashboard. **Create or log into your Verified [Dashboard](https://dashboard.verified.inc/) account.** **How to Create a Dashboard Account** ### a. Enter your email and click the 1-Click Login button. We'll send you a verification code by email. > **Tip** > > **Use your work email.** We use AI to auto-magically set brand information based on your email domain, so you don't have to manually enter it! ### b. Complete the verification step. Click the verification button in the email or enter the verification code. We'll automatically log you in. _It's a 1-click experience, as promised!_ ### c. (optional) Set up MFA. Set up multi-factor authentication with an authenticator app. This is optional until you request approval for [Production](https://docs.verified.inc/reference/api/environments.md#production) access, at which point it's required. ### d. (if necessary) Confirm your company name. If you're creating the Dashboard account for your company, we'll ask you to confirm your company name. _If someone on your team has already created your account, you won't need to do this._ If your account doesn't have a brand yet, we'll automatically create one for you and take you to its Brand Details page. > **Why Multiple Brands?** > > Your company account can have one or more brands. Generally, you'll only need one brand, but there are some cases where it's helpful to use multiple. For example: > > > - **If you have multiple products:** If you have products that go by different names, it can be useful to create different brands to help users know which product they're using 1-Click Signup for — and to help your team track metrics specific to that product. > - **If you want to try different brand settings:** If you want to change brand settings without affecting your existing implementation (even in Sandbox), you can duplicate your brand and configure different settings on the new brand. ### e. (optional) Invite team members. Invite your team members to join your Dashboard account. ## 2. Configure brand settings. **On the Brands page, click the Create button to create a new brand, or click Brand Details to access brand settings for an existing brand.** ### Brand Name **Choose an external name for your brand.** This will be used elsewhere in the Dashboard (for example on the Metrics page) and displayed to users in the SDK (if you choose to use the SDK). The internal brand name is separate, and you can edit it at the top of the page. You can use this to label brands created for testing purposes, for example. ### Text to Signup Settings **Click the Text to Signup tab to access these settings.** #### Brand Phone Number **Choose which phone number you want users to send messages to:** | Option | Phone Number Type | Phone Number | | --- | --- | --- | | Short | Short code | - 50555 in [Production](https://docs.verified.inc/reference/api/environments.md#production) - (866) 671-7183 in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) (see note below) | | Long | Long code | - (888) 323-7799 in [Production](https://docs.verified.inc/reference/api/environments.md#production) - (877) 894-8022 in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) | > **Note: Short Phone Numbers Are Enabled Only in Production** > > If you choose the **Short** option, a short phone number will be enabled in [Production](https://docs.verified.inc/reference/api/environments.md#production) but _not_ [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox). This is because short code phone numbers are not suitable for testing, as they're subject to strict carrier compliance review. > **Tip** > > **We recommend using the **Short** option because it's easier for users to type and therefore makes the call to action higher converting.** However, some use cases may not need to use the call to action, which prompts users to manually type the brand phone number. Such uses cases may instead only use the magic link, magic button, and/or magic QR code, which autofill the brand phone number and SMS draft for the user so they don't need to type anything. For these use cases, the **Long** option may be best. #### Campaigns **Create up to 10 campaigns for a given brand. For each campaign, configure the following settings:** ##### Keyword > Triggers Text to Signup when a user includes it in an SMS they send to the brand phone number **Choose a keyword for the campaign.** The keyword can be any text (including emojis) that passes the following validation: - Must not be longer than 153 characters if it only includes [GSM-7 characters](https://www.twilio.com/docs/glossary/what-is-gsm-7-character-encoding), or 67 characters if it includes any non-GSM-7 characters (like emojis). - Must not be a keyword already used with the brand phone number. - Must not be a reserved keyword: **Reserved Keywords** - STOP - STOPALL - UNSUBSCRIBE - CANCEL - END - REVOKE - OPTOUT - QUIT - START - YES - UNSTOP - HELP - INFO **Examples:** - HOOLI - 🩵 > **Keywords are Case Insensitive** > > Keywords are case insensitive. For example, "HOOLI" and "Hooli" are considered the same. However, **we recommend using an all caps version of the keyword in the SMS draft (see below) and campaign ads,** since it makes it easier for users to understand what to do. ##### SMS Draft > Draft SMS that's autofilled in a user's messaging app when they use a Text to Signup magic link, button, or QR code **Write an SMS draft for the campaign.** The SMS draft can be any text (including emojis) that passes the following validation: - Must include the campaign keyword. - Must not be longer than 153 characters if it only includes [GSM-7 characters](https://www.twilio.com/docs/glossary/what-is-gsm-7-character-encoding), or 67 characters if it includes any non-GSM-7 characters (like emojis). **Examples:** - HOOLI - Send this message to experience the magic! -> - _This example has only GSM-7 characters._ - 🩵 Send this message to experience the magic! ➡️ - _This example includes non-GSM-7 characters._ > **Tips** > > - We recommend using using an all caps version of the keyword so that it's clear to the user what word they need to type (if they choose to manually type the keyword in an SMS). > - We recommend including "Send this message" and either "➡️" or "->" at the end of the message to help guide the user toward sending the SMS draft, which will trigger Text to Signup because it includes the campaign keyword. ##### Redirect URL > Where Text to Signup redirects a user to **Set a redirect URL for the campaign.** The redirect URL can be any valid URL — whether a website link, app store link, or otherwise. > **Tip** > > We recommend using a campaign specific landing page, an app store link, or a page in your onboarding flow. **Examples:** - [https://hooli.com/verified/text-to-signup](https://hooli.com/verified/text-to-signup) - [https://play.google.com/store/apps/details?id=com.hooli](https://play.google.com/store/apps/details?id=com.hooli) We will append a URL parameter to the redirect URL, based on what you choose for the redirect user after setting. See step 3 for details about whether and how to use these parameter values. ##### Redirect User After > When a user is redirected to the redirect URL **Choose when a user should be redirected:** | Option | Description | | --- | --- | | Text to Signup | After the Text to Signup flow (where we verify the user’s phone number) | | Hosted 1-Click Signup/Health | After a [1-Click Signup](https://docs.verified.inc/1-click-signup.md) and/or [1-Click health](https://docs.verified.inc/1-click-health.md) flow we host (where we autofill info and have the user confirm it) | If you choose the **"Text to Signup"** option, we will redirect the user after we verify their phone number. You can then optionally: - Confirm the user's phone is verified. - Pass the user to an integrated 1-Click Signup flow on your side. See step 3 for how to do this. > **Tip** > > If you've already integrated 1-Click Signup/Health (following the [1-Click Signup guides](https://docs.verified.inc/1-click-signup/guides.md) or [1-Click Health guides](https://docs.verified.inc/1-click-health/guides.md) [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) or [API Integration](https://docs.verified.inc/1-click-signup/guides/api-integration.md) guide), the **"Text to Signup"** option is best, because it ensures you can keep your signup flow consistent for all users. If you choose the **"Hosted 1-Click Signup/Health"** option, we will take the user through a hosted [1-Click Signup](https://docs.verified.inc/1-click-signup.md) and/or [1-Click health](https://docs.verified.inc/1-click-health.md) flow that autofills identity and/or health insurance info and has them confirm it. You'll need to retrieve the user's info to benefit from this: see step 3 for how. ### Styling Settings **Click the Styling tab to access these settings.** > **Important** > > Only the styling settings listed below apply to **Text to Signup**. There are other styling settings that apply to [**1-Click Signup**](https://docs.verified.inc/1-click-signup.md) (if you're using the **SDK** integration type). See [here](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) in the 1-Click Signup Setup guide for details. > **Verified Auto-Magically Configures Styling Settings** > > We use AI to auto-magically configure styling settings based on your email domain, so you don't have to do so manually from scratch! **Choose how to style campaign assets:** | Setting | Options | Default | Description | | --- | --- | --- | --- | | Logo | Any square image (max size 200 KB, JPG or PNG) | - | Logo displayed to users | | Font Family | Any [Google font](https://fonts.google.com/) | Lato | Font used for all elements | | Button Border Radius | Any number | 4 | Border radius used for all buttons | | Primary Color | Any hex code | #0DBC3D | Color used for primary buttons and success indicators | | Graphic Color | - Green - Gray - Black - White | Green | Color of the Verified logo in the powered by Verified graphic | ## 3. (if necessary) Do integration work. > **You May Not Need to Do Integration Work!** > > **You may not need to do any integration work for Text to Signup.** You only need to if: > > > 1. **You need to confirm the the user's phone is verified.** This is crucial if you want to rely on Text to Signup for phone verification, including if you want to pass the user to an integrated 1-Click Signup flow on your side. > 2. **You chose the "Hosted 1-Click Signup" option for the redirect user after setting.** We will take the user through a hosted 1-Click Signup flow that autofills identity info and has them confirm it. You'll need to retrieve the user's info to benefit from this. > > > If neither of these apply to your use case, **_skip this step — you need no code!_** The integration work you can do depends on the redirect user after setting: - If it's set to **"Text to Signup"**, you can optionally: - Pass the user to an integrated 1-Click Signup flow on your side. - Confirm the user's phone is verified, separately from an integrated 1-Click Signup flow (which confirms this automatically). - If it's set to **"Hosted 1-Click Signup"**, you need to retrieve the user's identity info. See the sections below for details about how to do each of these. ### Pass User to Integrated 1-Click Signup Flow > **Note** > > This integration step is only relevant if the redirect user after setting is set to **"Text to Signup".** Because Text to Signup verifies a user's phone number, you can pass the user to an integrated 1-Click Signup flow _that skips the standard phone verification process_ (enter phone, receive SMS verification code, enter verification code). The result is a frictionless, delightful user experience! How to do this depends on the integration type you choose: - **SDK:** Start at [step 1](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md#1-create-a-session-key) in the [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) guide, but include `verificationUuid` in the request body of `POST /client/1-click` (instead of using an empty request body). This will make the SDK skip the [Phone](https://docs.verified.inc/1-click-signup/user-experience.md#phone) and [Verification Code](https://docs.verified.inc/1-click-signup/user-experience.md#verification-code) screens. - **API:** Skip step 1 in the [API Integration](https://docs.verified.inc/1-click-signup/guides/api-integration.md) guide and go straight to [step 2](https://docs.verified.inc/1-click-signup/guides/api-integration.md#2-call-post-1-click), using `verificationUuid` instead of `phone` in the request body of `POST /1-click`. It's that simple! ### Confirm User's Phone is Verified > **Note** > > This integration step is only relevant if the redirect user after setting is set to **"Text to Signup".** If you pass the user to an integrated 1-Click Signup flow on your side, that automatically confirms the user's phone is verified. But if you _don't_ want to pass the user to such a flow, you need to separately confirm the user's phone is verified. See below for how to do this (and why it's necessary). ```mermaid sequenceDiagram box Customer participant S as Server participant C as Client end actor U as User participant V as Verified V -->> C: Redirect user to customer note left of S: 1. Parse redirect URL. C ->> C: Parse verificationUuid from URL parameter note left of S: 2. Get verification. C ->>+ S: Call server with verificationUuid S ->>+ V: Call GET /1-click/verifications with verificationUuid V -->>- S: Return 1ClickVerificationEntity note left of S: 3. Check verification status. S ->> S: Check status alt Status is "verified" S -->>- C: Return success C ->> U: Take user to success flow else Status is not "verified" S -->> C: Return error C ->> U: Take user to phone verification end ``` #### a. Parse `verificationUuid` URL parameter. When a user completes Text to Signup, we redirect them to your campaign's redirect URL, appending a URL parameter that depends on the redirect user after setting. When it's set to **"Text to Signup"**, we redirect the user after we verify their phone number and append a `verificationUuid` parameter, which lets you check that the user's phone was verified: ```text {redirectUrl}?verificationUuid={verificationUuid} https://hooli.com/verified/text-to-signup?verificationUuid=68b7bf30-1a2d-4fcc-a2c8-be7de29e5b19 ``` **Parse the value of this `verificationUuid` parameter,** which you'll use in the next step. > **Sandbox Environment** > > In the [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment, we also append an `env=sandbox` parameter (for example `...?verificationUuid={verificationUuid}&env=sandbox`). This lets you tell test requests apart from live ones when you use the same redirect URL in both environments. > **Danger** > > **A user arriving at your redirect URL with a `verificationUuid` URL parameter is NOT a technical guarantee that the user's phone is verified!** If your use case needs such a guarantee, you must confirm the phone is verified using step b and step c. > > > **Why is this the case?** > > > > > A bad actor can figure out what the redirect URL is (for example by simply going through the flow themselves) and then append a `verificationUuid` parameter with a random UUID value. > > > So, to confirm the user's phone is verified, you need to _use_ the value of the `verificationUuid` parameter to call `GET /1-click/verifications/{uuid}` (see step b) and then check `verified` in the response (see step c). This _can't_ be spoofed, because a bad actor doesn't have any way of correctly guessing a _valid_ UUID value for `verificationUuid`. #### b. Call `GET /1-click/verifications`. Pass the `verificationUuid`, which you parsed in the previous step, to your server. The server should use your Verified API key to call [`GET /1-click/verifications/{uuid}`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications): ```text GET /1-click/verifications/{uuid} ``` > **Note** > > The endpoint you should use here is **`GET /1-click/verifications`**, which is different than `GET /1-click`. > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). The response body will be a [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity): **GET /1-click/verifications Response Body** ```typescript { ...1ClickVerificationEntity } ``` **1ClickVerificationEntity Example (Text to Signup channel)** ```typescript { "uuid": "d4727f3f-ae85-452c-bd5f-59c38779b284", "phone": "+12125550010", "channel": "textToSignup", "status": "verified", "verified": true, "createdAt": 1760053695000, "expiresAt": 1760053995000, "deliveredAt": 1760053699054, "verifiedAt": 1760053705000, "attemptsRemaining": 2 } ``` #### c. Check `verified`. Check that `verified` is `true` (or, equivalently, that `status` is `"verified"`), which means the user's phone is verified. Otherwise, it may be spoofed. ### Retrieve User's Info > **Note** > > This integration step is only relevant if the redirect user after setting is set to **"Hosted 1-Click Signup/Health".** ```mermaid sequenceDiagram box Customer participant S as Server participant C as Client end actor U as User participant V as Verified V -->> C: Redirect user to customer note left of S: 1. Parse redirect URL. C ->> C: Parse identityUuid from URL parameter note left of S: 2. Get verification. C ->>+ S: Call server with identityUuid S ->>+ V: Call GET /1-click with identityUuid V -->>- S: Return 1ClickEntity note left of S: 3. Use data. S ->> S: Use credentials and metadata ``` When a user completes Text to Signup, we redirect them to your campaign's redirect URL, appending one or more URL parameters that depend on the redirect user after setting. When it's set to **"Hosted 1-Click Signup/Health"**, we take the user through a hosted 1-Click Signup and/or Health flow that autofills identity and/or health insurance info and has them confirm it. In that case, we append an `identityUuid` and/or `healthDataUuid` parameter, which let(s) you retrieve data the user shared. #### 1-Click Signup ##### a. Parse the `identityUuid` URL parameter. Parse the value of the `identityUuid` URL parameter" ```text {redirectUrl}?identityUuid={identityUuid} https://hooli.com/verified/text-to-signup?identityUuid=68b7bf30-1a2d-4fcc-a2c8-be7de29e5b19 ``` > **Sandbox Environment** > > In the [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment, we also append an `env=sandbox` parameter (for example `...?identityUuid={identityUuid}&env=sandbox`). This lets you tell test requests apart from live ones when you use the same redirect URL in both environments. Parse the value of this parameter, which you'll use in the next step. ##### b. Call `GET /1-click`. Call your server with `verificationUuid`, which you parsed in the previous step. The server should use your Verified API key to call [`GET /1-click/{identityUuid}`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click): ```text GET /1-click/{identityUuid} ``` > **Note** > > The endpoint you should use here is **`GET /1-click`**, which is different than `GET /1-click/verifications`. > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). The response will be a [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) that contains data (user [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) and [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata)): **GET /1-click Response Body** ```typescript { ...1ClickEntity } ``` **`1ClickEntity` Example** **1ClickEntity Example** ```typescript { "identifiers": { "phone": "+12125550010" }, "credentials": { "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, // Array because `multi` was set to `true` in the address credential request "address": [ { "line1": "5320 Newell Rd", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" } ], "birthDate": "1989-08-01", "ssn": "000456789" }, "metadata": { "identifiers": { "verificationMethod": { "phone": "otp" }, "riskSignals": { "overall": { "score": 0, "level": "low", "recommendation": "allow", "reasonCodes": [ "OCR10021" ] }, "phone": { "carrier": { "id": 0, "name": "Example Carrier" } "reasonCodes": [ "OCR20004", "OCR20005", "OCR20007", "OCR20101" ] }, "email": { "reasonCodes": [ "OCR60001", "OCR60002" ] }, "deviceIp": { "reasonCodes": [ "OCR50001", "OCR50002" ] } } }, // Follows the same structure as `credentials` and maintains the same order for array items when `multi` is set to `true` "credentials": { "verificationMethod": { "fullName": { "firstName": "phone_carrier", "lastName": "phone_carrier" }, // Array because `multi` was set to `true` in the address credential request "address": [ { "line1": "credit_bureau", "city": "credit_bureau", "state": "credit_bureau", "zipCode": "credit_bureau", "country": "credit_bureau" } ], "birthDate": "phone_carrier", "ssn": "phone_carrier" } } } } ``` #### 1-Click Health ##### a. Parse the `healthDataUuid` URL parameter. Parse the value of the `healthDataUuid` URL parameter" ```text {redirectUrl}?healthDataUuid={healthDataUuid} https://hooli.com/verified/text-to-signup?healthDataUuid=f23812ce-9337-49f9-a96c-77fda4f8247b ``` > **Sandbox Environment** > > In the [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment, we also append an `env=sandbox` parameter (for example `...?healthDataUuid={healthDataUuid}&env=sandbox`). This lets you tell test requests apart from live ones when you use the same redirect URL in both environments. Parse the value of this parameter, which you'll use in the next step. ##### b. Call `GET /1-click/health`. Call your server with `healthDataUuid`, which you parsed in the previous step. The server should use your Verified API key to call [`GET /1-click/health/{healthDataUuid}`](https://docs.verified.inc/reference/api/endpoints.md#get-1-clickhealth): ```text GET /1-click/health/{healthDataUuid} ``` > **Note** > > The endpoint you should use here is **`GET /1-click/health`**, which is different than `GET /1-click/verifications`. > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). The response will be a [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) that contains user health insurance data: **GET /1-click/health Response Body** ```typescript { ...1ClickHealthEntity } ``` **`1ClickHealthEntity` Example** **1ClickHealthEntity Example (succeeded)** ```typescript { "healthDataUuid": "9e12fe5b-5bb8-410a-ac6b-6e053e4c7e8d", "externalReference": "appointment-1042", "status": "SUCCEEDED", "results": [ { "memberId": "A484069", "payer": { "name": "Aetna", "verifiedId": "V404110", "ids": [ "60054", // ids[0] is considered primary "HPQRS", "Z95668", "10004", "953402799", "6400", "60054MA", "4500", "AETNA" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/11145919-80e4-4cb0-8518-cffbf44ee9fb.png" }, "verificationMethod": "clearinghouse", "coverageTypes": ["medical"], "serviceTypeCodes": ["30"], "isMedicare": false, "edi_271": ..., "eligibility": { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "Aetna", }, "member": { "memberId": "A484069", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Managed Choice Open Access", "groupNumber": "123456-123-12345", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "Aetna Member Services", "serviceTypeCodes": ["30"], "phone": "8005550000", "fax": "8005550001", "email": "memberservices@aetna.com", "url": "https://aetna.com/member-services" }, ... ] }, "network": { "status": "IN_NETWORK", "rules": [ { "uuid": "ab280ee0-5f66-4076-9d1b-255d5f0024e3", "name": "Rule 1: Aetna | MA, NY, WA | PPO | Hooli Health | Pied Piper - INN", "status": "IN_NETWORK", "notes": "Requires manual review", "metadata": { "selfPay": false, "priority": 1, "packageId": "123456" }, "startDate": "2026-10-01", "endDate": "2027-10-01", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ] } ] } }, { "memberId": "B231615071", "payer": { "name": "UnitedHealthcare", "verifiedId": "V816685", "ids": [ "87726", // ids[0] is considered primary "KMQTZ", "77082", "J87726MA", "10655", "2721", "87726MA", "95123", "11077", "MDC01", "10192", "14339", "3550", "3429", "UHC", "10806", "87726E", "KPIC1", "8455", "4523", "96107", "NGHPRT", "6442", "WCHEA", "10636", "10002", "72126", "UHCMP", "6847", "JDHS" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/ff5e124c-f19f-475c-9757-7fa011e5221a.png" }, "verificationMethod": "clearinghouse", "coverageTypes": ["medical"], "serviceTypeCodes": ["30"], "isMedicare": false, "edi_271": ..., "eligibility": { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "UnitedHealthcare", }, "member": { "memberId": "B231615071", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Choice Plus", "groupNumber": "1234567", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "UnitedHealthcare Member Services", "serviceTypeCodes": ["30"], "phone": "8005550002", "fax": "8005550003", "email": "memberservices@uhc.com", "url": "https://uhc.com/member-services" }, ... ] }, "network": { "status": "OUT_OF_NETWORK", "rules": [ { "uuid": "ea703d40-a073-454e-ae3e-3931e8e2cf5a", "name": "Rule 2: UnitedHealthcare | HMO | Hooli Health - OON", "status": "OUT_OF_NETWORK", "conditions": [ { "key": "payerName", "operator": "INCLUDE", "values": ["UnitedHealthcare", "United Healthcare"] }, { "key": "insuranceTypeCodes", "operator": "NOT_INCLUDE", "values": ["HM"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] } ] } ] } } ] } ``` ## 4. Use campaign assets. **Click the Text to Signup tab to access these assets.** You can access assets for each campaign you configured using the Campaign dropdown. The Dashboard also shows campaign ad examples to help you brainstorm creative ways to use the assets. **Use the campaign assets in ads.** These ads can be offline or online, in just about any format you can imagine. The sections below have guidance for how to use each specific asset. > **Warning** > > **You are contractually required to use the powered by Verified graphic and the exact consent language — wherever you use the other Text to Signup assets.** This is necessary for compliance with SMS regulations. ### Call to Action > Prompts user to start Text to Signup The call to action is always of the form: > Text `{keyword}` to `{number}` where `{keyword}` is the campaign keyword and `{number}` is the brand phone number. **Examples:** - Text HOOLI to 50555 - Text 🩵 to 888-323-7799 > **Tip** > > **You can put the call to action _anywhere_ a user will have cell service!** It works equally well in both offline and online ads. For example, you can put it: > > > - on billboards > - on bus stop posters > - in TV commercials > - in radio ads > - in paper handouts > - in marketing mailings > - in emails > - in social media posts > - on web pages > - on banners flown behind airplanes > **Warning** > > **We do _not_ recommend putting the call to action somewhere a user may have intermittent or no cell service,** for example in a subway car. Text to Signup requires a user to send and receive an SMS and load a web page, so they need to have reliable service. ### Magic Link > Takes user to messaging app with SMS draft and phone number autofilled The magic link takes a user to the messaging app (on any device) and autofills the campaign SMS draft for them. This lets them send an SMS with the campaign keyword with a single click (since the SMS draft always contains the keyword). **Examples:** - [https://1-click.verified.inc/tts/84fdts](https://1-click.verified.inc/tts/84fdts) - [https://1-click.verified.inc/tts/83bc01](https://1-click.verified.inc/tts/83bc01) > **Tip** > > **The magic link works best for ONline ads** — like on web pages, in social media posts, in emails — so that users can click the link. For offline ads, we recommend using the magic QR code. ### Magic Button > Takes user to messaging app with SMS draft and phone number autofilled **To use the magic button the Dashboard provides, download the image and link it to the magic link in an ad your company runs.** The magic button takes a user to the messaging app (on any device) and autofills the campaign SMS draft for them. This lets them send an SMS with the campaign keyword with a single click (since the SMS draft always contains the keyword). The magic button combines the call to action and magic link to make Text to Signup clear and easy for the user. **Examples:** [![](https://docs.verified.inc/img/tts-campaign-assets/magic-button-Text-HOOLI-to-50555.png)](https://1-click.verified.inc/tts/84fdts) [![](https://docs.verified.inc/img/tts-campaign-assets/magic-button-Text-%F0%9F%A9%B5-to-888-323-7799.png)](https://1-click.verified.inc/tts/83bc01) > **Tip** > > **The magic button works best for ONline ads** — like on web pages and in emails — so that users can click the button. For offline ads, we recommend using the magic QR code. ### Magic QR Code > Takes user to messaging app with SMS draft and phone number autofilled The magic QR code takes a user to the messaging app (on any device) and autofills the campaign SMS draft for them. This lets them send an SMS with the campaign keyword with a single click (since the SMS draft always contains the keyword). **Examples:** [![](https://docs.verified.inc/img/tts-campaign-assets/magic-qr-code-Text-HOOLI-to-50555.png)](https://1-click.verified.inc/tts/84fdts) _Text HOOLI to 50555_ [![](https://docs.verified.inc/img/tts-campaign-assets/magic-qr-code-Text-%F0%9F%A9%B5-to-888-323-7799.png)](https://1-click.verified.inc/tts/83bc01) _Text 🩵 to 888-323-7799_ > **Tip** > > **The magic QR code works best for OFFline ads** — like on billboards, in TV commercials, in marketing mail — so that users can scan the QR code. For online ads, we recommend using the magic link and magic button. ### Powered by Graphic > **Warning** > > **You are contractually required to use the powered by Verified graphic wherever you use the other Text to Signup assets.** This is necessary for compliance with SMS regulations. The color of the graphic depends on the [graphic color](https://docs.verified.inc/text-to-signup/guide.md#styling-settings) styling setting. We provide many variants: **"Powered By Verified" Graphic Variants** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/gray.png) **Examples:** [![](https://docs.verified.inc/img/tts-powered-by-graphics/green.png)](https://1-click.verified.inc/tts/84fdts) [![](https://docs.verified.inc/img/tts-powered-by-graphics/gray.png)](https://1-click.verified.inc/tts/83bc01) ### Consent Language > **Warning** > > **You are contractually required to use the exact consent language wherever you use the other Text to Signup assets.** This is necessary for compliance with SMS regulations. The consent language is: > Opt in to receive a verification link from Verified on behalf of `{Brand Name}`. Msg & data rates may apply. One message per interaction. Reply HELP for help or STOP to opt out. See Terms at verified.inc/sms-terms and Privacy at verified.inc/privacy. where `{Brand Name}` is your brand name. You can copy a customized version of this from the Dashboard. --- ## Go Live! > **Important** > > **If you did any integration work** (as part of step 3): That involved using a [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) API key, and to go live you'll need to use a [Production](https://docs.verified.inc/reference/api/environments.md#production) one: > > > **Get Production Access** > > > > > 1. Go to the **Brand Details** page for your brand in the Verified [Dashboard](https://dashboard.verified.inc/). > 2. Click the **Production** tab in the upper right, and make sure your brand settings are configured as you intend them to be. > 3. Click the **Request Approval** button under the API Keys section. > 4. Complete the **steps** listed in the dialog. > 5. Click the dialog submit button. > > > > **Tip** > > > > You can use the **Sync from Sandbox** buttons to quickly port some setting configurations from Sandbox to Production. Note, however, that this is not possible for all settings: some need to be configured manually for Production. > > > > > **Swap Sandbox for Production** > > > > > **Once you have Production access, just swap Sandbox for Production:** > > > 1. Swap your Sandbox API key for your Production API key. > 2. Swap the [Sandbox base URL](https://docs.verified.inc/reference/api/environments.md#sandbox) for the [Production base URL](https://docs.verified.inc/reference/api/environments.md#production). > > > > > **If you did NOT do any integration work:** You don't need any API keys, because you're using Text to Signup in a no code way! **Replace the Sandbox campaign assets in your ads with Production ones**. To access Production campaign assets: 1. Go to the **Brand Details** page for your brand in the Verified [Dashboard](https://dashboard.verified.inc/). 2. Click the **Production** tab in the upper right. 3. Click the **Text to Signup** tab in the middle. Launch the ads on any relevant channels. **Then you'll be live with Text to Signup! ✅** --- Source: https://docs.verified.inc/text-to-signup/guide Section: Text to Signup — https://docs.verified.inc/text-to-signup.md Previous: User Experience — https://docs.verified.inc/text-to-signup/user-experience.md Next: 1-Click Verify — https://docs.verified.inc/1-click-verify.md --- # Text to Signup: User Experience Source: https://docs.verified.inc/text-to-signup/user-experience.md At Verified, _signup is what we do._ We are experts in how to optimize onboarding flows to maximize conversion and give users the best possible experience. We've helped our customers onboard — and delight! — millions of new users. The user experience described in this guide is the result of countless hours of research, design, testing, and iteration by our team. Full details are below, but the basic user experience is: 1. See Text to Signup campaign ad 2. Send SMS with keyword 3. Click verification link in SMS auto reply 4. (optional) Go through [1-Click Signup](https://docs.verified.inc/1-click-signup/user-experience.md) flow ## Flow Chart ![Text to Signup flow chart](https://docs.verified.inc/assets/images/tts-flow-chart-72b91ae32861c37e13a823f65de785d8.png) ↗️ [Open in new tab](https://docs.verified.inc/assets/files/tts-flow-chart-72b91ae32861c37e13a823f65de785d8.png) (for easy zooming) ## Steps ### Campaign Ad This can be a physical or digital ad containing one or more [campaign assets](https://docs.verified.inc/text-to-signup/guide.md#4-use-campaign-assets): #### [Call to Action](https://docs.verified.inc/text-to-signup/guide.md#call-to-action) #### [Magic Link](https://docs.verified.inc/text-to-signup/guide.md#magic-link) #### [Magic Button](https://docs.verified.inc/text-to-signup/guide.md#magic-button) #### [Magic QR Code](https://docs.verified.inc/text-to-signup/guide.md#magic-qr-code) #### [Powered by Graphic](https://docs.verified.inc/text-to-signup/guide.md#powered-by-graphic) #### [Consent Language](https://docs.verified.inc/text-to-signup/guide.md#consent-language) ![Campaign ad example on a Times Square billboard](https://docs.verified.inc/assets/images/campaign-ad-times-square-0c58206cda7ce8413f8b9e664d48e4c3.png) _Example 1: Times Square_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/campaign-ad-times-square-0c58206cda7ce8413f8b9e664d48e4c3.png) ![Campaign ad example at a bus stop](https://docs.verified.inc/assets/images/campaign-ad-bus-stop-7e08fbcbab4d8eda7597f20369383407.png) _Example 2: Bus Stop_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/campaign-ad-bus-stop-7e08fbcbab4d8eda7597f20369383407.png) ![Campaign ad example in an email](https://docs.verified.inc/assets/images/campaign-ad-email-dac7db83370004ad766fa2d671a8215d.png) _Example 3: Email_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/campaign-ad-email-dac7db83370004ad766fa2d671a8215d.png) --- ### Prompt to Draft SMS _The user can respond to the [call to action](https://docs.verified.inc/text-to-signup/guide.md#call-to-action) by simply opening their messaging app, in which case they then manually type a phone number and keyword (see the Draft SMS screen)._ _An interstitial screen appears instead if both of the following conditions are met:_ _1. The user clicked a [magic link](https://docs.verified.inc/text-to-signup/guide.md#magic-link) or [magic button](https://docs.verified.inc/text-to-signup/guide.md#magic-button) or scanned a [magic QR code](https://docs.verified.inc/text-to-signup/guide.md#magic-qr-code). 2. The user's device operating system prevents automatic opening of the default messaging app._ #### Open Messaging App - Handled by user's device operating system - Prompts user to open device default messaging app #### [Brand Logo](https://docs.verified.inc/text-to-signup/guide.md#styling-settings) #### [Brand Name](https://docs.verified.inc/text-to-signup/guide.md#brand-name) #### [Magic Button](https://docs.verified.inc/text-to-signup/guide.md#magic-button) #### [Magic QR Code](https://docs.verified.inc/text-to-signup/guide.md#magic-qr-code) _Appears on desktop._ #### [Powered by Graphic](https://docs.verified.inc/text-to-signup/guide.md#powered-by-graphic) #### [Consent Language](https://docs.verified.inc/text-to-signup/guide.md#consent-language) --- ![Empty messaging app screen](https://docs.verified.inc/assets/images/draft-sms-empty-5b222f7c48f700b674f5f751620e5fbc.png) _Messaging App_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/draft-sms-empty-5b222f7c48f700b674f5f751620e5fbc.png) ![Mobile prompt to draft SMS, modal open state](https://docs.verified.inc/assets/images/prompt-to-draft-sms-mobile-modal-open-2e1ace6889d706429ce96ed8f39a2415.png) _Mobile: Modal Open State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/prompt-to-draft-sms-mobile-modal-open-2e1ace6889d706429ce96ed8f39a2415.png) ![Mobile prompt to draft SMS, modal closed state](https://docs.verified.inc/assets/images/prompt-to-draft-sms-mobile-modal-closed-c427efea55e93bcb5d3d6b8f6b013354.png) _Mobile: Modal Closed State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/prompt-to-draft-sms-mobile-modal-closed-c427efea55e93bcb5d3d6b8f6b013354.png) ![Desktop prompt to draft SMS, modal open state](https://docs.verified.inc/assets/images/prompt-to-draft-sms-desktop-modal-open-2de3bae9fc2d4f5acd6a16d8860849d3.png) _Desktop: Modal Open State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/prompt-to-draft-sms-desktop-modal-open-2de3bae9fc2d4f5acd6a16d8860849d3.png) ![Desktop prompt to draft SMS, modal closed state](https://docs.verified.inc/assets/images/prompt-to-draft-sms-desktop-modal-closed-46a3fa821af91babbfb8fba8eeb817d0.png) _Desktop: Modal Closed State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/prompt-to-draft-sms-desktop-modal-closed-46a3fa821af91babbfb8fba8eeb817d0.png) --- ### Draft SMS #### To Phone Number - [Brand phone number](https://docs.verified.inc/text-to-signup/guide.md#brand-phone-number) - Can be manually typed - Autofilled if user clicked [magic link](https://docs.verified.inc/text-to-signup/guide.md#magic-link) or [magic button](https://docs.verified.inc/text-to-signup/guide.md#magic-button) or scanned [magic QR code](https://docs.verified.inc/text-to-signup/guide.md#magic-qr-code) #### SMS Draft - Campaign [keyword](https://docs.verified.inc/text-to-signup/guide.md#keyword) or [SMS draft](https://docs.verified.inc/text-to-signup/guide.md#sms-draft) - Can be manually typed - Autofilled if user clicked [magic link](https://docs.verified.inc/text-to-signup/guide.md#magic-link) or [magic button](https://docs.verified.inc/text-to-signup/guide.md#magic-button) or scanned [magic QR code](https://docs.verified.inc/text-to-signup/guide.md#magic-qr-code) --- ![Draft SMS containing only the campaign keyword](https://docs.verified.inc/assets/images/draft-sms-keyword-b0a5355d88caa0a9281661e83ae82038.png) _Keyword Only_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/draft-sms-keyword-b0a5355d88caa0a9281661e83ae82038.png) ![Draft SMS prefilled from campaign settings](https://docs.verified.inc/assets/images/draft-sms-full-30e9d4d055c58f0d241014472ee4351f.png) _SMS Draft from Campaign Settings_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/draft-sms-full-30e9d4d055c58f0d241014472ee4351f.png) --- ### Sent SMS _This will trigger an auto reply: a verification link if the SMS contains a valid keyword and an error message otherwise (see the Auto Reply screen)._ --- ![Sent SMS containing a valid keyword](https://docs.verified.inc/assets/images/auto-reply-waiting-7550bba5b2ba9d265560ede710c72022.png) _Containing Valid Keyword_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/auto-reply-waiting-7550bba5b2ba9d265560ede710c72022.png) ![Sent SMS containing no valid keyword](https://docs.verified.inc/assets/images/auto-reply-waiting-error-de68efabea87d40d5a06c08ac1a974fd.png) _Containing No Valid Keyword_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/auto-reply-waiting-error-de68efabea87d40d5a06c08ac1a974fd.png) --- ### Auto Reply #### Success > ✅ Verify with 1-Click: ✨ > > > > ➡️ [https://1-click.verified.inc/tts/abc123](https://1-click.verified.inc/tts/abc123) _Sent if Verified finds a campaign keyword match._ #### Error > ❌ Sorry, we can’t find a keyword match! Look for a typo and try again? _Sent if Verified does not find a campaign keyword match._ --- ![Auto reply with a verification link, success state](https://docs.verified.inc/assets/images/auto-reply-success-5b371cc3181fb33707d5b64faaf2f164.png) _Success_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/draft-sms-keyword-b0a5355d88caa0a9281661e83ae82038.png) ![Auto reply error message](https://docs.verified.inc/assets/images/auto-reply-error-3ea5a71bfa57d738dee4fc70f06b44dc.png) _Error_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/draft-sms-keyword-b0a5355d88caa0a9281661e83ae82038.png) --- Source: https://docs.verified.inc/text-to-signup/user-experience Section: Text to Signup — https://docs.verified.inc/text-to-signup.md Previous: Overview — https://docs.verified.inc/text-to-signup/overview.md Next: Guide — https://docs.verified.inc/text-to-signup/guide.md --- # 1-Click Verify: Overview Source: https://docs.verified.inc/1-click-verify/overview.md | | | | --- | --- | | Speed | <5 seconds to complete 1-Click Verify | | Benefits | - Magically autofill verified user phone numbers _with no user input!_ - Silently verify user inputted phone numbers, _with no SMS!_ - Easily verify user inputted phone numbers with SMS verification codes and links - Seamlessly integrate with [1-Click Signup](https://docs.verified.inc/1-click-signup.md) and [1-Click Health](https://docs.verified.inc/1-click-health.md) | | Coverage | ~100% of US adults (>270M people) | | Setup Time | 5 minutes | | Integration Time | 1-2 hours | ## About 1-Click Verify **1-Click Verify is the _best_ way to capture a user's real phone number.** It works by waterfalling across three channels: 1. **Autofill:** We autofill the user's _verified_ phone number (with no user input!). 2. **Silent:** We silently verify a phone number the user inputted (with no user SMS!). 3. **SMS:** We verify a phone number the user inputted by sending them an SMS with a verification code and/or link. See coverage for details on how often each of these channels succeeds. Collecting a user's verified phone number is necessary to use our flagship [1-Click Signup](https://docs.verified.inc/1-click-signup.md) product, so 1-Click Verify provides a powerful and easy to integrate solution. > **Privacy First** > > **A user's data is never shared without their consent.** We are committed to putting people in control of their own data. We are SOC 2 Type II certified and compliant with major regulatory frameworks like HIPAA, CCPA, and GDPR. For more information, please see [How We Operate](https://verified.inc/how-we-operate). > > ## Phone Carrier Compliance Autofilling verified phone numbers and sending SMS in the US requires onerous compliance reviews by phone carriers. We handle all of this complexity, so you don't have to. ## Benefits - **Magically autofill verified user phone numbers:** After years of effort, we've implemented a way to autofill verified phone numbers _with no user input!_ This is the best user experience on the planet. Painless, frictionless phone verification. - **Easily verify user phone numbers:** 1-Click Verify makes it extremely easy to verify user phone numbers, with minimal integration work. - **Seamlessly integrate with 1-Click Signup and 1-Click Health:** Phone verification is the prerequisite for using our flagship [1-Click Signup](https://docs.verified.inc/1-click-signup.md) product, so 1-Click Verify can smoothly flow into 1-Click Signup (which can then flow into 1-Click Health). ## Coverage 1-Click Verify works for ~100% of US adults (264M people): anyone with a cell phone! That said, coverage varies across the three channels and depends on some details of your use case and implementation. Use the calculator below to estimate coverage. > **Tip** > > Even if the autofill or silent channels only work for a small percentage of your users, they can _substantially_ boost overall conversion (and user delight!) in your onboarding flow, so we highly recommend them. > **Important** > > **We currently only cover people in the United States,** but we're soon adding new geographies. If there are particular geographies that would be most helpful for your use case, please let us know by emailing [Support@Verified.inc](mailto:Support@Verified.inc), and we'll prioritize accordingly. ##### Estimate 1-Click Verify Coverage by Channel 1. Select what your company offers to users: [x] Native mobile app [ ] Web app 2. Adjust these values as needed: Users on Native Mobile (not Web) 100% Web Users on Cellular (not WiFi) N/A Coverage: Autofill Channel #### 70% of users can have their verified phone number autofilled like magic! Silent Channel #### 100% of users have their phone numbers silently verified without needing to receive an SMS. SMS Channel #### 100% of users can be verified by using a verification code or link they receive by SMS. Flow: ```mermaid sankey-beta 100 Users,Succeed with Autofill,70 100 Users,Not Reached by Autofill,30 Not Reached by Autofill,Succeed with Silent,30 ``` This means, for every 100 users: - **70** do NOT need to enter their phone number or receive an SMS. - **30** need to enter their phone number but do NOT need to receive an SMS. - **0** need to enter their phone number and receive an SMS with a verification code and/or link. Methodology The autofill and silent channels are available when: 1. **You can use a cellular (not WiFi) connection.** You can force one in a native mobile app, but in a web app you have to use whatever connection the user is on. 2. **The user's phone carrier supports the channel.** Verizon and T-Mobile (and most associated MVNOs) support autofill, but AT&T does not. All three of these support silent. So, about 70% of users have a carrier that supports autofill 100% have one that supports silent. We estimate coverage (C) for the autofill and silent channels with: C = S × [N + (W × D)] **Carrier Support:** Percentage of users with a carrier that supports the given channel. _This is fixed at 70% for the autofill channel (which is a safe assumption unless your users significantly skew toward or away from AT&T) and 100% for the silent channel._ **Users on Native Mobile:** Percentage of users using a native mobile app (not a web app). **Users on Web** (= 100% - Users on Native Mobile): Percentage of users using a web app (not a native mobile app). **Web Users on Cellular (Data):** Percentage of users on web using a cellular (not WiFi) connection. **Silent** uses this same formula and these same inputs, but with Carrier Support fixed at 100% instead of 70% — AT&T supports silent verification, so carrier is no longer a limiting factor. The SMS channel doesn't depend on the connection, and all carriers support it, so it's available for 100% of users. --- Source: https://docs.verified.inc/1-click-verify/overview Section: 1-Click Verify — https://docs.verified.inc/1-click-verify.md Next: User Experience — https://docs.verified.inc/1-click-verify/user-experience.md --- # 1-Click Verify Source: https://docs.verified.inc/1-click-verify.md - [Overview](https://docs.verified.inc/1-click-verify/overview.md): Overview of 1-Click Verify - [User Experience](https://docs.verified.inc/1-click-verify/user-experience.md): User Experience for 1-Click Verify - [Test Users](https://docs.verified.inc/1-click-verify/test-users.md): Test Users for 1-Click Verify - [Guides](https://docs.verified.inc/1-click-verify/guides.md): 2 items --- Source: https://docs.verified.inc/1-click-verify Previous: Guide — https://docs.verified.inc/text-to-signup/guide.md Next: Overview — https://docs.verified.inc/1-click-verify/overview.md --- # 1-Click Verify: Guides Source: https://docs.verified.inc/1-click-verify/guides.md - [Setup](https://docs.verified.inc/1-click-verify/guides/setup.md): How to get setup to integrate 1-Click Verify - [API Integration](https://docs.verified.inc/1-click-verify/guides/api-integration.md): Full details on how to integrate 1-Click Verify with our API --- Source: https://docs.verified.inc/1-click-verify/guides Section: 1-Click Verify — https://docs.verified.inc/1-click-verify.md Previous: Test Users — https://docs.verified.inc/1-click-verify/test-users.md Next: Setup — https://docs.verified.inc/1-click-verify/guides/setup.md --- # 1-Click Verify: API Integration Source: https://docs.verified.inc/1-click-verify/guides/api-integration.md | | | | --- | --- | | Time to Complete | 1-2 hours | | Time to Test and Deploy | 2-4 hours | | Skills Required | Make API calls, build UX | > **Tip** > > **Complete the 1-Click Verify [Setup](https://docs.verified.inc/1-click-verify/guides/setup.md) guide before following this API Integration guide.** > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. 1-Click Verify uses three channels for autofilling and/or verifying a user's phone number, in the following order: | Order | Channel | Description | User Inputs? | SMS? | | --- | --- | --- | --- | --- | | 1 | Autofill | Autofills a user's _verified_ phone number | No | No | | 2 | Silent | Silently verifies a phone number the user inputted | Yes - Phone number | No | | 3 | SMS | Verifies a phone number the user inputted by sending them an SMS with a verification code and/or link | Yes - Phone number - Verification code/link | Yes | Implementing the 1-Click Verify API is as simple as getting the user's device IP address and then waterfalling across these three channels. ## 1. Get user's device IP. Get the user's device IP address (over a cellular connection if possible), which you'll use in step 2, and step 3b. You should do this slightly differently on native mobile vs. web, as described in the sections below. > **Native Mobile vs. Web** > > **On native mobile (but not on web), you can and should choose a cellular connection even if the user is on WiFi.** Doing this results in much higher success rates, because the autofill and silent channels (which have higher conversion than the SMS channel) only work with device IPs determined over cellular connections. > > > We provide a [native mobile module](https://docs.verified.inc/reference/native-mobile-module.md) called `VerifiedCellular` that makes this easy to do across Android, iOS, and cross platform frameworks. ### Native Mobile Copy the code for the `VerifiedCellular` [native mobile module](https://docs.verified.inc/reference/native-mobile-module.md) and paste it into your own projects (across iOS, Android, and/or cross-platform frameworks). > **Info** > > We don't distribute this as a package so that you don't need to introduce any new dependencies. The code is simple and brief. Call `VerifiedCellular.getDeviceIp()`. It will return the user's device IP address, determined over a cellular connection: **VerifiedCellular.getDeviceIp() Return Value Example** ```typescript "::121:2555:0010" ``` ### Web Call [`GET /1-click/verifications/device-ip`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications-device-ip) client side, from the user's device. It will return the user's device IP address: **GET /1-click/verifications/device-ip Response Body Example** ```typescript { "deviceIp": "::121:2555:0010" } ``` > **Important** > > Unlike most Verified API endpoints, this is a public, unauthenticated endpoint. (Don't use your Verified API key, which you must only use server side.) > > > **You should call this endpoint from the user's device, NOT your server,** so that it returns the user's device IP address, which you can use with other endpoints. > **Warning** > > **We don't recommend determining the user's device IP any other way.** You may already have the IP or want to use another method to determine it, but there are many subtleties in determining it correctly and normalizing its format so that it works with other Verified endpoints. > > > The [`GET /1-click/verifications/device-ip`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications-device-ip) endpoint handles everything for you, and it's completely free to use, so we strongly recommend using it. If you aren't able to get the user's device IP, fall back to step 3c. **(Optional) Getting Channel Availability in Advance** You can optionally get channel availability in advance, based on the user's device IP. This isn't necessary because, when you try each channel, we'll respond if the channel isn't available. That only takes about 0.5 seconds, and there's no charge for it. However, if you prefer to check once, upfront, which channels are available, we provide a way to do that: Call [`GET /1-click/verifications/channels?deviceIp={deviceIp}`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications-channels), server side, with the user's device IP address from step 1 as the value of the `deviceIp` query parameter. > **Important** > > **This endpoint requires authentication** (like most Verified API endpoints and all of the other ones referenced in this guide). You should call it from your server, with your Verified API key. > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). The response body will indicate which channels are available: **GET /1-click/verifications/channels Response Body Example** ```typescript { "channels": { "autofill": { "available": true, // = brandApproved && deviceIpEligible "brandApproved": true, "deviceIpEligible": true }, "silent": { "available": true, // = brandApproved && deviceIpEligible "brandApproved": true, "deviceIpEligible": true }, "sms": { "available": true, // = brandApproved, currently "brandApproved": true }, // Coming soon // "email": { // "available": true // } } } ``` Your implementation logic should follow the rest of this guide based on which channels are available. ## 2. Try autofill channel. Call [`POST /1-click/verifications`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications), setting `channel` to `autofill` and `deviceIp` to the user's device IP address from step 1: **POST /1-click/verifications Request Body Example (autofill channel)** ```typescript { "channel": "autofill", "deviceIp": "::121:2555:0010" } ``` > **Important** > > **This endpoint requires authentication** (like most Verified API endpoints and all of the other ones referenced in this guide). You should call it from your server, with your Verified API key. > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). This will return an HTTP `302` redirect and a `Location` header with a URL value. Pass this URL to your client, on the user's device. You should handle this slightly differently on native mobile vs. web, as described in the sections below. ### Native Mobile Call `VerifiedCellular.followRedirects(url)`. This will follow all redirects over a cellular connection. ### Web Fetch the URL, headlessly, setting `redirect` to `"follow"` to follow all redirects. > **Follow Redirects on the User's Device** > > **You must follow redirects on the user's device, _not_ on your server.** The autofill and silent channels rely on redirects being followed on the same device whose `deviceIp` you sent to `POST /1-click/verifications`, so following them server side will cause an error. If the autofill channel succeeds, the response body will contain the user's _verified_ phone number — like magic! You're done. **POST /1-click/verifications Response Body Example (verified)** ```typescript { "uuid": "6232bdb2-5b92-405a-bf39-6147aef70ac1", "phone": "+12125550010", "channel": "autofill", "status": "verified", "verified": true, "createdAt": 1760053690000, "expiresAt": 1760053990000, "attemptsRemaining": 3 } ``` > **Yes, The Autofilled Phone Number Is Verified!** > > We use autofill and verify the user's phone number directly from the SIM/eSIM in their device, without any need for user input or an SMS verification code. It's both far easier for the user and far more secure. ## 3. (if necessary) Fall back to silent channel. If the autofill channel isn't available or fails, fall back to the silent channel. For this channel, the user will have to input their phone number, but they won't have to receive an SMS or use a verification code or link. ### a. Prompt user for phone number. > **Supported Phone Numbers** > > **Currently, we only support US mobile phone numbers.** You'll need to pass these to our API in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). This is the `+1` country code with a 10-digit subscriber code appended to it, for example `+12125550010`. We recommend using a phone number input that auto submits when the user enters 10 digits. (See the [Phone](https://docs.verified.inc/1-click-signup/user-experience.md#phone) screen of the 1-Click Signup User Experience guide for full details.) ### b. Try silent channel. Call [`POST /1-click/verifications`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications), setting `channel` to `silent`, `deviceIp` to the user's device IP address from step 1, and `phone` to the user's phone number from step 3a: **POST /1-click/verifications Request Body Example (silent channel)** ```typescript { "channel": "silent", "deviceIp": "::121:2555:0010", "phone": "+12125550010" } ``` This will return an HTTP `302` redirect and a `Location` header with a URL value. Pass this URL to your client, on the user's device. You should handle this slightly differently on native mobile vs. web, as described in the sections below. ### Native Mobile Call `VerifiedCellular.followRedirects(url)`. This will follow all redirects over a cellular connection. ### Web Fetch the URL, headlessly, setting `redirect` to `"follow"` to follow all redirects. > **Follow Redirects on the User's Device** > > **You must follow redirects on the user's device, _not_ on your server.** The autofill and silent channels rely on redirects being followed on the same device whose `deviceIp` you sent to `POST /1-click/verifications`, so following them server side will cause an error. If the silent channel succeeds, the response body will contain the user's _verified_ phone number — like magic! You're done. **POST /1-click/verifications Response Body Example (verified)** ```typescript { "uuid": "6232bdb2-5b92-405a-bf39-6147aef70ac1", "phone": "+12125550010", "channel": "autofill", "status": "verified", "verified": true, "createdAt": 1760053690000, "expiresAt": 1760053990000, "attemptsRemaining": 3 } ``` > **Yes, The Phone Number Is Verified, Without an SMS!** > > We verify the user's phone number directly with the SIM/eSIM in their device, without any need for an SMS verification code or link. It's both far easier for the user and far more secure. ### c. (if necessary) Fall back to SMS channel. If the silent channel isn't available or fails, fall back to the SMS channel. For this channel, the user will have to input their phone number, receive an SMS, and use a verification code or link. #### i. Start verification flow. Call [`POST /1-click/verifications`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications), setting `channel` to `sms` and `phone` to the user's phone number from step 3a: **POST /1-click/verifications Request Body Example (SMS channel)** ```typescript { "channel": "sms", "phone": "+12125550010" } ``` The response body will contain a `uuid` that you'll use in the next step: **POST /1-click/verifications Response Body Example (pending)** ```typescript { "uuid": "f5251850-496c-48cf-a4bd-d9d5ace22689", "phone": "+12125550010", "channel": "sms", "format": "linkAndCode", "status": "pending", "verified": false, "createdAt": 1760053695000, "expiresAt": 1760053995000, "attemptsRemaining": 3 } ``` #### ii. Deliver verification message. Call [`POST /1-click/verifications/{uuid}/deliver`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications-deliver) with the `uuid` from the previous step. This will send a verification SMS to the user's phone number. You can optionally specify a message format (which defaults to `code` if not included). If the format includes a link — that is, if it's `link`, `codeAndLink`, or `linkAndCode` — you can also specify `redirectUrl` and `redirectUserAfter`, which default to the [redirect URL](https://docs.verified.inc/1-click-verify/guides/setup.md#redirect-url) and [redirect user after](https://docs.verified.inc/1-click-verify/guides/setup.md#redirect-user-after) brand settings. **POST /1-click/verifications/{uuid}/deliver Request Body Example (link)** ```typescript { format?: "linkAndCode", // defaults to code redirectUrl?: "https://hooli.com/verified/1-click-verify", // only relevant if link format is included redirectUserAfter?: "phoneVerification" // only relevant if link format is included } ``` > **Verification SMS Formats** > > The content of the verification SMS depends on the format: > > > | Format | `format` | SMS Template | SMS Example | > | --- | --- | --- | --- | > | Code Default | `code` | > Enter this code to verify for `{Brand Name}`: 111111 | > Enter this code to verify for Hooli: 111111 | > | Link | `link` | > Click this link to verify for `{Brand Name}`: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > Click this link to verify for Hooli: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > | Code and Link | `codeAndLink` | > Enter this code to verify for `{Brand Name}`: 111111 > > > > Or, click this link: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > Enter this code to verify for Hooli: 111111 > > > > Or, click this link: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > | Link and Code | `linkAndCode` | > Click this link to verify for `{Brand Name}`: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) > > > > Or, enter this code: 111111 | > Click this link to verify for Hooli: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) > > > > Or, enter this code: 111111 | The response body will indicate that the message is being sent: **POST /1-click/verifications/{uuid}/deliver Response Body Example** ```typescript { "uuid": "f5251850-496c-48cf-a4bd-d9d5ace22689", "phone": "+12125550010", "channel": "sms", "format": "linkAndCode", "status": "sending", "verified": false, "createdAt": 1760053695000, "expiresAt": 1760053995000, "attemptsRemaining": 3 } ``` #### iii. Finish verification flow. How to finish the flow depends on whether a code or link is used. ##### Code ###### A. Prompt user for verification code. We recommend using a 6 separate single digit inputs that auto submit when the user enters 6 digits. (See the [Verification Code](https://docs.verified.inc/1-click-signup/user-experience.md#verification-code) screen of the 1-Click Signup User Experience guide for full details.) ###### B. Verify verification code. Call [`POST /1-click/verifications/{uuid}/verify`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications-verify) with the `uuid` from the earlier API response bodies, including what the user entered in the previous step as `code`: **POST /1-click/verifications/{uuid}/verify Request Body Example** ```typescript { "code": "111111" } ``` This will check the user's input against the verification code for this verification flow. The response body will indicate whether or not the check succeeds in the `verified` attribute: **POST /1-click/verifications/{uuid}/verify Response Body Example** ```typescript { "uuid": "f5251850-496c-48cf-a4bd-d9d5ace22689", "phone": "+12125550010", "channel": "sms", "format": "linkAndCode", "status": "verified", "verified": true, "createdAt": 1760053695000, "expiresAt": 1760053995000, "deliveredAt": 1760053699054, "verifiedAt": 1760053705000, "attemptsRemaining": 2 } ``` ##### Link If you pass the user to an integrated 1-Click Signup/Health flow on your side, that automatically confirms the user's phone is verified — as long as you include the `uuid` from previous API response bodies as `verificationUuid` in the request body of [`POST /1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click). But if you _don't_ pass the user to such a flow, you need to separately confirm the user's phone is verified. See below for how to do this (and why it's necessary). ###### A. Parse URL parameter. When a user completes verifying with a verification link, we redirect them to the redirect URL you define via the [redirect URL](https://docs.verified.inc/1-click-verify/guides/setup.md#redirect-url) brand setting (or [`redirectUrl`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications-deliver) API input). We append a URL parameter that depends on what you set for the [redirect user after](https://docs.verified.inc/1-click-verify/guides/setup.md#redirect-user-after) brand setting (or [`redirectUserAfter`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications-deliver) API input). When it's set to **"1-Click Verify"** (`"phoneVerification"`), we redirect the user after we verify their phone number and append a `verificationUuid` parameter, which lets you check that the user's phone was verified: ```text {redirectUrl}?verificationUuid={verificationUuid} https://hooli.com/verified/1-click-verify?verificationUuid=68b7bf30-1a2d-4fcc-a2c8-be7de29e5b19 ``` **Parse the value of this `verificationUuid` parameter,** which you'll use in the next step. > **Sandbox Environment** > > In the [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment, we also append an `env=sandbox` parameter (for example `...?verificationUuid={verificationUuid}&env=sandbox`). This lets you tell test requests apart from live ones when you use the same redirect URL in both environments. > **Danger** > > **A user arriving at your redirect URL with a `verificationUuid` URL parameter is NOT a technical guarantee that the user's phone is verified!** If your use case needs such a guarantee, you must confirm the phone is verified using step 3ciiiB and step 3ciiiC. > > > **Why is this the case?** > > > > > A bad actor can figure out what the redirect URL is (for example by simply going through the flow themselves) and then append a `verificationUuid` parameter with a random UUID value. > > > So, to confirm the user's phone is verified, you need to _use_ the value of the `verificationUuid` parameter to call `GET /1-click/verifications/{uuid}` (see step 3ciiiB) and then check `verified` in the response (see step 3ciiiC). This _can't_ be spoofed, because a bad actor doesn't have any way of correctly guessing a _valid_ UUID value for `verificationUuid`. ###### B. Get verification status. Pass the `verificationUuid`, which you parsed in the previous step, to your server. The server should use your Verified API key to call [`GET /1-click/verifications/{uuid}`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications): ```text GET /1-click/verifications/{uuid} ``` > **Note** > > The endpoint you should use here is **`GET /1-click/verifications`**, which is different than `GET /1-click`. The response body will be a [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity): **GET /1-click/verifications Response Body** ```typescript { ...1ClickVerificationEntity } ``` **1ClickVerificationEntity Example (SMS channel, link format)** ```typescript { "uuid": "9327ddbf-a018-4a34-ad16-2c37ceb4d380", "phone": "+12125550010", "channel": "sms", "format": "link", "status": "verified", "verified": true, "createdAt": 1760053695000, "expiresAt": 1760053995000, "deliveredAt": 1760053699054, "verifiedAt": 1760053705000, "attemptsRemaining": 2 } ``` ###### C. Check `verified`. Check that `verified` is `true` (or, equivalently, that `status` is `"verified"`), which means the user's phone is verified. Otherwise, it may be spoofed. --- ## (optional) Get verification details. The verification details are included in the response bodies of other 1-Click Verify endpoints. But, if you ever want to retrieve these details again, you can do so by calling [`GET /1-click/verifications/{uuid}`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications) with the `uuid` from the previous steps. The response body will be a [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity): **GET /1-click/verifications Response Body Example** ```typescript { "uuid": "f5251850-496c-48cf-a4bd-d9d5ace22689", "phone": "+12125550010", "channel": "sms", "format": "link", "status": "verified", "createdAt": 1760053695000, "expiresAt": 1760053995000, "verifiedAt": 1760053705000 } ``` --- ## Handle Errors To ensure your integration is robust, handle all of the 1-Click Verify [errors](https://docs.verified.inc/reference/api/errors.md#1-click-verify). Many errors can be handled simply by starting a new 1-Click Verify flow. If an error indicates that a particular channel failed, and there are one or more other channels still available, you should fall back to the other channel(s), as indicated in the guide above. --- ## Satisfy Compliance Requirements Autofilling phone numbers, verifying phone numbers, and sending SMS are subject to strict regulations and carrier review in the US. You must satisfy the following compliance requirements for us to approve your integration for [Production](https://docs.verified.inc/reference/api/environments.md#production) access. ### Autofill and Silent Channels Before you call `POST /1-click/verifications` (for step 2 and step 3b), you must have the user agree to your terms, and those terms must include this 1-Click Verify autofill channel consent language: > You authorize your wireless carrier to use or disclose information about your account and your wireless device, if available, to `{Brand Name}` or its service providers for the duration of your business relationship, solely to help us identify you or your wireless device and to prevent fraud. See our Privacy Policy to see how we treat your data. - **Replace `{Brand Name}` with your brand name.** > **You Must Use Exactly This Language** > > This language has been approved by all three major carriers in the US: Verizon, T-Mobile, and AT&T. It's simply not feasible to get approval from all of them for changes to the language. Therefore, **we cannot approve your integration unless you use _exactly_ the language above.** For example, as our User Experience guide describes [here](https://docs.verified.inc/1-click-verify/user-experience.md#opt-in), you can use a button with language that indicates that the user agrees to your terms by continuing: _Terms consent language, button, and the green variant of the Powered by Verified graphic_ If you have earlier steps in your flow, you can use one of those as the trigger instead of using a dedicated button. For example, if you start by asking the user to enter their email, you can include the terms consent language on that step and then trigger verified phone autofill as soon they enter their email. ### SMS Channel Before you call `POST /1-click/verifications/{uuid}/deliver` (step 3cii), you must include this 1-Click Verify SMS channel consent language: > I authorize [Verified](https://verified.inc/) to send me SMS verification texts at the number provided. Msg & Data rates may apply. - **Link "Verified" to [https://verified.inc](https://verified.inc/) and make it underlined and a different color than the rest of the text** (so the user knows it's a link). - **Make this visible to the user, somewhere on the page, before you call `POST /1-click/verifications/{uuid}/deliver`.** _See our [Demo](https://1-click.demo.verified.inc/) for an example of this._ --- ## Go Live! **When you're ready to go live, you made need to request approval for [Production](https://docs.verified.inc/reference/api/environments.md#production) access,** depending on how you're using other Verified products: 1. Go to the **Brand Details** page for your brand in the Verified [Dashboard](https://dashboard.verified.inc/). 2. Click the **Production** tab in the upper right, and make sure your brand settings are configured as you intend them to be. 3. Click the **Request Approval** button under the API Keys section. 4. Complete the **steps** listed in the dialog. 5. Click the **Submit Request** button. ### Swap Sandbox for Production **Once you have Production access, just swap Sandbox for Production:** 1. Swap your Sandbox API key for your Production API key. 2. Swap the [Sandbox base URL](https://docs.verified.inc/reference/api/environments.md#sandbox) for the [Production base URL](https://docs.verified.inc/reference/api/environments.md#production). **Then you'll be live with 1-Click Verify! ✅** --- Source: https://docs.verified.inc/1-click-verify/guides/api-integration Section: 1-Click Verify — https://docs.verified.inc/1-click-verify.md Previous: Setup — https://docs.verified.inc/1-click-verify/guides/setup.md Next: 1-Click Signup — https://docs.verified.inc/1-click-signup.md --- # 1-Click Verify: Setup Source: https://docs.verified.inc/1-click-verify/guides/setup.md | | | | --- | --- | | Time to Complete | 5 minutes | | Skills Required | No technical skills! | > **Tip** > > **Complete this Setup guide before following the 1-Click Verify [API Integration](https://docs.verified.inc/1-click-signup/guides/api-integration.md) guide.** ## 1. Access the Dashboard. **Create or log into your Verified [Dashboard](https://dashboard.verified.inc/) account.** **How to Create a Dashboard Account** ### a. Enter your email and click the 1-Click Login button. We'll send you a verification code by email. > **Tip** > > **Use your work email.** We use AI to auto-magically set brand information based on your email domain, so you don't have to manually enter it! ### b. Complete the verification step. Click the verification button in the email or enter the verification code. We'll automatically log you in. _It's a 1-click experience, as promised!_ ### c. (optional) Set up MFA. Set up multi-factor authentication with an authenticator app. This is optional until you request approval for [Production](https://docs.verified.inc/reference/api/environments.md#production) access, at which point it's required. ### d. (if necessary) Confirm your company name. If you're creating the Dashboard account for your company, we'll ask you to confirm your company name. _If someone on your team has already created your account, you won't need to do this._ If your account doesn't have a brand yet, we'll automatically create one for you and take you to its Brand Details page. > **Why Multiple Brands?** > > Your company account can have one or more brands. Generally, you'll only need one brand, but there are some cases where it's helpful to use multiple. For example: > > > - **If you have multiple products:** If you have products that go by different names, it can be useful to create different brands to help users know which product they're using 1-Click Signup for — and to help your team track metrics specific to that product. > - **If you want to try different brand settings:** If you want to change brand settings without affecting your existing implementation (even in Sandbox), you can duplicate your brand and configure different settings on the new brand. ### e. (optional) Invite team members. Invite your team members to join your Dashboard account. ## 2. Configure brand settings. **On the Brands page, click the Create button to create a new brand, or click Brand Details to access brand settings for an existing brand.** ### Brand Name **Choose an external name for your brand.** This will be used elsewhere in the Dashboard (for example on the Metrics page) and displayed to users in the SDK (if you choose to use the SDK). The internal brand name is separate, and you can edit it at the top of the page. You can use this to label brands created for testing purposes, for example. ### 1-Click Verify Settings #### Channels **Choose which channel(s) you want to enable:** | Option | Description | | --- | --- | | **Autofill** Recommended | Autofill verified phone number with no user input | | **Silent** Recommended | Autofill verified phone number with no user input | | **SMS** Always Enabled | Verify phone number with SMS OTP | > **We Recommend Using All Channels** > > **The autofill channel lets you autofill a user's phone number with _no user input_** — the best user experience on the planet! And the silent channel lets you verify a user inputted phone number without sending an SMS. But these channels don't yet work for all user sessions, so it's best to fall back from autofill to silent to SMS. > **How Billing Works** > > - **Autofill and Silent:** We bill per autofill/silent started (not succeeded), _but_ you can use the [`GET /1-click/verifications/channels`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications-channels) for free to check in advance if autofill will succeeded. Almost 100% of the time, if this endpoint indicates the autofill channel is available, autofill will succeed. The only exceptions are rare edge cases, for example when a user loads the page on cell data but then switches to WiFi before starting autofill (since autofill doesn't yet work on WiFi). > - **SMS:** We bill per SMS sent. > - **All channels:** We bill per verification succeeded. #### Delivery Format **Configure a default delivery format for SMS verification messages.** ##### Default Format > **Info** > > This setting determines a default value, which you can override anytime by including `format` in the request body of [`POST /1-click/verifications/{uuid}/deliver`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications-deliver). **Choose a format for the SMS verification message:** | Option | `format` | Description | Template | Example | | --- | --- | --- | --- | --- | | Code | `"code"` | A one-time code the user types in | > Enter this code to verify for `{Brand Name}`: 111111 | > Enter this code to verify for Hooli: 111111 | | Link | `"link"` | A one-time link the user clicks | > Click this link to verify for `{Brand Name}`: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > Click this link to verify for Hooli: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | | Code and Link | `"codeAndLink"` | Both, with the code first | > Enter this code to verify for `{Brand Name}`: 111111 > > > > > Or, click this link: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > Enter this code to verify for Hooli: 111111 > > > > > Or, click this link: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | | Link and Code | `"linkAndCode"` | Both, with the link first | > Click this link to verify for `{Brand Name}`: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) > > > > > Or, enter this code: 111111 | > Click this link to verify for Hooli: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) > > > > > Or, enter this code: 111111 | ##### Redirect URL > **Note** > > This setting is only relevant if you use the link format with the SMS channel: that is, if you send SMS with verification links (instead of verification codes). > **Info** > > This setting determines a default value, which you can override anytime by including `redirectUrl` in the request body of [`POST /1-click/verifications/{uuid}/deliver`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications-deliver). **Set a redirect URL,** which is where 1-Click Verify redirects a user to. The redirect URL can be any valid URL — whether a website link, app store link, or otherwise. ##### Redirect User After > **Note** > > This setting is only relevant if you use the link format with the SMS channel: that is, if you send SMS with verification links (instead of verification codes). > **Info** > > This setting determines a default value, which you can override anytime by including `redirectUserAfter` in the request body of [`POST /1-click/verifications/{uuid}/deliver`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-verifications-deliver). **Choose when a user should be redirected:** | Option | `redirectUserAfter` | Description | | --- | --- | --- | | 1-Click Verify | `"phoneVerification"` | After the 1-Click Verify flow (where we verify the user’s phone number) | | Hosted 1-Click Signup/Health | `"infoConfirmation"` | After a [1-Click Signup](https://docs.verified.inc/1-click-signup.md) and/or [1-Click health](https://docs.verified.inc/1-click-health.md) flow we host (where we autofill info and have the user confirm it) | If you choose the **"1-Click Verify"** option, we will redirect the user after we verify their phone number. You can then optionally: - Confirm the user's phone is verified. - Pass the user to an integrated 1-Click Signup flow on your side. See step 3 for how to do this. > **Tip** > > If you've already integrated 1-Click Signup (following the [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) or [API Integration](https://docs.verified.inc/1-click-signup/guides/api-integration.md) guide), the **"Text to Signup"** option is best, because it ensures you can keep your signup flow consistent for all users. If you choose the **"Hosted 1-Click Signup"** option, we will take the user through a hosted 1-Click Signup flow that autofills identity info and has them confirm it. You'll need to retrieve the user's info to benefit from this: see step 3 for how. --- **You're done with this Setup guide! ✅** Now, follow the [API Integration](https://docs.verified.inc/1-click-verify/guides/api-integration.md) guide to integrate 1-Click Verify into your application. --- Source: https://docs.verified.inc/1-click-verify/guides/setup Section: 1-Click Verify — https://docs.verified.inc/1-click-verify.md Previous: Guides — https://docs.verified.inc/1-click-verify/guides.md Next: API Integration — https://docs.verified.inc/1-click-verify/guides/api-integration.md --- # 1-Click Verify: Test Users Source: https://docs.verified.inc/1-click-verify/test-users.md You can test 1-Click Verify with mock data in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox), using either a random device IP and/or your own phone number, or our dedicated test users below. **All test users are keyed on device IP and/or phone number input data.** In other words, device IP and/or phone number are the unique inputs that distinguish one test user from another. > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. > **Don't Send Messages to Test User Phones/Emails** > > The test user phone numbers and email addresses are not valid, so sending messages to them won't work. To simulate SMS verification, for example, use the test user (static) verification codes. To test real SMS verification, use your own (real) phone number. ## How to Use Test Users ### Demo 1. Go to the [Demo](https://1-click.demo.verified.inc/). 2. Select _Mock Data (sandbox)_ and click _Start Demo_. 3. Enter the test user's phone number (varies by user). 4. Enter the test user's (static) verification code (always 111111). > **Tip** > > You can use a [custom demo](https://docs.verified.inc/custom-demo.md) by generating one or opening one with your brand's settings from within the Dashboard. ### SDK 1. Complete the [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) guide and run the SDK. 2. Enter the test user's phone number (varies by user). 3. Enter the test user's (static) verification code (always 111111). ### API 1. Access the [Dashboard](https://dashboard.verified.inc/) and go the Brand Details page for your brand. 2. Copy a [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) API key for your brand. 3. Call [1-Click Verify endpoints](https://docs.verified.inc/reference/api/endpoints.md#1-click-verify) with the test user's device IP and/or phone number (varies by user). --- ## Device IPs and Phone Numbers ### 1-Click Signup Test Users You can use any of the [1-Click Signup test users](https://docs.verified.inc/1-click-signup/test-users.md) with 1-Click Verify. Each of these is identified by a unique phone number, which you can resolve to with a corresponding, unique device IP. For example: - Device IP `::121:2555:0010` resolves to phone number +12125550010. - Device IP `::165:6555:0000` resolves to phone number +16565550000. - Device IP `::140:4555:1300` resolves to phone number +14045551300. - ... Any device IP that doesn't resolve to a specific 1-Click Signup test user phone number (or match one of the error code ones below) will resolve to our [primary test user](https://docs.verified.inc/1-click-signup/test-users.md#primary-test-user) phone number, +12125550010. > **How This Works** > > 1-Click Verify only accepts device IPs in IPv6 format. An [IPv6 address](https://en.wikipedia.org/wiki/IPv6_address) is a 128-bit number written as 8 groups of 4 hexadecimal digits separated by colons, for example: > > > > > ```text > 0000:0000:0000:0000:0000:0121:2555:0010 > ``` > > > > > However, there are 2 shortening rules to write these addresses in a more compact form: > > > 1. **Remove leading zeros:** Remove extra zeros at the start of any group. _For example, `0121` becomes `121`._ > 2. **Replace consecutive groups of zeros:** Replace consecutive groups of all zeros with a double colon, once per address. _For example, `0000:0000:0000:0000:0000` becomes `::`._ > > > So, the address above becomes: > > > > > ```text > ::121:2555:0010 > ``` > > > > > We resolve this to phone number +12125550010. ### Error Codes There are 2 device IPs that resolve to [Verified error codes](https://docs.verified.inc/reference/api/errors.md#verified-error-codes-1) for 1-Click Verify: - `::8` resolves to [`OCV008`](https://docs.verified.inc/reference/api/errors.md#ocv008). - `::10` resolves to [`OCV010`](https://docs.verified.inc/reference/api/errors.md#ocv010). ## Verification Codes We won't send SMS to the test user phone numbers, since they aren't real phone numbers. However, unless otherwise noted, you can use the static verification code **111111** to verify any test user number. --- Source: https://docs.verified.inc/1-click-verify/test-users Section: 1-Click Verify — https://docs.verified.inc/1-click-verify.md Previous: User Experience — https://docs.verified.inc/1-click-verify/user-experience.md Next: Guides — https://docs.verified.inc/1-click-verify/guides.md --- # 1-Click Verify: User Experience Source: https://docs.verified.inc/1-click-verify/user-experience.md It's in the name: _verify is what we do._ We are experts in how to optimize onboarding flows to maximize conversion and give users the best possible experience. We've helped our customers onboard — and delight! — millions of new users. The user experience described in this guide is the result of countless hours of research, design, testing, and iteration by our team. > **Use Our SDK to Get This UX** > > **Our SDK implements this user experience, and we strongly recommend you use it.** If you instead choose to use our **API**, we recommend you implement a user experience similar to this one. Full details are below, but the basic user experience is: 1. (if autofill available) **Trigger autofill** (e.g. click a button) 2. (if necessary) **Enter phone number** 3. (if necessary) **Enter SMS verification code** ## Flow Chart ![1-Click Verify flow chart](https://docs.verified.inc/assets/images/ux-flow-chart-1-click-verify-64e97097248f378056d22fa5c5547854.png) ↗️ [Open in new tab](https://docs.verified.inc/assets/files/ux-flow-chart-1-click-verify-64e97097248f378056d22fa5c5547854.png) (for easy zooming) > **Important** > > To implement this user experience yourself (which is only necessary if you choose the **API** integration type), without our SDK, you need to handle each action labeled Verified. ## Screens and Components ### Autofill #### Header > Verify Yourself #### Consent Language > By continuing, you agree to our [Terms](https://verified.inc/legal#terms-of-use). - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - "Terms”: - Hyperlinked to [https://verified.inc/legal#terms-of-use](https://verified.inc/legal#terms-of-use) (or your terms) - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - Underlined #### Opt In > Tap to Verify _Triggers autofill._ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Powered by Verified - Black and Green variant **"Powered By Verified" Graphic Variants** **Powered by Verified** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/powered-by-verified/png/gray.png) **1-Click Signup powered by Verified** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-signup-powered-by-verified/png/gray.png) **1-Click Health powered by Verified** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-health-powered-by-verified/png/gray.png) **1-Click Login powered by Verified** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-login-powered-by-verified/png/gray.png) **1-Click Verify powered by Verified** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-verify-powered-by-verified/png/gray.png) **1-Click Apply powered by Verified** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-apply-powered-by-verified/png/gray.png) **1-Click Access powered by Verified** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-access-powered-by-verified/png/gray.png) **1-Click AutoFill powered by Verified** **Black and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/svg/black-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/png/black-and-green.png) --- **White and Green:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/svg/white-and-green.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/png/white-and-green.png) --- **Black:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/svg/black.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/png/black.png) --- **White:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/svg/white.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/png/white.png) --- **Gray:** [Download SVG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/svg/gray.svg) | [Download PNG](https://docs.verified.inc/img/graphics/1-click-autofill-powered-by-verified/png/gray.png) #### Opt Out > Enter Phone Instead _Takes user to Phone screen._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color ![Autofill screen with a Tap to Verify button](https://docs.verified.inc/assets/images/autofill-c3b75fe645980cb5c6eeb2d98b265dcb.png) ↗️ [Open in new tab](https://docs.verified.inc/assets/files/autofill-c3b75fe645980cb5c6eeb2d98b265dcb.png) --- ### Phone #### Header > Enter Your Phone Number #### Consent Language > By entering your phone number, you authorize `{Brand Name}`'s service provider [Verified](https://verified.inc/) and its vendors to send you SMS verification texts at the number provided. Msg & Data rates may apply. - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - “Verified”: - Hyperlinked to [https://verified.inc](https://verified.inc/) - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - Underlined - `{Brand Name}`: replaced with your brand name #### Phone > +1 (_ _ _) _ _ _ - _ _ _ _ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) and [error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) colors - Auto focused - Opens numeric keyboard - Accepts only digits - Accepts OS autofill - Validates US phone number - Auto formats to +1 (NNN) NNN-NNNN (most common US format) - Auto submits on 10 digits #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Error > That phone number is invalid. Please try again. _Appears when phone number is invalid._ - [Error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color --- ![Phone number screen, starting state](https://docs.verified.inc/assets/images/phone-empty-5b06c3da6005e4fa93b40d62b92814a4.png) _Starting State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/phone-empty-5b06c3da6005e4fa93b40d62b92814a4.png) ![Phone number screen, error state](https://docs.verified.inc/assets/images/phone-error-812a19fcfda10d74561bc94defaf3486.png) _Error State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/phone-error-812a19fcfda10d74561bc94defaf3486.png) --- ### Verification Code #### Header > Verify Your Phone Number #### Description > Enter the verification code we texted to > **`{phone}`**. - New line before `{phone}` - Bold `{phone}` #### Verification Code - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) and [error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) colors - Auto focused - 6 separate boxes - En dash (–) in between first and last 3 boxes, to indicate hypen in verification code sent by SMS, which is included for readability: > 123-456 - Opens numeric keyboard - Accepts only digits - Accepts OS autofill - Auto submits on 6 digits #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Edit > Edit Phone _Takes user back to phone input._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Resend > Resend Code _Sends another SMS with fresh verification code._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - Allows for at most 2 resends #### Error > That code didn’t match. Please try again. _Appears when verification code is invalid or expired._ - [Error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Code Resent > We sent you a new verification code. _Appears when user clicks resend button._ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color --- ![Verification code screen, starting state](https://docs.verified.inc/assets/images/verification_code-empty-ba430bf42bf02d0b872883b441cea191.png) _Starting State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/verification_code-empty-ba430bf42bf02d0b872883b441cea191.png) ![Verification code screen, error state](https://docs.verified.inc/assets/images/verification_code-error-de0369250f695ffbbc7d4974663cd9f7.png) _Error State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/verification_code-error-de0369250f695ffbbc7d4974663cd9f7.png) ![Verification code screen, resent code state](https://docs.verified.inc/assets/images/verification_code-resent-02eccb72407f40a077d1d3b05a140e66.png) _Resent Code State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/verification_code-resent-02eccb72407f40a077d1d3b05a140e66.png) --- Source: https://docs.verified.inc/1-click-verify/user-experience Section: 1-Click Verify — https://docs.verified.inc/1-click-verify.md Previous: Overview — https://docs.verified.inc/1-click-verify/overview.md Next: Test Users — https://docs.verified.inc/1-click-verify/test-users.md --- # 1-Click Signup: Overview Source: https://docs.verified.inc/1-click-signup/overview.md | | | | --- | --- | | Speed | <10 seconds to complete 1-Click Signup | | Benefits | - Increase conversion - Streamline KYC operations - Prevent fraud | | Coverage | ~95% of US adults (>257M people) | | Integration Time | Depends on integration type: - <1 day for [**SDK**](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) - 1-2 weeks for [**API**](https://docs.verified.inc/1-click-signup/guides/api-integration.md) | ## About 1-Click Signup **1-Click Signup is the _fastest_ way to sign up new users.** From just a phone number, Verified autofills a user's identity data so they can share it in less than 10 seconds. **See [Outputs](https://docs.verified.inc/reference/data/outputs.md) for what this data can include.** We provide a wide range of [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) (pieces of user identity data) and rich [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata) about them, including dozens of sophisticated [risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals). > **Privacy First** > > **A user's data is never shared without their consent.** We are committed to putting people in control of their own data. We are SOC 2 Type II certified and compliant with major regulatory frameworks like HIPAA, CCPA, and GDPR. For more information, please see [How We Operate](https://verified.inc/how-we-operate). > > ## User Experience To use 1-Click Signup, all a user needs to do is: 1. Enter and verify phone number 2. (if necessary) Enter first name / birthday / SSN4 3. Confirm autofilled info _It takes less than 10 seconds, end to end!_ 1-Click Signup uses the exact same user experience as 1-click checkout solutions (like Stripe Link and Shop Pay), so it's familiar to users. See [User Experience](https://docs.verified.inc/1-click-signup/user-experience.md) for full details. > **Note** > > Step 2 above — prompting for a challenge (birthday/SSN4) — is necessary only if the phone number alone doesn't uniquely identify the user, for example if it's part of a shared phone carrier plan. (You can also configure your brand settings to always [prompt for a challenge](https://docs.verified.inc/1-click-signup/guides/setup.md#challenges).) ## Benefits - **Increase conversion:** Dramatically reduce friction, making it as easy as possible for new users to share their verified data. - **Streamline KYC operations:** Avoid user error and increase pass rates by leveraging our autofilled, verified data. - **Prevent fraud:** Stop bad actors by using our [risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) metadata. ## Coverage > **US Only (for now)** > > **We currently only cover people in the United States.** But we're soon adding new geographies. If there are particular geographies that'd be most helpful for our use case, please let us know by emailing [Support@Verified.inc](mailto:Support@Verified.inc), and we'll prioritize accordingly. We can source verified data for about **95% of US adults (253M people)** — if you provide both phone and a challenge (either birthday or SSN4) as inputs — and for about **20%** if you provide only phone. _Exact coverage depends on your user base._ Exact coverage depends on your user base and varies widely across companies. Some companies see greater than 97% coverage, while others see only 50%. The most common factor that contributes to low coverage is: 1. **Younger users:** We tend to see lower coverage for users under 25 because they've had less time to appear in our data sources. There are two other common factors, which mostly apply to lower intent use cases (for example gaming, as opposed to healthcare or banking): 1. **Dummy data:** Users may enter dummy data for [challenges](https://docs.verified.inc/reference/data/inputs.md#challenges) (first name, birthday or SSN4) if they don't think entering their real info is necessary. _You can mitigate this by using description text that stresses to users that they must use their real info._ 2. **Burner numbers:** Users may use burner or secondary phone numbers if they don't want to share their real ones. _You can mitigate this by blocking common burner numbers and VoIP numbers._ The data is extremely high quality because it comes from phone carriers, credit bureaus, and other trusted providers. Thanks to this quality, the data can be leveraged as part of a KYC/AML process. > **1-Click Signup is Not Full KYC** > > If your use case requires KYC (Know Your Customer) verification, the data we return can dramatically improve your processes by increasing pass rates and reducing incorrect and fraudulent data. **However, 1-Click Signup by itself is _not_ full KYC.** You should pass the data you receive from us through an additional KYC process to ensure compliance. > > > We're soon adding full KYC to 1-Click Signup, so we can provide you with a full stack solution. If that would be helpful for you, email us at [Support@Verified.inc](mailto:Support@Verified.inc) and we'll let you know when it's available. ## Integration Integrating 1-Click Signup is simple. How long it takes depends on the integration type you choose: - <1 day for [**SDK**](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) - 1-2 weeks for [**API**](https://docs.verified.inc/1-click-signup/guides/api-integration.md) To integrate, first follow the [Setup](https://docs.verified.inc/1-click-signup/guides/setup.md) guide and then either the [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) or [API Integration](https://docs.verified.inc/1-click-signup/guides/api-integration.md) guide. > **We Strongly Recommend the SDK Integration Type** > > **The SDK integration type is by _far_ the easier option, and we strongly recommend using it.** The SDK handles almost everything for you and is highly customizable, so you can use it to exactly match your branding and desired user experience. It implements our recommended [user experience](https://docs.verified.inc/1-click-signup/user-experience.md), which is hyper optimized from our experience verifying millions of users. > > > With the **API** integration type, you need to handle everything yourself, and you need approval from us to go live. --- Source: https://docs.verified.inc/1-click-signup/overview Section: 1-Click Signup — https://docs.verified.inc/1-click-signup.md Next: User Experience — https://docs.verified.inc/1-click-signup/user-experience.md --- # 1-Click Signup Source: https://docs.verified.inc/1-click-signup.md - [Overview](https://docs.verified.inc/1-click-signup/overview.md): Overview of 1-Click Signup - [User Experience](https://docs.verified.inc/1-click-signup/user-experience.md): User Experience for 1-Click Signup - [Test Users](https://docs.verified.inc/1-click-signup/test-users.md): Test Users for 1-Click Signup - [Guides](https://docs.verified.inc/1-click-signup/guides.md): 3 items --- Source: https://docs.verified.inc/1-click-signup Previous: API Integration — https://docs.verified.inc/1-click-verify/guides/api-integration.md Next: Overview — https://docs.verified.inc/1-click-signup/overview.md --- # 1-Click Signup: Guides Source: https://docs.verified.inc/1-click-signup/guides.md - [Setup](https://docs.verified.inc/1-click-signup/guides/setup.md): How to get setup to integrate 1-Click Signup - [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md): Full details on how to integrate 1-Click Signup with our API - [API Integration](https://docs.verified.inc/1-click-signup/guides/api-integration.md): Full details on how to integrate 1-Click Signup with our API --- Source: https://docs.verified.inc/1-click-signup/guides Section: 1-Click Signup — https://docs.verified.inc/1-click-signup.md Previous: Test Users — https://docs.verified.inc/1-click-signup/test-users.md Next: Setup — https://docs.verified.inc/1-click-signup/guides/setup.md --- # 1-Click Signup: API Integration Source: https://docs.verified.inc/1-click-signup/guides/api-integration.md | | | | --- | --- | | Time to Complete | 2-4 days | | Time to Test and Deploy | 1-2 weeks | | Skills Required | Make API calls, send SMS, build UX | > **Tip** > > **Complete the 1-Click Signup [Setup](https://docs.verified.inc/1-click-signup/guides/setup.md) guide before following this API Integration guide.** > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. ```mermaid sequenceDiagram actor U as User participant C as Customer participant V as Verified Note left of U: 1. Prompt user for inputs. C ->>+ U: Collect verified phone, challenge, and consent U ->>- C: Provide verified phone, challenge, and consent Note left of U: 2. Call POST /1-click. C ->>+ V: Call POST /1-click alt Additional info required V -->>- C: OCE011 error code C ->>+ U: Show DOB/SSN4 field(s) U ->>- C: Enter DOB/SSN4 C ->>+ V: Call POST /1-click with DOB/SSN4 alt Additional info mismatched V -->>- C: OCE012 error code C ->>+ U: Show DOB/SSN4 field(s) U ->>- C: Enter DOB/SSN4 C ->>+ V: Call POST /1-click with DOB/SSN4 break No credentials found V -->>- C: OCE013 error code C ->>+ U: Take user to manual signup end end end V ->> V: Source data (credentials and metadata) V -->> C: Return data Note left of U: 3. Have user confirm data. C ->>+ U: Display credentials U ->>- C: Confirm credentials ``` ## 1. Prompt user for inputs. To start 1-Click Signup for a user, you'll need to collect their: - **verified phone number**, - **challenge** (first name, birth date, or SSN4), and - **consent**. > **Challenge is Optional but Recommended** > > 1-Click Signup can work without a challenge (with just a verified phone number) for about 20% of users, but the output data quality is lower. We recommend collecting a challenge so the data we autofill is high quality, especially if your use case involves sensitive data like SSNs. **See the Verified Phone, Challenge, and Consent sections below for important details about each of these.** **You can collect these inputs in combination and in any order,** but you need to collect all three before calling `POST /1-click` ([step 2](https://docs.verified.inc/1-click-signup/guides/api-integration.md#2-call-post-1-click)). Here are some examples: **Example Flows** **Phone + Consent** ###### Phone + Consent First _1. **Phone + Consent:** Prompt user for phone and consent._ _2. **Verification Code:** Prompt user for phone verification code._ _3. **Challenge:** Prompt user for challenge._ ###### Challenge First _1. **Challenge:** Prompt user for challenge._ _2. **Phone + Consent:** Prompt user for phone and consent._ _3. **Verification Code:** Prompt user for phone verification code._ **Challenge + Consent** ###### Challenge + Consent First _1. **Challenge + Consent:** Prompt user for challenge and consent._ _2. **Phone:** Prompt user for phone._ _3. **Verification Code:** Prompt user for phone verification code._ ###### Phone First _1. **Phone:** Prompt user for phone._ _2. **Verification Code:** Prompt user for phone verification code._ _3. **Challenge + Consent:** Prompt user for challenge and consent._ **Challenge + Phone + Consent** _1. **Challenge + Phone + Consent:** Prompt user for challenge, phone, and consent._ _2. **Verification Code:** Prompt user for phone verification code._ **Consent Separate** ###### Consent First _1. **Consent:** Prompt user for consent._ _2. **Phone:** Prompt user for phone._ _3. **Verification Code:** Prompt user for phone verification code._ _4. **Challenge:** Prompt user for challenge._ ###### Consent Last _1. **Phone:** Prompt user for phone._ _2. **Verification Code:** Prompt user for phone verification code._ _3. **Challenge:** Prompt user for challenge._ _4. **Consent:** Prompt user for consent._ ### Verified Phone To verify the user's phone number, you can either: 1. **Use our [1-Click Verify API](https://docs.verified.inc/1-click-verify/guides/api-integration.md):** This is our dedicated phone verification solution. 2. **Use another phone verification solution:** This can be one of the many phone verification solutions on the market or one you build yourself. You can use any solution you like, as long as it satisfies the requirements listed in the warning below. > **Tip** > > **We highly recommend using 1-Click Verify because:** > > > - **It can autofill verified phone numbers _from nothing!_** When this option is available, the user doesn't have to enter a phone number or SMS verification code at all. It's magical. > - **It ties directly into 1-Click Signup to make the integration especially easy and secure.** Specifically, 1-Click Verify outputs a `verificationUuid` that you can pass directly to 1-Click Signup, which we use to hydrate the user's phone number and confirm it was properly verified. > **Warning** > > **If you use another solution for phone verification, we'll need to do a compliance review of your integration to ensure phone verification is being handled properly.** Specifically, we check for: > > > - **Recency:** Phone numbers must be verified within 24 hours of when you use 1-Click Signup to autofill user data (to ensure data freshness). > - **Entropy:** Verification codes must be at least 6 digits long (to prevent brute force attacks). > - **Expiration:** Verification codes must be short lived, lasting no more than 10 minutes (to prevent staleness). > - **One-time use:** Verification codes must be able to be used only once (to prevent reuse attacks). > - **Rate limiting:** Verification code attempts must be rate limited (to prevent brute force attacks). > - **Attempt limiting:** Verification code attempts must be limited to a small number for a given phone number (to prevent brute force attacks). > > > (1-Click Verify, if you choose to use it, handles all of these requirements for you.) > **Supported Phone Numbers** > > **Currently, we only support US mobile phone numbers.** You'll need to pass these to our API in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). This is the `+1` country code with a 10-digit subscriber code appended to it, for example `+12125550010`. _See our [Demo](https://1-click.demo.verified.inc/) for an example of this._ We recommend using a phone number input that auto submits when the user enters 10 digits. (See the [Phone](https://docs.verified.inc/1-click-signup/user-experience.md#phone) screen of our User Experience guide for full details.) Here's an example: _Verified consent language, phone number input, and the green variant of the Powered by Verified graphic_ ### Challenge **We support first name, birth date, and SSN4 as [challenges](https://docs.verified.inc/reference/data/inputs.md#challenges)** (secondary inputs alongside verified phone). > **Tip** > > You can use one or more challenges, but we recommend using only one to streamline the user experience. **First Name** See the [First Name](https://docs.verified.inc/1-click-signup/user-experience.md#first-name) screen of our User Experience guide for our detailed recommendations. Here's an example: _Text input and the green variant of the Powered by Verified graphic_ Depending on your use case, it can be helpful to stress to the user that they need to use their _real_ first name. Sometimes a user enters a dummy first name, thinking it doesn't matter, but in this case their real name is needed. > **Nicknames Can Work** > > **Some users go by a different first name than their legal first name. Generally, any first name they go by will work!** For example: > > > - One of Verified's founders goes by Liam, but his legal first name is William. > - He can enter either Liam or William and successfully use 1-Click Signup, because we see both of those first names associated with his phone number. > - However, if he enters a different name that he doesn't go by (even a common nickname for William, like Bill), 1-Click Signup won't autofill info for him, because we don't see that name associated with his phone number. > **Prompt for Legal First Name if You Need it Later** > > **Currently, the first name 1-Click Signup _outputs_ matches the first name the user _inputs_.** Therefore, for a user with multiple first names (for example nickname and legal name), the first name they input determines what first name you'll receive from us. Continuing the example above: > > > - One of Verified's founders goes by Liam, but his legal first name is William. > - If he inputs Liam, 1-Click Signup will autofill Liam. > - If he inputs William, 1-Click Signup will autofill William. > > > This matters if you specifically need the user's _legal_ first name some time in the future, for example if you use [1-Click Health](https://docs.verified.inc/1-click-health.md) after 1-Click Signup. **If you need the user's legal first name later, prompt them to enter their legal first name at the outset.** **Birth Date** We recommend using a numeric input (formatted as MM/DD/YYYY)that automatically submits when the user enters 8 digits. See the [Birthday](https://docs.verified.inc/1-click-signup/user-experience.md#birthday) of our User Experience guide for full details. Here's an example: _Numeric input, formatted as MM/DD/YYYY, and the green variant of the Powered by Verified graphic_ Depending on your use case, it can be helpful to stress to the user that they need to use their _real_ birthday. Sometimes a user enters a dummy birthday, thinking it doesn't matter (for example thinking that you only need to know they're 18+), but in this case their real name is needed. > **Birth Date Format** > > You'll need to pass the birth date to our API (in the [request body of `POST /1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-request)) in yyyy-MM-dd format, but you should collect it from the user in whatever form you think results in the best user experience for your use case. **SSN4** We recommend using a numeric input that automatically submits when the user enters 4 digits. See the [SSN4](https://docs.verified.inc/1-click-signup/user-experience.md#ssn4) of our User Experience guide for full details. Here's an example: _Numeric input and the green signup variant of the Powered by Verified graphic_ ### Consent **Users must give informed consent for their info to be autofilled with 1-Click Signup.** To collect this consent, you need to use our 1-Click Signup consent language and a Powered by Verified graphic. #### Consent Language **You must use this 1-Click Signup consent language:** > By `{taking this action}`, you agree that `{Brand Name}`’s service provider [Verified](https://verified.inc/) and its vendors may receive your personal info and autofill more info about you, including your social security number. - **Replace `{taking this action}` with the action the user will take to start 1-Click Signup.** For example: - If you use a form with a phone number input that autosubmits (which [we recommend](https://docs.verified.inc/1-click-signup/user-experience.md#phone)), you should use "entering your phone number". - If you use a Continue button, you should use "clicking Continue". - **Link "Verified" to [https://verified.inc](https://verified.inc/) and make it underlined and a different color than the rest of the text** (so the user knows it's a link). - **Replace `{Brand Name}` with your brand name.** - **Omit "including your social security number" if won't autofill SSNs with 1-Click Signup:** that is, if you didn't include SSN in your [Default Credential Requests](https://docs.verified.inc/1-click-signup/guides/setup.md#default-credential-requests) setting. Here's an example: > By entering your phone number, you agree that Hooli’s service provider [Verified](https://verified.inc/) and its vendors may receive your personal info and autofill more info about you, including your social security number. > **Important** > > This consent language can be included alongside or as part of other legal language you already use, but it must be displayed to the user — not just included in terms you link out to. > **Warning** > > **You may not modify this consent language except as described above.** It's the result of extensive legal review to ensure it meets all requirements for informed consent. #### Powered by Verified Graphic Because "verified" is itself a common word, our company name alone doesn't unambiguously indicate to users which specific company they're consenting to. Including a Powered by Verified graphic with our logo makes it unambiguous and satisfies the requirement of informed consent. Therefore, you must include a "Powered by Verified" graphic, which should be placed just below the trigger you use to start the 1-Click Signup flow. For example, this may be a phone number input or a button. We provide many different variants of the graphic, so you can choose the one that best fits your use case and the background color of your application: _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ ## 2. Call `POST /1-click`. > **Recency Requirement** > > **You must call `POST /1-click` within 24 hours of verifying the user's > phone number.** This ensures we source fresh, accurate data. > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). **Call [`POST /1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click):** - If you used 1-Click Verify to verify the user's phone number, use `verificationUuid` in the request body. If you used another phone verification solution, use `phone`. - If you collected a challenge (first name, birth date, or SSN4), include it in the request body (as `fullName.firstName`, `birthDate`, or `ssn4`). **From 1-Click Verify** **First Name** **POST /1-click Request Body: From 1-Click Verify with First Name Challenge** ```typescript { verificationUuid: string, // Example: "f3e2c1d0-4b5a-6789-0abc-def123456789" fullName: { firstName: string // Example: "Richard" } } ``` **Birth Date** **POST /1-click Request Body: From 1-Click Verify with Birth Date Challenge** ```typescript { verificationUuid: string, // Example: "f3e2c1d0-4b5a-6789-0abc-def123456789" birthDate: string // Example: "1989-08-01" } ``` **SSN4** **POST /1-click Request Body: From 1-Click Verify with SSN4 Challenge** ```typescript { verificationUuid: string, // Example: "f3e2c1d0-4b5a-6789-0abc-def123456789" ssn4: string // Example: "6789" } ``` **From Another Phone Verification Solution** **First Name** **POST /1-click Request Body: From Another Phone Verification Solution with First Name Challenge** ```typescript { phone: string, // Example: "+12125550010", must have been verified within 24 hours fullName: { firstName: string // Example: "Richard" } } ``` **Birth Date** **POST /1-click Request Body: From Another Phone Verification Solution with Birth Date Challenge** ```typescript { phone: string, // Example: "+12125550010", must have been verified within 24 hours birthDate: string // Example: "1989-08-01" } ``` **SSN4** **POST /1-click Request Body: From Another Phone Verification Solution with SSN4 Challenge** ```typescript { phone: string, // Example: "+12125550010", must have been verified within 24 hours ssn4: string // Example: "6789" } ``` > **Tip** > > You'll see in the [endpoint reference](https://docs.verified.inc/reference/api/endpoints.md#post-1-click) for `POST /1-click` that it supports additional [inputs](https://docs.verified.inc/reference/data/inputs.md#1-click-signup). > > > **If you already have any of these, include them in the request body.** (But, we don't recommend prompting for any of them yet if you don't already have them.) > > > Here's why: You'll see later in this guide that, if we can't source data for the user based on the inputs you provide, you can prompt the user for an additional input(s) and then make another API call. If for any reason you already have this information, you should include at this step so no further call will be necessary. If we can source data for the user, the [response body](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-response) will contain a [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity), keyed on `identity`, that contains the user's data and metadata about it. If we can't source data, the response body will contain an [error](https://docs.verified.inc/reference/api/errors.md) with a Verified error code. (Note that this error code, which is Verified specific, is `data.errorCode` in the error object, _not_ `code` (which is a standard HTTP response status code).) See step 2a below for how to handle Verified error codes. > **Data is Retrievable for 1 Hour** > > **You can retrieve data for 1 hour,** at which point it's deleted. Use [`GET /1-click`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click) instead of `POST /1-click`, so that a duplicate 1-Click Signup event isn't created (and so you aren't billed twice). ### a. (if needed) Handle errors. The simplest 1-Click Signup integrations can treat all Verified error codes as generic errors, but you can improve your integration substantially by handling the ones listed below. There are [other ones](https://docs.verified.inc/reference/api/errors.md#verified-error-codes) as well, but you can generally ignore those. #### `OCE011` The [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) Verified error code indicates that we need additional information (another challenge) to source data. > **Inclusive OR** > > The `inputs` included in `message` and `data.additionalInputs` is a comma separated list of additional information. > > > **Multiple values always indicate an inclusive OR:** that is, you can **pass one or more** of the additional inputs. You do _not_ need to pass all of the additional inputs included in the list! > > > For example, if `inputs` is `birthDate, ssn4`, you can pass either the user's birth date or their SSN4 (or both). We always recommend passing just one first because both are required only very rarely and, if they _are_ both required, you will get another `OCE011` error code indicating that the other one is required. #### `OCE012` The [`OCE012`](https://docs.verified.inc/reference/api/errors.md#oce012) Verified error code indicates that the challenge provided mismatched. #### `OCE013` The [`OCE013`](https://docs.verified.inc/reference/api/errors.md#oce013) Verified error code indicates that Verified found no [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) for the user. #### `OCE017` The [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017) Verified error code indicates that Verified blocked the user because the risk score was too high. #### `OCE019` The [`OCE019`](https://docs.verified.inc/reference/api/errors.md#oce019) Verified error code indicates that the maximum number of attempts has been reached for one or more of the challenges. ## 3. Prompt user to confirm info. **You must display the user's [credential](https://docs.verified.inc/reference/data/outputs.md#credentials) data to them and have them confirm it's correct.** The credential data is contained in `credentials` in the [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#example-1clickentity) from the API response. You don't need to display any [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata) (contained in `metadata` in the [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#example-1clickentity)) though you can choose to if it's relevant. > **User Confirmation is a Requirement** > > **You may not store a user's credential data if they don't confirm it.** This is a compliance requirement. We will not approve your integration if you don't abide by it. > **Benefits of Doing This** > > 1. **Transparency:** By displaying the user's data to them, you ensure they're aware of what data you've received about them. > 2. **Accuracy:** Although Verified provides _very_ high quality data, we can never guarantee all data will be perfectly accurate. By having the user confirm their data, you can better avoid inaccuracies. Depending on your use case, you may want to give the user the ability to edit their data. ### a. Mask sensitive info. If you receive a birth date or SSN from Verified as an autofilled [output](https://docs.verified.inc/reference/data/outputs.md#1-click-signup), you must mask it as described below before displaying it to the user. > **This is a Compliance Requirement** > > Masking sensitive info is a compliance requirement. We cannot approve you for [Production](https://docs.verified.inc/reference/api/environments.md#production) access until you implement what's described below. > **Tip** > > **There's one exception:** If you collect a birth date or SSN from the user as an [_input_](https://docs.verified.inc/reference/data/inputs.md#1-click-signup), then you don't need to mask it — because the user provided it themselves, in full! This case typically applies if you collect birth date upfront as a challenge input (instead of first name or SSN4). #### Birth Date **Mask the year digits (server side),** so the client only displays the month and day digits. We recommend using the • character to mask and the most common US format MM/DD/YYYY, so that (for example) 1989-08-01 is displayed as 08/01/••••. **If you allow the user to edit the birth date, clear the entire value when they start editing (by deleting one character)**, so they don't just edit the first 4 digits (which could result in another valid birth date, but one that isn't theirs). #### Social Security Number (SSN) **Mask the first 5 digits (server side),** so the client only displays the last 4 digits. We recommend using the • character to mask and the most common US format NNN–NN-NNNN, so that (for example) 000456789 is displayed as •••-••-6789. **If you allow the user to edit the SSN, clear the entire value when they start editing (by deleting one character)**, so they don't just edit the last 4 digits (which could result in another valid SSN, but one that isn't theirs). ### b. Display info for editing or confirmation. **We recommend that you:** 1. **Use a static display for view mode.** 2. **Use a form with autofilled inputs for edit mode.** 3. **Include information about where the data comes from.** (See the [Info](https://docs.verified.inc/1-click-signup/user-experience.md#info) screen of our User Experience guide for full details.) Here's an example: _Static display for view mode, question mark button to see information about where data comes from_ _Form with autofilled inputs for edit mode, question mark button to see information about where data comes from_ _Information about where data comes from_ #### i. Use a static display for view mode. In edit mode, we recommend that you display the user's data statically and show an edit button that lets them go into edit mode. If you receive multiple [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) of a given type (for example Address), you can display a dropdown of options. If the user goes into edit mode, you should use the selected value in the dropdown to autofill an input for that credential type. #### ii. Use a form with autofilled inputs for edit mode. In edit mode, we recommend that you display the user's data using a form with autofilled inputs. You can enable or disable each input depending on whether you want the user to be able to edit the data it contains. The upside of allowing the user to edit data is that it allows them to correct any inaccuracies. The downside is that user input isn't verified and may make fraud more likely. #### iii. Include information about where the data comes from. Including some information about where the data comes from helps users understand the magic of 1-Click Signup and feel comfortable with it. We recommend this language: > Verified autofills your info from trusted sources so you don’t have to enter it manually. It’s fast, safe, and secure. > **Possible Data Inaccuracies** > > The most common inaccuracy is an outdated address. We keep user addresses up to date as much as possible, but if the user has moved very recently, we may not yet have their current address. > > > Less commonly, a user may have an outdated name, if they've recently had it legally changed and we haven't yet updated it. > > > Some data points, like birth date and SSN, should never change, but it's still possible (in very rare cases) for these to be inaccurate. So, if having perfectly accurate data is crucial for your use case, we recommend that you have users confirm it. --- ## Go Live! ### Test in Sandbox Test with our 1-Click Signup [test users](https://docs.verified.inc/1-click-signup/test-users.md). ### Request Production Approval **When you're ready to go live, request approval for [Production](https://docs.verified.inc/reference/api/environments.md#production) access:** 1. Go to the **Brand Details** page for your brand in the Verified [Dashboard](https://dashboard.verified.inc/). 2. Click the **Production** tab in the upper right, and make sure your brand settings are configured as you intend them to be. 3. Click the **Request Approval** button under the API Keys section. 4. Complete the **steps** listed in the dialog. 5. Click the **Submit Request** button. > **Tip** > > You can use the **Sync from Sandbox** buttons to quickly port some setting configurations from Sandbox to Production. Note, however, that this is not possible for all settings: some need to be configured manually for Production. In step 4, you'll be asked to confirm the following: [ ] We've included the Verified consent language a "powered by Verified" graphic and (see step 1). [ ] We’re using Verified API keys securely: server side, never client side. [ ] We're properly verifying users' phone numbers. [ ] We’re handling relevant [Verified error codes](https://docs.verified.inc/reference/api/errors.md#verified-error-codes). [ ] If we’re requesting SSNs, we’re masking them server side and only exposing the last 4 digits client side. [ ] Our 1-Click Signup flow is working end-to-end in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox). > **Important** > > You'll also be prompted to share a link to your Sandbox integration and/or schedule a 15 minute call with us, so we can review your integration to see that it's compliant and working properly. Once we approve it, you'll have access to a Production API key on the Brand Details page. ### Swap Sandbox for Production **Once you have Production access, just swap Sandbox for Production:** 1. Swap your Sandbox API key for your Production API key. 2. Swap the [Sandbox base URL](https://docs.verified.inc/reference/api/environments.md#sandbox) for the [Production base URL](https://docs.verified.inc/reference/api/environments.md#production). **Then you'll be live with 1-Click Signup! ✅** --- Source: https://docs.verified.inc/1-click-signup/guides/api-integration Section: 1-Click Signup — https://docs.verified.inc/1-click-signup.md Previous: SDK Integration — https://docs.verified.inc/1-click-signup/guides/sdk-integration.md Next: 1-Click Health — https://docs.verified.inc/1-click-health.md --- # 1-Click Signup: SDK Integration Source: https://docs.verified.inc/1-click-signup/guides/sdk-integration.md | | | | --- | --- | | Time to Complete | 1 hour | | Time to Test and Deploy | 2-4 hours | | Skills Required | Make API calls | > **Tip** > > **Complete the 1-Click Signup [Setup](https://docs.verified.inc/1-click-signup/guides/setup.md) guide before following this SDK Integration guide.** > **The SDK Works for Web and Native Mobile** > > **You can use the Verified SDK in both web and native mobile apps!** Many of our customers do exactly this, so they can provide users with a unified (and much easier to maintain) experience across web, iOS, and Android. > > > **For how to do this, see Native Mobile App Integration.** ```mermaid sequenceDiagram box Customer participant S as Server participant C as Client end participant V as Verified actor U as User note left of S: 1. Create Session Key C ->>+ S: Call server to create session key S ->>+ V: Call POST /client/1-click with API key V -->>- S: Return sessionKey S -->>- C: Return sessionKey note left of S: 2. Initialize SDK C ->> C: Create VerifiedClientSDK instance C ->> C: Call show() method rect rgb(200,200,200,0.85) note left of V: 3. Verify User
(handled by Verified) V ->> U: Verify user, source data,
and have user confirm data V ->> C: Return result end note left of S: 3. Handle Response alt Result: value is USER_SHARED_CREDENTIALS C ->>+ S: Call server with identityUuid S ->>+ V: Call GET /1-click with identityUuid V -->>- S: Return data S -->>- C: Return success else Result: value is USER_OPTED_OUT C ->> U: Take user to manual signup else Error C ->> C: Restart SDK (go back to step 1) end ``` **Full Example** **Integrate SDK** ```typescript import { VerifiedClientSdk, SdkResult, SdkEvent, SdkError, SdkResultValues, SdkEventValues, SdkErrorReasons, } from '@verifiedinc-public/client-sdk'; // Initialize the SDK const sdk = new VerifiedClientSdk({ sessionKey: 'YOUR_SESSION_KEY', onResult: handleResult, onError: handleError, onEvent: handleEvent, }); // Handle successful results function handleResult(data: SdkResult) { switch (data.type) { case SdkResultValues.USER_SHARED_CREDENTIALS: // 1-Click Signup success! // Pass data.identityUuid to server (to call GET /1-click/{identityUuid}) break; // Only for 1-Click Health // case SdkResultValues.USER_SHARED_HEALTH_DATA: // 1-Click Health success! // // Pass data.healthDataUuid to server (to call GET /1-click/health/{healthDataUuid}) // break; case SdkResultValues.USER_OPTED_OUT: // User clicked 'Sign Up Manually Instead' // Take user to manual signup flow break; case SdkResultValues.NO_CREDENTIALS_FOUND: // No signup data found (OCE013 Verified error code) // Take user to manual signup flow. Additional metadata may be available. break; // Only for 1-Click Health // case SdkResultValues.NO_INSURANCE_FOUND: // No health insurance data found // // Take user to manual health insurance flow // break; case SdkResultValues.RISK_SCORE_TOO_HIGH: // OCE017 Verified error code // Take user to manual signup flow. Additional metadata may be available. break; case SdkResultValues.MAX_INPUT_ATTEMPTS_EXCEEDED: // OCE019 Verified error code // Take user to manual signup flow. Additional metadata may be available. break; case SdkResultValues.MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED: // User tried verification code too many times // Take user to manual signup flow. Additional metadata may be available. break; } } // Handle errors function handleError(error: SdkError) { console.error('SDK error:', error.reason); switch (error.reason) { case SdkErrorReasons.INVALID_SESSION_KEY: // Call POST /client/1-click on server to get a new session key break; case SdkErrorReasons.SESSION_TIMEOUT: // Call POST /client/1-click on server and create new VerifiedClientSdk instance break; case SdkErrorReasons.SHARE_CREDENTIALS_ERROR: // Handle credential sharing error break; } } // Handle intermediary events function handleEvent(event: SdkEvent) { // metadata is always available console.log(event.metadata); switch (event.type) { case SdkEventValues.SDK_READY: // SDK rendered content for the user break; case SdkEventValues.USER_STEP_CHANGE: // User navigated to a new step console.log(event.step, event.previousStep); break; case SdkEventValues.STEP_TIME_SPENT: // User left a step, includes duration console.log(event.step, event.durationMs); break; case SdkEventValues.USER_COMPLETED_PRODUCT: // User completed a product flow console.log(event.product); break; case SdkEventValues.ONE_CLICK_SIGNUP_FORM_SUBMITTED: // User submitted signup form console.log(event.form); break; case SdkEventValues.ONE_CLICK_HEALTH_FORM_SUBMITTED: // Only for 1-Click Health // User submitted health form console.log(event.form); break; case SdkEventValues.ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED: // Only for 1-Click Health // User submitted health manual-input form (fullName/birthDate fallback) console.log(event.form); break; } } // Display the SDK in your application sdk.show(document.getElementById('sdk-container') as HTMLElement); ``` ## 1. Create a session key. Have your client call your server to create a session key. The server should use your Verified API key to call [`POST /client/1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-client1-click). > **Tip** > > **You can access your API keys in the [Dashboard](https://dashboard.verified.inc/):** see the [Setup](https://docs.verified.inc/1-click-signup/guides/setup.md) guide. In typical usage, you call this endpoint with an empty request body: **POST /client/1-click Request Body (empty)** ```typescript {} ``` But you can include properties (all of which are optional) if you have them: **POST /client/1-click Request Body** ```typescript { verificationUuid?: string, phone?: string, email?: string, birthDate?: string, ssn4?: string, fullName?: { firstName?: string, middleName?: string, lastName?: string }, address?: { line1?: string, line2?: string, city?: string, state?: string, zipCode?: string, country?: string } } ``` - Include `verificationUuid` if you're using the SDK after [Text to Signup](https://docs.verified.inc/text-to-signup.md) or a [1-Click Verify API integration](https://docs.verified.inc/1-click-verify/guides/api-integration.md). - Include `phone` if you already verified the user's phone number with your own solution (outside of Verified). _This requires approval through a compliance review._ - Include other properties if you already have some [input](https://docs.verified.inc/reference/data/inputs.md) user data. This will cause the SDK to optimize the flow to avoid rendundant steps (for example by skipping the [Birthday](https://docs.verified.inc/1-click-signup/user-experience.md#birthday) step if that has already been provided). If you include either `verificationUuid` or `phone`: - The SDK will skip the [Phone](https://docs.verified.inc/1-click-signup/user-experience.md#phone) and [Verification Code](https://docs.verified.inc/1-click-signup/user-experience.md#verification-code) steps, since the user has already verified their phone number. - The SDK will start with a separate Consent step, since the consent language can't be displayed on the Phone step. > **Note** > > It doesn't make sense to include both `verificationUuid` and `phone`, since a `verificationUuid` references a [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity), which has its own `phone` property. The response body will contain a `sessionKey`: **POST /client/1-click Response Body** ```typescript { sessionKey: string } ``` Your server should return the `sessionKey` to your client, so you can use it in step 2. > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). > **Session Keys Are Single Use** > > Each session key can only be used once. If you need to initialize a new SDK instance, [create a new session key](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md#1-create-a-session-key). ## 2. Initialize the SDK. Make sure you've [installed](https://docs.verified.inc/reference/sdk/installation.md) the SDK: **Install SDK with NPM** ```none npm i @verifiedinc-public/client-sdk ``` Then, initialize the SDK as follows. ### a. Import the SDK. Import the SDK into your application: ```typescript import { VerifiedClientSdk, SdkResult, SdkError, SdkResultValues, SdkErrorReasons } from '@verifiedinc-public/client-sdk'; ``` ### b. Create an SDK instance. Create a `VerifiedClientSdk` instance, setting the `environment` and passing the `sessionKey` you received from `POST /client/1-click` in step 1: ```typescript const verifiedClientSdk = new VerifiedClientSdk({ environment: 'sandbox', // 'sandbox' or 'production' sessionKey: 'SESSION_KEY', // sessionKey from POST /client/1-click onResult: handleResult, // Result function onError: handleError // Error function }); ``` > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. ### c. Define a result function. Define a function to handle results, leveraging the [`SdkResult` type](https://docs.verified.inc/reference/sdk/types.md#sdkresult): ```typescript function handleResult(data: SdkResult): void { // See step 3a } ``` See step 3a for how to handle results. ### d. Define an error function. Define a function to handle errors, leveraging the [`SdkError` type](https://docs.verified.inc/reference/sdk/types.md#sdkerror): ```typescript function handleError(error: SdkError) { // See step 3b } ``` See step 3b for how to handle errors. ### e. Define an event function. Define a function to handle events, leveraging the [`SdkEvent` type](https://docs.verified.inc/reference/sdk/types.md#sdkevent): ```typescript function handleEvent(event: SdkEvent) { // See step 3c } ``` See step 3c for how to handle events. ### f. Show the SDK. Show the SDK to the user, leveraging the [`show()` method](https://docs.verified.inc/reference/sdk/methods.md#show). ```typescript // Injected into document.body if no HTML element is passed) verifiedClientSdk.show(document.getElementById('verifiedClientSdk-container')); ``` > **Note** > > There's also a [`destroy()` method](https://docs.verified.inc/reference/sdk/methods.md#destroy) that destroys the SDK element and invalidates the instance. ## 3. Handle responses. ### a. Handle results. Complete the `handleResult` function you defined in step 2c, leveraging the [`SdkResultValues` constant](https://docs.verified.inc/reference/sdk/constants.md#sdkresultvalues): ```typescript function handleResult(data: SdkResult): void { switch (data.type) { case SdkResultValues.USER_SHARED_CREDENTIALS: // 1-Click Signup success! // Pass data.identityUuid to server (to call GET /1-click/{identityUuid}) break; // Only for 1-Click Health // case SdkResultValues.USER_SHARED_HEALTH_DATA: // 1-Click Health success! // // Pass data.healthDataUuid to server (to call GET /1-click/health/{healthDataUuid}) // break; case SdkResultValues.USER_OPTED_OUT: // User clicked 'Sign Up Manually Instead' // Take user to manual signup flow break; case SdkResultValues.NO_CREDENTIALS_FOUND: // No signup data found (OCE013 Verified error code) // Take user to manual signup flow. Additional metadata may be available. break; // Only for 1-Click Health // case SdkResultValues.NO_INSURANCE_FOUND: // No health insurance data found // // Take user to manual health insurance flow // break; case SdkResultValues.RISK_SCORE_TOO_HIGH: // OCE017 Verified error code // Take user to manual signup flow. Additional metadata may be available. break; case SdkResultValues.MAX_INPUT_ATTEMPTS_EXCEEDED: // OCE019 Verified error code // Take user to manual signup flow. Additional metadata may be available. break; case SdkResultValues.MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED: // User tried verification code too many times // Take user to manual signup flow. Additional metadata may be available. break; } } ``` > **Note** > > Regardless of the result type, you can access specific metadata properties directly from the **data** object. See [SdkResult](https://docs.verified.inc/reference/sdk/types.md#sdkresult) type definition for the complete structure. There are 6 result values to handle for 1-Click Signup: | Result Value | Description | How to Handle | | --- | --- | --- | | `USER_SHARED_CREDENTIALS` | User successfully shared [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) (identity data) | Retrieve data | | `USER_OPTED_OUT` | User opted out by clicking the "Sign Up Manually Instead" button | Take user to manual signup flow | | `NO_CREDENTIALS_FOUND` | No signup data found ([`OCE013`](https://docs.verified.inc/reference/api/errors.md#oce013) Verified error code) | Take user to manual signup flow. Additional metadata may be available. | | `RISK_SCORE_TOO_HIGH` | [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017) Verified error code | Take user to manual signup flow. Additional metadata may be available. | | `MAX_INPUT_ATTEMPTS_EXCEEDED` | [`OCE019`](https://docs.verified.inc/reference/api/errors.md#oce019) Verified error code | Take user to manual signup flow. Additional metadata may be available. | | `MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED` | [`OCE020`](https://docs.verified.inc/reference/api/errors.md#oce020) Verified error code | Take user to manual signup flow. Additional metadata may be available. | > **Note** > > There are 2 other result values, but these are only relevant for 1-Click Health. See the [1-Click Health SDK Integration guide](https://docs.verified.inc/1-click-health/guides/sdk-integration.md#a-update-how-you-handle-results) for details. > :: > > > Some [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata) may be available directly in the `data` object (see [`SdkResult`](https://docs.verified.inc/reference/sdk/types.md#sdkresult)). To retrieve all metadata (and [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) if the result value is `USER_SHARED_CREDENTIALS`), call your server with `data.identityUuid`. The server should use your Verified API key to call [`GET /1-click/{identityUuid}`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click): > > > > > ```text > GET /1-click/{identityUuid} > ``` > > > > > > **Danger** > > > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). > > > The response will be a [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) that contains data (user [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) and [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata)): > > > > **GET /1-click Response Body** > > > ```typescript > { > ...1ClickEntity > } > ``` > > > > > **`1ClickEntity` Example** > > > > > > **1ClickEntity Example** > > > ```typescript > { > "identifiers": { > "phone": "+12125550010" > }, > "credentials": { > "fullName": { > "firstName": "Richard", > "lastName": "Hendricks" > }, > // Array because `multi` was set to `true` in the address credential request > "address": [ > { > "line1": "5320 Newell Rd", > "city": "Palo Alto", > "state": "CA", > "zipCode": "94303", > "country": "US" > } > ], > "birthDate": "1989-08-01", > "ssn": "000456789" > }, > "metadata": { > "identifiers": { > "verificationMethod": { > "phone": "otp" > }, > "riskSignals": { > "overall": { > "score": 0, > "level": "low", > "recommendation": "allow", > "reasonCodes": [ > "OCR10021" > ] > }, > "phone": { > "carrier": { > "id": 0, > "name": "Example Carrier" > } > "reasonCodes": [ > "OCR20004", > "OCR20005", > "OCR20007", > "OCR20101" > ] > }, > "email": { > "reasonCodes": [ > "OCR60001", > "OCR60002" > ] > }, > "deviceIp": { > "reasonCodes": [ > "OCR50001", > "OCR50002" > ] > } > } > }, > // Follows the same structure as `credentials` and maintains the same order for array items when `multi` is set to `true` > "credentials": { > "verificationMethod": { > "fullName": { > "firstName": "phone_carrier", > "lastName": "phone_carrier" > }, > // Array because `multi` was set to `true` in the address credential request > "address": [ > { > "line1": "credit_bureau", > "city": "credit_bureau", > "state": "credit_bureau", > "zipCode": "credit_bureau", > "country": "credit_bureau" > } > ], > "birthDate": "phone_carrier", > "ssn": "phone_carrier" > } > } > } > } > ``` > > > > > > > ### b. Handle errors. > > > Complete the `handleError` function you defined in step 2d: > > > > > ```typescript > function handleError(error: SdkError): void { > // Restart SDK: Create new session key and SDK instance > } > ``` > > > > > There are 3 error reasons to handle for 1-Click Signup: > > > | Error Reason | Description | How to Handle | > | --- | --- | --- | > | `INVALID_SESSION_KEY` | Session key (used in step 2b) is invalid | Restart SDK | > | `SESSION_TIMEOUT` | Session timed out | Restart SDK | > | `SHARE_CREDENTIALS_ERROR` | There was an error when the user tried to share [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) (identity data) | Restart SDK | > > > We recommend you handle all error reasons by restarting the SDK. To do so, create another session key (step 1) and initialize a new SDK instance (step 2). > > > **How to Handle Error Reasons Differently** > > > > > If you prefer to handle each error reason differently, you can certainly do so by leveraging the [`SdkErrorReasons` constant](https://docs.verified.inc/reference/sdk/constants.md#sdkerrorreasons): > > > > > ```typescript > switch (error.reason) { > case SdkErrorReasons.INVALID_SESSION_KEY: > // ... > case SdkErrorReasons.SESSION_TIMEOUT: > // ... > case SdkErrorReasons.SHARE_CREDENTIALS_ERROR: > // ... > } > ``` > > > > > > > ### c. Handle events. > > > > **Tip** > > > > Handling events is not necessary for the SDK to work, but it will allow you to understand how users are interacting with the SDK and optimize the experience. Complete the `handleEvent` function you defined in step 2e, leveraging the [`SdkEventValues` constant](https://docs.verified.inc/reference/sdk/constants.md#sdkeventvalues): ```typescript function handleEvent(event: SdkEvent): void { switch (event.type) { case SdkEventValues.SDK_READY: // Web app rendered the content break; case SdkEventValues.USER_STEP_CHANGE: // User navigated to a new step console.log(event.step, event.previousStep); break; case SdkEventValues.STEP_TIME_SPENT: // User left a step, includes duration console.log(event.step, event.durationMs); break; case SdkEventValues.USER_COMPLETED_PRODUCT: // User completed a product flow console.log(event.product); break; case SdkEventValues.ONE_CLICK_SIGNUP_FORM_SUBMITTED: // User submitted signup form console.log(event.form); break; // Only for 1-Click Health // case SdkEventValues.ONE_CLICK_HEALTH_FORM_SUBMITTED: // // User submitted health form // console.log(event.form); // break; // Only for 1-Click Health // case SdkEventValues.ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED: // // User submitted the health manual-input form (fullName/birthDate fallback) // console.log(event.form); // break; } } ``` There are 5 event values to handle for 1-Click Signup: | Event Value | Description | | --- | --- | | `SDK_READY` | SDK rendered content for the user | | `USER_STEP_CHANGE` | User navigated to a new step | | `STEP_TIME_SPENT` | User left a step, includes duration | | `USER_COMPLETED_PRODUCT` | User completed a product flow | | `ONE_CLICK_SIGNUP_FORM_SUBMITTED` | User submitted signup form | > **Note** > > There are 2 other event values, but these are only relevant for 1-Click Health. See the [1-Click Health SDK Integration guide](https://docs.verified.inc/1-click-health/guides/sdk-integration.md#c-handle-events) for details. --- ## Native Mobile App Integration The Verified SDK is a client side SDK that can be integrated into any application. Because it’s web based, **the SDK can be easily used within both web and native mobile apps.** > **Tip** > > **Using a single SDK across all types of apps makes it far easier to maintain.** We highly recommend you do this if you have mobile apps! The result will be unified, easy to maintain experience across all platforms. For native mobile apps, the SDK should be rendered within a [WebView](https://en.wikipedia.org/wiki/WebView). By using the right type of WebView, and by opening and closing it on appropriate triggers, the SDK can be made to feel like a seamless part of the native app. Below, we provide guidance for integration strategy and include a full example of a React Native app integration. ### Integration Strategy Implementing the Verified SDK in a native mobile app has three parts: 1. **JavaScript bridge between the WebView and application.** In the example below, it is the injected code. 2. **Message handler.** In the example below, it happens through the React Native `postMessage` method. 3. **UI handler.** In the example below, we create a `VerifiedSDK` component inside the codebase that renders a React Native WebView (from the `react-native-webview` library). ### Full Example #### Setup ```tsx import React, { useRef, useState, useEffect, forwardRef, useLayoutEffect } from 'react'; import { View, StyleSheet, ActivityIndicator, Platform, Text } from 'react-native'; import { WebView } from 'react-native-webview'; // Constants for Verified const VERIFIED_ORIGINS = { local: 'http://localhost:3070', sandbox: 'https://1-click.sandbox-verifiedinc.com', // Use Sandbox for development production: 'https://1-click.verified.inc', custom: '', // Will be overridden with customUrl }; const EVENT_SOURCE = 'Verified.Client'; const EVENT_TYPES = { VIEWPORT_READY: 'VERIFIED_CLIENT_SDK_VIEWPORT_READY', VIEWPORT_RESIZE: 'VERIFIED_CLIENT_SDK_VIEWPORT_RESIZE', USER_OPTED_OUT: 'VERIFIED_CLIENT_SDK_USER_OPTED_OUT', FORM_SUBMISSION: 'VERIFIED_CLIENT_SDK_FORM_SUBMISSION', FORM_SUBMISSION_ERROR: 'VERIFIED_CLIENT_SDK_FORM_SUBMISSION_ERROR', INVALID_SESSION_KEY: 'VERIFIED_CLIENT_SDK_INVALID_SESSION_KEY', SESSION_TIMEOUT: 'VERIFIED_CLIENT_SDK_SESSION_TIMEOUT', }; const RESULT_TYPES = { USER_SHARED_CREDENTIALS: 'USER_SHARED_CREDENTIALS', USER_OPTED_OUT: 'USER_OPTED_OUT', }; const ERROR_REASONS = { SESSION_TIMEOUT: 'SESSION_TIMEOUT', INVALID_SESSION_KEY: 'INVALID_SESSION_KEY', SHARE_CREDENTIALS_ERROR: 'SHARE_CREDENTIALS_ERROR', }; // Define the props interface interface VerifiedSdkProps { sessionKey?: string; environment?: 'local' | 'dev' | 'staging' | 'sandbox' | 'production' | 'custom'; customUrl?: string; // Add customUrl prop onResult?: (result: any) => void; onError?: (error: any) => void; style?: any; isLoading?: boolean; error?: Error | null; } // Define a default height for the container const DEFAULT_CONTAINER_HEIGHT = 326; // Minimum height as in the web SDK const VerifiedSdk = forwardRef( ( { sessionKey, environment = 'local', customUrl, onResult, onError, style, isLoading = false, error = null, }, ref ) => { // Use refs for height management to avoid re-renders const webViewContainerRef = useRef(null); const [loading, setLoading] = useState(true); // Keep initial height in state for first render, but don't update it later const [initialHeight] = useState(DEFAULT_CONTAINER_HEIGHT); // Use a ref to track current height without causing re-renders const heightRef = useRef(DEFAULT_CONTAINER_HEIGHT); // Build the URL for the Verified service let origin; // Use customUrl when environment is 'custom' or when customUrl is provided if (environment === 'custom' && customUrl) { // Strip any trailing slashes from customUrl origin = customUrl.replace(/\/$/, ''); } else { origin = VERIFIED_ORIGINS[environment] || VERIFIED_ORIGINS.production; } console.log('Environment:', environment); console.log('Origin:', origin); console.log('Custom URL:', customUrl); // Always log values for debugging purposes console.log('SessionKey available:', !!sessionKey); // Construct the URL if possible, even with incomplete data for debugging let urlString = ''; try { if (origin) { const url = new URL(`${origin}/sdk/client`); if (sessionKey) { url.searchParams.append('sessionKey', sessionKey); } else { console.log('Warning: No session key provided'); } urlString = url.toString(); console.log('SDK URL:', urlString); } else { console.log('Error: No valid origin to build URL'); } } catch (e) { console.error('Error building URL:', e); } // Log validation state if (!sessionKey || !origin) { console.log('Missing required props:', !sessionKey ? 'sessionKey' : 'valid origin'); } // This script will be injected into the WebView to handle communication const injectedJavaScript = ` (function() { // Set up message listener to communicate with React Native window.addEventListener('message', function(event) { // Validate the source if (event.data && event.data.source === '${EVENT_SOURCE}') { // Post the message back to React Native window.ReactNativeWebView.postMessage(JSON.stringify(event.data)); } }); // Notify that the script has been injected true; })(); `; // Handle messages from the WebView const handleMessage = (event: any) => { try { const message = JSON.parse(event.nativeEvent.data); if (message.source !== EVENT_SOURCE) { return; } // Handle different event types switch (message.type) { case EVENT_TYPES.USER_OPTED_OUT: onResult && onResult({ type: RESULT_TYPES.USER_OPTED_OUT }); break; case EVENT_TYPES.FORM_SUBMISSION: onResult && onResult({ type: RESULT_TYPES.USER_SHARED_CREDENTIALS, identityUuid: message.data?.identityUuid, }); break; case EVENT_TYPES.FORM_SUBMISSION_ERROR: onError && onError({ reason: ERROR_REASONS.SHARE_CREDENTIALS_ERROR }); break; case EVENT_TYPES.INVALID_SESSION_KEY: onError && onError({ reason: ERROR_REASONS.INVALID_SESSION_KEY }); break; case EVENT_TYPES.SESSION_TIMEOUT: onError && onError({ reason: ERROR_REASONS.SESSION_TIMEOUT }); break; // Handle viewport events if needed case EVENT_TYPES.VIEWPORT_READY: case EVENT_TYPES.VIEWPORT_RESIZE: console.log('Viewport event:', message.type, message.data); const newHeight = message.data?.height; if (newHeight) { onViewportResize && onViewportResize(newHeight); } break; } } catch (error) { console.error('Error parsing message from WebView:', error); } }; // Handle viewport resize messages from the WebView const onViewportResize = (height: number) => { console.log('Viewport height changed to:', height); if (height && height > 0 && webViewContainerRef.current) { // Update height ref heightRef.current = height; // Update the container style directly without re-rendering the component webViewContainerRef.current.setNativeProps({ style: { height }, }); } }; // Handle WebView load end const handleLoadEnd = () => { setLoading(false); }; // Define all hooks first, before any conditional returns // This ensures hooks are always called in the same order useEffect(() => { console.log('VerifiedSdk useEffect', sessionKey, error); if (!sessionKey || typeof sessionKey !== 'string') { console.error('Invalid session key:', sessionKey); onError && onError({ reason: ERROR_REASONS.INVALID_SESSION_KEY }); } if (error) { console.error('Error:', error); onError && onError({ reason: ERROR_REASONS.INVALID_SESSION_KEY }); } }, [sessionKey, error, onError]); // Now handle conditional rendering after all hooks are defined // Handle loading state if (isLoading) { return ( Initializing Verified SDK... ); } // Handle error state if (error) { return ( Error: {error.message} ); } // Return early if no session key is provided if ( !sessionKey || typeof sessionKey !== 'string' || sessionKey.trim() === '' || !urlString.includes('sessionKey=') ) { return ( Error: Invalid session key ); } // Set user agent based on platform const userAgent = Platform.select({ ios: 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148', android: 'Mozilla/5.0 (Linux; Android 10; Android SDK built for x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36', default: undefined, }); return ( { // Allow the initial load and same-origin navigation const requestUrl = new URL(request.url); return requestUrl.origin === origin || request.url === urlString; }} webviewDebuggingEnabled={true} /> ); } ); const styles = StyleSheet.create({ container: { width: '100%', maxWidth: 396, // Maximum width as in the web SDK alignSelf: 'center', position: 'relative', backgroundColor: 'white', borderRadius: 8, overflow: 'hidden', marginVertical: 16, }, webview: { flex: 1, backgroundColor: 'white', }, loadingContainer: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, justifyContent: 'center', alignItems: 'center', backgroundColor: 'white', zIndex: 1, }, loadingText: { marginTop: 16, fontSize: 14, color: '#666', }, errorContainer: { justifyContent: 'center', alignItems: 'center', backgroundColor: '#ffebee', }, errorText: { color: '#d32f2f', textAlign: 'center', padding: 16, fontSize: 14, }, }); export default VerifiedSdk; ``` #### Usage ```tsx import React, { useState, useEffect } from 'react'; import { StyleSheet, Alert, TouchableOpacity, ScrollView } from 'react-native'; import { ThemedText } from '@/components/ThemedText'; import { ThemedView } from '@/components/ThemedView'; import VerifiedSdk from '@/components/VerifiedSdk'; import DebugPanel from '@/components/DebugPanel'; import { useSessionKey, FeatureEnvEnum } from '@/hooks/useSessionKey'; import { VERIFIED_API_KEY } from '@env'; export default function VerifiedScreen() { // State management const [result, setResult] = useState(null); const [retryCount, setRetryCount] = useState(0); const [isRetrying, setIsRetrying] = useState(false); const [sessionStarted, setSessionStarted] = useState(false); // Debug options state const [debugOptions, setDebugOptions] = useState<{ environment: FeatureEnvEnum; phoneNumber: string; customUrl: string; }>({ environment: FeatureEnvEnum.Primary, phoneNumber: '', customUrl: 'http://core-api.dev-verifiedinc.com/', }); // API key is loaded from environment variables const apiKey = VERIFIED_API_KEY; // Use the session key hook with autoInitialize set to false const { sessionKey, sdkEnvironment, isLoading, error, refreshSessionKey, setPhoneNumber, setCustomUrl, } = useSessionKey({ apiKey, // Using API key from environment variables environment: debugOptions.environment, phoneNumber: debugOptions.phoneNumber, customUrl: debugOptions.customUrl, autoInitialize: false, }); /** * Handles the start button click from the debug panel * Sets up debug options and initiates session creation */ const handleDebugStart = (values: { environment: FeatureEnvEnum; phoneNumber: string; customUrl: string; }) => { setDebugOptions(values); setPhoneNumber(values.phoneNumber); setCustomUrl(values.customUrl); setRetryCount(0); setIsRetrying(false); setSessionStarted(true); // After setting all values, refresh the session key setTimeout(refreshSessionKey, 0); }; /** * Handles manual refresh of the session key * Resets retry count and refreshes the session */ const handleRefresh = () => { setRetryCount(0); setIsRetrying(false); refreshSessionKey(); }; useEffect(() => { console.log(`customUrl changed to: ${debugOptions.customUrl}`); }, [debugOptions.customUrl]); /** * Gets the appropriate URL for the SDK based on the environment * Maps feature environments to their corresponding SDK environments */ const getSdkUrl = () => { // Handle custom URL case if (debugOptions.environment === FeatureEnvEnum.Custom && debugOptions.customUrl) { return debugOptions.customUrl; } // For standard environments, we'll let the SDK handle the URLs // based on the environment passed to it return undefined; }; /** * Maps the FeatureEnvEnum to appropriate SDK environment string * This ensures proper mapping between our environment types and SDK's expected values */ const getProperSdkEnvironment = (): string => { switch (debugOptions.environment) { case FeatureEnvEnum.Local: return 'local'; case FeatureEnvEnum.Dev: return 'dev'; case FeatureEnvEnum.Staging: return 'staging'; case FeatureEnvEnum.Sandbox: return 'sandbox'; case FeatureEnvEnum.Production: return 'production'; case FeatureEnvEnum.Custom: return 'custom'; // Handle legacy values case FeatureEnvEnum.Primary: return 'local'; // Primary maps to local case FeatureEnvEnum.Secondary: return 'dev'; // Secondary maps to dev default: return 'local'; // Default to local } }; /** * Auto-refresh effect that handles session key refresh on error * Implements retry logic with limits and delay */ useEffect(() => { // Only attempt to retry if there's an error and we haven't exceeded retry limits if (error && retryCount < 3 && !isRetrying) { console.log(`Error detected (attempt ${retryCount + 1}/3):`, error.message); setIsRetrying(true); // Add a delay before retrying to prevent rapid consecutive calls const timer = setTimeout(() => { setRetryCount(prev => prev + 1); refreshSessionKey(); setIsRetrying(false); }, 2000); // 2 second delay return () => clearTimeout(timer); } }, [error, retryCount, refreshSessionKey, isRetrying]); /** * Handles the result returned from the Verified SDK * Processes different result types and updates UI */ const handleResult = (result: any) => { console.log('Verified result:', result); if (result.type === 'USER_SHARED_CREDENTIALS') { const message = `Credentials shared successfully!\nIdentity UUID: ${result.identityUuid}`; setResult(message); Alert.alert('Success', message); } else if (result.type === 'USER_OPTED_OUT') { const message = 'You opted out of sharing credentials'; setResult(message); Alert.alert('Opted Out', message); } }; /** * Handles errors returned from the Verified SDK * Maps error reasons to user-friendly messages */ const handleError = (error: any) => { console.error('Verified error:', error); let errorMessage = 'An unknown error occurred'; switch (error.reason) { case 'INVALID_SESSION_KEY': errorMessage = 'The session key is invalid'; break; case 'SESSION_TIMEOUT': errorMessage = 'The session timed out'; break; case 'SHARE_CREDENTIALS_ERROR': errorMessage = 'Error sharing credentials'; break; } setResult(`Error: ${errorMessage}`); Alert.alert('Error', errorMessage); }; return ( Verified 1-Click Integration This screen demonstrates the integration of Verified's 1-Click service in a React Native app. The service allows users to securely share their credentials with just one click. {/* Debug Panel */} {/* Only show status and SDK after session is started */} {sessionStarted && ( {/* Status information */} Status: {isLoading || isRetrying ? 'Initializing Verified SDK...' : error ? `Error: ${error.message} ${retryCount >= 3 ? '(Retry limit reached)' : ''}` : sessionKey ? 'Session key generated successfully' : 'Waiting for session key...'} {error && retryCount >= 3 && ( Retry )} {/* Display debug information */} Debug Information: Environment: {debugOptions.environment} {debugOptions.environment === FeatureEnvEnum.Custom && ( Custom URL: {debugOptions.customUrl} )} {debugOptions.phoneNumber && ( Phone Number: {debugOptions.phoneNumber} )} {/* Display the session key when available */} {sessionKey && ( Session Key: {sessionKey} )} {/* Verified SDK Component */} {sessionKey && ( Verified SDK: )} {result && ( Result: {result} )} )} Note: Configure your debug options and press Start Session to begin. ); } const styles = StyleSheet.create({ container: { padding: 16, }, sessionContent: { width: '100%', }, sdkWrapper: { marginBottom: 24, }, sdkTitle: { marginBottom: 8, }, title: { textAlign: 'center', marginBottom: 16, }, description: { marginBottom: 24, textAlign: 'center', }, statusContainer: { marginBottom: 24, padding: 16, backgroundColor: '#f5f5f5', borderRadius: 8, }, debugInfoContainer: { marginBottom: 24, padding: 16, backgroundColor: '#e3f2fd', borderRadius: 8, borderWidth: 1, borderColor: '#bbdefb', }, sessionKeyContainer: { marginBottom: 24, padding: 16, backgroundColor: '#e8f5e9', borderRadius: 8, borderWidth: 1, borderColor: '#c8e6c9', }, sessionKeyText: { fontFamily: 'monospace', fontSize: 14, marginTop: 8, padding: 8, backgroundColor: '#f1f8e9', borderRadius: 4, overflow: 'hidden', }, retryButton: { backgroundColor: '#2196F3', padding: 12, borderRadius: 4, alignItems: 'center', marginTop: 16, }, buttonText: { color: 'white', fontWeight: 'bold', }, verifiedContainer: { borderWidth: 1, borderColor: '#ddd', borderRadius: 8, marginBottom: 24, overflow: 'hidden', height: 350, // Set reasonable height for SDK }, resultContainer: { marginTop: 24, padding: 16, backgroundColor: '#f5f5f5', borderRadius: 8, }, note: { marginTop: 24, fontSize: 12, fontStyle: 'italic', textAlign: 'center', }, }); ``` #### Session Key Generation ```tsx import { useState, useCallback, useEffect } from 'react'; export enum FeatureEnvEnum { Local = 'local', Dev = 'dev', Staging = 'staging', Sandbox = 'sandbox', Production = 'production', Custom = 'custom', // Keep backward compatibility Primary = 'primary', Secondary = 'secondary', } const DEFAULT_API_URLS = { [FeatureEnvEnum.Local]: 'http://localhost:3010', [FeatureEnvEnum.Dev]: 'https://core-api.dev-verifiedinc.com/v2', [FeatureEnvEnum.Staging]: 'https://core-api.staging-verifiedinc.com/v2', [FeatureEnvEnum.Sandbox]: 'https://core-api.sandbox-verifiedinc.com/v2', [FeatureEnvEnum.Production]: 'https://api.verified.inc', [FeatureEnvEnum.Custom]: '', // Keep backward compatibility [FeatureEnvEnum.Primary]: 'https://core-api.dev-verifiedinc.com/v2', [FeatureEnvEnum.Secondary]: 'https://core-api.dev-verifiedinc.com/v2', }; const DEFAULT_SDK_ENVIRONMENTS = { [FeatureEnvEnum.Local]: 'local', [FeatureEnvEnum.Dev]: 'dev', [FeatureEnvEnum.Staging]: 'staging', [FeatureEnvEnum.Sandbox]: 'sandbox', [FeatureEnvEnum.Production]: 'production', [FeatureEnvEnum.Custom]: 'custom', // Keep backward compatibility [FeatureEnvEnum.Primary]: 'local', [FeatureEnvEnum.Secondary]: 'dev', }; const getBaseUrl = (environment: FeatureEnvEnum, customUrl?: string): string => { if (environment === FeatureEnvEnum.Custom && customUrl) { return customUrl; } return DEFAULT_API_URLS[environment] || DEFAULT_API_URLS[FeatureEnvEnum.Primary]; }; export async function getSessionKey( apiKey: string, environment: FeatureEnvEnum = FeatureEnvEnum.Primary, phoneNumber?: string, customUrl?: string ): Promise { const headers = { Authorization: apiKey, 'Content-Type': 'application/json', }; const payload: Record = {}; if (phoneNumber) { payload.phoneNumber = phoneNumber; } try { console.log(`Fetching session key from ${getBaseUrl(environment, customUrl)}/client/1-click`); const response = await fetch(`${getBaseUrl(environment, customUrl)}/client/1-click`, { method: 'POST', headers, body: phoneNumber ? JSON.stringify(payload) : undefined, }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const result = await response.json(); if (!result.sessionKey) { console.error('Failed to retrieve session key: ' + JSON.stringify(result)); return undefined; } return result.sessionKey; } catch (e) { console.error( `Session key request failed. Error: ${e instanceof Error ? e.message : JSON.stringify(e)}` ); return undefined; } } interface UseSessionKeyProps { apiKey?: string; environment?: FeatureEnvEnum; phoneNumber?: string; customUrl?: string; autoInitialize?: boolean; } interface UseSessionKeyResult { sessionKey: string | undefined; sdkEnvironment: string; isLoading: boolean; error: Error | null; refreshSessionKey: () => Promise; setCustomUrl: (url: string) => void; setPhoneNumber: (phone: string) => void; } export const useSessionKey = ({ apiKey, environment = FeatureEnvEnum.Primary, phoneNumber: initialPhoneNumber, customUrl: initialCustomUrl, autoInitialize = true, }: UseSessionKeyProps): UseSessionKeyResult => { const [sessionKey, setSessionKey] = useState(undefined); const [sdkEnvironment, setSdkEnvironment] = useState( DEFAULT_SDK_ENVIRONMENTS[environment] ); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [phoneNumber, setPhoneNumber] = useState(initialPhoneNumber); const [customUrl, setCustomUrl] = useState(initialCustomUrl); const refreshSessionKey = useCallback(async () => { if (!apiKey) { setError(new Error('API Key is required')); return; } setIsLoading(true); setError(null); try { const newSessionKey = await getSessionKey(apiKey, environment, phoneNumber, customUrl); if (newSessionKey) { setSessionKey(newSessionKey); const sdkEnv = environment === FeatureEnvEnum.Custom ? 'local' : DEFAULT_SDK_ENVIRONMENTS[environment]; setSdkEnvironment(sdkEnv); } else { throw new Error('Failed to generate session key'); } } catch (err) { setError(err instanceof Error ? err : new Error('Failed to generate session key')); setSessionKey(undefined); } finally { setIsLoading(false); } }, [apiKey, environment, phoneNumber, customUrl]); // Update SDK environment when environment changes useEffect(() => { const sdkEnv = environment === FeatureEnvEnum.Custom ? 'local' : DEFAULT_SDK_ENVIRONMENTS[environment]; setSdkEnvironment(sdkEnv); }, [environment]); useEffect(() => { if (apiKey && autoInitialize) { refreshSessionKey(); } }, [apiKey, refreshSessionKey, autoInitialize]); return { sessionKey, sdkEnvironment, isLoading, error, refreshSessionKey, setCustomUrl, setPhoneNumber, }; }; ``` --- ## Go Live! **When you're ready to go live, get a Production API key:** 1. Go to the **Brand Details** page for your brand in the Verified [Dashboard](https://dashboard.verified.inc/). 2. Click the **Production** tab in the upper right, and make sure your brand settings are configured as you intend them to be. 3. Copy a **Production API key** from the top of the page. > **Tip** > > You can use the **Sync from Sandbox** buttons to quickly port some setting configurations from Sandbox to Production. Note, however, that this is not possible for all settings: some need to be configured manually for Production. **Just swap Sandbox for Production:** 1. Swap your Sandbox API key for your Production API key. 2. Swap the [Sandbox base URL](https://docs.verified.inc/reference/api/environments.md#sandbox) for the [Production base URL](https://docs.verified.inc/reference/api/environments.md#production). 3. Swap `'sandbox'` for `'production'` in the `environment` attribute of the SDK instance (see step 2b). **Then you'll be live with 1-Click Signup! ✅** --- Source: https://docs.verified.inc/1-click-signup/guides/sdk-integration Section: 1-Click Signup — https://docs.verified.inc/1-click-signup.md Previous: Setup — https://docs.verified.inc/1-click-signup/guides/setup.md Next: API Integration — https://docs.verified.inc/1-click-signup/guides/api-integration.md --- # 1-Click Signup: Setup Source: https://docs.verified.inc/1-click-signup/guides/setup.md | | | | --- | --- | | Time to Complete | 15 minutes | | Skills Required | No technical skills! | > **Tip** > > **Complete this Setup guide before following the 1-Click Signup [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) or [API Integration](https://docs.verified.inc/1-click-signup/guides/api-integration.md) guide.** ## 1. Access the Dashboard. **Create or log into your Verified [Dashboard](https://dashboard.verified.inc/) account.** **How to Create a Dashboard Account** ### a. Enter your email and click the 1-Click Login button. We'll send you a verification code by email. > **Tip** > > **Use your work email.** We use AI to auto-magically set brand information based on your email domain, so you don't have to manually enter it! ### b. Complete the verification step. Click the verification button in the email or enter the verification code. We'll automatically log you in. _It's a 1-click experience, as promised!_ ### c. (optional) Set up MFA. Set up multi-factor authentication with an authenticator app. This is optional until you request approval for [Production](https://docs.verified.inc/reference/api/environments.md#production) access, at which point it's required. ### d. (if necessary) Confirm your company name. If you're creating the Dashboard account for your company, we'll ask you to confirm your company name. _If someone on your team has already created your account, you won't need to do this._ If your account doesn't have a brand yet, we'll automatically create one for you and take you to its Brand Details page. > **Why Multiple Brands?** > > Your company account can have one or more brands. Generally, you'll only need one brand, but there are some cases where it's helpful to use multiple. For example: > > > - **If you have multiple products:** If you have products that go by different names, it can be useful to create different brands to help users know which product they're using 1-Click Signup for — and to help your team track metrics specific to that product. > - **If you want to try different brand settings:** If you want to change brand settings without affecting your existing implementation (even in Sandbox), you can duplicate your brand and configure different settings on the new brand. ### e. (optional) Invite team members. Invite your team members to join your Dashboard account. ## 2. Configure brand settings. **On the Brands page, click the Create button to create a new brand, or click Brand Details to access brand settings for an existing brand.** ### Brand Name **Choose an external name for your brand.** This will be used elsewhere in the Dashboard (for example on the Metrics page) and displayed to users in the SDK (if you choose to use the SDK). The internal brand name is separate, and you can edit it at the top of the page. You can use this to label brands created for testing purposes, for example. ### 1-Click Signup Settings **Click the 1-Click Signup tab to access these settings.** #### Challenges > A **challenge** is a secondary input (alongside verified phone, which is always required) that must match the corresponding output. By default, **First Name** is set to **Always**, and **Birth Date** and **SSN4** are disabled. **Choose which challenge(s) to use:** | Option | Description | | --- | --- | | First Name | Prompt the user for their first name | | Birthday | Prompt the user for their birthday | | SSN4 | Prompt the user for their SSN4 | **For the enabled challenge(s), choose when to prompt the user for them:** | Option | Description | | --- | --- | | Always | Upfront, every time | | Only if necessary | Only if Verified can't source data based on other inputs | > **What We Recommend** > > **We recommend using a single challenge, either First Name or Birthday, and always requiring it.** > > > **Why We Recommend This** > > > > > - **One challenge is generally better than multiple:** > > - Every additional input adds friction, with the risk that we won't be able to source data for the user. > - We can successfully source data based on phone and one challenge the vast majority of the time. > - Prompting for another challenge only slightly increases the chance that we'll be able to source data for the user, and it adds substantial friction. > - **First Name is generally easiest for the user:** > > - Users are typically comfortable providing their first name. > - Most users will have an autofill option for first name from their browser or OS. > - First names are easy and fast to type. > - **Birthday is generally better than SSN4:** > > - Users are typically more comfortable providing their birthday. > - Some users will have an autofill option for birthday from their browser or OS. > - Everyone has a birthday, but not everyone has an SSN. > - **Data quality is higher with a challenge than without one:** > > - You can use 1-Click Signup without always requiring any challenge. > - If you do, we'll return data if we can source a unique user record based on phone only. > - However, for most use cases this isn't worth the slightly lower friction, because data quality is lower with phone only. **If you enable multiple challenges, drag and drop them into the order in which you want the user to be prompted for them.** Challenges set to **Always** will automatically be put before those set to **Only if necessary**. #### Manual Signup **Choose how to handle manual signup:** | Option | Description | | --- | --- | | Use Verified's Coming Soon | Use Verified to handle manual signup | | Use your own | Use your own manual signup flow | | Hide | Don’t show user manual signup button | > **Note** > > A manual signup flow begins if the user clicks the “Sign Up Manually Instead” button on the [phone screen](https://docs.verified.inc/1-click-signup/user-experience.md#phone). If you select the Hide option below, this button will be hidden. > **Tip** > > Hiding the manual signup option could reduce conversion or it could reduce fraud — it depends on your use case and implementation. #### Risk Signals > **Definition** > > [**Risk signals**](https://docs.verified.inc/reference/data/outputs.md#risk-signals) are metadata that enhance 1-Click Signup's anti-fraud capabilities. **Choose which risk signals to include in Verified's responses:** | Option | Description | | --- | --- | | On | Include risk signals | | Off Not Recommended | Don't include risk signals | > **Risk Signals Enable Multiple Addresses** > > **We can return up to 3 most recent [addresses](https://docs.verified.inc/reference/data/outputs.md#core-data) for a user,** if you have risk signals turned on. We order these addresses from most to least recent, as best as we're able to determine recency. > > > You can show the user a dropdown to select one of the addresses on the info confirmation step (see [here](https://docs.verified.inc/1-click-signup/user-experience.md#info) on the User Experience page). We highly recommend this because it helps reduce the chance the user will need to manually enter an address, reducing friction and boosting conversion. > **Danger** > > **Off** is not recommended. It will prevent us from sourcing risk signals for a user — and blocking them if the risk score is too high. It will also prevent us from returning multiple addresses for a user. #### Default Credential Requests > **Definitions** > > - A [**credential**](https://docs.verified.inc/reference/data/outputs.md#credentials) is a piece of identity data about a user (like a first name or address). > - A **credential request** is how you ask Verified for a particular credential. It encodes what type of data you're asking for, whether it's required or optional, whether multiple values should be returned, etc. See the [`CredentialRequest`](https://docs.verified.inc/reference/api/types.md#credentialrequest) type for full details. **Choose which [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) Verified should try to source about the user:** **Settings for a Credential Request** | Setting | Relevant to Integration With | Options | Default | Description | Example | | --- | --- | --- | --- | --- | --- | | Field Type | SDK and API | [Credential](https://docs.verified.inc/reference/data/outputs.md#credentials) type | - | Type of user data this field is for | Full Name | | Field Description | SDK only | Text | - | Text that appears under the field | Legal name (for Full Name field type) | | Optional or Required | SDK only | - Optional - Required if available (see note below) | Optional | Whether the field is optional or required | Optional | | Allow User Input | SDK only | - Yes - No | Yes | Whether the user is allowed data returned for the field | Yes | | Multiple Values | SDK and API | - Yes - No | - Yes for Address field type - No for all other field types | Whether the user can choose among multiple values (if they're returned) | No | > **Note** > > **Field Description,** **Optional or Required,** and **Allow User Input** are only relevant if you use our **SDK** because they affect the user interface the SDK displays. > **What Required If Available Means** > > If **Optional or Required** is set to **Required if available**: > > > - If data is returned for the field, the user is required to share it. (If **Allow User Input** is set to **Yes**, the user can edit the data.) > - If data is not returned for the field, the user can optionally share it. (If **Allow User Input** is set to **Yes**, the user can edit the data. If it's set to **No**, the field is not displayed to the user.) When you create a new brand, the Dashboard starts you off with standard credential requests to provide you with a helpful starting point: **Standard Credential Requests** | Field Type | Field Description | Optional or Required | Allow User Input | Multiple Values | | --- | --- | --- | --- | --- | | Full Name | - | Optional | Yes | No | | ↳ First Name | - | Optional | Yes | - | | ↳ Last Name | - | Optional | Yes | - | | Phone | - | Optional | Yes | No | | Address | - | Optional | Yes | Yes | | ↳ Line 1 | - | Optional | Yes | - | | ↳ Line 2 | Apt, Unit, etc. | Optional | Yes | - | | ↳ City | - | Optional | Yes | - | | ↳ State | - | Optional | Yes | - | | ↳ ZIP Code | - | Optional | Yes | - | | ↳ Country | - | Optional | Yes | - | | Birth Date | - | Optional | Yes | - | | SSN | - | Optional | Yes | - | ### Styling Settings > **Important** > > Styling settings only apply to **1-Click Signup** using the **SDK** because they affect the user interface the SDK displays. (They also apply to [**Text to Signup**](https://docs.verified.inc/text-to-signup.md).) > > > So, if you are only using **1-Click Signup** with the the **API**, you can ignore these settings. > **Verified Auto-Magically Configures Styling Settings** > > We use AI to auto-magically configure styling settings based on your email domain, so you don't have to do so manually from scratch! **Click the Styling tab to access these settings.** **Choose how to style the SDK:** | Setting | Options | Default | Description | | --- | --- | --- | --- | | Logo | Any square image (max size 200 KB, JPG or PNG) | - | Logo displayed to users | | Alignment | - Left - Center - Right - Stretch | Center | Alignment used for most text, buttons, and the powered by Verified graphic | | Font Family | Any [Google font](https://fonts.google.com/) | Lato | Font used for all elements | | 1-Click Word | - Signup - Login - Verify - Apply - Access - AutoFill | Signup | Word that appears after "1-Click" in the powered by Verified graphic | | Input Border Radius | Any number | 4 | Border radius used for all inputs | | Button Border Radius | Any number | 4 | Border radius used for all buttons | | Success Animation | - Full - None | Full | Whether to show the success animation | | Primary Color | Any hex code | #0DBC3D | Color used for primary buttons and success indicators | | Error Color | Any hex code | #EB0D28 | Color used for errors | | Muted Color | Any hex code | #BDBDBD | Color used for secondary buttons and text | | Background Color | Any hex code | #FFFFFF | Color used for background | | Graphic Color | - Green - Gray - Black - White | Green | Color of the Verified logo in the powered by Verified graphic | | Advanced Styling | Custom JSON | - | Custom JSON configuration that allows fine-grained control over any SDK component styling, using the [MUI theme system](https://mui.com/material-ui/customization/default-theme) | > **The SDK Automatically Adjusts Text Color for Contrast** > > The SDK will automaticallly adjust the color of text to achieve good contrast, given the color of an element. For example: > > > - If you set **Background Color** to be dark, the SDK will adjust text on the background to be light. > - If you set **Primary Color** to be light, the SDK will adjust text on buttons to be dark. #### Advanced Styling The sections below give examples of how you can use custom code to style the SDK in more complex ways. > **Warning** > > It's up to you to ensure that custom code you use in the Advanced Styling setting works reliably — and to adapt it as needed for future versions of the SDK. ##### Wrapper ###### Update External SDK Wrapper ```json // In some style file that applies style to the wrapper of the parent element of the SDK .sdk-iframe-container > iframe { padding: 2rem; margin: 2rem; max-width: 1000px; } ``` ##### Container ###### Change Container Padding ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"client-sdk-container\"]": { "padding": "2rem" } } } } } } ``` ##### Background ###### Make Background Transparent ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "&, & .MuiContainer-root > main > .MuiPaper-root": { "backgroundColor": "transparent" }, "& [data-testid='phone-input-container'] label.MuiFormLabel-root": { "background": "transparent" }, "& [data-testid='phone-input-container'] .MuiInputBase-root::before": { "opacity": 0 }, "& [data-testid='phone-input-container'] .MuiOutlinedInput-notchedOutline": { "border": "1px solid #ffffff", "zIndex": 0, "m": 0, "top": 0, "&::before": { "content": "none", "position": "relative", "inset": 0, "backgroundColor": "#ffffff", "zIndex": 0 }, "& legend": { "display": "block" } }, "& [data-testid='phone-input-container'] .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline": { "border": "1px solid #ffffff" }, "& [data-testid='phone-input-container'] .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline": { "border": "1px solid #ffffff" } } } } } } ``` ##### Headers ###### Change Header Font Sizes ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"header\"] h2": { "font-size": "24px" }, "[data-testid=\"header\"] #signin-instructions": { "font-size": "20px" }, "[data-testid=\"header\"] #verification-instructions *": { "font-size": "20px" }, "[data-testid=\"header\"] #form-instructions": { "font-size": "20px" }, "[data-testid=\"header\"] #birthday-form-instructions": { "font-size": "20px" }, "[data-testid=\"header\"] #ssn4-form-instructions": { "font-size": "20px" } } } } } } ``` ##### Buttons ###### Modify Confirm Button ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"confirm-button\"]": { "display": "block", "width": "100%", "box-shadow": "none !important" } } } } } } ``` ###### Modify Manual Signup Button ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"manual-signup-button\"]": { "display": "block", "width": "100%", "box-shadow": "none !important" } } } } } } ``` ###### Modify Edit Phone Button ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"edit-phone-button\"]": { "display": "block", "width": "100%", "box-shadow": "none !important" } } } } } } ``` ###### Modify Resend Code Button ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"resend-code-button\"]": { "display": "block", "width": "100%", "box-shadow": "none !important" } } } } } } ``` ###### Modify Edit Info Button ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "#credentials-region > div > button": { "display": "block", "width": "100%", "box-shadow": "none !important" } } } } } } ``` ###### Modify Open Help Modal Button ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"help-button\"]": { "display": "block", "width": "100%", "box-shadow": "none !important" } } } } } } ``` ###### Modify Close Help Modal Button ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"data-provider-dialog-close-button\"]": { "display": "block", "width": "100%", "box-shadow": "none !important" } } } } } } ``` ##### Success Animation ###### Hide Confetti ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"client-sdk-container\"] > main > div > div+div": { "display": "none" } } } } } } ``` ###### Hide Verified Checkmark ```json { "components": { "MuiCssBaseline": { "styleOverrides": { "body": { "[data-testid=\"step-success\"] > div": { "display": "none" } } } } } } ``` --- **You're done with this Setup guide! ✅** Now, follow the [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) or [API Integration](https://docs.verified.inc/1-click-signup/guides/api-integration.md) guide to integrate 1-Click Signup into your application. --- Source: https://docs.verified.inc/1-click-signup/guides/setup Section: 1-Click Signup — https://docs.verified.inc/1-click-signup.md Previous: Guides — https://docs.verified.inc/1-click-signup/guides.md Next: SDK Integration — https://docs.verified.inc/1-click-signup/guides/sdk-integration.md --- # 1-Click Signup: Test Users Source: https://docs.verified.inc/1-click-signup/test-users.md You can test 1-Click Signup with mock data in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox), using either your own phone number or our dedicated test users below. **These 1-Click Signup test users are keyed on phone number input data.** In other words, phone number is the unique, required input that distinguishes one test user from another. Other input data and output data may not vary across test users. > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. > **Don't Send Messages to Test User Phones/Emails** > > The test user phone numbers and email addresses are not valid, so sending messages to them won't work. To simulate SMS verification, for example, use the test user (static) verification codes. To test real SMS verification, use your own (real) phone number. ## How to Use Test Users ### Demo 1. Go to the [Demo](https://1-click.demo.verified.inc/). 2. Select _Mock Data (sandbox)_ and click _Start Demo_. 3. Enter the test user's phone number (varies by user). 4. Enter the test user's (static) verification code (always 111111). 5. (if prompted) Enter the test user's birth date (always 08/01/1989) and/or SSN4 (always 6789). 6. Confirm the test user's info to complete the flow. > **Tip** > > You can use a [custom demo](https://docs.verified.inc/custom-demo.md) by generating one or opening one with your brand's settings from within the Dashboard. ### SDK 1. Complete the [SDK Integration](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) guide and run the SDK. 2. Enter the test user's phone number (varies by user). 3. Enter the test user's (static) verification code (always 111111). 4. (if prompted) Enter the test user's birth date (always 08/01/1989) and/or SSN4 (always 6789). 5. Confirm the test user's info to complete the flow. ### API 1. Access the [Dashboard](https://dashboard.verified.inc/) and go the Brand Details page for your brand. 2. Copy a [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) API key for your brand. 3. Call [`POST /1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click) with the test user's phone number (varies by user). 4. (if applicable) Call [`POST /1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click) again, adding the test user's birth date (always `1989-08-01`) and/or SSN4 (always `6789`). --- ## Summary > **Important** > > See the later sections for full details on how each of these test users is designed to be used. ### Inputs | Required Inputs | Phone | Verification Code | Phone Only Error | First Name | Birth Date | SSN4 | | --- | --- | --- | --- | --- | --- | --- | | Phone | +12125550010 | 111111 | - | Richard | 1989-08-01 | 6789 | | Phone + First Name / Birth Date / SSN4 | +12125550020 | 111111 | [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) (`fullName.firstName, birthDate, ssn4`) | Richard | 1989-08-01 | 6789 | | Phone + First Name | +12125550023 | 111111 | [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) (`fullName.firstName`) | Richard | 1989-08-01 | 6789 | | Phone + Birth Date | +12125550022 | 111111 | [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) (`birthDate`) | Richard | 1989-08-01 | 6789 | | Phone + SSN4 | +12125550021 | 111111 | [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) (`ssn4`) | Richard | 1989-08-01 | 6789 | ### Outputs #### Metadata ##### Risk Signals | Score, Level, Recommendation | Phone | Verification Code | Error | Birth Date | SSN4 | | --- | --- | --- | --- | --- | --- | | 0, Low, Allow | +16565550000 | 111111 | - | 1989-08-01 | 6789 | | 301, Medium Low, Allow | +16565550301 | 111111 | - | 1989-08-01 | 6789 | | 500, Medium, Flag | +16565550500 | 111111 | - | 1989-08-01 | 6789 | | 775, Medium High, Block | +14045551775 | 111111 | [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017) | 1989-08-01 | 6789 | | 999, High, Block | +14045551799 | 111111 | [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017) | 1989-08-01 | 6789 | #### Credentials ##### Address | Credential Variations | Phone | Verification Code | Birth Date | SSN4 | | --- | --- | --- | --- | --- | | Different Values (all in US states) | +13135550000 → +13135550009 | 111111 | 1989-08-01 | 6789 | | Overseas Territory (US) | +13135550010 | 111111 | 1989-08-01 | 6789 | ##### Partial Responses | Credential Variations | Phone | Verification Code | Birth Date | SSN4 | | --- | --- | --- | --- | --- | | No Name | +13135550030 | 111111 | 1989-08-01 | 6789 | | No Address | +13135550031 | 111111 | 1989-08-01 | 6789 | | Partial Address | +13135550032 | 111111 | 1989-08-01 | 6789 | | No SSN | +13135550033 | 111111 | 1989-08-01 | 6789 | | No Birth Date | +13135550034 | 111111 | 1989-08-01 | 6789 | ##### Birth Date | Credential Variations | Phone | Verification Code | Birth Date | SSN4 | | --- | --- | --- | --- | --- | | Under 18 | 13135550100 | 111111 | 2017-01-01 | 6789 | ### Errors | Error(s) | Phone | Verification Code | Birth Date | SSN4 | | --- | --- | --- | --- | --- | | [`OCE013`](https://docs.verified.inc/reference/api/errors.md#oce013) | +14045551300 | 111111 | - | - | | [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017) | +14045551775 | 111111 | 1989-08-01 | 6789 | | [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017) | +14045551799 | 111111 | 1989-08-01 | 6789 | --- ## Success Use these test users to go through successful 1-Click Signup flows (where Verified returns [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials)). ### Phone Only For these users, only a phone number is needed to source [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials). #### Primary Test User Our primary test user is Richard Hendricks. > **Yes, You Read That Right** > > This is Richard Hendricks from the show _Silicon Valley_! 😂 ###### +12125550010 Required inputs: | | | | --- | --- | | Phone | +12125550010 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | #### Allowed Use these users to specifically test the `low` and `medium-low` risk level cases of [risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) metadata. _Compare them to the medium risk (flagged) and high risk (blocked) test users._ ###### +16565550000 Required inputs: | | | | --- | --- | | Phone | +16565550000 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | ###### +16565550301 Required inputs: | | | | --- | --- | | Phone | +16565550301 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | #### Flagged Use this user to specifically test the `medium` risk level case of [risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) metadata. _Compare it to the low risk (allowed) and high risk (blocked) test users._ ###### +16565550500 Required inputs: | | | | --- | --- | | Phone | +16565550500 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | ### Phone and Additional Info For these users, both a phone number and additional information is needed to source [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials). If you start with phone only, as we recommend, you will get the [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) error code, indicating that additional information is required. Within the error, `data.additionalInputs` specifies which additional inputs you can pass (see [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) for details). > **Tip** > > The [`OCE012`](https://docs.verified.inc/reference/api/errors.md#oce012) error code indicates that there's a mismatch for one or more of the additional inputs you provided. To trigger this error code, use any value that doesn't match the value for the test user. > > > For example, use `1979-01-01` for `birthDate` (since all test users have `1989-08-01` for `birthDate`). #### Phone and First Name / Birth Date / SSN4 For this user, both a phone number and one or more of a first name, birth date, and SSN4 is needed to source [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials). ###### +12125550020 Required inputs (one or more of first name, birth date, and SSN4): | | | | --- | --- | | Phone | +12125550020 | | Verification Code | 111111 | | Full Name | - | | ↳ First Name | Richard | | Birth Date | 1989-08-01 | | SSN4 | 6789 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Full Name | - | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | Expected error: | Error Attribute | Value | | --- | --- | | `data.errorCode` | [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) | | `data.additionalInputs` | `["fullName.firstName", "birthDate", "ssn4"]` | #### Phone and First Name For this user, both a phone number and a first name is needed to source [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials). ###### +12125550023 Required inputs: | | | | --- | --- | | Phone | +12125550023 | | Verification Code | 111111 | | Full Name | - | | ↳ First Name | Richard | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | Expected error: | Error Attribute | Value | | --- | --- | | `data.errorCode` | [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) | | `data.additionalInputs` | `["fullName.firstName"]` | #### Phone and Birth Date For this user, both a phone number and a birth date is needed to source [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials). ###### +12125550022 Required inputs: | | | | --- | --- | | Phone | +12125550022 | | Verification Code | 111111 | | Birth Date | 1989-08-01 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | Expected error: | Error Attribute | Value | | --- | --- | | `data.errorCode` | [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) | | `data.additionalInputs` | `["birthDate"]` | #### Phone and SSN4 For this user, both a phone number and an SSN4 is needed to source [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials). ###### +12125550021 Required inputs: | | | | --- | --- | | Phone | +12125550021 | | Verification Code | 111111 | | SSN4 | 6789 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | Expected error: | Error Attribute | Value | | --- | --- | | `data.errorCode` | [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011) | | `data.additionalInputs` | `["ssn4"]` | ### Credential Cases Use these test users test specific cases of [credential](https://docs.verified.inc/reference/data/outputs.md#credentials) data, if they're relevant to your use case. #### Address ##### Different Values For each of these 10 test users, you will get a [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) with a different address. Each address is a standard address in a US state (as opposed to an address in an overseas territory). ###### +13135550000 Required inputs: | | | | --- | --- | | Phone | +13135550000 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | ###### +13135550001 Required inputs: | | | | --- | --- | | Phone | +13135550001 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 811 Sycamore St | | ↳ City | Burlington | | ↳ State | IA | | ↳ ZIP Code | 52601 | | ↳ Country | US | ###### +13135550002 Required inputs: | | | | --- | --- | | Phone | +13135550002 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 3742 Horseshoe Mesa St | | ↳ City | Las Vegas | | ↳ State | NV | | ↳ ZIP Code | 89147 | | ↳ Country | US | ###### +13135550003 Required inputs: | | | | --- | --- | | Phone | +13135550003 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 4209 Englewood Blvd | | ↳ City | Johnson City | | ↳ State | TN | | ↳ ZIP Code | 37601 | | ↳ Country | US | ###### +13135550004 Required inputs: | | | | --- | --- | | Phone | +13135550004 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 3921 Dacotah View Ct | | ↳ City | Grand Forks | | ↳ State | ND | | ↳ ZIP Code | 58201 | | ↳ Country | US | ###### +13135550005 Required inputs: | | | | --- | --- | | Phone | +13135550005 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 852 Marschall Rd | | ↳ City | Shakopee | | ↳ State | MN | | ↳ ZIP Code | 55379 | | ↳ Country | US | ###### +13135550006 Required inputs: | | | | --- | --- | | Phone | +13135550006 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 456 Acorn St | | ↳ City | Slidell | | ↳ State | LA | | ↳ ZIP Code | 70458 | | ↳ Country | US | ###### +13135550007 Required inputs: | | | | --- | --- | | Phone | +13135550007 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 1111 W Touhy Ave | | ↳ City | Des Plaines | | ↳ State | IL | | ↳ ZIP Code | 60018 | | ↳ Country | US | ###### +13135550008 Required inputs: | | | | --- | --- | | Phone | +13135550008 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 12413 Lampton Ln | | ↳ City | Fort Washington | | ↳ State | MD | | ↳ ZIP Code | 20744 | | ↳ Country | US | ###### +13135550009 Required inputs: | | | | --- | --- | | Phone | +13135550009 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 7801 SW Blue Jay Ln | | ↳ City | Bentonville | | ↳ State | AR | | ↳ ZIP Code | 72712 | | ↳ Country | US | ##### Overseas Territory For this test user, you will get a [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) with an address in Puerto Rico (a US overseas territory). ###### +13135550010 Required inputs: | | | | --- | --- | | Phone | +13135550010 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 3167 Av Roosevelt | | ↳ City | Ponce | | ↳ State | PR | | ↳ ZIP Code | 00717 | | ↳ Country | US | **1ClickEntity** ```typescript { "identifiers": { "phone": "+13135550010" } "credentials": { ... "address": { "line1": "3167 Av Roosevelt", "city": "Ponce", "state": "PR", "zipCode": "00717", "country": "US" }, ... }, ... } ``` #### Partial Responses For each of these test users, you will get a [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) with some [core data](https://docs.verified.inc/reference/data/outputs.md#core-data) credentials missing. > **Important** > > **Most [core data](https://docs.verified.inc/reference/data/outputs.md#core-data) credentials are returned in an all or nothing way,** meaning partial responses are uncommon. The one exception is the Sex credential, for which coverage is a bit lower than the other credentials. See [Core Data](https://docs.verified.inc/reference/data/outputs.md#core-data) for details. ##### No Name ###### +13135550030 Required inputs: | | | | --- | --- | | Phone | +13135550030 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | ##### No Address ###### +13135550031 Required inputs: | | | | --- | --- | | Phone | +13135550031 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | ##### Partial Address ###### +13135550032 Required inputs: | | | | --- | --- | | Phone | +13135550032 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | ##### No SSN ###### +13135550033 Required inputs: | | | | --- | --- | | Phone | +13135550033 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | ##### No Birth Date ###### +13135550034 Required inputs: | | | | --- | --- | | Phone | +13135550034 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | ###### +13135550100 Required inputs: | | | | --- | --- | | Phone | +13135550100 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 2017-01-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | **1ClickEntity** ```typescript { "identifiers": { "phone": "+13135550100" } "credentials": { ... "birthDate": "2017-01-01", ... }, ... } ``` ## Failure Use these test users to go through unsuccessful 1-Click Signup flows (where Verified does _not_ return [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials)). ### No Credentials Found For this test user, you will get the [`OCE013`](https://docs.verified.inc/reference/api/errors.md#oce013) error code, indicating that Verified found no credentials. ###### +14045551300 Required inputs: | | | | --- | --- | | Phone | +14045551300 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | Expected error: | Error Attribute | Value | | --- | --- | | `data.errorCode` | [`OCE013`](https://docs.verified.inc/reference/api/errors.md#oce013) | ### Blocked Use these users to specifically test the `medium-high` and `high` risk level cases of [risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) metadata. _Compare them to the low risk (allowed) and medium risk (flagged) test users._ For these users, you will get the [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017) error code, indicating that Verified blocked returning data for the user because the risk levels are `medium-high` and `high`. ###### +14045551775 Required inputs: | | | | --- | --- | | Phone | +14045551775 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | ###### +14045551799 Required inputs: | | | | --- | --- | | Phone | +14045551799 | | Verification Code | 111111 | **Optional inputs:** | | | | --- | --- | | Email | richard@piedpiper.net | | Birth Date | 1989-08-01 | | SSN4 | 6789 | | Full Name | - | | ↳ First Name | Richard | | ↳ Middle Name | Harrison | | ↳ Last Name | Hendricks | | Address | - | | ↳ Line 1 | 5320 Newell Rd | | ↳ City | Palo Alto | | ↳ State | CA | | ↳ ZIP Code | 94303 | | ↳ Country | US | Expected error: | Error Attribute | Value | | --- | --- | | `data.errorCode` | [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017) | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | --- Source: https://docs.verified.inc/1-click-signup/test-users Section: 1-Click Signup — https://docs.verified.inc/1-click-signup.md Previous: User Experience — https://docs.verified.inc/1-click-signup/user-experience.md Next: Guides — https://docs.verified.inc/1-click-signup/guides.md --- # 1-Click Signup: User Experience Source: https://docs.verified.inc/1-click-signup/user-experience.md At Verified, _signup is what we do._ We are experts in how to optimize onboarding flows to maximize conversion and give users the best possible experience. We've helped our customers onboard — and delight! — millions of new users. The user experience described in this guide is the result of countless hours of research, design, testing, and iteration by our team. > **Use Our SDK to Get This UX** > > **Our SDK implements this user experience, and we strongly recommend you use it.** If you instead choose to use our **API**, we recommend you implement a user experience similar to this one. Full details are below, but the basic user experience is: 1. **Enter and verify phone number** 2. (if necessary) **Enter challenge** (first name, birthday, or SSN4) 3. **Confirm autofilled info** > **There Are Only a Few Screens!** > > This user experience may look complicated, and in some ways it is: achieving world class UX requires getting many small details right. But at its core, it's simple by design and takes only a few screens. Users complete 1-Click Signup in less than 10 seconds: try it yourself with a [custom demo](https://docs.verified.inc/custom-demo.md). ## Flow Chart ![1-Click Signup flow chart](https://docs.verified.inc/assets/images/ux-flow-chart-1-click-signup-2a07f3365b19aafa6bfd8c83569d3463.png) ↗️ [Open in new tab](https://docs.verified.inc/assets/files/ux-flow-chart-1-click-signup-2a07f3365b19aafa6bfd8c83569d3463.png) (for easy zooming) > **Important** > > To implement this user experience yourself (which is only necessary if you choose the **API** [integration type](https://docs.verified.inc/1-click-signup/guides/setup.md#integration-type)), without our SDK, you need to handle each action labeled Verified. ## Screens and Components ### Phone #### Header > Enter Your Phone Number #### Consent Language > By entering your phone number, you agree that [Verified](https://verified.inc/) (`{Brand Name}`'s service provider) and its vendors may receive your personal info and autofill more info about you, including your social security number. If your [credential requests](https://docs.verified.inc/1-click-signup/guides/setup.md#default-credential-requests) do not include SSN, "including your social security number" will be omitted. - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - “Verified”: - Hyperlinked to [https://verified.inc](https://verified.inc/) - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - Underlined - `{Brand Name}`: replaced with your brand name #### Phone > +1 (_ _ _) _ _ _ - _ _ _ _ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) and [error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) colors - Auto focused - Opens numeric keyboard - Accepts only digits - Accepts OS autofill - Validates US phone number - Auto formats to +1 (NNN) NNN-NNNN (most common US format) - Auto submits on 10 digits #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Opt Out > Sign Up Manually Instead _Takes user to Info screen in manual signup (edit) state._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Error > That phone number is invalid. Please try again. _Appears when phone number is invalid._ - [Error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color ![Phone number screen, starting state](https://docs.verified.inc/assets/images/phone-empty-f0c021f1993c18df1f4644b8aac0cf70.png) _Starting State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/phone-empty-f0c021f1993c18df1f4644b8aac0cf70.png) ![Phone number screen, error state](https://docs.verified.inc/assets/images/phone-error-d6141c0a44140a6d67d12d2008f728f9.png) _Error State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/phone-error-d6141c0a44140a6d67d12d2008f728f9.png) --- ### Verification Code #### Header > Verify Your Phone Number #### Description > Enter the verification code we texted to > **`{phone}`**. - New line before `{phone}` - Bold `{phone}` #### Verification Code - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) and [error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) colors - Auto focused - 6 separate boxes - En dash (–) in between first and last 3 boxes, to indicate hypen in verification code sent by SMS, which is included for readability: > 123-456 - Opens numeric keyboard - Accepts only digits - Accepts OS autofill - Auto submits on 6 digits #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Edit > Edit Phone _Takes user back to phone input._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Resend > Resend Code _Sends another SMS with fresh verification code._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - Allows for at most 2 resends #### Error > That code didn’t match. Please try again. _Appears when verification code is invalid or expired._ - [Error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Code Resent > We sent you a new verification code. _Appears when user clicks resend button._ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color --- ![Verification code screen, starting state](https://docs.verified.inc/assets/images/verification_code-empty-1f785f039152206785411077cae6c2df.png) _Starting State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/verification_code-empty-1f785f039152206785411077cae6c2df.png) ![Verification code screen, error state](https://docs.verified.inc/assets/images/verification_code-error-7251c21c740edd578f7c81e56ed04c53.png) _Error State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/verification_code-error-7251c21c740edd578f7c81e56ed04c53.png) ![Verification code screen, resent code state](https://docs.verified.inc/assets/images/verification_code-resent-892755722d66a9b5cfbf6ee1f828293b.png) _Resent Code State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/verification_code-resent-892755722d66a9b5cfbf6ee1f828293b.png) --- ### First Name #### Header > Enter Your First Name #### Description > Enter your first name, so we can verify you and autofill your info. #### First Name - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) and [error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) colors - Auto focused - Helper: > Legal first name (if important for your use case) - Accepts OS autofill - Submits on arrow button click or enter #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Error > That didn’t match our records. Please try again. _Appears when there's a [first name mismatch error](https://docs.verified.inc/reference/api/errors.md#oce012) (`OCE012`)._ - [Error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Continue > Continue Anyway _Appears if either of the following conditions are met:_ _1. There have been 3 seconds of inaction (after error). 2. The user tried a different value than the first value (and also got an error)._ _Takes user to manual signup._ If the user tries the same value again, auto continue them. - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color --- ![First name screen, starting state](https://docs.verified.inc/assets/images/firstname-empty-618bbadc50c1113ee0718688a0a324bd.png) _Starting State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/firstname-empty-618bbadc50c1113ee0718688a0a324bd.png) ![First name screen, error state](https://docs.verified.inc/assets/images/firstname-error-8cb0538a6ad1c502734f1120e7dfbc8f.png) _Error State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/firstname-error-8cb0538a6ad1c502734f1120e7dfbc8f.png) --- ### Birthday #### Header > Enter Your Birthday #### Description > Enter your real birthday, so we can verify you and autofill your info. #### Birthday > _ _ / _ _ / _ _ _ _ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) and [error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) colors - “Birthday” not “Birth Date” because the former is friendlier - Auto focused - Helper: > MM/DD/YYYY - Calendar icon on right opens date picker (which defaults to 08/01/1989) - Opens numeric keyboard - Accepts only digits - Accepts OS autofill - Validates format - Auto formats to MM/DD/YYYY (most common US format) - Auto submits on 8 digits #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Error > That didn’t match our records. Please try again. _Appears when there's a [birthday mismatch error](https://docs.verified.inc/reference/api/errors.md#oce012) (`OCE012`)._ - [Error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Continue > Continue Anyway _Appears if either of the following conditions are met:_ _1. There have been 3 seconds of inaction (after error). 2. The user tried a different value than the first value (and also got an error)._ _Takes user to manual signup._ If the user tries the same value again, auto continue them. - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color --- ![Birthday screen, starting state](https://docs.verified.inc/assets/images/birthday-empty-0d0596730c1ee361bf354f781e366b0b.png) _Starting State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/birthday-empty-0d0596730c1ee361bf354f781e366b0b.png) ![Birthday screen, error state](https://docs.verified.inc/assets/images/birthday-error-e91910d9677cd1ea4e34b2c234235adf.png) _Error State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/birthday-error-e91910d9677cd1ea4e34b2c234235adf.png) --- ### SSN4 #### Header > Enter the Last 4 of Your SSN #### Description > Enter the last 4 digits of your Social Security Number, so we can verify you and autofill your info. #### SSN4 > _ _ _ _ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) and [error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) colors - Auto focused - Helper: > Last 4 digits of your Social Security Number - Opens numeric keyboard - Accepts only digits - Validates format - Auto submits on 4 digits - Auto focused #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Error > That didn’t match our records. Please try again. _Appears when there's a [SSN4 mismatch error](https://docs.verified.inc/reference/api/errors.md#oce012) (`OCE012`)._ - [Error](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Continue > Continue Anyway _Appears if either of the following conditions are met:_ _1. There have been 3 seconds of inaction (after error). 2. The user tried a different value than the first value (and also got an error)._ _Takes user to manual signup._ If the user tries the same value again, auto continue them. - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color --- ![SSN4 screen, starting state](https://docs.verified.inc/assets/images/ssn4-empty-8d1fa85e9e519289f2350cbdb156792f.png) _Starting State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/ssn4-empty-8d1fa85e9e519289f2350cbdb156792f.png) ![SSN4 screen, error state](https://docs.verified.inc/assets/images/ssn4-error-f237b8fa15986d3cede3dc81fc68acd4.png) _Error State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/ssn4-error-f237b8fa15986d3cede3dc81fc68acd4.png) --- ### Info #### Open Modal > ? _Opens informational modal._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Close Modal > X _Closes informational modal._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color - Clicking anywhere outside the modal should also close it #### Informational > Verified autofills your info from trusted sources so you don’t have to enter it manually. It’s fast, safe, and secure. - Graphic - Lock icon with: > Protected with bank level encryption #### Header > Confirm Your Info #### Description > Make sure everything is accurate. #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### First Name > First Name _Appears in view state._ #### Last Name > Last Name _Appears in view state._ #### Address > Address _Appears in view state._ Two lines: 1. `{Address Line 1}, {Address Line 2}` 2. `{City}, {State} {ZIP Code}` If multiple values are available: - Dropdown If only one value is available: - Static text #### Birthday > Birthday _Appears in view state._ - “Birthday” not “Birth Date” because the former is friendlier - Year digits masked (server side), unless user entered these as input #### SSN > SSN _Appears in view state._ - “SSN” not “Social Security Number” for compactness - First 5 digits masked (server side) #### Edit > Edit _Switches from view to edit state._ The entire data display area should be clickable as the Edit button, not just the button itself. - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### First Name _Appears in edit state._ - Clear ("X") button on right side that appears if there's any value #### Last Name _Appears in edit state._ - Clear ("X") button on right side that appears if there's any value #### Address _Appears in edit state._ - Uses value selected in dropdown (from view state), if multiple values are available - Has clear ("X") button on right side that appears if there's any value - Uses third party service (e.g. [Google Places API](https://developers.google.com/maps/documentation/places/web-service/overview)) to show autofill options when the user types - Expands to show full value (without Address Line 2), in two lines: 1. `{Address Line 1}, {Address Line 2}` 2. `{City}, {State} {ZIP Code}` #### Line 2 - Has value `{Address Line 2}` if it exists - Helper: > Apt, Unit, etc. #### Birthday > _ _ / _ _ / _ _ _ _ - “Birthday” not “Birth Date” because the former is friendlier - Helper: > MM/DD/YYYY - Calendar icon on right opens date picker (which defaults to 08/01/1989) - Opens numeric keyboard - Accepts only digits - Accepts OS autofill - Validates format - Auto formats to MM/DD/YYYY (most common US format) - If starting with value: - If user starts to edit (by deleting one character), clear entire value #### Social Security Number > _ _ _ - _ _ - _ _ _ _ - “Social Security Number” not “SSN” (unlike view state — see above) for clarity - Opens numeric keyboard - Accepts only digits - Validates format - Auto formats to •••-••-NNNN (most common US format) - Masks first 5 digits, server side not client side - If starting with value: - If user starts to edit (by deleting one character), clear entire value #### Accuracy Confirmation > By clicking “Confirm”, you agree that the info above is accurate. - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Confirm > Confirm _Submits form with user's info._ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color --- ![Confirm info screen, view state](https://docs.verified.inc/assets/images/info-view-tooltip_hidden-7440904122fa3b524fe907f4434a8b56.png) _View State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/info-view-tooltip_hidden-7440904122fa3b524fe907f4434a8b56.png) ![Confirm info screen with the informational modal open](https://docs.verified.inc/assets/images/info-view-tooltip_visible-60412d0f6bb30ae8f780fdccf55c7a64.png) _Modal State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/info-view-tooltip_visible-60412d0f6bb30ae8f780fdccf55c7a64.png) ![Confirm info screen, edit state](https://docs.verified.inc/assets/images/info-edit-0dae3b64802e4831e5adcf8f0dc5f5a9.png) _Edit State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/info-edit-0dae3b64802e4831e5adcf8f0dc5f5a9.png) --- Source: https://docs.verified.inc/1-click-signup/user-experience Section: 1-Click Signup — https://docs.verified.inc/1-click-signup.md Previous: Overview — https://docs.verified.inc/1-click-signup/overview.md Next: Test Users — https://docs.verified.inc/1-click-signup/test-users.md --- # 1-Click Health: Overview Source: https://docs.verified.inc/1-click-health/overview.md | | | | --- | --- | | Speed | <30 seconds to complete 1-Click Health | | Benefits | - Increase conversion - Delight users - Prevent fraud | | Coverage | ~80% of US adults (>216M people) | | Integration Time | Depends on integration type: - <1 day for [**SDK**](https://docs.verified.inc/1-click-health/guides/sdk-integration.md) - 1-2 weeks for [**API**](https://docs.verified.inc/1-click-health/guides/api-integration.md) | ## About 1-Click Health **1-Click Health is the _easiest_ way to get a user's health insurance and eligibility.** From just name and birthday, Verified autofills a user's member ID, payer, and full eligibility details, so the user can onboard with insurance in less than 30 seconds. > **Privacy First** > > **A user's data is never shared without their consent.** We are committed to putting people in control of their own data. We are SOC 2 Type II certified and compliant with major regulatory frameworks like HIPAA, CCPA, and GDPR. For more information, please see [How We Operate](https://verified.inc/how-we-operate). > > ## Benefits - **Increase conversion:** Dramatically reduce friction, making it as easy as possible for new users to share their insurance data. - **Delight users:** Avoid aggravating users by asking them to type in their payer, member ID, and more. Given them a magical first experience with your brand. - **Prevent fraud:** Stop bad actors by autofilling insurance data and using our [risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) metadata. ## Coverage We can source verified health insurance data for about **80% of US adults (226M people).** The data is extremely high quality because we waterfall across a number of data provider partners like clearing houses. > **US Only (for now)** > > **We currently only cover people in the United States.** But we're soon adding new geographies. If there are particular geographies that'd be most helpful for our use case, please let us know by emailing [Support@Verified.inc](mailto:Support@Verified.inc), and we'll prioritize accordingly. ## Integration Integrating 1-Click Health is simple. How long it takes depends on the integration type you choose: - <1 day for [**SDK**](https://docs.verified.inc/1-click-health/guides/sdk-integration.md) - 1-2 weeks for [**API**](https://docs.verified.inc/1-click-health/guides/api-integration.md) To integrate, first follow the [Setup](https://docs.verified.inc/1-click-health/guides/setup.md) guide and then either the [SDK Integration](https://docs.verified.inc/1-click-health/guides/sdk-integration.md) or [API Integration](https://docs.verified.inc/1-click-health/guides/api-integration.md) guide. --- Source: https://docs.verified.inc/1-click-health/overview Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Next: User Experience — https://docs.verified.inc/1-click-health/user-experience.md --- # 1-Click Health Source: https://docs.verified.inc/1-click-health.md - [Overview](https://docs.verified.inc/1-click-health/overview.md): Overview of 1-Click Health - [User Experience](https://docs.verified.inc/1-click-health/user-experience.md): User Experience for 1-Click Health - [Test Users](https://docs.verified.inc/1-click-health/test-users.md): Test Users for 1-Click Health - [Guides](https://docs.verified.inc/1-click-health/guides.md): 4 items - [Supported Payers](https://docs.verified.inc/1-click-health/supported-payers.md): Supported payers for 1-Click Health --- Source: https://docs.verified.inc/1-click-health Previous: API Integration — https://docs.verified.inc/1-click-signup/guides/api-integration.md Next: Overview — https://docs.verified.inc/1-click-health/overview.md --- # 1-Click Health: Guides Source: https://docs.verified.inc/1-click-health/guides.md - [Setup](https://docs.verified.inc/1-click-health/guides/setup.md): How to get setup to integrate 1-Click Health - [SDK Integration](https://docs.verified.inc/1-click-health/guides/sdk-integration.md): Full details on how to integrate 1-Click Health with our SDK - [API Integration](https://docs.verified.inc/1-click-health/guides/api-integration.md): Full details on how to integrate 1-Click Health with our API - [Payer Enrollments](https://docs.verified.inc/1-click-health/guides/payer-enrollments.md): How to enroll with payers that require steps Verified can't handle for you --- Source: https://docs.verified.inc/1-click-health/guides Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Previous: Test Users — https://docs.verified.inc/1-click-health/test-users.md Next: Setup — https://docs.verified.inc/1-click-health/guides/setup.md --- # 1-Click Health: API Integration Source: https://docs.verified.inc/1-click-health/guides/api-integration.md | | | | --- | --- | | Time to Complete | 1-2 days | | Time to Test and Deploy | 1-1.5 weeks | | Skills Required | Make API calls, build UX | > **Tip** > > **Complete the 1-Click Health [Setup](https://docs.verified.inc/1-click-health/guides/setup.md) guide before following this API Integration guide.** > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. ```mermaid sequenceDiagram actor U as User participant C as Customer participant V as Verified Note left of U: 1. Collect inputs. alt 1-Click Signup Note over U, V: See 1-Click Signup else Manual Signup C ->>+ U: Show input fields U ->>- C: Enter inputs end Note left of U: 2. Call POST /1-click/health. C ->> V: Call POST /1-click/health V ->> V: Source outputs for 1ClickHealthEntity Note left of U: 3. Receive outputs. alt Webhook V ->> C: Send 1ClickHealthEntity via webhook else No Webhook C ->>+ V: Call GET /1-click/health (repeatedly) V ->>- C: Return 1ClickHealthEntity end Note left of U: 4. Prompt user to confirm. alt Success C ->> C: See 1ClickHealthEntity contains results C ->>+ U: Display Member ID and Payer Name U ->>- C: Confirm Member ID and Payer Name else Failure C ->> C: See 1ClickHealthEntity contains errors C ->>+U: Take user to manual flow end ``` To onboard a user for healthcare, you typically need to do the following: 1. **Collect the user's PII** (Name, Birthday, Address, Sex, etc.). 2. **Collect the user's health insurance** (Payer and Member ID). 3. **Run an eligibility check for the user's health insurance** (to see what the insurance covers). [1-Click Signup](https://docs.verified.inc/1-click-signup.md) solves (1) by letting you autofill the user's PII, and 1-Click Health solves (2) and (3) by letting you autofill the user's health insurance and run an eligibility check for that insurance. 1-Click Health has two core capabilities: - **Insurance Autofill:** Autofill a user's insurance information. - **Eligibility Check:** Run an eligibility check for a user's insurance. We often refer to these simply as **autofill** and **check:** | Capability | Description | Inputs | Outputs | | --- | --- | --- | --- | | Autofill | Autofill a user's insurance information | - PII - (optional) Payer | - Payer - Member ID | | Check | Run an eligibility check for a user's insurance | - PII - Payer - Member ID | - Payer - Member ID - EDI 271 (raw and parsed) | | Autofill + Check | Autofill a user's insurance information and automatically run an eligibility check for it | - PII - (optional) Payer | - Payer - Member ID - EDI 271 (raw and parsed) | > **Note** > > **You can use autofill with or without specifying a payer (or payer group).** Specifying a payer can be helpful if, for example, you want to autofill insurance just from Medicare or "the Blues" (Blue Cross Blue Shield affiliated payers), for which we have specific payer groups. > **Tip** > > **You can use either _or both_ of autofill and check with a single API call:** see step 2 for details. They're automatically combined if the [**Check After Autofill**](https://docs.verified.inc/1-click-health/guides/setup.md#check-after-autofill) setting is set to **On** in the [Dashboard](https://dashboard.verified.inc/) or if the `checkAfterAutofill` field in the request body of [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth) is set to `true`. ## 1. Collect inputs. To start 1-Click Health for a user, you'll need to collect [input](https://docs.verified.inc/reference/data/inputs.md#1-click-health) user data: see [1-Click Health Inputs](https://docs.verified.inc/reference/data/inputs.md#1-click-health) for details. Only First Name, Last Name, and Birth Date are required, but the more inputs you provide, the higher coverage and accuracy will be. Because 1-Click Health is billed per attempt (not just per success), it's well worth collecting more inputs upfront. > **Tip** > > **We strongly recommend using [1-Click Signup](https://docs.verified.inc/1-click-signup.md) to collect these inputs!** With 1-Click Signup, you can collect _all_ of these inputs in less than 10 seconds, from as little as a user's phone number. **You'll also need to:** 1. **Include Verified consent language.** 2. **Include a "Powered by Verified" graphic.** If you use 1-Click Signup to collect the inputs, you can put the consent language and graphic on a screen in that flow (for example the [Phone](https://docs.verified.inc/1-click-signup/user-experience.md#phone) screen): see the first example below. If you instead ask the user to manually enter the inputs, you can put them on that screen: see the second and third examples below. _We recommend that you use a single screen with fields for each input you want to collect: see the [Info](https://docs.verified.inc/1-click-health/user-experience.md#info) screen of our User Experience guide for full details._ Here are examples: _Verified consent language (the health insurance variant) on the first screen of 1-Click Signup_ _1-Click Signup can autofill all inputs for 1-Click Health!_ _Verified consent language (the health insurance variant) on a manual entry screen, with minimal inputs_ _Verified consent language (the health insurance variant) on a manual entry screen, with maximal inputs_ #### a. Include the Verified consent language. Regulations require that users give informed consent, so you must use our consent language before you start the 1-Click Health flow. It can be included alongside or as part of other legal language you already use, but it must be displayed to the user — not just included in terms you link out to. **You must use this 1-Click Health consent language:** > By `{taking this action}`, you agree that `{Brand Name}`’s service provider [Verified](https://verified.inc/) and its vendors may receive your personal info and provide `{Brand Name}` with more info about you, including your health insurance. - **Replace `{taking this action}` with the action the user will take to start 1-Click Health.** For example: - If you start with 1-Click Signup, using a form with a phone number input that autosubmits (which [we recommend](https://docs.verified.inc/1-click-signup/user-experience.md#phone)), you should use "entering your phone number". - If you use a Continue button, you should use "clicking ‘Continue’". - **Link "Verified" to [https://verified.inc](https://verified.inc/) and make it underlined and a different color than the rest of the text** (so the user knows it's a link). - **Replace `{Brand Name}` with your brand name.** Here's an example: > By entering your phone number, you agree that Hooli’s service provider [Verified](https://verified.inc/) and its vendors may receive your personal info and provide to Hooli more info about you, including your health insurance. > **Modify Consent Language if Collecting SSNs** > > **If you use 1-Click Signup to autofill SSNs as an input for 1-Click Health, you need to have "including my social security number" in the consent language,** as described [here](https://docs.verified.inc/1-click-signup/guides/api-integration.md#consent) in the 1-Click Signup API Integration guide. In this case, the consent language should be: > > > > By `{taking this action}`, you agree that `{Brand Name}`’s service provider [Verified](https://verified.inc/) and its vendors may receive your personal info and provide `{Brand Name}` with more info about you, including your social security number and health insurance. > > > So, for example: > > > > By entering your phone number, you agree that Hooli’s service provider [Verified](https://verified.inc/) and its vendors may receive your personal info and provide to Hooli more info about you, including your social security number and health insurance. #### b. Include a "Powered by Verified" graphic. We require you to include a "Powered by Verified" graphic, which helps ensure the user gives legally valid consent for us to source data for them. The graphic should be placed alongside the consent language. We provide many different variants of the graphic, so you can choose the one that best fits your use case and the background color of your application: _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ ## 2. Call `POST /1-click/health`. Call [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth) with different inputs depending on the capability you want to leverage: - **Insurance Autofill:** Include user PII (and optionally payer). - **Eligibility Check:** Include user PII, payer, and member ID. You can automatically combine these by setting [**Check After Autofill**](https://docs.verified.inc/1-click-health/guides/setup.md#check-after-autofill) to **On** in the [Dashboard](https://dashboard.verified.inc/) or by setting `checkAfterAutofill` to `true` in the request body. > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). > **1-Click Health is Asynchronous** > > **1-Click Health is _asynchronous_,** because it can take awhile to search for a user's health insurance plans across the large number of possible payers. **Response times can be as short as 3 seconds or as long as 30+ seconds.** Health results arrive via webhook or by polling `GET /1-click/health`, not in the response body of `POST /1-click/health`. The POST response includes `healthDataUuid` and, when supplied, `externalReference`. See step 3 for details. > > > This is in contrast to 1-Click Signup, which is _synchronous_ and almost always has response times under 1 second. You receive data directly in the response body of `POST /1-click`, though you can also receive it via webhook or by polling `GET /1-click`. ### Insurance Autofill To autofill insurance, call [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth) with **PII (and optionally payer):** #### Without Payer Autofilling insurance without specifying a payer is the most common use case. **From 1-Click Signup** If you used [1-Click Signup](https://docs.verified.inc/1-click-signup.md) to autofill inputs, you should include `identityUuid` as an input with the value of `uuid` from the [response body of `POST /1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-response) (which you call for 1-Click Signup): **Example: Autofill, Inputs from 1-Click Signup, Without User Edits** ```typescript { // "externalReference": "appointment-1045" // optional: your own reference string, to be included in responses "identityUuid": "f90b96d9-9d64-4675-8855-9ee1e188a38a" // from 1-Click Signup response body // No other PII inputs implies user didn't edit 1-Click Signup data } ``` If the user didn't edit any of the data autofilled by 1-Click Signup, you can include _only_ the `identityUuid`, and 1-Click Health will hydrate all of the relevant 1-Click Signup outputs as inputs. If the user edited some of the data autofilled by 1-Click Signup, you should include the edited fields alongside the `identityUuid`, and 1-Click Health will hydrate the _rest_ of the 1-Click Signup outputs as inputs: **Example: Autofill, Inputs from 1-Click Signup, With User Edits** ```typescript { // "externalReference": "appointment-1044" // optional: your own reference string, to be included in responses "identityUuid": "f90b96d9-9d64-4675-8855-9ee1e188a38a", // from 1-Click Signup response body // Other inputs included are for 1-Click Signup data that user edited "address": { // Full address must be included for clarity, even if only one part was edited "line1": "5320 Newell Rd", "line2": "#1", // from user edit "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" } // All other PII inputs can optionally be included for clarity } ``` **From Manual Signup** If the user manually entered inputs, you should include them directly in the request body: **Example: Autofill, Inputs from Manual Signup, Minimal Inputs** ```typescript { // "externalReference": "appointment-1049" // optional: your own reference string, to be included in responses "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01" } ``` You must include at least first name, last name, and birth date as inputs, but **we strongly recommend also including at least state or ZIP code if possible.** In general, the more inputs you provide, the higher coverage and accuracy will be. Because 1-Click Health is billed per attempt (not just per success), it's well worth collecting more inputs upfront. **Example: Autofill, Inputs from Manual Signup, Maximal Inputs** ```typescript { // "externalReference": "appointment-1048" // optional: your own reference string, to be included in responses "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "address": { "line1": "5320 Newell Rd", "line2": "#1", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }, "sex": "Male", "ssn": "000456789" } ``` #### With Payer Autofilling insurance with a payer specified can be helpful if you already know the user's payer, want to have the user select a payer upfront, or want to look for insurance from only a specific payer (or payer group). You can include any payer from our [Supported Payers](https://docs.verified.inc/1-click-health/supported-payers.md) list, including these special payer groups: - `VERIFIED_MEDICARE` (all Medicare payers) - `VERIFIED_BLUES` (all Blue Cross Blue Shield affiliated payers) > **Medicare Autofill Works More Often with SSNs** > > **Medicare autofill is much more likely to succeed if you include SSN as an input,** because CMS historically used SSNs as member IDs before switching to MBIs (Medicare Beneficiary Identifiers) in 2020 and still uses SSNs as unique identifiers. If you use 1-Click Signup to autofill inputs for 1-Click Health, we can hydrate SSNs — never exposing them to you or the user — and then use them to source health insurance data. **From 1-Click Signup** If you use 1-Click Signup to autofill inputs, you should include `identityUuid` as an input, using the value of `uuid` from the [response body of `POST /1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-response) (which you call for 1-Click Signup). If the user didn't edit any of the data autofilled by 1-Click Signup, you can include _only_ the `identityUuid`, and 1-Click Health will hydrate all of the relevant 1-Click Signup outputs as inputs: **Example: Autofill, Inputs from 1-Click Signup, Without User Edits** ```typescript { // "externalReference": "appointment-1043" // optional: your own reference string, to be included in responses "identityUuid": "f90b96d9-9d64-4675-8855-9ee1e188a38a", // from 1-Click Signup response body // No other PII inputs implies user didn't edit 1-Click Signup data "payer": { // Payer can be optionally included to autofill only for a specific payer (or payer group) "id": "VERIFIED_MEDICARE" // "name": "Verified Medicare" // Only use if payer ID is not known } } ``` If the user edited some of the data autofilled by 1-Click Signup, you should include the edited fields alongside the `identityUuid`, and 1-Click Health will hydrate the _rest_ of the 1-Click Signup outputs as inputs: **Example: Autofill, Inputs from 1-Click Signup, With User Edits** ```typescript { // "externalReference": "appointment-1042" // optional: your own reference string, to be included in responses "identityUuid": "f90b96d9-9d64-4675-8855-9ee1e188a38a", // from 1-Click Signup response body // Other inputs included are for 1-Click Signup data that user edited "address": { // Full address must be included for clarity, even if only one part was edited "line1": "5320 Newell Rd", "line2": "#1", // from user edit "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }, // All other PII inputs can optionally be included for clarity "payer": { // Payer can be optionally included to autofill only for a specific payer (or payer group) "id": "VERIFIED_MEDICARE" // "name": "Verified Medicare" // Only use if payer ID is not known } } ``` **From Manual Signup** If the user manually entered inputs, you should include them directly in the request body: **Example: Autofill, Inputs from Manual Signup, Minimal Inputs** ```typescript { // "externalReference": "appointment-1047" // optional: your own reference string, to be included in responses "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "payer": { // Payer can be optionally included to autofill only for a specific payer (or payer group) "id": "VERIFIED_MEDICARE" // "name": "Verified Medicare" // Only use if payer ID is not known } } ``` You must include at least first name, last name, and birth date as inputs, but **we strongly recommend also including at least state or ZIP code if possible.** In general, the more inputs you provide, the higher coverage and accuracy will be. Because 1-Click Health is billed per attempt (not just per success), it's well worth collecting more inputs upfront. **Example: Autofill, Inputs from Manual Signup, Maximal Inputs** ```typescript { // "externalReference": "appointment-1046" // optional: your own reference string, to be included in responses "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "address": { "line1": "5320 Newell Rd", "line2": "#1", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }, "sex": "Male", "ssn": "000456789", "payer": { // Payer can be optionally included to autofill only for a specific payer (or payer group) "id": "VERIFIED_MEDICARE" // "name": "Verified Medicare" // Only use if payer ID is not known } } ``` --- The [response body](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-health-response) will contain a `healthDataUuid` that identifies the 1-Click Health flow: **POST /1-click/health Response Body** ```typescript { healthDataUuid: string, externalReference?: string, // your own reference string, included if passed to POST /1-click/health status: "PENDING" | "PROCESSING" | "SUCCEEDED" | "FAILED" | "PARTIAL" } ``` See [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth) for details. ### Eligibility Check To run an eligibility check, call [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth) with **PII, payer, _and_ member ID:** > **Test in Sandbox** > > To test an eligibility check with mock coverage, use the [eligibility check test users](https://docs.verified.inc/1-click-health/test-users.md#eligibility-check). **From 1-Click Signup** If you used [1-Click Signup](https://docs.verified.inc/1-click-signup.md) to autofill inputs, you should include `identityUuid` as an input with the value of `uuid` from the [response body of `POST /1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-response) (which you call for 1-Click Signup): **Example: Check, Inputs from 1-Click Signup, Without User Edits** ```typescript { // "externalReference": "appointment-1051" // optional: your own reference string, to be included in responses "identityUuid": "f90b96d9-9d64-4675-8855-9ee1e188a38a", // from 1-Click Signup response body // No other PII inputs implies user didn't edit 1-Click Signup data "payer": { "id": "V404110" // "name": "Verified Medicare" // Only use if payer ID is not known }, "memberId": "A484069" } ``` If the user didn't edit any of the data autofilled by 1-Click Signup, you can include the `identityUuid`, and 1-Click Health will hydrate all of the relevant 1-Click Signup outputs as inputs. If the user edited some of the data autofilled by 1-Click Signup, you should include the edited fields alongside the `identityUuid`, and 1-Click Health will hydrate the _rest_ of the 1-Click Signup outputs as inputs: **Example: Check, Inputs from 1-Click Signup, With User Edits** ```typescript { // "externalReference": "appointment-1050" // optional: your own reference string, to be included in responses "identityUuid": "f90b96d9-9d64-4675-8855-9ee1e188a38a", // from 1-Click Signup response body // Other inputs included are for 1-Click Signup data that user edited "address": { // Full address must be included for clarity, even if only one part was edited "line1": "5320 Newell Rd", "line2": "#1", // from user edit "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }, // All other PII inputs can optionally be included for clarity "payer": { "id": "V404110" // "name": "Verified Medicare" // Only use if payer ID is not known }, "memberId": "A484069" } ``` **From Manual Signup** If the user manually entered inputs, you should include them directly in the request body: **Example: Check, Inputs from Manual Signup, Minimal Inputs** ```typescript { // "externalReference": "appointment-1053" // optional: your own reference string, to be included in responses "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "payer": { "id": "V404110" // "name": "Verified Medicare" // Only use if payer ID is not known }, "memberId": "A484069" } ``` You must include at least first name, last name, and birth date as inputs, but **we strongly recommend also including at least state or ZIP code if possible.** In general, the more inputs you provide, the higher coverage and accuracy will be. Because 1-Click Health is billed per attempt (not just per success), it's well worth collecting more inputs upfront. **Example: Check, Inputs from Manual Signup, Maximal Inputs** ```typescript { // "externalReference": "appointment-1052" // optional: your own reference string, to be included in responses "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "address": { "line1": "5320 Newell Rd", "line2": "#1", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }, "sex": "Male", "ssn": "000456789", "payer": { "id": "V404110" // "name": "Verified Medicare" // Only use if payer ID is not known }, "memberId": "A484069" } ``` > **Tip** > > One of the reasons we strongly recommend using 1-Click Signup to autofill inputs for 1-Click Health is that _we can then hydrate inputs that are never exposed to you or the user,_ improving the success rate of 1-Click Health! The most important example concerns Social Security Numbers (SSNs): > > > Most healthcare companies don't collect SSNs and therefore don't want to ask users to provide or confirm them. However, using SSNs as inputs for 1-Click Health can significantly improve success rates (especially for Medicare) — because SSNs are de facto unique, static identifiers for most US adults. > > > If you use 1-Click Signup to autofill inputs for 1-Click Health, we can hydrate SSNs — never exposing them to you or the user — and then use them to source health insurance data. There are various restrictions on how and when we do this. (For example, we'll only use a hydrated SSN if a user doesn't significantly edit the rest of the autofilled 1-Click Signup data.) But this allows you to improve the success rate of 1-Click Health while never needing to ask for or process SSNs yourselves. > > > **This is a huge advantage of using 1-Click Signup and 1-Click Health in combination.** > **Important** > > For object type inputs (Full Name and Address), you must include all "standard" fields, or you'll get an error: > > > - **Full Name:** You must include First Name and Last Name (but not Middle Name), even if the user only edited, for example, First Name. This is for clarity. > - **Address:** You must include Line 1, City, State, Zip Code, and Country (but not Line 2), even if the user edited, for example, Line 1. This is for clarity and to ensure that an invalid address isn't formed by implicitly combining edited and unedited pieces. The [response body](https://docs.verified.inc/reference/api/endpoints.md#post-1-click-health-response) will contain a `healthDataUuid` that identifies the 1-Click Health flow: **POST /1-click/health Response Body** ```typescript { healthDataUuid: string, externalReference?: string, // your own reference string, included if passed to POST /1-click/health status: "PENDING" | "PROCESSING" | "SUCCEEDED" | "FAILED" | "PARTIAL" } ``` See [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth) for details. ## 3. Receive outputs. If you configured the [webhooks](https://docs.verified.inc/1-click-health/guides/setup.md#webhooks) setting in the Verified Dashboard, we'll send the 1-Click Health response as a [payload](https://docs.verified.inc/reference/webhooks.md#payload) to your webhook. > **Tip** > > See the [Webhooks](https://docs.verified.inc/reference/webhooks.md) page for general details about how Verified handles webhooks. You can alternatively poll the [`GET /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#get-1-clickhealth) endpoint until you receive a response. To do so, repeatedly call `GET /1-click/health/{healthDataUuid}`, using the value of `healthDataUuid` from the response body of `POST /1-click/health`. Each response includes a `status`. Keep polling while it's `PENDING` or `PROCESSING`, and stop once it reaches a terminal state: `SUCCEEDED` or `PARTIAL` (data is in `results`) or `FAILED` (see `errors`). Given the response times noted above, polling every 2 to 3 seconds is a reasonable cadence. > **Data is Retrievable for 60 Minutes** > > **You can retrieve data for 60 minutes,** at which point it's deleted. If you need to retrieve the same data again, use [`GET /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#get-1-clickhealth) instead of `POST /1-click/health` so that a duplicate 1-Click Health event isn't created (and so you aren't billed twice). The response will contain a [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) (see [examples](https://docs.verified.inc/reference/api/types.md#example-1clickhealthentity)). There are two cases: - **Success:** If we can source health insurance data for the user, the `1ClickHealthEntity` will contain `results` with one or more health insurance plans. - If you ran an eligibility check, this will include a full EDI 271 (raw and parsed) with eligibility details. - If you have [network rules](https://docs.verified.inc/1-click-health/guides/setup.md#network-rules) defined in the Verified [Dashboard](https://dashboard.verified.inc/), it will include network status details (in network, out of network, or indeterminate) based on those rules. → _Continue to step 4._ - **Failure:** Otherwise, the `1ClickHealthEntity` will contain `errors` indicating that the lookup failed. → _Fall back to a manual health insurance entry flow._ > **Most Probable Plans are Listed First** > > If we return multiple health insurance plans for a user, they're **ordered from most to least probable.** _All plans we return have a high probability of matching the user, since we filter out low probability ones._ > > > A user may have multiple plans, for example if they have separate ones for medical, dental, or vision. **We recommend that you let the user choose which plan they want to use,** setting the first plan we return (which we deem most probable) as the default choice. > **Payer IDs** > > 1-Click Health can return many different IDs for a given payer: > > > - **`verifiedId`:** This ID identifies the payer within Verified but is not used in external systems. _It never changes,_ so it can reliably used to identify the payer over time. > - **`ids[]`:** These IDs identify the payer in external systems, like healthcare clearing houses or the payer's own system. _They may change_ over time. > > - **`ids[0]`:** This is considered the primary ID for the payer and is generally the ID the payer uses for itself. _It may change_ over time. **1ClickHealthEntity Example (succeeded)** ```typescript { "healthDataUuid": "9e12fe5b-5bb8-410a-ac6b-6e053e4c7e8d", "externalReference": "appointment-1042", "status": "SUCCEEDED", "results": [ { "memberId": "A484069", "payer": { "name": "Aetna", "verifiedId": "V404110", "ids": [ "60054", // ids[0] is considered primary "HPQRS", "Z95668", "10004", "953402799", "6400", "60054MA", "4500", "AETNA" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/11145919-80e4-4cb0-8518-cffbf44ee9fb.png" }, "verificationMethod": "clearinghouse", "coverageTypes": ["medical"], "serviceTypeCodes": ["30"], "isMedicare": false, "edi_271": ..., "eligibility": { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "Aetna", }, "member": { "memberId": "A484069", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Managed Choice Open Access", "groupNumber": "123456-123-12345", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "Aetna Member Services", "serviceTypeCodes": ["30"], "phone": "8005550000", "fax": "8005550001", "email": "memberservices@aetna.com", "url": "https://aetna.com/member-services" }, ... ] }, "network": { "status": "IN_NETWORK", "rules": [ { "uuid": "ab280ee0-5f66-4076-9d1b-255d5f0024e3", "name": "Rule 1: Aetna | MA, NY, WA | PPO | Hooli Health | Pied Piper - INN", "status": "IN_NETWORK", "notes": "Requires manual review", "metadata": { "selfPay": false, "priority": 1, "packageId": "123456" }, "startDate": "2026-10-01", "endDate": "2027-10-01", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ] } ] } }, { "memberId": "B231615071", "payer": { "name": "UnitedHealthcare", "verifiedId": "V816685", "ids": [ "87726", // ids[0] is considered primary "KMQTZ", "77082", "J87726MA", "10655", "2721", "87726MA", "95123", "11077", "MDC01", "10192", "14339", "3550", "3429", "UHC", "10806", "87726E", "KPIC1", "8455", "4523", "96107", "NGHPRT", "6442", "WCHEA", "10636", "10002", "72126", "UHCMP", "6847", "JDHS" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/ff5e124c-f19f-475c-9757-7fa011e5221a.png" }, "verificationMethod": "clearinghouse", "coverageTypes": ["medical"], "serviceTypeCodes": ["30"], "isMedicare": false, "edi_271": ..., "eligibility": { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "UnitedHealthcare", }, "member": { "memberId": "B231615071", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Choice Plus", "groupNumber": "1234567", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "UnitedHealthcare Member Services", "serviceTypeCodes": ["30"], "phone": "8005550002", "fax": "8005550003", "email": "memberservices@uhc.com", "url": "https://uhc.com/member-services" }, ... ] }, "network": { "status": "OUT_OF_NETWORK", "rules": [ { "uuid": "ea703d40-a073-454e-ae3e-3931e8e2cf5a", "name": "Rule 2: UnitedHealthcare | HMO | Hooli Health - OON", "status": "OUT_OF_NETWORK", "conditions": [ { "key": "payerName", "operator": "INCLUDE", "values": ["UnitedHealthcare", "United Healthcare"] }, { "key": "insuranceTypeCodes", "operator": "NOT_INCLUDE", "values": ["HM"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] } ] } ] } } ] } ``` ## 4. (optional) Prompt user to confirm. **For each health insurance plan you might use for a user, you should consider displaying the Payer Name and Member ID for the user to confirm.** These are contained in `memberId` and `payer.name`, respectively, for a given plan within the `results` array of the [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity). You don't need to display the full X12 [EDI 271](https://x12.org/examples/005010x279) (Health Care Eligibility Benefit Response, contained in `edi_271`) — and you shouldn't, because it's not human readable! > **We Recommend User Confirmation** > > 1. **Transparency:** By displaying the user's data to them, you ensure they're aware of what data you've received about them. > 2. **Accuracy:** Although Verified provides _very_ high quality data, we can never guarantee all data will be perfectly accurate. By having the user confirm their data, you can better avoid inaccuracies. Depending on your use case, you may want to give the user the ability to edit their data. > **Further Identity Verification is Required** > > Whether or not you prompt the user to confirm their insurance info, **you must further verify the user's identity before using that insurance info for billing.** For example, you can prompt the user to verify a government ID, to ensure that the inputs you used to source their insurance info match that ID. > > > **This is crucial to prevent insurance fraud,** since insurance info can be autofilled from as little as First Name, Last Name, and Birth Date inputs — which a bad actor can find easily. > > > We strongly recommend using 1-Click Signup to source inputs for 1-Click Health because, among other benefits, it deters fraud. However, even with 1-Click Signup, further identity verification is essential to ensure any insurance info you use for billing is accurate and associated with the correct user. > **Mask Member IDs** > > **We require you to mask Member IDs because they're particularly sensitive:** > > > - **Mask all except the last 4 characters server side,** so the client only displays the last 4 characters. _Note that Member IDs are alphanumeric and variable in length._ We recommend using the • character to mask, so that (for example) B231615071 is masked as ••••••5071. > - **If you allow the user to edit the Member ID, clear the entire value when they start editing (by deleting one character)**, so they don't just edit visible characters (which could result in another valid Member ID, but one that isn't theirs). **We recommend that you:** 1. **Use a static display for view mode.** 2. **Use a form with autofilled inputs for edit mode.** 3. **Include information about where the data comes from.** (See the [Info](https://docs.verified.inc/1-click-health/user-experience.md#info) screen of our User Experience guide for full details.) Here's an example: _Static display for view mode (multiple plans)_ _Static display for view mode (single plan)_ _Form with autofilled inputs for edit mode, question mark button to see information about where data comes from_ _Information about where data comes from_ #### a. Use a static display for view mode. In edit mode, we recommend that you display the user's data statically and show an edit button that lets them go into edit mode. If you receive multiple health insurance plans (in the `results` array of the `1ClickHealthEntity`), you can display a dropdown of options. If the user goes into edit mode, you should use the selected value in the dropdown to autofill inputs. #### b. Use a form with autofilled inputs for edit mode. In edit mode, we recommend that you display the user's data using a form with autofilled inputs. You can enable or disable each input depending on whether you want the user to be able to edit the data it contains. The upside of allowing the user to edit data is that it allows them to correct any inaccuracies. The downside is that user input isn't verified and may make fraud more likely. #### c. Include information about where the data comes from. Including some information about where the data comes from helps users understand the magic of 1-Click Health and feel comfortable with it. We recommend this language: > Verified autofills your info from trusted sources so you don’t have to enter it manually. It’s fast, safe, and secure. > **You Must Verify User Identity** > > We cannot guarantee that autofilled health insurance data is accurate, especially if you sourced it using inputs not autofilled by 1-Click Signup. It's possible that the insurance a user submits is inaccurate. > > > So, **you must verify a user's identity in some other way before using their insurance.** This is an important step to prevent insurance inaccuracy or fraud – and to make sure you're paid by insurance! --- ## Go Live! ### Request Approval **When you're ready to go live, request approval for [Production](https://docs.verified.inc/reference/api/environments.md#production) access:** 1. Go to the **Brand Details** page for your brand in the Verified [Dashboard](https://dashboard.verified.inc/). 2. Click the **Production** tab in the upper right, and make sure your brand settings are configured as you intend them to be. 3. Click the **Request Approval** button under the API Keys section. 4. Complete the **steps** listed in the dialog. 5. Click the **Submit Request** button. > **Tip** > > You can use the **Sync from Sandbox** buttons to quickly port some setting configurations from Sandbox to Production. Note, however, that this is not possible for all settings: some need to be configured manually for Production. In step 4, you'll be asked to confirm the following: [ ] We've included the Verified consent language a "powered by Verified" graphic and (see step 1). [ ] We’re using Verified API keys securely: server side, never client side. [ ] We’re masking Member IDs server side and only exposing the starting and ending characters client side. [ ] Our 1-Click Health flow is working end-to-end in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox). > **Important** > > You'll also be prompted to share a link to your Sandbox integration and/or schedule a 15 minute call with us, so we can review your integration to see that it's compliant and working properly. Once we approve it, you'll have access to a Production API key on the Brand Details page. ### Swap Sandbox for Production **Once you have Production access, just swap Sandbox for Production:** 1. Swap your Sandbox API key for your Production API key. 2. Swap the [Sandbox base URL](https://docs.verified.inc/reference/api/environments.md#sandbox) for the [Production base URL](https://docs.verified.inc/reference/api/environments.md#production). **Then you'll be live with 1-Click Health! ✅** --- Source: https://docs.verified.inc/1-click-health/guides/api-integration Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Previous: SDK Integration — https://docs.verified.inc/1-click-health/guides/sdk-integration.md Next: Payer Enrollments — https://docs.verified.inc/1-click-health/guides/payer-enrollments.md --- # 1-Click Health: Payer Enrollments Source: https://docs.verified.inc/1-click-health/guides/payer-enrollments.md | | | | --- | --- | | Time to Complete | 1-3 hours | | Skills Required | No technical skills! | To use 1-Click Health, your company must be a healthcare **provider** with one or more [NPIs (National Provider Identifiers)](https://www.cms.gov/regulations-and-guidance/administrative-simplification/nationalprovidentstand). Verified uses your NPIs — and the input user data you provide — to source user health insurance data from **payers.** We’re able to source this data from most payers immediately, but some payers require additional enrollment steps to be completed before they start returning data. We handle as much of the payer enrollment process as possible, to save your team time and effort. We can complete enrollments with many payers on your behalf, without additional work from you. There are some payers, however, that require steps only you can complete. This guide contains comprehensive instructions for how you can complete the steps such payers require. The Verified team is available at any time to assist. Don’t hesitate to reach out to us at [Support@Verified.inc](mailto:Support@Verified.inc) or on Slack, and we’ll help in any way we can. > **Completing These Enrollments is Optional** > > **You can ignore instructions for any payer that's irrelevant to your use case or that has steps you deem too burdensome.** The downside is simply that we won’t be able to autofill health insurance data for users of such a payer. ## Medicaid ### Iowa | | | | --- | --- | | Processing Time | 2 weeks (handled by payer) | | Payer Name | Medicaid Iowa | | Payer Verified ID | V183310 | | Other Payer IDs | 18049, IAMCD, IACAID, 100171, 1469, 1665, GZVQX, 10107, SKIA0 | > **Tip** > > **For this payer, you need to complete enrollment through [EDISS Connect](https://connect.edissweb.com/) (Electronic Data Interchange Support Services).** Register for an EDISS account if you don't have one already, and reach out to them if you have any issues: [+1 (800) 967-7902](tel:+18009677902). > **Note** > > **We use FinThrive Health as an intermediary to connect with this payer.** 1. Log in to **[EDISS Connect](https://connect.edissweb.com/).** 2. Click the **Add Transactions** tab. 3. For each NPI you have, enter the **NPI** and associated **Tax ID** and click **Continue.** 4. Select **Iowa** as the state for transactions, and then click **Add** and **Continue.** 5. Select the **Type(s)** of transactions you will be submitting: **Institutional,** **Professional,** and/or **Dental.** 6. Choose the **Lines of Business** that apply to your NPI(s) and click **Continue.** 7. Check the **Enroll** box next to 270 Eligibility Benefit Inquiry and click **Add Vendor.** 8. Select **FinThrive Health (AC101397)** as your vendor, and then click **Add** and **Submit.** _You should arrive at a Summary page that indicates if you need to complete any additional enrollment forms._ 9. **Tell Verified** you've completed this payer enrollment, so we can finalize it on our side. > **Important** > > **The last step — telling Verified you've completed the payer enrollment — is required.** We need to finalize it manually on our side. You can reach out to us at [Support@Verified.inc](mailto:Support@Verified.inc) or on Slack. ### Michigan | | | | --- | --- | | Processing Time | 2 weeks (handled by payer) | | Payer Name | Medicaid Michigan | | Payer Verified ID | V652160 | | Other Payer IDs | RFUPF, CKMI1, 2480, MIMCD, 6109, 10392, 2137, SKMI2, D00111, 4581, 10136, MICAID, SKMI0 | > **Tip** > > **For this payer, you need to complete enrollment through [CHAMPS](https://www.michigan.gov/mdhhs/assistance-programs/medicaid/portalhome/medicaid-providers/champs-a) (Community Health Automated > Medicaid Processing System) via [MiLogin for Business](https://milogintp.michigan.gov/).** Register for a MiLogin for Business account if you don't have one already, and then register for CHAMPS if you haven't already. Refer to the [CHAMPS user guide](https://www.michigan.gov/mdhhs/doing-business/providers/providers/medicaid/provider-enrollment/data/pe-pages/step-by-step-enrollment-guides/group) and CHAMPS training resources (accessible at the bottom of the portal page), and reach out to them if you have any issues: [+1 (800) 292-2550](tel:+18002922550), [providerenrollment@michigan.gov](mailto:providerenrollment@michigan.gov). > **Note** > > **We use ClaimRemedi as an intermediary to connect with this payer.** 1. Log in to **[MiLogin for Business](https://milogintp.michigan.gov/).** 2. Click **CHAMPS** to access the CHAMPS portal. 3. Start the enrollment process and select **New Enrollment.** 4. Under the **Providers** tab, click **Manage Provider Information** to access the Business Process Wizard. 5. For each NPI you have, **complete all steps** of the Business Process Wizard in order, and click **Close.** 6. Click **Associate Billing Agent** and click **Add**. 7. Enter **1206586** as the Billing Agent ID and click **Confirm/Search.** _You should see **ClaimRemedi** appear as the Billing Agent Name._ 8. **Tell Verified** you've completed this payer enrollment, so we can finalize it on our side. > **Important** > > **The last step — telling Verified you've completed the payer enrollment — is required.** We need to finalize it manually on our side. You can reach out to us at [Support@Verified.inc](mailto:Support@Verified.inc) or on Slack. ### Utah | | | | --- | --- | | Processing Time | 6 weeks (handled by payer) | | Payer Name | Medicaid Utah | | Payer Verified ID | V308074 | | Other Payer IDs | 10648, 1486, NLWNP, UTCAID, CKUT1, UTMCD, UDOH0, SKUT0, TNJBD | > **Tip** > > **For this payer, you need to complete enrollment through [PRISM](https://medicaid.utah.gov/prism/) (Provider Reimbursement Information System for Medicaid) via the [PRISM Provider Portal](https://prism.health.utah.gov/).** Register for a PRISM account if you don't have one already, using the application ID the payer included in letters they mailed to you. If you don't have an application ID or have any other issues, reach out to them: [+1 (801) 538-6155](tel:+18015386155), [providerenroll@utah.gov](mailto:providerenroll@utah.gov). > **Note** > > **We use UHIN as an intermediary to connect with this payer.** 1. Log in to the **[PRISM Provider Portal](https://prism.health.utah.gov/).** 2. Under **My Profile** on the left, click **Manage Provider Information** to open the Business Process Wizard. 3. **Complete all steps marked as required** in the Business Process Wizard: - **Step 8 (Mode of Claim Submission/EDI Exchange):** 1. Check the box by **Mode of** and **Billing Agent/Clearinghouse/UHIN** (under the header of EDI Exchange - Billing Agent/Clearinghouse/UHIN). _Don't select Electronic Batch._ 2. Select **270/271-Eligibility** as the transaction and click the **right arrow button** (under the Associated Transactions column). 3. Click the **OK** button (near the bottom of the page). - **Step 9 (Associate Billing Agent):** 1. Click the **Add** button on the Billing Agent List page. 2. Click the **Confirm/Search Billing Agent** button. 3. Click the **Filter By** dropdown, select **Billing Agent Name,** enter **UHIN**, and click **Go.** 4. Click the check box next to **UHIN** and click the **Select** button. _You'll be taken back to the Associate Billing Agent page._ 5. Add the current date for **Association Start Date.** 6. Click the **Add** button (under the EDI Transaction Authorization header). 7. Click the **Electronic Transaction Type** dropdown and select **270/271-Eligibility.** 8. Enter **HT006748-001** for **Trading Partner ID** and click the **OK** button. _You'll be taken back to the Associate Billing Agent page._ 9. Click the **OK** button again. - **Step 17 (Submit Modification Request for Review):** Submit your application. 4. **Tell Verified** you've completed this payer enrollment, so we can finalize it on our side. > **Important** > > **The last step — telling Verified you've completed the payer enrollment — is required.** We need to finalize it manually on our side. You can reach out to us at [Support@Verified.inc](mailto:Support@Verified.inc) or on Slack. --- Source: https://docs.verified.inc/1-click-health/guides/payer-enrollments Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Previous: API Integration — https://docs.verified.inc/1-click-health/guides/api-integration.md Next: Supported Payers — https://docs.verified.inc/1-click-health/supported-payers.md --- # 1-Click Health: SDK Integration Source: https://docs.verified.inc/1-click-health/guides/sdk-integration.md | | | | --- | --- | | Time to Complete | 15 minutes | | Time to Test and Deploy | 30-60 minutes | | Skills Required | Make API calls | > **Tip** > > **Complete the 1-Click Health [Setup](https://docs.verified.inc/1-click-health/guides/setup.md) guide before following this SDK Integration guide.** > **The SDK Works for Web and Native Mobile** > > **You can use the Verified SDK in both web and native mobile apps!** Many of our customers do exactly this, so they can provide users with a unified (and much easier to maintain) experience across web, iOS, and Android. > > > **For how to do this, see Native Mobile App Integration.** > **Standalone 1-Click Health in the SDK is Not Yet Supported** > > **We don't yet support using 1-Click Health standalone in the SDK** (though this is coming soon). You must use it following 1-Click Signup in the SDK. Because we don't yet support using 1-Click Health standalone in the SDK, you need to integrate 1-Click Signup with the SDK first, and then enable 1-Click Health after it. **Follow the [1-Click Signup SDK Integration guide](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md) and then return to this guide to enable 1-Click Health.** **Full Example** **Integrate SDK** ```typescript import { VerifiedClientSdk, SdkResult, SdkEvent, SdkError, SdkResultValues, SdkEventValues, SdkErrorReasons, } from '@verifiedinc-public/client-sdk'; // Initialize the SDK const sdk = new VerifiedClientSdk({ sessionKey: 'YOUR_SESSION_KEY', onResult: handleResult, onError: handleError, onEvent: handleEvent, }); // Handle successful results function handleResult(data: SdkResult) { switch (data.type) { case SdkResultValues.USER_SHARED_CREDENTIALS: // 1-Click Signup success! // Pass data.identityUuid to server (to call GET /1-click/{identityUuid}) break; // Only for 1-Click Health // case SdkResultValues.USER_SHARED_HEALTH_DATA: // 1-Click Health success! // // Pass data.healthDataUuid to server (to call GET /1-click/health/{healthDataUuid}) // break; case SdkResultValues.USER_OPTED_OUT: // User clicked 'Sign Up Manually Instead' // Take user to manual signup flow break; case SdkResultValues.NO_CREDENTIALS_FOUND: // No signup data found (OCE013 Verified error code) // Take user to manual signup flow. Additional metadata may be available. break; // Only for 1-Click Health // case SdkResultValues.NO_INSURANCE_FOUND: // No health insurance data found // // Take user to manual health insurance flow // break; case SdkResultValues.RISK_SCORE_TOO_HIGH: // OCE017 Verified error code // Take user to manual signup flow. Additional metadata may be available. break; case SdkResultValues.MAX_INPUT_ATTEMPTS_EXCEEDED: // OCE019 Verified error code // Take user to manual signup flow. Additional metadata may be available. break; case SdkResultValues.MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED: // User tried verification code too many times // Take user to manual signup flow. Additional metadata may be available. break; } } // Handle errors function handleError(error: SdkError) { console.error('SDK error:', error.reason); switch (error.reason) { case SdkErrorReasons.INVALID_SESSION_KEY: // Call POST /client/1-click on server to get a new session key break; case SdkErrorReasons.SESSION_TIMEOUT: // Call POST /client/1-click on server and create new VerifiedClientSdk instance break; case SdkErrorReasons.SHARE_CREDENTIALS_ERROR: // Handle credential sharing error break; } } // Handle intermediary events function handleEvent(event: SdkEvent) { // metadata is always available console.log(event.metadata); switch (event.type) { case SdkEventValues.SDK_READY: // SDK rendered content for the user break; case SdkEventValues.USER_STEP_CHANGE: // User navigated to a new step console.log(event.step, event.previousStep); break; case SdkEventValues.STEP_TIME_SPENT: // User left a step, includes duration console.log(event.step, event.durationMs); break; case SdkEventValues.USER_COMPLETED_PRODUCT: // User completed a product flow console.log(event.product); break; case SdkEventValues.ONE_CLICK_SIGNUP_FORM_SUBMITTED: // User submitted signup form console.log(event.form); break; case SdkEventValues.ONE_CLICK_HEALTH_FORM_SUBMITTED: // Only for 1-Click Health // User submitted health form console.log(event.form); break; case SdkEventValues.ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED: // Only for 1-Click Health // User submitted health manual-input form (fullName/birthDate fallback) console.log(event.form); break; } } // Display the SDK in your application sdk.show(document.getElementById('sdk-container') as HTMLElement); ``` ## 1. Update how you handle responses. ### a. Update how you handle results. Update your `handleResult` function to include the 2 result values specific to 1-Click Health, leveraging the [`SdkResultValues` constant](https://docs.verified.inc/reference/sdk/constants.md#sdkresultvalues): ```typescript function handleResult(data: SdkResult): void { switch (data.type) { ... // Add for 1-Click Health case SdkResultValues.USER_SHARED_HEALTH_DATA: // 1-Click Health success! // Pass data.healthDataUuid to server (to call GET /1-click/health/{healthDataUuid}) break; ... // Add for 1-Click Health case SdkResultValues.NO_INSURANCE_FOUND: // No health insurance data found // Take user to manual health insurance flow break; } } ``` > **Note** > > Regardless of the result type, you can access specific metadata properties directly from the **data** object. See [SdkResult](https://docs.verified.inc/reference/sdk/types.md#sdkresult) type definition for the complete structure. There are 2 result values to handle for 1-Click Health: | Result Value | Description | How to Handle | | --- | --- | --- | | `USER_SHARED_HEALTH_DATA` | User successfully shared [health insurance](https://docs.verified.inc/reference/data/outputs.md#health-insurance-plans) data | Retrieve data | | `NO_INSURANCE_FOUND` | No health insurance data found | Take user to manual health insurance flow | Some [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata) may be available directly in the `data` object (see [`SdkResult`](https://docs.verified.inc/reference/sdk/types.md#sdkresult)). To retrieve all metadata (and [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) if the result value is `USER_SHARED_HEALTH_DATA`), call your server with `data.healthDataUuid`. The server should use your Verified API key to call [`GET /1-click/health/{healthDataUuid}`](https://docs.verified.inc/reference/api/endpoints.md#get-1-clickhealth): ```text GET /1-click/health/{healthDataUuid} ``` > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). The response will be a [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) that contains data (user [health insurance](https://docs.verified.inc/reference/data/outputs.md#health-insurance-plans) and [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata)): **GET /1-click/health Response Body** ```typescript { ...1ClickHealthEntity } ``` **`1ClickHealthEntity` Example** **1ClickHealthEntity Example (succeeded)** ```typescript { "healthDataUuid": "9e12fe5b-5bb8-410a-ac6b-6e053e4c7e8d", "externalReference": "appointment-1042", "status": "SUCCEEDED", "results": [ { "memberId": "A484069", "payer": { "name": "Aetna", "verifiedId": "V404110", "ids": [ "60054", // ids[0] is considered primary "HPQRS", "Z95668", "10004", "953402799", "6400", "60054MA", "4500", "AETNA" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/11145919-80e4-4cb0-8518-cffbf44ee9fb.png" }, "verificationMethod": "clearinghouse", "coverageTypes": ["medical"], "serviceTypeCodes": ["30"], "isMedicare": false, "edi_271": ..., "eligibility": { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "Aetna", }, "member": { "memberId": "A484069", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Managed Choice Open Access", "groupNumber": "123456-123-12345", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "Aetna Member Services", "serviceTypeCodes": ["30"], "phone": "8005550000", "fax": "8005550001", "email": "memberservices@aetna.com", "url": "https://aetna.com/member-services" }, ... ] }, "network": { "status": "IN_NETWORK", "rules": [ { "uuid": "ab280ee0-5f66-4076-9d1b-255d5f0024e3", "name": "Rule 1: Aetna | MA, NY, WA | PPO | Hooli Health | Pied Piper - INN", "status": "IN_NETWORK", "notes": "Requires manual review", "metadata": { "selfPay": false, "priority": 1, "packageId": "123456" }, "startDate": "2026-10-01", "endDate": "2027-10-01", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ] } ] } }, { "memberId": "B231615071", "payer": { "name": "UnitedHealthcare", "verifiedId": "V816685", "ids": [ "87726", // ids[0] is considered primary "KMQTZ", "77082", "J87726MA", "10655", "2721", "87726MA", "95123", "11077", "MDC01", "10192", "14339", "3550", "3429", "UHC", "10806", "87726E", "KPIC1", "8455", "4523", "96107", "NGHPRT", "6442", "WCHEA", "10636", "10002", "72126", "UHCMP", "6847", "JDHS" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/ff5e124c-f19f-475c-9757-7fa011e5221a.png" }, "verificationMethod": "clearinghouse", "coverageTypes": ["medical"], "serviceTypeCodes": ["30"], "isMedicare": false, "edi_271": ..., "eligibility": { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "UnitedHealthcare", }, "member": { "memberId": "B231615071", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Choice Plus", "groupNumber": "1234567", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "UnitedHealthcare Member Services", "serviceTypeCodes": ["30"], "phone": "8005550002", "fax": "8005550003", "email": "memberservices@uhc.com", "url": "https://uhc.com/member-services" }, ... ] }, "network": { "status": "OUT_OF_NETWORK", "rules": [ { "uuid": "ea703d40-a073-454e-ae3e-3931e8e2cf5a", "name": "Rule 2: UnitedHealthcare | HMO | Hooli Health - OON", "status": "OUT_OF_NETWORK", "conditions": [ { "key": "payerName", "operator": "INCLUDE", "values": ["UnitedHealthcare", "United Healthcare"] }, { "key": "insuranceTypeCodes", "operator": "NOT_INCLUDE", "values": ["HM"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] } ] } ] } } ] } ``` ### b. Update how you handle events. > **Tip** > > Handling events is not necessary for the SDK to work, but it will allow you to understand how users are interacting with the SDK and optimize the experience. Update your `handleEvent` function to include the 2 event values specific to 1-Click Health, leveraging the [`SdkEventValues` constant](https://docs.verified.inc/reference/sdk/constants.md#sdkeventvalues): ```typescript function handleEvent(event: SdkEvent): void { switch (event.type) { ... // Add for 1-Click Health case SdkEventValues.ONE_CLICK_HEALTH_FORM_SUBMITTED: // User submitted health form console.log(event.form); break; // Add for 1-Click Health case SdkEventValues.ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED: // User submitted the health manual-input form (fullName/birthDate fallback) console.log(event.form); break; } } ``` There are 2 event values to handle for 1-Click Health: | Event Value | Description | | --- | --- | | `ONE_CLICK_HEALTH_FORM_SUBMITTED` | User submitted health insurance form | | `ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED` | User submitted the health manual-input form (fullName/birthDate fallback, shown when prior data isn't sufficient to look up insurance automatically) | --- ## Native Mobile App Integration The Verified SDK is a client side SDK that makes it easy to integrate 1-Click Signup into any application. Because it’s web based, **the SDK can be easily used within both web and native mobile apps.** > **Tip** > > **Using a single SDK across all types of apps makes it far easier to maintain.** We highly recommend you do this if you have mobile apps! The result will be unified, easy to maintain signup experience across all platforms. See [here](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md#native-mobile-app-integration) in the 1-Click Signup SDK Integration guide for details. --- ## Go Live! **When you're ready to go live, get a Production API key:** 1. Go to the **Brand Details** page for your brand in the Verified [Dashboard](https://dashboard.verified.inc/). 2. Click the **Production** tab in the upper right, and make sure your brand settings are configured as you intend them to be. 3. Copy a **Production API key** from the top of the page. > **Tip** > > You can use the **Sync from Sandbox** buttons to quickly port some setting configurations from Sandbox to Production. Note, however, that this is not possible for all settings: some need to be configured manually for Production. **Just swap Sandbox for Production:** 1. Swap your Sandbox API key for your Production API key. 2. Swap the [Sandbox base URL](https://docs.verified.inc/reference/api/environments.md#sandbox) for the [Production base URL](https://docs.verified.inc/reference/api/environments.md#production). 3. Swap `'sandbox'` for `'production'` in the `environment` attribute of the SDK instance (see [step 2b](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md#b-create-an-sdk-instance)). **Then you'll be live with 1-Click Health! ✅** --- Source: https://docs.verified.inc/1-click-health/guides/sdk-integration Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Previous: Setup — https://docs.verified.inc/1-click-health/guides/setup.md Next: API Integration — https://docs.verified.inc/1-click-health/guides/api-integration.md --- # 1-Click Health: Setup Source: https://docs.verified.inc/1-click-health/guides/setup.md | | | | --- | --- | | Time to Complete | 5 minutes | | Skills Required | No technical skills! | > **Tip** > > **Complete this Setup guide before following the 1-Click Health [SDK Integration](https://docs.verified.inc/1-click-health/guides/sdk-integration.md) or [API Integration](https://docs.verified.inc/1-click-health/guides/api-integration.md) guide.** ## 1. Access the Dashboard. **Create or log into your Verified [Dashboard](https://dashboard.verified.inc/) account.** **How to Create a Dashboard Account** ### a. Enter your email and click the 1-Click Login button. We'll send you a verification code by email. > **Tip** > > **Use your work email.** We use AI to auto-magically set brand information based on your email domain, so you don't have to manually enter it! ### b. Complete the verification step. Click the verification button in the email or enter the verification code. We'll automatically log you in. _It's a 1-click experience, as promised!_ ### c. (optional) Set up MFA. Set up multi-factor authentication with an authenticator app. This is optional until you request approval for [Production](https://docs.verified.inc/reference/api/environments.md#production) access, at which point it's required. ### d. (if necessary) Confirm your company name. If you're creating the Dashboard account for your company, we'll ask you to confirm your company name. _If someone on your team has already created your account, you won't need to do this._ If your account doesn't have a brand yet, we'll automatically create one for you and take you to its Brand Details page. > **Why Multiple Brands?** > > Your company account can have one or more brands. Generally, you'll only need one brand, but there are some cases where it's helpful to use multiple. For example: > > > - **If you have multiple products:** If you have products that go by different names, it can be useful to create different brands to help users know which product they're using 1-Click Signup for — and to help your team track metrics specific to that product. > - **If you want to try different brand settings:** If you want to change brand settings without affecting your existing implementation (even in Sandbox), you can duplicate your brand and configure different settings on the new brand. ### e. (optional) Invite team members. Invite your team members to join your Dashboard account. ## 2. Configure brand settings. **On the Brands page, click the Create button to create a new brand, or click Brand Details to access brand settings for an existing brand.** ### Brand Name **Choose an external name for your brand.** This will be used elsewhere in the Dashboard (for example on the Metrics page) and displayed to users in the SDK (if you choose to use the SDK). The internal brand name is separate, and you can edit it at the top of the page. You can use this to label brands created for testing purposes, for example. ### 1-Click Health Settings **Click the 1-Click Health tab to access these settings.** #### Check After Autofill > **Definitions** > > **Autofill** and **check** are the two core capabilities of 1-Click Health: > > > - Insurance **autofill**: Autofilling a user's insurance info based on their PII (Name, Birthday, etc.) and optionally payer. > - Eligibility **check**: Running an eligibility check for the user's insurance. > **Info** > > This setting determines a default value, which you can override anytime by including `checkAfterAutofill` in the request body of [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth). **Choose whether to automatically run an eligibility check for a user's insurance after we successfully autofill it:** | Option | Description | | --- | --- | | On Recommended | Automatically run eligibility check after autofill | | Off | Don't automatically run eligibility check after autofill | If you set this to **On**, we will run an eligibility check and return full insurance details: a 271 in raw and parsed form. > **We Recommend Setting This to On** > > Most use cases require running an eligibility check for the user's insurance. We can do this automatically for you, after autofilling the insurance, so you don't have to make another API call to do it. #### Service Type Codes > A **service type code** is an [X12](https://x12.org/codes/service-type-codes) code that identifies business groupings for health care services or benefits. > **Info** > > This setting determines a default value, which you can override anytime by including `serviceCodes.serviceTypeCodes` in the request body of [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth). **Optionally, choose which service type codes to include in the health insurance lookup** (in the EDI 270). The most general code (`30`, for Plan Coverage and General Benefits) is included by default. See the full list of service type codes below. > **Warning** > > We don't recommend changing the default unless you have a specific reason and know what you're doing. In general, shorter lists produce more reliable results. **138** of 138 service type codes | | | Description | Dates | | --- | --- | --- | --- | | `1` | Medical Care | Medical services to diagnose and/or treat a medical condition, illness, or injury | Start: 09/20/2009 | | `2` | Surgical | Surgical services provided by a healthcare provider | Start: 09/20/2009 | | `3` | Consultation | Counseling and/or coordination of care with other Physicians, other qualified Healthcare Providers or agencies | Start: 09/20/2009 | | `4` | Diagnostic X-Ray | Diagnostic x-ray provided by a healthcare provider | Start: 09/20/2009 | | `5` | Diagnostic Lab | Diagnostic lab provided by a healthcare provider | Start: 09/20/2009 | | `6` | Radiation Therapy | Radiation therapy provided by a healthcare provider | Start: 09/20/2009 | | `7` | Anesthesia | Anesthesia services provided by a healthcare provider | Start: 09/20/2009 | | `8` | Surgical Assistance | Assistant surgeon/surgical assistance provided by a healthcare provider if required because of the complexity of the surgical procedures | Start: 09/20/2009 | | `9` | Hearing Aid | Small electronic device that is worn in or above the ear. | Start: 09/01/2023 | | `10` | Blood | The allotment of whole blood, blood plasma, or blood derivatives | Start: 09/20/2009 | | `11` | Durable Medical Equipment Used | Used equipment needed for medical reasons to be used by a person that is ill or injured and is ordered by a health care provider for use in the home. | Start: 09/20/2009 | | `12` | Durable Medical Equipment Purchased | Purchased equipment needed for medical reasons to be used by a person that is ill or injured and is ordered by a healthcare provider for use in the home. | Start: 09/20/2009 | | `13` | Hearing Aid Power Source | Batteries or other type of device used to charge a hearing aid | Start: 09/01/2023 | | `18` | Durable Medical Equipment Rental | Rental equipment needed for medical reasons to be used by a person that is ill or injured and is ordered by a healthcare provider for use in the home. | Start: 09/20/2009 | | `19` | Pneumonia Vaccine | Services provided by a physician or other healthcare provider related to administration of Pneumococcal Pneumonia vaccination. | Start: 09/20/2009 | | `20` | Second Surgical Opinion | Second professional opinion sought to verify or confirm the necessity for surgical procedures | Start: 09/20/2009 | | `23` | Diagnostic Dental | The translation of data gathered by clinical and radiographic examination into an organized, classified definition of conditions present. | Start: 09/20/2009 | | `24` | Periodontics | The art and science of examination, diagnosis, and treatment of diseases affecting the periodontium; a study of the supporting structures of the teeth, normal anatomy and physiology and the deviations. | Start: 09/20/2009 | | `25` | Restorative | Broad term applied to any restorations to the tooth/teeth structure(s). Anterior teeth include up to five surface classifications - Mesial, Distal, Incisal, Lingual and Labial. Posterior teeth include up to five surface classifications: Mesial, Distal, Occlusal, Lingual and Buccal. | Start: 09/20/2009 | | `26` | Endodontics | The branch of dentistry that is concerned with the morphology, physiology and pathology of the dental pulp and periradicular (gum) tissues. | Start: 09/20/2009 | | `27` | Maxillofacial Prosthetics | The branch of prosthetics is concerned with the restoration of stomatognathic and associated facial structure that have been affected by disease, injury, surgery, or congenital defect. | Start: 09/20/2009 | | `28` | Adjunctive Dental Services | Typically these services involve a drug such as anesthesia or other substances that serve as a supplemental purpose in dental therapy. | Start: 09/20/2009 | | `30` | Plan Coverage and General Benefits | Plan coverage and general benefits for the member's policy or contract. | Start: 09/20/2009 Last Modified: 11/01/2019 | | `33` | Chiropractic | Manipulations and modalities provided by a healthcare provider | Start: 09/20/2009 | | `35` | Dental Care | The treatment of the teeth and their supporting structures. | Start: 09/20/2009 | | `36` | Dental Crowns | An artificial replacement for the natural crown of the tooth covering all five surfaces (Anterior teeth surface classifications - Mesial, Distal, Incisal, Lingual and Labial. Posterior teeth surface classifications: Mesial, Distal, Occlusal, Lingual and Buccal. | Start: 09/20/2009 | | `37` | Dental Accident | Supplies or appliances for care of teeth due to accidental injury provided by healthcare provider | Start: 09/20/2009 | | `38` | Orthodontics | The area of dentistry concerned with the supervision, guidance, and correction of the growing and mature orofacial structures. This includes conditions that require movement of the teeth or correction of the malrelationships and malformations of related structures by the adjustment of relationships between and among teeth and facial bones by the application of forces or the stimulation and redirection of functional forces within the craniofacial complex. | Start: 09/20/2009 | | `39` | Prosthodontics | The part of dentistry pertaining to the restoration and maintenance of oral function, comfort, appearance and health of the patient by replacement of missing teeth and contiguous tissues with artificial substitutes. It has three main branches: removable prosthodontics, fixed prosthodontics and maxillofacial prosthetics. | Start: 09/20/2009 | | `40` | Oral Surgery | Diagnosis and treatment of disorders of the mouth, teeth, jaws and facial structure provided by a healthcare provider | Start: 09/20/2009 | | `41` | Preventive Dental | The dental procedures in dental practice and health programs that prevent the occurrence of oral diseases. | Start: 09/20/2009 Last Modified: 01/24/2010 | | `42` | Home Health Care | Healthcare services rendered in the home by a healthcare provider | Start: 09/20/2009 | | `45` | Hospice | An integrated set of services and supplies to provide palliative and supportive care to terminally ill patients. | Start: 09/20/2009 | | `47` | Hospitalization | Hospital Inpatient and Outpatient services and supplies for a patient who may or may not have been admitted to a hospital, for the purpose of receiving medical care or other health services. | Start: 09/20/2009 | | `54` | Long Term Care | Care provided for an individual when they cannot care for themselves within the home or in a facility | Start: 09/20/2009 | | `56` | Medically Related Transportation | Ambulance, Ambulate or other Medical transport services | Start: 09/20/2009 | | `60` | Plan Coverage | Indicates whether a patient has active or inactive coverage for the service date requested. | Start: 09/20/2009 Last Modified: 11/01/2019 | | `61` | In-vitro Fertilization | Services to treat infertility | Start: 09/20/2009 | | `62` | MRI Scan | Diagnostic MRI (Magnetic Resonance Imaging) services. | Start: 09/20/2009 | | `64` | Acupuncture | A system of alternative treatment that involves pricking the skin or tissues with needles | Start: 09/20/2009 | | `65` | Newborn Care | Management of the infant during the transition to extra uterine life and subsequent period of stabilization | Start: 09/20/2009 | | `66` | Pathology | Creation of slides from tissues and its interpretation provided by a healthcare provider | Start: 09/20/2009 | | `67` | Smoking Cessation | Treatment to assist in the discontinuation of the use of nicotine | Start: 09/20/2009 | | `68` | Well Baby Care | Medical services and physician visits which are recommended by the American Pediatric Association as appropriate and routine care for a child to a specific age limit. | Start: 09/20/2009 | | `69` | Maternity | Services related to maternity care including related conditions resulting in childbirth when provided, or ordered and billed by a physician or nurse midwife | Start: 09/20/2009 | | `70` | Transplants | Services related to the transfer of living organs or tissue from one body to another. | Start: 09/20/2009 | | `71` | Audiology | Services related to hearing disorders, including evaluation of hearing function and rehabilitation of patients with hearing impairment | Start: 09/20/2009 | | `74` | Private Duty Nursing | A nurse who is hired to provide focused care to an individual patient in a hospital, clinic, nursing home or patient's home | Start: 09/20/2009 | | `75` | Prosthetics | A device that is used to replace a part of the body that is missing. | Start: 09/20/2009 Last Modified: 07/01/2016 | | `76` | Dialysis | The process by which uric acid and urea are removed from circulating blood by means of a dialyzer | Start: 09/20/2009 | | `78` | Chemotherapy | The treatment of disease by means of chemicals that have a specific toxic effect upon the disease-producing microorganisms or that selectively destroy cancerous tissue. | Start: 09/20/2009 | | `79` | Allergy Testing | A skin or blood test to determine what substance, or allergen, may trigger an allergic response in a person | Start: 09/20/2009 | | `80` | Immunizations | The introduction of a vaccine with the goal of producing immunity | Start: 09/20/2009 | | `81` | Routine Physical | A physical examination performed on asymptomatic patients for medical screening purposes. | Start: 09/20/2009 | | `82` | Family Planning | Educational services that assists individuals and couples to anticipate and attain their desired number of children and the spacing and timing of their births. It is achieved through use of contraceptive methods and the treatment of involuntary infertility. | Start: 09/20/2009 | | `84` | Abortion | Services related to the elective termination of a pregnancy | Start: 09/20/2009 | | `86` | Emergency Services | Services provided by healthcare providers for the treatment of a sudden and unexpected medical condition or injury which requires immediate medical attention | Start: 09/20/2009 | | `88` | Retail/Independent Pharmacy | A licensed entity that dispenses prescription drugs and provides professional pharmacy services, such as clinical pharmacy consulting respective to the dispensing function. The entity may be a retail/chain or independent pharmacy or any other entity which dispenses prescription drugs. | Start: 09/20/2009 Last Modified: 05/01/2017 | | `90` | Mail Order Pharmacy | A mail order pharmacy delivers medications directly to patients through the mail. | Start: 09/20/2009 Last Modified: 05/01/2017 | | `91` | Brand Name Prescription Drug | The original formulation of a prescription drug, approved by the FDA for distribution. | Start: 09/20/2009 | | `92` | Generic Prescription Drug | Generic drugs are copies of brand-name drugs that have exactly the same dosage, intended use, effects, side effects, route of administration, risks, safety, and strength as the original drug. In other words, their pharmacological effects are exactly the same as those of their brand-name counterparts. | Start: 09/20/2009 | | `93` | Podiatry | Professional services of a physician or other healthcare provider for the care or treatment of conditions of the foot. | Start: 09/20/2009 | | `A6` | Psychotherapy | Professional services, including individual or group therapy by providers such as psychiatrists, psychologists, clinical social workers, or psychiatric nurses. | Start: 09/20/2009 | | `AD` | Occupational Therapy | Professional and facility occupational therapy services performed by an occupational therapist, physician or other healthcare provider at a hospital, office or other covered facility. | Start: 09/20/2009 | | `AF` | Speech Therapy | Professional and facility speech therapy services performed by a speech therapist, physician or other healthcare provider at a hospital, office or other covered facility. | Start: 09/20/2009 | | `AG` | Skilled Nursing Care | Services for a patient in a skilled nursing facility for the purpose of receiving medical care or other health services. | Start: 09/20/2009 | | `AI` | Substance Abuse | Services provided at a hospital, office or other covered facility as they are related to the diagnosis and treatment of Substance Abuse. | Start: 09/20/2009 | | `AL` | Optometry | Routine vision services furnished by an optometrist. May include coverage for eyeglasses, contact lenses, routine eye exams, and/or vision testing for the prescribing or fitting of eyeglasses or contact lenses. | Start: 09/20/2009 | | `AM` | Frames | The framework for a pair of eyeglasses | Start: 09/20/2009 | | `AO` | Lenses | A piece of transparent substance having two opposite surfaces either both curved or one curved and one plane, used in an optical device in correcting defects of vision. | Start: 09/20/2009 | | `AP` | Routine Eye Exam | A series of tests to evaluate an individual's vision and check for eye diseases. | Start: 09/20/2009 | | `AQ` | Nonmedically Necessary Physical (These physicals are required by other entities e.g., insurance application, pilot license, employment or school) | A physical examination performed on asymptomatic patients for medical screening purposes. | Start: 09/20/2009 | | `B2` | Brand Name Prescription Drug - Formulary | Lists of brand name drugs covered and published by the health plan/payer/processor/PBM to help physicians reach clinically and economically appropriate prescribing decisions for patients. | Start: 09/20/2009 | | `B3` | Brand Name Prescription Drug - Non-Formulary | A brand name drug that is not listed on the covered and published list of the health plan/payer/processor/PBM. | Start: 09/20/2009 | | `BB` | Psychiatric Treatment Partial Hospitalization | — | Start: 09/20/2009 Last Modified: 03/01/2023 | | `BC` | Day Care (Psychiatric) | — | Start: 09/20/2009 Last Modified: 03/01/2023 | | `BE` | Massage Therapy | The manipulation of muscles and other soft tissues of the body by a therapist for the treatment of health conditions such as pain, cancer, fibromyalgia, HIV/AIDS, depression. | Start: 09/20/2009 | | `BF` | Pulmonary Rehabilitation | Services and instructional guidance administered to an individual suffering from respiratory disease in an attempt to improve the quality of life for the patient. | Start: 09/20/2009 | | `BG` | Cardiac Rehabilitation | Services and instructional guidance rendered by a physician or other healthcare provider in a hospital or covered facility that are designed to help an individual recover from a cardiovascular event | Start: 09/20/2009 | | `BT` | Gynecological | Medical care and management of the female reproductive system and associated disorders provided by a physician or other healthcare provider. | Start: 09/20/2009 | | `BU` | Obstetrical | Medical care and management related to the care of a woman prior, during and after pregnancy, provided by a physician or other healthcare provider. | Start: 09/20/2009 | | `BY` | Physician Visit - Sick | Professional services rendered by a physician or other healthcare provider during a non-routine visit related to a illness. | Start: 09/20/2009 | | `BZ` | Physician Visit - Well | Professional services rendered by a physician or other healthcare provider during a routine or preventative care visit. | Start: 09/20/2009 | | `CK` | Screening X-ray | X-ray services provided by a physician or other healthcare provider for the purpose of preventative care. | Start: 09/20/2009 | | `CL` | Screening laboratory | Laboratory services provided by a physician or other healthcare provider for the purpose of preventative care. | Start: 09/20/2009 | | `CM` | Mammogram, High Risk Patient | Mammography services for patients that have been identified with a greater than normal risk for breast cancers and related diseases. | Start: 09/20/2009 | | `CN` | Mammogram, Low Risk Patient | Mammography services for patients that have been identified with a normal risk for breast cancers and related diseases. | Start: 09/20/2009 | | `CO` | Flu Vaccination | Services provided by a physician or other healthcare provider related to the administration of influenza virus vaccination. | Start: 09/20/2009 | | `DG` | Dermatology | Services provided by a physician or other healthcare provider involving the skin and its diseases. | Start: 09/20/2009 | | `DS` | Diabetic Supplies | Blood sugar (glucose) test strips, monitors, insulin, lancet devices and lancets, glucose control solutions used to monitor and assist in the treatment of diabetes. | Start: 09/20/2009 | | `E0` | Applied Behavioral Analysis Therapy | Services related to the assessment and treatment of learning and/or developmental disabilities to include techniques and principles to bring about meaningful and positive changes in behavior, improve attention, focus, memory, academics and/or increase language, communication and social skills. | Start: 09/20/2009 Last Modified: 07/01/2017 | | `E10` | Radiographs | An image or picture produced on a radiation-sensitive film emulsion by exposure to ionizing radiation direct through an area, region, or substance of interest, followed by chemical processing of the film | Start: 01/24/2010 | | `E11` | Diagnostic Imaging | The use of radiographic, sonographic, and other technologies to create a graphic depiction of the body parts in question. | Start: 01/24/2010 | | `E14` | Fixed Prosthodontics | The branch of prosthodontics concerned with the replacement or restoration of teeth by artificial substitutes that are not readily removable such as fixed partial dentures, pontics and abutments. | Start: 01/24/2010 | | `E15` | Removable Prosthodontics | The branch of prosthodontics concerned with the replacement or restoration of teeth by artificial substitutes that are readily removable such as a denture, partial denture and interim prosthesis. | Start: 01/24/2010 | | `E16` | Intraoral Images - Complete Series | Complete set of images using radiographic, sonographic, and other technologies representing an image or set of images within the oral cavity. | Start: 01/24/2010 | | `E17` | Oral Evaluation | The art and science of evaluation to make a clinical judgment or appraisal of a patient's dental health or condition. | Start: 01/24/2010 | | `E18` | Dental Prophylaxis | A series of procedures where plaque, calculus, and stain are removed from the teeth often referred to as "prophy" or teeth cleaning. | Start: 01/24/2010 | | `E19` | Panoramic Images | A tomogram of the jaws, taken with a specialized machine designed to present a panoramic view of the full circumferential length of the jaws on a single film. | Start: 01/24/2010 | | `E20` | Sealants | A resinous material designed for application to the occlusal surfaces of posterior teeth to seal the surface irregularities and prevent the carious process. | Start: 01/24/2010 | | `E21` | Fluoride Treatments | A separate process from dental prophylaxis of applying prescription strength fluoride product designed to prevent caries. | Start: 01/24/2010 | | `E22` | Dental Implants | A device, usually alloplastic, that is surgically inserted into or onto the oral tissue. To be used as a prosthodontic abutment, it should remain quiescent and purely secondary to local tissue physiology. | Start: 01/24/2010 | | `E23` | Temporomandibular Joint Dysfunction | Services related to the Impaired function of the temporomandibular articulation of the jaw. | Start: 01/24/2010 | | `E24` | Retail Pharmacy Prescription Drug | Dispenses prescription drugs and provides professional pharmacy services, such as clinical pharmacy consulting respective to the dispensing function. The entity may be a retail/chain or independent pharmacy or any other entity which dispenses prescription drugs. | Start: 06/06/2010 Last Modified: 11/01/2017 Stop: 11/01/2017 | | `E25` | Long Term Care Pharmacy | Long term care pharmacy serve the residents of nursing homes, assisted care facilities, extended care facilities, retirement homes, or post acute care. These are considered "closed door pharmacies" | Start: 06/06/2010 | | `E28` | Dietary/Nutritional Services | Nutrition and diet counseling such as: weight management, eating disorders, pregnancy, pediatric, food allergy, diabetes, celiac disease | Start: 01/29/2012 | | `E33` | Intensive Cardiac Rehabilitation | A group of physical activities designed to help a patient recover from a cardiovascular event | Start: 06/02/2013 | | `E36` | Convenience Care | A category of walk-in clinic located in retail stores, supermarkets and pharmacies that treat uncomplicated minor illnesses | Start: 06/02/2013 | | `E37` | Telemedicine | Services provided via telecommunication and/or information technology venues to provide clinical health services. _Technical Note:_ Services performed that are related to telemedicine; not a place of service. | Start: 07/01/2015 | | `E38` | Pharmacist Services | Clinical services provided by a pharmacist | Start: 07/01/2015 | | `E39` | Diabetic Education | Patient educational program designed to bring awareness of diabetes, what it takes to treat it, and the necessary changes that should be made to improve their lifestyle. | Start: 03/01/2016 | | `E40` | Early Intervention | Services related to treatment for babies or toddlers with developmental delays or disabilities. | Start: 11/01/2016 | | `EA` | Preventive Services | Preventive services such as check-ups, patient counseling and screenings to prevent illness, disease and other health-related problems. | Start: 09/20/2009 | | `EB` | Specialty Pharmacy | Specialty pharmacies are designed to efficiently deliver medications with specialized handling, storage, and distribution requirements. Specialty pharmacies are also designed to improve clinical and economic outcomes for patients with complex, often chronic and rare conditions, with close contact and management by clinicians. | Start: 09/20/2009 | | `EC` | Durable Medical Equipment New | New equipment needed for medical reasons to be used by a person that is ill or injured and is ordered by a health care provider for use in the home. | Start: 09/20/2009 | | `ED` | CAT Scan | A multi-dimensional diagnostic image of a cross section of the body that is useful in diagnosing disease | Start: 09/20/2009 | | `EF` | Contact Lenses | A thin lens placed directly on the surface of the eye. Contact Lenses are considered medical devices | Start: 09/20/2009 | | `EH` | Medically Tailored Meals (MTM) | Meals approved by a medical professional or healthcare plan that reflect appropriate dietary therapy for the individual | Start: 03/01/2023 | | `EJ` | IV Therapy | Intravenous (IV) therapy is a medical technique of administering fluids directly into a vein. | Start: 03/01/2023 | | `F1` | Medical Coverage | This code will be used by the payer on the 271 response to show coverage type. This code cannot be submitted with the 270 Inquiry. | Start: 11/01/2015 | | `F2` | Social Work Coverage | This code will be used by the payer on the 271 response to show coverage type. This code cannot be submitted with the 270 Inquiry. | Start: 11/01/2015 | | `F3` | Dental Coverage | This code will be used by the payer on the 271 response to show coverage type. This code cannot be submitted with the 270 Inquiry. | Start: 11/01/2015 | | `F4` | Hearing Coverage | This code will be used by the payer on the 271 response to show coverage type. This code cannot be submitted with the 270 Inquiry. | Start: 11/01/2015 | | `F5` | Prescription Drug Coverage | This code will be used by the payer on the 271 response to show coverage type. This code cannot be submitted with the 270 Inquiry. | Start: 11/01/2015 | | `F6` | Vision Coverage | This code will be used by the payer on the 271 response to show coverage type. This code cannot be submitted with the 270 Inquiry. | Start: 11/01/2015 | | `F7` | Orthodontia Coverage | This code will be used by the payer on the 271 response to show coverage type. This code cannot be submitted with the 270 Inquiry. | Start: 11/01/2015 | | `F8` | Mental Health Coverage | This code will be used by the payer on the 271 response to show coverage type. This code cannot be submitted with the 270 Inquiry. | Start: 11/01/2015 | | `GF` | Generic Prescription Drug - Formulary | Lists of generic drugs covered and published by the health plan/payer/processor/PBM to help physicians reach clinically and economically appropriate prescribing decisions for patients. | Start: 09/20/2009 | | `GN` | Generic Prescription Drug - Non-Formulary | A generic drug that is not listed on the covered and published list of the health plan/payer/processor/PBM. | Start: 09/20/2009 | | `MH` | Mental Health | Mental Health services provided by a physician or other healthcare providers who are trained and educated to perform services related to mental health and may be licensed or practice within the scope or licensure or training. | Start: 09/20/2009 | | `PE` | Positron Emission Tomography (PET) Scan | A nuclear imaging examination which reveals molecular function and activity. | Start: 09/20/2009 | | `PT` | Physical Therapy | Services and care related to evaluation and treatment of injury or disorders | Start: 09/20/2009 | | `SMH` | Serious Mental Health | Services for disorders characterized by severe deficits and pervasive impairment in multiple areas of development. | Start: 01/30/2011 | | `UC` | Urgent Care | Medical services and supplies provided by physicians or other healthcare providers for the treatment of an urgent medical condition or injury which requires medical attention. | Start: 09/20/2009 | | `UP` | Remote Patient Monitoring | A telehealth method using digital devices to collect patient health data and transmit to their provider. | Start: 03/01/2026 | | `UR` | Remote Therapeutic Monitoring | Services involving the remote collection, transmission, and clinical use of non-physiologic therapeutic data to monitor patient progress and adjust treatment plans. For example, musculoskeletal, respiratory, or other therapy-related metrics. | Start: 03/01/2026 | | `US` | Special Supplemental Benefits | Additional non-medical benefits provided to a member by their health plan. Examples may include over-the-counter (OTC) drugs, plan-approved food items, and/or utilities. | Start: 03/01/2026 | | `UT` | Dental Sleep Related Breathing Disorders and Airway Management Services | Services for the treatment, adjustment, and ongoing management of sleep-related breathing disorders (SRBD), including airway management procedures and oral appliance therapy (OAT). | Start: 07/01/2026 | #### Providers > A **provider** is a covered health care provider identified by a [National Provider Identifier (NPI)](https://www.cms.gov/regulations-and-guidance/administrative-simplification/nationalprovidentstand). > **Info** > > This setting allows you to choose a default provider, which you can override anytime by including `provider.npi` in the request body of [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth). **Click the Add Provider button to add one or more providers with the following fields:** **For an **Individual** type provider:** | Field | Description | Example | | --- | --- | --- | | First Name | First name of provider (e.g. from [NPPES registry](https://npiregistry.cms.hhs.gov/search)) | Richard | | Last Name | Last name of provider (e.g. from [NPPES registry](https://npiregistry.cms.hhs.gov/search)) | Hendricks | | NPI | [National Provider Identifier](https://www.cms.gov/regulations-and-guidance/administrative-simplification/nationalprovidentstand) (10 digits) | 0123456789 | | SSN | Social Security Number (9 digits) | 000-45-6789 | | Email | Email address of primary contact | [richard@hoolihealth.com](mailto:richard@hoolihealth.com) | | Phone | Phone number of primary contact | +1 (212) 555-0010 | | Address | (Physical and/or mailing) Address of primary contact | 5320 Newell Rd Palo Alto, CA 94303 | | Line 2 | Line 2 of address of primary contact | Apt 1 | **For an **Organization** type provider:** | Field | Description | Example | | --- | --- | --- | | Name | Name of provider (e.g. from [NPPES registry](https://npiregistry.cms.hhs.gov/search)) | Hooli Health | | NPI | [National Provider Identifier](https://www.cms.gov/regulations-and-guidance/administrative-simplification/nationalprovidentstand) (10 digits) | 0123456789 | | EIN | [Employer Identification Number](https://www.irs.gov/businesses/employer-identification-number) (9 digits) | 00-456789 | | Email | Email address of primary contact | [richard@hoolihealth.com](mailto:richard@hoolihealth.com) | | Phone | Phone number of primary contact | +1 (212) 555-0010 | | Address | (Physical and/or mailing) Address of primary contact | 5320 Newell Rd Palo Alto, CA 94303 | | Line 2 | Line 2 of address of primary contact | Apt 1 | **If necessary, click the star icon button to set one provider as the default.** #### Coverage Types > A **coverage type** is a type of health insurance plan that we determine based on the full insurance details (in the EDI 271), which are available when an eligibility check is run. > **Info** > > Coverage types are included in outputs (as `coverageTypes` in a [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity)). **Choose one or more coverage types to filter output health insurance plans by.** All are included by default, and you must have at least one selected. | Option | Description | | --- | --- | | Medical | Health insurance plan covers medical expenses | | Dental | Health insurance plan covers dental expenses | | Vision | Health insurance plan covers vision expenses | #### Network Rules > A **network rule** defines the network status of a health insurance plan: whether you consider that plan in or out of network, based on various conditions you define. > **Info** > > [Network decisions](https://docs.verified.inc/reference/data/outputs.md#network-decision) are included in outputs (as the `network` object in a [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity)), when an eligibility check is run and at least one network rule is defined. **Optionally, define one or more network rules.** Each rule can have one or more conditions. You can also manage network rules programmatically, with your brand API key, through the [Network Rules endpoints](https://docs.verified.inc/reference/api/endpoints.md#settings-brand-health-network-rules). Rules created there and rules created in the Dashboard are the same rules. | Field | Options | Description | Example | | --- | --- | --- | --- | | Name | Any string | Name for the rule | Rule 1: Aetna \| MA, NY, WA \| PPO \| Hooli Health \| Pied Piper - INN | | Status | - In Network - Out of Network - Indeterminate | Network status the rule returns when it matches a health insurance plan | In Network | | Starts | Any date | Date the rule should start applying (at start of day, UTC) | 2026-10-01 | | Ends | Any date (after Starts) | Date the rule should stop applying (at start of day, UTC) | 2027-10-01 | | Notes | Any string | Notes for the rule | Requires manual review | | Enabled | - Enabled (toggle on) - Disabled (toggle off) | Whether the rule is enabled | Enabled | | Metadata | One or more key/type/value sets | Metadata for the rule | `selfPay`/`boolean`/`true` | | ↳ Key | Any string (up to 64 characters) | Metadata key | `selfPay` | | ↳ Type | - `string` - `number` - `boolean` | Metadata value type | `boolean` | | ↳ Value | Any string, number or boolean (depends on type, up to 200 characters) | Metadata value | `true` | | Conditions | One or more key/operator/values sets | Conditions for the rule | Payer Name includes UnitedHealthcare, United Healthcare | | ↳ Key | - Payer - Payer Name - Patient State - Insurance Types - Plan Name - Related Entities - Group Number - Group Name | Condition key | Payer Name | | ↳ Operator | - equals - does not equal - includes - does not include | Condition operator (depends on key) | includes | | ↳ Values | One or more strings | Condition value | UnitedHealthcare, United Healthcare | #### Webhooks **Optionally, click the Add Webhook button to add a webhook, and fill out the following fields:** | Field | Options | Description | Example | | --- | --- | --- | --- | | URL | Any URL | The endpoint URL to send webhook requests to | [https://hooli.com/1-click-health](https://hooli.com/1-click-health) | | Authentication | - None - API Key (Headers) - Basic Auth | How to authenticate requests to your webhook | API Key (Bearer token, etc.) | | Header Name / Username | Any string | Name of the authentication header / Basic auth username | Authorization | | Header Value / Password | Any string | Value for the authentication header / Basic auth password | - | When you define a webhook, or rotate the secret of an existing webhook, we display a new signing secret but only once: store it securely. See [Signatures](https://docs.verified.inc/reference/webhooks.md#signatures) for how to use it to verify signatures over webhook payloads. > **The Webhook is Optional** > > Using a webhook is optional: it's just one way to receive [output](https://docs.verified.inc/reference/data/outputs.md#1-click-health) 1-Click Health data. You can alternatively poll the [`GET /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#get-1-clickhealth) endpoint to achieve the same thing. #### Enable/Disable Toggle **Click this to enable or disable 1-Click Health for your brand.** It will be enabled by default when you add a provider. ### Styling Settings > **Important** > > Styling settings only apply to **1-Click Health** using the **SDK** because they affect the user interface the SDK displays. (They also apply to [**Text to Signup**](https://docs.verified.inc/text-to-signup.md).) > > > So, if you are only using **1-Click Health** with the the **API**, you can ignore these settings. > **Verified Auto-Magically Configures Styling Settings** > > We use AI to auto-magically configure styling settings based on your email domain, so you don't have to do so manually from scratch! **Click the Styling tab to access these settings.** **Choose how to style the SDK:** | Setting | Options | Default | Description | | --- | --- | --- | --- | | Logo | Any square image (max size 200 KB, JPG or PNG) | - | Logo displayed to users | | Alignment | - Left - Center - Right - Stretch | Center | Alignment used for most text, buttons, and the powered by Verified graphic | | Font Family | Any [Google font](https://fonts.google.com/) | Lato | Font used for all elements | | 1-Click Word | - Signup - Login - Verify - Apply - Access - AutoFill | Signup | Word that appears after "1-Click" in the powered by Verified graphic | | Input Border Radius | Any number | 4 | Border radius used for all inputs | | Button Border Radius | Any number | 4 | Border radius used for all buttons | | Success Animation | - Full - None | Full | Whether to show the success animation | | Primary Color | Any hex code | #0DBC3D | Color used for primary buttons and success indicators | | Error Color | Any hex code | #EB0D28 | Color used for errors | | Muted Color | Any hex code | #BDBDBD | Color used for secondary buttons and text | | Background Color | Any hex code | #FFFFFF | Color used for background | | Graphic Color | - Green - Gray - Black - White | Green | Color of the Verified logo in the powered by Verified graphic | | Advanced Styling | Custom JSON | - | Custom JSON configuration that allows fine-grained control over any SDK component styling, using the [MUI theme system](https://mui.com/material-ui/customization/default-theme) | > **The SDK Automatically Adjusts Text Color for Contrast** > > The SDK will automaticallly adjust the color of text to achieve good contrast, given the color of an element. For example: > > > - If you set **Background Color** to be dark, the SDK will adjust text on the background to be light. > - If you set **Primary Color** to be light, the SDK will adjust text on buttons to be dark. --- **You're done with this Setup guide! ✅** Now, follow the [SDK Integration](https://docs.verified.inc/1-click-health/guides/sdk-integration.md) or [API Integration](https://docs.verified.inc/1-click-health/guides/api-integration.md) guide to integrate 1-Click Health into your application. --- Source: https://docs.verified.inc/1-click-health/guides/setup Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Previous: Guides — https://docs.verified.inc/1-click-health/guides.md Next: SDK Integration — https://docs.verified.inc/1-click-health/guides/sdk-integration.md --- # 1-Click Health: Supported Payers Source: https://docs.verified.inc/1-click-health/supported-payers.md The payer list on this page is loaded live from the Verified API, so it is not included inline here. Fetch it directly instead (no authentication required): ```bash curl 'https://core-api.verified.inc/v2/1-click/health/payers?$limit=50&$paginate=true' ``` Query parameters: - `$limit` and `$skip` page through the results. - `$search` filters by payer name, including a payer's other names. - `$sort[name]=1` sorts by name ascending, `-1` descending. Each payer has a name, one or more IDs (one of which is its primary ID), and `otherNames`: the other names the payer is known by, without its own name. For how a payer is used in a request, see the 1-Click Health API integration guide. --- Source: https://docs.verified.inc/1-click-health/supported-payers Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Previous: Payer Enrollments — https://docs.verified.inc/1-click-health/guides/payer-enrollments.md Next: Reference — https://docs.verified.inc/reference.md --- # 1-Click Health: Test Users Source: https://docs.verified.inc/1-click-health/test-users.md You can test 1-Click Health with mock data in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox), using either random inputs or our dedicated test users below. **These test users are keyed on first name, last name, and birth date.** Birth date is the unique input that distinguishes one test user from another, so always send the documented one. Every test user has plans with **real payers** (the payer `ids` work in other systems), and every plan returns the same information whether you use insurance autofill or an eligibility check. > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. > **What you get back** > > - **Always:** `memberId`, `payer`, `coverageTypes`, `serviceTypeCodes`, and `isMedicare` for each plan. > - **With an eligibility check** (the [Check After Autofill](https://docs.verified.inc/1-click-health/guides/setup.md#check-after-autofill) brand setting, `checkAfterAutofill: true` in the request, or `memberId` + `payer` as inputs): also the raw `edi_271`, the parsed [`eligibility`](https://docs.verified.inc/reference/api/types.md#parsededi271) with every field populated (plan name, group number and name, insurance type codes, member address, benefits, contacts), and `network` when your brand has Network Rules. > - **At most two plans** are returned per lookup. > - Your brand's [Coverage Types](https://docs.verified.inc/1-click-health/guides/setup.md#coverage-types) and [Service Type Codes](https://docs.verified.inc/1-click-health/guides/setup.md#service-type-codes) settings filter plans: see Brand settings that hide test users. ## How to Use Test Users ### API 1. Access the [Dashboard](https://dashboard.verified.inc/) and go the Brand Details page for your brand. 2. Copy a [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) API key for your brand. 3. Call [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth) with the test user's info (varies by user). 4. Receive output data via webhook or by polling the [`GET /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#get-1-clickhealth) endpoint. > **Coming from 1-Click Signup?** > > Every [1-Click Signup test user](https://docs.verified.inc/1-click-signup/test-users.md) is Richard Hendricks, born 1989-08-01, so passing its `identityUuid` to 1-Click Health lands on the main happy path below. --- ## Summary > **Important** > > See the later sections for full details on how each of these test users is designed to be used. ### Success | Outputs | Birth Date | First Name | Last Name | | --- | --- | --- | --- | | Multiple plans (Aetna PPO + UnitedHealthcare HMO), every field populated | 1989-08-01 | Richard | Hendricks | | Single plan (Aetna), no insurance type code | 1990-01-01 | Monica | Hall | | Dental plan | 1988-02-02 | Dinesh | Chugtai | | Vision plan | 1986-03-03 | Jared | Dunn | | Medical plan + dental plan | 1979-05-05 | Erlich | Bachman | | Indeterminate coverage (contact the payer) | 1992-04-04 | Nelson | Bighetti | | Cigna plan, Texas | 1978-09-09 | Russ | Hanneman | | Medicare, 65+, MBI member ID, `isMedicare: true` | 1952-03-15 | Peter | Gregory | | Medicare + Medicaid (dual coverage) | 1955-11-20 | Jack | Barker | | Medicare Advantage under a commercial payer | 1958-07-07 | Ron | LaFlamme | | Multiple plans (Aetna + UnitedHealthcare) | Any other birth date | Any string | Any string | ### Failure | Outputs | Birth Date | First Name | Last Name | | --- | --- | --- | --- | | No plans | 1991-01-01 | Gavin | Belson | ### Eligibility Check An eligibility check sends `memberId` and `payer`. Which inputs the test user is matched on depends on the user: **Matched on member ID.** Send the member ID and payer below; first name, last name and birth date can be anything (they are echoed back in the 271). Every plan in the Success tables works the same way with its own member ID and payer. | Outputs | Member ID | Payer | | --- | --- | --- | | Active coverage | `W345876123` | Aetna (`60054`) | | Active coverage | Any member ID from the Success tables | That plan's payer | | Inactive coverage (`coverageStatus: "inactive"`) | `INACTIVE60054` | Aetna (`60054`) | | No coverage (subscriber not found) | `NOTFOUND001` | Aetna (`60054`) | **Matched on name and birth date.** Send these exactly, with the payer; the member ID can be anything. | Outputs | Birth Date | First Name | Last Name | Payer | | --- | --- | --- | --- | --- | | Active coverage | 1995-08-19 | Bertram | Gilfoyle | Blue Cross Blue Shield of Michigan (`00710`) | | Active coverage | 1990-01-01 | Bertram | Gilfoyle | Anthem Blue Cross Blue Shield of New York (`803`) | | Active coverage | 1980-03-03 | Bertram | Gilfoyle | Cigna (`62308`) | --- ## Success Use these test users to go through successful 1-Click Health flows (where Verified returns health insurance plans). All inputs other than first name, last name, and birth date are optional; the address shown is the one the payer has on file, and it is echoed back in the 271 if you send one. ### Multiple Plans #### 1989-08-01 This is our primary test user, Richard Hendricks, and the one every [1-Click Signup test user](https://docs.verified.inc/1-click-signup/test-users.md) resolves to. Use him first. > **Yes, You Read That Right** > > This is Richard Hendricks from the show _Silicon Valley_! 😂 Inputs: | Input | Value | | --- | --- | | Birth Date | `1989-08-01` (`1989-08-02` also works, kept for compatibility) | | First Name | Richard | | Last Name | Hendricks | | Middle Name (optional) | Harrison | | Address (optional) | 5320 Newell Rd, Ste 200, Palo Alto, CA 94303 | | Sex (optional) | Male | Outputs: | | Plan 1 | Plan 2 | | --- | --- | --- | | Member ID | `A484069` | `B231615071` | | Payer | Aetna (`60054`) | UnitedHealthcare (`87726`) | | Plan name | AETNA CHOICE POS II | UHC CHOICE PLUS HMO | | Coverage types | medical | medical | | Insurance type codes | `PR` (PPO) | `HM` (HMO) | | Group | 123456 · PIED PIPER | 778899 · HOOLI | | `isMedicare` | false | false | | Related entities | AETNA BEHAVIORAL HEALTH (phone, fax, email) | OPTUMRX (phone, URL) | With an eligibility check, the parsed `eligibility` of plan 1 populates every field of [`ParsedEdi271`](https://docs.verified.inc/reference/api/types.md#parsededi271): individual and family deductibles with remaining amounts, out-of-pocket maximum, copay, coinsurance, a visit limitation, in-network and out-of-network entries, member address with line 2, and two contacts. See the sample 271 below. ### Single Plan #### 1990-01-01 Inputs: | Input | Value | | --- | --- | | Birth Date | `1990-01-01` (`1990-01-02` also works, kept for compatibility) | | First Name | Monica | | Last Name | Hall | | Address (optional) | 7500 N Glenoaks Blvd, Burbank, CA 91504 | Outputs: | | Plan 1 | | --- | --- | | Member ID | `A664048` | | Payer | Aetna (`60054`) | | Plan name | AETNA OPEN CHOICE | | Coverage types | medical | | Insurance type codes | none (the payer reported no code) | | Group | 654321 | | `isMedicare` | false | ### Dental and Vision #### 1988-02-02 | Input | Value | | --- | --- | | Birth Date | `1988-02-02` | | First Name | Dinesh | | Last Name | Chugtai | | | Plan 1 | | --- | --- | | Member ID | `D726687` | | Payer | Aetna (`60054`) | | Plan name | AETNA DENTAL PPO | | Coverage types | dental | | Service type codes | `35`, `23`, `24`, `25`, `26` | | Group | 111222 · PIED PIPER | #### 1986-03-03 | Input | Value | | --- | --- | | Birth Date | `1986-03-03` | | First Name | Jared | | Last Name | Dunn | | | Plan 1 | | --- | --- | | Member ID | `V726687` | | Payer | Aetna (`60054`) | | Plan name | AETNA VISION PREFERRED | | Coverage types | vision | | Service type codes | `AL`, `AM` | | Group | 111222 · PIED PIPER | > **Warning** > > A brand whose Coverage Types setting is Medical only, or whose Service Type Codes do not include `35` / `AL`, gets "No coverage found" for these two users. See Brand settings that hide test users. #### 1979-05-05 Erlich Bachman has a medical plan and a dental plan at two payers, so you can watch the Coverage Types setting remove one of them. | Input | Value | | --- | --- | | Birth Date | `1979-05-05` | | First Name | Erlich | | Last Name | Bachman | | | Plan 1 | Plan 2 | | --- | --- | --- | | Member ID | `A700002` | `B700002` | | Payer | Aetna (`60054`) | UnitedHealthcare Dental (`52133`) | | Plan name | AETNA CHOICE POS II | UHC DENTAL PPO | | Coverage types | medical | dental | | Insurance type codes | `PR` | none | | Group | 333444 · BACHMANITY | 333444 · BACHMANITY | ### Indeterminate Coverage #### 1992-04-04 The payer confirms a plan exists but asks you to call them: `eligibility.coverageStatus` is `indeterminate` and `eligibility.contacts` carries the number. | Input | Value | | --- | --- | | Birth Date | `1992-04-04` | | First Name | Nelson | | Last Name | Bighetti | | | Plan 1 | | --- | --- | | Member ID | `A700001` | | Payer | Aetna (`60054`) | | Coverage status | indeterminate | | Contacts | BEHAVIORAL HEALTH CARVE OUT, 800-555-1234 | | Network (with rules) | `INDETERMINATE` | ### Cigna #### 1978-09-09 | Input | Value | | --- | --- | | Birth Date | `1978-09-09` | | First Name | Russ | | Last Name | Hanneman | | Address (optional) | 1 Congress Ave, Austin, TX 78701 | | | Plan 1 | | --- | --- | | Member ID | `U12345678` | | Payer | Cigna (`62308`) | | Plan name | CIGNA OPEN ACCESS PLUS | | Coverage types | medical | | Insurance type codes | `PR` | | Group | 445566 · THREE COMMA CLUB | | State | TX | ### Medicare and Medicaid #### 1952-03-15 A 65+ user with Original Medicare. The member ID is a Medicare Beneficiary Identifier (MBI), so `isMedicare` is `true`. Also reachable by sending `"payer": { "id": "VERIFIED_MEDICARE" }`. | Input | Value | | --- | --- | | Birth Date | `1952-03-15` | | First Name | Peter | | Last Name | Gregory | | | Plan 1 | | --- | --- | | Member ID | `1EG4TE5MK73` | | Payer | Medicare (`MEDICARE`) | | Plan name | MEDICARE PART A AND PART B | | Coverage types | medical | | Insurance type codes | `MA`, `MB` | | `isMedicare` | true | #### 1955-11-20 A 65+ user with Medicare and Medicaid (Medi-Cal). `isMedicare` is `true` on the Medicare plan and `false` on the Medicaid plan; the Medicaid plan carries insurance type code `MC`. | Input | Value | | --- | --- | | Birth Date | `1955-11-20` | | First Name | Jack | | Last Name | Barker | | | Plan 1 | Plan 2 | | --- | --- | --- | | Member ID | `7W34Q29JT50` | `91234567A` | | Payer | Medicare (`MEDICARE`) | Medi-Cal (`MDCAL`) | | Plan name | MEDICARE PART A AND PART B | MEDI-CAL | | Coverage types | medical | medical | | Insurance type codes | `MA`, `MB` | `MC` | | `isMedicare` | true | false | #### 1958-07-07 A Medicare Advantage plan administered by a commercial payer. The member ID is payer-issued (not an MBI), but the 271 carries insurance type code `HN` (HMO Medicare Risk), so `isMedicare` is still `true`. | Input | Value | | --- | --- | | Birth Date | `1958-07-07` | | First Name | Ron | | Last Name | LaFlamme | | | Plan 1 | | --- | --- | | Member ID | `101234567890` | | Payer | Aetna (`60054`) | | Plan name | AETNA MEDICARE ADVANTAGE PPO | | Coverage types | medical | | Insurance type codes | `HN` | | `isMedicare` | true | ### Any Other Name and Birth Date Any first name, last name, and birth date that do not match a test user return two plans with real payers, with your inputs echoed back in the 271. This keeps demos and quick tests easy; use Gavin Belson to test the no-coverage path. | | Plan 1 | Plan 2 | | --- | --- | --- | | Member ID | `A618095` | `B895002692` | | Payer | Aetna (`60054`) | UnitedHealthcare (`87726`) | | Plan name | AETNA CHOICE POS II | UHC CHOICE PLUS HMO | | Coverage types | medical | medical | | Insurance type codes | `PR` | `HM` | | Group | 123456 · PIED PIPER | 778899 · HOOLI | ## Failure Use this test user to go through an unsuccessful 1-Click Health flow (where Verified does _not_ find health insurance plans). #### 1991-01-01 | Input | Value | | --- | --- | | Birth Date | `1991-01-01` | | First Name | Gavin | | Last Name | Belson | | Address (optional) | 3300 Palos Verdes Dr W, Rancho Palos Verdes, CA 90275 | Outputs: the [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) has status `FAILED` and `errors: [{ "message": "No coverage found" }]`. --- ## Eligibility Check To test an **[eligibility check](https://docs.verified.inc/1-click-health/guides/api-integration.md#eligibility-check)** instead of insurance autofill, send `memberId` and `payer` (for example Richard Hendricks with `memberId: "A484069"` and `payer: { "id": "60054" }`). Include `checkAfterAutofill: true`, or have the brand setting on, to receive `edi_271` and `eligibility`. How a test user is matched depends on the user: **Matched on member ID.** First name, last name and birth date can be anything; they are echoed back in the 271. | Member ID | Payer | Result | | --- | --- | --- | | `W345876123` | Aetna (`60054`) | Active coverage, AETNA CHOICE POS II | | Any member ID from the Success section | That plan's payer | Active coverage, the same plan | | `INACTIVE60054` | Aetna (`60054`) | Inactive coverage, AETNA CHOICE POS II terminated 2023-12-31 (`coverageStatus: "inactive"`) | | `NOTFOUND001` | Aetna (`60054`) | No coverage found (subscriber not found) | **Matched on name and birth date.** Send these exactly; the member ID can be anything. | First Name | Last Name | Birth Date | Payer | Result | | --- | --- | --- | --- | --- | | Bertram | Gilfoyle | 1995-08-19 | Blue Cross Blue Shield of Michigan (`00710`) | Active coverage | | Bertram | Gilfoyle | 1990-01-01 | Anthem Blue Cross Blue Shield of New York (`803`) | Active coverage | | Bertram | Gilfoyle | 1980-03-03 | Cigna (`62308`) | Active coverage | Any other member ID and payer returns "No coverage found". An inactive plan is still a result: the payer answered about the member you named, so the request succeeds and the plan comes back with `eligibility.coverageStatus` set to `"inactive"` (and the termination date in `eligibility.plan.terminationDate`). Only an unknown member fails with "No coverage found". Insurance autofill never returns inactive plans. --- ## Brand Settings That Hide Test Users Two brand settings filter plans after the payer answers, so a test user can legitimately return "No coverage found" on your brand: - **[Coverage Types](https://docs.verified.inc/1-click-health/guides/setup.md#coverage-types)** set to Medical only removes the dental and vision plans: Dinesh Chugtai and Jared Dunn return no coverage, Erlich Bachman returns his medical plan only. - **[Service Type Codes](https://docs.verified.inc/1-click-health/guides/setup.md#service-type-codes)** narrow the question. A plan is dropped when every specific code it answers is outside your list; the plan-level code `30` never filters. With the default (`30`) every user returns; with `30` and `98` the medical users return and the dental / vision users do not; with `30` and `35` only the dental plans return. --- ## Network Rules [Network Rules](https://docs.verified.inc/1-click-health/guides/setup.md#network-rules) belong to your brand, not to the test user, and the `network` object is only returned when an eligibility check ran. To see every outcome, create these rules on your Sandbox brand, either in the Dashboard or with the [Network Rules endpoints](https://docs.verified.inc/reference/api/endpoints.md#settings-brand-health-network-rules): | Rule | Status | Test users it matches | | --- | --- | --- | | Payer equals Aetna (`V404110`) and Insurance Type Codes include `PR` | In Network | Richard Hendricks (Aetna), Erlich Bachman (Aetna) | | Payer equals UnitedHealthcare (`V816685`) | Out of Network | Richard Hendricks (UnitedHealthcare) | | Payer equals Cigna (`V253146`) and State equals `TX` | In Network | Russ Hanneman | | Insurance Type Codes include `MA`, `MB`, `HN` | In Network | Peter Gregory, Jack Barker (Medicare), Ron LaFlamme | | Insurance Type Codes include `MC`, notes "Self-pay" | Out of Network | Jack Barker (Medi-Cal) | | Insurance Type Codes include "No insurance type code" | Indeterminate | Monica Hall, Nelson Bighetti, Dinesh Chugtai, Jared Dunn, Erlich Bachman (dental) | | (optional) Group Name includes `HOOLI` | In Network | Richard Hendricks (UnitedHealthcare): ties with the UnitedHealthcare rule, the two disagree, so the result is `INDETERMINATE` with both rules listed | Results come back ordered in network, then indeterminate, then out of network, so Richard Hendricks returns his Aetna plan first and Jack Barker his Medicare plan first. To create the first six rules in one call, send this array to [`POST /settings/brand/health/network-rules`](https://docs.verified.inc/reference/api/endpoints.md#post-settings-brand-health-network-rules) with your Sandbox API key. The call is all or nothing, and a rule whose conditions already exist on your brand is rejected as a duplicate, so it is safe to retry. To make these rules your brand's entire Sandbox set instead, send the same array as `rules` to [`POST /settings/brand/health/network-rules/replace`](https://docs.verified.inc/reference/api/endpoints.md#post-settings-brand-health-network-rules-replace), with `"dryRun": true` first to preview what it removes. **POST /settings/brand/health/network-rules Request Body (test user rules)** ```json [ { "name": "Aetna PPO - INN", "status": "IN_NETWORK", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] } ] }, { "name": "UnitedHealthcare - OON", "status": "OUT_OF_NETWORK", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V816685"] } ] }, { "name": "Cigna TX - INN", "status": "IN_NETWORK", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V253146"] }, { "key": "state", "operator": "EQUAL", "values": ["TX"] } ] }, { "name": "Medicare - INN", "status": "IN_NETWORK", "conditions": [ { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["MA", "MB", "HN"] } ] }, { "name": "Medicaid - self-pay", "status": "OUT_OF_NETWORK", "notes": "Self-pay", "conditions": [ { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["MC"] } ] }, { "name": "No insurance type code - indeterminate", "status": "INDETERMINATE", "conditions": [ { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["NONE"] } ] } ] ``` The optional seventh rule is one more create: `{ "name": "Hooli group - INN", "status": "IN_NETWORK", "conditions": [{ "key": "groupName", "operator": "INCLUDE", "values": ["HOOLI"] }] }`. --- ## Sample 271 The raw `edi_271` returned for Richard Hendricks' Aetna plan on an eligibility check, one segment per line for readability (the API returns it as one string). Its parsed form is the [`ParsedEdi271`](https://docs.verified.inc/reference/api/types.md#parsededi271) object. ```text ISA*00* *00* *ZZ*60054 *ZZ*Verified *260930*1015*^*00501*000000001*0*P*:~ GS*HB*60054*Verified*20260930*1015*1*X*005010X279A1~ ST*271*0001*005010X279A1~ BHT*0022*11*3E1F2A9C*20260930*101500~ HL*1**20*1~ NM1*PR*2*AETNA*****PI*60054~ PER*IC**TE*8005550154*UR*WWW.AETNA.COM~ HL*2*1*21*1~ NM1*1P*2*YOUR PROVIDER NAME*****XX*1234567890~ HL*3*2*22*0~ TRN*2*9260930101500001*9012345678~ NM1*IL*1*HENDRICKS*RICHARD*H***MI*A484069~ REF*6P*123456*PIED PIPER~ N3*5320 NEWELL RD*STE 200~ N4*PALO ALTO*CA*94303~ DMG*D8*19890801*M~ INS*Y*18*001*25~ DTP*291*RD8*20260101-20261231~ DTP*346*D8*20260101~ EB*1*IND*30^1^33^47^86^88^98^MH^UC*PR*AETNA CHOICE POS II~ EB*C*IND*30*PR*AETNA CHOICE POS II*23*1500*****Y~ EB*C*IND*30*PR*AETNA CHOICE POS II*29*750*****Y~ EB*C*FAM*30*PR*AETNA CHOICE POS II*23*3000*****Y~ EB*G*IND*30*PR*AETNA CHOICE POS II*23*8000*****Y~ EB*G*IND*30*PR*AETNA CHOICE POS II*29*6200*****Y~ EB*B*IND*98*PR*AETNA CHOICE POS II*27*30*****Y~ EB*A*IND*98*PR*AETNA CHOICE POS II***0.2****Y~ EB*F*IND*33*PR*AETNA CHOICE POS II*23***VS*20**Y~ EB*C*IND*30*PR*AETNA CHOICE POS II*23*3000*****N~ EB*A*IND*98*PR*AETNA CHOICE POS II***0.4****N~ EB*1*IND*MH*PR*AETNA CHOICE POS II~ LS*2120~ NM1*X3*2*AETNA BEHAVIORAL HEALTH~ PER*IC**TE*8005550143*FX*8005550144*EM*MEMBERS@AETNABH.COM~ LE*2120~ MSG*PRE-CERTIFICATION REQUIRED FOR INPATIENT ADMISSIONS~ SE*35*0001~ GE*1*1~ IEA*1*000000001~ ``` --- Source: https://docs.verified.inc/1-click-health/test-users Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Previous: User Experience — https://docs.verified.inc/1-click-health/user-experience.md Next: Guides — https://docs.verified.inc/1-click-health/guides.md --- # 1-Click Health: User Experience Source: https://docs.verified.inc/1-click-health/user-experience.md At Verified, we are experts in how to optimize onboarding flows to maximize conversion and give users the best possible experience. We've helped our customers onboard — and delight! — millions of new users. The user experience described in this guide is the result of countless hours of research, design, testing, and iteration by our team. > **Use Our SDK to Get This UX** > > **Our SDK implements this user experience, and we strongly recommend you use it.** If you instead choose to use our **API**, we recommend you implement a user experience similar to this one. Full details are below, but the basic user experience is: 1. **Confirm info** (autofilled by 1-Click Signup) or **enter info manually** 2. **Confirm health insurance** (autofilled by 1-Click Health) > **There Are Only a Few Screens!** > > This user experience may look complicated, and in some ways it is: achieving world class UX requires getting many small details right. But at its core, it's simple by design and takes only a few screens. Users complete 1-Click Health in less than 1 minute: try it yourself with a [custom demo](https://docs.verified.inc/custom-demo.md). ## Flow Chart ![1-Click Health flow chart](https://docs.verified.inc/assets/images/ux-flow-chart-1-click-health-d24655b7c349486d8c1186f0a81a833a.png) ↗️ [Open in new tab](https://docs.verified.inc/assets/files/ux-flow-chart-1-click-health-d24655b7c349486d8c1186f0a81a833a.png) (for easy zooming) > **Important** > > To implement this user experience yourself (which is only necessary if you choose the **API** integration type), without our SDK, you need to handle each action labeled Verified. ## Screens and Components --- ### Info _If you use 1-Click Signup to autofill inputs for 1-Click Health (which we strongly recommend), you can **use the [Confirm Your Info screen](https://docs.verified.inc/1-click-signup/user-experience.md#info) spec for 1-Click Signup.**_ _If instead you collect inputs manually for 1-Click Health, use the spec below._ #### Header > Enter Your Info #### Description > We’ll try to autofill your health insurance based on this info, so you don't have to enter it manually. #### First Name - Required - Auto focused - Helper: > Legal first name #### Last Name - Required - Helper: > Legal last name #### Birthday > _ _ / _ _ / _ _ _ _ - Required - “Birthday” not “Birth Date” because the former is friendlier - Helper: > MM/DD/YYYY - Calendar icon on right opens date picker (which defaults to 08/01/1989) - Opens numeric keyboard - Accepts only digits - Accepts OS autofill - Validates format - Auto formats to MM/DD/YYYY (most common US format) #### Address - Required, optional, or not included - Uses third party service (e.g. [Google Places API](https://developers.google.com/maps/documentation/places/web-service/overview)) to show autofill options when the user types - Expands to show full value (without Address Line 2), in two lines: 1. `{Address Line 1}, {Address Line 2}` 2. `{City}, {State} {ZIP Code}` #### Sex - Required, optional, or not included - Dropdown with options: Male, Female, and Non-Binary #### Social Security Number > _ _ _ - _ _ - _ _ _ _ - Required, optional, or not included - “Social Security Number” not “SSN” (unlike view state) for clarity - Opens numeric keyboard - Accepts only digits - Validates format - Auto formats to •••-••-NNNN (most common US format) - Masks first 5 digits, server side not client side - If starting with value: - If user starts to edit (by deleting one character), clear entire value #### Consent Language > By clicking "Continue", you agree that [Verified](https://verified.inc/) (`{Brand Name}`’s service provider) and its vendors may receive your personal info and provide `{Brand Name}` with more info about you, including your health insurance. - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Confirm > Confirm _Submits form with user's info._ - [Primary](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Opt Out > Don't Autofill My Insurance _Takes user to manual entry flow._ - [Muted](https://docs.verified.inc/1-click-signup/guides/setup.md#styling-settings) color --- ![Info screen, view state with the sex field](https://docs.verified.inc/assets/images/confirm-info-with-sex-786d980e91a17490109582c381346ead.png) _View State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/confirm-info-with-sex-786d980e91a17490109582c381346ead.png) ![Info screen with the minimal set of fields](https://docs.verified.inc/assets/images/enter-info-minimal-832775b241029d672c6f2e59c1eb4f17.png) _Modal State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/enter-info-minimal-832775b241029d672c6f2e59c1eb4f17.png) ![Info screen with all fields](https://docs.verified.inc/assets/images/enter-info-maximal-95b60d9914999b41f1dc97d0555ee7a8.png) _Edit State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/enter-info-maximal-95b60d9914999b41f1dc97d0555ee7a8.png) --- ### Health Insurance #### Open Modal > ? _Opens informational modal._ - [Muted](https://docs.verified.inc/1-click-health/guides/setup.md#styling-settings) color #### Close Modal > X _Closes informational modal._ - [Muted](https://docs.verified.inc/1-click-health/guides/setup.md#styling-settings) color - Clicking anywhere outside the modal should also close it #### Informational > Verified autofills your info from trusted sources so you don’t have to enter it manually. It’s fast, safe, and secure. - Graphic - Lock icon with: > Protected with bank level encryption #### Header > Confirm Your Health Insurance #### Description > Make sure everything is accurate. #### Powered by Verified - Black and Green variant _(Same asset list as User Experience: https://docs.verified.inc/1-click-verify/user-experience.md)_ #### Health Insurance > Health Insurance _Appears in view state._ Contains the two fields described below. If multiple plans are available: - Dropdown - Helper: > Choose the right insurance plan If only one plan is available: - Static text #### Insurer > Insurer _Appears in view state._ - “Insurer” not “Payer” because the former makes more sense to users - Shows payer name (`results[i].payer.name` from API response) #### Member ID > Member ID _Appears in view state._ - Middle characters masked. - Helper: > Partially hidden for your privacy #### Edit > Edit _Switches from view to edit state._ The entire data display area should be clickable as the Edit button, not just the button itself. - [Muted](https://docs.verified.inc/1-click-health/guides/setup.md#styling-settings) color #### Insurer _Appears in edit state._ - “Insurer” not “Payer” because the former makes more sense to users - Uses value selected in dropdown (from view state), if multiple values are available - Has clear ("X") button on right side that appears if there's any value - Uses [`GET /1-click/health/payers`](https://docs.verified.inc/reference/api/endpoints.md#get-1-clickhealthpayers) to show autofill options when the user types #### Member ID _Appears in edit state._ - Opens alphanumeric keyboard - Uses value selected in dropdown (from view state), if multiple values are available - If user starts to edit (by deleting one character), clear entire value #### Accuracy Confirmation > By clicking “Confirm”, you agree that the info above is accurate. - [Muted](https://docs.verified.inc/1-click-health/guides/setup.md#styling-settings) color #### Confirm > Confirm _Submits form with user's info._ - [Primary](https://docs.verified.inc/1-click-health/guides/setup.md#styling-settings) color --- ![Health insurance screen, view state with multiple plans](https://docs.verified.inc/assets/images/health-insurance-view-multiple-plans-tooltip-hidden-660017148855f2bdb2b4dc73630d9b30.png) _View State (Multiple Plans)_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/health-insurance-view-multiple-plans-tooltip-hidden-660017148855f2bdb2b4dc73630d9b30.png) ![Health insurance screen, view state with a single plan](https://docs.verified.inc/assets/images/health-insurance-view-single-plan-tooltip-hidden-1ea5ebde1553267d98a738c5b03b445b.png) _View State (Single Plan)_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/health-insurance-view-single-plan-tooltip-hidden-1ea5ebde1553267d98a738c5b03b445b.png) ![Health insurance screen with the informational modal open](https://docs.verified.inc/assets/images/health-insurance-view-tooltip-visible-cf90e851b2d194d8bbeaa4cf200fac9a.png) _Modal State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/health-insurance-view-tooltip-visible-cf90e851b2d194d8bbeaa4cf200fac9a.png) ![Health insurance screen, edit state](https://docs.verified.inc/assets/images/health-insurance-edit-2169fb4762dc8b8f72d8a6b5a90eacac.png) _Edit State_ ↗️ [Open in new tab](https://docs.verified.inc/assets/files/health-insurance-edit-2169fb4762dc8b8f72d8a6b5a90eacac.png) --- Source: https://docs.verified.inc/1-click-health/user-experience Section: 1-Click Health — https://docs.verified.inc/1-click-health.md Previous: Overview — https://docs.verified.inc/1-click-health/overview.md Next: Test Users — https://docs.verified.inc/1-click-health/test-users.md --- # Reference Source: https://docs.verified.inc/reference.md - [Data](https://docs.verified.inc/reference/data.md): 2 items - [SDK](https://docs.verified.inc/reference/sdk.md): 4 items - [API](https://docs.verified.inc/reference/api.md): 5 items - [Webhooks](https://docs.verified.inc/reference/webhooks.md): How to set up webhooks for Verified - [Native Mobile Module](https://docs.verified.inc/reference/native-mobile-module.md): Native mobile module to use with Verified products --- Source: https://docs.verified.inc/reference Previous: Supported Payers — https://docs.verified.inc/1-click-health/supported-payers.md Next: Data — https://docs.verified.inc/reference/data.md --- # Reference: API Source: https://docs.verified.inc/reference/api.md - [Authentication](https://docs.verified.inc/reference/api/authentication.md): How to authenticate to the Verified API - [Environments](https://docs.verified.inc/reference/api/environments.md): How to use Verified API environments - [Endpoints](https://docs.verified.inc/reference/api/endpoints.md): How to use Verified API endpoints - [Errors](https://docs.verified.inc/reference/api/errors.md): Verified API errors - [Types](https://docs.verified.inc/reference/api/types.md): Types used in the Verified API --- Source: https://docs.verified.inc/reference/api Section: Reference — https://docs.verified.inc/reference.md Previous: Types — https://docs.verified.inc/reference/sdk/types.md Next: Authentication — https://docs.verified.inc/reference/api/authentication.md --- # Reference: Authentication Source: https://docs.verified.inc/reference/api/authentication.md Requests to authenticated Verified API endpoints require an API key as an `Authorization` header value (_without_ a `Bearer` prefix). **Example Request** ```bash curl https://core-api.sandbox-verifiedinc.com/v2/1-click/verifications/channels \ -H "Authorization: YOUR_API_KEY" ``` You can access and manage the API keys for your brands in the Verified [Dashboard](https://dashboard.verified.inc/). > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). Your company account can have one or more brands, and each brand can have one or more API keys. Each API key is specific to a brand and an [environment](https://docs.verified.inc/reference/api/environments.md). > **Why Multiple Brands?** > > Your company account can have one or more brands. Generally, you'll only need one brand, but there are some cases where it's helpful to use multiple. For example: > > > - **If you have multiple products:** If you have products that go by different names, it can be useful to create different brands to help users know which product they're using 1-Click Signup for — and to help your team track metrics specific to that product. > - **If you want to try different brand settings:** If you want to change brand settings without affecting your existing implementation (even in Sandbox), you can duplicate your brand and configure different settings on the new brand. --- Source: https://docs.verified.inc/reference/api/authentication Section: Reference — https://docs.verified.inc/reference.md Previous: API — https://docs.verified.inc/reference/api.md Next: Environments — https://docs.verified.inc/reference/api/environments.md --- # Reference: Endpoints Source: https://docs.verified.inc/reference/api/endpoints.md > **Tip** > > Postman API documentation is available at [https://api.docs.verified.inc](https://api.docs.verified.inc/). > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. ## Client SDK ### `POST /client/1-click` [Run in Postman](https://api.docs.verified.inc/#cde4fdf8-1521-4da0-9280-094e1f550aa8) > Create a (one time use) session key for the client SDK | | | | --- | --- | | Method | `POST` | | Path | `/client/1-click` | > **Note** > > This endpoint is only relevant if you're using the **SDK** **integration type**. #### Request **POST /client/1-click Request Body** ```typescript { verificationUuid?: string, phone?: string, email?: string, birthDate?: string, ssn4?: string, fullName?: { firstName?: string, middleName?: string, lastName?: string }, address?: { line1?: string, line2?: string, city?: string, state?: string, zipCode?: string, country?: string } } ``` | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `verificationUuid` | Optional | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | - | Unique identifier for a [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) that can be passed to the SDK to skip the phone entry and verification steps | `"487246b0-e68c-451d-be8e-45cea0b1c7a2"` | | `phone` | Optional | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | - | User's phone number (in [E.164](https://www.twilio.com/docs/glossary/what-e164) format) | `"+12125550010"` | | `email` | Optional | `string` | Email | - | User's email address | `"richard@piedpiper.net"` | | `birthDate` | Optional | `string` | yyyy-MM-dd | - | User's birth date (in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox), this must be `"1989-08-01"` to pass validation) | `"1989-08-01"` | | `ssn4` | Optional | `string` | 4 digits (0-9) | - | Last 4 digits of user's Social Security Number (in [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox), this must be `"6789"` to pass validation) | `"6789"` | | `fullName` | Optional | `object` | Object with keys for one or more child credentials listed below | - | Full name | `{ "firstName": "Richard" }` | | ↳ `fullName.firstName` | Optional but Required with `fullName` | `string` | `cAse inSensiTive` | - | First name | `"Richard"` | | ↳ `fullName.middleName` | Optional | `string` | `cAse inSensiTive` | - | Middle name | `"Harrison"` | | ↳ `fullName.lastName` | Optional | `string` | `cAse inSensiTive` | - | Last name | `"Hendricks"` | | `address` | Optional | `object` | Object with keys for one or more child credentials listed below | - | Address | `{ "line1": "5320 Newell Rd", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }` | | ↳ `address.line1` | Optional | `string` | `cAse inSensiTive` | - | Line 1 of address | `"5320 Newell Rd"` | | ↳ `address.line2` | Optional | `string` | `cAse inSensiTive` | - | Line 2 of address | `""` | | ↳ `address.city` | Optional | `string` | `cAse inSensiTive` | - | City of address | `"Palo Alto"` | | ↳ `address.state` | Optional | `string` | - 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) - Full state/territory name ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-1) subdivision name) | - | State of address | - `"CA"` - `"California"` | | ↳ `address.zipCode` | Optional | `string` | - [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) - [ZIP+4](https://en.wikipedia.org/wiki/ZIP_Code#ZIP+4) (5 digits, 0-9 + `-` + 4 digits, 0-9) | - | ZIP Code of address | - `"94303"` - `"94303-2846"` | | ↳ `address.country` | Optional | `string` | - 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) - Full country name ([ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) English short name, currently always `"United States of America"`) | - | Country of address | - `"US"` - `"United States of America"` | > **Tip** > > If you don't have a user's phone number yet, call `POST /client/1-click` with an empty request body, and the SDK will prompt the user to enter their phone number. #### Response **POST /client/1-click Response Body** ```typescript { sessionKey: string } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `sessionKey` | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | Session key that can be used (one time only) to initialize the SDK | `"86227634-bd2e-479d-9541-2c8e7e2e1f6d"` | --- ## 1-Click Verify ### `GET /1-click/verifications/device-ip` > Get the IP address of a user's device | | | | --- | --- | | Method | `GET` | | Path | `/1-click/verifications/device-ip` | #### Request Call: ```text GET /1-click/verifications/device-ip ``` **client side, from the user's device.** > **Important** > > Unlike most Verified API endpoints, this is a public, unauthenticated endpoint. (Don't use your Verified API key, which you must only use server side.) > > > **You should call this endpoint from the user's device, NOT your server,** so that it returns the user's device IP address, which you can use with other endpoints. #### Response **GET /1-click/verifications/device-ip Response Body** ```typescript { deviceIp: string } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `deviceIp` | `string` | [IPv6 address](https://en.wikipedia.org/wiki/IPv6_address) | The IP address of the user's device | `::121:2555:0010` | --- ### `GET /1-click/verifications/channels` > Check the availability of 1-Click Verify channels | | | | --- | --- | | Method | `GET` | | Path | `/1-click/verifications/channels?deviceIp={deviceIp}` | #### Request Call: ```text GET /1-click/verifications/channels?deviceIp={deviceIp} ``` - For the `{deviceIp}` query parameter value: - Use the IP address of the user's device returned by `GET /1-click/verifications/device-ip`. #### Response **GET /1-click/verifications/channels Response Body** ```typescript { channels: { autofill: { available: boolean, // = brandApproved && deviceIpEligible brandApproved: boolean, deviceIpEligible: boolean }, silent: { available: boolean, // = brandApproved && deviceIpEligible brandApproved: boolean, deviceIpEligible: boolean }, sms: { available: boolean, // = brandApproved, currently brandApproved: boolean }, // Coming soon // email: { // available: boolean, // = brandApproved, currently // brandApproved: boolean // } } } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `channels` | `object` | Object with keys for all channels | Availability for all channels | - | | `channels.autofill` | `object` | Object with keys for autofill channel | Availability for the autofill channel | `{ "available": boolean, // brandApproved && deviceIpEligible "brandApproved": boolean, "deviceIpEligible": boolean }` | | `channels.autofill.available` | `boolean` | - | Whether the autofill channel is available (`= brandApproved && deviceIpEligible`) | `true` | | `channels.autofill.brandApproved` | `boolean` | - | Whether your brand is approved for the autofill channel | `true` | | `channels.autofill.deviceIpEligible` | `boolean` | - | Whether the user's device IP is eligible for the autofill channel | `true` | | `channels.sms` | `object` | Object with keys for SMS channel | Availability for the SMS channel | `{ "available": boolean }` | | `channels.sms.available` | `boolean` | - | Whether the SMS channel is available | `true` | | `channels.email` | `object` | Object with keys for email channel | Availability for the email channel | `{ "available": boolean }` | | `channels.email.available` | `boolean` | - | Whether the email channel is available | `true` | --- ### `POST /1-click/verifications` > Begin a verification flow | | | | --- | --- | | Method | `POST` | | Path | `/1-click/verifications` | #### Request **POST /1-click/verifications Request Body** ```typescript { channel: "autofill" | "silent" | "sms", // email coming soon deviceIp?: string, // required for autofill and silent channels phone?: string // required for silent and SMS channels, or if wanting to match user input to autofill output } ``` | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `channel` | Required | **`enum`** Possible values: - `"autofill"` - `"silent"` - `"sms"` - `"email"` Coming Soon | `snake_case` | - | Channel used for verification | `"autofill"` | | `deviceIp` | Optional but Required if `channel` is `"autofill"` or `"silent"` | `string` | [IPv6 address](https://en.wikipedia.org/wiki/IPv6_address) | - | IP address of user's device | `"::121:2555:0010"` | | `phone` | Optional but Required if `channel` is `"silent"` or `"sms"` | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | - | User's phone number (in [E.164](https://www.twilio.com/docs/glossary/what-e164) format) | `"+12125550010"` | #### Response When `channel` is set to `autofill` or `silent`, the response will be an HTTP `302` redirect and a `Location` header with a URL value. You should pass this URL to your client, on the user's device, and handle it as described in the 1-Click Verify API Integration guide, [for autofill](https://docs.verified.inc/1-click-verify/guides/api-integration.md#2-try-autofill-channel) and [for silent](https://docs.verified.inc/1-click-verify/guides/api-integration.md#b-try-silent-channel). The end result will be as shown below. Then `channel` is set to `sms`, the response body is directly as shown below. **POST /1-click/verifications Response Body** ```typescript { ...1ClickVerificationEntity // includes phone and verified status if autofill succeeds (and matches phone input if provided) } ``` See [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity). Here's an example with a verified status from the autofill channel: **POST /1-click/verifications Response Body Example (verified)** ```typescript { "uuid": "6232bdb2-5b92-405a-bf39-6147aef70ac1", "phone": "+12125550010", "channel": "autofill", "status": "verified", "verified": true, "createdAt": 1760053690000, "expiresAt": 1760053990000, "attemptsRemaining": 3 } ``` Here's an example with a pending status from the SMS channel: **POST /1-click/verifications Response Body Example (pending)** ```typescript { "uuid": "f5251850-496c-48cf-a4bd-d9d5ace22689", "phone": "+12125550010", "channel": "sms", "format": "linkAndCode", "status": "pending", "verified": false, "createdAt": 1760053695000, "expiresAt": 1760053995000, "attemptsRemaining": 3 } ``` --- ### `POST /1-click/verifications/{uuid}/deliver` > Deliver a verification message | | | | --- | --- | | Method | `POST` | | Path | `/1-click/verifications/{uuid}/deliver` | #### Request **POST /1-click/verifications/{uuid}/deliver Request Body** ```typescript { format?: "code" | "link" | "codeAndLink" | "linkAndCode", // defaults to code redirectUrl?: string, // only relevant if link format is included redirectUserAfter?: "phoneVerification" | "infoConfirmation" // only relevant if link format is included } ``` - For the `{uuid}` path parameter, use the value of the `uuid` included in the [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity) that's included in the response body of every 1-Click Verify endpoint. | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `format` | Optional | **`enum`** Possible values: - `"code"` - `"link"` - `"codeAndLink"` - `"linkAndCode"` | `camelCase` | `"code"` | Format used for verification message (see Verification SMS Formats below) | `"linkAndCode"` | | `redirectUrl` | Optional | `string` | [URL](https://url.spec.whatwg.org/) | Defined by the [**redirect URL**](https://docs.verified.inc/1-click-verify/guides/setup.md#redirect-url) brand setting in the [Dashboard](https://dashboard.verified.inc/) | Where 1-Click Verify redirects a user to (only relevant if link format is included) | `"https://hooli.com/verified/1-click/verify"` | | `redirectUserAfter` | Optional | **`enum`** Possible values: - `"phoneVerification"` (redirect after 1-Click Verify) - `"infoConfirmation"` (redirect after hosted 1-Click Signup/Health) | `camelCase` | Defined by the [**redirect user after**](https://docs.verified.inc/1-click-verify/guides/setup.md#redirect-user-after) brand setting in the [Dashboard](https://dashboard.verified.inc/) | When a user is redirected to the redirect URL (only relevant if link format is included) | `"phoneVerification"` | > **Verification SMS Formats** > > The content of the verification SMS depends on the format: > > > | Format | `format` | SMS Template | SMS Example | > | --- | --- | --- | --- | > | Code Default | `code` | > Enter this code to verify for `{Brand Name}`: 111111 | > Enter this code to verify for Hooli: 111111 | > | Link | `link` | > Click this link to verify for `{Brand Name}`: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > Click this link to verify for Hooli: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > | Code and Link | `codeAndLink` | > Enter this code to verify for `{Brand Name}`: 111111 > > > > Or, click this link: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > Enter this code to verify for Hooli: 111111 > > > > Or, click this link: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) | > | Link and Code | `linkAndCode` | > Click this link to verify for `{Brand Name}`: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) > > > > Or, enter this code: 111111 | > Click this link to verify for Hooli: [https://1-click.verified.inc/abcd1234](https://1-click.verified.inc/abcd1234) > > > > Or, enter this code: 111111 | #### Response **POST /1-click/verifications/{uuid}/deliver Response Body** ```typescript { ...1ClickVerificationEntity } ``` See [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity). Here's an example: **POST /1-click/verifications/{uuid}/deliver Response Body Example** ```typescript { "uuid": "f5251850-496c-48cf-a4bd-d9d5ace22689", "phone": "+12125550010", "channel": "sms", "format": "linkAndCode", "status": "sending", "verified": false, "createdAt": 1760053695000, "expiresAt": 1760053995000, "attemptsRemaining": 3 } ``` --- ### `POST /1-click/verifications/{uuid}/verify` > Verify a user submitted verification code | | | | --- | --- | | Method | `POST` | | Path | `/1-click/verifications/{uuid}/verify` | #### Request **POST /1-click/verifications/{uuid}/verify Request Body** ```typescript { code: string } ``` - For the `{uuid}` path parameter, use the value of the `uuid` included in the [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity) that's included in the response body of every 1-Click Verify endpoint. | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `code` | Required | `string` | 6 digits (0-9) | - | User submitted verification code | `"111111"` | #### Response **POST /1-click/verifications/{uuid}/verify Response Body** ```typescript { ...1ClickVerificationEntity } ``` See [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity). Here's an example: **POST /1-click/verifications/{uuid}/verify Response Body Example** ```typescript { "uuid": "f5251850-496c-48cf-a4bd-d9d5ace22689", "phone": "+12125550010", "channel": "sms", "format": "linkAndCode", "status": "verified", "verified": true, "createdAt": 1760053695000, "expiresAt": 1760053995000, "deliveredAt": 1760053699054, "verifiedAt": 1760053705000, "attemptsRemaining": 2 } ``` --- ### `GET /1-click/verifications/{uuid}` > Check the status of a verification flow | | | | --- | --- | | Method | `GET` | | Path | `/1-click/verifications/{uuid}` | #### Request Call: ```text GET /1-click/verifications/{uuid} ``` - For the `{uuid}` path parameter: - If the user comes from a redirect, use the value of the `verificationUuid` included as a URL parameter on the redirect URL. - Otherwise, use the value of the `uuid` included in the [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity) that's included in the response body of a relevant 1-Click Verify endpoint. #### Response **GET /1-click/verifications/{uuid} Response Body** ```typescript { ...1ClickVerificationEntity } ``` See [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity). Here's an example: **GET /1-click/verifications Response Body Example** ```typescript { "uuid": "f5251850-496c-48cf-a4bd-d9d5ace22689", "phone": "+12125550010", "channel": "sms", "format": "link", "status": "verified", "createdAt": 1760053695000, "expiresAt": 1760053995000, "verifiedAt": 1760053705000 } ``` --- ## 1-Click Signup ### `POST /1-click` [Run in Postman](https://api.docs.verified.inc/#6e50c931-255c-4318-9b82-020d6661f6a7) > Begin a 1-Click Signup flow | | | | --- | --- | | Method | `POST` | | Path | `/1-click` | > **Note** > > This endpoint is only relevant if you're using the **API** **integration type**. #### Request **POST /1-click Request Body** ```typescript { identityUuid?: string, verificationUuid?: string, phone?: string, email?: string, deviceIp?: string, birthDate?: string, ssn4?: string, fullName?: { firstName?: string, middleName?: string, lastName?: string }, address?: { line1?: string, line2?: string, city?: string, state?: string, zipCode?: string, country?: string }, credentialRequests?: CredentialRequest[] } ``` | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `identityUuid` | Optional | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | - | Unique identifier for a [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) that can be passed to hydrate data from an existing 1-Click Signup flow | `"7a57b225-7abb-499d-9b74-0934d15bc826"` | | `verificationUuid` | Optional but Required if `phone` is not included | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | - | Unique identifier for a [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) that can be passed to hydrate a verified phone number | `"487246b0-e68c-451d-be8e-45cea0b1c7a2"` | | `phone` | Optional but Required if `verificationUuid` is not included | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | - | User's phone number (in [E.164](https://www.twilio.com/docs/glossary/what-e164) format) | `"+12125550010"` | | `email` | Optional | `string` | Email | - | User's email address | `"richard@piedpiper.net"` | | `deviceIp` | Optional | `string` | [IPv6 address](https://en.wikipedia.org/wiki/IPv6_address) | - | IP address of user's device (which you can get using [`GET /1-click/verifications/device-ip`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications-device-ip)) | `"::121:2555:0010"` | | `birthDate` | Optional | `string` | yyyy-MM-dd | - | Birth date | `"1989-08-01"` | | `ssn4` | Optional | `string` | 4 digits (0-9) | - | Last 4 digits of Social Security Number | `"6789"` | | `fullName` | Optional | `object` | Object with keys for one or more child credentials listed below | - | Full name | `{ "firstName": "Richard", "lastName": "Hendricks" }` | | ↳ `fullName.firstName` | Optional | `string` | `cAse inSensiTive` | - | First name | `"Richard"` | | ↳ `fullName.middleName` | Optional | `string` | `cAse inSensiTive` | - | Middle name | `"Harrison"` | | ↳ `fullName.lastName` | Optional | `string` | `cAse inSensiTive` | - | Last name | `"Hendricks"` | | `address` | Optional | `object` | Object with keys for one or more child credentials listed below | - | Address | `{ "line1": "5320 Newell Rd", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }` | | ↳ `address.line1` | Optional | `string` | `cAse inSensiTive` | - | Line 1 of address | `"5320 Newell Rd"` | | ↳ `address.line2` | Optional | `string` | `cAse inSensiTive` | - | Line 2 of address | `""` | | ↳ `address.city` | Optional | `string` | `cAse inSensiTive` | - | City of address | `"Palo Alto"` | | ↳ `address.state` | Optional | `string` | - 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) - Full state/territory name ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-1) subdivision name) | - | State of address | - `"CA"` - `"California"` | | ↳ `address.zipCode` | Optional | `string` | - [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) - [ZIP+4](https://en.wikipedia.org/wiki/ZIP_Code#ZIP+4) (5 digits, 0-9 + `-` + 4 digits, 0-9) | - | ZIP Code of address | - `"94303"` - `"94303-2846"` | | ↳ `address.country` | Optional | `string` | - 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) - Full country name ([ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) English short name, currently always `"United States of America"`) | - | Country of address | - `"US"` - `"United States of America"` | | `credentialRequests` | Optional | `CredentialRequest[]` | See [`CredentialRequest`](https://docs.verified.inc/reference/api/types.md#credentialrequest) | Defined by the **default credential requests** brand setting in the [Dashboard](https://dashboard.verified.inc/) | List of [`CredentialRequest`](https://docs.verified.inc/reference/api/types.md#credentialrequest) objects (which encode which [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) you're asking for): an empty array tells us to source only [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata), no credentials | See [`CredentialRequest` example](https://docs.verified.inc/reference/api/types.md#example-credentialrequest) | > **Unknown Fields Are Rejected** > > The request body accepts only the fields listed above. A request with any other top-level field, including a different casing of a valid one (for example `birthdate` instead of `birthDate`), is rejected with a `400` whose message names the field and the closest valid one: > > > > > ```text > "birthdate" is not a valid field. Did you mean "birthDate"? > ``` ##### Default Credential Requests If you don't include `credentialRequests` in the request body, the [default credential requests](https://docs.verified.inc/1-click-signup/guides/setup.md#default-credential-requests) setting for your brand will apply. For reference, the standard credential requests (see [here](https://docs.verified.inc/1-click-signup/guides/setup.md#default-credential-requests) in the Setup guide) include the [core KYC data points](https://docs.verified.inc/reference/data/outputs.md#core-data), all set to optional: **Standard Credential Requests in Code** **Standard Credential Requests** ```typescript [ { "type": "FullNameCredential", "children": [ { "type": "FirstNameCredential" }, { "type": "MiddleNameCredential" }, { "type": "LastNameCredential" } ] }, { "type": "PhoneCredential" }, { "type": "AddressCredential", "multi": true, "children": [ { "type": "Line1Credential" }, { "type": "Line2Credential" }, { "type": "CityCredential" }, { "type": "StateCredential" }, { "type": "ZipCodeCredential" }, { "type": "CountryCredential" } ] }, { "type": "BirthDateCredential", }, { "type": "SsnCredential", } ] ``` > **An Empty Array Means Metadata Only** > > If you pass an empty array for `credentialRequests`, we'll source only [metadata](https://docs.verified.inc/reference/data/outputs.md#metadata), not any [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials). This is how you can source metadata only, if that's relevant for your use case. _You can do this without verifying the user's phone number, though you **must** verify their phone number before sourcing any credentials._ #### Response **POST /1-click Response Body** ```typescript { uuid: string, identity: 1ClickEntity } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `uuid` | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | Unique identifier for the [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) that will be returned at the end of the 1-Click Signup flow | `"535dba63-d4bd-442a-b3f6-21b785260a08"` | | `identity` | `1ClickEntity` | See [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) | A [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) object, which contains the user's verified data and metadata about it | See [`1ClickEntity` example](https://docs.verified.inc/reference/api/types.md#example-1clickentity) | --- ### `GET /1-click` [Run in Postman](https://api.docs.verified.inc/#e80daa1e-5337-4f6f-b769-d46a9bc72e0c) > Get data for a user who has completed a 1-Click Signup flow | | | | --- | --- | | Method | `GET` | | Path | `/1-click/{identityUuid}` | #### Request Call: ```text GET /1-click/{identityUuid} ``` - For the `{identityUuid}` path parameter, use the value of the `identityUuid` returned by the SDK or included as a URL parameter on the redirect URL. #### Response **GET /1-click Response Body** ```typescript { ...1ClickEntity } ``` See [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity). --- ## 1-Click Health ### `POST /1-click/health` [Run in Postman](https://api.docs.verified.inc/#6e50c931-255c-4318-9b82-020d6661f6a7) > Begin a 1-Click Health flow (for autofill, check, or both) | | | | --- | --- | | Method | `POST` | | Path | `/1-click/health` | > **Note** > > This endpoint is only relevant if you're using the **API** **integration type**. #### Request **POST /1-click/health Request Body** ```typescript { checkAfterAutofill?: boolean, // default defined by the Check After Autofill brand setting in the Verified Dashboard provider?: { npi: string // default defined by the Providers brand setting in the Verified Dashboard }, identityUuid?: string, // from 1-Click Signup response body externalReference?: string, // optional: your own reference string, to be included in responses fullName?: { firstName?: string, // required if no identityUuid middleName?: string, lastName?: string // required if no identityUuid }, birthDate?: string, // required if no identityUuid address?: { line1?: string, line2?: string, city?: string, state?: string, zipCode?: string, country?: string }, sex?: string, ssn?: string, payer?: { id?: string, // specifies payer (or payer group) name?: string, // searches for payer (or payer group): only use if id is not known }, memberId?: string, serviceCodes?: { serviceTypeCodes?: string[], procedureCodes?: { code: string, qualifier?: string, modifiers?: string[] }[] } } ``` | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `checkAfterAutofill` | Optional | `boolean` | - | Defined by the [Check After Autofill](https://docs.verified.inc/1-click-health/guides/setup.md#check-after-autofill) setting | Whether to automatically run an eligibility check for an autofilled health insurance plan | `true` | | `provider` | Optional | `object` | Object with key listed below | - | Provider information | `{ "npi": "0123456789" }` | | ↳ `provider.npi` | Required (if `provider` object is included) | `string` | 10 digits (0-9) | Defined by [Providers](https://docs.verified.inc/1-click-health/guides/setup.md#providers) setting | [National Provider Identifier](https://www.cms.gov/regulations-and-guidance/administrative-simplification/nationalprovidentstand) | `"0123456789"` | | `identityUuid` | Optional | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | - | Unique identifier for the [`1ClickEntity`](https://docs.verified.inc/reference/api/types.md#1clickentity) that will be returned at the end of the 1-Click Signup flow | `"535dba63-d4bd-442a-b3f6-21b785260a08"` | | `externalReference` | Optional | `string` | 1–256 characters | - | Your own reference string, echoed from `POST /1-click/health` request body if included | `"appointment-1042"` | | `fullName` | Optional but Required if no `identityUuid` | `object` | Object with keys for one or more child credentials listed below | - | Full name | `{ "firstName": "Richard", "lastName": "Hendricks" }` | | ↳ `fullName.firstName` | Optional but Required if no `identityUuid` | `string` | `cAse inSensiTive` | - | First name | `"Richard"` | | ↳ `fullName.middleName` | Optional | `string` | `cAse inSensiTive` | - | Middle name | `"Harrison"` | | ↳ `fullName.lastName` | Optional but Required if no `identityUuid` | `string` | `cAse inSensiTive` | - | Last name | `"Hendricks"` | | `birthDate` | Optional but Required if no `identityUuid` | `string` | yyyy-MM-dd | - | Birth date | `"1989-08-01"` | | `address` | Optional | `object` | Object with keys for one or more child credentials listed below | - | Address | `{ "line1": "5320 Newell Rd", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }` | | ↳ `address.line1` | Optional | `string` | `cAse inSensiTive` | - | Line 1 of address | `"5320 Newell Rd"` | | ↳ `address.line2` | Optional | `string` | `cAse inSensiTive` | - | Line 2 of address | `""` | | ↳ `address.city` | Optional | `string` | `cAse inSensiTive` | - | City of address | `"Palo Alto"` | | ↳ `address.state` | Optional | `string` | 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) | - | State of address | `"CA"` | | ↳ `address.zipCode` | Optional | `string` | [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) | - | ZIP Code of address | `"94303"` | | ↳ `address.country` | Optional | `string` | 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) | - | Country of address | `"US"` | | `sex` | Optional | **`enum`** Possible values: - `"Male"` - `"Female"` - `"Non-Binary"` | `Title Case` | - | Sex | `"Male"` | | `ssn` | Optional | `string` | 9 digits (0-9) | - | Social Security Number | `"000456789"` | | `payer` | Optional | `object` | Object with key described below | - | Payer (or payer group) for insurance autofill and/or eligibility check | - | | ↳ `payer.id` | Optional | `string` | - | - | Payer (or payer group) ID for insurance autofill and/or eligibility check: see [supported payers](https://docs.verified.inc/1-click-health/supported-payers.md) | `"VERIFIED_MEDICARE"` | | ↳ `payer.name` | Optional | `string` | - | - | Payer (or payer group) name for insurance autofill and/or eligibility check: see [supported payers](https://docs.verified.inc/1-click-health/supported-payers.md) (only use if payer ID is not known) | `"Aetna"` | | `memberId` | Optional | `string` | - | - | Member ID for eligibility check | `"A484069"` | | `serviceCodes` | Optional | `object` | Object with key described below | - | Service codes for autofill and/or check | - | | ↳ `serviceTypeCodes` | Optional | `string[]` | Array of `string`s | `["30"]` | List of [X12 service type codes](https://x12.org/codes/service-type-codes) for patient service | `["47", "AL", "F6"]` | | ↳ `procedureCodes` | Optional | `object[]` | Array of `object`s | `"30"` | [National Provider Identifier](https://www.cms.gov/regulations-and-guidance/administrative-simplification/nationalprovidentstand) | `[ { "code": "99213", "qualifier": "HC", "modifiers": ["25"] } ]` | | ↳ ↳ `procedureCodes[i]` | Optional | `object` | Object with keys described below | - | [National Provider Identifier](https://www.cms.gov/regulations-and-guidance/administrative-simplification/nationalprovidentstand) | `{ "code": "99213", "qualifier": "HC", "modifiers": ["25"] }` | | ↳ ↳ ↳ `procedureCodes[i].code` | Required (if `procedureCodes` object is included) | `string` | - 5 digits (for CPT code) - 1 letter and 4 digits (for HCPCS code) | - | [CPT or HCPCS procedure code](https://www.cms.gov/medicare/regulations-guidance/physician-self-referral/list-cpt-hcpcs-codes) | `"99213""` | | ↳ ↳ ↳ `procedureCodes[i].qualifier` | Optional | **`string enum`** Possible values: - `"AD"`: American Dental Association Codes) - `"CJ"`: Current Procedural Terminology (CPT) Codes - `"HC"`: Health Care Financing Administration Common Procedural Coding System (HCPCS) Codes - `"ID"`: International Classification of Diseases, 9th Revision, Clinical Modification (ICD-9-CM) - Procedure - `"IV"`: Home Infusion EDI Coalition (HIEC) Product/Service Code - `"N4"`: National Drug Code in 5-4-2 Format - `"ZZ"`: Mutually Defined Code identifying the type/source of the procedureCode. You can set this to AD - , CJ - , HC - , ID - , IV - , N4 - , or ZZ - . | 2 letters | `"HC"` | Type or source of procedure code | `"HC"` | | ↳ ↳ ↳ `procedureCodes[i].modifiers` | Optional | `string[]` | Array of `string`s | - | Array of [medical coding modifiers](https://www.aapc.com/resources/what-are-medical-coding-modifiers?srsltid=AfmBOoqpfNXqsgfTYsbnXiHBVGhUOJbewkkGbe4r98wp8tCDGPtiztjv) | `["25"]` | #### Response **POST /1-click/health Response Body** ```typescript { healthDataUuid: string, externalReference?: string, // your own reference string, included if passed to POST /1-click/health status: "PENDING" | "PROCESSING" | "SUCCEEDED" | "FAILED" | "PARTIAL" } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `healthDataUuid` | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | Unique identifier for the [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) that will be returned at the end of the 1-Click Health flow | `"9e12fe5b-5bb8-410a-ac6b-6e053e4c7e8d"` | | `externalReference` | `string` | 1–256 characters | Your own reference string, echoed from `POST /1-click/health` request body if included | `"appointment-1042"` | | `status` | **`enum`** Possible values: - `"PENDING"` - `"PROCESSING"` - `"SUCCEEDED"` - `"FAILED"` - `"PARTIAL"` | `UPPER_SNAKE_CASE` | Status of the 1-Click Health flow | `"PROCESSING"` | --- ### `GET /1-click/health` [Run in Postman](https://api.docs.verified.inc/#e80daa1e-5337-4f6f-b769-d46a9bc72e0c) > Get data for a user who has completed a 1-Click Health flow | | | | --- | --- | | Method | `GET` | | Path | `/1-click/health/{healthDataUuid}` | #### Request Call: ```text GET /1-click/health/{healthDataUuid} ``` - For the `{healthDataUuid}` path parameter, use the value of the `healthDataUuid` returned by the SDK or `POST /1-click/health`. #### Response **GET /1-click/health Response Body** ```typescript { ...1ClickHealthEntity } ``` See [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity). --- ### `GET /1-click/health/payers` [Run in Postman](https://api.docs.verified.inc/#e80daa1e-5337-4f6f-b769-d46a9bc72e0c) > Get all supported payers for 1-Click Health | | | | --- | --- | | Method | `GET` | | Path | `/1-click/health/payers` | #### Request Call: ```text GET /1-click/health/payers ``` You can optionally include query parameters, for example: ```text GET /1-click/health/payers?$search=aetna&$limit=10&$skip=0&$paginate=true ``` | Parameter | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `$search` | Optional | `string` | - | - | Search by payer name or ID | `aetna` | | `$limit` | Optional | `integer` | - | 10 | Number of payers per page | `100` | | `$skip` | Optional | `integer` | - | 0 | Number of payers to skip | `25` | | `$paginate` | Optional | `boolean` | - | - | Whether to return paginated results | `true` | > **Note** > > **This endpoint is unauthenticated.** #### Response Without query parameters, the response body will be unpaginated: **GET /1-click/health/payers Response Body (unpaginated)** ```typescript [ ...Payer ] ``` See [`Payer`](https://docs.verified.inc/reference/api/types.md#payer). This includes all [supported payers](https://docs.verified.inc/1-click-health/supported-payers.md). With query parameters, the response body will be paginated: **GET /1-click/health/payers?... Response Body (paginated)** ```typescript { total: integer, limit: integer, skip: integer, data: [ ...Payer ], } ``` This includes (under `data`) an array of payer objects for all [supported payers](https://docs.verified.inc/1-click-health/supported-payers.md) that match the query, with keys as described in the table below. | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `total` | `integer` | - | Number of payers | `3460` | | `limit` | `integer` | - | Number of payers per page | `100` | | `skip` | `integer` | - | Number of payers to skip | `25` | | `data` | `Payer[]` | Array of `Payer`s | Payers that match submitted query | - | | `data[i]` | `Payer` | See [`Payer`](https://docs.verified.inc/reference/api/types.md#payer) | Payer | See `Payer` [Example](https://docs.verified.inc/reference/api/types.md#example-payer) | ## Settings These endpoints allow you to manage your settings programmatically (rather than manually through the [Dashboard](https://dashboard.verified.inc/)). Settings are defined within an [environment](https://docs.verified.inc/reference/api/environments.md), so to configure them in both Sandbox and Production, you need to use the appropriate API key and base URL for each environment. > **Info** > > The path pattern is `/settings/{scope}/{product}/{resource}`. > > > Currently, we support the `brand` scope, `health` product (for 1-Click Health), and `network-rules` resource. ### Network Rules > Manage the [network rules](https://docs.verified.inc/1-click-health/guides/setup.md#network-rules) that produce the `network` objects (of [`NetworkDecision`](https://docs.verified.inc/reference/api/types.md#networkdecision) type) in 1-Click Health results These endpoints are equivalent to the Network Rules section of the [Dashboard](https://dashboard.verified.inc/): a rule written here and a rule written there are indistinguishable, and the same validation applies to both. > **Example Use** > > You can keep your payer network mapping (and anything you attach to it in `metadata`, such as an internal package or plan ID) in your own system and use these endpoints to update the network rules whenever anything changes. | Method | Path | Description | | --- | --- | --- | | `GET` | `/settings/brand/health/network-rules` | List your brand's network rules | | `GET` | `/settings/brand/health/network-rules/{uuid}` | Retrieve one network rule | | `POST` | `/settings/brand/health/network-rules` | Create one network rule, or several at once | | `POST` | `/settings/brand/health/network-rules/replace` | Replace all of your brand's network rules in one call | | `PATCH` | `/settings/brand/health/network-rules/{uuid}` | Update a network rule | | `DELETE` | `/settings/brand/health/network-rules/{uuid}` | Delete a network rule | #### Rule Object Every endpoint returns network rules as [`NetworkRule`](https://docs.verified.inc/reference/api/types.md#networkrule) objects with four additional properties that only the Network Rules endpoints expose: | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `number` | `integer` | Positive integer | Per-brand sequence number in creation order. Assigned by Verified, never changes, never reused. Used for the default `name` (`"Rule 7"`) | `7` | | `enabled` | `boolean` | - | Whether the rule is applied. A disabled rule is stored but never matches | `true` | | `createdAt` | `integer` | Unix epoch, milliseconds | When the rule was created | `1790000000000` | | `updatedAt` | `integer` | Unix epoch, milliseconds | When the rule was last updated | `1790000000000` | #### Rule Body - `POST` (create) and `POST .../replace` take rule bodies. - `PATCH` takes any subset of the same properties. - `uuid`, `number`, `createdAt` and `updatedAt` are assigned by Verified and are rejected if sent. | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `status` | Required | `enum` | `"IN_NETWORK"` \| `"OUT_OF_NETWORK"` \| `"INDETERMINATE"` | - | Network status the rule returns when it matches a health insurance plan | `"IN_NETWORK"` | | `conditions` | Required | `object[]` | At least one condition; see Conditions | - | Conditions that must all hold (AND) for the rule to match | See Conditions | | `name` | Optional | `string` | Non-empty | `"Rule {number}"` | Name for the rule | `"Aetna PPO - INN"` | | `notes` | Optional | `string` \| `null` | - | `null` | Free text, returned with the decision so your app can branch on it | `"No self pay"` | | `metadata` | Optional | `object` | Flat object of up to 20 entries; keys up to 64 characters; values `string` (up to 200 characters), `number` or `boolean` | `{}` | Your own key/value pairs, returned with the decision as `network.rules[i].metadata`. On `PATCH`, replaces the whole object | `{ "packageId": "4471", "selfPay": false }` | | `enabled` | Optional | `boolean` | - | `true` | Whether the rule is applied | `true` | | `startDate` | Optional | `string` \| `null` | yyyy-MM-dd | `null` | Date the rule starts applying (at start of day, UTC, inclusive) | `"2026-10-01"` | | `endDate` | Optional | `string` \| `null` | yyyy-MM-dd, after `startDate` | `null` | Date the rule stops applying (at start of day, UTC, exclusive) | `"2027-10-01"` | #### Conditions - A condition is `{ key, operator, values }`. - `values` is a non-empty array of strings, and several values amount to an inclusive OR. For example, `{ state EQUAL ["MN", "CA"] }` matches either Minnesota or California. - All conditions of a rule must hold. When several rules match a plan, the most specific one wins. | `key` | Type | Allowed `operator`s | Allowed `values` | Example | | --- | --- | --- | --- | --- | | `payerId` | enum | `EQUAL`, `NOT_EQUAL` | Verified payer IDs or payer group IDs from `GET /1-click/health/payers`. A payer group (for example Verified Blues) matches every payer in the group | `["V404110"]` | | `payerName` | text | `EQUAL`, `NOT_EQUAL`, `INCLUDE`, `NOT_INCLUDE` | Any text. `INCLUDE` is a case-insensitive substring match | `["Aetna"]` | | `state` | enum | `EQUAL`, `NOT_EQUAL` | Two-letter US state or territory codes (the patient's address state) | `["MA", "NY", "WA"]` | | `insuranceTypeCodes` | enum | `INCLUDE`, `NOT_INCLUDE` | X12 EB04 insurance type codes (listed below), plus `"NONE"` meaning the eligibility response carried no code. About 7 in 10 plans carry none, so `INCLUDE ["PR", "NONE"]` reads "PPO, or unknown" | `["PR", "PS"]` | | `planName` | text | `EQUAL`, `NOT_EQUAL`, `INCLUDE`, `NOT_INCLUDE` | Any text | `["PPO"]` | | `relatedEntities` | text | `EQUAL`, `NOT_EQUAL`, `INCLUDE`, `NOT_INCLUDE` | Any text (names of related entities on the eligibility response, for example a PBM or TPA) | `["OPTUMRX"]` | | `groupNumber` | text | `EQUAL`, `NOT_EQUAL`, `INCLUDE`, `NOT_INCLUDE` | Any text | `["123456-123-12345"]` | | `groupName` | text | `EQUAL`, `NOT_EQUAL`, `INCLUDE`, `NOT_INCLUDE` | Any text | `["Pied Piper"]` | > **No PHI in rules** > > Rules describe plans, not people. A text value that looks like a member ID (optional letters followed by six or more digits) or a date is rejected with the `PHI_SUSPECTED` error code. `groupNumber` is exempt from the member ID check, since group numbers legitimately look like one. **Insurance type codes (`insuranceTypeCodes` values)** | Code | Meaning | | --- | --- | | `NONE` | No insurance type code on the eligibility response | | `12` | Medicare Secondary Working Aged Beneficiary or Spouse with Employer Group Health Plan | | `13` | Medicare Secondary End-Stage Renal Disease Beneficiary in the Mandated Coordination Period | | `14` | Medicare Secondary, No-fault Insurance including Auto is Primary | | `15` | Medicare Secondary Worker's Compensation | | `16` | Medicare Secondary Public Health Service (PHS) or Other Federal Agency | | `41` | Medicare Secondary Black Lung | | `42` | Medicare Secondary Veteran's Administration | | `43` | Medicare Secondary Disabled Beneficiary Under Age 65 with Large Group Health Plan (LGHP) | | `47` | Medicare Secondary, Other Liability Insurance is Primary | | `AP` | Auto Insurance Policy | | `C1` | Commercial | | `CO` | COBRA | | `CP` | Medicare Conditionally Primary | | `D` | Disability | | `DB` | Disability Benefits | | `EP` | Exclusive Provider Organization (EPO) | | `FF` | Family or Friends | | `GP` | Group Policy | | `HM` | Health Maintenance Organization (HMO) | | `HN` | HMO - Medicare Risk (Medicare Advantage) | | `HS` | Special Low Income Medicare Beneficiary | | `IN` | Indemnity | | `IP` | Individual Policy | | `LC` | Long Term Care | | `LD` | Long Term Policy | | `LI` | Life Insurance | | `LT` | Litigation | | `MA` | Medicare Part A | | `MB` | Medicare Part B | | `MC` | Medicaid | | `MH` | Medigap Part A | | `MI` | Medigap Part B | | `MP` | Medicare Primary | | `OT` | Other | | `PE` | Property Insurance - Personal | | `PL` | Personal | | `PP` | Personal Payment (Cash - No Insurance) | | `PR` | Preferred Provider Organization (PPO) | | `PS` | Point of Service (POS) | | `QM` | Qualified Medicare Beneficiary | | `RP` | Property Insurance - Real | | `SP` | Supplemental Policy | | `TF` | Tax Equity Fiscal Responsibility Act (TEFRA) | | `WC` | Workers Compensation | | `WU` | Wrap Up Policy | #### Errors | Status | `name` | When | | --- | --- | --- | | `400` | `BadRequest` | The body or query has the wrong shape (`message: "validation failed"`), or a rule is invalid: `message` is `"Invalid network rule"` (or `"Invalid network rules"` for a batch) and `data.errors` lists every problem, see below | | `401` | `NotAuthenticated` | Missing or invalid API key, or a key blocked by an IP allowlist | | `403` | `Forbidden` | 1-Click Health is not contracted or is disabled for the brand | | `404` | `NotFound` | No rule with that `uuid` belongs to your brand | - Each entry of `data.errors` has a stable `code`, a human-readable `message`, and (when it concerns one condition) the condition's `index` plus its `key`, `operator` and offending `value`(s). - For a batch (an array sent to `POST`) or a `replace`, each entry also has `ruleIndex`, the position of the rule in the array you sent. - Every problem is reported at once, so one request tells you everything to fix. | `code` | Meaning | | --- | --- | | `UNKNOWN_KEY` | `key` is not one of the condition keys above | | `OPERATOR_NOT_ALLOWED_FOR_KEY` | `operator` is not allowed for that `key` (for example `INCLUDE` on `state`) | | `VALUE_SHAPE` | `values` is not a non-empty array of non-empty strings | | `UNKNOWN_ENUM_VALUE` | A value is not a known payer ID, state code or insurance type code | | `PHI_SUSPECTED` | A text value looks like a member ID or a date | | `DUPLICATE_CONDITIONS` | Another rule of your brand (its `uuid` is in `value`), or another rule in the same request, has exactly these conditions | | `DATE_RANGE_INVERTED` | `startDate` is not before `endDate` | | `METADATA_INVALID` | `metadata` exceeds the limits above | **400 Response Body Example** ```json { "name": "BadRequest", "message": "Invalid network rule", "code": 400, "className": "bad-request", "data": { "errors": [ { "code": "UNKNOWN_ENUM_VALUE", "index": 1, "key": "insuranceTypeCodes", "operator": "INCLUDE", "value": ["XX"], "message": "Unknown value(s) for \"insuranceTypeCodes\": XX" } ] } } ``` ### `GET /settings/brand/health/network-rules` > List your brand's network rules | | | | --- | --- | | Method | `GET` | | Path | `/settings/brand/health/network-rules` | #### Request Call: ```text GET /settings/brand/health/network-rules ``` You can optionally include query parameters, for example: ```text GET /settings/brand/health/network-rules?status=IN_NETWORK&metadata[key]=packageId&$limit=50 ``` | Parameter | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `$limit` | Optional | `integer` | 1 to 100 | 10 | Number of rules per page | `50` | | `$skip` | Optional | `integer` | - | 0 | Number of rules to skip | `50` | | `$sort[field]` | Optional | `1` \| `-1` | `field` is `number`, `name`, `status`, `enabled`, `createdAt` or `updatedAt` | `createdAt` ascending, then `number` | Sort order | `$sort[updatedAt]=-1` | | `uuid`, `number`, `name`, `status`, `enabled`, `createdAt`, `updatedAt` | Optional | - | Exact value, or an operator object: `$in`, `$nin`, `$ne`, `$lt`, `$lte`, `$gt`, `$gte` | - | Filter on a rule property | `status=OUT_OF_NETWORK`, `updatedAt[$gt]=1790000000000` | | `search` | Optional | `string` | 1 to 120 characters | - | Case-insensitive substring over `name` and `notes` | `search=self%20pay` | | `condition[key]` | Optional | `string` \| `string[]` | Condition key(s) | - | Rules that have a condition on any of these keys | `condition[key]=state` | | `condition[payerId]`, `condition[state]`, `condition[insuranceTypeCodes]` | Optional | `string` \| `string[]` | One code or several | - | Rules whose condition on that key includes the code (exact match) | `condition[payerId]=V404110` | | `condition[payerName]`, `condition[planName]`, `condition[relatedEntities]`, `condition[groupNumber]`, `condition[groupName]` | Optional | `object` | `{ value, operator? }` with `operator` one of `contains` (default), `equals`, `startsWith`, `endsWith` | - | Rules whose condition on that key matches the text | `condition[planName][value]=PPO` | | `metadata[key]` | Optional | `string` \| `string[]` | Metadata key(s) | - | Rules whose `metadata` has any of these keys | `metadata[key]=packageId` | | `metadata[value]` | Optional | `object` | `{ key, value, operator? }`, same text operators as above | - | Rules whose `metadata[key]` matches the text | `metadata[value][key]=packageId&metadata[value][value]=4471` | All filters combine with AND. #### Response **GET /settings/brand/health/network-rules Response Body** ```typescript { total: integer, limit: integer, skip: integer, data: [ ...NetworkRule // with number, enabled, createdAt, updatedAt ], } ``` `data` holds the rules that match the query, oldest first unless sorted otherwise, each as described under Rule Object. ### `GET /settings/brand/health/network-rules/{uuid}` > Retrieve one network rule | | | | --- | --- | | Method | `GET` | | Path | `/settings/brand/health/network-rules/{uuid}` | #### Request Call: ```text GET /settings/brand/health/network-rules/ab280ee0-5f66-4076-9d1b-255d5f0024e3 ``` #### Response `200` with the rule as described under Rule Object, or `404` if no rule with that `uuid` belongs to your brand. ### `POST /settings/brand/health/network-rules` > Create one network rule, or several at once | | | | --- | --- | | Method | `POST` | | Path | `/settings/brand/health/network-rules` | #### Request Send one rule body, or an array of 1 to 100 rule bodies to create several rules at once. **POST /settings/brand/health/network-rules Request Body (one rule)** ```json { "name": "Aetna PPO - INN", "status": "IN_NETWORK", "metadata": { "packageId": "4471" }, "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] } ] } ``` **POST /settings/brand/health/network-rules Request Body (several rules)** ```json [ { "status": "IN_NETWORK", "metadata": { "packageId": "4471" }, "conditions": [{ "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }] }, { "status": "OUT_OF_NETWORK", "notes": "No self pay", "metadata": { "packageId": "0000", "selfPay": false }, "conditions": [{ "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["MC"] }] } ] ``` A rule whose conditions exactly match another rule of your brand (regardless of order or letter case) is rejected with `DUPLICATE_CONDITIONS`, so retrying a create you are unsure about is safe. An array is all or nothing: every rule is validated against your existing rules and against the others in the array, and if any is invalid nothing is written and each error carries its `ruleIndex`. Rules are numbered consecutively in the order sent. #### Response `201` with the created rule as described under Rule Object, or an array of them in the order sent. **POST /settings/brand/health/network-rules Response Body (one rule)** ```json { "uuid": "ab280ee0-5f66-4076-9d1b-255d5f0024e3", "number": 7, "name": "Aetna PPO - INN", "status": "IN_NETWORK", "notes": null, "metadata": { "packageId": "4471" }, "enabled": true, "startDate": null, "endDate": null, "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] } ], "createdAt": 1790000000000, "updatedAt": 1790000000000 } ``` From the next eligibility check that matches this rule, the result carries `network.status: "IN_NETWORK"` and `network.rules[0].metadata.packageId: "4471"`; see [`NetworkDecision`](https://docs.verified.inc/reference/api/types.md#networkdecision). ### `POST /settings/brand/health/network-rules/replace` > Replace all of your brand's network rules in one call | | | | --- | --- | | Method | `POST` | | Path | `/settings/brand/health/network-rules/replace` | Use this when your rules live in your own system and you push the whole list on every change, instead of diffing against ours rule by rule. Every rule you send is validated first (including duplicates within the list). Then, in a single transaction, all of your brand's existing rules are deleted and the new ones inserted, numbered from 1 in the order sent. If anything is invalid, nothing is written. > **Warning** > > Rules get new `uuid`s on every replace. If your system needs to refer back to a rule, key on something you put in `metadata`, not on `uuid`. #### Request | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `rules` | Required | `object[]` | Array of rule bodies. An empty array removes all of your rules | - | The complete new set of rules | See below | | `dryRun` | Optional | `boolean` | - | `false` | Validate and report what would happen without writing anything. Call with `true` first, check the result, then call again without it | `true` | **POST /settings/brand/health/network-rules/replace Request Body** ```json { "dryRun": true, "rules": [ { "name": "Aetna PPO - INN", "status": "IN_NETWORK", "metadata": { "packageId": "4471" }, "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] } ] }, { "name": "Medicaid - self pay", "status": "OUT_OF_NETWORK", "notes": "No self pay", "metadata": { "packageId": "0000", "selfPay": false }, "conditions": [{ "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["MC"] }] } ] } ``` #### Response **POST /settings/brand/health/network-rules/replace Response Body** ```typescript { dryRun: boolean, // echoes the request removed: integer, // rules your brand had before (all of them) created: integer // rules in the new set } ``` **POST /settings/brand/health/network-rules/replace Response Body Example** ```json { "dryRun": true, "removed": 12, "created": 2 } ``` On a validation failure the response is a `400` whose `data.errors` entries each carry `ruleIndex`; see Errors. ### `PATCH /settings/brand/health/network-rules/{uuid}` > Update a network rule | | | | --- | --- | | Method | `PATCH` | | Path | `/settings/brand/health/network-rules/{uuid}` | #### Request Send any subset of the rule body properties. The whole rule, as it would be after the update, is validated again. `metadata` and `conditions` replace the stored value rather than merging into it. **PATCH /settings/brand/health/network-rules/{uuid} Request Body** ```json { "metadata": { "packageId": "4472" }, "enabled": false } ``` #### Response `200` with the updated rule as described under Rule Object (`updatedAt` changes), or `404` if no rule with that `uuid` belongs to your brand. ### `DELETE /settings/brand/health/network-rules/{uuid}` > Delete a network rule | | | | --- | --- | | Method | `DELETE` | | Path | `/settings/brand/health/network-rules/{uuid}` | #### Request Call: ```text DELETE /settings/brand/health/network-rules/ab280ee0-5f66-4076-9d1b-255d5f0024e3 ``` #### Response `200` with the deleted rule, or `404` if no rule with that `uuid` belongs to your brand. Rule numbers are not reused. --- Source: https://docs.verified.inc/reference/api/endpoints Section: Reference — https://docs.verified.inc/reference.md Previous: Environments — https://docs.verified.inc/reference/api/environments.md Next: Errors — https://docs.verified.inc/reference/api/errors.md --- # Reference: Environments Source: https://docs.verified.inc/reference/api/environments.md We expose two environments: **Sandbox** and **Production**. > **Use Sandbox for Development and Testing** > > **Please do all development work and testing against our [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox) environment,** which returns mock data. You can use our [Production](https://docs.verified.inc/reference/api/environments.md#production) environment when you're ready to go live. ## Sandbox | | | | --- | --- | | Domain | `sandbox-verifiedinc.com` | | Base URL | `https://core-api.sandbox-verifiedinc.com/v2` | > **Heads Up** > > The Sandbox domain is `sandbox-verifiedinc.com` but the Production domain is `verified.inc`. ### Mock Data In Sandbox, we return mock user data regardless of what phone (or email) [identifier](https://docs.verified.inc/reference/data/inputs.md#identifiers) you use. > **Use Your Own Phone Number** > > **We recommend that you use own phone number,** so you can succesfully receive SMS messages during testing. We return mock data for any phone number in Sandbox (other than those for specific [test users](https://docs.verified.inc/1-click-signup/test-users.md) designed to not return data). > **Use Our Test Users** > > **We recommend that you use our [test users](https://docs.verified.inc/1-click-signup/test-users.md),** which cover a wide variety of different test cases. If you'd like us to return custom mock data for your phone number(s), please email us at [Support@Verified.inc](mailto:Support@Verified.inc) — we're happy to enable that for you. ## Production | | | | --- | --- | | Domain | `verified.inc` | | Base URL | `https://core-api.verified.inc/v2` | > **Heads Up** > > The Sandbox domain is `sandbox-verifiedinc.com` but the Production domain is `verified.inc`. --- Source: https://docs.verified.inc/reference/api/environments Section: Reference — https://docs.verified.inc/reference.md Previous: Authentication — https://docs.verified.inc/reference/api/authentication.md Next: Endpoints — https://docs.verified.inc/reference/api/endpoints.md --- # Reference: Errors Source: https://docs.verified.inc/reference/api/errors.md ## Firewall Errors You will get a network error if your API request is blocked by our firewall. ### Generic | | | | --- | --- | | HTTP Status Code | `403` | **Firewall Error: 418 (Generic)** ```typescript { "error": "Request blocked by firewall", "message": "Your request was blocked by our firewall. Please contact us if you believe this was in error." } ``` ### API Key Used Client Side | | | | --- | --- | | HTTP Status Code | `418` | **Firewall Error: API Key Used Client Side** ```typescript { "error": "Request blocked by firewall", "message": "Your request was blocked by our firewall because your API key is being used client side. Verified API keys must only be used server side. Please contact us if you believe this was in error." } ``` > **Danger** > > **Never use Verified API keys client side. Only use them server side.** Verified API keys allow you to source sensitive data about users, so you must keep them secure. If you use a Verified API key client side, our firewall will block your request, and you'll get [this firewall error](https://docs.verified.inc/reference/api/errors.md#api-key-used-client-side). ### Rate Limit | | | | --- | --- | | HTTP Status Code | `429` | **Firewall Error: 429 (Rate Limit)** ```typescript { "error": "Request blocked by firewall", "message": "Your request was blocked by our firewall due to abnormally high request volume. Please contact us if you believe this was in error." } ``` ## Application Errors ### 1-Click Signup To handle application level errors (returned by Verified API endpoints) for 1-Click Signup, we recommend that you primarily use the response body's `data.errorCode`, which is a Verified specific error code. See Verified Error Codes below for descriptions of what each code means. #### `Error` Type _This definition is also in [`Error`](https://docs.verified.inc/reference/api/types.md#error) in [Types](https://docs.verified.inc/reference/api/types.md)._ **Error Type** ```typescript { name: string, message: string, code: number, className: string, data: { errorCode?: string, additionalInputs?: string[], // only for error code OCE011 inputAttemptsExceeded?: string[], // only for error code OCE019 identifiers?: { [identifierKey: string]: string }, verificationMethod?: { [identifierKey: string]: string }, riskSignals?: RiskSignals // only for error codes OCE011, OCE012, OCE013, OCE017, and OCE019 attemptsRemaining?: integer, // only for OCV error codes expiresAt?: integer // only for OCV error codes } } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `name` | `string` | `PascalCase` | Name of the error | `"BadRequest"` | | `message` | `string` | `Sentence case` | Message for developer that explains the error | `"Additional information is required to source data for user: birthDate"` | | `code` | `number` | 3 digits (0-9) | [HTTP response status code](https://httpwg.org/specs/rfc9110.html#overview.of.status.codes) | `400` | | `className` | `string` | `kebab-case` | Class of error | `bad-request` | | `data.errorCode` | **`enum`** See [Error Codes](https://docs.verified.inc/reference/api/errors.md#verified-error-codes) for possible values | 3 letters and 3 digits (0-9) | [Verified error code](https://docs.verified.inc/reference/api/errors.md#verified-error-codes) | `"OCE011"` | | `data.additionalInputs` | `string[]` | `camelCase` | Additional inputs to source [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) for user, where multiple values indicates **inclusive OR** (only included for [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011)) | `["birthDate", "ssn4"]` | | `data.inputAttemptsExceeded` | `string[]` | `camelCase` | Input(s) for which the attempts limit (3 for each input) has been exceeded (only included for [`OCE019`](https://docs.verified.inc/reference/api/errors.md#oce019)) | `["birthDate", "ssn4"]` | | `data.identifiers` | `object` | `camelCase` | [Identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers) includede in the request | `["birthDate", "ssn4"]` | | `data.verificationMethod` | `object` | `camelCase` | [Verification method](https://docs.verified.inc/reference/data/outputs.md#verification-method) for [identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers) includede in the request | `["birthDate", "ssn4"]` | | `identifierKey` | **`enum`** Possible values (see [identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers) for details): - `phone` - `email` | `camelCase` | The type of identifier | `"phone"` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | `object` | [Verified risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) associated with the 1-Click Signup event (only included for [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011), [`OCE012`](https://docs.verified.inc/reference/api/errors.md#oce012), [`OCE013`](https://docs.verified.inc/reference/api/errors.md#oce013), [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017), and [`OCE019`](https://docs.verified.inc/reference/api/errors.md#oce019)) | See [`RiskSignals` example](https://docs.verified.inc/reference/api/types.md#example-risksignals) | | `data.atteptsRemaining` | `integer` | Any number of digits (0-9) | How many verification attempts the user has remaining | `3` | | `data.expiresAt` | `integer` | [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) | When the verification expires (meaning it can no longer succeed) | `1760053995000` | ##### Example **Error Example** ```typescript { "name": "BadRequest", "message": "Additional information is required to source data for user: birthDate, ssn4" "code": 400, "className": "bad-request", "data": { "errorCode": "OCE011", "additionalInputs": ["birthDate", "ssn4"], // inclusive OR: can pass either or both in next call "identifiers": { "phone": "+12125550010", "email": "richard@piedpiper.com" }, "verificationMethod": { "phone": "otp", "email": "otp" }, "riskSignals": { "overall": { "score": 0, // always enabled "level": "low", // always enabled "recommendation": "allow", // always enabled "reasonCodes": [ // add on (ask Verified support to enable) "OCR10021" ] }, "phone": { // add on (ask Verified support to enable) "carrier": { "id": 0, "name": "Example Carrier" } "reasonCodes": [ "OCR20004", "OCR20005", "OCR20007", "OCR20101" ] }, "email": { // add on (ask Verified support to enable) "reasonCodes": [ "OCR60001", "OCR60002" ] } } } } ``` --- #### Verified Error Codes An `errorCode` is a Verified specific error code consisting of 3 letters and 3 numbers: - Codes that begin with `ERR` are generic. - Codes that begin with `SKE` are specific to the [`/client/1-click` path](https://docs.verified.inc/reference/api/endpoints.md#post-client1-click), which creates a session key for use in the Verified client [SDK](https://docs.verified.inc/1-click-signup/guides/sdk-integration.md). (`SKE` refers to a Session Key Error.) - Codes that begin with `OCE` are specific to 1-Click Signup: the `/1-click` path. (`OCE` refers to a One Click Error.) ##### Most Common Errors ###### `SKE001` | | | | --- | --- | | `message` | `"Brand cannot be used for SDK. Its integration type must be 'SDK'."` | > **Note** > > This error is only returned if you're using the **SDK** integration type. > **When This Is Returned** > > When `POST /client/1-click` is called for a brand not approved for the **SDK** integration type. > **How to Handle** > > Get approval for the **SDK** integration type, and then try the request again. --- ###### `SKE002` | | | | --- | --- | | `message` | `"Error resolving data"` | | `data.phone` | "phone" is required | > **Note** > > This error is only returned if you're using the **SDK** integration type. > **When This Is Returned** > > When an API key used to call POST /client/1-click (to create a session key for initializing the SDK) is for a brand whose **phoneVerificationType** is**byCustomer**, the phone number must be included in the request body. > **How to Handle** > > Include a phone number in the request body. --- ###### `OCE011` | | | | --- | --- | | `message` | `"Additional information is required to source data for user: {inputs}"` | | `data.additionalInputs` | `[inputs]` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When additional information is required to source verified user data through 1-Click Signup. > **How to Handle** > > Prompt the user to input the additional information, and then call the Verified API again. > **Inclusive OR** > > The `inputs` included in `message` and `data.additionalInputs` is a comma separated list of additional information. > > > **Multiple values always indicate an inclusive OR:** that is, you can **pass one or more** of the additional inputs. You do _not_ need to pass all of the additional inputs included in the list! > > > For example, if `inputs` is `birthDate, ssn4`, you can pass either the user's birth date or their SSN4 (or both). We always recommend passing just one first because both are required only very rarely and, if they _are_ both required, you will get another `OCE011` error code indicating that the other one is required. Currently `inputs` will always include one of more of birth date, SSN4, and first name — see the examples below. > **Tip** > > **We recommend using birth date over SSN4 when possible because:** > > > 1. Users are typically more comfortable providing their birthday. > 2. Some users will have an autofill option for birthday from their browser or OS. > 3. Everyone has a birthday, but not everyone has an SSN. **Example: Birth Date Only** ```typescript { ... "message": "Additional information is required to source data for user: birthDate" ... "data": { "errorCode": "OCE011", "additionalInputs": ["birthDate"], ... } } ``` **Example: Birth Date and First Name** ```typescript { ... "message": "Additional information is required to source data for user: birthDate, fullName.firstName" ... "data": { "errorCode": "OCE011", "additionalInputs": ["birthDate", "fullName.firstName"], // inclusive OR: can pass one or more in next call ... } } ``` **Example: Birth Date, First Name and SSN4** ```typescript { ... "message": "Additional information is required to source data for user: birthDate, fullName.firstName, ssn4" ... "data": { "errorCode": "OCE011", "additionalInputs": ["birthDate", "fullName.firstName", "ssn4"], // inclusive OR: can pass one or more in next call ... } } ``` --- ###### `OCE012` | | | | --- | --- | | `message` | `"BirthDate mismatch." \| "SSN4 mismatch." \| "FirstName mismatch." \| "BirthDate mismatch and SSN4 mismatch." \| "BirthDate mismatch and FirstName mismatch." \| "SSN4 mismatch and FirstName mismatch." \| "BirthDate mismatch and SSN4 mismatch and FirstName mismatch."` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When the inputted birth date or SSN4 (or both) does not match Verified records. > **How to Handle** > > Prompt the user to try again or confirm that the value they provided is accurate. If they confirm, fall back to a manual signup flow. > **Sandbox Validation** > > **In [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox), you need to do the following to pass validation:** > > > - If you use `birthDate`, use a value of `"1989-08-01"`. > - If you use `ssn4`, use a value of `"6789"`. > > > If you use other values, you'll get the [`OCE012`](https://docs.verified.inc/reference/api/errors.md#oce012) error code, which indicates that there's a mismatch. **Example: Birth Date Only** ```typescript { ... "message": "BirthDate mismatch." ... "data": { "errorCode": "OCE012", ... } } ``` **Example: Birth Date and First Name** ```typescript { ... "message": "BirthDate mismatch and FirstName mismatch." ... "data": { "errorCode": "OCE012", ... } } ``` --- ###### `OCE013` | | | | --- | --- | | `message` | `"No credentials found"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `true` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When Verified is unable to source data for a user. > **How to Handle** > > Fall back to a manual signup flow. See [Risk Signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) and [Verification Method](https://docs.verified.inc/reference/data/outputs.md#metadata) metadata for more information. --- ###### `OCE017` | | | | --- | --- | | `message` | `"1-Click Blocked: Risk Score Too High"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `true` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When Verified blocks returning data for a user because the risk score is too high (over 600). > **How to Handle** > > Reject the user or flag them and fall back to a manual signup flow. See [Risk Signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) and [Verification Method](https://docs.verified.inc/reference/data/outputs.md#metadata) metadata for more information. --- ###### `OCE019` | | | | --- | --- | | `message` | `"Maximum input attempts exceeded. Please try again later."` | | `data.inputAttemptsExceeded` | `[inputs]` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When the maximum number of birth date attempts has been exceeded. > **How to Handle** > > Consider flagging or restricting the phone number associated with the user, so a bad actor cannot keep trying new birth date values. The `inputs` included in `data.inputAttemptsExceeded` is a comma separated list of inputs for which the attempts limit has been exceeded. Currently `inputs` will always include one of more of birth date, SSN4, and first name — see the examples below. **The attempts limit for either type of input is 3 unique values within 30 minutes.** **Example: Birth Date Only** ```typescript { ... "message": "Maximum input attempts exceeded. Please try again later." ... "data": { "errorCode": "OCE019", "inputAttemptsExceeded": ["birthDate"], ... } } ``` **Example: SSN4 Only** ```typescript { ... "message": "Maximum input attempts exceeded. Please try again later." ... "data": { "errorCode": "OCE019", "inputAttemptsExceeded": ["ssn4"], ... } } ``` **Example: Both Birth Date and SSN4** ```typescript { ... "message": "Maximum input attempts exceeded. Please try again later." ... "data": { "errorCode": "OCE019", "inputAttemptsExceeded": ["birthDate", "ssn4"], ... } } ``` --- ###### `OCE020` | | | | --- | --- | | `message` | `"Brand cannot be used for 1-Click API"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | > **When This Is Returned** > > When `POST /1-click` is called for a brand not approved for the **API** integration type. > **How to Handle** > > Get approval for the **API** integration type, and then try the request again. --- ###### `OCE021` | | | | --- | --- | | `message` | `"User Opted Out"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | > **When This Is Returned** > > When the user has opted out of the 1-Click Signup flow in the SDK. > **How to Handle** > > Request **GET /1-click/:identityUuid** endpoint using **identityUuid** to retrieve the metadata. Learn how to use the metadata [here](https://docs.verified.inc/reference/api/types.md#1clickentity). See [Verification Method](https://docs.verified.inc/reference/data/outputs.md#metadata) metadata for more information. ##### All Errors ###### `ERR001` | | | | --- | --- | | `message` | `"1-Click error code"` | > **When This Is Returned** > > When there is a general, uncategorized 1-Click Signup error. > **How to Handle** > > Start 1-Click Signup over again, or fall back to a manual signup flow. --- ###### `OCE001` | | | | --- | --- | | `message` | `"1-Click error code"` | > **How to Handle** > > Start 1-Click Signup over again, or fall back to a manual signup flow. --- ###### `OCE002` | | | | --- | --- | | `message` | `"Unsupported phone number to use 1-Click"` | > **When This Is Returned** > > When the phone number is unsupported or has an invalid format. > **How to Handle** > > Prompt user to reenter phone number. > **You Should Never Get This Error** > > You should validate phone numbers client side, so you only call the Verified API with supported phone numbers. [Phone identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers) (which are passed as inputs to the Verified API) must be in [E.164](https://www.twilio.com/docs/glossary/what-e164) format: for example, `"+12125550010"`. 1-Click Signup currently only supports US phone numbers (ones that start with country code `+1`). --- ###### `OCE003` | | | | --- | --- | | `message` | `"Either 'phone' or 'email' is required"` | > **When This Is Returned** > > When you don't include a phone or email when calling POST /1-click. > **How to Handle** > > Prompt user to enter a phone number and/or email address, and then call POST /1-click with that phone and/or email. > **You Should Never Get This Error** > > You should always pass a phone number, email address, or both to the Verified API because 1-Click Signup does not work without them. --- ###### `OCE004` | | | | --- | --- | | `message` | `"User not found"` | > **When This Is Returned** > > When Verified cannot find a user. > **How to Handle** > > Fall back to a manual signup flow. > **You Should Never Get This Error** > > Verified should always either be able to return data for a user or return another error code, like OCE013. --- ###### `OCE005` | | | | --- | --- | | `message` | `"User Credentials or Credential Requests are missing"` | > **When This Is Returned** > > When Verified cannot find credentials or credential requests for the 1-Click flow. > **How to Handle** > > Fall back to a manual signup flow. > **You Should Never Get This Error** > > Verified should always be able to use default credential requests and return credentials for a user or return another error code, like OCE013. --- ###### `OCE006` | | | | --- | --- | | `message` | `"User identifier is missing"` | > **When This Is Returned** > > When you don't include a phone or email identifier when calling POST /1-click. > **How to Handle** > > Prompt user to enter one or more identifiers (phone number and/or email address), and then call POST /1-click with those identifiers. > **You Should Never Get This Error** > > You should always pass at least one identifier to the Verified API for 1-Click Signup to work. --- ###### `OCE007` | | | | --- | --- | | `message` | `"Unable to use 1-click due to missing mandatory credentials"` | > **When This Is Returned** > > When Verified cannot source data for a mandatory credential. > **How to Handle** > > Fall back to a manual signup flow. Consider setting the credential in question to be non-mandatory. You'll only get this error if you set `mandatory` to `yes` in the [credential request](https://docs.verified.inc/reference/api/types.md#credentialrequest) for a [credential](https://docs.verified.inc/reference/data/outputs.md#credentials). (Generally, you'd do this for the default credential requests defined for your brand in the [Dashboard](https://dashboard.verified.inc/), though you can also set it at the code level per API request.) We don't recommend doing this because it will prevent any credential data from being returned. In other words, if we can't source data for a mandatory credential, we won't return data for _any_ credentials. Instead, for `mandatory` we recommend using `if_available` or `no`. Then, if we can't source data for that credential, we'll still return data for other credentials. There's only a difference between those two options if you're using the **SDK** integration type, in which case `if_available` still marks the credential field as required, whereas `no` marks it as optional. --- ###### `OCE008` | | | | --- | --- | | `message` | `"Invalid or expired verification code"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | > **Note** > > This error is only returned if you're using the **Semi-Hosted (in v2.0)** integration type. > **When This Is Returned** > > When the user input does not match the verification code, or when the user input matches an expired verification code. > **How to Handle** > > Call the Verified API again to create a new verification code, send this code to the user via SMS, and prompt the user to input the new code. Verification codes expire after 5 minutes. --- ###### `OCE009` | | | | --- | --- | | `message` | `"Verification code is required"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | > **Note** > > This error is only returned if you're using the **Semi-Hosted (in v2.0)** integration type. > **When This Is Returned** > > When you don't include a user input for verification code calling GET /1-click. > **How to Handle** > > Prompt the user to input the verification code you sent them via SMS, and then call GET /1-click with that user input. > **You Should Never Get This Error** > > If you're using the Semi-Hosted integration type, you should always call GET /1-click with a user input for verification code. --- ###### `OCE010` | | | | --- | --- | | `message` | `"Missing required fields to autofill credentials"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | > **When This Is Returned** > > When Verified cannot source data for a mandatory credential. > **How to Handle** > > Fall back to a manual signup flow. Consider setting the credential in question to be non-mandatory. > **You Should Never Get This Error** > > Verified should always either be able to return data for a user or return another error code, like OCE013 or OCE007. --- ###### `OCE011` | | | | --- | --- | | `message` | `"Additional information is required to source data for user: {inputs}"` | | `data.additionalInputs` | `[inputs]` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When additional information is required to source verified user data through 1-Click Signup. > **How to Handle** > > Prompt the user to input the additional information, and then call the Verified API again. > **Inclusive OR** > > The `inputs` included in `message` and `data.additionalInputs` is a comma separated list of additional information. > > > **Multiple values always indicate an inclusive OR:** that is, you can **pass one or more** of the additional inputs. You do _not_ need to pass all of the additional inputs included in the list! > > > For example, if `inputs` is `birthDate, ssn4`, you can pass either the user's birth date or their SSN4 (or both). We always recommend passing just one first because both are required only very rarely and, if they _are_ both required, you will get another `OCE011` error code indicating that the other one is required. Currently `inputs` will always include one of more of birth date, SSN4, and first name — see the examples below. > **Tip** > > **We recommend using birth date over SSN4 when possible because:** > > > 1. Users are typically more comfortable providing their birthday. > 2. Some users will have an autofill option for birthday from their browser or OS. > 3. Everyone has a birthday, but not everyone has an SSN. **Example: Birth Date Only** ```typescript { ... "message": "Additional information is required to source data for user: birthDate" ... "data": { "errorCode": "OCE011", "additionalInputs": ["birthDate"], ... } } ``` **Example: Birth Date and First Name** ```typescript { ... "message": "Additional information is required to source data for user: birthDate, fullName.firstName" ... "data": { "errorCode": "OCE011", "additionalInputs": ["birthDate", "fullName.firstName"], // inclusive OR: can pass one or more in next call ... } } ``` **Example: Birth Date, First Name and SSN4** ```typescript { ... "message": "Additional information is required to source data for user: birthDate, fullName.firstName, ssn4" ... "data": { "errorCode": "OCE011", "additionalInputs": ["birthDate", "fullName.firstName", "ssn4"], // inclusive OR: can pass one or more in next call ... } } ``` --- ###### `OCE012` | | | | --- | --- | | `message` | `"BirthDate mismatch." \| "SSN4 mismatch." \| "FirstName mismatch." \| "BirthDate mismatch and SSN4 mismatch." \| "BirthDate mismatch and FirstName mismatch." \| "SSN4 mismatch and FirstName mismatch." \| "BirthDate mismatch and SSN4 mismatch and FirstName mismatch."` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When the inputted birth date or SSN4 (or both) does not match Verified records. > **How to Handle** > > Prompt the user to try again or confirm that the value they provided is accurate. If they confirm, fall back to a manual signup flow. > **Sandbox Validation** > > **In [Sandbox](https://docs.verified.inc/reference/api/environments.md#sandbox), you need to do the following to pass validation:** > > > - If you use `birthDate`, use a value of `"1989-08-01"`. > - If you use `ssn4`, use a value of `"6789"`. > > > If you use other values, you'll get the [`OCE012`](https://docs.verified.inc/reference/api/errors.md#oce012) error code, which indicates that there's a mismatch. **Example: Birth Date Only** ```typescript { ... "message": "BirthDate mismatch." ... "data": { "errorCode": "OCE012", ... } } ``` **Example: Birth Date and First Name** ```typescript { ... "message": "BirthDate mismatch and FirstName mismatch." ... "data": { "errorCode": "OCE012", ... } } ``` --- ###### `OCE013` | | | | --- | --- | | `message` | `"No credentials found"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `true` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When Verified is unable to source data for a user. > **How to Handle** > > Fall back to a manual signup flow. See [Risk Signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) and [Verification Method](https://docs.verified.inc/reference/data/outputs.md#metadata) metadata for more information. --- ###### `OCE014` | | | | --- | --- | | `message` | `"1-Click Request Expired"` | > **When This Is Returned** > > When a 1-Click Signup request is expired. > **How to Handle** > > Start 1-Click Signup over again. > **You Should Never Get This Error** > > Verified should always return error code OCE015 instead because the 1ClickEntity is deleted when it expires. 1-Click requests expire in 60 minutes. --- ###### `OCE015` | | | | --- | --- | | `message` | `"1-Click Not Found"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | > **When This Is Returned** > > When a 1-Click Signup request does not exist, for example when it has been deleted. > **How to Handle** > > Start 1-Click Signup over again. 1-Click requests expire in 60 minutes. --- ###### `OCE016` > 1-Click Conflict Request for Phone Number | | | | --- | --- | | `message` | `"1-Click Conflict Request for this Phone Number, Please Try Again"` | This error indicates a conflict due to the phone number being used in multiple 1-Click Signup requests simultaneously. --- ###### `OCE017` | | | | --- | --- | | `message` | `"1-Click Blocked: Risk Score Too High"` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `true` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When Verified blocks returning data for a user because the risk score is too high (over 600). > **How to Handle** > > Reject the user or flag them and fall back to a manual signup flow. See [Risk Signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) and [Verification Method](https://docs.verified.inc/reference/data/outputs.md#metadata) metadata for more information. --- ###### `OCE018` | | | | --- | --- | | `message` | `"Maximum code attempts exceeded. Please start a new 1-Click flow."` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | > **Note** > > This error is only returned if you're using the **Semi-Hosted (in v2.0)** integration type. > **When This Is Returned** > > When the maximum number of verification code attempts has been exceeded. > **How to Handle** > > Start 1-Click Signup over again. Consider flagging or restricting the phone number associated with the user. The maximum number of verification code attempts is 3. --- ###### `OCE019` | | | | --- | --- | | `message` | `"Maximum input attempts exceeded. Please try again later."` | | `data.inputAttemptsExceeded` | `[inputs]` | | `data.identifiers` | `{ [identifierType: string]: string }` | | `data.verificationMethod` | `{ [identifierType: string]: string }` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | > **When This Is Returned** > > When the maximum number of birth date attempts has been exceeded. > **How to Handle** > > Consider flagging or restricting the phone number associated with the user, so a bad actor cannot keep trying new birth date values. The `inputs` included in `data.inputAttemptsExceeded` is a comma separated list of inputs for which the attempts limit has been exceeded. Currently `inputs` will always include one of more of birth date, SSN4, and first name — see the examples below. **The attempts limit for either type of input is 3 unique values within 30 minutes.** **Example: Birth Date Only** ```typescript { ... "message": "Maximum input attempts exceeded. Please try again later." ... "data": { "errorCode": "OCE019", "inputAttemptsExceeded": ["birthDate"], ... } } ``` **Example: SSN4 Only** ```typescript { ... "message": "Maximum input attempts exceeded. Please try again later." ... "data": { "errorCode": "OCE019", "inputAttemptsExceeded": ["ssn4"], ... } } ``` **Example: Both Birth Date and SSN4** ```typescript { ... "message": "Maximum input attempts exceeded. Please try again later." ... "data": { "errorCode": "OCE019", "inputAttemptsExceeded": ["birthDate", "ssn4"], ... } } ``` ### 1-Click Health 1-Click Health errors are returned via `errors` in a [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity). ### 1-Click Verify #### Limits | Name | Value | Description | | --- | --- | --- | | Verification Message Expiration | 5 minutes | Time before a verification message (for example containing a verification code) expires | | Verification Deletion | 24 hours | Time before a [`1ClickVerificationEntity`](https://docs.verified.inc/reference/api/types.md#1clickverificationentity) is deleted | | Maximum Verification Attempts | 3 | Maximum number of times a user can attempt to verify, for a given verification flow | | Maximum Verification Message Deliveries | 3 | Maximum number of times a verification message can be delivered, for a given verification flow | #### Verified Error Codes An `errorCode` is a Verified specific error code consisting of 3 letters and 3 numbers: - Codes that begin with `ERR` are generic. - Codes that begin with `OCV` are specific to 1-Click Verify: the `/1-click/verifications` path. (`OCV` refers to One Click Verify.) ###### `OCV001` | | | | --- | --- | | `message` | `"Invalid or expired verification code"` | | `data.attemptsRemaining` | `integer` | | `data.expiresAt` | `integer` | > **When This Is Returned** > > When the user submitted verification code is invalid or expired. > **How to Handle** > > If there are attempts remaining, resend the verification message. Otherwise, start a new verification flow. --- ###### `OCV002` | | | | --- | --- | | `message` | `"Maximum verification attempts exceeded"` | | `data.attemptsRemaining` | `0` | | `data.expiresAt` | `integer` | > **When This Is Returned** > > When the user submitted verification code has been tried too many times. > **How to Handle** > > Start a new verification flow. --- ###### `OCV003` | | | | --- | --- | | `message` | `"Cannot resend code for this verification"` | | `data.attemptsRemaining` | `integer` | | `data.expiresAt` | `integer` | > **When This Is Returned** > > When the verification message cannot be delivered again because the verification status is verified, expired, or failed. > **How to Handle** > > Start a new verification flow. --- ###### `OCV004` | | | | --- | --- | | `message` | `"Maximum send attempts exceeded"` | | `data.attemptsRemaining` | `integer` | | `data.expiresAt` | `integer` | > **When This Is Returned** > > When the verification message has been delivered too many times. > **How to Handle** > > Start a new verification flow. --- ###### `OCV005` | | | | --- | --- | | `message` | `"Verification not found"` | > **When This Is Returned** > > When the 1-Click Verification has been deleted. > **How to Handle** > > Start a new verification flow. --- ###### `OCV006` | | | | --- | --- | | `message` | `"Unsupported channel"` | > **When This Is Returned** > > When the channel submitted is not supported. > **How to Handle** > > Start a new verification flow with a supported channel. --- ###### `OCV007` | | | | --- | --- | | `message` | `"Verification expired"` | | `data.attemptsRemaining` | `0` | | `data.expiresAt` | `integer` | > **When This Is Returned** > > When the 1-Click Verification has expired. > **How to Handle** > > Start a new verification flow. --- ###### `OCV008` | | | | --- | --- | | `message` | `"Autofill failed"` | > **When This Is Returned** > > When the autofill channel fails for any reason. > **How to Handle** > > Fall back to the silent (or SMS) channel. --- ###### `OCV009` | | | | --- | --- | | `message` | `"Phone number country code is not supported."` | > **When This Is Returned** > > When the phone number country code is not for the US (+1). > **How to Handle** > > Start a new verification flow with a supported country code. --- ###### `OCV010` | | | | --- | --- | | `message` | `"Silent failed"` | > **When This Is Returned** > > When the silent channel fails for any reason. > **How to Handle** > > Fall back to the SMS channel. --- ###### `OCV011` | | | | --- | --- | | `message` | `"Autofill not eligible." \| "Silent not eligible."` | > **When This Is Returned** > > When the device IP is not eligible for the autofill or silent channel. > **How to Handle** > > Fall back to the silent or SMS channel. --- Source: https://docs.verified.inc/reference/api/errors Section: Reference — https://docs.verified.inc/reference.md Previous: Endpoints — https://docs.verified.inc/reference/api/endpoints.md Next: Types — https://docs.verified.inc/reference/api/types.md --- # Reference: Types Source: https://docs.verified.inc/reference/api/types.md ## 1-Click Verify ### `1ClickVerificationEntity` **1ClickVerificationEntity Type** ```typescript { uuid: string, deviceIp?: string, phone?: string, channel: "textToSignup" | "autofill" | "silent" | "sms", format?: "code" | "link" | "codeAndLink" | "linkAndCode", // only relevant for the SMS channel status: "pending" | "sending" | "delivered" | "verified" | "expired" | "failed", verified: boolean, createdAt: integer, expiresAt: integer, deliveredAt?: integer, verifiedAt?: integer, attemptsRemaining?: integer } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `uuid` | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | Unique identifier for the `1ClickVerificationEntity` | `"535dba63-d4bd-442a-b3f6-21b785260a08"` | | `deviceIp` | `string` | [IPv6 address](https://en.wikipedia.org/wiki/IPv6_address) | IP address of user's device (which you can get using [`GET /1-click/verifications/device-ip`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications-device-ip)) | `"::121:2555:0010"` | | `phone` | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | User's phone number (in [E.164](https://www.twilio.com/docs/glossary/what-e164) format) | `"+12125550010"` | | `channel` | **`enum`** Possible values: - `"textToSignup"` - `"autofill"` - `"silent"` - `"sms"` - `"email"` Coming Soon | `camelCase` | The channel used for verification | `"textToSignup"` | | `format` | **`enum`** Possible values: - `"code"` - `"link"` - `"codeAndLink"` - `"linkAndCode"` | `camelCase` | The format of the verification message (only relevant for the SMS channel) | `"link"` | | `status` | **`enum`** Possible values: - `"pending"` - `"sending"` - `"delivered"` - `"verified"` - `"expired"` - `"failed"` | `camelCase` | The status of the verification | `"delivered"` | | `verified` | `boolean` | `boolean` | Whether the phone can currently be considered verified | `true` | | `createdAt` | `integer` | [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) | When the verification started | `1760053695000` | | `expiresAt` | `integer` | [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) | When the verification expires (meaning it can no longer succeed) | `1760053995000` | | `deliveredAt` | `integer` | [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) | When the verification message was delivered | `1760053699054` | | `verifiedAt` | `integer` | [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) | When the verification succeeded | `1760053705000` | | `attemptsRemaining` | `integer` | Any number of digits (0-9) | How many verification attempts the user has remaining | `3` | #### Example **1ClickVerificationEntity Example (autofill channel)** ```typescript { "uuid": "535dba63-d4bd-442a-b3f6-21b785260a08", "deviceIp": "::121:2555:0010", "phone": "+12125550010", "channel": "autofill", "status": "verified", "verified": true, "createdAt": 1760053695000, "expiresAt": 1760053995000, "deliveredAt": 1760053699054, "verifiedAt": 1760053705000, "attemptsRemaining": 2 } ``` --- ## 1-Click Signup ### `CredentialRequest` **CredentialRequest Type** ```typescript { type: string, mandatory?: "yes" | "no" | "if_available", children?: CredentialRequest[], multi?: boolean } ``` | Property | Required? | Type | Format | Default | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | `type` | Required | **`enum`** Most common values: - `"PhoneCredential"` - `"EmailCredential"` - `"FullNameCredential"` - `"FirstNameCredential"` - `"MiddleNameCredential"` - `"LastNameCredential"` - `"BirthDateCredential"` - `"AddressCredential"` - `"Line1Credential"` - `"Line2Credential"` - `"CityCredential"` - `"StateCredential"` - `"ZipCodeCredential"` - `"CountryCredential"` - `"SsnCredential"` | `PascalCase` | - | The type of user data a credential has | `"FirstNameCredential"` | | `mandatory` | Optional | `enum` | `snake_case` | `"no"` | Whether the credential is required, not required, or required if available (accepted values `"yes"`, `"no"`, and `"if_available"`) | `"if_available"` | | `children` | Optional | `CredentialRequest[]` | See [`CredentialRequest`](https://docs.verified.inc/reference/api/types.md#credentialrequest) | - | List of child `CredentialRequest`s relative to the parent `CredentialRequest` | Child `CredentialRequest`s with `type`s `"FirstNameCredential"` and `"LastNameCredential"` relative to a parent `CredentialRequest` with type `"FullNameCredential"` | | `multi` | Optional | `boolean` | `boolean` | `false` | Whether the credential should contain multiple values if available | `true` | #### Example **CredentialRequest** ```typescript { "type": "AddressCredential", "multi": true, "children": [ { "type": "Line1Credential", "mandatory": "if_available" }, { "type": "Line2Credential", "mandatory": "no" }, { "type": "CityCredential", "mandatory": "if_available" }, { "type": "StateCredential", "mandatory": "if_available" }, { "type": "ZipCodeCredential", "mandatory": "if_available" }, { "type": "CountryCredential", "mandatory": "if_available" } ] } ``` --- ### `1ClickEntity` **1ClickEntity Type** ```typescript { identifiers: { [identifierKey: string]: string }, credentials: { [credentialKey: string]: string // Single string value when `multi` is false and `children` isn't included in the credential requests | string[] // Array of string values when `multi` is true and `children` isn't included in the credential requests | Object // Single object value when `multi` is false and `children` is included in the credential requests | [Object] // Array of object values when `multi` is true and `children` is included in the credential requests }, metadata: { identifiers: { [identifierKey: string]: { [metadataKey: string]: string } }, credentials: { [credentialKey: string]: { // Follows the same structure as `credentials` and maintains the same order for array items when `multi` is set to `true` [metadataKey: string]: string // Single string value when `multi` is false and `children` isn't included in the credential requests | string[] // Array of string values when `multi` is true and `children` isn't included in the credential requests | Object // Single object value when `multi` is false and `children` is included in the credential requests | [Object] // Array of object values when `multi` is true and `children` is included in the credential requests } } } } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `identifiers` | `object` | See above | User [identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers), keyed on `identifierKey` | See Example `1ClickEntity` | | `identifierKey` | **`enum`** Possible values (see [identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers) for details): - `phone` - `email` | `camelCase` | The type of identifier | `"phone"` | | `credentials` | `object` | See above | User [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials), keyed on `credentialKey` | See Example `1ClickEntity` | | `credentialKey` | **`enum`** Possible values (see [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) for details): - `phone` - `email` - `fullName.firstName` - `fullName.middleName` - `fullName.lastName` - `address.line1` - `address.line2` - `address.city` - `address.state` - `address.zipCode` - `address.country` - `birthDate` - `ssn` - `sex` | `camelCase` | The type of user data a credential has | `"firstName"` | | `metadata` | `object` | See above | [Metadata](https://docs.verified.inc/reference/data/outputs.md#metadata), keyed on `metadataKey` | See Example `1ClickEntity` | | `metadataKey` | **`enum`** Possible values: - `id` - `verificationMethod` - `status` - `issuanceDate` - `expirationDate` | `camelCase` | Any additional data that's not a user's identity data (identifiers or credentials) | `"verificationMethod"` | The data keyed on a `credentialKey` will be one or more credential values. This data will have a type that depends on `children` and `multi` in the credential request: - Based on `children`: - If the credential request has `children`, each credential value will have type `object`. **Example: Credential Value of Type `object`** If the credential request has `children`: **CredentialRequest with children** ```typescript { "type": "AddressCredential", "children": [ { "type": "Line1Credential" }, { "type": "Line2Credential" }, { "type": "CityCredential" }, { "type": "StateCredential" }, { "type": "ZipCodeCredential" }, { "type": "CountryCredential" } ] } ``` Then, the credential returned will have type `object` (and so will the corresponding metadata): **1ClickEntity for CredentialRequest with children** ```typescript { ... "credentials": { "address": { "line1": "5320 Newell Rd", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" } }, "metadata": { ... "credentials": { "id": { "address": { "line1": "f5a4dc93-bc06-4bb8-bd05-17b5ba912bcd", "city": "efd3820f-676a-4db1-b63e-695b66ed8ba0", "state": "b65022a2-2016-41df-88f3-252e8e3a29c5", "zipCode": "b747ff84-39d8-4df9-98f9-24a465f1a9ae", "country": "d57a7bca-2a7c-4671-86ad-5647731cad02" }, }, ... } } } ``` - If the credential request does _not_ have `children`, each credential value will have type `string`. **Example: Credential Value of Type `string`** If the credential request does _not_ have children: **CredentialRequest without children** ```typescript { "type": "EmailCredential", } ``` Then, the credential returned will have type `string` (and so will the corresponding metadata): **1ClickEntity for CredentialRequest without children** ```typescript { ... "credentials": { "email": "richard@piedpiper.net" }, "metadata": { ... "credentials": { "id": { "email": "8a1d4e35-413d-496b-b499-8810b55cfb5c" }, ... } } } ``` - Based on `multi`: - If the credential request has `multi` set to `true`, the data keyed on `credentialKey` will be an array of credential values. **Example: Array of Credential Values** If the credential request has `multi` set to `true`: **CredentialRequest with multi true, with children** ```typescript { "type": "AddressCredential", "children": [ { "type": "Line1Credential" }, { "type": "Line2Credential" }, { "type": "CityCredential" }, { "type": "StateCredential" }, { "type": "ZipCodeCredential" }, { "type": "CountryCredential" } ], "multi": true } ``` **CredentialRequest with multi true, without children** ```typescript { "type": "EmailCredential", "multi": true } ``` Then, the data returned will be an array of credential values, so it will have type `[Object]` or `string[]` (and so will the corresponding metadata): **1ClickEntity for CredentialRequest with multi true, with children** ```typescript { ... "credentials": { "address": [ { "line1": "5320 Newell Rd", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" }, { "line1": "9536 Meadow Dr", "line2": "Apt 301", "city": "San Francisco", "state": "CA", "zipCode": "94112", "country": "US" }, ... ], }, "metadata": { ... "credentials": { "id": { "address": [ { "line1": "f5a4dc93-bc06-4bb8-bd05-17b5ba912bcd", "city": "efd3820f-676a-4db1-b63e-695b66ed8ba0", "state": "b65022a2-2016-41df-88f3-252e8e3a29c5", "zipCode": "b747ff84-39d8-4df9-98f9-24a465f1a9ae", "country": "d57a7bca-2a7c-4671-86ad-5647731cad02" }, { "line1": "6c7350bd-ea84-485b-baa8-fba3381cc859", "line2": "5311e2c8-67a1-4fe4-8ddb-88dc8a900915", "city": "c315d4ed-34c6-41a9-b7ca-c17cb4bac927", "state": "e3774b5f-0996-4dc7-a9b3-8ad24c9a286c", "zipCode": "abc2e42c-2864-4bf6-b262-05cb51416957", "country": "fca7d486-c99b-436e-9a92-95e221e4ba5d" }, ... ], }, ... } } } ``` **1ClickEntity for CredentialRequest with multi true, without children** ```typescript { ... "credentials": { "email": [ "richard@piedpiper.net", "richard@hooli.com", ... ], }, "metadata": { ... "credentials": { "id": { "email": [ "8a1d4e35-413d-496b-b499-8810b55cfb5c", "b82e39cf-3bb6-4105-b9c1-bfd1ed2a4dbc", ... ] }, ... } } } ``` > **Arrays May Be Single Valued** > > **An array of credential values may only include one value.** If `multi` is set to `true` in a credential request, we'll return multiple values _if_ we can source them (**up to a maximum of 3**). But if we can only source a single value, we'll still return it in an array, to ensure the data type is predictable. > **Multi Does Not Apply to Child Credential Requests** > > **The `multi` option does not work on `children` credential requests.** It only applies to the parent credential request. - If the credential request has `multi` set to `false`, the data keyed on `credentialKey` will be a single credential value. **Example: Single Credential Value** If the credential request has `multi` set to `false`: **CredentialRequest with multi false, with children** ```typescript { "type": "AddressCredential", "children": [ { "type": "Line1Credential" }, { "type": "Line2Credential" }, { "type": "CityCredential" }, { "type": "StateCredential" }, { "type": "ZipCodeCredential" }, { "type": "CountryCredential" } ], "multi": false } ``` **CredentialRequest with multi false, without children** ```typescript { "type": "EmailCredential", "multi": false } ``` Then, the data returned will be a single credential value, so it will have type `object` or `string` (and so will the corresponding metadata): **1ClickEntity for CredentialRequest with multi false, with children** ```typescript { ... "credentials": { "address": { "line1": "5320 Newell Rd", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" } }, "metadata": { ... "credentials": { "id": { "address": { "line1": "f5a4dc93-bc06-4bb8-bd05-17b5ba912bcd", "city": "efd3820f-676a-4db1-b63e-695b66ed8ba0", "state": "b65022a2-2016-41df-88f3-252e8e3a29c5", "zipCode": "b747ff84-39d8-4df9-98f9-24a465f1a9ae", "country": "d57a7bca-2a7c-4671-86ad-5647731cad02" } }, ... } } } ``` **1ClickEntity for CredentialRequest with multi false, without children** ```typescript { ... "credentials": { "email": "richard@piedpiper.net" }, "metadata": { ... "credentials": { "id": { "email": "8a1d4e35-413d-496b-b499-8810b55cfb5c" }, ... } } } ``` #### Example **1ClickEntity Example** ```typescript { "identifiers": { "phone": "+12125550010" }, "credentials": { "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, // Array because `multi` was set to `true` in the address credential request "address": [ { "line1": "5320 Newell Rd", "city": "Palo Alto", "state": "CA", "zipCode": "94303", "country": "US" } ], "birthDate": "1989-08-01", "ssn": "000456789" }, "metadata": { "identifiers": { "verificationMethod": { "phone": "otp" }, "riskSignals": { "overall": { "score": 0, "level": "low", "recommendation": "allow", "reasonCodes": [ "OCR10021" ] }, "phone": { "carrier": { "id": 0, "name": "Example Carrier" } "reasonCodes": [ "OCR20004", "OCR20005", "OCR20007", "OCR20101" ] }, "email": { "reasonCodes": [ "OCR60001", "OCR60002" ] }, "deviceIp": { "reasonCodes": [ "OCR50001", "OCR50002" ] } } }, // Follows the same structure as `credentials` and maintains the same order for array items when `multi` is set to `true` "credentials": { "verificationMethod": { "fullName": { "firstName": "phone_carrier", "lastName": "phone_carrier" }, // Array because `multi` was set to `true` in the address credential request "address": [ { "line1": "credit_bureau", "city": "credit_bureau", "state": "credit_bureau", "zipCode": "credit_bureau", "country": "credit_bureau" } ], "birthDate": "phone_carrier", "ssn": "phone_carrier" } } } } ``` --- #### `RiskSignals` See [Risk Signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) on the Data page for details about the attributes and when they're included. > **Tip** > > You can configure which risk signals you receive using the [risk signals brand setting](https://docs.verified.inc/1-click-signup/guides/setup.md#risk-signals): > > > | Option | Description | > | --- | --- | > | On | Include risk signals | > | Off Not Recommended | Don't include risk signals | > > > If risk signals are enabled, we will block users with an Overall Score greater than 600 and return a [`OCE017` error](https://docs.verified.inc/reference/api/errors.md#oce017). **RiskSignals Type** ```typescript { overall: { score: integer, level: "low" | "medium-low" | "medium" | "medium-high" | "high", recommendation: "allow" | "flag" | "block", reasonCodes: string[] }, phone: { carrier: { id: integer, name: string } reasonCodes: string[] }, email?: { reasonCodes: string[] }, deviceIp?: { reasonCodes: string[] } } ``` When enabled, the risk signals appear in identifiers metadata in a `1ClickEntity` and in some errors for [Verified error codes](https://docs.verified.inc/reference/api/errors.md#verified-error-codes), such as [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017): **1ClickEntity** ```typescript { ... "metadata": { "identifiers": { "riskSignals": RiskSignals, ... }, ... } } ``` **OCE017 Error** ```typescript { "name": "BadRequest", "message": "1-Click Blocked: Risk Score Too High", "code": 400, "className": "bad-request", "data": { "errorCode": "OCE017", "riskSignals": RiskSignals } } ``` ##### Example **RiskSignals Example** ```typescript { ... "metadata": { "identifiers": { ... "riskSignals": { "overall": { "score": 0, "level": "low", "recommendation": "allow", "reasonCodes": [ "OCR10021" ] }, "phone": { "carrier": { "id": 0, "name": "Example Carrier" } "reasonCodes": [ "OCR20004", "OCR20005", "OCR20007", "OCR20101" ] }, "email": { "reasonCodes": [ "OCR60001", "OCR60002" ] }, "deviceIp": { "reasonCodes": [ "OCR50001", "OCR50002" ] } } }, ... } } ``` --- ### `Error` **Error Type** ```typescript { name: string, message: string, code: number, className: string, data: { errorCode?: string, additionalInputs?: string[], // only for error code OCE011 inputAttemptsExceeded?: string[], // only for error code OCE019 identifiers?: { [identifierKey: string]: string }, verificationMethod?: { [identifierKey: string]: string }, riskSignals?: RiskSignals // only for error codes OCE011, OCE012, OCE013, OCE017, and OCE019 attemptsRemaining?: integer, // only for OCV error codes expiresAt?: integer // only for OCV error codes } } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `name` | `string` | `PascalCase` | Name of the error | `"BadRequest"` | | `message` | `string` | `Sentence case` | Message for developer that explains the error | `"Additional information is required to source data for user: birthDate"` | | `code` | `number` | 3 digits (0-9) | [HTTP response status code](https://httpwg.org/specs/rfc9110.html#overview.of.status.codes) | `400` | | `className` | `string` | `kebab-case` | Class of error | `bad-request` | | `data.errorCode` | **`enum`** See [Error Codes](https://docs.verified.inc/reference/api/errors.md#verified-error-codes) for possible values | 3 letters and 3 digits (0-9) | [Verified error code](https://docs.verified.inc/reference/api/errors.md#verified-error-codes) | `"OCE011"` | | `data.additionalInputs` | `string[]` | `camelCase` | Additional inputs to source [credentials](https://docs.verified.inc/reference/data/outputs.md#credentials) for user, where multiple values indicates **inclusive OR** (only included for [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011)) | `["birthDate", "ssn4"]` | | `data.inputAttemptsExceeded` | `string[]` | `camelCase` | Input(s) for which the attempts limit (3 for each input) has been exceeded (only included for [`OCE019`](https://docs.verified.inc/reference/api/errors.md#oce019)) | `["birthDate", "ssn4"]` | | `data.identifiers` | `object` | `camelCase` | [Identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers) includede in the request | `["birthDate", "ssn4"]` | | `data.verificationMethod` | `object` | `camelCase` | [Verification method](https://docs.verified.inc/reference/data/outputs.md#verification-method) for [identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers) includede in the request | `["birthDate", "ssn4"]` | | `identifierKey` | **`enum`** Possible values (see [identifiers](https://docs.verified.inc/reference/data/inputs.md#identifiers) for details): - `phone` - `email` | `camelCase` | The type of identifier | `"phone"` | | `data.riskSignals` | [`RiskSignals`](https://docs.verified.inc/reference/api/types.md#risksignals) | `object` | [Verified risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals) associated with the 1-Click Signup event (only included for [`OCE011`](https://docs.verified.inc/reference/api/errors.md#oce011), [`OCE012`](https://docs.verified.inc/reference/api/errors.md#oce012), [`OCE013`](https://docs.verified.inc/reference/api/errors.md#oce013), [`OCE017`](https://docs.verified.inc/reference/api/errors.md#oce017), and [`OCE019`](https://docs.verified.inc/reference/api/errors.md#oce019)) | See [`RiskSignals` example](https://docs.verified.inc/reference/api/types.md#example-risksignals) | | `data.atteptsRemaining` | `integer` | Any number of digits (0-9) | How many verification attempts the user has remaining | `3` | | `data.expiresAt` | `integer` | [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) | When the verification expires (meaning it can no longer succeed) | `1760053995000` | #### Example **Error Example** ```typescript { "name": "BadRequest", "message": "1-Click Blocked: Risk Score Too High", "code": 400, "className": "bad-request", "data": { "errorCode": "OCE017", "identifiers": { "phone": "+14045551799", "email": "richard@piedpiper.com" }, "verificationMethod": { "phone": "customer_otp", "email": "customer_otp" }, "riskSignals": { "overall": { "score": 999, // always enabled "level": "high", // always enabled "recommendation": "block", // always enabled "reasonCodes": [ // add on (ask Verified support to enable) "OCR10032" ] }, "phone": { // add on (ask Verified support to enable) "carrier": { "id": 1, "name": "Risky Carrier" } "reasonCodes": [ "OCR20009", "OCR20107", "OCR21012", "OCR21003" ] }, "email": { // add on (ask Verified support to enable) "reasonCodes": [ "OCR60006", "OCR60006" ] } } } } ``` --- ## 1-Click Health ### `1ClickHealthEntity` **1ClickHealthEntity Type** ```typescript { healthDataUuid: string, externalReference?: string, status: "PENDING" | "PROCESSING" | "SUCCEEDED" | "FAILED" | "PARTIAL", results?: [ { memberId: string, payer: Payer, verificationMethod?: "clearinghouse" | "self_attested", coverageTypes?: ("medical" | "dental" | "vision")[], serviceTypeCodes?: string[], isMedicare?: boolean, edi_271?: string, // included if eligibility check was run eligibility?: ParsedEdi271, // see ParsedEdi271 type; included if eligibility check was run network?: NetworkDecision // see NetworkDecision type; included if eligibility check was run and network rules are defined (in the Dashboard) } ], errors?: [ { message: string } ] } ``` > **Important** > > Eligibility info is returned only if an eligibility check was run. This happens in two cases: > > > 1. **The [Check After Autofill](https://docs.verified.inc/1-click-health/guides/setup.md#check-after-autofill) brand setting is enabled:** This ensures that we automatically run an eligibility check for a user's insurance after autofilling it. > 2. **You included member ID (and payer) as inputs:** You passed `memberId` (and `payer`) in the request body of [`POST /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#post-1-clickhealth). > > > Eligibilty info consists of: > > > - **The raw 271:** The `edi_271` string. > - **A parsed version of the 271:** The `eligibility` object. | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `healthDataUuid` | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | Unique identifier for the [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) that will be returned at the end of the 1-Click Health flow | `"053cd0be-22e4-4985-84e0-d6493708ac28"` | | `externalReference` | `string` | 1–256 characters | Your own reference string, echoed from `POST /1-click/health` request body if included | `"appointment-1042"` | | `status` | **`enum`** Possible values: - `"PENDING"` - `"PROCESSING"` - `"SUCCEEDED"` - `"FAILED"` - `"PARTIAL"` | `UPPER_SNAKE_CASE` | Status of the 1-Click Health flow | `"PROCESSING"` | | `results` | `object[]` | Array of `object`s | Health insurance plans. At most two are returned; when your brand has network rules, they are ordered in network, then indeterminate, then out of network | - | | ↳ `results[i]` | `object` | Object with keys described below | Health insurance plan | - | | ↳ ↳ `results[i].memberId` | `string` | Alphanumeric | Member ID for health insurance plan | `"V000000000"` | | ↳ ↳ `results[i].payer` | `Payer` | See `Payer` | Payer for health insurance plan | See `Payer` Example | | ↳ ↳ `results[i].verificationMethod` | **`enum`** Possible values: - `"clearinghouse"` - `"self_attested"` | `snake_case` | How a health insurance plan was verified | `"clearinghouse"` | | ↳ ↳ `results[i].coverageTypes` | **`enum[]`** Possible values: - `"medical"` - `"dental"` - `"vision"` | `lower case` | Coverage type(s) of health insurance plan | `["medical"]` | | ↳ ↳ `results[i].serviceTypeCodes` | `string[]` | Array of `string`s | List of [X12 service type codes](https://x12.org/codes/service-type-codes) for health insurance plans | `["30"]` | | ↳ ↳ `results[i].isMedicare` | `boolean` | - | Whether health insurance plan is for Medicare | `true` | | ↳ ↳ `results[i].edi_271` | `string` | X12 [EDI 271](https://x12.org/examples/005010x279) | Health Care Eligibility Benefit Response | See X12 [EDI 271 examples](https://x12.org/examples/005010x279) | | ↳ ↳ `results[i].eligibility` | `ParsedEdi271` | See `ParsedEdi271` | Parsed version of `edi_271` | See `ParsedEdi271` Example | | ↳ ↳ `results[i].network` | `NetworkDecision` | See `NetworkDecision` | Network status for health insurance plan, based on your network rules | See `NetworkDecision` Example | | `errors` | `object[]` | Array of objects | Errors | - | | ↳ `errors[i]` | `object` | Object with key described below | Error | `{ "message": "No coverage found" }` | | ↳ ↳ `errors[i].message` | `string` | - | Error message | `"No coverage found"` | #### Example **1ClickHealthEntity Example (succeeded)** ```typescript { "healthDataUuid": "9e12fe5b-5bb8-410a-ac6b-6e053e4c7e8d", "externalReference": "appointment-1042", "status": "SUCCEEDED", "results": [ { "memberId": "A484069", "payer": { "name": "Aetna", "verifiedId": "V404110", "ids": [ "60054", // ids[0] is considered primary "HPQRS", "Z95668", "10004", "953402799", "6400", "60054MA", "4500", "AETNA" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/11145919-80e4-4cb0-8518-cffbf44ee9fb.png" }, "verificationMethod": "clearinghouse", "coverageTypes": ["medical"], "serviceTypeCodes": ["30"], "isMedicare": false, "edi_271": ..., "eligibility": { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "Aetna", }, "member": { "memberId": "A484069", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Managed Choice Open Access", "groupNumber": "123456-123-12345", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "Aetna Member Services", "serviceTypeCodes": ["30"], "phone": "8005550000", "fax": "8005550001", "email": "memberservices@aetna.com", "url": "https://aetna.com/member-services" }, ... ] }, "network": { "status": "IN_NETWORK", "rules": [ { "uuid": "ab280ee0-5f66-4076-9d1b-255d5f0024e3", "name": "Rule 1: Aetna | MA, NY, WA | PPO | Hooli Health | Pied Piper - INN", "status": "IN_NETWORK", "notes": "Requires manual review", "metadata": { "selfPay": false, "priority": 1, "packageId": "123456" }, "startDate": "2026-10-01", "endDate": "2027-10-01", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ] } ] } }, { "memberId": "B231615071", "payer": { "name": "UnitedHealthcare", "verifiedId": "V816685", "ids": [ "87726", // ids[0] is considered primary "KMQTZ", "77082", "J87726MA", "10655", "2721", "87726MA", "95123", "11077", "MDC01", "10192", "14339", "3550", "3429", "UHC", "10806", "87726E", "KPIC1", "8455", "4523", "96107", "NGHPRT", "6442", "WCHEA", "10636", "10002", "72126", "UHCMP", "6847", "JDHS" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/ff5e124c-f19f-475c-9757-7fa011e5221a.png" }, "verificationMethod": "clearinghouse", "coverageTypes": ["medical"], "serviceTypeCodes": ["30"], "isMedicare": false, "edi_271": ..., "eligibility": { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "UnitedHealthcare", }, "member": { "memberId": "B231615071", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Choice Plus", "groupNumber": "1234567", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "UnitedHealthcare Member Services", "serviceTypeCodes": ["30"], "phone": "8005550002", "fax": "8005550003", "email": "memberservices@uhc.com", "url": "https://uhc.com/member-services" }, ... ] }, "network": { "status": "OUT_OF_NETWORK", "rules": [ { "uuid": "ea703d40-a073-454e-ae3e-3931e8e2cf5a", "name": "Rule 2: UnitedHealthcare | HMO | Hooli Health - OON", "status": "OUT_OF_NETWORK", "conditions": [ { "key": "payerName", "operator": "INCLUDE", "values": ["UnitedHealthcare", "United Healthcare"] }, { "key": "insuranceTypeCodes", "operator": "NOT_INCLUDE", "values": ["HM"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] } ] } ] } } ] } ``` **1ClickHealthEntity Example (failed)** ```typescript { "healthDataUuid": "df8f8623-7fee-4ee1-aeba-14e0572b132d", "externalReference": "appointment-2053", "status": "FAILED", "errors": [ { "message": "No coverage found" } ] } ``` --- #### `Payer` **Payer Type** ```typescript { name: string, verifiedId: string, ids: string[], // ids[0] is considered primary logoUrl?: string } ``` > **Payer IDs** > > 1-Click Health can return many different IDs for a given payer: > > > - **`verifiedId`:** This ID identifies the payer within Verified but is not used in external systems. _It never changes,_ so it can reliably used to identify the payer over time. > - **`ids[]`:** These IDs identify the payer in external systems, like healthcare clearing houses or the payer's own system. _They may change_ over time. > > - **`ids[0]`:** This is considered the primary ID for the payer and is generally the ID the payer uses for itself. _It may change_ over time. | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `name` | `string` | `Title Case` | Name of payer for health insurance plan | `"Aviato Health Insurance Of California"` | | `verifiedId` | `string` | V followed by 6 digits (0-9) | Verified ID (never changes) of payer for health insurance plan | `"V431835"` | | `ids` | `string[]` | Array of `string`s | IDs (can change) of payer for health insurance plan — `ids[0]` is considered primary | `["0000A"]` | | `logoUrl` | `string` | URL | URL for logo of payer for health insurance plan | `"https://assets.verified.inc/1-click/health/payers/11145919-80e4-4cb0-8518-cffbf44ee9fb.png"` | ##### Example **Payer Example: Aetna** ```typescript { "name": "Aetna", "verifiedId": "V404110", "ids": [ "60054", // ids[0] is considered primary "HPQRS", "Z95668", "10004", "953402799", "6400", "60054MA", "4500", "AETNA" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/11145919-80e4-4cb0-8518-cffbf44ee9fb.png" } ``` **Payer Example: UnitedHealthcare** ```typescript { "name": "UnitedHealthcare", "verifiedId": "V816685", "ids": [ "87726", // ids[0] is considered primary "KMQTZ", "77082", "J87726MA", "10655", "2721", "87726MA", "95123", "11077", "MDC01", "10192", "14339", "3550", "3429", "UHC", "10806", "87726E", "KPIC1", "8455", "4523", "96107", "NGHPRT", "6442", "WCHEA", "10636", "10002", "72126", "UHCMP", "6847", "JDHS" ], "logoUrl": "https://assets.verified.inc/1-click/health/payers/ff5e124c-f19f-475c-9757-7fa011e5221a.png" } ``` --- #### `ParsedEdi271` **ParsedEdi271 Type** ```typescript { coverageStatus?: "active" | "indeterminate" | "inactive", coverageTypes?: ("medical" | "dental" | "vision")[], serviceTypeCodes?: string[], payer?: { name: string, }, member?: { memberId: string, fullName?: { firstName?: string, lastName?: string }, birthDate?: string, sex?: string, address?: { line1?: string, line2?: string, city?: string, state?: string, zipCode?: string } }, plan?: { name?: string, groupNumber?: string, groupName?: string, insuranceTypeCodes?: string[], effectiveDate?: string, terminationDate?: string }, benefits?: { type?: "deductible" | "outOfPocket" | "copay" | "coinsurance" | "limitation", serviceTypeCodes?: string[], insuranceTypeCode?: string, level?: "individual" | "family" | string, network?: "in" | "out", // Directly from the 271: different from the network object of type NetworkDecision, which is based on network rules you define amount?: string, remaining?: string, percent?: string }[], contacts?: { name?: string, serviceTypeCodes?: string[], phone?: string, fax?: string, email?: string, url?: string }[] } ``` > **Coverage Status Values** > > The `coverageStatus` property derives the status of a user's health insurance plan from the EDI 271: > > > - **`"active"`:** The payer confirmed active coverage. > - **`"indeterminate"`:** The payer returned no clear signal or indicated you need to contact them (EB01 `U`) to confirm. In this latter case, `contacts` contains the number(s) you need to call. > - **`"inactive"`:** The payer confirmed inactive coverage. > > > We don't _autofill_ inactive plans, but if you run an eligibility check and the plan is inactive, the response will reflect that status. | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `coverageStatus` | **`enum`** Possible values: - `"active"` - `"indeterminate"` - `"inactive"` | `camelCase` | Coverage status of health insurance plan | `"active"` | | `coverageTypes` | **`enum[]`** Possible values: - `"medical"` - `"dental"` - `"vision"` | `lower case` | Coverage type(s) of health insurance plan | `["medical"]` | | `serviceTypeCodes` | `string[]` | Array of `string`s | List of [X12 service type codes](https://x12.org/codes/service-type-codes) for health insurance plan | `["30"]` | | `payer` | `object` | Object with key described below | Payer for health insurance plan | `["0000A"]` | | ↳ `payer.name` | `string` | - | Name of payer for health insurance plan | `"Aetna"` | | `member` | `object` | Object with keys described below | Member for health insurance plan | - | | ↳ `member.memberId` | `string` | - | Member ID of member for health insurance plan | `"A484069"` | | ↳ `member.fullName` | `object` | Object with keys described below | Full name of member for health insurance plan | - | | ↳ ↳ `member.fullName.firstName` | `object` | - | First name of member for health insurance plan | `"Richard"` | | ↳ ↳ `member.fullName.lastName` | `string` | - | Last name of member for health insurance plan | `"Hendricks"` | | ↳ `member.birthDate` | `string` | yyyy-MM-dd | Birth date of member for health insurance plan | `"1989-08-01"` | | ↳ `member.sex` | **`enum`** Possible values: - `"Male"` - `"Female"` | `Title Case` | Sex of member for health insurance plan | `"Male"` | | ↳ `member.address` | `object` | Object with keys described below | Address of member for health insurance plan | `{ "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" }` | | ↳ ↳ `member.address.line1` | `string` | `Title Case` | Line 1 of address of member for health insurance plan | `"5320 Newell Rd"` | | ↳ ↳ `member.address.line2` | `string` | `Title Case` | Line 2 of address of member for health insurance plan | `""` | | ↳ ↳ `member.address.city` | `string` | `Title Case` | City of address of member for health insurance plan | `"Palo Alto"` | | ↳ ↳ `member.address.state` | `string` | 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) | State of address of member for health insurance plan | `"CA"` | | ↳ ↳ `member.address.zipCode` | `string` | [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) | ZIP code of address of member for health insurance plan | `"94303"` | | `plan` | `object` | Object with keys described below | Details for health insurance plan | - | | ↳ `plan.name` | `string` | - | Name for health insurance plan | `"Managed Choice Open Access"` | | ↳ `plan.groupNumber` | `string` | - | Group number (for employer or purchaser group) for health insurance plan | `"123456-123-12345"` | | ↳ `plan.groupName` | `string` | - | Group name (for employer or purchaser group) for health insurance plan | `"Pied Piper"` | | ↳ `plan.insuranceTypeCodes` | `string[]` | Array of `string`s | List of [X12 insurance descriptor codes](https://x12.org/codes/insurance-descriptor-codes) | `["C1"]` | | ↳ `plan.effectiveDate` | `string` | yyyy-MM-dd | Coverage start date for health insurance plan | `"2026-01-01"` | | ↳ `plan.terminationDate` | `string` | yyyy-MM-dd | Coverage end date for health insurance plan | `"2026-12-31"` | | `benefits` | `object[]` | Array of objects | Benefits for health insurance plan | - | | ↳ `benefits[i].type` | **`enum`** Possible values: - `"deductible"` - `"outOfPocket"` - `"copay"` - `"coinsurance"` - `"limitation"` | `camelCase` | Type of cost share for health insurance plan | `"deductible"` | | ↳ `benefits[i].serviceTypeCodes` | `string[]` | Array of `string`s | List of [X12 service type codes](https://x12.org/codes/service-type-codes) for health insurance plan | `["30"]` | | ↳ `benefits[i].insuranceTypeCode` | `string` | - | [X12 insurance descriptor code](https://x12.org/codes/insurance-descriptor-codes) for health insurance plan | `"C1"` | | ↳ `benefits[i].level` | **`enum` \| `string`** Possible values: - `"individual"` - `"family"` - `string` | `camelCase` | Coverage level that `amount` applies to for health insurance plan | `"individual"` | | ↳ `benefits[i].network` | **`enum`** Possible values: - `"in"` - `"out"` | `camelCase` | Whether 271 says health insurance plan is in or out of network (different from the `network` object of type `NetworkDecision`, which is based on network rules you define) | `"in"` | | ↳ `benefits[i].amount` | `string` | decimal | Dollar amount applicable (copay, or period total for deductible or out of pocket) for health insurance plan | `"1500.00"` | | ↳ `benefits[i].remaining` | `string` | decimal | Dollar amount remaining (deductible or out of pocket) for health insurance plan | `"750.00"` | | ↳ `benefits[i].percent` | `string` | decimal fraction | Patient coinsurance responsibility for health insurance plan | `"0.20"` | | `contacts` | `object[]` | Array of objects | Benefits for health insurance plan | - | | ↳ `contacts[i].name` | `string` | - | Entity to contact (e.g. the payer's member services or a carve out administrator) about health insurance plan | `"Aetna Member Services"` | | ↳ `contacts[i].serviceTypeCodes` | `string[]` | Array of `string`s | List of [X12 service type codes](https://x12.org/codes/service-type-codes) relevant to contact for health insurance plan | `["30"]` | | ↳ `contacts[i].phone` | `string` | - | Phone number | `"8005550000"` | | ↳ `contacts[i].fax` | `string` | - | Fax number | `"8005550001"` | | ↳ `contacts[i].email` | `string` | Email | Email address | `"memberservices@aetna.com"` | | ↳ `contacts[i].url` | `string` | URL | Contact URL | `"https://aetna.com/member-services"` | ##### Example **ParsedEdi271 Example (Aetna)** ```typescript { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "Aetna", }, "member": { "memberId": "A484069", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Managed Choice Open Access", "groupNumber": "123456-123-12345", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "Aetna Member Services", "serviceTypeCodes": ["30"], "phone": "8005550000", "fax": "8005550001", "email": "memberservices@aetna.com", "url": "https://aetna.com/member-services" }, ... ] } ``` **ParsedEdi271 Example (UnitedHealthcare)** ```typescript { "coverageStatus": "active", "coverageType": ["medical"], "serviceTypeCodes": ["30"], "payer": { "name": "UnitedHealthcare", }, "member": { "memberId": "B231615071", "fullName": { "firstName": "Richard", "lastName": "Hendricks" }, "birthDate": "1989-08-01", "sex": "Male", "address": { "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" } }, "plan": { "name": "Choice Plus", "groupNumber": "1234567", "groupName": "PiedPiper", "insuranceTypeCodes": ["C1"], "effectiveDate": "2026-01-01", "terminationDate": "2026-12-31" }, "benefits": [ { "type": "deductible", "serviceTypeCodes": ["30"], "insuranceTypeCode": "C1", "level": "individual", "network": "in", "amount": "1500.00", "remaining": "750.00", "percent": "0.20" }, ... ], "contacts": [ { "name": "UnitedHealthcare Member Services", "serviceTypeCodes": ["30"], "phone": "8005550002", "fax": "8005550003", "email": "memberservices@uhc.com", "url": "https://uhc.com/member-services" }, ... ] } ``` --- #### `NetworkDecision` **NetworkDecision Type** ```typescript { status: string, rules: NetworkRule[] } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `status` | **`enum`** Possible values: - `"IN_NETWORK"` - `"OUT_OF_NETWORK"` - `"INDETERMINATE"` | `UPPER_SNAKE_CASE` | Network status of health insurance plan, based on your network rules | `"IN_NETWORK"` | | `rules` | `NetworkRule[]` | Array of `NetworkRule`s | List of network rules that matched health insurance plan | - | | ↳ `rules[i]` | `NetworkRule` | See `NetworkRule` | Network rule that matched health insurance plan | See `NetworkRule` Example | ##### Example **NetworkDecision Example (in network)** ```typescript { "status": "IN_NETWORK", "rules": [ { "uuid": "ab280ee0-5f66-4076-9d1b-255d5f0024e3", "name": "Rule 1: Aetna | MA, NY, WA | PPO | Hooli Health | Pied Piper - INN", "status": "IN_NETWORK", "notes": "Requires manual review", "metadata": { "selfPay": false, "priority": 1, "packageId": "123456" }, "startDate": "2026-10-01", "endDate": "2027-10-01", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ] } ] } ``` **NetworkDecision Example (out of network)** ```typescript { "status": "OUT_OF_NETWORK", "rules": [ { "uuid": "ea703d40-a073-454e-ae3e-3931e8e2cf5a", "name": "Rule 2: UnitedHealthcare | HMO | Hooli Health - OON", "status": "OUT_OF_NETWORK", "conditions": [ { "key": "payerName", "operator": "INCLUDE", "values": ["UnitedHealthcare", "United Healthcare"] }, { "key": "insuranceTypeCodes", "operator": "NOT_INCLUDE", "values": ["HM"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] } ] } ] } ``` **NetworkDecision Example (indeterminate)** ```typescript { "status": "INDETERMINATE", "rules": [ { "uuid": "ab280ee0-5f66-4076-9d1b-255d5f0024e3", "name": "Rule 1: Aetna | MA, NY, WA | PPO | Hooli Health | Pied Piper - INN", "status": "IN_NETWORK", "notes": "Requires manual review", "metadata": { "selfPay": false, "priority": 1, "packageId": "123456" }, "startDate": "2026-10-01", "endDate": "2027-10-01", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ] }, { "uuid": "ea703d40-a073-454e-ae3e-3931e8e2cf5a", "name": "Rule 2: UnitedHealthcare | HMO | Hooli Health - OON", "status": "OUT_OF_NETWORK", "conditions": [ { "key": "payerName", "operator": "INCLUDE", "values": ["UnitedHealthcare", "United Healthcare"] }, { "key": "insuranceTypeCodes", "operator": "NOT_INCLUDE", "values": ["HM"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] } ] } ] } ``` --- ##### `NetworkRule` > **Info** > > This is the shape of a rule as it appears in a `NetworkDecision`. The [Network Rules endpoints](https://docs.verified.inc/reference/api/endpoints.md#settings-brand-health-network-rules), which let you manage rules programmatically, return the same object plus `number`, `enabled`, `createdAt` and `updatedAt`. **NetworkRule Type** ```typescript { uuid: string, name: string, status: "IN_NETWORK" | "OUT_OF_NETWORK" | "INDETERMINATE", notes?: string, metadata?: { [key: string]: string | number | boolean }, startDate?: string, endDate?: string, conditions: { key: "payerId" | "payerName" | "state" | "insuranceTypeCodes" | "planName" | "relatedEntities" | "groupNumber" | "groupName", operator: "EQUAL" | "NOT_EQUAL" | "INCLUDE" | "NOT_INCLUDE", values: string[] }[] } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `uuid` | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | Unique identifier for the network rule | `"ab280ee0-5f66-4076-9d1b-255d5f0024e3"` | | `name` | `string` | - | Name for the network rule | `"Rule 1: Aetna - INN"` | | `status` | **`enum`** Possible values: - `"IN_NETWORK"` - `"OUT_OF_NETWORK"` - `"INDETERMINATE"` | `UPPER_SNAKE_CASE` | Network status the network rule returns | `"IN_NETWORK"` | | `notes` | `string` | - | Notes about the network rule | `"Requires manual review"` | | `metadata` | `object` | - | Metadata for the network rule | `{ "selfPay": false, "priority": 1, "packageId": "123456" }` | | ↳ `metadata[key]` | `string` \| `number` \| `boolean` | Up to 200 characters (with key up to 64 characters) | Piece of metadata for the network rule | `"selfPay": false` | | `startDate` | `string` | yyyy-MM-dd | Start date for the network rule | `"2026-10-01"` | | `endDate` | `string` | yyyy-MM-dd | End date for the network rule | `"2027-09-30"` | | `conditions` | `object[]` | Array of objects | Conditions for when the network rule matches | `[ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ]` | | ↳ `conditions[i]` | `object` | - | Condition for when the network rule matches | `{ "key": "payerId", "operator": "EQUAL", "values": ["V404110"] },` | | ↳ ↳ `conditions[i].key` | **`enum`** Possible values: - `"payerId"` - `"payerName"` - `"state"` - `"insuranceTypeCodes"` - `"planName"` - `"relatedEntities"` - `"groupNumber"` - `"groupName"` | `camelCase` | Key for condition | `"payerId"` | | ↳ ↳ `conditions[i].operator` | **`enum`** Possible values: - `"EQUAL"` - `"NOT_EQUAL"` - `"INCLUDE"` - `"NOT_INCLUDE"` | `UPPER_SNAKE_CASE` | Operator for condition | `"EQUAL"` | | ↳ ↳ `conditions[i].values` | `string[]` | `camelCase` | Value(s) for condition | `["V404110"]` | ###### Example **NetworkRule Example (all condition keys)** ```typescript { "uuid": "ab280ee0-5f66-4076-9d1b-255d5f0024e3", "name": "Rule 1: Aetna | MA, NY, WA | PPO | Hooli Health | Pied Piper - INN", "status": "IN_NETWORK", "notes": "Requires manual review", "metadata": { "selfPay": false, "priority": 1, "packageId": "123456" }, "startDate": "2026-10-01", "endDate": "2027-10-01", "conditions": [ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ] } ``` **NetworkRule Example (realistic condition keys)** ```typescript { "uuid": "ea703d40-a073-454e-ae3e-3931e8e2cf5a", "name": "Rule 2: UnitedHealthcare | HMO | Hooli Health - OON", "status": "OUT_OF_NETWORK", "conditions": [ { "key": "payerName", "operator": "INCLUDE", "values": ["UnitedHealthcare", "United Healthcare"] }, { "key": "insuranceTypeCodes", "operator": "NOT_INCLUDE", "values": ["HM"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] } ] } ``` --- Source: https://docs.verified.inc/reference/api/types Section: Reference — https://docs.verified.inc/reference.md Previous: Errors — https://docs.verified.inc/reference/api/errors.md Next: Webhooks — https://docs.verified.inc/reference/webhooks.md --- # Reference: Data Source: https://docs.verified.inc/reference/data.md - [Inputs](https://docs.verified.inc/reference/data/inputs.md): Input data passed to the Verified SDK and API - [Outputs](https://docs.verified.inc/reference/data/outputs.md): Output data returned by the Verified API --- Source: https://docs.verified.inc/reference/data Section: Reference — https://docs.verified.inc/reference.md Next: Inputs — https://docs.verified.inc/reference/data/inputs.md --- # Reference: Inputs Source: https://docs.verified.inc/reference/data/inputs.md > An **input** is a piece of data you pass to the SDK or API. ## 1-Click Verify | Input | Key | Required? | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | Device IP | `deviceIp` | Optional | `string` | [IPv6](https://en.wikipedia.org/wiki/IPv6_address) | IPv6 address of user's device | `"::121:2555:0010"` | | Phone | `phone` | Optional | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | Phone number a user uses to verify for 1-Click Signup | `"+12125550010"` | ## 1-Click Signup > **Note** > > To source verified 1-Click Signup ([outputs](https://docs.verified.inc/reference/data/outputs.md)) for a user: > > > - **Identifiers:** Phone is always required. Email and device IP are used only to source metadata, specifically [risk signals](https://docs.verified.inc/reference/data/outputs.md#risk-signals). > - **Challenges:** These are only required sometimes: if you get the [`OCE11`](https://docs.verified.inc/reference/api/errors.md#oce011) error code, which indicates that additional information is required. This happens when we're unable to narrow down to a single user based on the inputs already provided. > - **Other Inputs:** These are optional. For name, we'll try to match against all names we find associated with the user. This often means, for example, that a user's nickname will match as well as their legal name, but that depends on which names we can source for the user. ### Identifiers > An **identifier** is a piece of user data that's used as a primary lookup for [outputs](https://docs.verified.inc/reference/data/outputs.md) and must match the outputs. > **Tip** > > **We highly recommend using [1-Click Verify](https://docs.verified.inc/1-click-verify.md) to autofill and verify a user's phone number,** which is always a required input for 1-Click Signup. | Input | Key | Required? | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | Phone | `phone` | Required | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | Phone number a user uses to verify for 1-Click Signup | `"+12125550010"` | | Email | `email` | Optional | `string` | Email | Email address a user uses to verify for 1-Click Signup | `"richard@piedpiper.net"` | | Device IP | `deviceIp` | Optional | `string` | [IPv6 address](https://en.wikipedia.org/wiki/IPv6_address) | IP address of user's device (which you can get using [`GET /1-click/verifications/device-ip`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications-device-ip)) | `"::121:2555:0010"` | ### Challenges > A **challenge** is a piece of user data that's used as a secondary lookup for [outputs](https://docs.verified.inc/reference/data/outputs.md) and must match the outputs. > **Important** > > Unlike other inputs, **challenges must match the [outputs](https://docs.verified.inc/reference/data/outputs.md)** sourced for a user. In other words, they have to match the records we find for a user, or you'll get an [`OCE012` error](https://docs.verified.inc/reference/api/errors.md#oce012). That's because names, birth dates, and SSN4s never or rarely vary, while addresses vary more often. For example, a user may have recently moved. > **Whether an Input is a Challenge Depends on Your Brand settings** > > Each of the inputs listed here can be considered a challenge or _not_ a challenge, depending on your [Challenges](https://docs.verified.inc/1-click-signup/guides/setup.md#challenges) brand setting. This gives you flexibility to require — or not — that a given input matches. _If you need additional guidance about this, don't hesitate to reach out to us at [Support@Verified.inc](mailto:Support@Verified.inc)._ > **At Least One Challenge is Required** > > We require you to include at least one challenge, and we recommend you use only one to streamline the user experience. | Input | Key | Required? | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | Full Name | `fullName` | Optional | `object` | Object with keys for one or more child credentials listed below | Full name | `{ "firstName": "Richard" }` | | ↳ First Name | `fullName.firstName` | Optional but Required after some [`OCE011` errors](https://docs.verified.inc/reference/api/errors.md#oce011) | `string` | `cAse inSensiTive` | First name | `"Richard"` | | Birth Date | `birthDate` | Optional but Required after some [`OCE011` errors](https://docs.verified.inc/reference/api/errors.md#oce011) | `string` | yyyy-MM-dd | Birth date | `"1989-08-01"` | | SSN4 | `ssn4` | Optional but Required after some [`OCE011` errors](https://docs.verified.inc/reference/api/errors.md#oce011) | `string` | 4 digits (0-9) | Last 4 digits of Social Security Number | `"6789"` | ### Other Inputs > An **other input** is a piece of user data that's used as an additional lookup for [outputs](https://docs.verified.inc/reference/data/outputs.md) and does not have to match the outputs. For name, we'll try to match against _all_ names we find associated with the user. This often means, for example, that a user's nickname will match as well as their legal name, but that depends on which names we can source for the user. > **Important** > > Unlike challenges, these **other inputs do not have to match the [outputs](https://docs.verified.inc/reference/data/outputs.md)** sourced for a user. That's because names and addresses vary, while birth dates and SSN4s don't. For example, a user may enter a nickname rather than their legal name, or they might have recently moved. > **Whether an Input is a Challenge Depends on Your Brand settings** > > Some of the inputs listed here can be considered a challenge or _not_ a challenge, depending on your [Challenges](https://docs.verified.inc/1-click-signup/guides/setup.md#challenges) brand setting. This gives you flexibility to require — or not — that a given input matches. _If you need additional guidance about this, don't hesitate to reach out to us at [Support@Verified.inc](mailto:Support@Verified.inc)._ | Input | Key | Required? | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | Full Name | `fullName` | Optional | `object` | Object with keys for one or more child credentials listed below | Full name | `{ "firstName": "Richard", "lastName": "Hendricks" }` | | ↳ First Name | `fullName.firstName` | Optional | `string` | `cAse inSensiTive` | First name | `"Richard"` | | ↳ Middle Name | `fullName.middleName` | Optional | `string` | `cAse inSensiTive` | Middle name | `"Harrison"` | | ↳ Last Name | `fullName.lastName` | Optional | `string` | `cAse inSensiTive` | Last name | `"Hendricks"` | | Address | `address` | Optional | `object` | Object with keys for one or more child credentials listed below | Address | `{ "state": "CA", "zipCode": "94303" }` | | ↳ Line 1 | `address.line1` | Optional | `string` | `cAse inSensiTive` | Line 1 of address | `"5320 Newell Rd"` | | ↳ Line 2 | `address.line2` | Optional | `string` | `cAse inSensiTive` | Line 2 of address | `""` | | ↳ City | `address.city` | Optional | `string` | `cAse inSensiTive` | City of address | `"Palo Alto"` | | ↳ State | `address.state` | Optional | `string` | - 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) - Full state/territory name ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-1) subdivision name) | State of address | - `"CA"` - `"California"` | | ↳ ZIP Code | `address.zipCode` | Optional | `string` | - [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) - [ZIP+4](https://en.wikipedia.org/wiki/ZIP_Code#ZIP+4) (5 digits, 0-9 + `-` + 4 digits, 0-9) | ZIP Code of address | - `"94303"` - `"94303-2846"` | | ↳ Country | `address.country` | Optional | `string` | - 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) - Full country name ([ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) English short name, currently always `"United States of America"`) | Country of address | - `"US"` - `"United States of America"` | ## 1-Click Health > **Important** > > Whether 1-Click Health returns health data for a user depends on a complex matching process between the inputs provided and the outputs Verified sources. The more inputs you provide (as long as they're accurate), the better the outputs will be. > > > **We recommend using [1-Click Signup](https://docs.verified.inc/1-click-signup.md) to source inputs for 1-Click Health!** Using the two products together results in the fastest, easiest user experience. > **Tip** > > **We highly recommend using [1-Click Signup](https://docs.verified.inc/1-click-signup.md) to autofill a user's identity info,** which are inputs for 1-Click Health. | Input | Key | Required? | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | Full Name | `fullName` | Mixed | `object` | Object with keys for one or more child credentials listed below | Full name | `{ "firstName": "Richard", "lastName": "Hendricks" }` | | ↳ First Name | `fullName.firstName` | Required | `string` | `cAse inSensiTive` | First name | `"Richard"` | | ↳ Middle Name | `fullName.middleName` | Optional | `string` | `cAse inSensiTive` | Middle name | `"Harrison"` | | ↳ Last Name | `fullName.lastName` | Required | `string` | `cAse inSensiTive` | Last name | `"Hendricks"` | | Birth Date | `birthDate` | Required | `string` | yyyy-MM-dd | Birth date | `"1989-08-01"` | | Address | `address` | Optional | `object` | Object with keys for one or more child credentials listed below | Address | `{ "state": "CA", "zipCode": "94303" }` | | ↳ Line 1 | `address.line1` | Optional | `string` | `cAse inSensiTive` | Line 1 of address | `"5320 Newell Rd"` | | ↳ Line 2 | `address.line2` | Optional | `string` | `cAse inSensiTive` | Line 2 of address | `""` | | ↳ City | `address.city` | Optional | `string` | `cAse inSensiTive` | City of address | `"Palo Alto"` | | ↳ State | `address.state` | Optional | `string` | 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) | State of address | `"CA"` | | ↳ ZIP Code | `address.zipCode` | Optional | `string` | [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) | ZIP Code of address | `"94303"` | | ↳ Country | `address.country` | Optional | `string` | 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) | Country of address | `"US"` | | Sex | `sex` | Optional | **`enum`** Possible values: - `"Male"` - `"Female"` - `"Non-Binary"` | `Title Case` | Sex | `"Male"` | | SSN | `ssn` | Optional | `string` | 9 digits (0-9) | Social Security Number | `"000456789"` | --- Source: https://docs.verified.inc/reference/data/inputs Section: Reference — https://docs.verified.inc/reference.md Previous: Data — https://docs.verified.inc/reference/data.md Next: Outputs — https://docs.verified.inc/reference/data/outputs.md --- # Reference: Outputs Source: https://docs.verified.inc/reference/data/outputs.md > An **output** is a piece of data we return from the SDK or API. ## Text to Signup | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Phone | `phone` | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | Phone number a user uses to verify for 1-Click Signup | `"+12125550010"` | ## 1-Click Verify > **Device IP Format** > > [`GET /1-click/verifications/device-ip`](https://docs.verified.inc/reference/api/endpoints.md#get-1-click-verifications-device-ip) always returns device IP in [IPv6](https://en.wikipedia.org/wiki/IPv6_address) format, because this is what our other endpoints require. We internally map IPv4 to IPv6 when necessary. | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Device IP | `deviceIp` | `string` | [IPv6](https://en.wikipedia.org/wiki/IPv6_address) | IPv6 address of user's device | `"::121:2555:0010"` | | Phone | `phone` | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | Phone number a user uses to verify for 1-Click Signup | `"+12125550010"` | ## 1-Click Signup ### Credentials > A **credential** is a piece of identity data about a user. > **Credential Formats** > > **We support multiple formats for some credential types (see below).** If you'd like to use formats different than the defaults, please reach out to us at [Support@Verified.inc](mailto:Support@Verified.inc) and we'll enable them for you. #### Core Data > **Coverage** > > We can source the data below for **~95% of US adults** if you provide both phone and a challenge (either birthday or SSN4) as [inputs](https://docs.verified.inc/reference/data/inputs.md) — and for about **20%** if you provide only phone. (The one exception is the Sex credential, which we can source for ~80% of US adults.) > > > _Exact coverage depends on your user base and varies widely across companies. Some companies see >97% coverage, while a few see only 50%. See [Coverage](https://docs.verified.inc/1-click-signup/overview.md#coverage) for more information._ | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Phone | `phone` | `string` | [E.164](https://www.twilio.com/docs/glossary/what-e164) | Phone number | `"+12125550010"` | | Full Name | `fullName` | - **Default:** `object` - `string` | - **Default:** Object with keys for all child credentials listed below - Any combination of child `shortenedCredentialType`s under `fullName`, `,` (comma), and `-` (dash) | Full name | - See [`1ClickEntity` example](https://docs.verified.inc/reference/api/types.md#example-1clickentity) - `"Hendricks, Richard"` | | ↳ First Name | `fullName.firstName` | `string` | `Title Case` | First name | `"Richard"` | | ↳ Middle Name | `fullName.middleName` | `string` | `Title Case` | Middle name | `"Harrison"` | | ↳ Last Name | `fullName.lastName` | `string` | `Title Case` | Last name | `"Hendricks"` | | Address | `address` | - **Default:** `object` - `string` | - **Default:** Object with keys for all child credentials listed below - Any combination of child `shortenedCredentialType`s under `address`, `,` (comma), and `-` (dash) | Address | - See [`1ClickEntity` example](https://docs.verified.inc/reference/api/types.md#example-1clickentity) - `"Palo Alto, US-CA"` | | ↳ Line 1 | `address.line1` | `string` | `Title Case` | Line 1 of address | `"5320 Newell Rd"` | | ↳ Line 2 | `address.line2` | `string` | `Title Case` | Line 2 of address | `""` | | ↳ City | `address.city` | `string` | `Title Case` | City of address | `"Palo Alto"` | | ↳ State | `address.state` | `string` | - **Default:** 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) - Full state/territory name ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-1) subdivision name) | State of address | - `"CA"` - `"California"` | | ↳ ZIP Code | `address.zipCode` | `string` | [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) | ZIP Code of address | `"94303"` | | ↳ Country | `address.country` | `string` | - **Default:** 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) - Full country name ([ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) English short name, currently always `"United States of America"`) | Country of address | - `"US"` - `"United States of America"` | | Birth Date | `birthDate` | `string` | Birth date | - **Default:** yyyy-MM-dd - Any combination of `y`(year), `M`(month), `d`(day), `/`(slash), and `-`(dash) - [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) | - `"1989-08-01"` - `"08/01/1989"` - `"617947200000"` | | SSN (or ITIN) | `ssn` | `string` | 9 digits (0-9) | Social Security Number (or Individual Taxpayer Identification Number) | `"000456789"` | | Sex | `sex` | `string` | **`enum`** Possible values: - `"Male"` - `"Female"` - `"Non-Binary"` | Sex | `"Male"` | > **Risk Signals Enable Multiple Addresses** > > **We can return up to 3 most recent [addresses](https://docs.verified.inc/reference/data/outputs.md#core-data) for a user,** if you have risk signals turned on. We order these addresses from most to least recent, as best as we're able to determine recency. > > > You can show the user a dropdown to select one of the addresses on the info confirmation step (see [here](https://docs.verified.inc/1-click-signup/user-experience.md#info) on the User Experience page). We highly recommend this because it helps reduce the chance the user will need to manually enter an address, reducing friction and boosting conversion. > **We Return ITINs When Applicable** > > **If we find an ITIN but not an SSN for a user, we return the ITIN under the `ssn` key.** ITINs and SSNs are both 9 digit numbers, and ITINs are easily distinguishable because they start with the number 9. #### Government IDs Beta > **Coverage and Recency for Driver's License** > > Access to driver's license data varies state by state, so coverage and recency are substantially lower than for core data. | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Driver's License | `driversLicense` | `object` | Object with keys for all child credentials listed below | Driver's license | - | | ↳ Document Number | `driversLicense.documentNumber` | `string` | Format varies by state | Driver's license number | `"A0000000"` | | ↳ Issuance State | `driversLicense.issuanceState` | `string` | - **Default:** [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) - Any combination of `y`(year), `M`(month), `d`(day), `/`(slash), and `-`(dash) | Issuance state of driver's license | - `"CA"` - `"California"` | | ↳ Issuance Date | `driversLicense.issuanceDate` | `string` | - **Default:** [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) - Any combination of `y`(year), `M`(month), `d`(day), `/`(slash), and `-`(dash) | Issuance date of driver's license | - `"1596254400"` - `"08/01/2020"` | | ↳ Expiration Date | `driversLicense.expirationDate` | `string` | - **Default:** [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) - Any combination of `y`(year), `M`(month), `d`(day), `/`(slash), and `-`(dash) | Expiration date of of driver's license | - `"1911787200"` - `"08/01/2030"` | | ↳ Address | `driversLicense.address` | - **Default:** `object` - `string` | - **Default:** Object with keys for all child credentials listed below - Any combination of child `shortenedCredentialType`s under `address`, `,` (comma), and `-` (dash) | Driver's license address | - See [`1ClickEntity` example](https://docs.verified.inc/reference/api/types.md#example-1clickentity) - `"Palo Alto, US-CA"` | | ↳ ↳ Line 1 | `driversLicense.address.line1` | `string` | `Title Case` | Line 1 of driver's license address | `"5320 Newell Rd"` | | ↳ ↳ Line 2 | `driversLicense.address.line2` | `string` | `Title Case` | Line 2 of driver's license address | `""` | | ↳ ↳ City | `driversLicense.address.city` | `string` | `Title Case` | City of driver's license address | `"Palo Alto"` | | ↳ ↳ State | `driversLicense.address.state` | `string` | - **Default:** 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) - Full state/territory name ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-1) subdivision name) | State of driver's license address | - `"CA"` - `"California"` | | ↳ ↳ ZIP Code | `driversLicense.address.zipCode` | `string` | [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) | ZIP Code of driver's license address | `"94303"` | | ↳ ↳ Country | `driversLicense.address.country` | `string` | - **Default:** 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) - Full country name ([ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) English short name, currently always `"United States of America"`) | Country of driver's license address | - `"US"` - `"United States of America"` | > **More Government IDs are Coming Soon** > > We're working on adding support for new types of government ID. Let us know what would be most helpful for your use case! Email us at [Support@Verified.inc](mailto:Support@Verified.inc) and we'll prioritize accordingly. #### Vehicles Coming Soon | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Vehicle | `vehicle` | `object` | Object with keys for all child credentials listed below | Vehicle information | - | | ↳ VIN | `vehicle.vin` | `string` | [FMVSS 115, Part 565](https://en.wikipedia.org/wiki/Vehicle_identification_number#Classification) (US standard to calculate VIN) | Vehicle Identification Number | `"4Y1SL65848Z411439"` | | ↳ License Plate | `vehicle.licensePlate` | `string` | Any alphanumeric string | Vehicle license plate | `"ABC123"` | | ↳ Make | `vehicle.make` | `string` | `Title Case` | Vehicle make | `"Toyota"` | | ↳ Model | `vehicle.model` | `string` | `Title Case` | Vehicle model | `"RAV4"` | | ↳ Year | `vehicle.year` | `string` | - **Default:** [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) - Any combination of `y`(year), `M`(month), `d`(day), `/`(slash), and `-`(dash) | Year of vehicle manufacture | - `"617947200000"` - `"08/01/1989"` | #### Employment Coming Soon | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Employer | `employer` | `object` | Object with keys for all child credentials listed below | Employer information | - | | ↳ Name | `employer.name` | `string` | `Title Case` | Employer name | `"Pied Piper"` | | ↳ Address | `employer.address` | - **Default:** `object` - `string` | - **Default:** Object with keys for all child credentials listed below - Any combination of child `shortenedCredentialType`s under `address`, `,` (comma), and `-` (dash) | Address | - See [`1ClickEntity` example](https://docs.verified.inc/reference/api/types.md#example-1clickentity) - `"Palo Alto, US-CA"` | | ↳ ↳ Line 1 | `employer.address.line1` | `string` | `Title Case` | Line 1 of address | `"5320 Newell Rd"` | | ↳ ↳ Line 2 | `employer.address.line2` | `string` | `Title Case` | Line 2 of address | `""` | | ↳ ↳ City | `employer.address.city` | `string` | `Title Case` | City of address | `"Palo Alto"` | | ↳ ↳ State | `employer.address.state` | `string` | - **Default:** 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) - Full state/territory name ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-1) subdivision name) | State of address | - `"CA"` - `"California"` | | ↳ ↳ ZIP Code | `employer.address.zipCode` | `string` | [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) or [ZIP+4](https://en.wikipedia.org/wiki/ZIP_Code#ZIP+4) (9 digits, 0-9, with a hypen after the first 5) | ZIP code of address | `"94303"` or `"94303-3058"` | | ↳ ↳ Country | `employer.address.country` | `string` | - **Default:** 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) - Full country name ([ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) English short name, currently always `"United States of America"`) | Country of address | - `"US"` - `"United States of America"` | #### Properties Coming Soon | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Property | `property` | `object` | Object with keys for all child credentials listed below | Property information | - | | ↳ Address | `property.address` | - **Default:** `object` - `string` | - **Default:** Object with keys for all child credentials listed below - Any combination of child `shortenedCredentialType`s under `address`, `,` (comma), and `-` (dash) | Address | - See [`1ClickEntity` example](https://docs.verified.inc/reference/api/types.md#example-1clickentity) - `"Palo Alto, US-CA"` | | ↳ ↳ Line 1 | `property.address.line1` | `string` | `Title Case` | Line 1 of address | `"5320 Newell Rd"` | | ↳ ↳ Line 2 | `property.address.line2` | `string` | `Title Case` | Line 2 of address | `""` | | ↳ ↳ City | `property.address.city` | `string` | `Title Case` | City of address | `"Palo Alto"` | | ↳ ↳ State | `property.address.state` | `string` | - **Default:** 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) - Full state/territory name ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-1) subdivision name) | State of address | - `"CA"` - `"California"` | | ↳ ↳ ZIP Code | `property.address.zipCode` | `string` | [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) or [ZIP+4](https://en.wikipedia.org/wiki/ZIP_Code#ZIP+4) (9 digits, 0-9, with a hypen after the first 5) | ZIP code of address | `"94303"` or `"94303-3058"` | | ↳ ↳ Country | `property.address.country` | `string` | - **Default:** 2 letter abbreviation ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code, currently always `"US"`) - Full country name ([ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) English short name, currently always `"United States of America"`) | Country of address | - `"US"` - `"United States of America"` | | ↳ Owner(s) | `property.owners` | `string[]` | `Title Case` | Names of property owner(s) | `["Erlich Bachman"]` | | ↳ Seller(s) | `property.sellers` | `string[]` | `Title Case` | Names of property seller(s) | `["Erlich Bachman"]` | ### Metadata > A piece of **metadata** is additional data that's not a user's identity data — though it's often _about_ that identity data. #### Verification Method | Output | Key | Type | Applies To | Format | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | Verification Method | `verificationMethod` | **`enum`** Possible values: - `"credit_bureau"` - `"data_bureau"` - `"phone_carrier"` - `"otp"` - `"customer_otp"` - `"self_attested"` - `null` | - Identifiers - Credentials | `snake_case` | How an identifier or credential was verified | `"phone_carrier"` | **What Verification Method Means** **`verificationMethod` describes how a credential was verified:** - `"credit_bureau"`: verified via credit bureau records - `"data_bureau"`: verified via data bureau records - `"phone_carrier"`: verified via phone carrier records - `"otp"`: verified via an OTP (one time passcode) - `"customer_otp"`: verified via an OTP (one time passcode) by a Verified customer, not directly by Verified - `"self_attested"`: attested by the user themselves (not verified) - `null` You can build custom logic to handle credentials based on their `verificationMethod`, for example requiring additional verification if an important credential is `"self_attested"`. #### Risk Signals | Output | Key | Type | Applies To | Format | Description | Example | | --- | --- | --- | --- | --- | --- | --- | | Risk Signals | `riskSignals` | `object` | - Identifiers | Object with keys specified below in Risk Signals | Risk signals associated with the identifiers provided | See [`RiskSignals` example](https://docs.verified.inc/reference/api/types.md#example-risksignals) | Risk signals metadata enhance 1-Click Signup's anti-fraud capabilities. They come with extra cost and can be disabled if desired, but we recommend that you use them to improve your ability to prevent fraud. See also the [`RiskSignals` type](https://docs.verified.inc/reference/api/types.md#risksignals). > **Tip** > > You can configure which risk signals you receive using the [risk signals brand setting](https://docs.verified.inc/1-click-signup/guides/setup.md#risk-signals): > > > | Option | Description | > | --- | --- | > | On | Include risk signals | > | Off Not Recommended | Don't include risk signals | > > > If risk signals are enabled, we will block users with an Overall Score greater than 600 and return a [`OCE017` error](https://docs.verified.inc/reference/api/errors.md#oce017). > **Definition of Risky Services** > > We and other companies assign specific services — called "risky services" — to interact with numbers that are considered more likely to be malicious. These risky services are not themselves risky. Rather, if the phone number you submit to our API has had a lot of interaction with them, that phone number is potentially risky. | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Overall | `overall` | `object` | Object with keys for all overall risk signals listed below | Overall risk signals, considering all relevant inputs provided | See [`RiskSignals` example](https://docs.verified.inc/reference/api/types.md#example-risksignals) | | ↳ Score | `overall.score` | `integer` | Number from 0 (low risk) to 1000 (high risk) | Overall risk score, considering all relevant inputs provided. (If the score is over 600, Verified blocks the user and returns a [`OCE017` error](https://docs.verified.inc/reference/api/errors.md#oce017).) | `463` | | ↳ Level | `overall.level` | **`enum`** Possible values: - `"low"` - `"medium-low"` - `"medium"` - `"medium-high"` - `"high"` | `kebab-case` | Overall risk level, considering all relevant inputs provided. (This is a bucketing of the risk score, where `0`-`200` is `"low"`, `201`-`400` is `"medium-low"`, `401`-`600` is `"medium"`, `601`-`800` is `"medium-high"`, and `801`-`1000` is `"high"`.) | `"medium"` | | ↳ Recommendation | `overall.recommendation` | **`enum`** Possible values: - `"allow"` - `"flag"` - `"block"` | `kebab-case` | Overall risk recommendation, considering all relevant inputs provided. (This is a bucketing of the risk level, where `"low"` and `"medium-low"` are `"allow"`, `"medium"` is `"flag"`, and `"medium-high"` and `"high"` are `"block"`.) | `"flag"` | | ↳ Reason Codes | `overall.reasonCodes` | **`enum[]`** Possible values: see Overall reason codes | `"OCR"` (for One Click Reason) followed by 5 digits (0-9) | Overall reason codes for risk score/level/recommendation, considering all relevant inputs provided | `"OCR10021"` | | Phone | `phone` | `object` | Object with keys for all phone risk signals listed below | Phone risk signals | See [`RiskSignals` example](https://docs.verified.inc/reference/api/types.md#example-risksignals) | | ↳ Carrier | `phone.carrier` | `object` | Object with keys for all carrier details listed below | Carrier information | `"flag"` | | ↳ ↳ ID | `phone.carrier.id` | `integer` | Any number of digits (0-9) | Carrier ID number | `309` | | ↳ ↳ Name | `phone.carrier.name` | `string` | `"Title Case"` | Carrier name | `"AT&T Wireless"` | | ↳ Reason Codes | `phone.reasonCodes` | **`enum[]`** Possible values: see Phone reason codes | `"OCR"` (for One Click Reason) followed by 5 digits (0-9) | Phone reason codes for risk score/level/recommendation | `"OCR20004"` | | Email | `email` | `object` | Object with keys for all email risk signals listed below | Email risk signals | See [`RiskSignals` example](https://docs.verified.inc/reference/api/types.md#example-risksignals) | | ↳ Reason Codes | `email.reasonCodes` | **`enum[]`** Possible values: see Email reason codes | `"OCR"` (for One Click Reason) followed by 5 digits (0-9) | Email reason codes for risk score/level/recommendation | `"OCR60001"` | | Device IP | `deviceIp` | `object` | Object with keys for all device IP risk signals listed below | IP address identifier risk signals | See [`RiskSignals` example](https://docs.verified.inc/reference/api/types.md#example-risksignals) | | ↳ Reason Codes | `deviceIp.reasonCodes` | **Details** **`enum[]`** Possible values: see Device IP reason codes | `"OCR"` (for One Click Reason) followed by 5 digits (0-9) | Device IP reason codes for risk score/level/recommendation | `"OCR50001"` | ##### Reason Codes ###### Overall | Code | Description | Details | Risk Indicator | Trust Indicator | | --- | --- | --- | --- | --- | | `OCR10010` | low activity | Not enough activity or attributes to classify the transaction as either risky or trustworthy. | | | | `OCR10020` | low regular activity | Trustworthy category, based on past behavior. | | ✔ | | `OCR10021` | regular activity | Most trustworthy category, based on past behavior. | | ✔ | | `OCR10030` | low-risk irregular activity | Risky category, based on past behavior. | ✔ | | | `OCR10031` | medium-risk irregular activity | High-risk category, based on past behavior. | ✔ | | | `OCR10032` | high-risk irregular activity | Highest-risk category, based on past behavior. | ✔ | | | `OCR10040` | irregular number type | This number has risky static attributes (like VOIP phone type or being on a blocklist). | ✔ | | ###### Phone | Code | Description | Details | Risk Indicator | Trust Indicator | | --- | --- | --- | --- | --- | | `OCR20001` | no long-term activity | Much less than expected activity, or none at all, for this number over the past 90 days. Cannot classify. | | | | `OCR20002` | high long-term activity | More than expected activity for this number over the past 90 days. | ✔ | | | `OCR20003` | high short-term activity | More than expected activity for this number over the last 24 hours. | ✔ | | | `OCR20004` | moderate long-term activity | Expected activity for this number over the past 90 days. | | ✔ | | `OCR20005` | moderate short-term activity | Expected activity for this number over the last 24 hours. | | ✔ | | `OCR20006` | sparse long-term activity | Sparse, regular volume of verification traffic on this number over the past 90 days. | | ✔ | | `OCR20007` | continuous long-term activity | Continuous, regular volume of verification traffic on this number over the past 90 days. | | ✔ | | `OCR20008` | very high long-term activity | Very high volume of verification traffic on this number over the past 90 days. | ✔ | | | `OCR20009` | very high short-term activity | Very high volume of verification traffic on this number over the past 24 hours. | ✔ | | | `OCR20010` | no activity | Very low volume of verification traffic, or none at all, was ever observed on this number. | | | | `OCR20011` | low long-term activity | Low volume of verification traffic on this phone number over the past 90 days. | | | | `OCR20012` | low short-term activity | Low volume of verification traffic on this phone number over the past 24 hours. Very low volume of verification traffic, or none at all over the past 90 days. | | | | `OCR20013` | low activity | Less than expected activity for this number. | | | | `OCR20101` | no range activity | Very little activity, or none at all, for a risky range that this number belongs to over the past 90 days. Also returned if the number does not belong to a risky range. | | ✔ | | `OCR20102` | low range activity | Some activity for a risky range that this number belongs to over the past 90 days. | ✔ | | | `OCR20103` | moderate short-term range activity | Significant activity for a risky range that this number belongs to over the last 24 hours. | ✔ | | | `OCR20104` | moderate long-term range activity | Significant activity for a risky range that this number belongs to over the past 90 days. | ✔ | | | `OCR20105` | high short-term range activity | Very significant activity for a risky range that this number belongs to over the last 24 hours. | ✔ | | | `OCR20106` | high long-term range activity | Very significant activity for a risky range that this number belongs to over the past 90 days. | ✔ | | | `OCR20107` | very high long-term range activity | Extremely significant activity for a risky range that this number belongs to over the past 90 days. | ✔ | | | `OCR20108` | very high short-term range activity | Extremely significant activity for a risky range that this number belongs to over the last 24 hours. | ✔ | | | `OCR21001` | moderate activity on risky services | Significant activity on this number to or from risky services over the past 90 days. | ✔ | | | `OCR21002` | high activity on risky services | Very significant activity on this number to or from risky services over the past 90 days. | ✔ | | | `OCR21004` | long-term activity on risky services | Verification traffic on risky services on this number over the past 90 days. | ✔ | | | `OCR21005` | short-term activity on risky services | Verification traffic on risky services on this number over the past 24 hours. | ✔ | | | `OCR21006` | high long-term activity on risky services | High volume of verification traffic on risky services on this number over the past 90 days. | ✔ | | | `OCR21007` | high short-term activity on risky services | High volume of verification traffic on risky services on this number over the past 24 hours. | ✔ | | | `OCR21008` | long-term range activity on risky services | Verification traffic on risky services on the range this number belongs to over the past 90 days. | ✔ | | | `OCR21009` | short-term range activity on risky services | Verification traffic on risky services on the range this number belongs to over the past 24 hours. | ✔ | | | `OCR21010` | high long-term range activity on risky services | High volume of verification traffic on risky services on the range this number belongs to over the past 90 days. | ✔ | | | `OCR21011` | high short-term range activity on risky services | High volume of verification traffic on risky services on the range this number belongs to over the past 24 hours. | ✔ | | | `OCR21012` | very high short-term activity on risky services | Very high volume of verification traffic on risky services on this number over the past 90 days. | ✔ | | | `OCR21013` | very high long-term activity on risky services | Very high volume of verification traffic on risky services on this number over the past 24 hours. | ✔ | | | `OCR21014` | very high short-term range activity on risky services | Very high volume of verification traffic on risky services on the range this number belongs to over the past 90 days. | ✔ | | | `OCR21015` | very high long-term range activity on risky services | Very high volume of verification traffic on risky services on the range this number belongs to over the past 24 hours. | ✔ | | | `OCR21003` | machine-like activity | Behavior pattern that suggests this number is being used by a bot. Although we expect a submitted number engaged in A2P traffic to communicate with automated systems, we don’t expect the user of that number to be an automated system. | ✔ | | | `OCR21016` | machine-like range activity | Extremely high volume of verification traffic in a very short period (less than 1 hour) on the range this number belongs to. | ✔ | | | `OCR22001` | seen in the last 1 day | This number was seen in verification traffic in the last 1 day. | | | | `OCR22007` | seen in the last 7 days | This number was seen in verification traffic in the last 7 days. | | | | `OCR22015` | seen in the last 15 days | This number was seen in verification traffic in the last 15 days. | | | | `OCR22101` | seen in the last 1 month | This number was seen in verification traffic in the last 1 month. | | | | `OCR22102` | seen in the last 2 months | This number was seen in verification traffic in the last 2 months. | | | | `OCR22103` | seen in the last 3 months | This number was seen in verification traffic in the last 3 months. | | | | `OCR22203` | seen more than 3 months ago | This number was not seen in verification traffic in the last 3 months. | | | | `OCR30201` | no P2P data analyzed | P2P data was not analyzed. Cannot classify. | | | | `OCR40001` | premium number | This is a premium number. | ✔ | | | `OCR40002` | VOIP number | This is a VOIP number. | ✔ | | | `OCR40003` | toll-free number | This is a toll-free number. | ✔ | | | `OCR40004` | invalid number | This is an invalid number. | ✔ | | | `OCR40005` | payphone number | This number is associated with a payphone. | ✔ | | | `OCR40006` | voicemail number | This is a voicemail number. | ✔ | | | `OCR40007` | pager number | This number is associated with a pager. | ✔ | | | `OCR40008` | high-risk phone type | This number has another phone type that is risky, and that is not covered by any of the other number_type reason codes. | ✔ | | | `OCR40009` | high-risk carrier | This number is associated with a very risky carrier. | ✔ | | | `OCR40010` | medium-risk carrier | This number is associated with a risky carrier. | ✔ | | | `OCR40011` | high-risk prefix | This number has a risky prefix. | ✔ | | | `OCR40012` | phone too long | This number is invalid because it is too long, even after the application of cleansing rules. | ✔ | | | `OCR40013` | blacklisted number | This number has been flagged as a source of fraud. | ✔ | | | `OCR40014` | high-risk country | The country code of this number is for a risky country, one that originates a disproportionate share of fraud attacks. | ✔ | | | `OCR40015` | technical number | This number is used for special technical purposes by telecom companies, such as for roaming. | | | | `OCR40016` | number used by application | Reserved for use by customers with our applications (for example to send verification messages), but it appears that it is being used for a different purpose. | ✔ | | | `OCR40017` | number whitelisted by customer | You have flagged this number as safe. | | ✔ | | `OCR40018` | phone too short | This number is too short to be a valid phone number. | ✔ | | ###### Email | Code | Description | Details | Risk Indicator | Trust Indicator | | --- | --- | --- | --- | --- | | `OCR60001` | moderate short-term activity | Expected level of activity for this email address over the last 24-hours. | | ✔ | | `OCR60002` | moderate long-term activity | Expected level of activity for this email address over the past 90 days. | | ✔ | | `OCR60003` | moderate short-term activity on risky services | Significant activity for this email address to or from risky services over the last 24 hours . | ✔ | | | `OCR60004` | moderate long-term activity on risky services | Significant activity on this email address to or from risky services over the last 90 days . | ✔ | | | `OCR60005` | high short-term activity | More than expected activity for this email address over the last 24-hours. | ✔ | | | `OCR60006` | high long-term activity | More than expected activity for this email address over the past 90 days. | ✔ | | ###### Device IP | Code | Description | Details | Risk Indicator | Trust Indicator | | --- | --- | --- | --- | --- | | `OCR50001` | moderate short-term activity | Expected level of activity for this IP address over the last 24 hours. | | ✔ | | `OCR50002` | moderate long-term activity | Expected level of activity for this IP address over the past 90 days. | | ✔ | | `OCR50003` | moderate short-term activity on risky services | Significant activity for this IP address to or from risky services over the last 24 hours . | ✔ | | | `OCR50004` | moderate long-term activity on risky services | Significant activity on this IP address to or from risky services over the last 90 days . | ✔ | | | `OCR50005` | high short-term activity | More than expected activity for this IP address over the last 24 hours. | ✔ | | | `OCR50006` | high long-term activity | More than expected activity for this IP address over the past 90 days. | ✔ | | | `OCR50007` | high short-term activity on risky services | Very significant activity for this IP address to or from risky services over the last 24 hours . | ✔ | | | `OCR50008` | high long-term activity on risky services | Very significant activity on this IP address to or from risky services over the last 90 days . | ✔ | | | `OCR50009` | very high short-term activity | Very frequent changes of IP address attributes in verification traffic on this number over the past 24 hours. | ✔ | | | `OCR50010` | very high long-term activity | Very frequent changes of IP address attributes in verification traffic on this number over the past 90 days. | ✔ | | | `OCR50011` | short-term activity on risky services | Changes of IP address attributes in verification traffic on risky services on this number over the past 24 hours. | ✔ | | | `OCR50012` | long-term activity on risky services | Changes of IP address attributes in verification traffic on risky services on this number over the past 90 days. | ✔ | | | `OCR50013` | very high short-term activity on risky services | Very frequent changes of IP address attributes in verification traffic on risky services on this number over the past 24 hours. | ✔ | | | `OCR50014` | very high long-term activity on risky services | Very frequent changes of IP address attributes in verification traffic on risky services on this number over the past 90 days. | ✔ | | | `OCR50015` | anonymous proxy | This IP address is associated with anonymous proxies, which can help conceal the true origins of online traffic. | ✔ | | | `OCR50016` | VPN | This IP address is associated with virtual private networks (VPNs), which can help conceal the true origins of online traffic. | ✔ | | | `OCR50017` | hosting provider | This IP address is associated with web hosting servers, which have a pattern of activity different than genuine end users. | ✔ | | | `OCR50018` | TOR exit node | This IP address is associated with Tor anonymous browsers, which can help conceal the true origins of online traffic. | ✔ | | ## 1-Click Health > **Coverage** > > We can source the data below for **~80% of US adults.** _Exact coverage depends on your user base._ > > > See [Coverage](https://docs.verified.inc/1-click-health/overview.md#coverage) for more information. > **Most Probable Plans are Listed First** > > If we return multiple health insurance plans for a user, they're **ordered from most to least probable.** _All plans we return have a high probability of matching the user, since we filter out low probability ones._ > > > A user may have multiple plans, for example if they have separate ones for medical, dental, or vision. **We recommend that you let the user choose which plan they want to use,** setting the first plan we return (which we deem most probable) as the default choice. > **Payer IDs** > > 1-Click Health can return many different IDs for a given payer: > > > - **`verifiedId`:** This ID identifies the payer within Verified but is not used in external systems. _It never changes,_ so it can reliably used to identify the payer over time. > - **`ids[]`:** These IDs identify the payer in external systems, like healthcare clearing houses or the payer's own system. _They may change_ over time. > > - **`ids[0]`:** This is considered the primary ID for the payer and is generally the ID the payer uses for itself. _It may change_ over time. ### Basic Insurance Details > **Basic insurance details** include high level information about health insurance plans, like the member ID and payer. Full insurance details are available when an eligibility check is run. #### Member ID | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Member ID | `memberId` | `string` | Alphanumeric | Member ID for health insurance plan | `"V000000000"` | #### Payer | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Payer | `payer` | `Payer` | See [`Payer`](https://docs.verified.inc/reference/api/types.md#payer) | Payer for health insurance plan | See `Payer` [Example](https://docs.verified.inc/reference/api/types.md#example-payer) | | ↳ Name | `payer.name` | `string` | `Title Case` | Name of payer for health insurance plan | `"Aviato Health Insurance Of California"` | | ↳ Verified ID | `payer.verifiedId` | `string` | V followed by 6 digits (0-9) | Verified ID (never changes) of payer for health insurance plan | `"V431835"` | | ↳ IDs | `payer.ids` | `string[]` | Array of `string`s | IDs (can change) of payer for health insurance plan — `ids[0]` is considered primary | `["0000A"]` | | ↳ Logo URL | `payer.logoUrl` | `string` | URL | URL for logo of payer for health insurance plan | `"https://assets.verified.inc/1-click/health/payers/11145919-80e4-4cb0-8518-cffbf44ee9fb.png"` | #### Additional Info > **Note** > > Unlike member ID and payer, this additional info isn't generally user facing. | Output | Key | Type | Format(s) | Description | Example | | --- | --- | --- | --- | --- | --- | | Verification Method | `verificationMethod` | **`enum`** Possible values: - `"clearinghouse"` - `"self_attested"` - `null` | `snake_case` | How a health insurance plan was verified | `"clearinghouse"` | | Coverage Types | `coverageTypes` | **`enum[]`** Possible values: - `"medical"` - `"dental"` - `"vision"` | `lower case` | Coverage type(s) of health insurance plan | `"[medical]"` | | Service Type Codes | `serviceTypeCodes` | `string[]` | Array of `string`s | List of [X12 service type codes](https://x12.org/codes/service-type-codes) for health insurance plans | `["30"]` | | Is Medicare | `isMedicare` | `boolean` | - | Whether health insurance plan is for Medicare | `true` | **What Verification Method Means** **`verificationMethod` describes how a health insurance plan was verified:** - `"clearinghouse"`: verified via clearinghouse records - `"self_attested"`: attested by the user themselves (not verified) - `null` You can build custom logic to handle health insurance plans based on their `verificationMethod`, for example applying additional validation if one is `"self_attested"`. ### Full Insurance Details > **Full insurance details** include all known information about a health insurance plan and are available when an eligibility check is run. #### EDI 271 | Output | Key | Type | Format | Description | Example | | --- | --- | --- | --- | --- | --- | | EDI 271 | `edi_271` | `string` | X12 [EDI 271](https://x12.org/examples/005010x279) (Health Care Eligibility Benefit Response) | Address | See X12 [EDI 271 examples](https://x12.org/examples/005010x279) | #### Eligibility | Output | Key | Type | Format | Description | Example | | --- | --- | --- | --- | --- | --- | | Eligibility | `eligibility` | `ParsedEdi271` | See [`ParsedEdi271`](https://docs.verified.inc/reference/api/types.md#parsededi271) | Parsed version of `edi_271` | See `ParsedEdi271` [Example](https://docs.verified.inc/reference/api/types.md##example-parsededi271) | | ↳ Coverage Status | `eligibility.coverageStatus` | **`enum`** Possible values: - `"active"` - `"indeterminate"` - `"inactive"` | `camelCase` | Coverage status of health insurance plan | `"active"` | | ↳ Coverage Type | `eligibility.coverageType` | **`enum[]`** Possible values: - `"medical"` - `"dental"` - `"vision"` | `lower case` | Coverage type(s) of health insurance plan | `"[medical]"` | | ↳ Service Type Codes | `eligibility.serviceTypeCodes` | `string[]` | Array of `string`s | List of [X12 service type codes](https://x12.org/codes/service-type-codes) for health insurance plan | `["30"]` | | ↳ Payer | `eligibility.payer` | `object` | Object with key described below | Payer for health insurance plan | `["0000A"]` | | ↳ ↳ Payer Name | `eligibility.payer.name` | `string` | - | Name of payer for health insurance plan | `"Aetna"` | | ↳ Member | `eligibility.member` | `object` | Object with keys described below | Member for health insurance plan | - | | ↳ ↳ Member ID | `eligibility.member.memberId` | `string` | - | Member ID of member for health insurance plan | `"A484069"` | | ↳ ↳ Full Name | `eligibility.member.fullName` | `string` | - | Full name of member for health insurance plan | - | | ↳ ↳ ↳ First Name | `eligibility.member.fullName.firstName` | `object` | - | First name of member for health insurance plan | `"Richard"` | | ↳ ↳ ↳ Last Name | `eligibility.member.fullName.lastName` | `string` | - | Last name of member for health insurance plan | `"Hendricks"` | | ↳ ↳ Birth Date | `eligibility.member.birthDate` | `string` | yyyy-MM-dd | Birth date of member for health insurance plan | `"1989-08-01"` | | ↳ ↳ Sex | `eligibility.member.sex` | **`enum`** Possible values: - `"Male"` - `"Female"` | `Title Case` | Sex of member for health insurance plan | `"Male"` | | ↳ ↳ Full Name | `eligibility.member.fullName` | `object` | - | Full name of member for health insurance plan | - | | ↳ ↳ ↳ First Name | `eligibility.member.fullName.firstName` | `string` | - | First name of member for health insurance plan | `"Richard"` | | ↳ ↳ Address | `eligibility.member.address` | `object` | Object with keys described below | Address of member for health insurance plan | `{ "line1": "5320 Newell Rd", "line2": "", "city": "Palo Alto", "state": "CA", "zipCode": "94303" }` | | ↳ ↳ ↳ Line 1 | `eligibility.member.address.line1` | `string` | `Title Case` | Line 1 of address of member for health insurance plan | `"5320 Newell Rd"` | | ↳ ↳ ↳ Line 2 | `eligibility.member.address.line2` | `string` | `Title Case` | Line 2 of address of member for health insurance plan | `""` | | ↳ ↳ ↳ City | `eligibility.member.address.city` | `string` | `Title Case` | City of address of member for health insurance plan | `"Palo Alto"` | | ↳ ↳ ↳ State | `eligibility.member.address.state` | `string` | 2 letter abbreviation (last 2 characters of [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for US state/territory) | State of address of member for health insurance plan | `"CA"` | | ↳ ↳ ↳ ZIP Code | `eligibility.member.address.zipCode` | `string` | [ZIP Code](https://en.wikipedia.org/wiki/ZIP_Code) (5 digits, 0-9) | ZIP Code of address of member for health insurance plan | `"94303"` | | ↳ Plan | `eligibility.plan` | `object` | Object with keys described below | Details for health insurance plan | - | | ↳ ↳ Name | `eligibility.plan.name` | `string` | - | Name for health insurance plan | `"Managed Choice Open Access"` | | ↳ ↳ Group Number | `eligibility.plan.groupNumber` | `string` | - | Group number (for employer or purchaser group) for health insurance plan | `"123456-123-12345"` | | ↳ ↳ Group Name | `eligibility.plan.groupName` | `string` | - | Group name (for employer or purchaser group) for health insurance plan | `"Pied Piper"` | | ↳ ↳ Insurance Types | `eligibility.plan.insuranceTypeCodes` | `string[]` | Array of `string`s | List of [X12 insurance descriptor codes](https://x12.org/codes/insurance-descriptor-codes) relevant to benefit of health insurance plan | `["C1"]` | | ↳ ↳ Effective Date | `eligibility.plan.effectiveDate` | `string` | yyyy-MM-dd | Coverage start date for health insurance plan | `"2026-01-01"` | | ↳ ↳ Termination Date | `eligibility.plan.terminationDate` | `string` | yyyy-MM-dd | Coverage end date for health insurance plan | `"2026-12-31"` | | ↳ Benefits | `eligibility.benefits` | `object[]` | Array of objects | Benefits for health insurance plan | - | | ↳ ↳ Type | `eligibility.benefits[i].type` | **`enum`** Possible values: - `"deductible"` - `"outOfPocket"` - `"copay"` - `"coinsurance"` - `"limitation"` | `camelCase` | Type of cost share for health insurance plan | `"deductible"` | | ↳ ↳ Service Type Codes | `eligibility.benefits[i].serviceTypeCodes` | `string[]` | Array of `string`s | List of [X12 service type codes](https://x12.org/codes/service-type-codes) relevant to benefit for health insurance plan | `["30"]` | | ↳ ↳ Insurance Type | `eligibility.benefits[i].insuranceTypeCode` | `string` | - | [X12 insurance descriptor code](https://x12.org/codes/insurance-descriptor-codes) for health insurance plan | `"C1"` | | ↳ ↳ Level | `eligibility.benefits[i].level` | **`enum`** Possible values: - `"individual"` - `"family"` | `camelCase` | Coverage level that `amount` applies to for health insurance plan | `"individual"` | | ↳ ↳ Network | `eligibility.benefits[i].network` | **`enum`** Possible values: - `"in"` - `"out"` | `camelCase` | Whether 271 says health insurance plan is in or out of network (different from the `network` object of type `NetworkDecision`, which is based on network rules you define) | `"in"` | | ↳ ↳ Amount | `eligibility.benefits[i].amount` | `string` | decimal | Dollar amount applicable (copay, or period total for deductible or out of pocket) for health insurance plan | `"1500.00"` | | ↳ ↳ Remaining | `eligibility.benefits[i].remaining` | `string` | decimal | Dollar amount remaining (deductible or out of pocket) for health insurance plan | `"750.00"` | | ↳ ↳ Percent | `eligibility.benefits[i].percent` | `string` | decimal fraction | Patient coinsurance responsibility for health insurance plan | `"0.20"` | | ↳ Contacts | `eligibility.contacts` | `object[]` | Array of objects | Contacts for health insurance plan | - | | ↳ ↳ Name | `eligibility.contacts[i].name` | `string` | - | Entity to contact (e.g. the payer's member services or a carve out administrator) about health insurance plan | `"Aetna Member Services"` | | ↳ ↳ Service Type Codes | `eligibility.contacts[i].serviceTypeCodes` | `string[]` | Array of `string`s | List of [X12 service type codes](https://x12.org/codes/service-type-codes) relevant to contact for health insurance plan | `["30"]` | | ↳ ↳ Phone | `eligibility.contacts[i].phone` | `string` | - | Phone number | `"8005550000"` | | ↳ ↳ Fax | `eligibility.contacts[i].fax` | `string` | - | Fax number | `"8005550001"` | | ↳ ↳ Email | `eligibility.contacts[i].email` | `string` | Email | Email address | `"memberservices@aetna.com"` | | ↳ ↳ URL | `eligibility.contacts[i].url` | `string` | URL | Contact URL | `"https://aetna.com/member-services"` | #### Network Decision > **Info** > > Network decisions are included in outputs when an eligibility check is run and at least one [network rule](https://docs.verified.inc/1-click-health/guides/setup.md#network-rules) is defined. | Output | Key | Type | Format | Description | Example | | --- | --- | --- | --- | --- | --- | | Network | `network` | `NetworkDecision` | See [`NetworkDecision`](https://docs.verified.inc/reference/api/types.md#networkdecision) | Parsed version of `edi_271` | See `NetworkDecision` [Example](https://docs.verified.inc/reference/api/types.md#example-networkdecision) | | ↳ Status | `network.status` | **`enum`** Possible values: - `"IN_NETWORK"` - `"OUT_OF_NETWORK"` - `"INDETERMINATE"` | `UPPER_SNAKE_CASE` | Network status of health insurance plan, based on your network rules | `"IN_NETWORK"` | | ↳ Rules | `network.rules` | `NetworkRule[]` | Array of `NetworkRule`s | List of network rules that matched health insurance plan | - | | ↳ ↳ Rule | `network.rules[i]` | `NetworkRule` | See `NetworkRule` | Network rule that matched health insurance plan | See `NetworkRule` Example | | ↳ ↳ ↳ UUID | `network.rules[i].uuid` | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | Unique identifier for the network rule | `"ab280ee0-5f66-4076-9d1b-255d5f0024e3"` | | ↳ ↳ ↳ Name | `network.rules[i].name` | `string` | - | Name for the network rule | `"Rule 1: Aetna - INN"` | | ↳ ↳ ↳ Status | `network.rules[i].status` | **`enum`** Possible values: - `"IN_NETWORK"` - `"OUT_OF_NETWORK"` - `"INDETERMINATE"` | `UPPER_SNAKE_CASE` | Network status the network rule returns | `"IN_NETWORK"` | | ↳ ↳ ↳ Notes | `network.rules[i].notes` | `string` | - | Notes about the network rule | `"Requires manual review"` | | ↳ ↳ ↳ Metadata | `network.rules[i].metadata` | `object` | - | Metadata for the network rule | `{ "selfPay": false, "priority": 1, "packageId": "123456" }` | | ↳ ↳ ↳ ↳ Metadata | `network.rules[i].metadata[key]` | `string` \| `number` \| `boolean` | - | Piece of metadata for the network rule | `"selfPay": false` | | ↳ ↳ ↳ Start Date | `network.rules[i].startDate` | `string` | yyyy-MM-dd | Start date for the network rule | `"2026-10-01"` | | ↳ ↳ ↳ End Date | `network.rules[i].endDate` | `string` | yyyy-MM-dd | End date for the network rule | `"2027-09-30"` | | ↳ ↳ ↳ Conditions | `network.rules[i].conditions` | `object[]` | Array of objects | Conditions for when the network rule matches | `[ { "key": "payerId", "operator": "EQUAL", "values": ["V404110"] }, { "key": "payerName", "operator": "INCLUDE", "values": ["Aetna"] }, { "key": "state", "operator": "EQUAL", "values": ["MA", "NY", "WA"] }, { "key": "insuranceTypeCodes", "operator": "INCLUDE", "values": ["PR"] }, { "key": "planName", "operator": "INCLUDE", "values": ["PPO"] }, { "key": "relatedEntities", "operator": "INCLUDE", "values": ["Hooli Health"] }, { "key": "groupNumber", "operator": "EQUAL", "values": ["123456-123-12345"] }, { "key": "groupName", "operator": "INCLUDE", "values": ["Pied Piper"] } ]` | | ↳ ↳ ↳ ↳ Condition | `network.rules[i].conditions[j]` | `object` | - | Condition for when the network rule matches | `{ "key": "payerId", "operator": "EQUAL", "values": ["V404110"] },` | | ↳ ↳ ↳ ↳ ↳ Key | `network.rules[i].conditions[j].key` | **`enum`** Possible values: - `"payerId"` - `"payerName"` - `"state"` - `"insuranceTypeCodes"` - `"planName"` - `"relatedEntities"` - `"groupNumber"` - `"groupName"` | `camelCase` | Key for condition | `"payerId"` | | ↳ ↳ ↳ ↳ ↳ Operator | `network.rules[i].conditions[j].operator` | **`enum`** Possible values: - `"EQUAL"` - `"NOT_EQUAL"` - `"INCLUDE"` - `"NOT_INCLUDE"` | `UPPER_SNAKE_CASE` | Operator for condition | `"EQUAL"` | | ↳ ↳ ↳ ↳ ↳ Values | `network.rules[i].conditions[j].values` | `string[]` | `camelCase` | Value(s) for condition | `["V404110"]` | --- Source: https://docs.verified.inc/reference/data/outputs Section: Reference — https://docs.verified.inc/reference.md Previous: Inputs — https://docs.verified.inc/reference/data/inputs.md Next: SDK — https://docs.verified.inc/reference/sdk.md --- # Reference: Native Mobile Module Source: https://docs.verified.inc/reference/native-mobile-module.md ## `VerifiedCellular` The `VerifiedCellular` module allows you to easily choose a cellular connection over a WiFi one from within a native mobile app, which dramatically bosts coverage for the [1-Click Verify](https://docs.verified.inc/1-click-verify.md) autofill and silent channels. ### Usage To use the module: 1. Copy the code from the [GitHub repository](https://github.com/VerifiedInc/verified-cellular) (MIT licensed). 2. Follow the 1-Click Verify [API Integration](https://docs.verified.inc/1-click-verify/guides/api-integration.md) guide. ### Platform Support There are currently versions for the following platforms: - Android (Kotlin) - iOS (Swift) - Flutter - React Native > **Let Us Know if You Need Other Platforms!** > > If you use another platform for native mobile development, let us know and we'll add support for it! --- Source: https://docs.verified.inc/reference/native-mobile-module Section: Reference — https://docs.verified.inc/reference.md Previous: Webhooks — https://docs.verified.inc/reference/webhooks.md --- # Reference: SDK Source: https://docs.verified.inc/reference/sdk.md - [Installation](https://docs.verified.inc/reference/sdk/installation.md): How to install the Verified SDK - [Constants](https://docs.verified.inc/reference/sdk/constants.md): How to use Verified SDK constants - [Methods](https://docs.verified.inc/reference/sdk/methods.md): How to use Verified SDK methods - [Types](https://docs.verified.inc/reference/sdk/types.md): Types used in the Verified SDK --- Source: https://docs.verified.inc/reference/sdk Section: Reference — https://docs.verified.inc/reference.md Previous: Outputs — https://docs.verified.inc/reference/data/outputs.md Next: Installation — https://docs.verified.inc/reference/sdk/installation.md --- # Reference: Constants Source: https://docs.verified.inc/reference/sdk/constants.md ## `SdkResultValues` > Values for an SDK result **SdkResultValues Definition** ```typescript const SdkResultValues = { USER_PHONE_VERIFIED: 'USER_PHONE_VERIFIED', USER_SHARED_CREDENTIALS: 'USER_SHARED_CREDENTIALS', USER_SHARED_HEALTH_DATA: 'USER_SHARED_HEALTH_DATA', USER_OPTED_OUT: 'USER_OPTED_OUT', NO_CREDENTIALS_FOUND: 'NO_CREDENTIALS_FOUND', NO_INSURANCE_FOUND: 'NO_INSURANCE_FOUND', RISK_SCORE_TOO_HIGH: 'RISK_SCORE_TOO_HIGH', MAX_INPUT_ATTEMPTS_EXCEEDED: 'MAX_INPUT_ATTEMPTS_EXCEEDED', MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED: 'MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED', }; ``` ### Example **Example Usage of SdkResultValues** ```typescript import { SdkResultValues, SdkResult, ... } from '@verifiedinc-public/client-sdk'; function handleResult(data: SdkResult) { switch (data.type) { case SdkResultValues.USER_PHONE_VERIFIED: // Success! // Pass data.verificationUuid to your server (to call GET /1-click/verifications/{verificationUuid}) case SdkResultValues.USER_SHARED_CREDENTIALS: // Success! // Pass data.identityUuid to your server (to call GET /1-click/{identityUuid}) case SdkResultValues.USER_SHARED_HEALTH_DATA: // Success! // Pass data.healthDataUuid to your server (to call GET /1-click/health/{healthDataUuid}) case SdkResultValues.USER_OPTED_OUT: // User clicked 'Sign Up Manually Instead' // Take user to manual signup flow case SdkResultValues.NO_CREDENTIALS_FOUND: // OCE013 Verified error code // Take user to manual signup flow. Additional metadata may be available. case SdkResultValues.NO_INSURANCE_FOUND: // No insurance was found // Take user to manual signup flow. Additional metadata may be available. case SdkResultValues.RISK_SCORE_TOO_HIGH: // OCE017 Verified error code // Take user to manual signup flow. Additional metadata may be available. case SdkResultValues.MAX_INPUT_ATTEMPTS_EXCEEDED: // OCE019 Verified error code // Take user to manual signup flow. Additional metadata may be available. case SdkResultValues.MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED: // User tried verification code too many times // Take user to manual signup flow. Additional metadata may be available. } } ``` --- ## `SdkErrorReasons` > Reasons for an SDK error **SdkErrorReasons Definition** ```typescript const SdkErrorReasons = { SESSION_TIMEOUT: 'SESSION_TIMEOUT', INVALID_SESSION_KEY: 'INVALID_SESSION_KEY', SHARE_CREDENTIALS_ERROR: 'SHARE_CREDENTIALS_ERROR', }; ``` ### Example **Example Usage of SdkErrorReasons** ```typescript import { SdkErrorReasons, SdkError, ... } from '@verifiedinc-public/client-sdk'; function handleError(error: SdkError) { switch (error.reason) { case SdkErrorReasons.INVALID_SESSION_KEY: // Create new session key (call POST /client/1-click server side) case SdkErrorReasons.SESSION_TIMEOUT: // Create new session key (call POST /client/1-click server side) // Initalize new VerifiedClientSDK instance case SdkErrorReasons.SHARE_CREDENTIALS_ERROR: // Take user to manual signup flow } } ``` --- ## `SdkEventValues` > Values for SDK intermediary events **SdkEventValues Definition** ```typescript const SdkEventValues = { SDK_READY: 'SDK_READY', USER_STEP_CHANGE: 'USER_STEP_CHANGE', STEP_TIME_SPENT: 'STEP_TIME_SPENT', USER_COMPLETED_PRODUCT: 'USER_COMPLETED_PRODUCT', ONE_CLICK_SIGNUP_FORM_SUBMITTED: 'ONE_CLICK_SIGNUP_FORM_SUBMITTED', ONE_CLICK_HEALTH_FORM_SUBMITTED: 'ONE_CLICK_HEALTH_FORM_SUBMITTED', ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED: 'ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED', VERIFICATION_CODE_RESENT: 'VERIFICATION_CODE_RESENT', }; ``` | Value | When it fires | Extra fields | | --- | --- | --- | | `SDK_READY` | SDK iframe has loaded and is ready to display | — | | `USER_STEP_CHANGE` | User navigated to a new step | `step`, `previousStep?` | | `STEP_TIME_SPENT` | User left a step (fired on navigation away) | `step`, `durationMs` | | `USER_COMPLETED_PRODUCT` | User finished the full product flow | `product` | | `ONE_CLICK_SIGNUP_FORM_SUBMITTED` | 1-Click Signup form was submitted | `form` | | `ONE_CLICK_HEALTH_FORM_SUBMITTED` | 1-Click Health form was submitted | `form` | | `ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED` | 1-Click Health manual-input form was submitted (fullName/birthDate fallback) | `form` | | `VERIFICATION_CODE_RESENT` | User requested a new verification code | — | ### Example **Example Usage of SdkEventValues** ```typescript import { SdkEventValues, SdkEvent, ... } from '@verifiedinc-public/client-sdk'; function handleEvent(event: SdkEvent) { switch (event.type) { case SdkEventValues.SDK_READY: // SDK iframe loaded and is ready to display break; case SdkEventValues.USER_STEP_CHANGE: // event.step, event.previousStep available break; case SdkEventValues.STEP_TIME_SPENT: // event.step, event.durationMs available break; case SdkEventValues.USER_COMPLETED_PRODUCT: // event.product available break; case SdkEventValues.ONE_CLICK_SIGNUP_FORM_SUBMITTED: // event.form available break; case SdkEventValues.ONE_CLICK_HEALTH_FORM_SUBMITTED: // event.form available break; case SdkEventValues.ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED: // event.form available break; case SdkEventValues.VERIFICATION_CODE_RESENT: // User requested a new verification code break; } } ``` --- Source: https://docs.verified.inc/reference/sdk/constants Section: Reference — https://docs.verified.inc/reference.md Previous: Installation — https://docs.verified.inc/reference/sdk/installation.md Next: Methods — https://docs.verified.inc/reference/sdk/methods.md --- # Reference: Installation Source: https://docs.verified.inc/reference/sdk/installation.md ## Install with NPM To install the SDK with NPM, run: ```text npm i @verifiedinc-public/client-sdk ``` ## Install with Script ```html ``` --- Source: https://docs.verified.inc/reference/sdk/installation Section: Reference — https://docs.verified.inc/reference.md Previous: SDK — https://docs.verified.inc/reference/sdk.md Next: Constants — https://docs.verified.inc/reference/sdk/constants.md --- # Reference: Methods Source: https://docs.verified.inc/reference/sdk/methods.md ## `new VerifiedClientSdk(options)` > Initialize the SDK **Constructor Definition** ```typescript new VerifiedClientSdk(options: { sessionKey: string; onResult: (result: SdkResult) => void; onError: (error: SdkError) => void; onEvent?: (event: SdkEvent) => void; environment?: string; }): VerifiedClientSdk ``` ### Parameters #### `sessionKey` (required) The session key obtained from your server via [`POST /client/1-click`](https://docs.verified.inc/reference/api/endpoints.md#post-client1-click). #### `onResult` (required) Callback invoked when the flow reaches a terminal result (e.g. user shared credentials, opted out, no credentials found). ```typescript onResult: (result: SdkResult) => void ``` See [`SdkResult`](https://docs.verified.inc/reference/sdk/types.md#sdkresult) and [`SdkResultValues`](https://docs.verified.inc/reference/sdk/constants.md#sdkresultvalues). #### `onError` (required) Callback invoked when an SDK error occurs (e.g. invalid session key, session timeout). ```typescript onError: (error: SdkError) => void ``` See [`SdkError`](https://docs.verified.inc/reference/sdk/types.md#sdkerror) and [`SdkErrorReasons`](https://docs.verified.inc/reference/sdk/constants.md#sdkerrorreasons). #### `onEvent` (optional) Callback invoked for intermediary events during the flow (e.g. SDK ready, user navigated to a new step). ```typescript onEvent?: (event: SdkEvent) => void ``` See [`SdkEvent`](https://docs.verified.inc/reference/sdk/types.md#sdkevent) and [`SdkEventValues`](https://docs.verified.inc/reference/sdk/constants.md#sdkeventvalues). #### `environment` (optional) The environment to use. Defaults to production. Pass `sandbox` for testing. ### Example **Example Usage of new VerifiedClientSdk()** ```typescript import { VerifiedClientSdk, SdkResult, SdkEvent, SdkError, SdkResultValues, SdkEventValues, SdkErrorReasons, } from '@verifiedinc-public/client-sdk'; const sdk = new VerifiedClientSdk({ sessionKey: 'YOUR_SESSION_KEY', onResult: handleResult, onError: handleError, onEvent: handleEvent, }); function handleResult(result: SdkResult) { switch (result.type) { case SdkResultValues.USER_PHONE_VERIFIED: // Pass data.verificationUuid to your server (to call GET /1-click/verifications/{verificationUuid}) break; case SdkResultValues.USER_SHARED_CREDENTIALS: // Pass result.identityUuid to your server (call GET /1-click/{identityUuid}) break; case SdkResultValues.USER_SHARED_HEALTH_DATA: // Pass data.healthDataUuid to your server (to call GET /1-click/health/{healthDataUuid}) break; case SdkResultValues.USER_OPTED_OUT: // Take user to manual signup flow break; case SdkResultValues.NO_CREDENTIALS_FOUND: // Take user to manual signup flow break; case SdkResultValues.RISK_SCORE_TOO_HIGH: // Take user to manual signup flow break; case SdkResultValues.MAX_INPUT_ATTEMPTS_EXCEEDED: // Take user to manual signup flow break; case SdkResultValues.MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED: // Take user to manual signup flow break; } } function handleError(error: SdkError) { switch (error.reason) { case SdkErrorReasons.INVALID_SESSION_KEY: // Create a new session key on your server break; case SdkErrorReasons.SESSION_TIMEOUT: // Create a new session key and a new VerifiedClientSdk instance break; case SdkErrorReasons.SHARE_CREDENTIALS_ERROR: // Take user to manual signup flow break; } } function handleEvent(event: SdkEvent) { switch (event.type) { case SdkEventValues.SDK_READY: // SDK is ready to display break; case SdkEventValues.USER_STEP_CHANGE: // event.step, event.previousStep available break; case SdkEventValues.STEP_TIME_SPENT: // event.step, event.durationMs available break; case SdkEventValues.USER_COMPLETED_PRODUCT: // event.product available break; case SdkEventValues.ONE_CLICK_SIGNUP_FORM_SUBMITTED: // event.form available break; case SdkEventValues.ONE_CLICK_HEALTH_FORM_SUBMITTED: // event.form available break; case SdkEventValues.ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED: // event.form available break; case SdkEventValues.VERIFICATION_CODE_RESENT: // User requested a new verification code break; } } ``` --- ## `show()` > Show the SDK to the user **show() Definition** ```typescript public show(element?: HTMLElement): void ``` If no `element` is passed, the SDK will be injected into `document.body`. ### Example **Example Usage of show()** ```typescript import { VerifiedClientSdk, ... } from '@verifiedinc-public/client-sdk'; const verifiedClientSdk = new VerifiedClientSdk({ ... }); // Show SDK to user (in document.body if no HTML element is passed) verifiedClientSdk.show(document.getElementById('verifiedClientSdk-container')); ``` --- ## `destroy()` > Destroy the SDK element and invalidate the instance **destroy() Definition** ```typescript public destroy(): void ``` ### Example **Example Usage of destroy()** ```typescript import { VerifiedClientSdk, ... } from '@verifiedinc-public/client-sdk'; const verifiedClientSdk = new VerifiedClientSdk({ ... }); // Destroy the SDK verifiedClientSdk.destroy(); ``` --- Source: https://docs.verified.inc/reference/sdk/methods Section: Reference — https://docs.verified.inc/reference.md Previous: Constants — https://docs.verified.inc/reference/sdk/constants.md Next: Types — https://docs.verified.inc/reference/sdk/types.md --- # Reference: Types Source: https://docs.verified.inc/reference/sdk/types.md ## `SdkResult` **SdkResult Type** ```typescript export type SdkStep = | 'consent' | 'autoPhone' | 'phone' | 'verificationCode' | 'birthday' | 'ssn4' | 'fullName.firstName' | 'info' | 'healthManualInput' | 'healthDataLoading' | 'healthInfo'; export type SdkResultData = { healthDataUuid: string | null; identityUuid: string | null; verificationUuid: string | null; redirectUrl: string | null; birthDate: string | null; birthDateMismatched: boolean | null; phone: string | null; ssn4: string | null; ssn4Mismatched: boolean | null; fullName: { firstName: string | null; } | null; fullNameMismatched: boolean | null; step: SdkStep; }; type SdkResultDataNullable = Nullable; type SdkResultUserOptedOut = | (SdkResultDataNullable & { type: typeof SdkResultValues.USER_OPTED_OUT; step: 'phone'; }) | (SdkResultData & { type: typeof SdkResultValues.USER_OPTED_OUT; step: Exclude; }); type SdkResultNoCredentialsFound = { type: typeof SdkResultValues.NO_CREDENTIALS_FOUND; } & SdkResultData; type SdkResultNoInsuranceFound = { type: typeof SdkResultValues.NO_INSURANCE_FOUND; } & SdkResultData; type SdkResultRiskScoreTooHigh = { type: typeof SdkResultValues.RISK_SCORE_TOO_HIGH; } & SdkResultData; type SdkResultMaxInputsAttemptsExceeded = { type: typeof SdkResultValues.MAX_INPUT_ATTEMPTS_EXCEEDED; } & SdkResultData; type SdkResultMaxVerificationCodeAttemptsExceeded = { type: typeof SdkResultValues.MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED; } & SdkResultData; export type SdkResultUserSharedCredentials = { type: typeof SdkResultValues.USER_SHARED_CREDENTIALS; identityUuid: string; } & SdkResultData; export type SdkResultUserSharedHealthData = { type: typeof SdkResultValues.USER_SHARED_HEALTH_DATA; healthDataUuid: string; } & SdkResultData; export type SdkResultUserPhoneVerified = { type: typeof SdkResultValues.USER_PHONE_VERIFIED; verificationUuid: string; } & SdkResultData; export type SdkResult = | SdkResultUserOptedOut | SdkResultNoCredentialsFound | SdkResultNoInsuranceFound | SdkResultRiskScoreTooHigh | SdkResultMaxInputsAttemptsExceeded | SdkResultMaxVerificationCodeAttemptsExceeded | SdkResultUserSharedCredentials | SdkResultUserSharedHealthData | SdkResultUserPhoneVerified; ``` See the [`SdkResultValues` constant](https://docs.verified.inc/reference/sdk/constants.md#sdkresultvalues). ### Examples **SdkResult Example (User Phone Verified)** ```typescript { "type": "USER_PHONE_VERIFIED" "identityUuid": null, "healthDataUuid": null, "verificationUuid": "96c15f15-e726-40e7-bb2f-882a37b9f31f", "redirectUrl": "https://verified.inc/", "birthDate": null, "birthDateMismatched": null, "phone": "+12125550010", "ssn4": null, "ssn4Mismatched": null, "fullName": null, "fullNameMismatched": null, "step": "verificationCode", } ``` **SdkResult Example (User Shared Credentials)** ```typescript { type: 'USER_SHARED_CREDENTIALS', identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', redirectUrl: "https://verified.inc/?identityUuid=3cf51925-e9fa-44f3-b091-1e1c63f4cc3d", birthDate: "1989-08-01", birthDateMismatched: null, phone: "+12125550010", ssn4: "6789", ssn4Mismatched: null, step: 'info' } ``` **SdkResult Example (User Shared Health Data)** ```typescript { type: 'USER_SHARED_HEALTH_DATA', identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', healthDataUuid: 'c20525b0-1811-4467-92c9-56267588e600', redirectUrl: "https://verified.inc/?identityUuid=5635fbd7-e97f-4af4-9f1f-2769fa17aa88&healthDataUuid=c20525b0-1811-4467-92c9-56267588e600", birthDate: "1989-08-01", birthDateMismatched: null, phone: "+12125550010", ssn4: "6789", ssn4Mismatched: null, step: 'healthInfo' } ``` **SdkResult Example (User Opted Out)** ```typescript { type: 'USER_OPTED_OUT', identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', redirectUrl: "https://verified.inc/?identityUuid=3cf51925-e9fa-44f3-b091-1e1c63f4cc3d", birthDate: null, birthDateMismatched: null, phone: "+12125550010", ssn4: null, ssn4Mismatched: null, step: 'phone' } ``` **SdkResult Example (No Credentials Found)** ```typescript { type: 'NO_CREDENTIALS_FOUND', identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', redirectUrl: "https://verified.inc/?identityUuid=3cf51925-e9fa-44f3-b091-1e1c63f4cc3d", birthDate: "1989-08-01", birthDateMismatched: null, phone: "+12125550010", ssn4: "6789", ssn4Mismatched: null, step: 'ssn4' } ``` **SdkResult Example (No Insurance Found)** ```typescript { type: 'NO_INSURANCE_FOUND', identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', healthDataUuid: 'c20525b0-1811-4467-92c9-56267588e600', redirectUrl: "https://verified.inc/?identityUuid=5635fbd7-e97f-4af4-9f1f-2769fa17aa88&healthDataUuid=c20525b0-1811-4467-92c9-56267588e600", birthDate: "1989-08-01", birthDateMismatched: null, phone: "+12125550010", ssn4: "6789", ssn4Mismatched: null, step: 'ssn4' } ``` **SdkResult Example (Risk Score Too High)** ```typescript { type: 'RISK_SCORE_TOO_HIGH', identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', redirectUrl: "https://verified.inc/?identityUuid=3cf51925-e9fa-44f3-b091-1e1c63f4cc3d", birthDate: "1989-08-01", birthDateMismatched: null, phone: "+12125550010", ssn4: "6789", ssn4Mismatched: null, step: 'verificationCode' } ``` **SdkResult Example (Max Input Attempts Exceeded)** ```typescript { type: 'MAX_INPUT_ATTEMPTS_EXCEEDED', identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', redirectUrl: "https://verified.inc/?identityUuid=3cf51925-e9fa-44f3-b091-1e1c63f4cc3d", birthDate: "1989-08-01", birthDateMismatched: false, phone: "+12125550010", ssn4: "6789", ssn4Mismatched: true, step: 'ssn4' } ``` **SdkResult Example (Max OTP Attempts Exceeded)** ```typescript { type: 'MAX_VERIFICATION_CODE_ATTEMPTS_EXCEEDED', identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', redirectUrl: "https://verified.inc/?identityUuid=3cf51925-e9fa-44f3-b091-1e1c63f4cc3d", birthDate: "1989-08-01", birthDateMismatched: null, phone: "+12125550010", ssn4: "6789", ssn4Mismatched: null, step: 'verificationCode' } ``` --- ## `SdkError` ```typescript type SdkError = { reason: typeof SdkErrorReasons; }; ``` See the [`SdkErrorReasons` constant](https://docs.verified.inc/reference/sdk/constants.md#sdkerrorreasons). ### Examples **SdkError Example (Session Timeout)** ```typescript { reason: 'SESSION_TIMEOUT'; } ``` **SdkError Example (Invalid Session Key)** ```typescript { reason: 'INVALID_SESSION_KEY'; } ``` **SdkError Example (Share Credentials Error)** ```typescript { reason: 'SHARE_CREDENTIALS_ERROR'; } ``` --- ## `SdkEvent` **SdkEvent Type** ```typescript type SdkProduct = '1-click-signup' | '1-click-health' | '1-click-verify'; type SdkMetadata = { identityUuid: string | null; redirectUrl: string | null; birthDate: string | null; birthDateMismatched: boolean | null; phone: string | null; ssn4: string | null; ssn4Mismatched: boolean | null; fullName: { firstName: string | null; } | null; fullNameMismatched: boolean | null; step: SdkStep; }; export type SdkEvent = { metadata: SdkMetadata; } & ( | { type: 'SDK_READY' } | { type: 'USER_STEP_CHANGE'; step: SdkStep; previousStep?: SdkStep } | { type: 'STEP_TIME_SPENT'; step: SdkStep; durationMs: number } | { type: 'USER_COMPLETED_PRODUCT'; product: SdkProduct } | { type: 'ONE_CLICK_SIGNUP_FORM_SUBMITTED'; form: Record } | { type: 'ONE_CLICK_HEALTH_FORM_SUBMITTED'; form: Record } | { type: 'ONE_CLICK_HEALTH_MANUAL_INPUT_FORM_SUBMITTED'; form: { fullName: { firstName: string; lastName: string; }; birthDate: string; }; } | { type: 'VERIFICATION_CODE_RESENT' } ); ``` See the [`SdkEventValues` constant](https://docs.verified.inc/reference/sdk/constants.md#sdkeventvalues). ### Examples **SdkEvent Example (SDK Ready)** ```typescript { type: 'SDK_READY', metadata: { identityUuid: null, redirectUrl: null, birthDate: null, birthDateMismatched: null, phone: null, ssn4: null, ssn4Mismatched: null, fullName: null, fullNameMismatched: null, step: 'consent' } } ``` **SdkEvent Example (User Step Change)** ```typescript { type: 'USER_STEP_CHANGE', step: 'verificationCode', previousStep: 'phone', metadata: { identityUuid: null, redirectUrl: null, birthDate: null, birthDateMismatched: null, phone: '+12125550010', ssn4: null, ssn4Mismatched: null, fullName: null, fullNameMismatched: null, step: 'phone' } } ``` **SdkEvent Example (Step Time Spent)** ```typescript { type: 'STEP_TIME_SPENT', step: 'phone', durationMs: 3200, metadata: { identityUuid: null, redirectUrl: null, birthDate: null, birthDateMismatched: null, phone: '+12125550010', ssn4: null, ssn4Mismatched: null, fullName: null, fullNameMismatched: null, step: 'phone' } } ``` **SdkEvent Example (User Completed Product)** ```typescript { type: 'USER_COMPLETED_PRODUCT', product: '1-click-signup', metadata: { identityUuid: '3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', redirectUrl: 'https://verified.inc/?identityUuid=3cf51925-e9fa-44f3-b091-1e1c63f4cc3d', birthDate: '1989-08-01', birthDateMismatched: null, phone: '+12125550010', ssn4: '6789', ssn4Mismatched: null, fullName: null, fullNameMismatched: null, step: 'info' } } ``` --- Source: https://docs.verified.inc/reference/sdk/types Section: Reference — https://docs.verified.inc/reference.md Previous: Methods — https://docs.verified.inc/reference/sdk/methods.md Next: API — https://docs.verified.inc/reference/api.md --- # Reference: Webhooks Source: https://docs.verified.inc/reference/webhooks.md You can configure webhooks for 1-Click Health: see [here](https://docs.verified.inc/1-click-health/guides/setup.md#webhooks) in the Setup guide. This allows you to receive 1-Click Health [output](https://docs.verified.inc/reference/data/outputs.md#1-click-health) data asynchronously. (You can alternatively poll the [`GET /1-click/health`](https://docs.verified.inc/reference/api/endpoints.md#get-1-clickhealth) endpoint.) | | | | --- | --- | | Method | `POST` | | URL | Defined by [webhooks](https://docs.verified.inc/1-click-health/guides/setup.md#webhooks) brand setting | | Authentication | Defined by [webhooks](https://docs.verified.inc/1-click-health/guides/setup.md#webhooks) brand setting (None, API Key, or Basic Auth) | | Retries | After 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours, and 12 hours (in total, about 22 hours from first attempt) | | Expected response | Respond with a `2xx` status (for example `200`) to acknowledge receipt; a timeout or response with any other status is treated as a failed delivery and triggers a retry | | Delivery | At least once (multiple deliveries possible) | | Retention | After final retry, undelivered event is moved to dead-letter queue (DLQ) and retained there for 14 days | ## Headers Each webhook request includes the following headers: | Header | Value | Notes | | --- | --- | --- | | `Content-Type` | `application/json` | The payload is always sent as JSON. | | `User-Agent` | `VerifiedInc-Webhook/1.0` | Identifies the request as coming from Verified. | | `X-Webhook-Timestamp` | Timestamp used to sign the request | Use this exact value when verifying the webhook signature. | | `X-Webhook-Signature` | `v1=...` | HMAC-SHA256 signature of the timestamp and raw request body. | Any authentication headers you configure in your [webhooks](https://docs.verified.inc/1-click-health/guides/setup.md#webhooks) brand setting (API Key or Basic Auth) are also included. ## Signatures When you define a webhook in the [webhooks](https://docs.verified.inc/1-click-health/guides/setup.md#webhooks) brand setting, or rotate the secret of an existing webhook, we display a new signing secret but only once: store it securely. Verify each webhook using the signing secret for your webhook: 1. Read the raw request body before parsing JSON, and read `X-Webhook-Timestamp` from the request headers. 2. Compute the expected signature from the secret, timestamp, and raw body, then compare it with the `v1` value in `X-Webhook-Signature` using a constant-time comparison: ```text v1=HMAC-SHA256(secret, `${timestamp}.${rawBody}`) ``` 3. Reject requests with a timestamp outside your allowed freshness window to reduce replay risk. > **Note** > > For 24 hours after rotation, we sign requests with both the previous and new secret. During this overlap, accept a valid signature from either secret. ## Payload **GET /1-click/health Response Body** ```typescript { event: "1-click.health.lookup", healthDataUuid: string, externalReference?: string, sentAt: integer, ...1ClickHealthEntity } ``` | Property | Type | Format | Description | Example | | --- | --- | --- | --- | --- | | `event` | `string` | - | Response from the 1-Click Health lookup | `"1-click.health.lookup"` | | `healthDataUuid` | `string` | [Version 4 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) | Unique identifier for the [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) that will be returned at the end of the 1-Click Health flow | `"9e12fe5b-5bb8-410a-ac6b-6e053e4c7e8d"` | | `externalReference` | `string` | 1–256 characters | Optional customer identifier echoed unchanged from the `POST /1-click/health` request; not a lookup key | `"appointment-1042"` | | `sentAt` | `integer` | [Unix time](https://en.wikipedia.org/wiki/Unix_time) (milliseconds) | When the payload was sent | `1760053705000` | | `...` | [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) | See [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) | [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) for the 1-Click Health flow | See [`1ClickHealthEntity`](https://docs.verified.inc/reference/api/types.md#1clickhealthentity) | Webhook payloads are delivered at least once. The same event may be delivered more than once, including during retries, so deduplicate using `healthDataUuid` as the idempotency key. The `externalReference` is for correlating the result with your own record: it can't be used to retrieve the result. > **Webhooks for 1-Click Signup are Coming Soon!** > > We don't yet support webhooks for 1-Click Signup, but those are coming soon. If you'd like to be notified when they're available, please email us at [Support@Verified.inc](mailto:Support@Verified.inc). --- Source: https://docs.verified.inc/reference/webhooks Section: Reference — https://docs.verified.inc/reference.md Previous: Types — https://docs.verified.inc/reference/api/types.md Next: Native Mobile Module — https://docs.verified.inc/reference/native-mobile-module.md