Included with Pro
Send invoices from your own app
Your booking form, shop or job software already knows the work happened. The Billery API turns that into a branded invoice, quote or receipt - raised, numbered and emailed - without anyone opening a dashboard.
Billery handles the document, not the money. We never take payment from your customers.
curl https://app.billery.io/api/v1/receipts \ -H "Authorization: Bearer blry_live_..." \ -H "Idempotency-Key: order-4821" \ -d '{ "customer": { "name": "Ada Okafor", "email": "ada@example.com" }, "items": [ { "description": "Boiler service", "quantity": 1, "unit_price": 120 } ], "payment_method": "Card", "send": true }'{ "object": "receipt", "number": "RCP-0007", "total": 120, "payment_method": "Card", "pdf_url": "https://app.billery.io/i/8f2c.../pdf", "sent_at": "2026-09-23T09:14:22.104Z"}What you can send
Three documents, one API.
Invoices
Raise an invoice with your own numbering, payment terms and branding. Track it from draft to sent to paid.
POST /v1/invoicesQuotes
Send a priced quote with an expiry date. Accepted quotes convert to an invoice without retyping anything.
POST /v1/quotesReceipts
Already taken the money? Send proof of payment instead. Receipts are API-only for now, and don't count towards your free allowance.
POST /v1/receiptsBuilt for production
The awkward parts, handled.
Billing code fails at the worst moments - a dropped connection, a duplicate submit, a retry that bills twice. These are the guarantees that stop that becoming your customer's problem.
Test keys that touch nothing
A test key validates and prices a request exactly like a live one, then writes nothing and emails nobody. Build the whole integration before a single real document exists.
Retries that can't double-bill
Send an idempotency key and a repeated request replays the original response instead of raising a second invoice - so a timeout on your side is safe to retry.
Signed webhooks
Get told when a document is sent, paid or converted. Every delivery is signed with HMAC-SHA256 over a timestamped payload, so you can prove it came from us.
Clear rate limits
120 requests a minute per key, with the remaining count on every successful response. No surprise throttling.
Totals we both agree on
You send line items; Billery does the arithmetic for subtotals, discount, tax and total. Your numbers and ours can't drift apart.
Plain JSON, no SDK needed
Bearer token, snake_case fields, standard status codes. If your language can make an HTTP request, it can use Billery.
Webhooks
Find out the moment something happens.
Point us at an endpoint and we'll POST a signed JSON event to it. Your system learns an invoice was paid without asking us over and over.
Each request carries an HMAC-SHA256 signature over a timestamped payload, so a captured request can't be replayed at you later. The docs include ready-made verification snippets for Node and Python.
invoice.sentAn invoice was emailed to a customerinvoice.paidAn invoice was marked paidquote.sentA quote was emailed to a customerquote.convertedA quote was turned into an invoicereceipt.createdA receipt was created
Where it fits
Wherever the work already starts.
Booking systems
A customer books a slot and the invoice goes out with the confirmation - no one touches a keyboard.
Online shops
Issue a receipt the moment an order is paid, or invoice trade customers on account.
Job and field software
When an engineer marks a job complete, the invoice is raised from the job sheet and emailed before they've left.
Getting started
Three steps to your first call.
- 1
Upgrade to Pro
API access is part of the Pro plan at £10/month, alongside unlimited invoices and quotes.
- 2
Create a key
Settings → Developers. Start with a test key - it behaves exactly like a live one but writes nothing.
- 3
Make the call
Post your line items to /v1/invoices. Swap in a live key when you're happy.
Let your software do the invoicing.
Not a developer? Billery works just as well from your phone.