01 / Začínáme
Rychlý start
Vytvořte klíč, nastavte dvě proměnné prostředí a odešlete první ověřený požadavek.
- Vytvořte účet pracovního prostoru a vyberte tarif.
- 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í.
- Proměnné SCANVERION_API_URL a SCANVERION_API_KEY nastavte pouze v serverovém prostředí.
- Odešlete multipart požadavek a uložte vrácené requestId spolu s vlastním trasovacím identifikátorem.
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.
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.
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 dokumentu | Detekovaná kategorie | Další ScannerFields |
|---|---|---|
| Každý dokument | * | rawTextdocumentType |
| Faktura | invoice | invoiceNumberissueDatedueDatedeliveryDatepaymentReferencecurrencysupplierNamesupplierAddresssupplierStreetNamesupplierStreetNumbersupplierCitysupplierCityPartsupplierPostalCodesupplierCountryCodesupplierCompanyRegistrationNumbersupplierTaxNumbersupplierVatNumbersupplierIbansupplierBiccustomerNamecustomerAddresscustomerStreetNamecustomerStreetNumbercustomerCitycustomerCityPartcustomerPostalCodecustomerCountryCodecustomerCompanyRegistrationNumbercustomerTaxNumbercustomerVatNumbercustomerIbancustomerBicdeliveryNamedeliveryAddressdeliveryStreetNamedeliveryStreetNumberdeliveryCitydeliveryCityPartdeliveryPostalCodedeliveryCountryCodenetTotalvatTotalvatBreakdowngrossTotallineItemsbankAccounts |
| Cestovní pas | passport | documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth |
| Občanský průkaz EU, přední strana | euidfront | documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth |
| Občanský průkaz EU, zadní strana | euidback | addressstreetNamestreetNumbercitycityPartpostalCodecountryCodemaidenNameplaceOfBirthbloodTypepersonalNumbermaritalStatusissuedBydocumentNumbernationalitynationalityNamedateOfBirthsexdateOfExpiry |
| Řidičský průkaz EU, přední strana | eudriverlicensefront | dateOfBirthplaceOfBirthdateOfIssuedateOfExpiryissuedBydocumentNumberlicenseAllowedCategories |
| Osvědčení o registraci, část I, přední strana | eutechnicallicensefront | vinlicensePlateaddressownerdocumentNumber |
| Osvědčení o registraci, část I, zadní strana | eutechnicallicenseback | vinmanufacturervariantmodelvalidUntilvehicleCategoryengineVolumeenginePerformancefuelTypenumberOfSeatsmaximumSpeedlargestWeightKg |
| Technický průkaz, část II, přední strana | bigtechnicallicensefront | registrationCertificatePartdocumentNumberlicensePlatedateOfFirstRegistrationvinvehicleKindvehicleCategorymanufacturermodeltypeVariantVersionvehicleManufacturertypeApprovalNumbertypeApprovalDateengineManufacturerengineTypeengineVolumeCm3catalystenginePerformanceKwengineSpeedRpmfuelTypetransmission |
| Technický průkaz, část II, zadní strana | bigtechnicallicenseback | bodyTypecolorproductionNumbernumberOfSeatsnumberOfStandingPlacesnumberOfBedsroofLoadKgfuelTankVolumeLlengthMmwidthMmheightMmoperationalWeightKgmaximumWeightKgmaximumBrakedTrailerWeightKgmaximumUnbrakedTrailerWeightKgnumberOfAxleswheelbaseMmfrontTyresrearTyresfrontRimsrearRimsmaximumSpeedKphstationaryNoiseDbdriveByNoiseDbemissionStandardco2GKmfuelConsumptionL100Km |
| Povolení k pobytu, přední strana | residencepermitfront | documentNumbersexnationalitynationalityNamedateOfBirthpersonalNumbertypeOfPermitdateOfExpirynotescardAccessNumber |
| Povolení k pobytu, zadní strana | residencepermitback | documentNumbersexnationalitynationalityNamedateOfBirthdateOfExpirydateOfIssueissuedByplaceOfBirthaddresspersonalNumbercountryCode |
| Průkaz osoby se zdravotním postižením | disabilitycard | dateOfBirthdateOfIssuedocumentNumberissuedByaddress |
| Celý obrázek nebo nerozpoznaný dokument | fullimage / other | - |
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.

Cestovní pas
Univerzální ICAO TD3 MRZ a testované české tištěné rozložení
Příklady polí
Passport
namedocumentNumbernationalityNamedateOfBirthdateOfExpiryplaceOfBirth
Občanský průkaz
Testované české rozložení přední a zadní strany
Příklady polí
EUIdFrontEUIdBack
namedocumentNumberpersonalNumbernationalityNameaddressdateOfExpiry
Faktura
Extrakce faktur podle obsahu a rozložení
Příklady polí
Invoice
invoiceNumbersupplierNamecustomerNamepaymentReferencelineItemsgrossTotalAI 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.

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ázkaPodpora 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.
Cestovní pasy
Všechny vydávající země s čitelnou ICAO TD3 MRZDalší tištěná pole závisí na národním rozložení.
Občanský průkaz
Strukturovaná extrakce pro testovanou českou přední a zadní stranuZobrazená 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.
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í
| Metoda | Cesta | Pole souboru | Smlouva |
|---|---|---|---|
POST | /api/v1/ai/document-processing | File | JPEG, PNG, WebP nebo PDF; nejvýše 10 MB |
POST | /api/v1/ai/vehicle-processing | File | JPEG, PNG nebo WebP; pouze Detection a Blur |
POST | /api/v1/ai/document-processing/batches | Files | Více souborů; výsledky zůstávají seskupené podle souboru |
POST | /api/v1/ai/vehicle-processing/batches | Files | Více snímků vozidel; pouze Detection a Blur |
POST | /api/v1/signature-comparisons | Candidate + References | Jeden kandidát, 3 až 5 referencí; při úspěchu přesně 1 kredit |
POST | /api/v1/face-comparisons | ReferenceImage / ReferenceArtifactId + CandidateImage / CandidateArtifactId | 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. |
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.
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.
{
"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-comparisonsZí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.
curl --request POST "$SCANVERION_API_URL/api/v1/face-comparisons" \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "Idempotency-Key: face-comparison-001" \
--form "ReferenceImage=@reference.jpg;type=image/jpeg" \
--form "CandidateImage=@candidate.png;type=image/png" \
--form "Policy=balanced"{
"requestId": "face-comparison-001",
"decision": "ManualReview",
"similarity": 88.4,
"policy": "balanced",
"reviewRequired": true,
"reasons": [
"multiple_eligible_faces_best_pair"
],
"providerModel": "model-version",
"credits": 2,
"referenceFace": {
"bounds": {
"left": 0.12,
"top": 0.18,
"width": 0.4,
"height": 0.5
},
"landmarks": [
{
"type": "eyeLeft",
"x": 0.24,
"y": 0.33
}
]
},
"candidateFace": {
"bounds": {
"left": 0.2,
"top": 0.12,
"width": 0.38,
"height": 0.48
},
"landmarks": [
{
"type": "eyeLeft",
"x": 0.3,
"y": 0.27
}
]
}
}import { readFile } from "node:fs/promises";
import { randomUUID } from "node:crypto";
import { Scanverion } from "@scanverion/sdk";
const client = new Scanverion({
apiKey: process.env.SCANVERION_API_KEY ?? "",
baseUrl: "https://api.scanverion.com",
});
const result = await client.faces.compare({
reference: { image: await readFile("reference.jpg"), contentType: "image/jpeg" },
candidate: { artifactId: "workspace-portrait-id" },
idempotencyKey: randomUUID(),
});import os
from pathlib import Path
from uuid import uuid4
from scanverion import Scanverion, FaceComparisonInput
client = Scanverion(api_key=os.environ["SCANVERION_API_KEY"],
base_url="https://api.scanverion.com")
result = client.faces.compare(
FaceComparisonInput(image=Path("reference.jpg")),
FaceComparisonInput(artifact_id="workspace-portrait-id"),
idempotency_key=str(uuid4()),
)using Scanverion;
using var client = new ScanverionClient(
Environment.GetEnvironmentVariable("SCANVERION_API_KEY")!,
baseUri: new Uri("https://api.scanverion.com"));
await using var reference = File.OpenRead("reference.jpg");
var result = await client.Faces.CompareAsync(
new FaceComparisonInput(reference, "reference.jpg", "image/jpeg"),
new FaceComparisonInput(ArtifactId: "workspace-portrait-id"),
Guid.NewGuid().ToString());scanverion face compare reference.jpg candidate.png --idempotency-key face-comparison-001 --output json{
"reference": { "imageBase64": "<JPEG base64>", "fileName": "reference.jpg", "contentType": "image/jpeg" },
"candidate": { "imageBase64": "<PNG base64>", "fileName": "candidate.png", "contentType": "image/png" },
"policy": "balanced",
"idempotencyKey": "face-comparison-001"
}Š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.
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íč.
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.
{
"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.
function decodeSearchVector(index: {
formatVersion: string; dimensions: number; encoding: string;
metric: string; aggregationVersion: string; vector: string;
}): number[] {
if (index.formatVersion !== "identity-template-search-v2" ||
index.dimensions !== 128 || index.encoding !== "float32-le-base64" ||
index.metric !== "cosine" ||
index.aggregationVersion !== "normalized-weighted-centroid-cosine-v1")
throw new Error("Unsupported search index");
if (index.vector.length !== 684) throw new Error("Invalid vector size");
const bytes = Buffer.from(index.vector, "base64");
try {
if (bytes.length !== 512 || bytes.toString("base64") !== index.vector)
throw new Error("Invalid vector encoding");
const vector: number[] = [];
for (let position = 0; position < 128; position++)
vector.push(bytes.readFloatLE(position * 4));
const norm = vector.reduce((sum, value) => sum + value * value, 0);
if (!vector.every(Number.isFinite) || Math.abs(norm - 1) > 0.001)
throw new Error("Invalid normalized vector");
return vector;
} finally { bytes.fill(0); }
}CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE person_face_template (
workspace_id uuid NOT NULL,
person_id uuid NOT NULL,
template_token text NOT NULL,
expires_at timestamptz NOT NULL,
compatibility_version text NOT NULL,
selection_version text NOT NULL,
aggregation_version text NOT NULL,
face_vector vector(128) NOT NULL,
PRIMARY KEY (workspace_id, person_id)
);
CREATE INDEX person_face_template_cosine
ON person_face_template USING hnsw (face_vector vector_cosine_ops);3. 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.
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ý.
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.
- 1Vytvoření na backendu
Získejte oprávnění a vytvořte jednu krátkodobou relaci.
- 2Snímání v Reactu
Předejte vrácenou relaci komponentě Scanverion.
- 3Nač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ší.
npm install react react-dom
npm install @scanverion/sdk@0.1.1 @scanverion/liveness-react@0.1.0Vytvoř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.
import { randomUUID } from "node:crypto";
import { Scanverion } from "@scanverion/sdk";
const client = new Scanverion({
apiKey: process.env.SCANVERION_API_KEY ?? "",
baseUrl: "https://api.scanverion.com",
});
export async function createAuthorizedCapture() {
return client.liveness.createSession({
processingAuthorized: true,
idempotencyKey: randomUUID(),
});
}
export async function readOwnedAssessment(sessionId: string, accessToken: string) {
return client.liveness.getResult({ sessionId, accessToken });
}import os
from uuid import uuid4
from scanverion import Scanverion
client = Scanverion(api_key=os.environ["SCANVERION_API_KEY"],
base_url="https://api.scanverion.com")
def create_authorized_capture():
return client.liveness.create_session(
processing_authorized=True, idempotency_key=str(uuid4()))
def read_owned_assessment(session_id, access_token):
return client.liveness.get_result(
session_id=session_id, access_token=access_token)import os
from uuid import uuid4
from scanverion import AsyncScanverion
def liveness_client():
return AsyncScanverion(api_key=os.environ["SCANVERION_API_KEY"],
base_url="https://api.scanverion.com")
async def create_authorized_capture():
async with liveness_client() as client:
return await client.liveness.create_session(
processing_authorized=True, idempotency_key=str(uuid4()))
async def read_owned_assessment(session_id, access_token):
async with liveness_client() as client:
return await client.liveness.get_result(
session_id=session_id, access_token=access_token)using Scanverion;
using var client = new ScanverionClient(
Environment.GetEnvironmentVariable("SCANVERION_API_KEY")!,
baseUri: new Uri("https://api.scanverion.com"));
Task<FaceLivenessSession?> CreateAuthorizedCapture() =>
client.Liveness.CreateSessionAsync(true, Guid.NewGuid().ToString());
Task<FaceLivenessResult?> ReadOwnedAssessment(string sessionId, string accessToken) =>
client.Liveness.GetResultAsync(sessionId, accessToken);Snímání v Reactu
"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.
{
"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
curl --request POST 'https://api.scanverion.com/api/v1/face-liveness/sessions' \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $(uuidgen)" \
--data '{"processingAuthorized":true}'
# After camera completion, using values retained by your backend:
curl "https://api.scanverion.com/api/v1/face-liveness/sessions/$SESSION_ID" \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "X-Liveness-Access-Token: $LIVENESS_ACCESS_TOKEN"{
"create": {
"name": "create_liveness_session",
"arguments": {
"processingAuthorized": true,
"idempotencyKey": "unique-per-intentional-capture"
}
},
"afterCapture": {
"name": "get_liveness_result",
"arguments": {
"sessionId": "00000000-0000-4000-8000-000000000001"
}
}
}MCP 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 | Účel | Závislost nebo omezení |
|---|---|---|
| Detection | Vyhledá a klasifikuje objekty dokumentu nebo vozidla. | U většiny dokumentových postupů se přidá automaticky. |
| Scanner | Extrahuje typovaná pole z podporovaných dokumentů. | Vyžaduje jej LostOrStolenCardCheck. |
| Rotation | Uvádí orientaci dokumentu. | Přidá jej FaceExtraction. |
| Blur | Vyhodnotí rozmazání obrázku. | Podporováno pro dokumenty a vozidla. |
| FaceDetection | Najde tváře v detekovaném dokumentu. | Přidá jej FaceExtraction. |
| FaceExtraction | Vrá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ů. |
| CheckboxDetection | Vyhodnocuje nakonfigurované oblasti zaškrtávacích polí. | CheckboxDefinitions musí být platný JSON. |
| SignatureDetection | Vyhledá podpisy v dokumentu. | Pouze detekce v dokumentu; vizuální porovnání používá samostatný endpoint. |
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.
{
"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.
| Metoda | Cesta | Vstup |
|---|---|---|
POST | /api/v1/validation/id-cards/lost-or-stolen | Tělo JSON: cardNumber a cardType |
GET | /api/v1/validation/postal-codes | Query: address a volitelný countryCode=SK nebo SVK |
curl --request POST "$SCANVERION_API_URL/api/v1/validation/id-cards/lost-or-stolen" \
--header "Authorization: Bearer $SCANVERION_API_KEY" \
--header "Content-Type: application/json" \
--data '{ "cardNumber": "AA123456", "cardType": "nationalId" }'10 / Úč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.
| Metoda | Cesta | Vrácené údaje |
|---|---|---|
GET | /api/v1/usage/summary | Volání a vážené kredity za období |
GET | /api/v1/usage/daily | Denní součty volání a kreditů |
GET | /api/v1/usage/by-capability | Součty seskupené podle účtované funkce |
GET | /api/v1/usage/price-preview | Náhled zahrnutých kreditů, nadlimitní ceny a celku v EUR |
11 / Obnova
Chyby a strategie opakování
Řešte chyby autentizace, oprávnění, validace, duplicit a poskytovatelů.
| Stav | Význam | Akce klienta |
|---|---|---|
401 Unauthorized | Klíč 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 Required | Oprávnění pracovního prostoru nebo limit zpracování je vyčerpaný. | Změňte tarif nebo nastavení nadlimitního účtování. |
409 Conflict | Idempotency key již rezervoval tento požadavek na zpracování. | Považujte jej za stejný pokus; nevytvářejte nový klíč bez důvodu. |
422 Unprocessable Entity | Soubor, kombinace operací, pole, rozsah dat nebo validační vstup nejsou platné. | Před opakováním opravte požadavek. |
502 Bad Gateway | Nadř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 Unavailable | Potř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.
Hostované HTTP
OAuth 2.0Hostované 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.
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.
{
"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