Invoicing API
There is no public Invoicing API yet — here's what you can automate for invoices, quotes, and expenses today, and what's coming.
Not available yet
There are no public endpoints for invoices, quotes, credit notes, recurring invoices,
inventory, or expenses. https://api2.bunnydoc.com/v1 currently serves the
E-Signing API only. Anything you read elsewhere about calling
/v1/invoices is not something we offer.
Invoicing is managed in the app. If you're planning an integration, here is exactly what is and isn't possible right now, so you can design around it rather than discover it mid-build.
What you can automate today
Receive invoicing events by webhook
This is the one programmatic hook into invoicing, and for most integrations it's the important one — it lets your system react to a payment without polling.
Set it up in the app under Settings → Webhooks, choosing Invoicing as the product. You
cannot create these subscriptions through the API (/v1/webhooks manages E-Signing subscriptions
only), but once registered they deliver exactly like E-Signing webhooks: same envelope, same HMAC
signature, same retry and auto-disable behaviour.
| Event | Fires when |
|---|---|
invoice.issued | An invoice was issued. |
invoice.sent | An invoice was sent to the customer. |
invoice.viewed | The customer opened the invoice. |
invoice.partially_paid | A partial payment was applied. |
invoice.paid | An invoice was paid in full. |
invoice.voided | An invoice was voided. |
invoice_payment.succeeded | A payment against an invoice succeeded. |
invoice_payment.failed | A payment against an invoice failed. |
invoice_payment.refunded | A payment against an invoice was refunded. |
expense.confirmed | An expense was confirmed out of draft. |
expense.ocr_completed | OCR finished extracting data from a receipt. |
expense.ocr_failed | OCR could not extract data from a receipt. |
Invoicing webhooks are entitled separately from E-Signing webhooks, and all of the events above are in the standard invoicing tier.
No invoice.overdue event
"Overdue" is a computed filter (due_date in the past), not a stored status — nothing ever
transitions an invoice into it, so no such event could fire. Track due dates on your side from
invoice.issued or invoice.sent.
To verify signatures, handle retries, and understand the delivery envelope, use the webhooks guide — sections 2 through 5 apply to every subscription regardless of product.
Take payment inside a document being signed
If what you actually want is "charge the customer when they sign", that's E-Signing, not
Invoicing, and it is fully available through the API. Put a payment block on the template, send it
with POST /v1/envelopes/from-template, and
subscribe to payment.succeeded.
Bring the data out of the app
- Reports can be exported to CSV/XLSX — see Reports.
- Email receipts and the public pay page cover the customer-facing side without any integration work. See The public pay page.
What is not possible yet
- Creating, issuing, sending, or voiding an invoice programmatically.
- Reading invoice, quote, or credit-note data over HTTP.
- Managing products, stock, categories, discounts, or tax rates.
- Creating or reading expenses. (Expenses can be created by emailing receipts to your expense inbox — see Email inbox — which is a practical substitute for an ingest API.)