Preskočiť na obsah

Scanverion pre vývojárov

Úplný integračný návod

Kontrakty požiadaviek, príklady SDK a integračné návody pre extrakciu dokumentov, porovnanie tvárí a podpisov, živosť cez kameru a opakovane použiteľné šablóny tvárí.

Živý kontrakt APIOpenAPI 3.1.1 / v1

Vygenerovaný zo spusteného .NET API a jeho typovaných modelov požiadaviek a odpovedí.

Stiahnuť OpenAPI JSON

01 / Začíname

Rýchly štart

Vytvorte kľúč, nastavte dve premenné prostredia a odošlite prvú overenú požiadavku.

  1. Vytvorte účet pracovného priestoru a vyberte plán.
  2. Vytvorte API kľúč s najmenším rozsahom spracovania, ktorý služba potrebuje. Tajný údaj si skopírujte okamžite; neskôr sa už nezobrazí.
  3. Premenné SCANVERION_API_URL a SCANVERION_API_KEY nastavte iba v serverovom prostredí.
  4. Odošlite multipart požiadavku a uložte vrátené requestId spolu s vlastným identifikátorom trasovania.
Požiadavkabash
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 / Bezpečnosť

Autentifikácia a API kľúče

Bezpečne používajte strojové prihlasovacie údaje s rozsahmi z dôveryhodného backendu.

Prihlasovací údaj servera. Odosielajte Authorization: Bearer skv_.... Kľúč nikdy nevkladajte do JavaScriptu prehliadača, mobilnej aplikácie, analytiky ani logov.
OverenieKľúč musí byť aktívny, neexpirovaný, neodvolaný a priradený k pracovnému priestoru.
RozsahyOprávnenie sa vyhodnocuje podľa rozsahov uložených pri kľúči.
Doručenie tajomstvaCelý tajný údaj sa vráti iba pri vytvorení alebo rotácii kľúča.
Auditná stopaÚspešné použitie aktualizuje čas posledného použitia a vytvorí auditnú udalosť.
Verejné klientske balíky: TypeScript SDK · Python SDK · .NET SDK · CLI · MCP server

03 / Spoľahlivosť

Idempotencia a opakovanie

Každému pokusu o spracovanie priraďte stabilný kľúč a vedome riešte duplicity.

S každou požiadavkou na spracovanie odošlite Idempotency-Key. Rovnakú hodnotu použite iba pri opakovaní toho istého logického nahratia a rovnakých operácií. Duplicitná rezervácia vráti 409 Conflict; nový kľúč môže vytvoriť druhý účtovaný pokus.

04 / AI endpoint

Spracovanie dokumentov

Nahrajte JPEG, PNG, WebP alebo PDF na synchrónnu analýzu dokumentu.

Použite presné názvy multipart polí ASP.NET: jedno File, jedno alebo viac opakovaných Operations, voliteľné opakované ScannerFields, voliteľný JSON CheckboxDefinitions a voliteľné DisableObjectSegmentation.

Obmedzenie: Vstup musí mať typ image/jpeg, image/png, image/webp alebo application/pdf a nesmie byť väčší ako 10 MB.

Polia skenera podľa typu dokumentu

V opakovaných hodnotách ScannerFields používajte nižšie uvedené kanonické názvy polí. Porovnávanie nerozlišuje veľké a malé písmená, kanonický zápis však zachováva konzistentnosť integrácie. Každá kategória podporuje aj spoločné polia. Požadované pole môže byť null, ak OCR nemá dostatok podkladov.

Typ dokumentuDetegovaná kategóriaĎalšie ScannerFields
Každý dokument*
rawTextdocumentType
Faktúrainvoice
invoiceNumberissueDatedueDatedeliveryDatepaymentReferencecurrencysupplierNamesupplierAddresssupplierStreetNamesupplierStreetNumbersupplierCitysupplierCityPartsupplierPostalCodesupplierCountryCodesupplierCompanyRegistrationNumbersupplierTaxNumbersupplierVatNumbersupplierIbansupplierBiccustomerNamecustomerAddresscustomerStreetNamecustomerStreetNumbercustomerCitycustomerCityPartcustomerPostalCodecustomerCountryCodecustomerCompanyRegistrationNumbercustomerTaxNumbercustomerVatNumbercustomerIbancustomerBicdeliveryNamedeliveryAddressdeliveryStreetNamedeliveryStreetNumberdeliveryCitydeliveryCityPartdeliveryPostalCodedeliveryCountryCodenetTotalvatTotalvatBreakdowngrossTotallineItemsbankAccounts
Cestovný paspassport
documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth
Občiansky preukaz EÚ, predná stranaeuidfront
documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth
Občiansky preukaz EÚ, zadná stranaeuidback
addressstreetNamestreetNumbercitycityPartpostalCodecountryCodemaidenNameplaceOfBirthbloodTypepersonalNumbermaritalStatusissuedBydocumentNumbernationalitynationalityNamedateOfBirthsexdateOfExpiry
Vodičský preukaz EÚ, predná stranaeudriverlicensefront
dateOfBirthplaceOfBirthdateOfIssuedateOfExpiryissuedBydocumentNumberlicenseAllowedCategories
Osvedčenie o evidencii, časť I, predná stranaeutechnicallicensefront
vinlicensePlateaddressownerdocumentNumber
Osvedčenie o evidencii, časť I, zadná stranaeutechnicallicenseback
vinmanufacturervariantmodelvalidUntilvehicleCategoryengineVolumeenginePerformancefuelTypenumberOfSeatsmaximumSpeedlargestWeightKg
Osvedčenie o evidencii, časť II, predná stranabigtechnicallicensefront
registrationCertificatePartdocumentNumberlicensePlatedateOfFirstRegistrationvinvehicleKindvehicleCategorymanufacturermodeltypeVariantVersionvehicleManufacturertypeApprovalNumbertypeApprovalDateengineManufacturerengineTypeengineVolumeCm3catalystenginePerformanceKwengineSpeedRpmfuelTypetransmission
Osvedčenie o evidencii, časť II, zadná stranabigtechnicallicenseback
bodyTypecolorproductionNumbernumberOfSeatsnumberOfStandingPlacesnumberOfBedsroofLoadKgfuelTankVolumeLlengthMmwidthMmheightMmoperationalWeightKgmaximumWeightKgmaximumBrakedTrailerWeightKgmaximumUnbrakedTrailerWeightKgnumberOfAxleswheelbaseMmfrontTyresrearTyresfrontRimsrearRimsmaximumSpeedKphstationaryNoiseDbdriveByNoiseDbemissionStandardco2GKmfuelConsumptionL100Km
Povolenie na pobyt, predná stranaresidencepermitfront
documentNumbersexnationalitynationalityNamedateOfBirthpersonalNumbertypeOfPermitdateOfExpirynotescardAccessNumber
Povolenie na pobyt, zadná stranaresidencepermitback
documentNumbersexnationalitynationalityNamedateOfBirthdateOfExpirydateOfIssueissuedByplaceOfBirthaddresspersonalNumbercountryCode
Preukaz osoby so zdravotným postihnutímdisabilitycard
dateOfBirthdateOfIssuedocumentNumberissuedByaddress
Celý obrázok alebo nerozpoznaný dokumentfullimage / other
-
Štruktúrované polia faktúry zostávajú JSON poľami v reťazcovom slovníku: vatBreakdown obsahuje { rate, netAmount, amount, grossAmount }, lineItems obsahuje { description, quantity, unit, unitPrice, netAmount, vatRate, vatAmount, grossAmount } a bankAccounts obsahuje { partyRole, iban, bic }. Pôvodné pole iban je zastaraný alias poľa supplierIban. Údaje o mene osoby sa vracajú v scanner.fields.name s menom, stredným menom, priezviskom, titulmi a hodnotami v pôvodnom aj latinskom písme.

Podporované dokumenty

Pozrite sa, čo Scanverion dokáže prečítať.

Jasne neplatné AI vzory vychádzajú z odkazovaných verejných rozložení dokladov. Karty odlišujú API kategóriu od implementovaného a testovaného štruktúrovaného výstupu skenera.

Fiktívny AI vzor slovenskej firemnej faktúry

Faktúra

Layout based

Extrakcia faktúr podľa obsahu a rozloženia

Príklady polí
Kategória API

Invoice

Príklady polí
invoiceNumbersupplierNamecustomerNamepaymentReferencelineItemsgrossTotal
Predloha rozloženia: Original Scanverion AI invoice specimen · Fictional demo

AI ukážky používajú fiktívne údaje, viditeľné označenie VZOR/SPECIMEN a neplatné strojovo čitateľné hodnoty. Nie sú to skutočné ani zákaznícke doklady.

Fiktívny AI formulár s checkboxmi, tvárou, podpisom a vzorovými kódmi

Generické dokumenty

Vizuálne operácie fungujú aj mimo známych typov dokladov.

Checkboxy, čiarové kódy, podpisy, tváre, rozmazanie a otočenie možno analyzovať na formulároch, zmluvách, skenoch aj neznámych dokumentoch. Samostatný profil skenera nie je potrebný.

  • Detection: Nájde dokumenty a ďalšie objekty.
  • Rotation: Zmeria otočenie dokumentu.
  • Blur: Vyhodnotí ostrosť obrázka.
  • BarcodeReading: Prečíta QR a čiarové kódy.
  • CheckboxDetection: Vyhodnotí oblasti checkboxov z požiadavky.
  • SignatureDetection: Nájde viditeľný podpis.
  • FaceDetection: Nájde viditeľné tváre.
  • FaceExtraction: Vráti výrezy nájdených tvárí.
Príklady polí

CheckboxDetection používa CheckboxDefinitions z požiadavky. Spracovanie celého obrázka môže vrátiť aj vyžiadané ScannerFields.

Predloha rozloženia: Original Scanverion AI application form · Fictional demo

Podpora krajín

Pokrytie krajín závisí od typu dokumentu.

Pasy používajú globálny štandard strojovo čitateľnej zóny. Občianske a národné doklady potrebujú rozloženia podľa krajiny a generácie.

01

Cestovné pasy

Všetky vydávajúce krajiny s čitateľnou ICAO TD3 MRZ
Testované tlačené rozloženia
SKFICHUA

MRZ poskytuje meno, číslo dokladu, dátumy, pohlavie a štátnu príslušnosť. Ďalšie tlačené polia závisia od národného rozloženia.

02

Národné občianske preukazy

Samostatná štruktúrovaná extrakcia pre implementované rozloženia
Testované krajiny
SKCZHURODEATPL

Pokrytie prednej a zadnej strany sa líši podľa krajiny a generácie dokladu.

03

Slovenské národné doklady

Samostatná extrakcia pre slovenské rozloženia
Typy dokumentov
Povolenia na pobytVodičské preukazyOsvedčenia o evidencii I/IIPreukazy ŤZP

Štátna príslušnosť držiteľa nemení rozloženie vydávajúcej krajiny.

05 / AI endpoint

Spracovanie vozidiel

Spustite detekciu alebo kontrolu rozmazania snímky vozidla.

Štruktúra požiadavky zodpovedá spracovaniu dokumentov, ale požiadavky na vozidlá prijímajú iba Detection a Blur. Nepodporované kombinácie vracajú 422 Unprocessable Entity.

06 / Viac súborov

Dávkové spracovanie

Spracujte viac dokumentov alebo snímok vozidiel jednou synchrónnou požiadavkou.

Pole Files zopakujte pre každý súbor. Súbory sa spracúvajú postupne, každý výsledok zostáva identifikovateľný v dávkovej odpovedi a využitie sa sčíta za celú požiadavku.

Požiadavkabash
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"

Adresár endpointov spracovania

MetódaCestaPole súboruKontrakt
POST/api/v1/ai/document-processingFileJPEG, PNG, WebP alebo PDF; najviac 10 MB
POST/api/v1/ai/vehicle-processingFileJPEG, PNG alebo WebP; iba Detection a Blur
POST/api/v1/ai/document-processing/batchesFilesViac súborov; výsledky zostávajú zoskupené podľa súboru
POST/api/v1/ai/vehicle-processing/batchesFilesViac snímok vozidiel; iba Detection a Blur
POST/api/v1/signature-comparisonsCandidate + ReferencesJeden kandidát, 3 až 5 referencií; pri úspechu presne 1 kredit
POST/api/v1/face-comparisonsReferenceImage / ReferenceArtifactId + CandidateImage / CandidateArtifactIdPresne jeden JPEG/PNG obrázok alebo artefakt na každej strane; obrázky do 10 MB. Policy: balanced. Vyžaduje sa Idempotency-Key.
GET/api/v1/ai/capabilities-Podporované MIME typy, operácie a maximálna veľkosť súboru

Porovnanie podpisov

Porovnajte jeden kandidátsky podpis s tromi až piatimi známymi referenciami. Výsledok meria vizuálnu podobnosť podľa zvolenej politiky; neoveruje pravosť, identitu ani autorstvo.

Pole Candidate odošlite raz, pole References zopakujte tri až päťkrát a Mode nastavte na strict, balanced alebo similarity. Každý obrázok musí byť JPEG, PNG alebo WebP a mať najviac 10 MB.

Obmedzenie: S API kľúčom použite POST /api/v1/signature-comparisons, z autentifikovanej relácie dashboardu POST /api/v1/signature-comparisons/previews. Obe cesty vyžadujú Idempotency-Key.
Pevná cena. Každé úspešne dokončené porovnanie spotrebuje presne 1 kredit bez ohľadu na režim alebo počet referencií. Chyby validácie a poskytovateľa sa neúčtujú.
Dočasné spracovanie. Zdrojové obrázky ani embeddingy sa neregistrujú a neukladajú. Odosielajte iba podpisy, ktoré ste oprávnení spracovať.
Požiadavkabash
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"

Odpoveď obsahuje isSimilar, zvolený režim, vzdialenosť, prah, počet referencií, upozornenia a účtované kredity. Nezhoda je úspešný výsledok, nie chyba.

Odpoveďjson
{
  "requestId": "3be5d51e33d64c7699954e3e9f07ea54",
  "isSimilar": true,
  "result": "Similar",
  "mode": "balanced",
  "metric": "cosine-distance",
  "rawDistance": 0.027,
  "threshold": 0.045,
  "referenceCount": 3,
  "warnings": [],
  "credits": 1.0
}

Porovnanie tvárí

Porovnajte dva oprávnene spracované portréty bez operácií Detection alebo Scanner. Použite nahraté obrázky alebo portrétové artefakty z rovnakého pracovného priestoru.

POST /api/v1/face-comparisons
Obmedzenie: Presne jeden JPEG/PNG obrázok alebo artefakt na každej strane; obrázky do 10 MB. Policy: balanced. Vyžaduje sa Idempotency-Key.

Získajte podobnosť, rozhodnutie, dôvody kontroly, normalizované hranice tvárí a orientačné body. Podobnosť nie je pravdepodobnosť identity ani dôkaz živosti.

Tváre musia mať aspoň 80 × 80 pixelov a zaberať 2 % obrázka. Porovnajú sa najviac štyri vhodné tváre na každej strane a vráti sa najlepší pár. Viac vhodných tvárí vyžaduje manuálnu kontrolu. Menšie tváre sa ignorujú.

Úspešné porovnania používajú nakonfigurovanú kreditovú cenu. Skontrolujte politiku a využitie v odpovedi; chyby validácie a poskytovateľa sa neúčtujú. Obrázky sa spracujú dočasne a neregistrujú sa.

Požiadavkabash
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"
Odpoveďjson
{
  "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"
}

Šablóny tvárí a vyhľadávanie v databáze

Integrujte podpísané šablóny tvárí, uložte jeden vektor na osobu a vyhľadávajte vo vlastnej databáze pomocou pgvector.

Požiadavky pracovného priestoru vyžadujú prihlásenie, oprávnenie na spracúvanie a dostupné kredity. Dostupnosť overíte cez /api/v1/identity-templates/policy. Anonymné skúšky navyše vyžadujú ochranu proti botom. Šablóny uchováva klient; podobnosť vyžaduje posúdenie a nie je dôkazom identity ani živosti.

1. Vytvorte opakovane použiteľnú šablónu

Odošlite jednu až osem oprávnene spracúvaných fotografií JPEG/PNG tej istej osoby v opakovaných častiach Images. Každý súbor môže mať 10 MiB, spolu najviac 40 MiB. Server overí konzistenciu a spojí vybrané použiteľné zábery do jedného normalizovaného 128-rozmerného vektora. Pre novú operáciu použite nový idempotentný kľúč; pre ten istý pokus zachovajte rovnaký kľúč.

Požiadavka na šablónubash
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"

Odpoveď obsahuje templateToken, expiresAt a searchIndex. Vektor je float32 v poradí little-endian zakódovaný v Base64, nie text na priame porovnávanie. Uchovajte celý podpísaný token, vektor a vrátené verzie spolu. Zástupné hodnoty v príklade nie sú použiteľné biometrické údaje.

Tvar odpovedejson
{
  "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. Uložte jeden vektor na osobu

Na backende dekódujte searchIndex.vector, overte podporovaný formát a vrátené verzie a atómovo ho uložte s vlastným ID osoby, tokenom a platnosťou. Príklad vlastnej databázy PostgreSQL používa pgvector a HNSW; nie je migráciou aplikácie. Oprávnenie k pracovnému priestoru overte samostatne, filtre nenahrádzajú riadenie prístupu.

Dekódovanie vektora na backendetypescript
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); }
}
Vlastná databázasql
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. Vyhľadávajte pomocou nového portrétu

Cez rovnaký endpoint vytvorte vyhľadávaciu šablónu z jednej novej oprávnene spracúvanej fotografie s novým idempotentným kľúčom. Dekódujte jej vektor a priraďte parametre: $1 vektor, $2 UUID oprávneného pracovného priestoru, $3 compatibilityVersion, $4 selectionVersion, $5 aggregationVersion. Ovládač s podporou pgvector môže prijať dekódované pole. Jedno spracovanie stačí na celé vyhľadávanie bez API volania pre každú osobu. Vstup používateľa nikdy nevkladajte priamo do SQL.

Parametrizované kosínusové vyhľadávaniesql
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. Voliteľne overte vybranú dvojicu

Uložený token odošlite ako ReferenceTemplate a vyhľadávací token ako CandidateTemplate. Namiesto CandidateTemplate možno odoslať jednu časť CandidateImage vo formáte JPEG/PNG. API overí podpisy, rozsah, platnosť a kompatibilitu. Obe šablóny musia patriť rovnakému pracovnému priestoru. Odpoveď obsahuje similarity, metric, reviewRequired, referenceViews a candidateViews. Pre databázové vyhľadávanie je tento samostatný chránený porovnávací dopyt voliteľný.

Voliteľné porovnanie šablónbash
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. Bezpečne spracujte výsledky a životný cyklus

Najbližší sused sa nájde aj bez skutočnej zhody. Na reprezentatívnych dátach stanovte posúdený prah nezhody a pravidlá ľudskej kontroly; podobnosť nie je pravdepodobnosť, overenie identity ani dôkaz živej prítomnosti. Približné HNSW vyhľadávanie nie je úplné a filtre môžu znížiť počet výsledkov. Oddeľte pracovné priestory aj verzie reprezentácie, agregácie a výberu. Desaťročná platnosť podpisu závisí od uchovaných overovacích kľúčov a kompatibilného spracovania, nie od zaručenej budúcej presnosti. Šablóny chráňte ako biometrické údaje, nezapisujte ich do logov a po skončení súhlasu alebo uchovávania vymažte token aj vektor. Podpis ani Base64 nie sú šifrovanie. Nedôveryhodné importy vyžadujú overenie podpisu dôveryhodným kľúčom a presnú zhodu projekcie.

Chyby riešte výslovne: 400 nesprávny vstup; 401/403 prihlásenie, oprávnenie alebo súhlas; 402 kredity; 404 nedostupná vývojová cesta; 409 duplicitný idempotentný kľúč; 422 neplatná či nekompatibilná šablóna, nepoužiteľná tvár alebo nekonzistentné fotografie; 429 limity; 503 nedostupné spracovanie alebo účtovanie. Rešpektujte Retry-After a fotografie automaticky neodosielajte znova. Anonymná cesta nemá /workspace, vyžaduje BotVerificationToken a používa samostatný rozsah šablón. Limity a účtované kredity oznamuje politika a hlavičky odpovede.

Živosť

Krátka relácia kamery posúdi prezentačné útoky. Porovnanie tvárí zostáva samostatným posúdením.

  1. 1
    Vytvorenie na backende

    Získajte oprávnenie a vytvorte jednu krátkodobú reláciu.

  2. 2
    Snímanie v Reacte

    Odovzdajte vrátenú reláciu komponentu Scanverion.

  3. 3
    Načítanie posúdenia

    Posúdenie načítajte až po oznámení o dokončení.

Inštalácia

React komponent na snímanie 0.1.0 je dostupný na npm. Pre metódy živosti použite backendové SDK 0.1.1 alebo novšie.

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

Vytvorenie na backende

Ide o serverové pomocné funkcie, nie verejné HTTP handlery. Aplikácia musí overiť účastníka a oprávnenie spracovania, priradiť reláciu vlastníkovi a chrániť vlastné routy pred CSRF. Pri backendovom sprostredkovaní uchovajte tokeny na serveri. React kroku odovzdajte reláciu a funkciu na načítanie výsledku.

Backendové SDK: @scanverion/sdk pre Node.js (npm, JavaScript/TypeScript), scanverion pre Python (synchrónne aj asynchrónne) a Scanverion.Sdk pre .NET (NuGet). Použite zostavu s metódami živosti. Java SDK/balík Maven zatiaľ nie je dostupný; Java backendy môžu použiť REST API uvedené v časti Ďalší klienti.

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 });
}

Snímanie v Reacte

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."); }}
  />;
}

Načítanie posúdenia

Vysoké skóre nie je pravdepodobnosť identity. Rešpektujte decision a reviewRequired. Režim manuálnej kontroly vracia review aj pri vysokom skóre. Úspešné dokončené posúdenie pracovného priestoru používa nastavenú cenu (6 kreditov); anonymná skúška kredity pracovného priestoru neodpočíta. Neúspešné a nejednoznačné posúdenia nie sú dokončenými účtovanými posúdeniami.

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
Skóre živosti poskytovateľa: 0–100
reviewRequired
Posúdenie živosti nie je overením identity. Neisté výsledky vyžadujú kontrolu.
credits
kredity za dokončené posúdenie

Limit snímania je tri minúty; uchovanie výsledku je samostatné a obmedzené. Pri chybe, zrušení alebo vypršaní odpojte snímanie. Stav created/in_progress kontrolujte pre tú istú reláciu výslovne v intervale aspoň dvoch sekúnd. Po neistej požiadavke automaticky nevytvárajte novú reláciu.

Ďalší klienti

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 vyžaduje súhlas faces:liveness a nedokáže ovládať kameru. Webová skúška je samostatná relácia, nie dokončenie ľubovoľnej MCP relácie.

Dostupnosť a bezpečnosť

Scanverion neukladá záznam kamery ani vrátené referenčné obrázky.

Snímanie môže používať blikajúce farby. Nepokračujte, ak ste citliví na blikajúce svetlá.

Posúdenie živosti nie je overením identity. Neisté výsledky vyžadujú kontrolu.

07 / Funkcie

Operácie a závislosti

Vyberte podporované operácie a pochopte automaticky pridané závislosti.

OperáciaÚčelZávislosť alebo obmedzenie
DetectionVyhľadá a klasifikuje objekty dokumentu alebo vozidla.Pri väčšine dokumentových postupov sa pridá automaticky.
ScannerExtrahuje typované polia z podporovaných dokumentov.Vyžaduje ho LostOrStolenCardCheck.
RotationUvádza orientáciu dokumentu.Pridá ho FaceExtraction.
BlurVyhodnotí rozmazanie obrázka.Podporované pre dokumenty a vozidlá.
FaceDetectionNájde tváre v detegovanom dokumente.Pridá ho FaceExtraction.
FaceExtractionVráti extrahované údaje alebo obrázky tvárí.Pridáva FaceDetection a Rotation.
BarcodeReadingČíta podporované jednodimenzionálne a dvojdimenzionálne kódy.Iba spracovanie dokumentov.
CheckboxDetectionVyhodnocuje nakonfigurované oblasti zaškrtávacích polí.CheckboxDefinitions musí byť platný JSON.
SignatureDetectionVyhľadá podpisy v dokumente.Iba detekcia v dokumente; vizuálne porovnanie používa samostatný endpoint.
Špeciálne prípady. Detection spolu so Scanner automaticky použijú OCR celej strany, keď údaje na úrovni strany identifikujú faktúru. DisableObjectSegmentation zostáva voliteľným vynútením celého obrázka; pri kombinácii so Scanner sú ScannerFields povinné. Vyhľadávanie poštového smerovacieho čísla má samostatný validačný endpoint a nie je multipart AI operáciou.

08 / Schéma

Model odpovede

Čítajte výsledky objektov, stavy operácií, časovanie a účtované kredity.

objects zachováva vzťah medzi každým detegovaným objektom a výsledkami jeho operácií. operations uvádza požadovanú a automaticky pridanú prácu. usage je autoritatívna účtovaná hodnota odpovede.

Odpoveďjson
{
  "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 / Vyhradené zdroje

Validačné zdroje

Použite samostatné endpointy pre stratené doklady a poštové smerovacie čísla.

MetódaCestaVstup
POST/api/v1/validation/id-cards/lost-or-stolenJSON telo: cardNumber a cardType
GET/api/v1/validation/postal-codesQuery: address a voliteľný countryCode=SK alebo SVK
Požiadavkabash
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 / Účtovanie

Využitie a kredity

Získajte volania, vážené kredity, denné súčty, funkcie a cenový náhľad.

Kredity sú vážené podľa nastaveného násobiteľa produktu, preto sú volania a kredity samostatné metriky. Endpointy využitia prijímajú vrátane dátumy from a to; predvolene obdobie začína prvým dňom aktuálneho kalendárneho mesiaca a končí dnes.

MetódaCestaVrátené údaje
GET/api/v1/usage/summaryVolania a vážené kredity za obdobie
GET/api/v1/usage/dailyDenné súčty volaní a kreditov
GET/api/v1/usage/by-capabilitySúčty zoskupené podľa účtovanej funkcie
GET/api/v1/usage/price-previewNáhľad zahrnutých kreditov, nadlimitnej ceny a celku v EUR
Správanie účtovania. Zahrnuté kredity sa obnovujú každý kalendárny mesiac. Nadlimitné účtovanie funguje iba s autorizovanou opakovane použiteľnou platobnou metódou a kladným rozpočtom.

11 / Obnova

Chyby a stratégia opakovania

Riešte chyby autentifikácie, oprávnení, validácie, duplicít a poskytovateľov.

StavVýznamAkcia klienta
401 UnauthorizedKľúč chýba, je nesprávny, neaktívny, expirovaný, odvolaný alebo nie je priradený k pracovnému priestoru.Neopakujte požiadavku, kým neopravíte prihlasovacie údaje.
402 Payment RequiredOprávnenie pracovného priestoru alebo limit spracovania je vyčerpaný.Zmeňte plán alebo nastavenie nadlimitného účtovania.
409 ConflictIdempotency key už rezervoval túto požiadavku na spracovanie.Považujte ju za rovnaký pokus; nevytvárajte nový kľúč bez dôvodu.
422 Unprocessable EntitySúbor, kombinácia operácií, polia, rozsah dátumov alebo validačný vstup nie sú platné.Pred opakovaním opravte požiadavku.
502 Bad GatewayNadradený AI alebo validačný poskytovateľ zlyhal alebo vrátil nejednoznačný výsledok.Ak je operácia bezpečná na opakovanie, skúste ju znova s odstupom.
503 Service UnavailablePotrebný poskytovateľ spracovania je dočasne nedostupný.Opakujte s obmedzeným exponenciálnym odstupom.

Zaznamenajte requestId odpovede, HTTP stav a idempotency key. Náhodné obmedzené exponenciálne opakovanie používajte iba pri dočasných chybách; validačné chyby a chyby prihlasovacích údajov vyžadujú zmenu požiadavky.

12 / Generovaný kontrakt

Referencia OpenAPI

Otvorte generovaný Scalar explorer alebo stiahnite strojovo čitateľný kontrakt.

Referencia Scanverion API

Spustený kontrakt je zdrojom pravdy pre schémy, hodnoty enumov, požiadavky autentifikácie a deklarované HTTP výsledky.

Integrácia MCP

Hostované OAuth pripojenia, registrácia klientov, rozsahy a lokálne stdio pre VS Code a Claude Desktop.

Pripojenie

Hostované HTTP

OAuth 2.0

Hostované OAuth je zapnuté. Pripojenie vyžaduje aktívneho, vopred registrovaného klienta; samotná adresa servera aplikáciu nezaregistruje. HTTP prístup s API kľúčom zostáva dostupný cez X-Scanverion-Api-Key.

Adresa servera
https://mcp.scanverion.com/mcp

Prenos
Streamable HTTP / HTTPS
Autentifikácia
OAuth 2.0 autorizačný kód + S256 PKCE
Vstupy
Iba base64; bez ciest k lokálnym súborom
Maximálny dekódovaný vstup
10 MiB · JPEG, PNG, WebP, PDF

Spracovanie dokumentov a vozidiel využíva kredity. Porovnanie podpisov stojí presne 1 kredit. Katalógy a využitie sa neúčtujú.

OAuth konfigurácia VS Code

Vytvorte a aktivujte verejnú natívnu aplikáciu s callback základom http://127.0.0.1/. VS Code automaticky doplní dočasný port. Zadajte ID aktivovaného klienta, spustite server vo VS Code a potvrďte prihlásenie a súhlas v prehliadači. API kľúč ani tajomstvo klienta nie sú potrebné.

.vscode/mcp.json
{
  "servers": {
    "scanverion": {
      "type": "http",
      "url": "https://mcp.scanverion.com/mcp",
      "oauth": {
        "clientId": ""
      }
    }
  }
}

Rozsahy: capabilities:read pre katalóg, usage:read pre využitie, documents:analyze alebo vehicles:analyze pre spracovanie, signatures:compare pre podpisy a offline_access pre obnovovanie. Klient musí rozsahy vyžiadať a používateľ schváliť. Prístupové tokeny platia 10 minút; obnovovacie tokeny sa rotujú. Prístup odvolajte pri aplikácii alebo odpojte všetky MCP pripojenia v Profile. Tokeny nevkladajte do chatu.

Dostupné nástroje

analyze_document
Spoplatnené. Predvolene iba Detection; pre OCR a extrakciu polí výslovne zvoľte Scanner.
analyze_vehicle
Spoplatnené. Podporuje Detection a Blur.
compare_signatures
Spoplatnené presne 1 kreditom. Porovná jeden podpis s 3 až 5 referenciami; podobnosť nie je dôkazom identity ani pravosti.
compare_faces
Porovnajte dva oprávnene spracované portréty bez operácií Detection alebo Scanner. Použite nahraté obrázky alebo portrétové artefakty z rovnakého pracovného priestoru.
list_capabilities
Katalóg modelov AI a limitov bez poplatku za spracovanie; nejde o kontrolu oprávnení.
list_api_capabilities
Verejný katalóg API bez poplatku za spracovanie; neoveruje prístup konkrétneho účtu.
get_usage_summary
Volania a kredity bez poplatku za spracovanie, pre dátumy YYYY-MM-DD vrátane oboch hraníc. Odhad ceny nie je dostupný, nie je nulový.

faces:compare: Úspešné porovnania používajú nakonfigurovanú kreditovú cenu. Skontrolujte politiku a využitie v odpovedi; chyby validácie a poskytovateľa sa neúčtujú. Obrázky sa spracujú dočasne a neregistrujú sa.

create_liveness_session / get_liveness_result · faces:liveness: Krátka relácia kamery posúdi prezentačné útoky. Porovnanie tvárí zostáva samostatným posúdením. Posúdenie živosti nie je overením identity. Neisté výsledky vyžadujú kontrolu.

create_identity_template
Celý token aj jeho obsah sú citlivé biometrické údaje. Kopírujte alebo zdieľajte ich iba s oprávnenými systémami. 1–8 fotografií JPEG/PNG · 10 MiB na súbor · spolu 40 MiB 2 kredity za dokončenú požiadavku · processingAuthorized: true · templates:create
compare_identity_templates
Podobnosť vyžaduje posúdenie. Nepotvrdzuje identitu ani živú prítomnosť. 2 kredity za dokončenú požiadavku · processingAuthorized: true · templates:compare
OAuth aplikácie

Vlastníci a administrátori registrujú klientov a aktivujú rozsahy s nedávnym MFA. API kľúče nevyžadujú OAuth registráciu. Dynamická registrácia nie je podporovaná.

OAuth aplikácie