KYC-Anfragen
Vollständige API-Referenz für KYC-Anfragen von Certivant — Privatpersonen- oder Unternehmensverifizierungen erstellen, auflisten, einreichen, genehmigen, ablehnen, eskalieren und erneut einreichen.
Eine KYC-Anfrage steht für einen einzelnen Versuch, die Identität einer Person (INDIVIDUAL) oder die Identität
eines Unternehmens samt seiner Geschäftsführer und wirtschaftlich Berechtigten (BUSINESS) zu verifizieren. Alle
folgenden Endpunkte liegen unter /api/v1/kyc/requests.
Alle Endpunkte benötigen einen API-Schlüssel mit dem jeweiligen Berechtigungsbereich. Siehe Authentifizierung.
Eine Anfrage erstellen
POST /api/v1/kyc/requests Berechtigungsbereich: kyc:write
Erstellt eine neue Anfrage im Status PENDING_UPLOAD. Die Antragstellerdaten sind optional — wenn Sie sie nicht übergeben,
ergänzt der Antragsteller sie über die gehostete Sitzung.
Anfrage-Body
{
"type": "INDIVIDUAL",
"purpose": "Financing an iPhone 16, 24 months",
"externalRef": "your-id-here",
"subTenantName": "Acme Corp",
"subTenantExternalId": "cust_8842",
"applicant": {
"externalRef": "your-applicant-id",
"fullName": "Jane Doe",
"dateOfBirth": "1990-04-12",
"nationality": "US",
"email": "jane@example.com",
"phone": "+14155551234",
"emailVerified": false,
"phoneVerified": false,
"metadata": { "anyKey": "anyValue" }
}
}
| Feld | Typ | Pflichtfeld | Hinweise |
|---|---|---|---|
type | Aufzählung | ja | INDIVIDUAL oder BUSINESS |
purpose | string | nein | Warum Sie diese Person verifizieren, in wenigen Worten — z. B. Financing an iPhone 16, 24 months, Opening an account. 3–300 Zeichen. Verschlüsselt gespeichert. Senden Sie keinen, verwendet Certivant den Standardgrund des Formulars (formId), sonst „New customer verification“ (immer auf Englisch gespeichert). Ein konkreter Grund wird empfohlen: Er macht die Betrugsprüfung nützlich. Siehe Grund der Verifizierung |
externalRef | string | nein | Ihr Fremdschlüssel. Wird bei jedem Ereignis zurückgegeben |
subTenantName | string | nein | Partnermodus: Anzeigename des Endkunden, zu dem diese Anfrage gehört. Maximal 200 Zeichen |
subTenantExternalId | string | nein | Partnermodus: Ihre eigene interne ID für diesen Endkunden. Über den Listen-Endpunkt filterbar und bei jedem Webhook wiederholt. Maximal 200 Zeichen |
formId | string | nein | Erstellt die Verifizierung über eines Ihrer Formulare (dessen Dokumentanforderungen gelten, und die Anfrage wird ihm zugeordnet). Der Typ des Formulars muss zu type passen. Pflicht für einen API-Schlüssel, der auf bestimmte Formulare beschränkt ist; das Formular muss dann eines davon sein — siehe Formularbeschränkung |
faceCheckSkippable | boolean | nein | Weggelassen: die Einstellung des Formulars (formId), sonst die Ihrer Organisation (die Gesichtsprüfung ist erforderlich, sofern Sie das nicht geändert haben). false erzwingt, dass die Gesichtsprüfung erforderlich ist. true bietet die nicht biometrische Alternative an, nur dort, wo das Gesetz sie verlangt (z. B. Québec): Der Antragsteller kann die Gesichtsprüfung ablehnen. Dann laufen weder Selfie noch Liveness-Prüfung, der Ausweis wird weiterhin erfasst, und die Anfrage geht in die manuelle Prüfung, wobei eine Live-ID-Verifizierung empfohlen wird. Ein Formular kann dies mit „Antragstellern erlauben, die Gesichtsprüfung abzulehnen“ einschalten; die Einstellung der Organisation finden Sie unter Einstellungen → KYC/B. |
applicant.externalRef | string | nein | Fremdschlüssel je Antragsteller, getrennt vom Referenzwert der Anfrage |
applicant.fullName | string | nein | Fehlt der Wert, wird er über die gehostete Sitzung erfasst |
applicant.dateOfBirth | string (ISO-Datum) | nein | YYYY-MM-DD |
applicant.nationality | string (ISO 3166-1 alpha-2) | nein | z. B. US, GB, FR |
applicant.email | string | nein | |
applicant.phone | string (E.164) | nein | |
applicant.emailVerified | boolean | nein | Setzen Sie true, wenn Sie die E-Mail-Adresse bereits auf Ihrer Seite verifiziert haben |
applicant.phoneVerified | boolean | nein | Ebenso — überspringt den Schritt der Telefonverifizierung bei Certivant |
applicant.metadata | object | nein | Beliebiges JSON. Wird am GET-Endpunkt zurückgegeben |
Zuordnung für Partner und Unter-Mandanten. Wenn Sie innerhalb einer Organisation Verifizierungen für viele
Endkunden durchführen (z. B. eine E-Signatur-Plattform, die Unterzeichner für Hunderte Unternehmen verifiziert),
setzen Sie subTenantName und subTenantExternalId bei jeder Anfrage. Sie können dann den Listen-Endpunkt nach
subTenantExternalId filtern, beide Felder werden bei jedem Webhook zurückgegeben, und das Dashboard bietet einen
Filter für Unter-Mandanten — alles ohne eine eigene Organisation pro Kunde.
Grund der Verifizierung
Jede Anfrage hat einen Grund: warum Sie die Person verifizieren, in wenigen Worten. Ihn zu senden ist optional, ein konkreter Grund wird aber empfohlen, weil er die Betrugsprüfung nützlich macht. Certivant liest den Grund und ordnet ihn einem von rund 110 Einträgen einer Grundliste zu — zum Beispiel Finanzierung eines Telefons oder Geräts, Mobilfunktarif, SIM-Aktivierung, Privatkredit, Kreditkarte, Autovermietung, Kryptowährungen, Bankkonto, Wohnungsmiete, Hypothek, Notartermin / Beurkundung, Versicherung, Beschäftigung oder Altersverifizierung. Jeder Grund gehört zu einer Familie: Telefone und Geräte, Mobilfunkanschlüsse und SIM, Darlehen und Kredit, Fahrzeuge, Wertgegenstände, Geldbewegungen und Kryptowährungen, Kontoeröffnung, Wohnungsmiete, Immobilien und Hypothek, Sonstiges (kein Geld im Spiel) oder Unklar.
- Nur die Familie wird verglichen. Das Betrugspräventionsnetzwerk vergleicht zwischen Unternehmen nur die Familie — nie den Text, nie den konkreten Grund. Der Text selbst wird verschlüsselt gespeichert, nie mit einem anderen Unternehmen geteilt und nur über HTTPS übertragen.
- Es zählt nur, wo Geld oder Kredit auf dem Spiel steht. Eine Anfrage fließt nur dann in Betrugsmuster ein, wenn Geld oder Kredit im Spiel ist. Ein Notartermin, eine Hypothek, eine Versicherung, Versorgungsverträge, eine Anstellung oder eine Gesundheitsleistung werden gespeichert, zählen aber nie: Wer beim Notar eine Urkunde unterzeichnet und einen Monat später ein Telefon finanziert, wird nicht markiert.
- Sensible Gründe werden nie geteilt. Gesundheit, Recht, Einwanderung, Glücksspiel, Schuldenprobleme, Dating, Religion oder Spenden, Todesfall oder Nachlass sowie altersbeschränkte Waren werden als „Sonstiges“ gespeichert.
- Seien Sie konkret. Ein Grund wie
KYCoderverificationsagt nicht, was die Person kauft. Standardmäßig wird die Anfrage trotzdem angelegt — mit einer Warnung. Hat Ihre Organisation Vage Gründe ablehnen aktiviert (Einstellungen → Betrugsprävention → Regeln des Betrugsnetzwerks), wird sie stattdessen mit422abgelehnt. - Lassen Sie persönliche Angaben weg. E-Mail-Adressen, Telefon-, Karten- und Ausweisnummern sowie Datumsangaben werden entfernt, bevor eine KI den Grund liest — tragen Sie sie gar nicht erst ein.
Die Antwort beim Anlegen zeigt, wie der Grund gelesen wurde:
| Feld | Werte | Bedeutung |
|---|---|---|
purposeQuality | informative | Der Grund sagt, was gekauft, finanziert oder eröffnet wird. |
generic | Zu vage, um ihn genau zuzuordnen. | |
unusable | Nicht verständlich. | |
warnings (nur wenn zutreffend) | purpose_too_generic · purpose_unusable · purpose_contains_personal_data | Was am Grund zu korrigieren ist. Der letzte Wert bedeutet, dass persönliche Angaben gefunden und entfernt wurden. |
Dieselben Felder liefert auch POST /api/v1/kyc/forms/:formId/send. Einen Gesamtüberblick finden Sie unter Betrugsnetzwerk.
Der Grund wird in dieser Reihenfolge gewählt: der purpose, den Sie senden, dann der Standardgrund des Formulars (im Formulareditor festlegen), dann „New customer verification“, immer auf Englisch und genau mit diesem Text gespeichert. Integrationen, die keinen Grund senden, etwa E-Signatur-Plugins, erhalten daher nie einen Fehler. Der Standardgrund wird nie abgelehnt (auch nicht mit Vage Gründe ablehnen), löst keine Warnung aus und birgt kein Geld im Risiko; er speist daher nicht die Muster des Betrugsnetzwerks.
Antwort (201)
{
"id": "req_01J...",
"status": "PENDING_UPLOAD",
"type": "INDIVIDUAL",
"externalRef": "your-id-here",
"subTenantName": "Acme Corp",
"subTenantExternalId": "cust_8842",
"pendingDocTypes": ["GOVERNMENT_ID", "SELFIE"],
"purposeQuality": "informative",
"applicant": { ... },
"createdAt": "2026-05-27T10:00:00.000Z"
}
pendingDocTypes richtet sich nach den KYC-Einstellungen Ihrer Organisation — was erforderlich ist, hängt davon ab, ob
Sie Lebenderkennung, Adressnachweis usw. aktiviert haben.
purposeQuality ist informative, generic oder unusable. Erfordert der Grund Ihre Aufmerksamkeit, wird ein Array warnings mit purpose_too_generic, purpose_unusable und/oder purpose_contains_personal_data ergänzt.
Fehler
400 VALIDATION_ERROR— der Body hat die Zod-Validierung nicht bestanden.error.fieldslistet jeden fehlerhaften Pfad auf.403 FORBIDDEN— dem Schlüssel fehltkyc:write, oder (error.reason = "form_not_allowed") der Schlüssel ist auf bestimmte Formulare beschränkt und die Anfrage enthält keineformIdoder nennt ein anderes Formular.404 NOT_FOUND— dieformIdist kein Formular Ihrer Organisation.409 CONFLICT— IhreexternalRefwird bereits von einer anderen Anfrage dieser Organisation verwendet. Verwenden Sie einen anderen Referenzwert oder fragen Sie die bestehende Anfrage ab.422— Ihre Organisation lehnt vage Gründe ab (Vage Gründe ablehnen), undpurposeist zu allgemein oder unbrauchbar. Geben Sie an, was gekauft oder finanziert wird. Wird auch vonPOST /api/v1/kyc/forms/:formId/sendzurückgegeben.
Anfragen auflisten
GET /api/v1/kyc/requests Berechtigungsbereich: kyc:read
Abfrageparameter
| Parameter | Typ | Standard | Hinweise |
|---|---|---|---|
status | Aufzählung | — | Filtern nach PENDING_UPLOAD, PROCESSING, APPROVED, REJECTED, ESCALATED, CANCELLED |
type | Aufzählung | — | INDIVIDUAL oder BUSINESS |
externalRef | string | — | Filter mit exakter Übereinstimmung auf Ihren Fremdschlüssel |
subTenantExternalId | string | — | Partnermodus: nur Anfragen zurückgeben, die mit dieser Endkunden-ID markiert sind |
search | string | — | Freitextsuche über Name und E-Mail-Adresse des Antragstellers |
page | integer | 1 | Seitennummer, beginnend bei 1 |
limit | integer | 20 | Maximal 100 |
Antwort
{
"data": [
{ "id": "req_...", "status": "APPROVED", "type": "INDIVIDUAL", "createdAt": "...", "applicant": {...} },
...
],
"pagination": {
"total": 248,
"page": 1,
"limit": 20,
"pages": 13
}
}
Verwenden Sie das Filtern nach externalRef, um eine Anfrage abzurufen, wenn Sie nur Ihren eigenen Fremdschlüssel
kennen — Sie müssen die req_…-ID von Certivant nicht speichern, sofern Ihre externalRef eindeutig ist.
Eine einzelne Anfrage abrufen
GET /api/v1/kyc/requests/:id Berechtigungsbereich: kyc:read
Liefert die vollständige Verifizierung zurück — den Antragsteller, jedes hochgeladene Dokument (mit den per OCR ausgelesenen Feldern), jede automatisierte Prüfung, die vollständige Aufschlüsselung des Risikos, Betrugssignale und das Audit-Protokoll. Das ist alles, was die Detailansicht des Dashboards anzeigt, sodass Sie Ihre eigene Prüfoberfläche bauen können, ohne Mitarbeiter zu Certivant zu schicken.
Antwort
{
"id": "req_...",
"status": "ESCALATED",
"type": "INDIVIDUAL",
"externalRef": "user-9281",
"subTenantName": null,
"subTenantExternalId": null,
"reviewedBy": null,
"reviewNote": null,
"completedAt": null,
"createdAt": "2026-05-27T10:00:00.000Z",
"updatedAt": "2026-05-27T10:03:12.000Z",
"applicant": {
"id": "app_...",
"fullName": "Alex Singh",
"dateOfBirth": "1988-11-03T00:00:00.000Z",
"nationality": "GBR",
"email": "alex@example.com",
"emailVerified": true,
"phone": "+447700900100",
"phoneVerified": false,
"metadata": {}
},
"documents": [
{
"id": "doc_...",
"documentType": "id_card",
"side": "front",
"status": "done",
"mimeType": "image/jpeg",
"fileSize": 412938,
"parsedData": {
"fullName": "Alex Singh",
"dateOfBirth": "1988-11-03",
"documentNumber": "D1234567",
"expiryDate": "2030-01-15",
"nationality": "GBR",
"issuingCountry": "GBR",
"address": "12 High St, London"
},
"createdAt": "2026-05-27T10:01:00.000Z"
}
],
"checks": [
{ "id": "chk_1", "checkType": "ocr", "provider": "aws_textract", "status": "passed", "score": 0.95, "startedAt": "...", "finishedAt": "..." },
{ "id": "chk_2", "checkType": "face_match", "provider": "azure_face", "status": "passed", "score": 0.88 },
{ "id": "chk_3", "checkType": "liveness", "provider": "azure_face", "status": "passed", "score": 0.92 },
{ "id": "chk_4", "checkType": "sanctions", "provider": "ofac", "status": "failed", "score": 0.0 }
],
"riskScore": {
"overallScore": 62,
"decision": "escalate",
"autoDecision": true,
"factors": [
{ "factor": "document_authenticity", "impact": 1.0, "description": "Barcode + metadata valid" }
],
"rejectionReasons": [],
"verdictMeta": {
"factorVerdicts": [
{ "id": "1.1", "section": "Identity Document", "label": "Document authenticity", "weight": 15, "state": "pass", "evidence": ["barcode_valid"] },
{ "id": "4.2", "section": "Screening", "label": "Sanctions / PEP", "weight": 20, "state": "fail", "evidence": ["ofac_possible_match"] }
],
"disqualifiers": [],
"reviewTriggers": ["sanctions_possible_match"],
"effectiveThresholdApprove": 80
}
},
"fraudSignals": [
{ "signalType": "device_reuse", "severity": "low", "details": { "matchedFingerprint": "..." } }
],
"auditLogs": [
{ "id": "log_1", "actorType": "api", "actorId": "kyk_prod_ab", "eventType": "request.created", "payload": {}, "createdAt": "..." },
{ "id": "log_2", "actorType": "system", "actorId": "orchestrator", "eventType": "request.escalated", "payload": { "reason": "sanctions" }, "createdAt": "..." }
]
}
Feldreferenz
| Pfad | Hinweise |
|---|---|
documents[].parsedData | Per OCR ausgelesene Felder (je nach Dokumenttyp unterschiedlich): fullName, dateOfBirth, documentNumber, expiryDate, nationality, issuingCountry, address. null, bis OCR ausgeführt wurde |
documents[].status | pending · processing · done · failed |
checks[].checkType | ocr · face_match · liveness · sanctions · llm_consistency |
checks[].status | pending · running · passed · failed · skipped · error |
checks[].score | 0.0–1.0 (null bei reinen Bestanden/Nicht-bestanden-Prüfungen). details enthält das rohe Ergebnis des Anbieters |
riskScore.overallScore | Zusammengesetzter Wert 0–100 |
riskScore.decision | approve · reject · escalate. autoDecision: false = ein Mensch hat überstimmt |
riskScore.verdictMeta.factorVerdicts[] | Die Matrix BESTANDEN/NICHT BESTANDEN/N. A., die erklärt, warum die Entscheidung so ausgefallen ist — state ist pass · fail · n/a |
riskScore.verdictMeta.disqualifiers | Codes der Stufe 1, die eine Ablehnung erzwingen |
riskScore.verdictMeta.reviewTriggers | Codes der Stufe 2, die eine Eskalation erzwingen |
fraudSignals[] | signalType (same_face · velocity · document_reuse · device_reuse), severity (low · medium · high) |
auditLogs[] | Manipulationssichere Historie; actorType ist api · system · user |
Fehler
404 NOT_FOUND— keine Anfrage mit dieser ID in dieser Organisation. Anfragen gehören Organisationen; Sie können die Daten einer anderen Organisation nicht lesen, selbst mit einem gültigen Schlüssel.
Eine Verifizierung in Ihrer eigenen App anzeigen
Die Detailantwort ist dafür gedacht, direkt dargestellt zu werden — ein Aufruf liefert alles, was das Dashboard anzeigt, sodass Ihre Prüfer sich nie bei Certivant anmelden müssen:
GET /api/v1/kyc/requests/:id → Antragstellerdaten, documents[].parsedData, checks[] und riskScore.verdictMeta.
Rufen Sie für jedes Dokument GET /api/v1/kyc/requests/:id/documents/:docId/url auf → eine signierte URL mit 15 Minuten Gültigkeit. Bilder rendern Sie mit <img src>, PDFs mit <iframe> — die URL ist vorsigniert und benötigt keinen Header Authorization. Siehe Dokumente → Download-URL abrufen.
Zeigen Sie checks[] (bestanden/nicht bestanden + Score) und riskScore.verdictMeta.factorVerdicts[] an, damit ein Prüfer genau sieht, warum eine Anfrage eskaliert wurde, und handeln Sie anschließend mit POST /requests/:id/decision.
Rufen Sie Dokument-URLs bei Bedarf ab, unmittelbar bevor Sie sie anzeigen. Sie laufen nach 15 Minuten ab und dürfen niemals protokolliert, zwischengespeichert oder nicht authentifizierten Nutzern zugänglich gemacht werden.
Zur Verarbeitung einreichen
POST /api/v1/kyc/requests/:id/submit Berechtigungsbereich: kyc:submit
Gibt eine Anfrage im Status PENDING_UPLOAD in die automatisierte Verarbeitungspipeline frei. Alle erforderlichen
Dokumente müssen hochgeladen sein (pendingDocTypes ist leer), bevor Sie einreichen können.
Verlangt Ihre Organisation die Verifizierung von E-Mail-Adresse und/oder Telefonnummer (KYC/B-Einstellungen),
stellen Sie sicher, dass jeder erforderliche Kanal vor dem Einreichen verifiziert ist — setzen Sie
applicant.emailVerified / applicant.phoneVerified: true beim Erstellen (wenn Sie sie selbst geprüft haben)
oder lassen Sie den Antragsteller den Code-Schritt in einer gehosteten Sitzung abschließen. Ein nicht verifizierter
erforderlicher Kanal lässt die Prüfung der Kontaktdaten bei der Verarbeitung fehlschlagen.
Antwort
{
"id": "req_...",
"status": "PROCESSING",
"message": "Request submitted; you will receive a webhook when processing completes."
}
Fehler
400 BAD_REQUEST—pendingDocTypesist nicht leer. Laden Sie zuerst die fehlenden Dokumente hoch.409 CONFLICT— die Anfrage befindet sich nicht inPENDING_UPLOAD. Sie können nur einmal einreichen.
Manuelle Entscheidung (eskalierte Anfragen)
POST /api/v1/kyc/requests/:id/decision Berechtigungsbereich: kyc:manage
Überschreibt eine ESCALATED-Anfrage mit einer menschlichen Entscheidung. Dieser Endpunkt ist für interne Werkzeuge
gedacht — die meisten Entscheidungen werden über das Dashboard getroffen.
Anfrage-Body
{ "decision": "APPROVED", "note": "Confirmed identity against internal CRM record" }
| Feld | Typ | Pflichtfeld | Hinweise |
|---|---|---|---|
decision | Aufzählung | ja | APPROVED oder REJECTED |
note | string | ja | 1–1000 Zeichen. Wird im Audit-Protokoll gespeichert und ist für alle Prüfer sichtbar |
Antwort
{ "id": "req_...", "status": "APPROVED", "decision": "APPROVED", "reviewNote": "..." }
Fehler
409 CONFLICT— die Anfrage befindet sich nicht im StatusESCALATED. Eine automatische Genehmigung können Sie nicht überschreiben.
Eine abgelehnte Anfrage erneut einreichen
POST /api/v1/kyc/requests/:id/resubmit Berechtigungsbereich: kyc:write
Setzt eine REJECTED-Anfrage auf PENDING_UPLOAD zurück, damit der Antragsteller es erneut versuchen kann. Bisherige
Dokumente werden entfernt; der Antragsteller lädt neue hoch.
Antwort
{ "id": "req_...", "status": "PENDING_UPLOAD" }
Fehler
409 CONFLICT— die Anfrage befindet sich nicht im StatusREJECTED. Nur abgelehnte Anfragen können erneut eingereicht werden; stornierte oder genehmigte nicht.
Das erneute Einreichen ist eine privilegierte Operation. Stellen Sie sicher, dass die Richtlinie Ihrer Organisation dem Antragsteller einen erneuten Versuch erlaubt. Manche regulierten Abläufe verlangen eine neue Anfrage statt einer erneuten Einreichung, damit das Audit-Protokoll getrennte Versuche klar ausweist.
Eine Anfrage löschen
DELETE /api/v1/kyc/requests/:id Berechtigungsbereich: kyc:write
Löscht die Anfrage und alles, was daran hängt, dauerhaft: Die Löschung wirkt sich auf die Dokumente, Prüfungen und Risiko-Scores der Anfrage aus, entfernt die hochgeladenen Ausweisbilder bzw. PDFs aus dem Speicher und entfernt den Antragstellerdatensatz, sofern keine andere Anfrage darauf verweist. Verwenden Sie dies, um ein Löschverlangen eines Kunden zu erfüllen oder eine Test-Verifizierung zu entfernen.
Antwort
{
"success": true,
"documentsDeleted": 3,
"applicantDeleted": true
}
documentsDeleted— wie viele gespeicherte Dateien entfernt wurden.applicantDeleted— ob der Antragsteller als verwaister Datensatz bereinigt wurde (false, wenn er noch andere Anfragen hat).
Fehler
404 NOT_FOUND— keine Anfrage mit dieser ID in Ihrer Organisation.
Dies ist nicht rückgängig zu machen — die hochgeladenen Dokumente sind weg. Das nur anfügbare Audit-Protokoll bleibt erhalten (seine Einträge sind eine weiche Referenz), sodass der Nachweis, dass eine Anfrage einmal bestand und gelöscht wurde, für die Compliance erhalten bleibt. Wenn Sie nur die personenbezogenen Daten des Antragstellers löschen möchten, verwenden Sie stattdessen Einen Antragsteller löschen.
Ergebnis melden
POST /api/v1/kyc/requests/:id/outcome Berechtigungsbereich: kyc:write
Optional. Teilen Sie Certivant mit, ob der Kauf oder Kredit, für den die Verifizierung durchgeführt wurde, tatsächlich geliefert oder storniert wurde. Rufen Sie den Endpunkt auf, sobald über die Anfrage entschieden ist.
Request-Body
{ "fulfilled": true }
| Feld | Typ | Erforderlich | Hinweise |
|---|---|---|---|
fulfilled | Boolean | ja | true = Kauf oder Kredit wurde geliefert. false = er wurde storniert |
Antwort
{ "id": "req_...", "fulfilled": true, "recorded": true }
recorded: false bedeutet, dass die Anfrage noch nicht im Betrugsnetzwerk ist (etwa weil keine Identitätsschlüssel vorliegen). Es geht nichts verloren — Sie können das Ergebnis später erneut senden. Sie können den Endpunkt auch jederzeit erneut aufrufen, um die Angabe zu ändern.
Fehler
404 NOT_FOUND— keine Anfrage mit dieser ID in dieser Organisation.409 CONFLICT— über die Anfrage ist noch nicht entschieden. Ihr Status mussAPPROVED,REJECTED,ESCALATEDoderPENDING_SECOND_REVIEWsein.
Warum das hilft. Im Betrugsnetzwerk zählt ein gelieferter Kauf voll, ein stornierter gar nicht. Ein Kunde, der drei Telefonfinanzierungen begonnen und zwei davon storniert hat, wird so nicht mit jemandem verwechselt, der drei Telefone mitgenommen hat. Geteilt wird nur das Ergebnis — sonst verlässt nichts Ihre Organisation.
Betrugssignale abrufen
GET /api/v1/kyc/requests/:id/fraud-signals Berechtigungsbereich: kyc:read
Liefert die Geräte-, Netzwerk- und Verhaltenssignale zu Betrug, die während der Verifizierung erfasst wurden.
Antwort
[
{
"signalType": "device_reused",
"severity": "medium",
"details": { "previousRequestIds": ["req_..."], "matchedFingerprint": "..." }
},
{
"signalType": "vpn_detected",
"severity": "low",
"details": { "asn": 13335, "isp": "Cloudflare" }
}
]
Der Schweregrad ist low, medium oder high. Signale mit hohem Schweregrad eskalieren die Anfrage automatisch zur manuellen Prüfung.
Laufende AML-Überwachung
Eine genehmigte Verifizierung kann auf neue Treffer bei Sanktionen, PEP und negativen Medienberichten erneut geprüft werden (siehe Laufende Überwachung). Die Überwachung ist eine Funktion des Tarifs und wird pro überwachter Person und Jahr abgerechnet.
| Aufruf | Berechtigungsbereich | Wirkung |
|---|---|---|
GET /api/v1/kyc/requests/:id/monitoring | kyc:read | Zustand: enrolled, status (active, paused, cancelled), frequency, enrolledAt, lastScreenedAt, nextScreenAt, nextBillingAt, openAlerts |
POST /api/v1/kyc/requests/:id/monitoring | kyc:manage | Starten. Body { "frequency": "daily" | "weekly" | "monthly" } (Standard monthly). Liefert { "success": true, "frequency": "monthly", "chargedCents": 0 } |
DELETE /api/v1/kyc/requests/:id/monitoring | kyc:manage | Beenden |
POST liefert 409 für eine Verifizierung, die nicht genehmigt ist, 403, wenn Ihr Tarif die Überwachung nicht
enthält, und 402, wenn für eine Person über das inklusive Kontingent hinaus kein Guthaben vorhanden ist.
Neue Treffer kommen als Webhook kyc.monitoring.alert an (siehe Webhook-Ereignisse):
data.monitoring enthält alertType (sanctions_match, pep_match, adverse_media, sanctions_unverifiable),
severity und bei einer PEP die pepTier — 1 Staatsoberhäupter und Minister … 4 Verwandte und enge Vertraute —
oder adverseMedia: true. data.sanctions.listsChecked nennt die geprüften Listen; die Anbieter der Prüfung werden
niemals genannt.
Die Verifizierung selbst trägt dieselben pepTier / adverseMedia unter data.sanctions in ihrem Entscheidungs-Webhook.
Einen Antragsteller löschen (Löschung nach DSGVO)
DELETE /api/v1/kyc/applicants/:applicantId Berechtigungsbereich: kyc:manage
Löscht einen Antragsteller und jede mit ihm verknüpfte Anfrage dauerhaft. Dies ist der Endpunkt für das Recht auf Löschung nach Artikel 17 DSGVO. Das Audit-Protokoll bewahrt einen Grabstein mit dem Zeitpunkt der Löschung, aber keine personenbezogenen Daten.
Antwort
{ "success": true, "deletedRequestIds": ["req_...", "req_..."] }
Die Löschung ist nicht rückgängig zu machen. Stimmen Sie sich vor dem Aufruf dieses Endpunkts mit Ihrem Compliance-Team ab — je nach Rechtsraum kann eine gesetzliche Pflicht bestehen, Verifizierungsnachweise 5–7 Jahre aufzubewahren, was der Löschung entgegensteht.
Formulare
Die KYC- und KYB-Verifizierungsformulare eines Mandanten über die Certivant-REST-API auflisten — das Formular finden, mit dem Sie eine Verifizierung durchführen, nach Typ filtern und Slug, Status sowie das Kennzeichen „einbettbar“ jedes Formulars auslesen.
KYB-Anfragen
Certivant-KYB-API-Referenz — Unternehmensdaten, Geschäftsführer und wirtschaftlich Berechtigte einer BUSINESS-Anfrage hinzufügen, Registerabfragen auslösen und die KYC-Unteranfragen je Organverantwortlichem verwalten.