Schnellstart
Erstellen Sie einen API-Schlüssel und senden Sie Ihre erste KYC-Anfrage in drei Minuten.
Dies ist der schnellste Weg von „Ich habe ein Certivant-Konto“ zu „Eine Verifizierungsanfrage ist unterwegs“. Wenn Sie diese Seite durcharbeiten, haben Sie eine funktionierende Integration von Anfang bis Ende.
Was Sie benötigen
- Eine Certivant-Organisation (melden Sie sich unter der URL Ihres Mandanten an — die Testphase enthält kostenlose Guthaben).
- Die Rolle Inhaber oder Administrator in dieser Organisation. Mitglieder können keine API-Schlüssel erstellen.
- Eine Möglichkeit, HTTPS-Anfragen zu senden —
curl, Postman oder den HTTP-Client Ihrer Programmiersprache.
1 — API-Schlüssel erstellen
Klicken Sie auf Neuer Schlüssel, vergeben Sie eine Bezeichnung, wählen Sie Live oder Test (zum Beispiel mit einer Bezeichnung wie staging-server) und wählen Sie die benötigten Berechtigungsbereiche:
kyc:read— Anfragen, Dokumente und Betrugssignale lesenkyc:write— Anfragen erstellen, Dokumente hochladenkyc:submit— eine Anfrage zur automatisierten Verarbeitung einreichenkyc:manage— Entscheidungen überschreiben, Antragsteller löschen (DSGVO)
ck_live_ (oder mit ck_test_, wenn Sie die Testumgebung gewählt haben). Kopieren Sie ihn jetzt — Certivant speichert nur einen Hash, sodass Sie ihn später nicht wiederherstellen können. Falls Sie ihn verlieren, widerrufen Sie den Schlüssel und erstellen Sie einen neuen.Behandeln Sie API-Schlüssel wie Passwörter. Speichern Sie sie in Ihrem Geheimnisspeicher, committen Sie sie niemals in Git und verwenden Sie für jede Umgebung einen eigenen Schlüssel (Staging bzw. Produktion). Widerrufen Sie einen Schlüssel sofort, sobald Sie vermuten, dass er offengelegt wurde.
2 — KYC-Anfrage erstellen
Die minimale Nutzlast benötigt nur einen type. Fügen Sie Antragstellerdaten direkt hinzu, falls Sie sie haben — andernfalls füllt der Antragsteller sie über eine gehostete Sitzung aus. Derselbe durchgängige Ablauf (erstellen → Dokumente hochladen → einreichen → abfragen) in acht Sprachen:
# 1. Create a verification request
curl -X POST https://app.certivant.com/api/v1/kyc/requests \
-H "Authorization: Bearer ck_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"type": "INDIVIDUAL",
"externalRef": "user_123",
"applicant": {
"fullName": "Jane Doe", "email": "jane@example.com", "nationality": "US",
"emailVerified": false, "phoneVerified": false
}
}'
# -> { "id": "req_...", "status": "PENDING_UPLOAD", ... }
# 2 & 3. Upload an identity document (front) + a selfie
curl -X POST https://app.certivant.com/api/v1/kyc/requests/{requestId}/documents \
-H "Authorization: Bearer ck_live_your_key_here" \
-F "file=@passport.jpg" -F "documentType=PASSPORT" -F "side=front"
curl -X POST https://app.certivant.com/api/v1/kyc/requests/{requestId}/documents \
-H "Authorization: Bearer ck_live_your_key_here" \
-F "file=@selfie.jpg" -F "documentType=SELFIE"
# 4. Submit for AI processing (email + phone must already be verified if your org requires it)
curl -X POST https://app.certivant.com/api/v1/kyc/requests/{requestId}/submit \
-H "Authorization: Bearer ck_live_your_key_here"
# 5. Poll for the decision (or just listen for the webhook)
curl https://app.certivant.com/api/v1/kyc/requests/{requestId} \
-H "Authorization: Bearer ck_live_your_key_here"
const BASE = "https://app.certivant.com/api/v1/kyc";
const headers = { Authorization: "Bearer ck_live_your_key_here" };
// 1. Create
const { id } = await fetch(BASE + "/requests", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
type: "INDIVIDUAL",
externalRef: "user_123",
applicant: { fullName: "Jane Doe", email: "jane@example.com", nationality: "US" },
}),
}).then((r) => r.json());
// 2 & 3. Upload documents
async function upload(file, documentType, side) {
const form = new FormData();
form.append("file", file);
form.append("documentType", documentType);
if (side) form.append("side", side);
await fetch(BASE + "/requests/" + id + "/documents", { method: "POST", headers, body: form });
}
await upload(passportFile, "PASSPORT", "front");
await upload(selfieFile, "SELFIE");
// 4. Submit
await fetch(BASE + "/requests/" + id + "/submit", { method: "POST", headers });
// 5. Poll (production: listen for the webhook instead)
let result;
do {
await new Promise((r) => setTimeout(r, 3000));
result = await fetch(BASE + "/requests/" + id, { headers }).then((r) => r.json());
} while (result.status === "PROCESSING");
console.log(result.status, result.riskScore);
const BASE = "https://app.certivant.com/api/v1/kyc";
const headers = { Authorization: "Bearer ck_live_your_key_here" };
type KycStatus = "PENDING_UPLOAD" | "DOCUMENTS_READY" | "PROCESSING"
| "APPROVED" | "REJECTED" | "ESCALATED" | "CANCELLED";
interface KycRequest {
id: string;
status: KycStatus;
riskScore?: { overallScore: number; decision: string } | null;
}
const created: KycRequest = await fetch(BASE + "/requests", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
type: "INDIVIDUAL",
externalRef: "user_123",
applicant: { fullName: "Jane Doe", email: "jane@example.com", nationality: "US" },
}),
}).then((r) => r.json());
await fetch(BASE + "/requests/" + created.id + "/submit", { method: "POST", headers });
import time, requests
BASE = "https://app.certivant.com/api/v1/kyc"
headers = {"Authorization": "Bearer ck_live_your_key_here"}
# 1. Create
r = requests.post(f"{BASE}/requests", headers=headers, json={
"type": "INDIVIDUAL",
"externalRef": "user_123",
"applicant": {"fullName": "Jane Doe", "email": "jane@example.com", "nationality": "US"},
})
request_id = r.json()["id"]
# 2 & 3. Upload documents
def upload(path, document_type, side=None):
data = {"documentType": document_type}
if side:
data["side"] = side
with open(path, "rb") as f:
requests.post(f"{BASE}/requests/{request_id}/documents",
headers=headers, files={"file": f}, data=data)
upload("passport.jpg", "PASSPORT", "front")
upload("selfie.jpg", "SELFIE")
# 4. Submit
requests.post(f"{BASE}/requests/{request_id}/submit", headers=headers)
# 5. Poll
while True:
result = requests.get(f"{BASE}/requests/{request_id}", headers=headers).json()
if result["status"] != "PROCESSING":
break
time.sleep(3)
print(result["status"])
<?php
$BASE = "https://app.certivant.com/api/v1/kyc";
$auth = ["Authorization: Bearer ck_live_your_key_here"];
// 1. Create
$ch = curl_init("$BASE/requests");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => array_merge($auth, ["Content-Type: application/json"]),
CURLOPT_POSTFIELDS => json_encode([
"type" => "INDIVIDUAL",
"externalRef" => "user_123",
"applicant" => ["fullName" => "Jane Doe", "email" => "jane@example.com", "nationality" => "US"],
]),
]);
$req = json_decode(curl_exec($ch), true);
$id = $req["id"];
// 2. Upload a document
$ch = curl_init("$BASE/requests/$id/documents");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => $auth,
CURLOPT_POSTFIELDS => [
"file" => new CURLFile("passport.jpg"),
"documentType" => "PASSPORT",
"side" => "front",
],
]);
curl_exec($ch);
// 4. Submit
$ch = curl_init("$BASE/requests/$id/submit");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $auth]);
curl_exec($ch);
using System.Net.Http;
using System.Net.Http.Json;
using System.Net.Http.Headers;
var http = new HttpClient { BaseAddress = new Uri("https://app.certivant.com/api/v1/kyc/") };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "ck_live_your_key_here");
// 1. Create
var created = await http.PostAsJsonAsync("requests", new {
type = "INDIVIDUAL",
externalRef = "user_123",
applicant = new { fullName = "Jane Doe", email = "jane@example.com", nationality = "US" }
});
var request = await created.Content.ReadFromJsonAsync<Dictionary<string, object>>();
var id = request["id"].ToString();
// 2. Upload a document
using var form = new MultipartFormDataContent();
form.Add(new ByteArrayContent(File.ReadAllBytes("passport.jpg")), "file", "passport.jpg");
form.Add(new StringContent("PASSPORT"), "documentType");
form.Add(new StringContent("front"), "side");
await http.PostAsync($"requests/{id}/documents", form);
// 4. Submit
await http.PostAsync($"requests/{id}/submit", null);
import java.net.http.*;
import java.net.URI;
var http = HttpClient.newHttpClient();
String BASE = "https://app.certivant.com/api/v1/kyc";
String auth = "Bearer ck_live_your_key_here";
// 1. Create
var createBody = """
{"type":"INDIVIDUAL","externalRef":"user_123",
"applicant":{"fullName":"Jane Doe","email":"jane@example.com","nationality":"US"}}""";
var created = http.send(HttpRequest.newBuilder(URI.create(BASE + "/requests"))
.header("Authorization", auth).header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(createBody)).build(),
HttpResponse.BodyHandlers.ofString());
// parse created.body() -> id with your JSON library (Jackson/Gson)
// 4. Submit
http.send(HttpRequest.newBuilder(URI.create(BASE + "/requests/" + id + "/submit"))
.header("Authorization", auth).POST(HttpRequest.BodyPublishers.noBody()).build(),
HttpResponse.BodyHandlers.ofString());
package main
import (
"bytes"
"net/http"
)
const base = "https://app.certivant.com/api/v1/kyc"
const auth = "Bearer ck_live_your_key_here"
func main() {
// 1. Create
body := []byte(`{"type":"INDIVIDUAL","externalRef":"user_123",
"applicant":{"fullName":"Jane Doe","email":"jane@example.com","nationality":"US"}}`)
req, _ := http.NewRequest("POST", base+"/requests", bytes.NewReader(body))
req.Header.Set("Authorization", auth)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
// decode resp.Body -> { "id": "..." }
// 4. Submit
submit, _ := http.NewRequest("POST", base+"/requests/"+id+"/submit", nil)
submit.Header.Set("Authorization", auth)
http.DefaultClient.Do(submit)
}
Eine erfolgreiche Antwort sieht so aus:
{
"id": "req_01HXY...",
"status": "PENDING_UPLOAD",
"type": "INDIVIDUAL",
"externalRef": "order-12345",
"pendingDocTypes": ["GOVERNMENT_ID", "SELFIE"],
"applicant": { "fullName": "Jane Doe", "email": "jane@example.com" },
"createdAt": "2026-05-27T10:00:00.000Z"
}
Speichern Sie die id — jeder weitere Aufruf benötigt sie.
Das Feld externalRef ist Ihr Fremdschlüssel. Verwenden Sie Ihre
Bestellnummer, Ihre Nutzer-ID oder alles andere, mit dem Sie die
Certivant-Anfrage einer Zeile in Ihrer eigenen Datenbank zuordnen können.
Es wird bei jedem Webhook-Ereignis zurückgegeben.
3 — Dem Antragsteller eine gehostete Sitzung bereitstellen
Der einfachste Weg, Dokumente zu erfassen, ist, dem Antragsteller eine kurzlebige URL zu senden. Certivant übernimmt die Dokumentenerfassung, die Lebenderkennung und die Upload-Oberfläche; Sie geben den Link lediglich weiter.
curl -X POST https://app.certivant.com/api/v1/kyc/requests/req_01HXY.../session-url \
-H "Authorization: Bearer ck_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"expiresInHours": 72,
"redirectUrl": "https://yourapp.example.com/onboarding/complete"
}'
Liefert:
{
"sessionUrl": "https://app.certivant.com/s/01HZ...",
"expiresAt": "2026-05-30T10:00:00.000Z"
}
Senden Sie diesen Link per E-Mail an den Antragsteller, betten Sie ihn in Ihren eigenen Onboarding-Ablauf ein oder öffnen Sie ihn in einem iframe — je nachdem, was zu Ihrer Nutzerführung passt. Sobald der Antragsteller einreicht, wechselt Certivant die Anfrage in den Status PROCESSING, führt die Prüfungen durch und sendet den Webhook.
Auf diesem Weg über eine gehostete Sitzung schließt der Antragsteller auch
die E-Mail- bzw. Telefonverifizierung ab, sofern Ihre Organisation dies
verlangt. Sie müssen emailVerified bzw. phoneVerified daher nicht selbst
übergeben. Beim Server-zu-Server-Weg (siehe
Ihre erste Anfrage) sollten
Sie hingegen jeden erforderlichen Kanal verifizieren — oder diese Felder beim
Erstellen setzen — bevor Sie submit aufrufen.
4 — Auf das Ergebnis warten
Konfigurieren Sie unter KYC → Einstellungen → Webhooks einen Webhook-Endpunkt mit einer URL, die Sie kontrollieren. Certivant sendet dorthin einen POST, sobald sich der Status der Anfrage ändert.
{
"event": "kyc.request.approved",
"requestId": "req_01HXY...",
"organizationId": "org_01HW...",
"externalRef": "order-12345",
"status": "APPROVED",
"timestamp": "2026-05-27T10:04:21.000Z",
"data": { "score": 92, "decision": "approve" }
}
Verwenden Sie die externalRef, um die Zeile in Ihrer Datenbank zu finden, und setzen Sie das Onboarding fort. Siehe Webhooks für die Signaturprüfung, das Verhalten bei Wiederholungen und den vollständigen Katalog der Ereignisse.
Wie geht es weiter
- Authentifizierung — Berechtigungsbereiche, Schlüsselrotation, Hygiene zwischen den Umgebungen.
- Ihre erste Anfrage — derselbe Ablauf ohne gehostete Sitzung (Sie laden die Dokumente selbst hoch).
- Referenz zu KYC-Anfragen — jeder Endpunkt, jedes Feld.
- Webhooks — richten Sie die Signaturprüfung ein, bevor Sie in die Produktion gehen.
Certivant Entwicklerdokumentation
Entwickeln Sie mit der Certivant-API — KYC, KYB, Dokumenten-Upload, gehostete Sitzungen und Webhook-Ereignisse.
Authentifizierung
Authentifizieren Sie jeden Certivant-API-Aufruf mit einem Bearer-API-Schlüssel — behandelt werden die Erstellung von Schlüsseln, Berechtigungsbereiche, das Format des Authorization-Headers, die Rotation ohne Ausfallzeit, den Widerruf und bewährte Sicherheitsverfahren.