Enjyn KYC Dokumentation
Enjyn KYC – API Dokumentation
Enjyn KYC ist eine deutsche Identitätsverifizierungslösung, die Ausweisprüfung, Liveness-Check und biometrische Gesichtserkennung in einer einfachen REST API vereint. Diese Dokumentation erklärt alle Funktionen, Endpunkte und Best Practices für die Integration.
💡 Tipp: Mit Enjyn KYC können Sie bis zu 100 Verifizierungen pro Monat kostenlos durchführen. Perfekt zum Testen und für kleinere Projekte.
Übersicht
Enjyn KYC bietet eine mehrstufige Identitätsprüfung:
- Dokumentenprüfung: Automatische OCR-Erkennung deutscher Personalausweise und Reisepässe
- Datenabgleich: Vergleich der erkannten Daten mit den erwarteten Personendaten
- Liveness-Check: Video-basierte Lebenderkennung zum Schutz vor Fotos und Deepfakes
- Gesichtserkennung: Biometrischer Abgleich zwischen Ausweisfoto und Live-Video
Basis-URL
https://api.verify.enjyn.de
Authentifizierung
Die API verwendet Domain-basierte Authentifizierung. Ihre Domain muss vor der Nutzung freigeschaltet werden. Anfragen von nicht autorisierten Domains werden mit einem 403 Forbidden Fehler abgelehnt.
Schnellstart
So integrieren Sie Enjyn KYC in 3 Schritten:
- Session erstellen: Senden Sie die zu prüfenden Personendaten an die API
- Nutzer verifizieren: Leiten Sie den Nutzer zum Verifizierungslink weiter
- Ergebnis abrufen: Holen Sie das Verifizierungsergebnis per API oder Webhook
Beispiel: Session erstellen
// JavaScript / Node.js
const response = await fetch('https://api.verify.enjyn.de/api/v1/verify', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
vorname: 'Max',
nachname: 'Mustermann',
geburtsdatum: '01.01.1990',
return_url: 'https://ihre-seite.de/callback'
})
});
const data = await response.json();
console.log(data.verify_url); // Link für den Nutzer
Beispiel: Ergebnis abrufen
// Ergebnis mit Session-ID abrufen
const result = await fetch('https://api.verify.enjyn.de/api/v1/get-result/' + sessionId);
const data = await result.json();
if (data.status === 'verified') {
console.log('Verifizierung erfolgreich!');
} else if (data.status === 'failed') {
console.log('Verifizierung fehlgeschlagen');
}
API Endpunkte
POST /api/v1/verify
Erstellt eine neue Verifizierungs-Session.
Request Body
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
vorname |
String | Ja | Vorname wie auf dem Ausweis |
nachname |
String | Ja | Nachname wie auf dem Ausweis |
geburtsdatum |
String | Ja | Geburtsdatum im Format TT.MM.JJJJ |
return_url |
String | Nein | URL für Redirect nach Abschluss |
Response (Erfolg)
{
"success": true,
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"token": "abc123xyz...",
"verify_url": "https://api.verify.enjyn.de/verify/abc123xyz...",
"qr_url": "https://api.verify.enjyn.de/api/v1/qr-code/abc123xyz..."
}
Response Felder
| Feld | Beschreibung |
|---|---|
session_id |
Eindeutige ID der Session (zum späteren Abrufen des Ergebnisses) |
token |
Einmaliger Token für die Verifizierungs-URL |
verify_url |
Link, den der Nutzer öffnen muss |
qr_url |
URL zu einem QR-Code-Bild (PNG) für mobile Nutzung |
GET /api/v1/get-result/{session_id}
Ruft das Ergebnis einer Verifizierung ab.
Response (Erfolg)
{
"success": true,
"status": "verified",
"vorname": "Max",
"nachname": "Mustermann",
"geburtsdatum": "01.01.1990",
"face_confidence": 87.5,
"verified_at": "2025-12-28T14:30:00Z",
"created_at": "2025-12-28T14:25:00Z",
"data_available": true
}
Status-Werte
| Status | Bedeutung |
|---|---|
pending |
Session erstellt, Verifizierung noch nicht gestartet |
processing |
Verifizierung läuft gerade |
verified |
Verifizierung erfolgreich abgeschlossen |
failed |
Verifizierung fehlgeschlagen |
expired |
Session abgelaufen (nach 1 Stunde) |
⚠️ Achtung: Personendaten (Vorname, Nachname, Geburtsdatum) werden nach 10 Minuten anonymisiert. Der Status bleibt bis zu 30 Tage abrufbar.
GET /api/v1/check-status/{token}
Prüft den aktuellen Status einer laufenden Verifizierung (z.B. für Polling).
Response
{
"success": true,
"status": "processing",
"has_front_image": true,
"has_back_image": true,
"has_liveness": false,
"face_confidence": null,
"verified_at": null
}
GET /api/v1/qr-code/{token}
Generiert einen QR-Code als PNG-Bild für die Verifizierungs-URL.
Response
Gibt ein PNG-Bild zurück (Content-Type: image/png).
<img src="https://api.verify.enjyn.de/api/v1/qr-code/abc123xyz..." alt="QR-Code">
Callback / Redirect
Wenn Sie eine return_url angeben, wird der Nutzer nach Abschluss der Verifizierung dorthin weitergeleitet. Die URL erhält Query-Parameter mit dem Ergebnis:
Erfolgreiche Verifizierung
https://ihre-seite.de/callback?status=success&session_id=550e8400-e29b-41d4-a716-446655440000
Fehlgeschlagene Verifizierung
https://ihre-seite.de/callback?status=failed&session_id=550e8400-e29b-41d4-a716-446655440000
Abgelaufene Session
https://ihre-seite.de/callback?status=expired&session_id=550e8400-e29b-41d4-a716-446655440000
/api/v1/get-result/{session_id} auf, um das Ergebnis serverseitig zu verifizieren.
Verifizierungsprozess
So läuft die Verifizierung aus Sicht des Nutzers ab:
- Link öffnen: Der Nutzer öffnet den Verifizierungslink auf seinem Smartphone
- Ausweis-Vorderseite: Foto der Vorderseite des Personalausweises
- Ausweis-Rückseite: Foto der Rückseite des Personalausweises
- Liveness-Check: Kurzes Video mit Kopfbewegung zur Lebenderkennung
- Abschluss: Automatische Prüfung und Weiterleitung
Unterstützte Dokumente
- Deutscher Personalausweis (Vorder- und Rückseite)
- Deutscher Reisepass (Datenseite)
Prüfungen im Detail
- OCR-Erkennung
- Automatische Texterkennung auf dem Ausweisdokument. Extrahiert Name, Geburtsdatum und prüft auf "Bundesrepublik Deutschland".
- Datenabgleich
- Vergleich der OCR-Ergebnisse mit den bei der Session-Erstellung übermittelten Daten. Alle drei Felder (Vorname, Nachname, Geburtsdatum) müssen übereinstimmen.
- Liveness-Detection
- Analyse des Videos auf echte Kopfbewegungen, konsistente Gesichtserkennung über mehrere Frames und Schutz vor statischen Bildern oder Bildschirm-Wiedergaben.
- Face-Match
- Biometrischer Vergleich zwischen dem Gesicht auf dem Ausweis und dem Gesicht im Liveness-Video. Die Confidence wird als Prozentwert zurückgegeben.
Fehlerbehandlung
Die API gibt im Fehlerfall strukturierte JSON-Responses zurück:
{
"success": false,
"error": "Fehlerbeschreibung",
"code": "ERROR_CODE"
}
HTTP Status Codes
| Code | Bedeutung |
|---|---|
200 |
Erfolg |
400 |
Ungültige Anfrage (fehlende Parameter) |
403 |
Zugriff verweigert (Domain nicht autorisiert) |
404 |
Session nicht gefunden |
410 |
Session abgelaufen |
429 |
Monatliches Limit erreicht |
500 |
Interner Serverfehler |
Fehler-Codes
| Code | Beschreibung | Lösung |
|---|---|---|
DOMAIN_NOT_WHITELISTED |
Ihre Domain ist nicht freigeschaltet | Kontaktieren Sie uns zur Freischaltung |
MONTHLY_LIMIT_REACHED |
Monatliches Kontingent aufgebraucht | Upgrade auf höheres Kontingent |
SESSION_EXPIRED |
Die Session ist abgelaufen (1h Limit) | Neue Session erstellen |
INVALID_DOCUMENT |
Dokument konnte nicht erkannt werden | Nutzer soll besseres Foto machen |
DATA_MISMATCH |
Daten stimmen nicht überein | Eingabedaten prüfen |
LIVENESS_FAILED |
Liveness-Check nicht bestanden | Nutzer soll Video wiederholen |
FACE_MISMATCH |
Gesicht stimmt nicht mit Ausweis überein | Möglicherweise Betrugsversuch |
Sicherheit & Datenschutz
Enjyn KYC wurde von Grund auf für maximalen Datenschutz entwickelt. Alle Daten werden auf deutschen Servern verarbeitet und unterliegen der DSGVO.
Datenlöschung
| Datentyp | Löschung nach |
|---|---|
| Ausweisbilder (Vorder-/Rückseite) | 10 Minuten |
| Liveness-Video | 10 Minuten |
| Biometrische Daten | 10 Minuten |
| Personendaten (Name, Geburtsdatum) | 10 Minuten |
| Session-Metadaten (ID, Status) | 30 Tage |
Sicherheitsmaßnahmen
- Ende-zu-Ende-Verschlüsselung: Alle Daten werden bei der Übertragung und Speicherung verschlüsselt
- Kein Mitarbeiterzugriff: Sensible Daten werden ausschließlich von automatisierten Skripten verarbeitet
- Deutsche Server: Alle Daten verbleiben auf Servern in Deutschland
- DSGVO-konform: Vollständige Einhaltung der Datenschutz-Grundverordnung
- SSL/TLS: Alle API-Verbindungen sind TLS-verschlüsselt
Warum wir das gebaut haben
💡 Hintergrund: Wir haben Enjyn KYC für ein internes Projekt entwickelt, weil wir keinen Anbieter finden konnten, bei dem wir verifizieren konnten, dass sensible Daten tatsächlich gelöscht werden. Bei den großen Anbietern war nie klar, was mit Ausweisbildern und biometrischen Daten passiert – und wie lange sie gespeichert werden.
Preise
| Plan | Preis | Details |
|---|---|---|
| Kostenlos | 0€ | Bis 100 Verifizierungen pro Monat |
| Standard | 25€ / 250 Verifizierungen | + 15€ einmalige Freischaltgebühr |
| Custom Branding | 280€ / Monat | Eigenes Logo, Farben, Texte (Min. 3 Monate) |
Preisvergleich
| Anbieter | Preis pro Verifizierung | Kostenlos testen |
|---|---|---|
| Enjyn KYC | ~0,10€ | 100/Monat |
| IDnow | ~1,50€ | Nein |
| Veriff | ~1,00€ | Begrenzt |
| Onfido | ~1,50€ | Begrenzt |
Code-Beispiele
PHP
<?php
// Session erstellen
$data = [
'vorname' => 'Max',
'nachname' => 'Mustermann',
'geburtsdatum' => '01.01.1990',
'return_url' => 'https://ihre-seite.de/callback'
];
$ch = curl_init('https://api.verify.enjyn.de/api/v1/verify');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
// Nutzer weiterleiten
header('Location: ' . $response['verify_url']);
?>
Python
import requests
# Session erstellen
response = requests.post('https://api.verify.enjyn.de/api/v1/verify', json={
'vorname': 'Max',
'nachname': 'Mustermann',
'geburtsdatum': '01.01.1990',
'return_url': 'https://ihre-seite.de/callback'
})
data = response.json()
print(f"Verifizierungs-Link: {data['verify_url']}")
# Später: Ergebnis abrufen
result = requests.get(f"https://api.verify.enjyn.de/api/v1/get-result/{data['session_id']}")
print(f"Status: {result.json()['status']}")
cURL
# Session erstellen
curl -X POST https://api.verify.enjyn.de/api/v1/verify \
-H "Content-Type: application/json" \
-d '{
"vorname": "Max",
"nachname": "Mustermann",
"geburtsdatum": "01.01.1990",
"return_url": "https://ihre-seite.de/callback"
}'
# Ergebnis abrufen
curl https://api.verify.enjyn.de/api/v1/get-result/SESSION_ID
Häufige Fragen (FAQ)
- Wie lange ist eine Session gültig?
- Eine Session ist 1 Stunde nach Erstellung gültig. Danach wechselt der Status zu
expired. - Kann ich das Design anpassen?
- Ja, mit dem Custom Branding Paket (280€/Monat) können Sie Logo, Farben und Texte anpassen.
- Werden auch österreichische/schweizer Ausweise unterstützt?
- Aktuell werden nur deutsche Personalausweise und Reisepässe unterstützt. Weitere Dokumente sind in Planung.
- Wie hoch ist die Erkennungsrate?
- Bei guten Lichtverhältnissen und scharfen Fotos liegt die Erkennungsrate bei über 95%.
- Was passiert bei schlechter Bildqualität?
- Der Nutzer wird aufgefordert, ein neues Foto zu machen. Die OCR-Erkennung gibt Feedback zur Bildqualität.
- Gibt es eine Sandbox/Testumgebung?
- Nein, aber Sie können mit dem kostenlosen Kontingent (100/Monat) auf der Produktivumgebung testen.
- Wie kann ich mein Kontingent erhöhen?
- Kontaktieren Sie uns unter kontakt@enjyn.de für ein Upgrade.
- Werden die Daten für KI-Training verwendet?
- Nein. Alle Daten werden ausschließlich für die Verifizierung verwendet und danach gelöscht. Es findet kein Training statt.
Kunden-Dashboard
Als freigeschalteter Kunde erhalten Sie Zugang zum Kunden-Dashboard unter:
https://api.verify.enjyn.de/tenant/
Im Dashboard können Sie:
- Ihre aktuelle Nutzung und das verbleibende Kontingent einsehen
- Alle durchgeführten Verifizierungen (ohne persönliche Daten) sehen
- Die Erfolgsrate Ihrer Verifizierungen überwachen
ℹ️ Info: Die Zugangsdaten für das Dashboard erhalten Sie bei der Domain-Freischaltung per E-Mail.
Support & Kontakt
Bei Fragen oder Problemen erreichen Sie uns unter:
- 📧 E-Mail: support@enjyn.de
- 🌐 Kontaktformular: enjyn.de/kontakt
- 📄 Live-Demo: enjyn.de/kyc