Overview

Digitizer API reference

Use the Digitizer API to digitize business documents - invoices, bills, receipts and similar. Upload a scan or a camera photo and get back normalized fields, line items, per-field confidence, and reconciliation warnings — with no templates to configure and nothing to train.

Every business document uses /api/v1/documents and the same public schema. Responses include the page count and a meta.request_id for support. Printed values, calculated amounts, and fields needing review are identified through field_status.

All successful responses use { success, data, meta }. List endpoints return items and pagination fields inside data. Dates are ISO 8601, amounts are plain decimals, and empty collections come back as [].
POSThttps://digitizer.ee/api/v1/documents

Line amounts and review

Every document uses the same line schema: net_unit_price and unit_price are net and gross prices before line discounts. subtotal is the net line amount after discounts; vat_amount is its tax; total is its gross amount. The deprecated amount always equals total, including null.

VAT rates use percentage points: 20 means 20%. Unknown or ambiguous values are null. Unit prices may have more decimal places than currency totals. Printed values are retained; calculated line taxes may include a minor-unit adjustment to match document tax totals.

field_status reports read, derived, enriched, or review. Check review_fields and warnings before posting data. Confidence scores are indicative, not guarantees of correctness.

For base64 uploads, send a JSON object with content, content_type, and optional filename. A pages array contains independent files: the synchronous endpoint processes only the first; the batch endpoint processes each separately.

Reference

Endpoints

The reference covers documents, batch jobs, metadata, and workspace usage: documents, jobs, and metadata. Use the request and response schemas in /openapi.json.

Documents

Documents

Upload, retrieve, list, and delete normalized document results.

Base path /api/v1/documents

Extract a document

Upload a PDF or image and receive normalized document data synchronously. Multipart file uploads and base64 JSON are supported. If multiple files or pages entries are supplied, only the first is processed; meta.ignored_files reports the rest. Use the batch endpoint for multiple documents.

POSThttps://digitizer.ee/api/v1/documents

Body

filebodyrequired
file·PDF, PNG, JPEG, WEBP, TIFF, or BMP; maximum 25 MiB per file and 10 pages per document.
hintsbody
string·Optional document context, such as a language or vendor name.
raw_textbody
boolean·Include document text when true. Default: false.
regionsbody
boolean·Include located field boxes when true. Coordinates range from 0 to 1000 on each page. Default: false.

Request

curl
curl --request POST \
  --url 'https://digitizer.ee/api/v1/documents' \
  --header 'X-API-Key: dig_live_xxxxxxxxxxxx' \
  --form '[email protected]' \
  --form 'regions=true'

Response

200 OK
{
  "success": true,
  "data": {
    "id": "doc_example",
    "filename": "invoice-1042.pdf",
    "content_type": "application/pdf",
    "size_bytes": 48320,
    "type": "document",
    "status": "processed",
    "is_document": true,
    "pages": 1,
    "confidence": 0.96,
    "created_at": "2026-09-22T09:12:44Z",
    "processing_ms": 2841,
    "extraction": {
      "document_number": "INV-1042",
      "issue_date": "2026-08-02",
      "currency": "USD",
      "subtotal": 4200,
      "vat_amount": 420,
      "total": 4620,
      "vat_rates": [
        {
          "rate": 10,
          "net": 4200,
          "vat": 420,
          "gross": 4620
        }
      ],
      "vendor": {
        "name": "Northwind Supply Co."
      },
      "line_items": [
        {
          "description": "Maintenance service",
          "code": "SVC-1042",
          "ean": null,
          "quantity": 2,
          "unit": "hour",
          "net_unit_price": 2100,
          "unit_price": 2310,
          "discount_percent": null,
          "discount_amount": null,
          "subtotal": 4200,
          "vat_rate": 10,
          "vat_amount": 420,
          "total": 4620,
          "amount": 4620
        }
      ]
    },
    "field_confidence": {
      "document_number": 0.99
    },
    "field_status": {
      "document_number": {
        "status": "read",
        "review": false
      },
      "line_items[0].total": {
        "status": "derived",
        "review": false
      }
    },
    "review_fields": [],
    "warnings": []
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: A document with normalized fields, line items, review status, and optional field locations and document text.

Create extraction batch

Submit up to 100 documents. The response is HTTP 202 with job ids; poll each job, then fetch its document_id. There is no separate batch polling endpoint. JSON pages entries represent independent documents, not pages to combine.

POSThttps://digitizer.ee/api/v1/documents/batch

Body

filesbodyrequired
file[]·Repeated files form field; up to 100 files, 25 MiB each.
hintsbody
string·Optional document context, such as a language or vendor name.
raw_textbody
boolean·Include document text when true. Default: false.
regionsbody
boolean·Include located field boxes when true. Coordinates range from 0 to 1000 on each page. Default: false.

Response

200 OK
{
  "success": true,
  "data": {
    "id": "bat_example",
    "status": "queued",
    "document_ids": [],
    "job_ids": [
      "job_example"
    ],
    "count": 1,
    "created_at": "2026-09-22T09:12:44Z"
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: A batch acceptance receipt with job ids in upload order.

List documents

Browse the complete document history for this API key, newest first. Pages contain up to 100 documents; follow next_cursor using the same search and filter until it is null. Limit defaults to 25.

GEThttps://digitizer.ee/api/v1/documents

Parameters

limitquery
integer·Results per page, 1-100. Default: 25.
cursorquery
string·Opaque next_cursor from the previous page. Omit for the first page.
qquery
string·Case-insensitive filename search across all history; maximum 254 characters.
filterquery
string·all (default), review, or duplicates. Applies across all history.

Response

200 OK
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "doc_example",
        "filename": "invoice-1042.pdf",
        "content_type": "application/pdf",
        "size_bytes": 48320,
        "type": "document",
        "status": "processed",
        "pages": 1,
        "confidence": 0.96,
        "created_at": "2026-09-22T09:12:44Z",
        "processing_ms": 2841
      }
    ],
    "count": 1,
    "pagination": {
      "limit": 25,
      "next_cursor": null
    }
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: Document summaries, count, and pagination metadata.

Get document

Retrieve the stored document result. Optional locations and text are available only if requested at upload.

GEThttps://digitizer.ee/api/v1/documents/{document_id}

Parameters

document_idpathrequired
string·Document id returned by extraction.

Response

200 OK
{
  "success": true,
  "data": {
    "id": "doc_example",
    "filename": "invoice-1042.pdf",
    "content_type": "application/pdf",
    "size_bytes": 48320,
    "type": "document",
    "status": "processed",
    "is_document": true,
    "pages": 1,
    "confidence": 0.96,
    "created_at": "2026-09-22T09:12:44Z",
    "processing_ms": 2841,
    "extraction": {
      "document_number": "INV-1042",
      "issue_date": "2026-08-02",
      "currency": "USD",
      "subtotal": 4200,
      "vat_amount": 420,
      "total": 4620,
      "vat_rates": [
        {
          "rate": 10,
          "net": 4200,
          "vat": 420,
          "gross": 4620
        }
      ],
      "vendor": {
        "name": "Northwind Supply Co."
      },
      "line_items": [
        {
          "description": "Maintenance service",
          "code": "SVC-1042",
          "ean": null,
          "quantity": 2,
          "unit": "hour",
          "net_unit_price": 2100,
          "unit_price": 2310,
          "discount_percent": null,
          "discount_amount": null,
          "subtotal": 4200,
          "vat_rate": 10,
          "vat_amount": 420,
          "total": 4620,
          "amount": 4620
        }
      ]
    },
    "field_confidence": {
      "document_number": 0.99
    },
    "field_status": {
      "document_number": {
        "status": "read",
        "review": false
      },
      "line_items[0].total": {
        "status": "derived",
        "review": false
      }
    },
    "review_fields": [],
    "warnings": []
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: The document result.

Delete document

Remove a document and its extraction from the business. This cannot be undone.

DELETEhttps://digitizer.ee/api/v1/documents/{document_id}

Parameters

document_idpathrequired
string·Document id to delete.

Response

200 OK
{
  "success": true,
  "data": {
    "id": "doc_example",
    "deleted": true
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: The deleted id and deleted=true.

Jobs

Jobs

Track documents submitted through batch uploads.

Base path /api/v1/jobs

Get job status

Poll a batch job no faster than once per second. Status is queued, processing, succeeded, or failed. On success, fetch document_id; on failure, inspect error.code.

GEThttps://digitizer.ee/api/v1/jobs/{job_id}

Parameters

job_idpathrequired
string·Job id from the batch response.

Response

200 OK
{
  "success": true,
  "data": {
    "id": "job_example",
    "status": "succeeded",
    "type": "document",
    "document_id": "doc_example",
    "error": null,
    "created_at": "2026-09-22T09:12:44Z",
    "updated_at": "2026-09-22T09:12:48Z"
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: Job status and result id or error.

Metadata

Metadata

Discover the schema and inspect business usage.

Base path /api/v1/metadata

List document types

Invoices, receipts, bills, and similar documents share the document type and one schema.

GEThttps://digitizer.ee/api/v1/metadata/document-types

Response

200 OK
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "document",
        "label": "Document",
        "fields": 20
      }
    ]
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: Supported document types and field counts.

List extractable fields

Get top-level field names, data types, nullability, and descriptions. Nested field schemas are defined in /openapi.json.

GEThttps://digitizer.ee/api/v1/metadata/fields

Parameters

typequery
string·Only document is supported; default: document.

Response

200 OK
{
  "success": true,
  "data": {
    "type": "document",
    "fields": {
      "document_number": {
        "type": "string",
        "nullable": true,
        "description": "Invoice, bill or receipt identifier."
      },
      "issue_date": {
        "type": "date",
        "nullable": true,
        "description": "Document date, ISO 8601."
      },
      "due_date": {
        "type": "date",
        "nullable": true,
        "description": "Payment due date."
      },
      "currency": {
        "type": "string",
        "nullable": true,
        "description": "ISO 4217 currency code."
      },
      "subtotal": {
        "type": "number",
        "nullable": true,
        "description": "Net of VAT."
      },
      "vat_amount": {
        "type": "number",
        "nullable": true,
        "description": "Total VAT."
      },
      "rounding": {
        "type": "number",
        "nullable": true,
        "description": "Rounding adjustment applied to reach the total."
      },
      "total": {
        "type": "number",
        "nullable": true,
        "description": "Gross amount printed."
      },
      "amount_due": {
        "type": "number",
        "nullable": true,
        "description": "Unpaid balance."
      },
      "vat_rates": {
        "type": "array",
        "nullable": true,
        "description": "VAT per rate: rate, net, vat, gross."
      },
      "vendor": {
        "type": "object",
        "nullable": true,
        "description": "Issuing party."
      },
      "customer": {
        "type": "object",
        "nullable": true,
        "description": "Billed party."
      },
      "line_items": {
        "type": "array",
        "nullable": false,
        "description": "Line item rows: description, code, ean, quantity, unit, gross unit_price, net_unit_price, discount_percent, discount_amount, subtotal, vat_rate, vat_amount, total. amount is a deprecated alias of total."
      },
      "banks": {
        "type": "array",
        "nullable": true,
        "description": "Every bank printed for payment: name, iban, swift_bic."
      },
      "account_number": {
        "type": "string",
        "nullable": true,
        "description": "Customer account number."
      },
      "previous_balance": {
        "type": "number",
        "nullable": true,
        "description": "Balance carried forward."
      },
      "payments_credits": {
        "type": "number",
        "nullable": true,
        "description": "Payments and credits applied."
      },
      "service_address": {
        "type": "string",
        "nullable": true,
        "description": "Address the service applies to."
      },
      "consumption": {
        "type": "object",
        "nullable": true,
        "description": "unit and value for metered documents."
      },
      "payment": {
        "type": "object",
        "nullable": true,
        "description": "Payment: method, card_number, card_last4, auth_code, reference, receipt_number, amount, tendered, change."
      }
    }
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: The selected type and its field definitions.

Get usage

Return all-time processing usage for the current business from its durable ledger, including usage for deleted documents. Legacy configured API keys report retained documents without a history cap.

GEThttps://digitizer.ee/api/v1/usage

Response

200 OK
{
  "success": true,
  "data": {
    "documents": 128,
    "pages": 143,
    "by_type": {
      "document": 128
    },
    "last_request_at": "2026-09-22T09:12:44Z"
  },
  "meta": {
    "request_id": "req_example"
  }
}

Returns: Business document counts, page counts, and last successful processing time.

Callbacks

Callbacks

Connect a business to your software with signed document notifications.

Base path /api/v1/callbacks

Get callback settings

Returns the current business callback and latest 20 deliveries. Signing secrets are never returned by GET.

GEThttps://digitizer.ee/api/v1/callback

Response

200 OK
{"success":true,"data":{"url":"","enabled":false,"updated_at":null,"deliveries":[]},"meta":{"request_id":"req_example"}}

Returns: Callback settings and delivery status.

Configure a callback

Configure one optional public HTTPS callback per business. Applies to new documents from API, dashboard, and approved email attachments. Read /docs/callbacks for signature verification and retries. Changing configuration cancels pending deliveries.

PUThttps://digitizer.ee/api/v1/callback

Body

urlbodyrequired
string·Public HTTPS endpoint on port 443; may be empty when disabled.
enabledbodyrequired
boolean·Enable delivery of document.processed notifications.
rotate_secretbody
boolean·Generate a new signing secret and cancel pending deliveries.

Request

curl
{
  "url": "https://software.example.com/webhook",
  "enabled": true
}

Response

200 OK
{"success":true,"data":{"url":"https://software.example.com/webhook","enabled":true,"updated_at":"2026-09-22T12:00:00Z","deliveries":[],"signing_secret":"whsec_example_only"},"meta":{"request_id":"req_example"}}

Returns: Updated settings; signing_secret is returned only on first setup or rotation.