Naar hoofdinhoud springen
ShieldID

API-referentie

De API-referentie voor identiteitsverificatie.

Elk endpoint dat u kunt aanroepen, elk veld dat u terugkrijgt en wat u met een webhook moet doen zodra die binnenkomt. Voor exacte veldtypen geldt het live OpenAPI-document op /docs op uw eigen API-origin als bron van waarheid. Deze pagina is de versie in gewone taal.

Basis-URL en omgevingen

Eén basis-URL. Twee omgevingen.

Elk verzoek gaat naar dezelfde host. In welke omgeving u zich bevindt, wordt volledig bepaald door welke API-sleutel u meestuurt.

Elk verzoek in deze referentie gaat uit van deze twee zaken.
Basis-URL (deze documentatie)https://api.shieldid.ca — illustrative; your production API origin is published together with your API keys.
Auth-headerX-Api-Key: <uw sleutel>, bij elk verzoek behalve de twee openbare endpoints die hieronder worden genoemd.
Prefix van sandbox-sleutelvk_sand_… — sessies die met deze sleutel worden aangemaakt, krijgen de markering environment: "sandbox" en worden nooit gefactureerd.
Prefix van productiesleutelvk_live_… — dezelfde verzoeken, in rekening gebracht volgens uw abonnement.
Inhoudstypeapplication/json bij elke request body en response.

Endpoints

Het volledige v1-oppervlak.

Zes JSON-endpoints, plus een gehoste pagina en een openbare credentialcontrole die helemaal geen JSON zijn — u linkt er alleen naar.

JSON-endpoints onder /v1.
EndpointAuthWhat it does
POST /v1/sessionsX-Api-KeyMaak een verificatiesessie aan. Vereist een return_url en een webhook_url. Retourneert session_id, verification_url en status: "PENDING".
GET /v1/sessions/{id}X-Api-KeyStatus en hoofdvelden van één sessie: status, confidence, environment.
GET /v1/sessions/{id}/resultX-Api-KeyHet volledige resultaat zodra een sessie VERIFIED of FAILED bereikt: person, verdicten per controle, confidence, verified_until.
DELETE /v1/sessions/{id}X-Api-KeyAnnuleer een sessie die nog PENDING of IN_PROGRESS is. Een sessie die al VERIFIED, FAILED of EXPIRED is, kan niet worden geannuleerd.
GET /v1/credentials/{token}None — publicControleer of een geverifieerde credential momenteel geldig is. Geen API-sleutel vereist, dus aan te roepen vanuit een browser. Let op: het huidige antwoord bevat ook de naam van de geverifieerde persoon en het documenttype en -land, niet alleen een geldig/ongeldig-vlag — geef deze link niet door aan een derde die dit niet mag zien.
GET /v1/pricing/{country}X-Api-KeyPrijzen per land voor een tweeletterige ISO 3166-1-landcode.
Pagina's waarnaar u verwijst, geen JSON die u verwerkt.
/v/{session_id}De gehoste verificatiepagina — de verification_url die een sessie retourneert. Op desktop wordt een QR-code getoond; wanneer de aanvrager deze scant, krijgt zijn of haar telefoon dezelfde link om het document en een selfie vast te leggen.
/c/{session_id}Een openbare, niet-geauthenticeerde credentialcontrolepagina voor één geverifieerde sessie. Let op: het huidige antwoord bevat ook de naam van de geverifieerde persoon en het documenttype en -land, niet alleen een geldig/ongeldig-vlag — geef deze link niet door aan een derde die dit niet mag zien.
/docsDe live, interactieve OpenAPI-referentie voor de API-oorsprong van uw account.

Een sessie aanmaken

POST /v1/sessions, van begin tot eind.

Het verzoek en precies wat u terugkrijgt.

bash
curl -X POST https://api.shieldid.ca/v1/sessions \
  -H "X-Api-Key: vk_sand_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "return_url": "https://yourapp.example/verified",
    "webhook_url": "https://yourapp.example/hooks/shieldid",
    "expected_name": "Jordan Smith",
    "locale": "en",
    "metadata": { "application_id": "app_9182" }
  }'

POST /v1/sessions — verzoekvelden.
return_urlstring, vereist — Waar de aanvrager naartoe wordt teruggestuurd nadat hij of zij klaar is. Moet http of https zijn.
webhook_urlstring, vereist — Waar het ondertekende resultaat wordt afgeleverd. Zie Webhooks hieronder.
expected_namestring, vereist — De naam die u op het document verwacht, gebruikt om te controleren wat er daadwerkelijk op het ID-bewijs staat.
expected_dob / expected_addressstring, optioneel — Wordt gecontroleerd aan de hand van het document indien opgegeven; niet vereist om een verificatie uit te voeren.
localestring, optioneel — "en" of "fr". Bepaalt de taal van de gehoste pagina die de aanvrager ziet.
metadataobject, optioneel — Uw eigen referentiegegevens — een aanvraag-id, een tenant-id, alles wat u ongewijzigd terug wilt zien in het resultaat en de webhook.

Het resultaat

GET /v1/sessions/{id}/result — structuur van het antwoord.

Dezelfde structuur wordt geleverd in de webhook-payload, dus u hoeft dit endpoint zelden te pollen.

Velden op het hoogste niveau.
session_idDe id die u hebt aangemaakt.
statusPENDING, IN_PROGRESS, VERIFIED, FAILED of EXPIRED.
environment"sandbox" of "production", overeenkomstig de sleutel waarmee de sessie is aangemaakt.
personDe velden die uit het document zijn gelezen: naam, geboortedatum, documenttype, documentland en jurisdictie, adres.
checksEén oordeel per controle, zie hieronder. Nooit één ondoorzichtige score.
confidenceEén totaalcijfer voor de verificatie. Afzonderlijke controles, waaronder de gezichtsvergelijking, worden nog steeds apart gerapporteerd ten opzichte van een vaste beslisgrens. Dit veld komt niet in de plaats daarvan.
verified_untilHoe lang het resultaat als actueel wordt beschouwd, bij een VERIFIED-sessie.
failure_reasonIngesteld bij een FAILED-sessie, bijvoorbeeld FACE_MATCH_BELOW_THRESHOLD of CANCELLED_BY_API. Anders null.
metadataWat u hebt meegestuurd bij het aanmaken van de sessie, ongewijzigd.
json
{
  "session_id": "ses_9f2c1a",
  "status": "VERIFIED",
  "environment": "sandbox",
  "person": {
    "name": "Jordan Smith",
    "dob": "1994-03-11",
    "document_type": "drivers_licence",
    "document_country": "CA",
    "document_jurisdiction": "ON"
  },
  "checks": {
    "document": "PASS",
    "liveness": "PASS",
    "antispoof": "PASS",
    "face_match": "PASS"
  },
  "confidence": 88,
  "verified_until": "2027-03-11T00:00:00Z",
  "failure_reason": null,
  "metadata": { "application_id": "app_9182" }
}

Add-onchecks.document, checks.liveness, checks.antispoof en checks.face_match resulteren elk in PASS, FAIL of SKIPPED. Watchlist-screening (checks.sanctions: CLEAR, MATCH of SKIPPED) is een add-on en verschijnt alleen voor accounts die deze inschakelen.

Levenscyclus van een sessie

Vijf statussen, één pad.

Een sessie gaat zelfstandig vooruit; u stuurt de toestandsmachine niet aan, u leest hem alleen uit.

status-waarden, op volgorde.
PENDINGAangemaakt. Niemand heeft de verification_url al geopend.
IN_PROGRESSDe aanvrager heeft de link geopend en bevindt zich ergens in de opnamestroom.
VERIFIEDAlle controles zijn uitgevoerd en het resultaat is gereed. Eindstatus: roep het resultaat-endpoint aan of lees de webhook.
FAILEDMinstens één controle is niet geslaagd. failure_reason geeft aan welke. Binnenkort beschikbaar: een nieuwe poging die de sessie terugzet naar PENDING. Behandel FAILED tot die tijd als eindstatus en maak een nieuwe sessie aan als de aanvrager het opnieuw wil proberen.
EXPIREDNiemand heeft het op tijd afgerond. Sessies verlopen automatisch na een standaardtermijn (30 minuten); maak een nieuwe aan om het opnieuw te proberen.

DELETE /v1/sessions/{id} annuleert een sessie met de status PENDING of IN_PROGRESS voortijdig. Een sessie die al VERIFIED, FAILED of EXPIRED is, kan niet meer worden geannuleerd — die is al afgerond.

Fouten

Waarmee u rekening moet houden.

Dit is de beknopte lijst waartegen u vandaag al kunt programmeren. De volledige, actuele set foutcodes en payloads is gedocumenteerd in de live OpenAPI op /docs.

HTTP-status, foutcode en wat deze betekent.
StatusCodeMeaning
401UNAUTHORIZEDDe X-Api-Key-header ontbreekt.
401INVALID_KEY_FORMATDe sleutel begint niet met vk_sand_ of vk_live_, of komt niet overeen met een sleutel van het account.
403FORBIDDENDe sleutel is geldig, maar heeft geen toegang tot de sessie of de resource die u hebt opgevraagd.
404NOT_FOUNDEr bestaat geen sessie, credential of resource met die id.
409CONFLICTDe sessie bevindt zich niet in een status waarin de actie is toegestaan — bijvoorbeeld het annuleren van een sessie die al VERIFIED is.
422VALIDATION_ERROREen verplicht veld ontbreekt of is onjuist opgemaakt, bijvoorbeeld wanneer return_url geen geldige http- of https-URL is.

Webhooks

Ondertekend, afgeleverd, opnieuw geprobeerd.

Wanneer een sessie VERIFIED of FAILED bereikt, verstuurt ShieldID via een POST de hierboven gedocumenteerde structuur naar uw webhook_url.

  • Afgeleverd als POST met een JSON-body die overeenkomt met de hierboven beschreven resultaatstructuur.
  • Ondertekend met HMAC-SHA256 over de ruwe request-body en meegestuurd in een X-Bio-Signature-header. Controleer deze aan de hand van uw webhookgeheim voordat u de payload vertrouwt.
  • Maximaal drie keer opnieuw geprobeerd met een lineaire backoff als uw endpoint niet met een 2xx-status antwoordt.
  • Binnenkort beschikbaar: een nieuwe poging voor een FAILED-sessie die een tweede webhook verstuurt zodra die is afgerond. Ga vandaag uit van één webhook per sessie.
  • De veldnamen hier komen overeen met deze referentie. Als wat daadwerkelijk binnenkomt er anders uitziet, vertrouw dan op de live payload in plaats van op deze pagina en laat het ons weten. De veldenlijst wordt afgestemd op de API, niet andersom.

Controleer de handtekening

javascript
import crypto from "node:crypto";

function isValidShieldIdSignature(rawBody, signatureHeader, secret) {
  const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  const provided = signatureHeader || "";
  const a = Buffer.from(expected, "hex");
  const b = Buffer.from(provided, "hex");
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

// rawBody must be the exact, unparsed request body
app.post("/hooks/shieldid", express.raw({ type: "application/json" }), (req, res) => {
  const ok = isValidShieldIdSignature(req.body, req.headers["x-bio-signature"], process.env.SHIELDID_WEBHOOK_SECRET);
  if (!ok) return res.status(401).send("invalid signature");

  const result = JSON.parse(req.body);
  // result.session_id, result.status, result.checks, …
  res.status(200).send("ok");
});

Idempotentie en nieuwe pogingen

Bouw handlers die veilig twee keer kunnen worden uitgevoerd.

Er is nog geen speciale idempotentiesleutel, noch bij het aanmaken van een sessie noch bij het afleveren van een webhook.

  • Een opnieuw geprobeerde webhookaflevering kan voor dezelfde sessie meer dan eens binnenkomen. Baseer uw handler op session_id + status en zorg dat het opslaan van het resultaat idempotent is.
  • Probeer POST /v1/sessions bij een timeout niet blindelings opnieuw. Controleer eerst of de sessie is aangemaakt, anders krijgt u mogelijk twee sessies voor één aanvrager.
  • Een speciale Idempotency-Key-header voor het aanmaken van sessies is gepland.

Binnenkort beschikbaarOndersteuning voor Idempotency-Key bij het aanmaken van sessies

Op de hoogte blijven

Deze referentie verandert. Volg de changelog.

Toegevoegde velden, nieuwe foutcodes en wijzigingen aan endpoints worden daar aangekondigd voordat ze hier verschijnen.

Vragen

Veelgestelde vragen over de referentie.

Volgende

Ga aan de slag met deze referentie.

Volg de quickstart om stap voor stap te gaan van een sandbox-sleutel naar een geverifieerde sessie en een ondertekende webhook.