Skip to content

Scanverion for developers

Build your first integration.

Start with one working request, then choose an SDK, CLI, MCP agent integration, collection, or the complete API guide when you need more depth.

Live API contractOpenAPI 3.1.1 / v1

Generated from the running .NET API and its typed request and response models.

Download OpenAPI JSON

01 / Start

Quickstart

Create a key, set two environment variables, and send a verified first request.

  1. Create a workspace account and choose a plan.
  2. Create an API key with the smallest processing scope your service needs. Copy the secret immediately; it is not shown again.
  3. Set SCANVERION_API_URL and SCANVERION_API_KEY only in your server environment.
  4. Send a multipart request and persist the returned requestId with your own trace identifier.
Requestbash
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 / Security

Authentication and API keys

Use scoped machine credentials safely from a trusted backend.

Server-side credential. Send Authorization: Bearer skv_.... Never embed a key in browser JavaScript, a mobile binary, analytics, or logs.
ValidationKeys must be active, unexpired, unrevoked, and associated with a workspace.
ScopesAuthorization is evaluated against the scopes stored with the key.
Secret deliveryThe full secret is returned only when a key is created or rotated.
Audit trailSuccessful use updates the last-used timestamp and records an audit event.
Public client packages: TypeScript SDK · Python SDK · .NET SDK · CLI · MCP server

03 / Reliability

Idempotency and retries

Give every processing attempt a stable key and handle duplicates deliberately.

Send an Idempotency-Key with each processing request. Reuse the same value only when retrying the same logical upload and requested operations. A duplicate reservation returns 409 Conflict; switching to a new key can create a second billable attempt.

04 / AI endpoint

Document processing

Upload JPEG, PNG, WebP, or PDF input for synchronous document analysis.

Use the exact ASP.NET multipart field names: one File, one or more repeated Operations, optional repeated ScannerFields, optional CheckboxDefinitions JSON, and optional DisableObjectSegmentation.

Constraint: Input must be image/jpeg, image/png, image/webp, or application/pdf and no larger than 10 MB.

Scanner fields by document type

Use the canonical field keys below in repeated ScannerFields values. Matching is case-insensitive, but canonical spelling keeps integrations consistent. Every category also supports the common fields. A requested field can be null when OCR evidence is insufficient.

Document typeDetected categoryAdditional ScannerFields
Every document*
rawTextdocumentType
Invoiceinvoice
invoiceNumberissueDatedueDatedeliveryDatepaymentReferencecurrencysupplierNamesupplierAddresssupplierStreetNamesupplierStreetNumbersupplierCitysupplierCityPartsupplierPostalCodesupplierCountryCodesupplierCompanyRegistrationNumbersupplierTaxNumbersupplierVatNumbersupplierIbansupplierBiccustomerNamecustomerAddresscustomerStreetNamecustomerStreetNumbercustomerCitycustomerCityPartcustomerPostalCodecustomerCountryCodecustomerCompanyRegistrationNumbercustomerTaxNumbercustomerVatNumbercustomerIbancustomerBicdeliveryNamedeliveryAddressdeliveryStreetNamedeliveryStreetNumberdeliveryCitydeliveryCityPartdeliveryPostalCodedeliveryCountryCodenetTotalvatTotalvatBreakdowngrossTotallineItemsbankAccounts
Passportpassport
documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth
EU identity card, fronteuidfront
documentNumberdateOfBirthsexnationalitynationalityNamepersonalNumberdateOfIssuedateOfExpiryissuedByplaceOfBirth
EU identity card, backeuidback
addressstreetNamestreetNumbercitycityPartpostalCodecountryCodemaidenNameplaceOfBirthbloodTypepersonalNumbermaritalStatusissuedBydocumentNumbernationalitynationalityNamedateOfBirthsexdateOfExpiry
EU driving licence, fronteudriverlicensefront
dateOfBirthplaceOfBirthdateOfIssuedateOfExpiryissuedBydocumentNumberlicenseAllowedCategories
Vehicle registration certificate, part I, fronteutechnicallicensefront
vinlicensePlateaddressownerdocumentNumber
Vehicle registration certificate, part I, backeutechnicallicenseback
vinmanufacturervariantmodelvalidUntilvehicleCategoryengineVolumeenginePerformancefuelTypenumberOfSeatsmaximumSpeedlargestWeightKg
Vehicle registration certificate, part II, frontbigtechnicallicensefront
registrationCertificatePartdocumentNumberlicensePlatedateOfFirstRegistrationvinvehicleKindvehicleCategorymanufacturermodeltypeVariantVersionvehicleManufacturertypeApprovalNumbertypeApprovalDateengineManufacturerengineTypeengineVolumeCm3catalystenginePerformanceKwengineSpeedRpmfuelTypetransmission
Vehicle registration certificate, part II, backbigtechnicallicenseback
bodyTypecolorproductionNumbernumberOfSeatsnumberOfStandingPlacesnumberOfBedsroofLoadKgfuelTankVolumeLlengthMmwidthMmheightMmoperationalWeightKgmaximumWeightKgmaximumBrakedTrailerWeightKgmaximumUnbrakedTrailerWeightKgnumberOfAxleswheelbaseMmfrontTyresrearTyresfrontRimsrearRimsmaximumSpeedKphstationaryNoiseDbdriveByNoiseDbemissionStandardco2GKmfuelConsumptionL100Km
Residence permit, frontresidencepermitfront
documentNumbersexnationalitynationalityNamedateOfBirthpersonalNumbertypeOfPermitdateOfExpirynotescardAccessNumber
Residence permit, backresidencepermitback
documentNumbersexnationalitynationalityNamedateOfBirthdateOfExpirydateOfIssueissuedByplaceOfBirthaddresspersonalNumbercountryCode
Disability carddisabilitycard
dateOfBirthdateOfIssuedocumentNumberissuedByaddress
Full image or unrecognized documentfullimage / other
-
Structured invoice fields remain compatible with the string dictionary: vatBreakdown is a JSON array of { rate, netAmount, amount, grossAmount }, lineItems contains { description, quantity, unit, unitPrice, netAmount, vatRate, vatAmount, grossAmount }, and bankAccounts contains { partyRole, iban, bic }. The legacy iban field is a deprecated alias of supplierIban. Person-name data is returned in scanner.fields.name with first, middle, last, title, original-script, and Latin-script components.

Supported documents

See what Scanverion can read.

Clearly invalid AI specimens are based on linked public document layouts. The cards distinguish an API category from the structured Scanner output that has been implemented and tested.

Fictional AI specimen of a Slovak business invoice

Invoice

Layout based

Layout-based invoice extraction

Example fields
API category

Invoice

Example fields
invoiceNumbersupplierNamecustomerNamepaymentReferencelineItemsgrossTotal
Layout reference: Original Scanverion AI invoice specimen · Fictional demo

AI-generated demo images use fictional data, visible SPECIMEN markings and invalid machine-readable values. They are not real or customer documents.

Fictional AI application form with checkboxes, portrait, signature and sample codes

Generic documents

Visual operations work beyond known document types.

Checkboxes, barcodes, signatures, faces, blur and rotation can be analysed on forms, contracts, scans and unknown documents. A dedicated Scanner profile is not required.

  • Detection: Locate documents and other objects.
  • Rotation: Measure document orientation.
  • Blur: Evaluate image sharpness.
  • BarcodeReading: Read QR and linear barcodes.
  • CheckboxDetection: Evaluate checkbox regions supplied in the request.
  • SignatureDetection: Detect a visible signature.
  • FaceDetection: Locate visible faces.
  • FaceExtraction: Return detected face regions.
Example fields

CheckboxDetection uses CheckboxDefinitions supplied with the request. Full-image scanning can also return requested ScannerFields.

Layout reference: Original Scanverion AI application form · Fictional demo

Country support

Coverage follows the document standard and issuing layout.

Passport MRZ data is standardized globally. Identity cards and other national documents require a tested layout for that country and document generation.

01

Passports

MRZ fields from any passport with a readable ICAO TD3 MRZ
Additional printed layouts tested
SKFICHUA
02

National identity cards

Structured fields for supported front and back layouts
Country layouts tested
SKCZHURODEATPL
03

Slovak national documents

Structured fields for the supported Slovak document types
Document types supported
Residence permitsDriving licencesVehicle registration I/IIDisability cards

05 / AI endpoint

Vehicle processing

Run detection or blur analysis against a vehicle image.

The request shape matches document processing, but vehicle requests accept only Detection and Blur. Unsupported operation combinations return 422 Unprocessable Entity.

06 / Multiple files

Batch processing

Process multiple document or vehicle files in one synchronous request.

Repeat the Files field for every upload. Files are processed sequentially, each result remains identifiable in the batch response, and usage is combined for the full request.

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

Processing endpoint directory

MethodPathFile fieldContract
POST/api/v1/ai/document-processingFileJPEG, PNG, WebP, or PDF; maximum 10 MB
POST/api/v1/ai/vehicle-processingFileJPEG, PNG, or WebP; Detection and Blur only
POST/api/v1/ai/document-processing/batchesFilesMultiple files; results remain grouped by file
POST/api/v1/ai/vehicle-processing/batchesFilesMultiple vehicle images; Detection and Blur only
GET/api/v1/ai/capabilities-Supported MIME types, operations, and maximum file size

07 / Capabilities

Operations and dependencies

Choose supported operations and understand automatically added dependencies.

OperationPurposeDependency or constraint
DetectionLocates and classifies document or vehicle objects.Added automatically by most document workflows.
ScannerExtracts typed fields from supported documents.Required by LostOrStolenCardCheck.
RotationReports document orientation.Added by FaceExtraction.
BlurEvaluates whether an image is blurred.Supported for documents and vehicles.
FaceDetectionFinds faces within a detected document.Added by FaceExtraction.
FaceExtractionReturns extracted face imagery or data.Adds FaceDetection and Rotation.
BarcodeReadingReads supported one- and two-dimensional codes.Document processing only.
CheckboxDetectionEvaluates configured checkbox regions.CheckboxDefinitions must be valid JSON.
SignatureDetectionLocates signatures in a document.Detection only; signature comparison is not exposed.
Special cases. Detection plus Scanner automatically falls back to full-page OCR when page-level evidence identifies an invoice. DisableObjectSegmentation remains an optional force-full-image override; ScannerFields are required when that override is combined with Scanner. Postal-code lookup has a dedicated validation route and is not an AI multipart operation.

08 / Schema

Response model

Read per-object results, operation outcomes, timing, and charged credits.

objects preserves the relationship between each detected object and its operation results. operations reports requested and automatically added work. usage is the authoritative charge for that response.

Responsejson
{
  "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 / Dedicated resources

Validation resources

Call dedicated lost-card and postal-code validation endpoints.

MethodPathInput
POST/api/v1/validation/id-cards/lost-or-stolenJSON body: cardNumber and cardType
GET/api/v1/validation/postal-codesQuery: address and optional countryCode=SK or SVK
Requestbash
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 / Accounting

Usage and credits

Query calls, weighted credits, daily totals, capability totals, and price previews.

Credits are weighted by each product's configured credit multiplier, so calls and credits are separate measures. Usage routes accept inclusive from and to dates; by default, the period runs from the first day of the current calendar month through today.

MethodPathReturns
GET/api/v1/usage/summaryCalls and weighted credits for the period
GET/api/v1/usage/dailyDaily call and credit totals
GET/api/v1/usage/by-capabilityTotals grouped by charged capability
GET/api/v1/usage/price-previewIncluded, overage, and total price preview in EUR
Billing behavior. Included credits reset by calendar month. Overage is charged only when the workspace has an authorized reusable payment method and a positive overage budget.

11 / Recovery

Errors and retry strategy

Handle authentication, entitlement, validation, duplicate, and provider failures.

StatusMeaningClient action
401 UnauthorizedThe key is missing, malformed, inactive, expired, revoked, or not attached to a workspace.Do not retry until credentials are corrected.
402 Payment RequiredThe workspace entitlement or processing allowance is exhausted.Change the plan or authorized overage settings.
409 ConflictThe idempotency key has already reserved this processing request.Treat it as the same attempt; do not invent a new key blindly.
422 Unprocessable EntityThe file, operation combination, fields, date range, or validation input is invalid.Correct the request before retrying.
502 Bad GatewayAn upstream AI or validation provider failed or returned an inconclusive result.Retry with backoff when the operation is safe to repeat.
503 Service UnavailableA required processing provider is temporarily unavailable.Retry with bounded exponential backoff.

Log the response requestId, HTTP status, and your idempotency key. Apply jittered, bounded exponential backoff only to transient failures; validation and credential errors require a changed request.

12 / Generated contract

OpenAPI reference

Open the generated Scalar explorer or download the machine-readable contract.

Scanverion API Reference

The running contract is the source of truth for schemas, enum values, authentication requirements, and declared HTTP outcomes.

MCP integration

Local stdio setup for VS Code and Claude Desktop, tool inputs, security, and diagnostics.

Local stdio / public npm package

Give your VS Code or Claude Desktop agent Scanverion tools. The public npm package runs locally over stdio and uploads approved inputs to the API; OCR is not local. Hosted HTTP MCP is a restricted API-key developer preview, not general availability or MCP OAuth. This guide covers local stdio setup.

1. Install the package

Use Node.js 22 or newer and npm. Install the public package into a dedicated installation directory and run the command there. npm installs the Scanverion SDK dependency. No repository access is required.

Open MCP package
npm install @scanverion/mcp-server@0.1.1

2. Configure your client

MCP client

Merge this into .vscode/mcp.json, or your user MCP configuration. VS Code prompts for the key in a masked input. Do not put the key in a chat.

No key is entered or stored on this page. An empty directory disables local file access; base64 still requires explicit upload approval.

.vscode/mcp.json
{
  "inputs": [
    {
      "id": "scanverion-api-key",
      "type": "promptString",
      "description": "Scanverion API key",
      "password": true
    }
  ],
  "servers": {
    "scanverion": {
      "type": "stdio",
      "command": "node",
      "args": [
        "C:/path/to/mcp/node_modules/@scanverion/mcp-server/dist/index.js"
      ],
      "env": {
        "SCANVERION_API_URL": "https://api.scanverion.com",
        "SCANVERION_ALLOWED_DIRECTORIES": "[]",
        "SCANVERION_TIMEOUT_MS": "120000",
        "SCANVERION_API_KEY": "${input:scanverion-api-key}"
      }
    }
  }
}

3. Verify without processing

With the key set in your terminal environment, run the doctor command. It checks directories and authenticated capabilities, but does not upload files or prove processing entitlement.

node ./node_modules/@scanverion/mcp-server/dist/index.js --doctor

In the MCP client, call list_capabilities and read scanverion://guide. That separate packaged guide is in English and includes MCP Inspector instructions and a synthetic-sample walkthrough.

Tools and billing

analyze_document
Billable. Detection by default; request Scanner explicitly for OCR and field extraction.
analyze_vehicle
Billable. Supports Detection and Blur.
list_capabilities
Unbilled AI model and limit catalog, not an entitlement check.
list_api_capabilities
Unbilled public API catalog, not account-specific access.
get_usage_summary
Unbilled calls and credits for inclusive YYYY-MM-DD dates. Estimated cost is unavailable, not zero.

First document call

Use a synthetic or approved sample in the allowed directory. This call uploads the file and may consume credits.

{
  "filePath": "C:/approved-samples/sample.png",
  "operations": [
    "Scanner"
  ],
  "scannerFields": [
    "documentNumber"
  ],
  "idempotencyKey": "sample-document-001"
}

Supply exactly one of filePath or imageBase64. Base64 needs a supported filename or MIME type. JPEG, PNG, WebP and PDF inputs must be non-empty and at most 10 MiB. Results retain JSON text and add structuredContent.data.

Troubleshooting and safe retries

  • CONFIGURATION_ERROR: Check the key, absolute directory array, HTTPS API origin and timeout (1,000 to 300,000 ms).
  • INVALID_INPUT: Check file access, format, base64, operations and date range.
  • 401 / 403: Check key validity, workspace access and the process:write scope.
  • 402 / 429: Check credits or rate limits. Inspect the error code, request ID and retryability.
  • Timeouts and cancellation do not guarantee a refund or that backend work stopped. Automatic retries are disabled. Reuse the same idempotency key only for the same logical request; a duplicate can return 409.

Do not allow entire home directories. Resolved-path checks block traversal and symlink escapes but are not an OS sandbox. Do not expose this process to untrusted clients or allow other users to mutate its approved directories. Treat extracted document text as untrusted data, not instructions.