Zum Inhalt springen

Scanverion für Entwickler

Vollständiger Integrationsleitfaden

Anfrageverträge, SDK-Beispiele und Integrationsleitfäden für Dokumentextraktion, Gesichts- und Signaturvergleich, Kamera-Liveness und wiederverwendbare Gesichtsvorlagen.

Aktiver API-VertragOpenAPI 3.1.1 / v1

Aus der laufenden .NET API und ihren typisierten Anfrage- und Antwortmodellen generiert.

OpenAPI-JSON herunterladen

01 / Start

Schnellstart

Erstellen Sie einen Schlüssel, setzen Sie zwei Umgebungsvariablen und senden Sie die erste Anfrage.

  1. Erstellen Sie einen Workspace und wählen Sie einen Tarif.
  2. Erstellen Sie einen API-Schlüssel mit dem kleinsten benötigten Verarbeitungsumfang. Kopieren Sie das Geheimnis sofort; es wird später nicht erneut angezeigt.
  3. Setzen Sie SCANVERION_API_URL und SCANVERION_API_KEY ausschließlich in Ihrer Serverumgebung.
  4. Senden Sie eine Multipart-Anfrage und speichern Sie die zurückgegebene requestId mit Ihrer eigenen Trace-ID.
Anfragebash
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.

Serverseitige Zugangsdaten. Senden Sie Authorization: Bearer skv_.... Hinterlegen Sie einen Schlüssel niemals in Browser-JavaScript, einer mobilen App, Analysen oder Protokollen.
PrüfungDer Schlüssel muss aktiv, gültig, nicht widerrufen und einem Workspace zugeordnet sein.
BerechtigungenDer Zugriff wird anhand der beim Schlüssel gespeicherten Berechtigungsbereiche geprüft.
GeheimnisübergabeDas vollständige Geheimnis wird nur beim Erstellen oder Rotieren eines Schlüssels zurückgegeben.
AuditspurEine erfolgreiche Nutzung aktualisiert die letzte Verwendung und erzeugt ein Audit-Ereignis.
Öffentliche Client-Pakete: TypeScript SDK · Python SDK · .NET SDK · CLI · MCP server

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.

Einschränkung: Die Eingabe muss image/jpeg, image/png, image/webp oder application/pdf sein und darf höchstens 10 MB groß sein.

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.

DokumenttypErkannte KategorieZusätzliche ScannerFields
Jedes Dokument*
rawTextdocumentType
Rechnunginvoice
invoiceNumberissueDatedueDatedeliveryDatepaymentReferencecurrencysupplierNamesupplierAddresssupplierStreetNamesupplierStreetNumbersupplierCitysupplierCityPartsupplierPostalCodesupplierCountryCodesupplierCompanyRegistrationNumbersupplierTaxNumbersupplierVatNumbersupplierIbansupplierBiccustomerNamecustomerAddresscustomerStreetNamecustomerStreetNumbercustomerCitycustomerCityPartcustomerPostalCodecustomerCountryCodecustomerCompanyRegistrationNumbercustomerTaxNumbercustomerVatNumbercustomerIbancustomerBicdeliveryNamedeliveryAddressdeliveryStreetNamedeliveryStreetNumberdeliveryCitydeliveryCityPartdeliveryPostalCodedeliveryCountryCodenetTotalvatTotalvatBreakdowngrossTotallineItemsbankAccounts
Reisepasspassport
documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth
EU-Personalausweis, Vorderseiteeuidfront
documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth
EU-Personalausweis, Rückseiteeuidback
addressstreetNamestreetNumbercitycityPartpostalCodecountryCodemaidenNameplaceOfBirthbloodTypepersonalNumbermaritalStatusissuedBydocumentNumbernationalitynationalityNamedateOfBirthsexdateOfExpiry
EU-Führerschein, Vorderseiteeudriverlicensefront
dateOfBirthplaceOfBirthdateOfIssuedateOfExpiryissuedBydocumentNumberlicenseAllowedCategories
Zulassungsbescheinigung, Teil I, Vorderseiteeutechnicallicensefront
vinlicensePlateaddressownerdocumentNumber
Zulassungsbescheinigung, Teil I, Rückseiteeutechnicallicenseback
vinmanufacturervariantmodelvalidUntilvehicleCategoryengineVolumeenginePerformancefuelTypenumberOfSeatsmaximumSpeedlargestWeightKg
Zulassungsbescheinigung, Teil II, Vorderseitebigtechnicallicensefront
registrationCertificatePartdocumentNumberlicensePlatedateOfFirstRegistrationvinvehicleKindvehicleCategorymanufacturermodeltypeVariantVersionvehicleManufacturertypeApprovalNumbertypeApprovalDateengineManufacturerengineTypeengineVolumeCm3catalystenginePerformanceKwengineSpeedRpmfuelTypetransmission
Zulassungsbescheinigung, Teil II, Rückseitebigtechnicallicenseback
bodyTypecolorproductionNumbernumberOfSeatsnumberOfStandingPlacesnumberOfBedsroofLoadKgfuelTankVolumeLlengthMmwidthMmheightMmoperationalWeightKgmaximumWeightKgmaximumBrakedTrailerWeightKgmaximumUnbrakedTrailerWeightKgnumberOfAxleswheelbaseMmfrontTyresrearTyresfrontRimsrearRimsmaximumSpeedKphstationaryNoiseDbdriveByNoiseDbemissionStandardco2GKmfuelConsumptionL100Km
Aufenthaltstitel, Vorderseiteresidencepermitfront
documentNumbersexnationalitynationalityNamedateOfBirthpersonalNumbertypeOfPermitdateOfExpirynotescardAccessNumber
Aufenthaltstitel, Rückseiteresidencepermitback
documentNumbersexnationalitynationalityNamedateOfBirthdateOfExpirydateOfIssueissuedByplaceOfBirthaddresspersonalNumbercountryCode
Behindertenausweisdisabilitycard
dateOfBirthdateOfIssuedocumentNumberissuedByaddress
Vollbild oder nicht erkanntes Dokumentfullimage / other
-
Strukturierte Rechnungsfelder bleiben als JSON-Arrays mit dem String-Wörterbuch kompatibel: vatBreakdown, lineItems einschließlich grossAmount und rollenbezogene bankAccounts. Das bisherige Feld iban ist ein veralteter Alias für supplierIban. Personennamen werden in scanner.fields.name mit Vor-, Mittel- und Nachnamen, Titeln sowie Varianten in Original- und lateinischer Schrift zurückgegeben.

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.

Fiktive österreichische Geschäftsrechnung

Rechnung

Layoutbasiert

Layoutbasierte Rechnungsextraktion

Beispielfelder
API-Kategorie

Invoice

Beispielfelder
invoiceNumbersupplierNamecustomerNamepaymentReferencelineItemsgrossTotal
Layoutreferenz: Original Scanverion Austrian AI invoice specimen · Fictional demo

Die KI-Muster verwenden fiktive Daten, sichtbare VZOR/SPECIMEN-Hinweise und ungültige maschinenlesbare Werte. Es sind keine echten Kundendokumente.

Fiktiver österreichischer Antrag mit Checkboxen, Unterschrift und Mustercodes

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 demo

Lä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.

01

Reisepässe

Alle Ausstellerländer mit lesbarer ICAO-TD3-MRZ
Getestetes Drucklayout
AT

Zusätzliche gedruckte Felder hängen vom nationalen Layout ab.

02

Personalausweis

Strukturierte Extraktion für die getestete österreichische Vorder- und Rückseite
Getestetes Land
AT

Das 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.

Anfragebash
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

MethodePfadDateifeldVertrag
POST/api/v1/ai/document-processingFileJPEG, PNG, WebP oder PDF; maximal 10 MB
POST/api/v1/ai/vehicle-processingFileJPEG, PNG oder WebP; nur Detection und Blur
POST/api/v1/ai/document-processing/batchesFilesMehrere Dateien; Ergebnisse bleiben nach Datei gruppiert
POST/api/v1/ai/vehicle-processing/batchesFilesMehrere Fahrzeugbilder; nur Detection und Blur
POST/api/v1/signature-comparisonsCandidate + ReferencesEin Kandidat, 3 bis 5 Referenzen; bei Erfolg genau 1 Credit
POST/api/v1/face-comparisonsReferenceImage / ReferenceArtifactId + CandidateImage / CandidateArtifactIdGenau 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.

Einschränkung: Verwenden Sie mit API-Schlüssel POST /api/v1/signature-comparisons oder aus einer authentifizierten Dashboard-Sitzung POST /api/v1/signature-comparisons/previews. Beide benötigen einen Idempotency-Key.
Festpreis. Jeder erfolgreich abgeschlossene Vergleich verbraucht genau 1 Credit, unabhängig von Modus oder Referenzanzahl. Validierungs- und Anbieterfehler werden nicht berechnet.
Temporäre Verarbeitung. Quellbilder und Embeddings werden weder registriert noch gespeichert. Senden Sie nur Signaturen, die Sie verarbeiten dürfen.
Anfragebash
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.

Antwortjson
{
  "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
Einschränkung: Genau ein JPEG/PNG-Bild oder Artefakt pro Seite; Bilder bis 10 MB. Policy: balanced. Idempotency-Key ist erforderlich.

Ä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.

Anfragebash
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"
Antwortjson
{
  "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
      }
    ]
  }
}
TypeScript · trusted backendtypescript
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(),
});
Python · trusted backendpython
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()),
)
.NET · trusted backendcsharp
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());
CLIbash
scanverion face compare reference.jpg candidate.png --idempotency-key face-comparison-001 --output json
MCP: compare_facesjson
{
  "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.

Workspace-Anfragen erfordern eine Anmeldung, eine Verarbeitungsberechtigung und ausreichendes Guthaben. Die Verfügbarkeit zeigt /api/v1/identity-templates/policy. Anonyme Tests benötigen zusätzlich eine Bot-Prüfung. Vorlagen bleiben beim Kunden; Ähnlichkeit erfordert eine Prüfung und ist kein Nachweis von Identität oder Lebendigkeit.

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.

Vorlagenanfragebash
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.

Antwortstrukturjson
{
  "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.

Vektordecoder im Backendtypescript
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); }
}
Eigene Datenbanksql
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.

Parametrisierte Kosinussuchesql
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.

Optionaler Vorlagenvergleichbash
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.

  1. 1
    Backend-Sitzung erstellen

    Autorisierung einholen und eine kurzlebige Sitzung erstellen.

  2. 2
    Aufnahme mit React

    Die zurückgegebene Sitzung an die Scanverion-Komponente übergeben.

  3. 3
    Bewertung 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.

React 18/19 + SDK 0.1.1bash
npm install react react-dom
  npm install @scanverion/sdk@0.1.1 @scanverion/liveness-react@0.1.0

Backend-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.

Node.js / npmtypescript
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 });
}

Aufnahme mit React

CameraStep.tsx · client componenttsx
"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.

Completed result · calibrated-deployment examplejson
{
  "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

RESTbash
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"

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.

OperationZweckAbhängigkeit oder Einschränkung
DetectionFindet und klassifiziert Dokument- oder Fahrzeugobjekte.Wird bei den meisten Dokumentabläufen automatisch ergänzt.
ScannerExtrahiert typisierte Felder aus unterstützten Dokumenten.Wird von LostOrStolenCardCheck benötigt.
RotationMeldet die Dokumentausrichtung.Wird von FaceExtraction ergänzt.
BlurBewertet die Unschärfe eines Bildes.Für Dokumente und Fahrzeuge unterstützt.
FaceDetectionFindet Gesichter in einem erkannten Dokument.Wird von FaceExtraction ergänzt.
FaceExtractionGibt extrahierte Gesichtsdaten oder Bilder zurück.Ergänzt FaceDetection und Rotation.
BarcodeReadingLiest unterstützte ein- und zweidimensionale Codes.Nur für Dokumentverarbeitung.
CheckboxDetectionBewertet konfigurierte Kontrollkästchenbereiche.CheckboxDefinitions muss gültiges JSON sein.
SignatureDetectionFindet Signaturen in einem Dokument.Nur Dokumenterkennung; der visuelle Vergleich verwendet einen eigenen Endpunkt.
Sonderfälle. Detection und Scanner wechseln automatisch zur Ganzseiten-OCR, wenn Belege auf Seitenebene eine Rechnung erkennen. DisableObjectSegmentation bleibt eine optionale Ganzbild-Erzwingung; zusammen mit Scanner sind ScannerFields erforderlich. Die Postleitzahlensuche besitzt einen eigenen Validierungsendpunkt und ist keine Multipart-KI-Operation.

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.

Antwortjson
{
  "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.

MethodePfadEingabe
POST/api/v1/validation/id-cards/lost-or-stolenJSON-Body: cardNumber und cardType
GET/api/v1/validation/postal-codesQuery: address und optional countryCode=SK oder SVK
Anfragebash
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.

MethodePfadRückgabe
GET/api/v1/usage/summaryAufrufe und gewichtete Credits für den Zeitraum
GET/api/v1/usage/dailyTägliche Aufruf- und Creditsummen
GET/api/v1/usage/by-capabilityNach abgerechneter Funktion gruppierte Summen
GET/api/v1/usage/price-previewVorschau für enthaltene, überschüssige und gesamte Preise in EUR
Abrechnungsverhalten. Enthaltene Credits werden jeden Kalendermonat zurückgesetzt. Überverbrauch wird nur mit einer autorisierten wiederverwendbaren Zahlungsmethode und einem positiven Budget berechnet.

11 / Wiederherstellung

Fehler und Wiederholungsstrategie

Behandeln Sie Authentifizierungs-, Berechtigungs-, Validierungs-, Duplikat- und Anbieterfehler.

StatusBedeutungAktion des Clients
401 UnauthorizedDer Schlüssel fehlt, ist fehlerhaft, inaktiv, abgelaufen, widerrufen oder keinem Workspace zugeordnet.Erst nach der Korrektur der Zugangsdaten wiederholen.
402 Payment RequiredDie Workspace-Berechtigung oder das Verarbeitungslimit ist erschöpft.Tarif oder Überverbrauchseinstellungen ändern.
409 ConflictDer Idempotency-Key hat diese Verarbeitungsanfrage bereits reserviert.Als denselben Versuch behandeln und nicht blind einen neuen Schlüssel erzeugen.
422 Unprocessable EntityDatei, Operationskombination, Felder, Datumsbereich oder Validierungseingabe sind ungültig.Anfrage vor dem Wiederholen korrigieren.
502 Bad GatewayEin KI- oder Validierungsanbieter ist fehlgeschlagen oder lieferte ein uneindeutiges Ergebnis.Bei sicher wiederholbaren Operationen mit Abstand erneut versuchen.
503 Service UnavailableEin 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.

Verbindung

Gehostetes HTTP

OAuth 2.0

Gehostetes 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.

Server-URL
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.

.vscode/mcp.json
{
  "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