InvoRec API
Invoice parsing, programmatically. A REST API for turning invoice PDFs and images into structured data — JSON in, JSON out, async by default, with signed webhooks for delivery.
Base URL
Every request must be made over HTTPS and authenticated with a bearer token. Browse the topics and endpoints in the sidebar; request and response examples appear on the right.
Conventions
- All timestamps are integer Unix seconds (UTC).
- Monetary amounts are integers in the smallest currency unit (e.g.
1250for €12.50). - Object IDs are type-prefixed: invoices
inv_…, schemassch_…, eventsevt_…. - Collections return at most
100items per page. See pagination.
Authentication
Authenticate every request with a bearer token issued from the dashboard. Treat live keys like passwords.
Provide the key in the Authorization header. Keys come in two flavors:
invr_live_…— production traffic against real data.invr_test_…— sandboxed traffic. Same surface, fixtures only, never billed.
Errors
InvoRec uses conventional HTTP status codes. Every error returns a JSON body
with a stable code string and a human-readable message.
Branch on code — it is stable across versions. The message is for
humans and may change.
Rate limits
API access requires the Business plan. Default limits are 60 requests/minute and 1,000 invoice uploads/hour per workspace, enforced per-key and per-IP.
Every response carries the current quota state in X-RateLimit-* headers; a
429 includes Retry-After.
Idempotency
All mutating endpoints accept an Idempotency-Key header. Replays
return the original response within a 24-hour window — safe to retry on timeout.
Choose a unique string per logical operation (UUIDs work well). Reusing the same key with a
different body returns 409 idempotency_conflict.
Pagination
List endpoints return cursor-paginated results. Cursors are opaque tokens; never construct them by hand.
Pass limit (default 25, max 100) and the
cursor from the previous response. Every list response includes
has_more and next_cursor.
Versioning
The current stable surface is v1. Versions are dated; the version
is part of the URL and backwards-incompatible changes ship as a new dated version.
Pin your client to a known version. The header InvoRec-Version: 2026-04-08
overrides the workspace default per request.
Non-breaking changes
- Adding new endpoints, fields, enum values or optional parameters.
- Adding new event types and new error
codevalues.
Webhooks overview
InvoRec delivers asynchronous results by POSTing signed JSON to your endpoints. Use this in place of polling.
- At-least-once. Endpoints must be idempotent — the same
evt_…can arrive twice. - Retries. Transient failures are retried with exponential backoff for up to 24 hours.
- Order. Events for the same invoice are delivered in order; across invoices they may interleave.
Signature verification
Every webhook carries an InvoRec-Signature header. Verify it
before trusting the body — anyone can POST to your URL.
The header has two comma-separated values: t=<unix_seconds> and
v1=<hex>, an HMAC-SHA256 of "<t>.<raw_body>" keyed
with your endpoint secret. Reject timestamps drifting more than ±300 seconds.
Retry policy
A delivery succeeds on any 2xx within 15 seconds. Failures retry
on exponential backoff; persistent failures disable the endpoint.
- Backoff schedule: 1m, 5m, 15m, 1h, 6h, 24h, then stop.
- Acknowledge fast (return
200immediately) and process asynchronously. - Deduplicate by event
id— it is stable across retries.
GET List webhooks
POST Create webhook
Parameters
url string · body optional | — |
events array<string> · body optional | — |
description string · body optional | — |
GET Retrieve webhook
Parameters
id string · path required | — |
PATCH Update webhook
Parameters
id string · path required | — |
url any · body optional | — |
events any · body optional | — |
description any · body optional | — |
enabled any · body optional | — |
DEL Delete webhook
Parameters
id string · path required | — |
GET List invoices
Parameters
cursor string · query optional | — |
limit int32 · query optional | — |
status string · query optional | — |
created_after string · query optional | — |
created_before string · query optional | — |
POST Create invoice
Parameters
schema_id string · query optional | — |
Idempotency-Key string · header optional | — |
file binary · body required | — |
POST Reprocess invoice
Parameters
id string · path required | — |
Idempotency-Key string · header optional | — |
GET Retrieve invoice
Parameters
id string · path required | — |
PATCH Update invoice
Parameters
id string · path required | — |
invoiceNumber any · body optional | — |
invoiceDate any · body optional | — |
dueDate any · body optional | — |
vendorName any · body optional | — |
vendorEmail any · body optional | — |
vendorPhone any · body optional | — |
vendorTaxId any · body optional | — |
vendorAddress any · body optional | — |
customerName any · body optional | — |
customerEmail any · body optional | — |
customerPhone any · body optional | — |
customerTaxId any · body optional | — |
customerAddress any · body optional | — |
subtotalAmount any · body optional | — |
taxAmount any · body optional | — |
totalAmount any · body optional | — |
taxRate any · body optional | — |
discountAmount any · body optional | — |
discountPercent any · body optional | — |
currency any · body optional | — |
paymentTerms any · body optional | — |
paymentMethod any · body optional | — |
paymentStatus any · body optional | — |
notes any · body optional | — |
customFields any · body optional | — |
DEL Delete invoice
Parameters
id string · path required | — |
GET File invoice
Parameters
id string · path required | — |
GET List schemas
GET Retrieve schema
Parameters
id string · path required | — |