01 / Start
Schnellstart
Erstellen Sie einen Schlüssel, setzen Sie zwei Umgebungsvariablen und senden Sie die erste Anfrage.
- Erstellen Sie einen Workspace und wählen Sie einen Tarif.
- Erstellen Sie einen API-Schlüssel mit dem kleinsten benötigten Verarbeitungsumfang. Kopieren Sie das Geheimnis sofort; es wird später nicht erneut angezeigt.
- Setzen Sie SCANVERION_API_URL und SCANVERION_API_KEY ausschließlich in Ihrer Serverumgebung.
- Senden Sie eine Multipart-Anfrage und speichern Sie die zurückgegebene requestId mit Ihrer eigenen Trace-ID.
curl --request POST "$SCANVERION_API_URL/api/v1/ai/document-processing" --header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "Idempotency-Key: invoice-20260807-001" --form "File=@invoice.pdf;type=application/pdf" --form "Operations=Scanner" \
--form "Operations=Rotation" --form "ScannerFields=invoiceNumber" --form "ScannerFields=issueDate" --form "ScannerFields=dueDate" --form "ScannerFields=paymentReference" --form "ScannerFields=supplierIban" --form "ScannerFields=customerIban" --form "ScannerFields=supplierAddress" --form "ScannerFields=supplierStreetName" --form "ScannerFields=supplierStreetNumber" --form "ScannerFields=supplierPostalCode" --form "ScannerFields=supplierCity" --form "ScannerFields=customerAddress" --form "ScannerFields=supplierVatNumber" --form "ScannerFields=customerVatNumber" --form "ScannerFields=netTotal" --form "ScannerFields=vatTotal" --form "ScannerFields=vatBreakdown" --form "ScannerFields=lineItems" --form "ScannerFields=grossTotal"02 / Sicherheit
Authentifizierung und API-Schlüssel
Verwenden Sie eingeschränkte Maschinenzugänge sicher von einem vertrauenswürdigen Backend.
03 / Zuverlässigkeit
Idempotenz und Wiederholungen
Vergeben Sie pro Verarbeitungsversuch einen stabilen Schlüssel und behandeln Sie Duplikate bewusst.
Senden Sie bei jeder Verarbeitungsanfrage einen Idempotency-Key. Verwenden Sie denselben Wert nur beim Wiederholen desselben logischen Uploads mit denselben Operationen. Eine doppelte Reservierung liefert 409 Conflict; ein neuer Schlüssel kann einen zweiten abrechenbaren Versuch erzeugen.
04 / KI-Endpunkt
Dokumentverarbeitung
Laden Sie JPEG, PNG, WebP oder PDF zur synchronen Dokumentanalyse hoch.
Verwenden Sie die exakten ASP.NET-Multipart-Feldnamen: ein File, ein oder mehrere wiederholte Operations, optionale wiederholte ScannerFields, optionales CheckboxDefinitions-JSON und optionales DisableObjectSegmentation.
Scannerfelder nach Dokumenttyp
Verwenden Sie die folgenden kanonischen Feldschlüssel als wiederholte ScannerFields-Werte. Der Abgleich beachtet die Groß-/Kleinschreibung nicht; die kanonische Schreibweise hält Integrationen jedoch konsistent. Jede Kategorie unterstützt zusätzlich die gemeinsamen Felder. Ein angefordertes Feld kann bei unzureichender OCR-Evidenz null sein.
| Dokumenttyp | Erkannte Kategorie | Zusätzliche ScannerFields |
|---|---|---|
| Jedes Dokument | * | rawTextdocumentType |
| Rechnung | invoice | invoiceNumberissueDatedueDatedeliveryDatepaymentReferencecurrencysupplierNamesupplierAddresssupplierStreetNamesupplierStreetNumbersupplierCitysupplierCityPartsupplierPostalCodesupplierCountryCodesupplierCompanyRegistrationNumbersupplierTaxNumbersupplierVatNumbersupplierIbansupplierBiccustomerNamecustomerAddresscustomerStreetNamecustomerStreetNumbercustomerCitycustomerCityPartcustomerPostalCodecustomerCountryCodecustomerCompanyRegistrationNumbercustomerTaxNumbercustomerVatNumbercustomerIbancustomerBicdeliveryNamedeliveryAddressdeliveryStreetNamedeliveryStreetNumberdeliveryCitydeliveryCityPartdeliveryPostalCodedeliveryCountryCodenetTotalvatTotalvatBreakdowngrossTotallineItemsbankAccounts |
| Reisepass | passport | documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth |
| EU-Personalausweis, Vorderseite | euidfront | documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth |
| EU-Personalausweis, Rückseite | euidback | addressstreetNamestreetNumbercitycityPartpostalCodecountryCodemaidenNameplaceOfBirthbloodTypepersonalNumbermaritalStatusissuedBydocumentNumbernationalitynationalityNamedateOfBirthsexdateOfExpiry |
| EU-Führerschein, Vorderseite | eudriverlicensefront | dateOfBirthplaceOfBirthdateOfIssuedateOfExpiryissuedBydocumentNumberlicenseAllowedCategories |
| Zulassungsbescheinigung, Teil I, Vorderseite | eutechnicallicensefront | vinlicensePlateaddressownerdocumentNumber |
| Zulassungsbescheinigung, Teil I, Rückseite | eutechnicallicenseback | vinmanufacturervariantmodelvalidUntilvehicleCategoryengineVolumeenginePerformancefuelTypenumberOfSeatsmaximumSpeedlargestWeightKg |
| Zulassungsbescheinigung, Teil II, Vorderseite | bigtechnicallicensefront | registrationCertificatePartdocumentNumberlicensePlatedateOfFirstRegistrationvinvehicleKindvehicleCategorymanufacturermodeltypeVariantVersionvehicleManufacturertypeApprovalNumbertypeApprovalDateengineManufacturerengineTypeengineVolumeCm3catalystenginePerformanceKwengineSpeedRpmfuelTypetransmission |
| Zulassungsbescheinigung, Teil II, Rückseite | bigtechnicallicenseback | bodyTypecolorproductionNumbernumberOfSeatsnumberOfStandingPlacesnumberOfBedsroofLoadKgfuelTankVolumeLlengthMmwidthMmheightMmoperationalWeightKgmaximumWeightKgmaximumBrakedTrailerWeightKgmaximumUnbrakedTrailerWeightKgnumberOfAxleswheelbaseMmfrontTyresrearTyresfrontRimsrearRimsmaximumSpeedKphstationaryNoiseDbdriveByNoiseDbemissionStandardco2GKmfuelConsumptionL100Km |
| Aufenthaltstitel, Vorderseite | residencepermitfront | documentNumbersexnationalitynationalityNamedateOfBirthpersonalNumbertypeOfPermitdateOfExpirynotescardAccessNumber |
| Aufenthaltstitel, Rückseite | residencepermitback | documentNumbersexnationalitynationalityNamedateOfBirthdateOfExpirydateOfIssueissuedByplaceOfBirthaddresspersonalNumbercountryCode |
| Behindertenausweis | disabilitycard | dateOfBirthdateOfIssuedocumentNumberissuedByaddress |
| Vollbild oder nicht erkanntes Dokument | fullimage / other | - |
Unterstützte Dokumente
Sehen Sie, was Scanverion lesen kann.
Eindeutig ungültige KI-Muster basieren auf verlinkten öffentlichen Dokumentlayouts. API-Kategorie und getestete strukturierte Extraktion werden getrennt dargestellt.

Reisepass
Universelle ICAO-TD3-MRZ und getestetes österreichisches Drucklayout
Beispielfelder
Passport
namedocumentNumbernationalityNamedateOfBirthdateOfExpiryplaceOfBirth
Personalausweis
Getestetes österreichisches Vorder- und Rückseitenlayout
Beispielfelder
EUIdFrontEUIdBack
namedocumentNumberpersonalNumbernationalityNameaddressdateOfExpiry
Rechnung
Layoutbasierte Rechnungsextraktion
Beispielfelder
Invoice
invoiceNumbersupplierNamecustomerNamepaymentReferencelineItemsgrossTotalDie KI-Muster verwenden fiktive Daten, sichtbare VZOR/SPECIMEN-Hinweise und ungültige maschinenlesbare Werte. Es sind keine echten Kundendokumente.

Generische Dokumente
Visuelle Operationen funktionieren auch ohne bekannten Dokumenttyp.
Checkboxen, Barcodes, Unterschriften, Gesichter, Unschärfe und Drehung können auf Formularen, Verträgen und unbekannten Dokumenten analysiert werden.
Detection: Locate documents and other objects.Rotation: Measure document orientation.Blur: Evaluate image sharpness.BarcodeReading: Read QR and linear barcodes.CheckboxDetection: Evaluate checkbox regions supplied in the request.SignatureDetection: Detect a visible signature.FaceDetection: Locate visible faces.FaceExtraction: Return detected face regions.
Beispielfelder
CheckboxDetection verwendet CheckboxDefinitions aus der Anfrage. Die Vollbildverarbeitung kann auch angeforderte ScannerFields zurückgeben.
Layoutreferenz: Original Scanverion Austrian AI application form · Fictional demoLänderunterstützung
Diese österreichischen Dokumentlayouts sind verifiziert.
Reisepässe verwenden einen globalen MRZ-Standard. Die angezeigten nationalen Dokumente sind auf Kategorien beschränkt, die mit österreichischen Layouts getestet wurden.
Reisepässe
Alle Ausstellerländer mit lesbarer ICAO-TD3-MRZZusätzliche gedruckte Felder hängen vom nationalen Layout ab.
Personalausweis
Strukturierte Extraktion für die getestete österreichische Vorder- und RückseiteDas dargestellte Muster basiert auf dem Layout AUT-BO-03001.
05 / KI-Endpunkt
Fahrzeugverarbeitung
Führen Sie Erkennung oder Unschärfeprüfung für ein Fahrzeugbild aus.
Die Anfrage entspricht der Dokumentverarbeitung, aber für Fahrzeuge sind nur Detection und Blur zulässig. Nicht unterstützte Kombinationen liefern 422 Unprocessable Entity.
06 / Mehrere Dateien
Stapelverarbeitung
Verarbeiten Sie mehrere Dokumente oder Fahrzeugbilder in einer synchronen Anfrage.
Wiederholen Sie das Feld Files für jeden Upload. Dateien werden nacheinander verarbeitet, jedes Ergebnis bleibt in der Stapelantwort zuordenbar und die Nutzung wird für die gesamte Anfrage zusammengefasst.
curl --request POST "$SCANVERION_API_URL/api/v1/ai/document-processing/batches" \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "Idempotency-Key: onboarding-batch-42" \
--form "Files=@front.jpg;type=image/jpeg" \
--form "Files=@back.jpg;type=image/jpeg" \
--form "Operations=Scanner"Verzeichnis der Verarbeitungsendpunkte
| Methode | Pfad | Dateifeld | Vertrag |
|---|---|---|---|
POST | /api/v1/ai/document-processing | File | JPEG, PNG, WebP oder PDF; maximal 10 MB |
POST | /api/v1/ai/vehicle-processing | File | JPEG, PNG oder WebP; nur Detection und Blur |
POST | /api/v1/ai/document-processing/batches | Files | Mehrere Dateien; Ergebnisse bleiben nach Datei gruppiert |
POST | /api/v1/ai/vehicle-processing/batches | Files | Mehrere Fahrzeugbilder; nur Detection und Blur |
POST | /api/v1/signature-comparisons | Candidate + References | Ein Kandidat, 3 bis 5 Referenzen; bei Erfolg genau 1 Credit |
POST | /api/v1/face-comparisons | ReferenceImage / ReferenceArtifactId + CandidateImage / CandidateArtifactId | Genau ein JPEG/PNG-Bild oder Artefakt pro Seite; Bilder bis 10 MB. Policy: balanced. Idempotency-Key ist erforderlich. |
GET | /api/v1/ai/capabilities | - | Unterstützte MIME-Typen, Operationen und maximale Dateigröße |
Signaturvergleich
Vergleichen Sie eine Kandidatensignatur mit drei bis fünf bekannten Referenzen. Das Ergebnis misst die visuelle Ähnlichkeit gemäß der gewählten Richtlinie; Echtheit, Identität oder Urheberschaft werden nicht bestätigt.
Senden Sie Candidate einmal, wiederholen Sie References drei- bis fünfmal und setzen Sie Mode auf strict, balanced oder similarity. Jedes Bild muss JPEG, PNG oder WebP und höchstens 10 MB groß sein.
curl --request POST "$SCANVERION_API_URL/api/v1/signature-comparisons" \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "Idempotency-Key: signature-comparison-001" \
--form "Candidate=@candidate.png;type=image/png" \
--form "References=@reference-1.png;type=image/png" \
--form "References=@reference-2.png;type=image/png" \
--form "References=@reference-3.png;type=image/png" \
--form "Mode=balanced"Die Antwort enthält isSimilar, Modus, Distanz, Schwellenwert, Referenzanzahl, Warnungen und berechnete Credits. Eine Nichtübereinstimmung ist ein erfolgreiches Ergebnis, kein Fehler.
{
"requestId": "3be5d51e33d64c7699954e3e9f07ea54",
"isSimilar": true,
"result": "Similar",
"mode": "balanced",
"metric": "cosine-distance",
"rawDistance": 0.027,
"threshold": 0.045,
"referenceCount": 3,
"warnings": [],
"credits": 1.0
}Gesichtsvergleich
Vergleichen Sie zwei autorisierte Porträts ohne Detection oder Scanner. Verwenden Sie Uploads oder Porträtartefakte desselben Workspace.
POST /api/v1/face-comparisonsÄhnlichkeit, Entscheidung, Prüfgründe, normalisierte Gesichtsgrenzen und Landmarken. Ähnlichkeit ist keine Identitätswahrscheinlichkeit und kein Lebendigkeitsnachweis.
Gesichter müssen mindestens 80 × 80 Pixel und 2 % des Bildes umfassen. Bis zu vier geeignete Gesichter pro Seite werden verglichen; das beste Paar wird zurückgegeben. Mehrere geeignete Gesichter erfordern eine manuelle Prüfung. Kleinere Gesichter werden ignoriert.
Erfolgreiche Vergleiche verwenden den konfigurierten Credit-Preis. Prüfen Sie Richtlinie und Nutzungsantwort; Validierungs- und Anbieterfehler werden nicht berechnet. Bilder werden vorübergehend verarbeitet, nicht registriert.
curl --request POST "$SCANVERION_API_URL/api/v1/face-comparisons" \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "Idempotency-Key: face-comparison-001" \
--form "ReferenceImage=@reference.jpg;type=image/jpeg" \
--form "CandidateImage=@candidate.png;type=image/png" \
--form "Policy=balanced"{
"requestId": "face-comparison-001",
"decision": "ManualReview",
"similarity": 88.4,
"policy": "balanced",
"reviewRequired": true,
"reasons": [
"multiple_eligible_faces_best_pair"
],
"providerModel": "model-version",
"credits": 2,
"referenceFace": {
"bounds": {
"left": 0.12,
"top": 0.18,
"width": 0.4,
"height": 0.5
},
"landmarks": [
{
"type": "eyeLeft",
"x": 0.24,
"y": 0.33
}
]
},
"candidateFace": {
"bounds": {
"left": 0.2,
"top": 0.12,
"width": 0.38,
"height": 0.48
},
"landmarks": [
{
"type": "eyeLeft",
"x": 0.3,
"y": 0.27
}
]
}
}import { readFile } from "node:fs/promises";
import { randomUUID } from "node:crypto";
import { Scanverion } from "@scanverion/sdk";
const client = new Scanverion({
apiKey: process.env.SCANVERION_API_KEY ?? "",
baseUrl: "https://api.scanverion.com",
});
const result = await client.faces.compare({
reference: { image: await readFile("reference.jpg"), contentType: "image/jpeg" },
candidate: { artifactId: "workspace-portrait-id" },
idempotencyKey: randomUUID(),
});import os
from pathlib import Path
from uuid import uuid4
from scanverion import Scanverion, FaceComparisonInput
client = Scanverion(api_key=os.environ["SCANVERION_API_KEY"],
base_url="https://api.scanverion.com")
result = client.faces.compare(
FaceComparisonInput(image=Path("reference.jpg")),
FaceComparisonInput(artifact_id="workspace-portrait-id"),
idempotency_key=str(uuid4()),
)using Scanverion;
using var client = new ScanverionClient(
Environment.GetEnvironmentVariable("SCANVERION_API_KEY")!,
baseUri: new Uri("https://api.scanverion.com"));
await using var reference = File.OpenRead("reference.jpg");
var result = await client.Faces.CompareAsync(
new FaceComparisonInput(reference, "reference.jpg", "image/jpeg"),
new FaceComparisonInput(ArtifactId: "workspace-portrait-id"),
Guid.NewGuid().ToString());scanverion face compare reference.jpg candidate.png --idempotency-key face-comparison-001 --output json{
"reference": { "imageBase64": "<JPEG base64>", "fileName": "reference.jpg", "contentType": "image/jpeg" },
"candidate": { "imageBase64": "<PNG base64>", "fileName": "candidate.png", "contentType": "image/png" },
"policy": "balanced",
"idempotencyKey": "face-comparison-001"
}Gesichtsvorlagen und Datenbanksuche
Integrieren Sie signierte Gesichtsvorlagen, speichern Sie einen Vektor pro Person und durchsuchen Sie Ihre eigene Datenbank mit pgvector.
1. Eine wiederverwendbare Vorlage erstellen
Senden Sie ein bis acht autorisierte JPEG/PNG-Fotos derselben Person als wiederholte Images-Teile. Pro Datei sind 10 MiB, insgesamt 40 MiB erlaubt. Der Server prüft die Konsistenz und kombiniert ausgewählte geeignete Ansichten zu einem normalisierten 128-dimensionalen Vektor. Verwenden Sie für jeden neuen Vorgang einen neuen Idempotenzschlüssel und für denselben Versuch denselben Schlüssel.
export SCANVERION_TEMPLATE_URL="https://api.scanverion.com/api/v1/identity-templates"
curl --request POST "$SCANVERION_TEMPLATE_URL/workspace" \
--header "Authorization: Bearer $SCANVERION_WORKSPACE_TOKEN" \
--header "Idempotency-Key: template-enroll-person-001" \
--form "ProcessingAuthorized=true" \
--form "Images=@portrait.jpg;type=image/jpeg"Die Antwort enthält templateToken, expiresAt und searchIndex. Der Vektor ist Base64-codiertes Little-Endian-Float32, kein direkt zu vergleichender Text. Bewahren Sie den vollständigen signierten Token, den Vektor und die zurückgegebenen Versionen zusammen auf. Platzhalter im Beispiel sind keine verwendbaren biometrischen Daten.
{
"templateToken": "<signed template token>",
"expiresAt": "<ISO 8601 expiry>",
"searchIndex": {
"formatVersion": "identity-template-search-v2",
"compatibilityVersion": "<returned representation version>",
"dimensions": 128,
"encoding": "float32-le-base64",
"metric": "cosine",
"aggregationVersion": "normalized-weighted-centroid-cosine-v1",
"selectionVersion": "<returned selection version>",
"vector": "<Base64 float32 vector>"
}
}2. Einen Vektor pro Person speichern
Decodieren Sie searchIndex.vector im Backend, prüfen Sie Format und Versionen und speichern Sie ihn atomar mit Ihrer Personen-ID, dem Token und Ablaufdatum. Das Beispiel für Ihre eigene PostgreSQL-Datenbank nutzt pgvector und HNSW und ist keine Anwendungsmigration. Autorisieren Sie den Workspace separat; Abfragefilter ersetzen keine Zugriffskontrolle.
function decodeSearchVector(index: {
formatVersion: string; dimensions: number; encoding: string;
metric: string; aggregationVersion: string; vector: string;
}): number[] {
if (index.formatVersion !== "identity-template-search-v2" ||
index.dimensions !== 128 || index.encoding !== "float32-le-base64" ||
index.metric !== "cosine" ||
index.aggregationVersion !== "normalized-weighted-centroid-cosine-v1")
throw new Error("Unsupported search index");
if (index.vector.length !== 684) throw new Error("Invalid vector size");
const bytes = Buffer.from(index.vector, "base64");
try {
if (bytes.length !== 512 || bytes.toString("base64") !== index.vector)
throw new Error("Invalid vector encoding");
const vector: number[] = [];
for (let position = 0; position < 128; position++)
vector.push(bytes.readFloatLE(position * 4));
const norm = vector.reduce((sum, value) => sum + value * value, 0);
if (!vector.every(Number.isFinite) || Math.abs(norm - 1) > 0.001)
throw new Error("Invalid normalized vector");
return vector;
} finally { bytes.fill(0); }
}CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE person_face_template (
workspace_id uuid NOT NULL,
person_id uuid NOT NULL,
template_token text NOT NULL,
expires_at timestamptz NOT NULL,
compatibility_version text NOT NULL,
selection_version text NOT NULL,
aggregation_version text NOT NULL,
face_vector vector(128) NOT NULL,
PRIMARY KEY (workspace_id, person_id)
);
CREATE INDEX person_face_template_cosine
ON person_face_template USING hnsw (face_vector vector_cosine_ops);3. Mit einem neuen Porträt suchen
Erstellen Sie über denselben Endpunkt mit einem neuen autorisierten Foto und neuem Idempotenzschlüssel eine Suchvorlage. Binden Sie die Parameter: $1 Suchvektor, $2 autorisierte Workspace-UUID, $3 compatibilityVersion, $4 selectionVersion, $5 aggregationVersion. Ein pgvector-fähiger Treiber kann das decodierte Array binden. Eine Verarbeitung reicht für die gesamte Suche ohne API-Aufruf pro Person. Fügen Sie Benutzereingaben niemals direkt in SQL ein.
SELECT person_id, 1 - (face_vector <=> $1::vector) AS similarity
FROM person_face_template
WHERE workspace_id = $2::uuid
AND compatibility_version = $3
AND selection_version = $4
AND aggregation_version = $5
AND expires_at > now()
ORDER BY face_vector <=> $1::vector
LIMIT 10;4. Ein ausgewähltes Paar optional prüfen
Senden Sie den gespeicherten Token als ReferenceTemplate und den Suchtoken als CandidateTemplate. Statt CandidateTemplate ist ein CandidateImage-Teil als JPEG/PNG möglich. Die API prüft Signatur, Geltungsbereich, Ablauf und Kompatibilität. Beide Vorlagen müssen demselben Workspace angehören. Die Antwort enthält similarity, metric, reviewRequired, referenceViews und candidateViews. Dieser separate geschützte Vergleich ist für die Datenbank-Kosinussuche optional.
curl --request POST "$SCANVERION_TEMPLATE_URL/workspace/comparisons" \
--header "Authorization: Bearer $SCANVERION_WORKSPACE_TOKEN" \
--header "Idempotency-Key: template-compare-001" \
--form "ProcessingAuthorized=true" \
--form-string "ReferenceTemplate=$REFERENCE_TEMPLATE_TOKEN" \
--form-string "CandidateTemplate=$PROBE_TEMPLATE_TOKEN"5. Ergebnisse und Lebenszyklus sicher behandeln
Die Nachbarsuche liefert Kandidaten auch ohne echte Übereinstimmung. Legen Sie anhand repräsentativer Daten eine geprüfte Nichttreffergrenze und menschliche Prüfung fest; Ähnlichkeit ist keine Wahrscheinlichkeit, Identitätsprüfung oder Lebendigkeitsbestätigung. Die approximative HNSW-Suche ist nicht vollständig und Filter können Trefferzahlen reduzieren. Trennen Sie Workspaces sowie Repräsentations-, Aggregations- und Auswahlversionen. Zehn Kalenderjahre Signaturgültigkeit erfordern aufbewahrte Prüfschlüssel und kompatible Verarbeitung, keine garantierte künftige Genauigkeit. Schützen Sie Vorlagen als biometrische Daten, protokollieren Sie sie nicht und löschen Sie Token und Vektor nach Ende der Einwilligung oder Aufbewahrung. Signatur und Base64 sind keine Verschlüsselung. Nicht vertrauenswürdige Importe erfordern Signaturprüfung mit vertrauenswürdigen Schlüsseln und exakte Projektionsübereinstimmung.
Behandeln Sie Fehler gezielt: 400 ungültige Eingabe; 401/403 Anmeldung, Berechtigung oder Einwilligung; 402 Credits; 404 nicht verfügbare Development-Route; 409 doppelter Idempotenzschlüssel; 422 ungültige oder inkompatible Vorlage, unbrauchbares Gesicht oder inkonsistente Fotos; 429 Limits; 503 Verarbeitung oder Abrechnung nicht verfügbar. Beachten Sie Retry-After und senden Sie Fotos nicht automatisch erneut. Anonyme Anfragen verwenden die Route ohne /workspace mit BotVerificationToken und getrenntem Vorlagenbereich. Richtlinie und Antwortheader nennen Limits und berechnete Credits.
Lebenderkennung
Eine kurze Kamerasitzung prüft auf Präsentationsangriffe. Der Gesichtsvergleich bleibt eine separate Bewertung.
- 1Backend-Sitzung erstellen
Autorisierung einholen und eine kurzlebige Sitzung erstellen.
- 2Aufnahme mit React
Die zurückgegebene Sitzung an die Scanverion-Komponente übergeben.
- 3Bewertung abrufen
Die Bewertung erst nach dem Abschluss-Callback abrufen.
Installation
React-Aufnahme 0.1.0 ist auf npm verfügbar. Verwenden Sie für die Liveness-Methoden das Backend-SDK 0.1.1 oder neuer.
npm install react react-dom
npm install @scanverion/sdk@0.1.1 @scanverion/liveness-react@0.1.0Backend-Sitzung erstellen
Dies sind vertrauenswürdige Server-Hilfsfunktionen, keine öffentlichen HTTP-Handler. Ihre Anwendung muss Teilnehmer authentifizieren, die Verarbeitungsberechtigung prüfen, Sitzungen an Eigentümer binden und CSRF-geschützte Routen anbieten. Bei einer Backend-Vermittlung bleiben Tokens auf dem Server. Übergeben Sie Sitzung und Ergebnis-Ladefunktion an den React-Schritt.
Backend-SDKs: @scanverion/sdk für Node.js (npm, JavaScript/TypeScript), scanverion für Python (synchron und asynchron) und Scanverion.Sdk für .NET (NuGet). Verwenden Sie einen Build mit Liveness-Methoden. Ein Java-SDK/Maven-Paket ist derzeit nicht verfügbar; Java-Backends können die REST-API unter Weitere Clients nutzen.
import { randomUUID } from "node:crypto";
import { Scanverion } from "@scanverion/sdk";
const client = new Scanverion({
apiKey: process.env.SCANVERION_API_KEY ?? "",
baseUrl: "https://api.scanverion.com",
});
export async function createAuthorizedCapture() {
return client.liveness.createSession({
processingAuthorized: true,
idempotencyKey: randomUUID(),
});
}
export async function readOwnedAssessment(sessionId: string, accessToken: string) {
return client.liveness.getResult({ sessionId, accessToken });
}import os
from uuid import uuid4
from scanverion import Scanverion
client = Scanverion(api_key=os.environ["SCANVERION_API_KEY"],
base_url="https://api.scanverion.com")
def create_authorized_capture():
return client.liveness.create_session(
processing_authorized=True, idempotency_key=str(uuid4()))
def read_owned_assessment(session_id, access_token):
return client.liveness.get_result(
session_id=session_id, access_token=access_token)import os
from uuid import uuid4
from scanverion import AsyncScanverion
def liveness_client():
return AsyncScanverion(api_key=os.environ["SCANVERION_API_KEY"],
base_url="https://api.scanverion.com")
async def create_authorized_capture():
async with liveness_client() as client:
return await client.liveness.create_session(
processing_authorized=True, idempotency_key=str(uuid4()))
async def read_owned_assessment(session_id, access_token):
async with liveness_client() as client:
return await client.liveness.get_result(
session_id=session_id, access_token=access_token)using Scanverion;
using var client = new ScanverionClient(
Environment.GetEnvironmentVariable("SCANVERION_API_KEY")!,
baseUri: new Uri("https://api.scanverion.com"));
Task<FaceLivenessSession?> CreateAuthorizedCapture() =>
client.Liveness.CreateSessionAsync(true, Guid.NewGuid().ToString());
Task<FaceLivenessResult?> ReadOwnedAssessment(string sessionId, string accessToken) =>
client.Liveness.GetResultAsync(sessionId, accessToken);Aufnahme mit React
"use client";
import { useEffect, useState } from "react";
import { LivenessCapture, type LivenessCaptureSession } from "@scanverion/liveness-react";
import type { FaceLivenessResult } from "@scanverion/sdk";
import "@scanverion/liveness-react/styles.css";
export function CameraStep({ session, loadAssessment, onResult, onClose }: {
session: LivenessCaptureSession & { expiresAt: string };
loadAssessment: () => Promise<FaceLivenessResult>;
onResult: (result: FaceLivenessResult) => void;
onClose: () => void;
}) {
const [active, setActive] = useState(() => Date.parse(session.expiresAt) > Date.now());
const [error, setError] = useState<string | null>(null);
useEffect(() => {
if (!active) return;
const timer = setTimeout(() => {
setActive(false);
onClose();
}, Math.max(0, Date.parse(session.expiresAt) - Date.now()));
return () => clearTimeout(timer);
}, [active, session.expiresAt, onClose]);
if (error) return <p role="alert">{error}</p>;
if (!active) return null;
return <LivenessCapture session={session}
onComplete={async () => {
setActive(false);
try { onResult(await loadAssessment()); }
catch { setError("Check the existing assessment; do not create another capture."); }
}}
onCancel={() => { setActive(false); onClose(); }}
onError={() => { setActive(false); setError("Capture could not be completed."); }}
/>;
}Bewertung abrufen
Ein hoher Wert ist keine Identitätswahrscheinlichkeit. Beachten Sie decision und reviewRequired. Im Prüfmodus wird auch bei hohen Werten review zurückgegeben. Erfolgreich abgeschlossene Workspace-Bewertungen verwenden den konfigurierten Preis (6 Credits); anonyme Tests belasten keine Workspace-Credits. Fehlgeschlagene und uneindeutige Bewertungen sind keine abgeschlossenen abrechenbaren Bewertungen.
{
"sessionId": "00000000-0000-4000-8000-000000000001",
"status": "succeeded",
"decision": "live",
"confidence": 99.6,
"reviewRequired": false,
"expiresAt": "2026-10-16T12:10:00Z",
"credits": 6
}- status
created / in_progress / succeeded / failed / expired / inconclusive- decision
live / not_live / review / inconclusive- confidence
- Liveness-Wert des Anbieters: 0–100
- reviewRequired
- Lebenderkennung ist keine Identitätsprüfung. Unklare Ergebnisse erfordern eine Prüfung.
- credits
- Credits pro abgeschlossener Bewertung
Die Aufnahmefrist beträgt drei Minuten; die Ergebnisaufbewahrung ist separat und begrenzt. Bei Fehler, Abbruch oder Ablauf die Aufnahme entfernen. created/in_progress ausdrücklich für dieselbe Sitzung in Abständen von mindestens zwei Sekunden prüfen. Nach ungewissen Anfragen keine neue Sitzung automatisch erstellen.
Weitere Clients
curl --request POST 'https://api.scanverion.com/api/v1/face-liveness/sessions' \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $(uuidgen)" \
--data '{"processingAuthorized":true}'
# After camera completion, using values retained by your backend:
curl "https://api.scanverion.com/api/v1/face-liveness/sessions/$SESSION_ID" \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "X-Liveness-Access-Token: $LIVENESS_ACCESS_TOKEN"{
"create": {
"name": "create_liveness_session",
"arguments": {
"processingAuthorized": true,
"idempotencyKey": "unique-per-intentional-capture"
}
},
"afterCapture": {
"name": "get_liveness_result",
"arguments": {
"sessionId": "00000000-0000-4000-8000-000000000001"
}
}
}MCP erfordert faces:liveness-Zustimmung und kann keine Webcam bedienen. Der Website-Test ist eine eigene Sitzung, nicht der Abschluss einer beliebigen MCP-Sitzung.
Verfügbarkeit und Sicherheit
Scanverion speichert weder Kamerastreams noch zurückgegebene Referenzbilder.
Die Aufnahme kann blinkende Farben verwenden. Fahren Sie bei Lichtempfindlichkeit nicht fort.
Lebenderkennung ist keine Identitätsprüfung. Unklare Ergebnisse erfordern eine Prüfung.
07 / Funktionen
Operationen und Abhängigkeiten
Wählen Sie unterstützte Operationen und verstehen Sie automatisch ergänzte Abhängigkeiten.
| Operation | Zweck | Abhängigkeit oder Einschränkung |
|---|---|---|
| Detection | Findet und klassifiziert Dokument- oder Fahrzeugobjekte. | Wird bei den meisten Dokumentabläufen automatisch ergänzt. |
| Scanner | Extrahiert typisierte Felder aus unterstützten Dokumenten. | Wird von LostOrStolenCardCheck benötigt. |
| Rotation | Meldet die Dokumentausrichtung. | Wird von FaceExtraction ergänzt. |
| Blur | Bewertet die Unschärfe eines Bildes. | Für Dokumente und Fahrzeuge unterstützt. |
| FaceDetection | Findet Gesichter in einem erkannten Dokument. | Wird von FaceExtraction ergänzt. |
| FaceExtraction | Gibt extrahierte Gesichtsdaten oder Bilder zurück. | Ergänzt FaceDetection und Rotation. |
| BarcodeReading | Liest unterstützte ein- und zweidimensionale Codes. | Nur für Dokumentverarbeitung. |
| CheckboxDetection | Bewertet konfigurierte Kontrollkästchenbereiche. | CheckboxDefinitions muss gültiges JSON sein. |
| SignatureDetection | Findet Signaturen in einem Dokument. | Nur Dokumenterkennung; der visuelle Vergleich verwendet einen eigenen Endpunkt. |
08 / Schema
Antwortmodell
Lesen Sie Objektergebnisse, Operationsstatus, Laufzeit und berechnete Credits.
objects erhält die Beziehung zwischen jedem erkannten Objekt und seinen Operationsergebnissen. operations meldet angeforderte und automatisch ergänzte Arbeit. usage ist die maßgebliche Abrechnung dieser Antwort.
{
"requestId": "7f6a7b7f0ad74729a4c4d13fa7dc6dd4",
"model": "Document",
"processingTimeMs": 412,
"objects": [{
"objectId": "document-1",
"category": "Invoice",
"confidence": 1,
"bounds": { "left": 0, "top": 0, "right": 1, "bottom": 1 },
"results": {
"scanner": {
"fields": {
"invoiceNumber": "2026-0007",
"issueDate": "2026-08-07",
"dueDate": "2026-08-21",
"paymentReference": "26000006",
"supplierIban": "SK5511000000002628210731",
"customerIban": null,
"supplierName": "Scanverion s. r. o.",
"supplierAddress": "Pribinova 10, 811 09 Bratislava",
"supplierStreetName": "Pribinova",
"supplierStreetNumber": "10",
"supplierPostalCode": "81109",
"supplierCity": "Bratislava",
"supplierVatNumber": "SK2120720041",
"customerName": "Example Customer s. r. o.",
"customerAddress": "Main Street 12, 040 01 Kosice",
"customerVatNumber": "SK2020123456",
"netTotal": "19.29",
"vatTotal": "4.44",
"vatBreakdown": "[{"rate":"23","amount":"4.44"}]",
"lineItems": "[{"description":"Monthly subscription","quantity":"1","unit":"pcs","unitPrice":"19.29","netAmount":"19.29","vatRate":"23","vatAmount":"4.44","grossAmount":"23.73"}]",
"grossTotal": "23.73",
"currency": "EUR"
},
"issuingCountry": null,
"detectedLanguages": [{ "code": "sk", "confidence": 0.97 }]
},
"rotation": { "degrees": 0 }
},
"pageNumber": 1
}],
"operations": [
{ "operation": "Detection", "status": "Completed", "message": null },
{ "operation": "Scanner", "status": "Completed", "message": null },
{ "operation": "Rotation", "status": "Completed", "message": null }
],
"usage": {
"units": 3,
"unitsByOperation": { "Detection": 1, "Scanner": 1, "Rotation": 1 }
}
}09 / Eigene Ressourcen
Validierungsressourcen
Nutzen Sie eigene Endpunkte für verlorene Ausweise und Postleitzahlen.
| Methode | Pfad | Eingabe |
|---|---|---|
POST | /api/v1/validation/id-cards/lost-or-stolen | JSON-Body: cardNumber und cardType |
GET | /api/v1/validation/postal-codes | Query: address und optional countryCode=SK oder SVK |
curl --request POST "$SCANVERION_API_URL/api/v1/validation/id-cards/lost-or-stolen" \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "Content-Type: application/json" \
--data '{ "cardNumber": "AA123456", "cardType": "nationalId" }'10 / Abrechnung
Nutzung und Credits
Fragen Sie Aufrufe, gewichtete Credits sowie Tages- und Funktionssummen ab.
Credits werden mit dem konfigurierten Produktmultiplikator gewichtet; Aufrufe und Credits sind daher getrennte Kennzahlen. Nutzungsendpunkte akzeptieren inklusive from- und to-Daten; standardmäßig läuft der Zeitraum vom ersten Tag des aktuellen Kalendermonats bis heute.
| Methode | Pfad | Rückgabe |
|---|---|---|
GET | /api/v1/usage/summary | Aufrufe und gewichtete Credits für den Zeitraum |
GET | /api/v1/usage/daily | Tägliche Aufruf- und Creditsummen |
GET | /api/v1/usage/by-capability | Nach abgerechneter Funktion gruppierte Summen |
GET | /api/v1/usage/price-preview | Vorschau für enthaltene, überschüssige und gesamte Preise in EUR |
11 / Wiederherstellung
Fehler und Wiederholungsstrategie
Behandeln Sie Authentifizierungs-, Berechtigungs-, Validierungs-, Duplikat- und Anbieterfehler.
| Status | Bedeutung | Aktion des Clients |
|---|---|---|
401 Unauthorized | Der Schlüssel fehlt, ist fehlerhaft, inaktiv, abgelaufen, widerrufen oder keinem Workspace zugeordnet. | Erst nach der Korrektur der Zugangsdaten wiederholen. |
402 Payment Required | Die Workspace-Berechtigung oder das Verarbeitungslimit ist erschöpft. | Tarif oder Überverbrauchseinstellungen ändern. |
409 Conflict | Der Idempotency-Key hat diese Verarbeitungsanfrage bereits reserviert. | Als denselben Versuch behandeln und nicht blind einen neuen Schlüssel erzeugen. |
422 Unprocessable Entity | Datei, Operationskombination, Felder, Datumsbereich oder Validierungseingabe sind ungültig. | Anfrage vor dem Wiederholen korrigieren. |
502 Bad Gateway | Ein KI- oder Validierungsanbieter ist fehlgeschlagen oder lieferte ein uneindeutiges Ergebnis. | Bei sicher wiederholbaren Operationen mit Abstand erneut versuchen. |
503 Service Unavailable | Ein erforderlicher Verarbeitungsanbieter ist vorübergehend nicht verfügbar. | Mit begrenztem exponentiellem Backoff wiederholen. |
Protokollieren Sie requestId, HTTP-Status und Idempotency-Key der Antwort. Verwenden Sie zufälliges, begrenztes exponentielles Warten nur bei vorübergehenden Fehlern; Validierungs- und Zugangsdatenfehler erfordern eine geänderte Anfrage.
12 / Generierter Vertrag
OpenAPI-Referenz
Öffnen Sie den Scalar-Explorer oder laden Sie den maschinenlesbaren Vertrag herunter.
Scanverion API-Referenz
Der laufende Vertrag ist die Quelle der Wahrheit für Schemas, Enumwerte, Authentifizierungsanforderungen und deklarierte HTTP-Ergebnisse.
MCP-Integration
Gehostete OAuth-Verbindungen, Clientregistrierung, Berechtigungen und lokales stdio für VS Code und Claude Desktop.
Gehostetes HTTP
OAuth 2.0Gehostetes OAuth ist aktiviert. Verbindungen benötigen einen aktiven, vorregistrierten Client; die URL allein registriert keine Anwendung. HTTP-Zugriff mit API-Schlüssel bleibt über X-Scanverion-Api-Key verfügbar.
https://mcp.scanverion.com/mcp
- Transport
- Streamable HTTP / HTTPS
- Authentifizierung
- OAuth 2.0 Authorization Code + S256 PKCE
- Eingaben
- Nur Base64; keine lokalen Dateipfade
- Maximale dekodierte Eingabe
- 10 MiB · JPEG, PNG, WebP, PDF
Dokument- und Fahrzeugverarbeitung verbrauchen Credits. Unterschriftenvergleich kostet genau 1 Credit. Katalog und Nutzung sind unberechnet.
VS-Code-OAuth-Konfiguration
Eine öffentliche native Anwendung mit der Callback-Basis http://127.0.0.1/ erstellen und aktivieren. VS Code ergänzt automatisch den temporären Port. Danach die Client-ID eingeben, den Server in VS Code starten und Anmeldung sowie Zustimmung im Browser bestätigen. Kein API-Schlüssel oder Client-Geheimnis erforderlich.
{
"servers": {
"scanverion": {
"type": "http",
"url": "https://mcp.scanverion.com/mcp",
"oauth": {
"clientId": ""
}
}
}
}Berechtigungen: capabilities:read für den Katalog, usage:read für Nutzung, documents:analyze oder vehicles:analyze für Verarbeitung, signatures:compare für Unterschriften und offline_access für Erneuerung. Der Client muss sie anfordern und der Benutzer zustimmen. Zugriffstoken gelten 10 Minuten; Refresh-Token rotieren. Zugriff bei der Anwendung widerrufen oder im Profil alle MCP-Verbindungen trennen. Token niemals im Chat eingeben.
Verfügbare Werkzeuge
analyze_document- Kostenpflichtig. Standardmäßig nur Detection; fordern Sie Scanner für OCR und Feldextraktion ausdrücklich an.
analyze_vehicle- Kostenpflichtig. Unterstützt Detection und Blur.
compare_signatures- Kostenpflichtig mit genau 1 Credit. Vergleicht eine Unterschrift mit 3 bis 5 Referenzen; Ähnlichkeit beweist weder Identität noch Echtheit.
compare_faces- Vergleichen Sie zwei autorisierte Porträts ohne Detection oder Scanner. Verwenden Sie Uploads oder Porträtartefakte desselben Workspace.
list_capabilities- Katalog der KI-Modelle und Limits ohne Verarbeitungsgebühr; keine Berechtigungsprüfung.
list_api_capabilities- Öffentlicher API-Katalog ohne Verarbeitungsgebühr; prüft keinen kontospezifischen Zugriff.
get_usage_summary- Aufrufe und Credits ohne Verarbeitungsgebühr für inklusive YYYY-MM-DD-Daten. Die Kostenschätzung ist nicht verfügbar, nicht null Euro.
faces:compare: Erfolgreiche Vergleiche verwenden den konfigurierten Credit-Preis. Prüfen Sie Richtlinie und Nutzungsantwort; Validierungs- und Anbieterfehler werden nicht berechnet. Bilder werden vorübergehend verarbeitet, nicht registriert.
create_liveness_session / get_liveness_result · faces:liveness: Eine kurze Kamerasitzung prüft auf Präsentationsangriffe. Der Gesichtsvergleich bleibt eine separate Bewertung. Lebenderkennung ist keine Identitätsprüfung. Unklare Ergebnisse erfordern eine Prüfung.
create_identity_template- Der vollständige Token und sein Inhalt sind sensible biometrische Daten. Kopieren oder teilen Sie diese nur mit autorisierten Systemen. 1–8 JPEG/PNG-Fotos · je 10 MiB · insgesamt 40 MiB 2 Credits pro abgeschlossener Anfrage ·
processingAuthorized: true·templates:create compare_identity_templates- Ähnlichkeit erfordert eine Prüfung. Sie bestätigt weder Identität noch Lebendigkeit. 2 Credits pro abgeschlossener Anfrage ·
processingAuthorized: true·templates:compare
OAuth-Anwendungen
Inhaber und Administratoren registrieren und aktivieren Clients und Berechtigungen mit aktueller MFA. API-Schlüssel benötigen keine OAuth-Registrierung. Dynamische Registrierung wird nicht unterstützt.
OAuth-Anwendungen