Přeskočit na obsah

Scanverion pro vývojáře

Úplný integrační návod

Smlouvy požadavků, příklady SDK a integrační návody pro extrakci dokumentů, porovnání tváří a podpisů, živost přes kameru a opakovaně použitelné šablony tváří.

Živá smlouva APIOpenAPI 3.1.1 / v1

Vygenerováno ze spuštěného .NET API a jeho typovaných modelů požadavků a odpovědí.

Stáhnout OpenAPI JSON

01 / Začínáme

Rychlý start

Vytvořte klíč, nastavte dvě proměnné prostředí a odešlete první ověřený požadavek.

  1. Vytvořte účet pracovního prostoru a vyberte tarif.
  2. Vytvořte API klíč s nejmenším rozsahem zpracování, který služba potřebuje. Tajný údaj ihned zkopírujte; později se už nezobrazí.
  3. Proměnné SCANVERION_API_URL a SCANVERION_API_KEY nastavte pouze v serverovém prostředí.
  4. Odešlete multipart požadavek a uložte vrácené requestId spolu s vlastním trasovacím identifikátorem.
Požadavekbash
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čnost

Autentizace a API klíče

Bezpečně používejte strojové přihlašovací údaje s omezenými oprávněními z důvěryhodného backendu.

Serverový přihlašovací údaj. Odesílejte Authorization: Bearer skv_.... Klíč nikdy nevkládejte do JavaScriptu prohlížeče, mobilní aplikace, analytiky ani logů.
OvěřeníKlíč musí být aktivní, neexpirovaný, neodvolaný a přiřazený k pracovnímu prostoru.
RozsahyOprávnění se vyhodnocuje podle rozsahů uložených u klíče.
Doručení tajného údajeCelý tajný údaj se vrátí pouze při vytvoření nebo rotaci klíče.
Auditní stopaÚspěšné použití aktualizuje čas posledního použití a vytvoří auditní událost.
Veřejné klientské balíčky: TypeScript SDK · Python SDK · .NET SDK · CLI · MCP server

03 / Spolehlivost

Idempotence a opakování

Každému pokusu o zpracování přiřaďte stabilní klíč a vědomě řešte duplicity.

S každým požadavkem na zpracování odešlete Idempotency-Key. Stejnou hodnotu použijte pouze při opakování téhož logického nahrání a stejných operací. Duplicitní rezervace vrátí 409 Conflict; nový klíč může vytvořit druhý účtovaný pokus.

04 / AI endpoint

Zpracování dokumentů

Nahrajte JPEG, PNG, WebP nebo PDF pro synchronní analýzu dokumentu.

Použijte přesné názvy multipart polí ASP.NET: jedno File, jedno nebo více opakovaných Operations, volitelná opakovaná ScannerFields, volitelný JSON CheckboxDefinitions a volitelné DisableObjectSegmentation.

Omezení: Vstup musí mít typ image/jpeg, image/png, image/webp nebo application/pdf a nesmí být větší než 10 MB.

Pole skeneru podle typu dokumentu

V opakovaných hodnotách ScannerFields používejte níže uvedené kanonické názvy polí. Porovnávání nerozlišuje velká a malá písmena, kanonický zápis však zachovává konzistentnost integrace. Každá kategorie podporuje také společná pole. Požadované pole může být null, pokud OCR nemá dostatek podkladů.

Typ dokumentuDetekovaná kategorieDalší ScannerFields
Každý dokument*
rawTextdocumentType
Fakturainvoice
invoiceNumberissueDatedueDatedeliveryDatepaymentReferencecurrencysupplierNamesupplierAddresssupplierStreetNamesupplierStreetNumbersupplierCitysupplierCityPartsupplierPostalCodesupplierCountryCodesupplierCompanyRegistrationNumbersupplierTaxNumbersupplierVatNumbersupplierIbansupplierBiccustomerNamecustomerAddresscustomerStreetNamecustomerStreetNumbercustomerCitycustomerCityPartcustomerPostalCodecustomerCountryCodecustomerCompanyRegistrationNumbercustomerTaxNumbercustomerVatNumbercustomerIbancustomerBicdeliveryNamedeliveryAddressdeliveryStreetNamedeliveryStreetNumberdeliveryCitydeliveryCityPartdeliveryPostalCodedeliveryCountryCodenetTotalvatTotalvatBreakdowngrossTotallineItemsbankAccounts
Cestovní paspassport
documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth
Občanský průkaz EU, přední stranaeuidfront
documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth
Občanský průkaz EU, zadní stranaeuidback
addressstreetNamestreetNumbercitycityPartpostalCodecountryCodemaidenNameplaceOfBirthbloodTypepersonalNumbermaritalStatusissuedBydocumentNumbernationalitynationalityNamedateOfBirthsexdateOfExpiry
Řidičský průkaz EU, přední stranaeudriverlicensefront
dateOfBirthplaceOfBirthdateOfIssuedateOfExpiryissuedBydocumentNumberlicenseAllowedCategories
Osvědčení o registraci, část I, přední stranaeutechnicallicensefront
vinlicensePlateaddressownerdocumentNumber
Osvědčení o registraci, část I, zadní stranaeutechnicallicenseback
vinmanufacturervariantmodelvalidUntilvehicleCategoryengineVolumeenginePerformancefuelTypenumberOfSeatsmaximumSpeedlargestWeightKg
Technický průkaz, část II, přední stranabigtechnicallicensefront
registrationCertificatePartdocumentNumberlicensePlatedateOfFirstRegistrationvinvehicleKindvehicleCategorymanufacturermodeltypeVariantVersionvehicleManufacturertypeApprovalNumbertypeApprovalDateengineManufacturerengineTypeengineVolumeCm3catalystenginePerformanceKwengineSpeedRpmfuelTypetransmission
Technický průkaz, část II, zadní stranabigtechnicallicenseback
bodyTypecolorproductionNumbernumberOfSeatsnumberOfStandingPlacesnumberOfBedsroofLoadKgfuelTankVolumeLlengthMmwidthMmheightMmoperationalWeightKgmaximumWeightKgmaximumBrakedTrailerWeightKgmaximumUnbrakedTrailerWeightKgnumberOfAxleswheelbaseMmfrontTyresrearTyresfrontRimsrearRimsmaximumSpeedKphstationaryNoiseDbdriveByNoiseDbemissionStandardco2GKmfuelConsumptionL100Km
Povolení k pobytu, přední stranaresidencepermitfront
documentNumbersexnationalitynationalityNamedateOfBirthpersonalNumbertypeOfPermitdateOfExpirynotescardAccessNumber
Povolení k pobytu, zadní stranaresidencepermitback
documentNumbersexnationalitynationalityNamedateOfBirthdateOfExpirydateOfIssueissuedByplaceOfBirthaddresspersonalNumbercountryCode
Průkaz osoby se zdravotním postiženímdisabilitycard
dateOfBirthdateOfIssuedocumentNumberissuedByaddress
Celý obrázek nebo nerozpoznaný dokumentfullimage / other
-
Strukturovaná pole faktury zůstávají poli JSON v řetězcovém 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 zastaralý alias pole supplierIban. Údaje o jménu osoby se vracejí v scanner.fields.name se jménem, prostředním jménem, příjmením, tituly a hodnotami v původním i latinském písmu.

Podporované dokumenty

Podívejte se, co Scanverion dokáže přečíst.

Zřetelně neplatné AI vzory vycházejí z odkazovaných veřejných rozložení dokladů. Karty odlišují kategorii API od implementovaného a testovaného strukturovaného výstupu skeneru.

Fiktivní česká firemní faktura

Faktura

Podle rozložení

Extrakce faktur podle obsahu a rozložení

Příklady polí
Kategorie API

Invoice

Příklady polí
invoiceNumbersupplierNamecustomerNamepaymentReferencelineItemsgrossTotal
Předloha rozložení: Původní česká AI ukázka faktury Scanverion · Fiktivní ukázka

AI ukázky používájí fiktivní údaje, viditelné označení VZOR/SPECIMEN a neplatné strojově čitelné hodnoty. Nejde o skutečné ani zákaznické doklady.

Fiktivní česká žádost se zaškrtávacími políčky, podpisem a neplatnými vzorovými kódy

Obecné dokumenty

Vizuální operace fungují i mimo známé typy dokladů.

Zaškrtávací políčka, čárové kódy, podpisy, tváře, rozmazání a otočení lze analyzovat na formulářích, smlouvách, skenech i neznámých dokumentech. Samostatný profil skeneru není potřeba.

  • Detection: Najde dokumenty a další objekty.
  • Rotation: Změří otočení dokumentu.
  • Blur: Vyhodnotí ostrost obrázku.
  • BarcodeReading: Přečte QR a čárové kódy.
  • CheckboxDetection: Vyhodnotí oblasti zaškrtávacích políček z požadavku.
  • SignatureDetection: Najde viditelný podpis.
  • FaceDetection: Najde viditelné tváře.
  • FaceExtraction: Vrátí výřezy nalezených tváří.
Příklady polí

CheckboxDetection používá CheckboxDefinitions z požadavku. Zpracování celého obrázku může vrátit také vyžádaná ScannerFields.

Předloha rozložení: Původní český AI formulář Scanverion · Fiktivní ukázka

Podpora zemí

Tato česká rozložení dokumentů jsou ověřená.

Cestovní pasy používájí globální standard MRZ. Zobrazené národní doklady jsou omezené na kategorie testované s českým rozložením.

01

Cestovní pasy

Všechny vydávající země s čitelnou ICAO TD3 MRZ
Testované tištěné rozložení
CZ

Další tištěná pole závisí na národním rozložení.

02

Občanský průkaz

Strukturovaná extrakce pro testovanou českou přední a zadní stranu
Testovaná země
CZ

Zobrazená ukázka vychází z rozložení CZE-BO-04004.

05 / AI endpoint

Zpracování vozidel

Spusťte detekci nebo kontrolu rozmazání snímku vozidla.

Struktura požadavku odpovídá zpracování dokumentů, ale požadavky na vozidla přijímají pouze Detection a Blur. Nepodporované kombinace vracejí 422 Unprocessable Entity.

06 / Více souborů

Dávkové zpracování

Zpracujte více dokumentů nebo snímků vozidel jedním synchronním požadavkem.

Pole Files zopakujte pro každý soubor. Soubory se zpracovávají postupně, každý výsledek zůstává identifikovatelný v dávkové odpovědi a využití se sčítá za celý požadavek.

Požadavekbash
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ář endpointů zpracování

MetodaCestaPole souboruSmlouva
POST/api/v1/ai/document-processingFileJPEG, PNG, WebP nebo PDF; nejvýše 10 MB
POST/api/v1/ai/vehicle-processingFileJPEG, PNG nebo WebP; pouze Detection a Blur
POST/api/v1/ai/document-processing/batchesFilesVíce souborů; výsledky zůstávají seskupené podle souboru
POST/api/v1/ai/vehicle-processing/batchesFilesVíce snímků vozidel; pouze Detection a Blur
POST/api/v1/signature-comparisonsCandidate + ReferencesJeden kandidát, 3 až 5 referencí; při úspěchu přesně 1 kredit
POST/api/v1/face-comparisonsReferenceImage / ReferenceArtifactId + CandidateImage / CandidateArtifactIdPrávě jeden JPEG/PNG obrázek nebo artefakt na každé straně; obrázky do 10 MB. Policy: balanced. Vyžaduje se Idempotency-Key.
GET/api/v1/ai/capabilities-Podporované typy MIME, operace a maximální velikost souboru

Porovnání podpisů

Porovnejte jeden kandidátský podpis se třemi až pěti známými referencemi. Výsledek měří vizuální podobnost podle zvolené politiky; neověřuje pravost, identitu ani autorství.

Pole Candidate odešlete jednou, pole References zopakujte třikrát až pětkrát a Mode nastavte na strict, balanced nebo similarity. Každý obrázek musí být JPEG, PNG nebo WebP a mít nejvýše 10 MB.

Omezení: S API klíčem použijte POST /api/v1/signature-comparisons, z autentizované relace dashboardu POST /api/v1/signature-comparisons/previews. Obě cesty vyžadují Idempotency-Key.
Pevná cena. Každé úspěšně dokončené porovnání spotřebuje přesně 1 kredit bez ohledu na režim nebo počet referencí. Chyby validace a poskytovatele se neúčtují.
Dočasné zpracování. Zdrojové obrázky ani embeddingy se neregistrují a neukládají. Odesílejte pouze podpisy, které jste oprávněni zpracovat.
Požadavekbash
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"

Odpověď obsahuje isSimilar, zvolený režim, vzdálenost, práh, počet referencí, upozornění a účtované kredity. Neshoda je úspěšný výsledek, nikoli chyba.

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

Porovnání tváří

Porovnejte dva oprávněně zpracované portréty bez operací Detection nebo Scanner. Použijte nahrané obrázky nebo portrétové artefakty ze stejného pracovního prostoru.

POST /api/v1/face-comparisons
Omezení: Právě jeden JPEG/PNG obrázek nebo artefakt na každé straně; obrázky do 10 MB. Policy: balanced. Vyžaduje se Idempotency-Key.

Získejte podobnost, rozhodnutí, důvody kontroly, normalizované hranice tváří a orientační body. Podobnost není pravděpodobnost identity ani důkaz živosti.

Tváře musí mít alespoň 80 × 80 pixelů a zabírat 2 % obrázku. Porovnají se nejvýše čtyři vhodné tváře na každé straně a vrátí se nejlepší pár. Více vhodných tváří vyžaduje ruční kontrolu. Menší tváře se ignorují.

Úspěšná porovnání používají nakonfigurovanou kreditovou cenu. Zkontrolujte politiku a využití v odpovědi; chyby validace a poskytovatele se neúčtují. Obrázky se zpracují dočasně a neregistrují se.

Požadavekbash
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"
Odpověď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"
}

Šablony tváří a vyhledávání v databázi

Integrujte podepsané šablony tváří, uložte jeden vektor na osobu a vyhledávejte ve vlastní databázi pomocí pgvector.

Požadavky pracovního prostoru vyžadují přihlášení, oprávnění ke zpracování a dostupné kredity. Dostupnost ověříte přes /api/v1/identity-templates/policy. Anonymní zkoušky navíc vyžadují ochranu proti botům. Šablony uchovává klient; podobnost vyžaduje posouzení a není důkazem identity ani živosti.

1. Vytvořte opakovaně použitelnou šablonu

Odešlete jednu až osm oprávněně zpracovávaných fotografií JPEG/PNG stejné osoby v opakovaných částech Images. Každý soubor může mít 10 MiB, celkem nejvýše 40 MiB. Server ověří konzistenci a spojí vybrané použitelné záběry do jednoho normalizovaného 128rozměrného vektoru. Pro novou operaci použijte nový idempotentní klíč; pro stejný pokus zachovejte stejný klíč.

Požadavek na šablonubash
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"

Odpověď obsahuje templateToken, expiresAt a searchIndex. Vektor je float32 v pořadí little-endian zakódovaný v Base64, nikoli text k přímému porovnávání. Uchovejte celý podepsaný token, vektor a vrácené verze společně. Zástupné hodnoty v příkladu nejsou použitelné biometrické údaje.

Tvar odpovědijson
{
  "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 backendu dekódujte searchIndex.vector, ověřte podporovaný formát a vrácené verze a atomicky jej uložte s vlastním ID osoby, tokenem a platností. Příklad vlastní databáze PostgreSQL používá pgvector a HNSW; nejde o migraci aplikace. Oprávnění k pracovnímu prostoru ověřte samostatně, filtry nenahrazují řízení přístupu.

Dekódování vektoru na backendutypescript
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ázesql
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. Vyhledávejte pomocí nového portrétu

Přes stejný endpoint vytvořte vyhledávací šablonu z jedné nové oprávněně zpracovávané fotografie s novým idempotentním klíčem. Dekódujte vektor a přiřaďte parametry: $1 vektor, $2 UUID oprávněného pracovního prostoru, $3 compatibilityVersion, $4 selectionVersion, $5 aggregationVersion. Ovladač s podporou pgvector může přijmout dekódované pole. Jedno zpracování stačí na celé vyhledávání bez API volání pro každou osobu. Vstup uživatele nikdy nevkládejte přímo do SQL.

Parametrizované kosinové vyhledávánísql
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. Volitelně ověřte vybranou dvojici

Uložený token odešlete jako ReferenceTemplate a vyhledávací token jako CandidateTemplate. Místo CandidateTemplate lze odeslat jednu část CandidateImage ve formátu JPEG/PNG. API ověří podpisy, rozsah, platnost a kompatibilitu. Obě šablony musí patřit stejnému pracovnímu prostoru. Odpověď obsahuje similarity, metric, reviewRequired, referenceViews a candidateViews. Pro databázové vyhledávání je tento samostatný chráněný porovnávací požadavek volitelný.

Volitelné porovnání šablonbash
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čně zpracujte výsledky a životní cyklus

Nejbližší soused se najde i bez skutečné shody. Na reprezentativních datech stanovte posouzený práh neshody a pravidla lidské kontroly; podobnost není pravděpodobnost, ověření identity ani důkaz živé přítomnosti. Přibližné HNSW vyhledávání není úplné a filtry mohou snížit počet výsledků. Oddělte pracovní prostory a verze reprezentace, agregace a výběru. Desetiletá platnost podpisu závisí na uchovaných ověřovacích klíčích a kompatibilním zpracování, nikoli na zaručené budoucí přesnosti. Šablony chraňte jako biometrické údaje, nezapisujte je do logů a po skončení souhlasu nebo uchovávání smažte token i vektor. Podpis ani Base64 nejsou šifrování. Nedůvěryhodné importy vyžadují ověření podpisu důvěryhodným klíčem a přesnou shodu projekce.

Chyby řešte výslovně: 400 nesprávný vstup; 401/403 přihlášení, oprávnění nebo souhlas; 402 kredity; 404 nedostupná vývojová cesta; 409 duplicitní idempotentní klíč; 422 neplatná či nekompatibilní šablona, nepoužitelná tvář nebo nekonzistentní fotografie; 429 limity; 503 nedostupné zpracování nebo účtování. Respektujte Retry-After a fotografie automaticky neodesílejte znovu. Anonymní cesta nemá /workspace, vyžaduje BotVerificationToken a používá samostatný rozsah šablon. Limity a účtované kredity oznamuje politika a hlavičky odpovědi.

Živost

Krátká relace kamery posoudí prezentační útoky. Porovnání tváří zůstává samostatným posouzením.

  1. 1
    Vytvoření na backendu

    Získejte oprávnění a vytvořte jednu krátkodobou relaci.

  2. 2
    Snímání v Reactu

    Předejte vrácenou relaci komponentě Scanverion.

  3. 3
    Načtení posouzení

    Posouzení načtěte až po oznámení o dokončení.

Instalace

React komponenta pro snímání 0.1.0 je dostupná na npm. Pro metody živosti použijte backendové SDK 0.1.1 nebo novější.

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

Vytvoření na backendu

Jde o serverové pomocné funkce, ne veřejné HTTP handlery. Aplikace musí ověřit účastníka a oprávnění zpracování, přiřadit relaci vlastníkovi a chránit vlastní routy před CSRF. Při backendovém zprostředkování uchovejte tokeny na serveru. React kroku předejte relaci a funkci pro načtení výsledku.

Backendová SDK: @scanverion/sdk pro Node.js (npm, JavaScript/TypeScript), scanverion pro Python (synchronně i asynchronně) a Scanverion.Sdk pro .NET (NuGet). Použijte sestavení s metodami živosti. Java SDK/balíček Maven zatím není dostupný; Java backendy mohou použít REST API v části Další 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ímání v Reactu

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čtení posouzení

Vysoké skóre není pravděpodobnost identity. Respektujte decision a reviewRequired. Režim ruční kontroly vrací review i při vysokém skóre. Úspěšné dokončené posouzení pracovního prostoru používá nastavenou cenu (6 kreditů); anonymní zkouška kredity pracovního prostoru neodečítá. Neúspěšná a nejednoznačná posouzení nejsou dokončenými účtovanými posouzeními.

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 poskytovatele: 0–100
reviewRequired
Posouzení živosti není ověřením identity. Nejisté výsledky vyžadují kontrolu.
credits
kredity za dokončené posouzení

Limit snímání je tři minuty; uchování výsledku je samostatné a omezené. Při chybě, zrušení nebo vypršení odpojte snímání. Stav created/in_progress kontrolujte pro stejnou relaci výslovně v intervalu alespoň dvou sekund. Po nejistém požadavku automaticky nevytvářejte novou relaci.

Další 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 souhlas faces:liveness a nedokáže ovládat kameru. Webová zkouška je samostatná relace, ne dokončení libovolné MCP relace.

Dostupnost a bezpečnost

Scanverion neukládá záznam kamery ani vrácené referenční obrázky.

Snímání může používat blikající barvy. Nepokračujte, pokud jste citliví na blikající světla.

Posouzení živosti není ověřením identity. Nejisté výsledky vyžadují kontrolu.

07 / Funkce

Operace a závislosti

Vyberte podporované operace a seznamte se s automaticky přidanými závislostmi.

OperaceÚčelZávislost nebo omezení
DetectionVyhledá a klasifikuje objekty dokumentu nebo vozidla.U většiny dokumentových postupů se přidá automaticky.
ScannerExtrahuje typovaná pole z podporovaných dokumentů.Vyžaduje jej LostOrStolenCardCheck.
RotationUvádí orientaci dokumentu.Přidá jej FaceExtraction.
BlurVyhodnotí rozmazání obrázku.Podporováno pro dokumenty a vozidla.
FaceDetectionNajde tváře v detekovaném dokumentu.Přidá jej FaceExtraction.
FaceExtractionVrátí extrahované údaje nebo obrázky tváří.Přidává FaceDetection a Rotation.
BarcodeReadingČte podporované jednorozměrné a dvourozměrné kódy.Pouze zpracování dokumentů.
CheckboxDetectionVyhodnocuje nakonfigurované oblasti zaškrtávacích polí.CheckboxDefinitions musí být platný JSON.
SignatureDetectionVyhledá podpisy v dokumentu.Pouze detekce v dokumentu; vizuální porovnání používá samostatný endpoint.
Zvláštní případy. Detection spolu se Scanner automaticky použijí OCR celé strany, když údaje na úrovni strany identifikují fakturu. DisableObjectSegmentation zůstává volitelným vynucením celého obrázku; při kombinaci se Scanner jsou ScannerFields povinná. Vyhledávání poštovního směrovacího čísla má samostatný validační endpoint a není multipart AI operací.

08 / Schéma

Model odpovědi

Čtěte výsledky objektů, stavy operací, časování a účtované kredity.

objects zachovává vztah mezi každým detekovaným objektem a výsledky jeho operací. operations uvádí požadovanou a automaticky přidanou práci. usage je autoritativní účtovaná hodnota odpovědi.

Odpověď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 / Vyhrazené zdroje

Validační zdroje

Použijte samostatné endpointy pro ztracené doklady a poštovní směrovací čísla.

MetodaCestaVstup
POST/api/v1/validation/id-cards/lost-or-stolenTělo JSON: cardNumber a cardType
GET/api/v1/validation/postal-codesQuery: address a volitelný countryCode=SK nebo SVK
Požadavekbash
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 / Účtování

Využití a kredity

Získejte volání, vážené kredity, denní součty, funkce a cenový náhled.

Kredity jsou vážené podle nastaveného násobitele produktu, proto jsou volání a kredity samostatné metriky. Endpointy využití přijímají včetně data from a to; ve výchozím nastavení období začíná prvním dnem aktuálního kalendářního měsíce a končí dnes.

MetodaCestaVrácené údaje
GET/api/v1/usage/summaryVolání a vážené kredity za období
GET/api/v1/usage/dailyDenní součty volání a kreditů
GET/api/v1/usage/by-capabilitySoučty seskupené podle účtované funkce
GET/api/v1/usage/price-previewNáhled zahrnutých kreditů, nadlimitní ceny a celku v EUR
Chování účtování. Zahrnuté kredity se obnovují každý kalendářní měsíc. Nadlimitní účtování funguje pouze s autorizovanou opakovaně použitelnou platební metodou a kladným rozpočtem.

11 / Obnova

Chyby a strategie opakování

Řešte chyby autentizace, oprávnění, validace, duplicit a poskytovatelů.

StavVýznamAkce klienta
401 UnauthorizedKlíč chybí, je nesprávný, neaktivní, expirovaný, odvolaný nebo není přiřazen k pracovnímu prostoru.Požadavek neopakujte, dokud neopravíte přihlašovací údaje.
402 Payment RequiredOprávnění pracovního prostoru nebo limit zpracování je vyčerpaný.Změňte tarif nebo nastavení nadlimitního účtování.
409 ConflictIdempotency key již rezervoval tento požadavek na zpracování.Považujte jej za stejný pokus; nevytvářejte nový klíč bez důvodu.
422 Unprocessable EntitySoubor, kombinace operací, pole, rozsah dat nebo validační vstup nejsou platné.Před opakováním opravte požadavek.
502 Bad GatewayNadřazený poskytovatel AI nebo validace selhal či vrátil nejednoznačný výsledek.Je-li operace bezpečná k opakování, zkuste ji znovu s odstupem.
503 Service UnavailablePotřebný poskytovatel zpracování je dočasně nedostupný.Opakujte s omezeným exponenciálním odstupem.

Zaznamenejte requestId odpovědi, stav HTTP a idempotency key. Náhodné omezené exponenciální opakování používejte pouze při dočasných chybách; validační chyby a chyby přihlašovacích údajů vyžadují změnu požadavku.

12 / Generovaná smlouva

Reference OpenAPI

Otevřete generovaný Scalar explorer nebo stáhněte strojově čitelnou smlouvu.

Reference Scanverion API

Spuštěná smlouva je zdrojem pravdy pro schémata, hodnoty enumů, požadavky autentizace a deklarované výsledky HTTP.

Integrace MCP

Hostovaná OAuth připojení, registrace klientů, rozsahy a místní stdio pro VS Code a Claude Desktop.

Připojení

Hostované HTTP

OAuth 2.0

Hostované OAuth je zapnuté. Připojení vyžaduje aktivního, předem registrovaného klienta; samotná adresa serveru aplikaci nezaregistruje. HTTP přístup s API klíčem zůstává dostupný přes X-Scanverion-Api-Key.

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

Přenos
Streamable HTTP / HTTPS
Autentizace
OAuth 2.0 autorizační kód + S256 PKCE
Vstupy
Pouze base64; bez cest k místním souborům
Maximální dekódovaný vstup
10 MiB · JPEG, PNG, WebP, PDF

Zpracování dokumentů a vozidel využívá kredity. Porovnání podpisů stojí přesně 1 kredit. Katalogy a využití se neúčtují.

OAuth konfigurace VS Code

Vytvořte a aktivujte veřejnou nativní aplikaci s callback základem http://127.0.0.1/. VS Code automaticky doplní dočasný port. Zadejte ID aktivovaného klienta, spusťte server ve VS Code a potvrďte přihlášení a souhlas v prohlížeči. API klíč ani tajemství klienta nejsou potřeba.

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

Rozsahy: capabilities:read pro katalog, usage:read pro využití, documents:analyze nebo vehicles:analyze pro zpracování, signatures:compare pro podpisy a offline_access pro obnovování. Klient musí rozsahy vyžádat a uživatel schválit. Přístupové tokeny platí 10 minut; obnovovací tokeny se rotují. Přístup odvolejte u aplikace nebo odpojte všechna MCP připojení v Profilu. Tokeny nevkládejte do chatu.

Dostupné nástroje

analyze_document
Zpoplatněné. Ve výchozím stavu pouze Detection; pro OCR a extrakci polí výslovně zvolte Scanner.
analyze_vehicle
Zpoplatněné. Podporuje Detection a Blur.
compare_signatures
Zpoplatněné přesně 1 kreditem. Porovná jeden podpis se 3 až 5 referencemi; podobnost není důkazem identity ani pravosti.
compare_faces
Porovnejte dva oprávněně zpracované portréty bez operací Detection nebo Scanner. Použijte nahrané obrázky nebo portrétové artefakty ze stejného pracovního prostoru.
list_capabilities
Katalog modelů AI a limitů bez poplatku za zpracování; nejde o kontrolu oprávnění.
list_api_capabilities
Veřejný katalog API bez poplatku za zpracování; neověřuje přístup konkrétního účtu.
get_usage_summary
Volání a kredity bez poplatku za zpracování, pro data YYYY-MM-DD včetně obou hranic. Odhad ceny není dostupný, není nulový.

faces:compare: Úspěšná porovnání používají nakonfigurovanou kreditovou cenu. Zkontrolujte politiku a využití v odpovědi; chyby validace a poskytovatele se neúčtují. Obrázky se zpracují dočasně a neregistrují se.

create_liveness_session / get_liveness_result · faces:liveness: Krátká relace kamery posoudí prezentační útoky. Porovnání tváří zůstává samostatným posouzením. Posouzení živosti není ověřením identity. Nejisté výsledky vyžadují kontrolu.

create_identity_template
Celý token i jeho obsah jsou citlivé biometrické údaje. Kopírujte nebo sdílejte je pouze s oprávněnými systémy. 1–8 fotografií JPEG/PNG · 10 MiB na soubor · celkem 40 MiB 2 kredity za dokončený požadavek · processingAuthorized: true · templates:create
compare_identity_templates
Podobnost vyžaduje posouzení. Nepotvrzuje identitu ani živou přítomnost. 2 kredity za dokončený požadavek · processingAuthorized: true · templates:compare
OAuth aplikace

Vlastníci a administrátoři registrují klienty a aktivují rozsahy s nedávným MFA. API klíče nevyžadují OAuth registraci. Dynamická registrace není podporována.

OAuth aplikace