Duidelijk
Bekijk wie iets vraagt en precies wat diegene nodig heeft.
Betrouwbare gegevens, gedeeld met regie
Verifieer op je telefoon, bekijk precies wat wordt gevraagd en geef toestemming voordat er iets wordt gedeeld.
Bijvoorbeeld:
Bekijk het verzoek
De dienst start een Verihop-verzoek. Jij voltooit de begeleide controle, bekijkt de gevraagde gegevens en gaat verder waar je was gebleven.
Een dienst vraagt om specifieke gegevens. Je verifieert je op je telefoon, bekijkt het verzoek en keurt het delen goed. Na de controle keer je terug naar de dienst.
Wat je kunt verwachten
Bekijk wie iets vraagt en precies wat diegene nodig heeft.
Geslaagde ondersteunde controles komen niet in een standaardwachtrij voor beoordeling.
Gebruik een opgeslagen geldige verificatie wanneer de dienst die accepteert.
Keur alleen de gevraagde gegevens goed.
Start via een Verihop-link of QR-code. Je ziet wie iets vraagt en welke gegevens nodig zijn voordat er iets wordt gedeeld.
Verihop toont de aanvragende dienst en de exacte gegevens die deze nodig heeft.
Volg de begeleide identiteitsdocument- en live-houdercontroles die voor het verzoek beschikbaar zijn.
Keur het verzoek goeded details and continue where you left off.
Gemaakt voor het echte leven
Leeftijd
Bevestig je leeftijd en ga verder.
Verhuur & diensten
Deel de gevraagde geverifieerde gegevens.
Accountonboarding
Rond de controle af en keer direct terug naar de dienst.
Accounttoegang
Verifieer voor gevoelige acties, ondersteuning of accountherstel.
Bouw je een van deze ervaringen? Bekijk hoe Verihop werkt voor bedrijven, integraties en klantreizen. Bekijk VOOR BEDRIJVEN →
Jouw keuze
Controleer het documentLees de MRZ en beveiligde chip waar dat wordt ondersteund.
Controleer de houderGebruik begeleide liveness en gezichtsvergelijking voor de actieve verificatie.
Keur het verzoek goedDe dienst ontvangt de gegevens die jij goedkeurt.
Klaar wanneer jij dat bent
Probeer de leeftijdscontroledemo, bekijk de exact gevraagde gegevens en voltooi de flow op je telefoon.
API voor persoonlijke identiteit
Maak een sessie. Deel de start-URL. Haal het goedgekeurde resultaat op. Verificatie, toestemming en apparaatroutering worden voor je geregeld.
Wil je het product- en bedrijfsoverzicht? Bekijk VOOR BEDRIJVEN →
INTEGRATIESTAPPEN
POST /v1/sessions
Gebruik launch_url of qr_url; native iOS-apps openen app_clip_url ongewijzigd.
session_id + result_token
GET /v1/sessions/{id}/result
Eenmalig ophalen via je backend.
Optioneel: controleer sessiestatus GET /v1/sessions/{id}
API-sleutels blijven op je backend. Geverifieerde persoonsgegevens worden niet in callback-URL's geplaatst.
Een sessie onder beheer van je backend start de stroom; goedgekeurde identiteitsinformatie wordt server-to-server opgehaald.
Test in het Customer Portal
Gebruik een testaccount om gevraagde velden te kiezen, een callback in te stellen, de Session Voorbeeld uit te voeren en de echte aanvraag, respons, sessiestatus en het gestructureerde resultaat te bekijken.
Integratieskill voor agents
Eén veilige bron voor testconfiguratie, server-side sessies, callbacks, resultaten, launchgedrag en beknopte patronen voor Node, Python, Swift, Kotlin, Java, Go, PHP, Ruby en cURL.
Postman-collectie
Gebruik een testsleutel om de collectie uit te proberen. Behoud de idempotentiesleutel voor herhalingen en haal het resultaat één keer op via je backend.
De onderstaande voorbeeldwaarden zijn geen herbruikbare inloggegevens. Gebruik de werkelijk teruggegeven URLs, ID’s en deadlines.
Basis-URL: https://api.verihop.com
Authenticeer partnerrequests alleen vanaf je backend:
Authorization: Bearer <api_key>
GET-verzoeken hebben geen requestbody. Gebruik voor sessiestatus en resultaat de bijpassende Test- of Live-sleutel; JWKS vereist geen API-key.
Maak eerst een testaccount om een API-key voor integratie te krijgen. Testresponses zijn bewust geredigeerd en hetzelfde account kan later naar productie worden gezet.
Test schermt geretourneerde persoonsgegevens af; telefooncontroles verwerken nog steeds identiteitsgegevens. Live-toegang vereist afzonderlijke goedkeuring van toepassing, velden, callback en productiestart.
/v1/sessionsCreate a verification session and receive the public launch fields.
De voorbeelden gebruiken een testsleutel. Instellingen voor liveverificatie worden verstrekt wanneer je account wordt geactiveerd.
Dit voorbeeld vraagt persoonlijke gegevens en documentgegevens uit een ID-kaart of paspoort; beide zijn niet vereist.
expires_at als absolute deadline. Het openen van de link of doorgaan met de verificatie verlengt deze termijn nooit.Authorization: Bearer <api_key>
Content-Type: application/json
Idempotency-Key: <uuid>
{
"app": "RideNow",
"header": "Identity details",
"fields": ["legalName", "over18", "documentNumber", "documentExpiry"],
"allowedDocuments": ["idCard", "passport"],
"callback": "https://partner.example/verihop/callback"
}
app: weergavenaam van de partnerapp binnen Verihop (max. 80 tekens).header: korte verificatietitel die de gebruiker ziet (max. 120 tekens).fields: Vermeld de gewenste catalogustokens. Een ontbrekende of lege lijst vraagt geen velden op.allowedDocuments: Optionele lijst met toegestane documenttypen: passport, idCard, driverLicense of residencePermit. Laat dit weg om elk ondersteund documenttype toe te staan; stuur geen lege array.callback: basis-retour-URL uit POST /v1/sessions. Verihop opent deze na afronding en voegt session_id, result_token (success path) en optioneel callback_jwt toe; verplicht en gevalideerd tegen je productie-allowlist.fields says which verified values you request. allowedDocuments says which document types may provide evidence.
{
"fields": ["legalName", "over18"],
"allowedDocuments": ["passport", "idCard"]
}
This means Passport OR ID Card is eligible. It does not require both. The user chooses the concrete document used by each relevant section in the Verihop app.
passport, idCard, driverLicense, and residencePermit are cumulative document-type assertions (AND). A request such as ["legalName", "passport", "idCard"] requires Passport + ID Card.documentNumber, documentExpiry, documentCountry, and documentNationality are one detail bundle. With explicit required types, they apply to each compatible required contributor; without one, the holder chooses one eligible document for the whole bundle. Driving licences do not supply documentNationality.type is not a unique identifier; receipt-backed partner evidence is distinguished by receiptId.documentNationality is also invalid.Authorization: partner-API-key in bearer-formaat.Content-Type: gebruik application/json voor request body parsing.Idempotency-Key: Aanbevolen bij herhaalde aanmaakverzoeken. Maak voor elke nieuwe poging een UUID en hergebruik die alleen met exact dezelfde requestbody.201-response{
"session_id": "sess_123",
"expires_at": 1893456900,
"launch_url": "https://www.verihop.com/verify.html?session_id=sess_123&token=h_example123456789",
"app_clip_url": "https://appclip.apple.com/id?p=KycBox.VerifyBox.Clip&session_id=sess_123&token=h_example123456789",
"qr_url": "https://www.verihop.com/verify.html?session_id=sess_123&token=h_example123456789",
"status_url": "https://api.verihop.com/v1/sessions/sess_123"
}
session_id: unieke sessie-ID voor tracking en result retrieval.expires_at: vervaltijd van de sessie (Unix epoch seconds).launch_url: primaire URL voor web, Android, QR-codes, e-mail, SMS en algemene handoff.app_clip_url: directe native App Clip-URL voor iOS-partnerapps. Open deze exact zoals ontvangen; bouw de URL niet zelf opnieuw op.qr_url: QR-veilige URL; momenteel gelijk aan launch_url.status_url: sessiestatus-endpoint voor server-side polling.401 missing_bearer_token, 401 invalid_api_key403 customer_inactive400 missing_callback_url, invalid_callback_url, callback_host_not_allowed400 field_not_allowed, invalid_field_token, invalid_allowed_documents409 idempotency_key_conflict, idempotency_key_in_progress, idempotency_key_expired413 request_too_large429 rate_limit_exceeded, daily_quota_exceeded/v1/sessions/{id}Optioneel: volg de sessievoortgang zonder persoonsgegevens op te halen.
Authorization: Bearer <api_key>
200-response{
"session_id": "sess_123",
"status": "issued",
"issued_at": 1893456000,
"expires_at": 1893456900,
"last_status": null,
"last_status_at": null,
"opened_at": null,
"result_available": false,
"result_token_expires_at": null
}
Een voltooide sessie kan status: "used" en last_status: "success" tonen. result_available betekent dat een resultaat is opgeslagen; dit kan na gebruik of verval true blijven. Haal het resultaat één keer op, vóór de deadline.
Polling is alleen-lezen en markeert een sessie nooit als geopend. Een voltooide sessie met een Test-sleutel bevat ook result_token, zodat je het geredigeerde resultaat in Postman kunt ophalen. Live-resultaattokens komen via de callback.
/v1/sessions/{id}/resultHaal de geverifieerde result payload server-to-server op met een eenmalige 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>
200-responseVoorbeeld van een Test-response op het bovenstaande verzoek: de gebruiker koos een ID-kaart. Persoonlijke waarden zijn geredigeerd; ID’s en tijdstippen zijn voorbeelden.
{
"session_id": "sess_123",
"status": "success",
"result": {
"legalName": "XXXTEST_USERXXX",
"over18": "XXXTEST_USERXXX"
},
"personalDetailsDocument": {
"type": "idCard",
"issuingCountry": "ESP",
"receiptId": "dr_AAAAAAAAAAAAAAAAAAAAAAAA"
},
"documents": [
{
"type": "idCard",
"issuingCountry": "ESP",
"receiptId": "dr_AAAAAAAAAAAAAAAAAAAAAAAA",
"details": {
"documentNumber": "XXXTEST_USERXXX",
"documentExpiry": "XXXTEST_USERXXX"
}
}
]
}
result contains requested Personal Details only. personalDetailsDocument identifies the verified document selected by the user as their Personal Details source. The same document also appears in documents[]; that duplication is deliberate and is not an additional verification.
Resultaten met alleen documenten laten personalDetailsDocument weg.
documents[] contains every unique document that supported the Session: the Personal Details source, generic Document Details source, and each exact required-document source. Every entry contains type, issuingCountry, receiptId, and details. When no document details were requested, details is {}. Internal field attribution is never exposed.
receiptId verwijst naar het historische verificatiebewijs van dat document.documents[].receiptId independently with GET /v1/document-receipts/{receipt_id}. There is no combined receipt endpoint or combined JWS.410 result_token_expired; het lezen en verifiëren van receipts blijft onafhankelijk.verified_at; reuse is not represented as a new document verification.Test mode preserves this exact structure and redacts only actual Personal Details and document-detail values with XXXTEST_USERXXX. It does not redact type, issuingCountry, receiptId, or structural keys.
401 missing_bearer_token, invalid_api_key, missing_result_token403 customer_inactive, api_key_environment_mismatch, invalid_result_token410 result_token_expired409 result_token_used404 result_not_available, session_not_found503 document_receipt_unavailable/.well-known/jwks.jsonOpenbare verificatiesleutels voor callback-JWT’s en Document Receipts.
Er is geen API-key nodig. De cacheduur is 300 seconden. Controleer handtekeningen en claims op je backend; stop de controle als de sleutels niet beschikbaar of onbekend zijn.
200-response{
"keys": [
{
"kty": "RSA",
"kid": "example-key-id",
"alg": "RS256",
"use": "sig",
"n": "...",
"e": "AQAB"
}
]
}
DOCUMENT RECEIPTS · OPTIONEEL
/v1/document-receipts/{receipt_id}Retrieve an already-issued Document Receipt from your partner backend. Persistent retrieval is an optional extension to the four-step Sessions integration.
Authorization: Bearer <api_key>
receiptId-waarden uit GET /v1/sessions/{id}/result om ze op te halen.dr_.... Internal receipt identifiers and data-model terminology are not part of the public contract.200-response{
"receiptId": "dr_AAAAAAAAAAAAAAAAAAAAAAAA",
"receiptVersion": 1,
"issuedAt": "2026-09-11T12:00:00.000Z",
"document": {
"type": "idCard",
"issuingCountry": "ESP"
},
"receipt": "eyJhbGciOiJSUzI1NiIsImtpZCI6InZocmNwdC1yczI1Ni0yMDI2MDkxMS0wMSIsInR5cCI6InZlcm...eyJyZWNlaXB0X3ZlcnNpb24iOjEsInZlcmlmaWNhdGlvbiI6ey4uLn19.signature-placeholder"
}
The abbreviated signature above is a display placeholder, not a cryptographically valid sample receipt. receipt contains the original compact signed JWS, not a URL. The response identifies the document by type and issuing country without identity PII.
dr_ identifier does not authorize access.404 document_receipt_not_found.verihop_v1 methodology and signature verificationThe partner-facing methodology is verihop_v1, version 1. Verihop obtains document information from the supported document, runs its holder-verification flow, checks liveness, and matches the presented person against the document-holder evidence.
verified, holder verification passed, and liveness passed.Een compacte JWS decoderen is geen handtekeningcontrole. Verifieer op je backend met het geconfigureerde Verihop-JWKS-endpoint. Vereis alg=RS256, typ=verihop-document-receipt+jwt, een bekende receipt-sleutel met kid, de geconfigureerde issuer en de audience uit je vertrouwde partnerconfiguratie. Neem geen sleutel-URL, verwachte audience of vertrouwensbeslissing over uit het ongeverifieerde token. Callback- en Document Receipt-sleutels hebben afzonderlijke doelen.
400 invalid_document_receipt_id401 missing_bearer_token, 401 invalid_api_key403 customer_inactive, 403 api_key_environment_mismatch404 document_receipt_not_found409 document_receipt_revoked, 423 document_receipt_held, 410 document_receipt_erased503 document_receipt_verification_unavailable, 503 document_receipt_unavailablefields)legalName, dateOfBirth, over18, over21, passport, idCard, driverLicense, residencePermit, documentNumber, documentExpiry, documentCountry, documentNationality
result bevat de gevraagde persoonlijke gegevens: legalName, dateOfBirth, over18 en over21. Gevraagde documentgegevens staan in documents[].details. Typevereisten zoals passport en idCard vereisen die documenten; ze voegen geen boolean toe aan result en vragen niet alle documentgegevens op.
Ja. Je backend maakt een sessie met POST /v1/sessions en toont de teruggegeven qr_url als QR op de desktoppagina. De gebruiker scant die QR met de telefoon en Verihop opent de beste beschikbare ervaring.
De beste UX is direct launch: encodeer de teruggegeven qr_url. Dit is dezelfde universele HTTPS-handoff als launch_url en ondersteunt app, lichte ervaring en webfallback.
Gebruik launch_url op Android en voor algemene webhandoff. Een iOS-partnerapp die de native App Clip-kaart wil tonen, opent de teruggegeven app_clip_url. De callback-vorm blijft gelijk: Verihop voegt session_id, op het succespad result_token en optioneel callback_jwt toe.
Maak de sessie op je backend en stuur de teruggegeven app_clip_url naar je iOS-app. Open die URL met SwiftUI Link of UIApplication.open op iOS 17 of nieuwer. Parse launch_url niet, kopieer de token niet en hard-code de App Clip-bundle-ID van Verihop niet. Als de volledige Verihop-app is geïnstalleerd, opent iOS die met behoud van dezelfde sessie.
Gebruik je een custom callback zoals ridenow://verified, dan moet de Android partnerapp een intent filter declareren voor dat scheme en die host. Gebruik je een https:// callback voor desktop- of webgestarte flows, behandel die dan als backend-endpoint tenzij je Android app dat domein bezit met geverifieerde App Links.
Gebruik een https://-retourendpoint op je backend. Verihop opent die URL op de telefoon met session_id en bij succes result_token in de query. Dit is de terugkeer van de gebruiker, geen server-to-server-webhook. Je backend controleert de opgeslagen sessiekoppeling en haalt GET /v1/sessions/{id}/result op. De desktoppagina kan bij je backend de voltooiing controleren.
Nee. Aanmaken retourneert orkestratievelden en ondoorzichtige launch-URLs, geen JWT of privé-identiteitsgegevens. Open de teruggegeven URL ongewijzigd.
Een geslaagde terugkeer bevat session_id en result_token, plus callback_jwt indien ingeschakeld. Sommige appflows voegen status- of bronmetadata toe. Dit zijn geen persoonlijke resultaten of verificatiebewijzen. Controleer de sessiekoppeling, verifieer een meegegeven callback-JWT en haal het goedgekeurde resultaat op je backend op.
callback_jwt verifiëren, en waar?Ja, op de partnerbackend wanneer aanwezig. Verifieer signature en claims met Verihop JWKS via GET /.well-known/jwks.json. Valideer issuer, audience en expiry en zorg dat JWT-claims overeenkomen met de callback querywaarden.
Nee. Houd API-keys server-side en haal resultaten alleen via je backend op. De frontend/webclient hoort alleen UI te tonen en state door te geven aan je backend session.
Reconcilieer eerst een verbruikte, verlopen of onzekere resultaatuitwisseling. Herhaal result GET nooit automatisch en maak niet automatisch een andere sessie. Alleen een bewuste nieuwe actie start een nieuwe poging.
Open de teruggegeven launch_url of qr_url; de gehoste pagina begeleidt de gebruiker naar de ondersteunde app, App Clip of installatie. Op Android kan de gebruiker na installatie terugkeren en op Open Verihop tikken zolang de sessie geldig is. Maak niet alleen vanwege installatie een vervangende sessie. Laat de gebruiker na verval bewust een nieuwe poging starten.
POST /v1/sessions ondersteunt Idempotency-Key voor retry-veilige create-session calls: dezelfde key met dezelfde payload speelt de originele response opnieuw af, terwijl dezelfde key met een andere payload 409 idempotency_key_conflict teruggeeft. Misbruik wordt verder beperkt met API-key auth, callback-allowlistbeleid, field-allowlistchecks, rate limits/quota per klant, korte sessie-TTL en een eenmalige result_token.
Start in testmodus
Use a redacted testaccount, keep credentials on your backend, and move to production only after callback and field controls are approved.
Identiteitsverificatie met aandacht voor privacy
Vraag geverifieerde identiteits- of geschiktheidsgegevens op. Klanten voltooien de controle op hun telefoon en keuren goed wat wordt gedeeld.
Bijvoorbeeld:
geen foto’s van identiteitsbewijzen of selfiebestanden.
Van controle naar betrouwbare gegevens
Een dienst vraagt om specifieke gegevens. De klant verifieert zich op de telefoon, bekijkt het verzoek en keurt het delen goed. De dienst ontvangt het goedgekeurde resultaat.
Waarom dit telt
Verificatie moet klanten verder helpen, zonder van één beslissing weer een documentarchief te maken.
van de ondervraagde Britse consumenten had een proces voor het openen van een account afgebroken.
FullCircl, State of Identity Verification 2025van de ondervraagde mensen in Nederland zei nooit online een kopie van hun paspoort, identiteitskaart of rijbewijs te delen.
CBS, 2025In hetzelfde FullCircl-onderzoek duurde onboarding gemiddeld 35 minuten, 2,8 keer langer dan klanten wensten. FullCircl, State of Identity Verification 2025
De Nederlandse privacytoezichthouder meldde 39.407 datalekmeldingen in 2025. Autoriteit Persoonsgegevens, 2026
Wat het oplevert
Kies een voordeel om te zien hoe het werkt.
Het lezen van MRZ en NFC-chip ondersteunt de houdervergelijking.
De duur kan variëren per apparaat, document en verbinding.
Een geslaagde verificatie levert het resultaat op zonder standaardwachtrij voor handmatige beoordeling.
Ontvang goedgekeurde velden, niet de paspoortafbeelding of selfie van de klant.
Klanten kunnen een op hun apparaat opgeslagen verificatie goedkeuren wanneer die geldig blijft en je beleid die accepteert.
Begin bij de beslissing
Leeftijd & geschiktheid
Vraag een geverifieerd leeftijdsresultaat op.
Accountonboarding
Controleer de gegevens die je onboardingbeslissing nodig heeft.
Verhuur en toegang
Verifieer de identiteit voordat toegang wordt verleend.
Accountherstel
Vraag een nieuwe controle voor gevoelige acties.
Verihop verifieert de goedgekeurde gegevens. Jouw bedrijf neemt de beslissing.
Customer Portal
Voer geredigeerde sessies uit en controleer de overdracht.
Dien je productie-inrichting en veldbereik ter beoordeling in.
Bewaak sessies, callbacks, gebruik en teamtoegang.
Start met één use case
Neem je klantreis en beslissing mee. We brengen het kleinste bruikbare verzoek en een testtraject in kaart.