Your Personal Identity

Verify once. Share only what is needed.

Verihop is a personal identity app. Verify who you are from an official identity document on your phone, then approve exactly what each service receives. No account is required to start.

  • No account to start
  • You approve every request
  • Save for faster reuse

Start from the link. On supported iPhones, the first verification can open without installing the full app; on Android, continue in Verihop.

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 one guided check using your identity document and a live face check.

3

Approve and continue

Only the details you approve are returned. Save the verification in the app to reuse it later when it is still valid and accepted.

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.

Layered checks, a same-flow result, and less personal data handed over.

Typical upload checks With Verihop
Send the whole documentA full copy is uploaded for each new check. Share only requested fieldsThe service receives only the details you approve.
May wait for manual reviewUploaded documents can enter a review queue. Get the result in the same flowAutomated checks complete while you are verifying.
Start again every timeRepeat the document and face steps for another service. Save securely for reuseYour verification is encrypted on your device and can be reused when accepted.
Rely on an unclear checkYou may not know which document and holder checks were performed. Use layered checks every timeMRZ, NFC chip data, an active liveness challenge, and face matching are required. Supported iPhones also add TrueDepth evidence.
Leave copies with providersDocument files may remain in another company's systems. Keep your reusable identity on your deviceVerihop does not build a central library of your documents or selfies.

Privacy detail: the requesting company receives no document or selfie files. One chip portrait and one selfie are processed transiently for the holder match; the full document is not uploaded. Read the privacy notice.

Made for real life

One verified personal identity. Many useful proofs.

Result: age eligibility

Age-restricted checkout

Confirm an age requirement without sending the shop a copy of your passport.

Result: selected identity details

Rentals and services

Share the requested name, age, or document details without typing them again.

Result: approved onboarding fields

Account onboarding

Complete one guided phone flow and return directly to the service you chose.

Personal Identity API

One Sessions API. We orchestrate the flow.

Request verified personal identity fields, send the returned launch URL, receive callback tokens, and fetch the user-approved result server-to-server. The same contract covers iOS, Android, App Clip, app links, and desktop QR flows.

FIVE-MINUTE QUICKSTART

Create one session. Open one URL.

Keep the API key on your backend, request only the fields you need, and send the user to the returned launch_url.

curl https://api.verihop.com/v1/sessions \
  -H "Authorization: Bearer <api_key>" \
  -H "Content-Type: application/json" \
  -d '{
    "app": "RideNow",
    "header": "Age check",
    "fields": ["legalName", "over18"],
    "callback": "https://ridenow.example/verified"
  }'

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

Quick Integration Steps

  1. Create a session via POST /v1/sessions with callback URL and requested fields.
  2. Send the user to the returned launch_url.
  3. Handle callback and capture session_id and result_token.
  4. Optional: poll GET /v1/sessions/{id} for status updates.
  5. Fetch verified data server-to-server via GET /v1/sessions/{id}/result.
View Integration Flow
View User Flow

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

POST /v1/sessions

Create a verification session and get deep link + signed session 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,
  "result_available": false,
  "result_token_expires_at": null
}

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.

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

Personal Identity Verification

Ask for verified details. Get only what the person approves.

Your customer verifies their personal identity from an official document on their phone. Verihop returns only the approved fields to your backend—without handing you document or selfie files.

Verihop flow overview on device Verihop flow step for document and profile checks

One request. One mobile flow. One approved result.

1

Request the fields you need

Your backend creates a session for details such as legal name, age eligibility, or document information.

2

Send one link

The customer verifies on their phone and approves the exact details requested.

3

Fetch the approved result

Your backend exchanges a short-lived token for the approved fields and continues the customer journey.

TRY DEMO See selective sharing in a live checkout. Watch a customer complete an age check and inspect the result returned to the demo.

Clear responsibilities

Replace the verification stack. Keep the business decision.

Verihop handles

  • Document reading and secure chip checks
  • Live face and holder matching
  • Consent, mobile routing, and result delivery

Your company keeps

  • The approved result fields you requested
  • Session, callback, and operational metadata
  • Your own eligibility or risk decision

The Sessions API does not return passport images, document portraits, selfies, or reusable biometric templates.

The commercial case

Less friction for customers. Less sensitive data for your team.

A clearer customer journey

Replace upload-heavy screens with one guided mobile flow and a direct return to your product.

Less verification engineering

Use one integration instead of maintaining document parsing, chip reading, face checks, and mobile edge cases.

Less sensitive data

Receive approved verified fields instead of building archives of document scans and selfie images.

Reusable when appropriate

Returning users can approve a saved verification when it remains valid and your policy accepts it.

And there’s more

A compact integration. A much broader verification toolkit.

Start with one use case, then expand without rebuilding the handoff.

Reusable verificationsReturning users can reuse saved checks and approve each new request.
Multiple documentsSupport people with more than one passport, ID, or nationality.
Selective sharingRequest age, name, document nationality, expiry, or document details independently.
One cross-platform linkRoute across iOS App Clip, installed apps, Android, QR, and web fallback.
Server-to-server resultsKeep API keys off the client and retrieve approved results with short-lived tokens.
Built-in operationsManage usage, callbacks, team access, billing, audit history, and go-live review.