billing

GET /v1/invoices/{invoiceId}/pdf

Download the invoice or credit note as a PDF, in a chosen language.

All billing endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The endpoint checks billing.view; a key without it is refused with 403, not 404.

This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X GET https://api.zinndigital.com/v1/invoices/{invoiceId}/pdf \
  -H "Authorization: Bearer zdk_live_…"

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

The rendered legal document (#708, docs/34 §4.2) — server-side HTML→PDF, in all 58 locales including RTL, with embedded fonts covering Latin, Greek, Cyrillic, CJK, Arabic and Hebrew. Rendered from the invoice's immutable snapshot, never from live data: a customer who has since moved still sees the address that was on the document, because a re-render that updated it would be a different legal document under the same number. That is also what makes the render deterministic and the cache disposable. ⭐ Labels translate; numbers, tax wording and the document identity do not. The invoice number, the amounts and the dates keep their canonical form, and the English document is the authoritative original — a translated rendering is a copy of the same numbered document for the customer's convenience and says so in its footer. Answers a short-lived signed URL rather than the bytes, so a multi-megabyte document never transits the engine twice. ⛔ When no document bucket is configured in an environment the response is the PDF itself (application/pdf) rather than a refusal: the cache is an optimisation, and a customer must not be unable to download their own invoice because a bucket is missing.

Parameters

NameTypeRequiredWhat it is
invoiceId (path)UuidYesThe billing document's id. This is the Invoice/CreditNote id — not the order's. It was the order's id while /v1/invoices projected orders (docs/34 §7); the projection…
locale (query)stringNoLanguage to render in. Defaults to the account's own. A language this platform does not ship is a 422 rather than a silent fallback — and it is validated because the value…

Response

NameTypeRequiredWhat it is
urlstringYesMinted per request and never persisted — it expires in minutes, so storing it in a list payload or a cache would hand a client a link that is already dead.
expires_atstringNo—
localestringYesThe language the document was rendered in.

Errors this endpoint can return

401 · 403 · 404 · 422 · 429 · 503