Scan your ID once. Share only:

Or whatever is relevant—not your entire ID.

What to expect

A clear request. A guided check. Your approval.

Clear

See who is asking and exactly what they need.

Instant

Verification runs directly on your device, without a routine manual-review queue.

Reusable

Save a completed verification on your device and reuse it when it remains valid and is accepted.

Private

Approve only the requested information.

Phone held over a passport for NFC identity verification

How it works

Start from a Verihop link or QR code. You see who is asking and which details they need before anything is shared.

1

Open the request

Verihop shows the requesting service and the exact details it wants.

2

Verify on your phone

Follow the guided identity-document and live-holder checks available for the request.

3

Approve and continue

Approve the requested details and continue where you left off.

TRY DEMO See an age check from start to finish. Complete the flow on your phone and see exactly what the demo receives.

A better handoff

Identity checks without the usual oversharing.

Share the approved result without making another full-document upload the default.

Typical document-upload flow With Verihop
Upload a documentThe service may ask for a complete document image. Share requested detailsThe service receives the verified details you approve.
Repeat verificationAnother service may require another document and holder check. Reuse when acceptedApprove a saved verification when it remains valid and the service accepts it.
Another copy to handleUploaded identity documents create another sensitive file to protect. Keep reusable verification with youVerihop does not build a central library of passport or selfie files.

Want more detail about how identity information is handled? Read the privacy notice.

Made for real life

Prove what's needed. Get on with what you were doing.

Age

Prove you're old enough.

Confirm your age without sharing a complete passport copy.

Rentals & services

Verify who you are.

Share requested verified details without typing or uploading everything again.

Account onboarding

Verify and continue.

Complete the check and return directly to the service.

Account access

Prove it's really you.

Verify for sensitive actions, support, or account recovery.

Building one of these experiences? See how Verihop works for companies, integrations and customer journeys. Explore FOR COMPANIES →

Person holding a phone during a guided selfie check

Ready when you are

See what a Verihop request feels like.

Try the age-check demo, review the exact requested details, and complete the phone flow.

Personal Identity API

One Sessions API. Every device path handled.

Create a verification session from your backend, send the returned launch URL, and securely fetch the user-approved result. Verihop handles the verification, consent, and device routing.

Need the product and business overview? See FOR COMPANIES →

INTEGRATION STEPS

Four steps from request to verified result.

View integration steps

1. Create the session

POST /v1/sessions

2. Send the returned URL

Use the returned launch_url or qr_url.

3. Receive the callback

Capture session_id, result_token, and optional signed callback data where applicable.

4. Fetch the result

GET /v1/sessions/{id}/result

API keys stay on your backend. Verified personal data is not placed in callback URLs.

Flows & Support

A backend-owned session starts the flow; approved identity information is fetched server-to-server.

View integration flow
View User Flow

Test in the Customer Portal

Run a Session Example before writing the production integration.

Use a test account to choose requested fields, configure a callback, run the Session Example, and inspect the real request, response, session status, and structured result.

Open Developer Area

Agent-ready integration skill

Give your coding agent the Verihop playbook.

One secure source for test setup, server-side sessions, callbacks, results, launch behavior, and concise patterns for Node, Python, Swift, Kotlin, Java, Go, PHP, Ruby, and cURL.

Download SKILL.md

Postman collection

Import the Verihop API collection.

Set your API key and callback URL, create a session, then paste the callback result token to fetch the verified result.

Download Postman Collection

Basics

Path: https://api.verihop.com

Authenticate partner requests from your backend only:

Authorization: Bearer <api_key>

Create a test account first to get an API key for integration. Test-account responses are redacted by design, and the same account can later be upgraded to active for production.

Create a test account

POST /v1/sessions

Create a verification session and get deep link + signed session token.

Session timing and expiry
  • A session is valid for 15 minutes from creation. This is one total window for opening the link, document checks, review, and approval; it does not reset after MRZ, NFC, or selfie.
  • When mobile verification needs a security challenge, it is valid for up to 10 minutes, but never beyond the session expiry. Both iOS and Android use the same backend-issued expiry and a 15-second safety margin.
  • When expires_at passes, create a new session. Do not reuse an expired launch URL, QR code, or callback token.

Headers

Authorization: Bearer <api_key>
Content-Type: application/json
Idempotency-Key: <uuid>  // recommended

Body

{
  "app": "RideNow",
  "header": "Age check",
  "fields": ["legalName", "over18", "documentNumber"],
  "callback": "ridenow://verified"
}
Body element guide
  • app: Partner app display name shown inside Verihop (max 80 chars).
  • header: Short verification title shown to the user (max 120 chars).
  • fields: Requested field tokens; if omitted/empty, fallback is legalName and over18.
  • callback: Base return URL sent in POST /v1/sessions. Verihop opens it after completion and appends session_id, result_token (success path), and optional callback_jwt; required and allowlist-validated in your production policy.
Header element guide
  • Authorization: Partner API key in bearer format.
  • Content-Type: Use application/json for request body parsing.
  • Idempotency-Key: Retry key for create-session dedupe; send UUID v4/v7 and reuse only for same payload retries.
Success 201 response
{
  "session_id": "sess_123",
  "expires_at": 1730000000,
  "launch_url": "https://www.verihop.com/verify.html?session_id=sess_123&token=h_abc123",
  "app_clip_url": "https://appclip.apple.com/id?p=KycBox.VerifyBox.Clip&session_id=sess_123&token=h_abc123",
  "qr_url": "https://www.verihop.com/verify.html?session_id=sess_123&token=h_abc123",
  "status_url": "https://api.verihop.com/v1/sessions/sess_123"
}
Response element guide
  • session_id: Unique session identifier for tracking and result retrieval.
  • expires_at: Session expiry (Unix epoch seconds).
  • launch_url: Primary URL for web, Android, QR codes, emails, SMS, and general handoff.
  • app_clip_url: Direct native App Clip URL for iOS partner apps. Open it exactly as returned; do not reconstruct it.
  • qr_url: QR-safe URL; currently equivalent to launch_url.
  • status_url: Session status endpoint for server-side polling.
Common errors
  • 401 missing_bearer_token, 401 invalid_api_key
  • 403 customer_inactive
  • 400 missing_callback_url, invalid_callback_url, callback_host_not_allowed
  • 400 field_not_allowed, invalid_field_token, request_too_large
  • 409 idempotency_key_conflict, idempotency_key_in_progress
  • 429 rate_limit_exceeded, daily_quota_exceeded

GET /v1/sessions/{id}

Non-PII session status endpoint for desktop orchestration and monitoring.

Authorization: Bearer <api_key>
Success 200 response
{
  "session_id": "sess_123",
  "status": "issued",
  "issued_at": 1730000000,
  "expires_at": 1730000300,
  "last_status": null,
  "last_status_at": null,
  "opened_at": null,
  "result_available": false,
  "result_token_expires_at": null
}

Polling is read-only and never marks a session as opened. A completed test-key session also returns a short-lived result_token for the synthetic Postman flow. Live result tokens remain callback-only.

GET /.well-known/jwks.json

Public signing keyset endpoint for verifying callback_jwt on partner backends.

Success 200 response
{
  "keys": [
    {
      "kty": "RSA",
      "kid": "kid_2025_01",
      "alg": "RS256",
      "use": "sig",
      "n": "...",
      "e": "AQAB"
    }
  ]
}

GET /v1/sessions/{id}/result

Fetch verified result payload server-to-server using one-time result token.

A launch token starts with h_ and cannot be used here. X-Result-Token requires the short-lived res_ token from a live callback or completed test-key status response.

Authorization: Bearer <api_key>
X-Result-Token: <result_token>
Success 200 response
{
  "session_id": "sess_123",
  "status": "success",
  "result": {
    "legalName": "Jane Doe",
    "over18": "yes"
  }
}
Common errors
  • 401 missing_bearer_token, invalid_api_key, missing_result_token
  • 403 customer_mismatch, invalid_result_token
  • 410 result_token_expired
  • 409 result_token_used
  • 404 result_not_available, session_not_found

Field Catalog

Request field tokens (fields)

legalName, dateOfBirth, over18, over21, passport, idCard, documentNumber, documentExpiry, documentCountry, documentNationality

Response result fields

The result contains only the requested supported fields approved by the user. Document-kind requirements such as passport and idCard do not automatically include every document attribute.

Frequently Asked Questions

Can the flow start from a desktop website with a QR code?

Yes. Your backend creates a session using POST /v1/sessions, then renders the returned qr_url inside a QR shown on the desktop page. The user scans that QR with their phone and Verihop opens the best available experience.

Should the QR open a website first, or open Verihop directly?

Best UX is direct launch: encode the returned qr_url. It is the same universal HTTPS handoff as launch_url and supports app, lightweight, and web fallback paths.

Is the deep link the same for iOS and Android?

Use launch_url on Android and for general web handoff. An iOS partner app that wants the native App Clip card should open the returned app_clip_url. Your callback shape remains the same: Verihop appends session_id, success-path result_token, and optional callback_jwt.

How do I launch the Verihop App Clip directly from my iOS app?

Create the session on your backend and send the returned app_clip_url to your iOS app. Open that URL with SwiftUI Link or UIApplication.open on iOS 17 or later. Do not parse launch_url, copy its token, or hard-code Verihop's App Clip bundle ID. If the full Verihop app is installed, iOS opens it instead while preserving the same session.

What should Android partner apps register for callbacks?

If you use a custom callback such as ridenow://verified, the Android partner app must declare an intent filter for that scheme and host. If you use an https:// callback for desktop or web-started flows, treat it as a backend endpoint unless your Android app owns that domain with verified App Links.

For desktop/web-initiated flows, what callback should I use?

Use an https:// callback endpoint on your backend. After Verihop completes, your server receives session_id and result_token, then fetches GET /v1/sessions/{id}/result server-to-server.

Do partner clients need to verify the jwt from POST /v1/sessions?

No. That token is for Verihop app consumption. Partners should treat it as opaque transport data and use launch_url to launch Verihop.

Why does callback only include session_id and result_token?

Callback query parameters are transport metadata only. Verified personal data is intentionally not sent in callback URLs. Your backend must exchange the one-time result_token to fetch the result payload securely. If enabled, callback_jwt can be verified via JWKS for callback authenticity.

Should partners verify callback_jwt, and where?

Yes, on partner backend when present. Verify signature and claims using Verihop JWKS at GET /.well-known/jwks.json. Validate issuer/audience/expiry and ensure JWT claims match callback query values.

Can my frontend call GET /v1/sessions/{id}/result directly?

No. Keep API keys server-side and fetch results from your backend only. The frontend/web client should only handle UI and pass state to your backend session.

How should we handle expiration and retries?

Create a new session when a session expires or the user abandons the flow. result_token is short-lived and single-use; if consumed or expired, restart with a new POST /v1/sessions.

What if Verihop is not installed on the phone?

Provide a fallback page behind your QR flow that can explain how to install/open Verihop and then continue. After install, create a new session and show a fresh QR (do not reuse stale sessions).

How does idempotency work, and is misuse protected?

POST /v1/sessions supports Idempotency-Key for retry-safe create-session calls: same key + same payload replays the original response, while same key + different payload returns 409 idempotency_key_conflict. Misuse is further mitigated with API-key auth, callback allowlist policy, field allowlist checks, per-customer rate limits/quota, short session TTL, and one-time result_token.

Example

Open Movie Age-Check Demo

Start in test mode

Create a session and inspect the full handoff.

Use a redacted test account, keep credentials on your backend, and move to production only after callback and field controls are approved.

Personal Identity Verification

Verify the right person. Collect only what you need.

Add reliable identity and eligibility checks to customer journeys while limiting the sensitive data your company needs to handle.

Customers verify on their phone and approve only the information needed for your decision.

  • Verified structured fields
  • Guided mobile journey
  • No document-image result
  • Secure result delivery
Verihop flow overview on device Verihop flow step for document and profile checks

Why this matters

Identity checks shouldn't create more friction or data than the decision needs.

Customers abandon onboarding when verification takes too long or asks for too much. Companies remain responsible for the sensitive information they collect and protect.

>50%

of people in the Netherlands surveyed said they would never share a copy of their passport, ID card or driving licence online.

CBS, 2025

Verification doesn't have to mean another identity-document copy.

Verihop lets your product request the approved, verified information needed for a decision without making another passport or selfie file the result.

Identity document data flowing through a phone into approved fields

A better verification flow

Strong identity checks without the usual friction and data footprint.

Verify the person, receive only what your decision needs, and avoid making document copies and manual review the default.

Typical document-upload flow With Verihop
Verify from an imageThe customer submits photos of an identity document for verification. Verify the chip + holderMRZ + NFC + biometrics combine document data, cryptographic chip verification, and a live-holder check.
Wait for the resultAutomated checks may require additional checks or manual review before a decision is available. Get an instant resultSuccessful verification produces the result immediately, with no routine manual-review queue.
Collect the documentPassport, ID, or selfie files may become sensitive data your company needs to receive, store, and protect. Receive only what you needYour system receives the approved verified information, not the customer's passport image or selfie.
Verify them againReturning customers may need to repeat the document and holder check for another request. Reuse when acceptedCustomers can approve a saved on-device verification when it remains valid and your policy accepts it.
3 layersMRZ + NFC + biometrics
< 60 secTypical supported verification*
InstantNo routine manual review
0 raw ID filesPassport/selfie excluded from the result
ReusableWhen valid and accepted

*Typical supported verification flow. Completion time can vary by device, document and connection.

Where Verihop fits

Start with what you actually need to know.

Sometimes you need someone's identity. Sometimes you only need one reliable answer.

Age & eligibility

Is this person over 18?

Request a verified age result without receiving a complete passport copy.

Account & service onboarding

Who is signing up?

Request the verified identity details needed for your onboarding decision.

Rentals & trusted access

Is this the right person?

Verify identity before providing a vehicle, property, equipment, or controlled service.

Account recovery & support

Am I speaking to the account holder?

Request a fresh verification for sensitive support or recovery actions.

Verihop verifies the information. Your company decides what it means for the customer journey.

How it works

Ask. Verify. Continue.

1

Request what you need

Your product starts a Verihop verification for the approved identity information it needs.

2

Send the Verihop link

The customer opens the link or QR code and completes the verification on their phone.

3

Receive the approved result

Once the customer approves, the verified information is returned securely to your system.

Verihop handles the verification. You keep the decision.

Verihop handles supported document reading, holder checks, consent, device routing, and secure result delivery. Your product applies the business rule that follows.

Building the integration? Explore FOR DEVS →

Customer Portal

Test, go live, and operate from one Portal.

Start in test mode, move through production approval, and manage the live service from the same company workspace.

Test

Run redacted sessions and inspect the complete handoff before production.

Go live

Submit your production setup and approved fields for review.

Operate

Monitor usage, billing, callbacks, and session activity.

Control

Manage team access, MFA, trusted devices, and audit evidence.

Developers can test requests, callbacks, and results from the Developer area. See FOR DEVS →

Secure vault representing privacy by design

Start with one use case

What does your product actually need to know?

Bring the customer journey, the decision you need to make and the information you currently collect. We'll map the smallest useful verification request and a clear path to testing it.