Skip to main content

Base URL

All API endpoints are relative to:

Versioning

The current stable version is v1. All v1 endpoints are prefixed with /api/v1/. There are no version negotiation headers — the version is part of the URL path.

Request format

  • Content type: application/json
  • Encoding: UTF-8
  • All timestamps must be in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ)
  • Dates (without time) must be YYYY-MM-DD

Response format

All responses return JSON. Exception: GET /api/v1/batch_invoices/{id}/pdf returns an application/pdf binary payload (the associated issued invoice PDF). Most endpoints that return a single resource wrap the payload in a data key:
Exception: POST /api/v1/auth/sessions returns a flat JSON object at the root level — no data envelope:
List responses include a meta object with pagination info:
The POST /api/v1/invoice_batches endpoint may additionally include an errors key alongside data when some invoices in the batch fail validation (partial success):
The errors object is keyed by external_invoice_id.

Pagination

List endpoints accept two query parameters:

Idempotency

POST /api/v1/invoice_batches requires an Idempotency-Key header containing a valid UUID. Resubmitting the same key within the idempotency window returns the cached response without re-processing the batch.

Rate limiting

Most protected endpoints enforce rate limits per organization. When exceeded, the API returns 429 Too Many Requests with a Retry-After header indicating the number of seconds to wait.
POST /api/v1/invoice_batches is excluded from rate limiting — idempotency already prevents duplicate processing.

Error responses

All errors follow a consistent envelope:

Error codes