Invoice API reference
Invoicing API documentation: a REST API for invoicing that creates invoices, manages customers and shares links.
This reference describes the QuickBilling REST API. The production base URL is https://app.quickbilling.io/api. The same description is published as OpenAPI at /openapi.yaml. The interactive reference below loads that file in the browser.
API keys are part of the Unlimited plan. Send the key in the Authorization header as Bearer sk_live_... or Bearer sk_test_.... Most routes need a workspace. Send the X-Workspace-Id header with the workspace UUID, or use a workspace-scoped API key, which already carries that workspace.
Routes under /agent belong to the in-app assistant. They accept a signed-in session (JWT) only. An API key receives 403 JWT_AUTH_REQUIRED. Only /agent/usage and the /agent/byok routes are workspace-free, because the message quota and the stored keys belong to the person, not to a workspace. The other /agent routes (chat, threads, config, files) need the X-Workspace-Id header like the rest of the API.
The table is a map of the main routes. It is not the full specification. Request and response fields are in the OpenAPI file and in the reference below. Public routes, with no key, are GET /templates/system, GET /subscriptions/plans and GET /storage/view.
Create an invoice with curl
POST /invoices creates the invoice, or updates it when the id already exists. You choose the id, a UUID, so a retried request does not create a second invoice.
curl -X POST https://app.quickbilling.io/api/invoices \
-H "Authorization: Bearer sk_live_..." \
-H "X-Workspace-Id: 0b6f2c1e-8d4a-4f3b-9c7e-2a5d1e8f4b90" \
-H "Content-Type: application/json" \
-d '{
"id": "5f0c9a3e-2b7d-4c1a-8e6f-3d9b7a1c2e44",
"number": "INV-0001",
"issueDate": "2026-10-20",
"dueDate": "2026-11-03",
"currency": "USD",
"customerDetails": { "name": "Bluebird Studio", "email": "billing@bluebird.example" },
"items": [
{ "id": "1", "description": "Website design", "quantity": 3, "unit": "days", "price": 600 }
]
}'Replace sk_live_... with your key and the UUIDs with your own. The invoice is saved as a Draft. Field reference: InvoiceInput in the OpenAPI file.
Endpoint overview
| Method | Path | Summary |
|---|---|---|
| Invoices | ||
| GET | /invoices | List invoices |
| POST | /invoices | Create or update an invoice |
| POST | /invoices/new | Create a draft invoice |
| GET | /invoices/{id} | Get one invoice |
| POST | /invoices/{id}/share | Create a share link |
| DELETE | /invoices/{id}/share | Revoke a share link |
| POST | /send-invoice | Email an invoice |
| GET | /invoices/{id}/analytics | Invoice view analytics |
| GET | /invoices/recurring-rules | List recurring invoice rules |
| POST | /invoices/recurring-rules | Create a recurring invoice rule |
| Customers | ||
| GET | /customers | List customers |
| POST | /customers | Create or update a customer |
| Expenses and reports | ||
| GET | /expenses | List expenses |
| GET | /overview/workspace/financial | Profit and loss for a date range |
| Templates | ||
| GET | /templates/system | List built-in templates |
| GET | /templates | List templates this plan can use |
| Plans and API keys | ||
| GET | /subscriptions/plans | List plans |
| GET | /auth/workspaces/{workspaceId}/api-keys | List API keys (JWT, not an API key) |
| POST | /auth/workspaces/{workspaceId}/api-keys | Create an API key (JWT, not an API key) |
| AssistantRequires a signed-in session (JWT). An API key cannot call these routes. | ||
| GET | /agent/usage | Assistant messages used today |
| POST | /agent/chat | Send one assistant turn (needs X-Workspace-Id) |
The full interactive reference loads in the browser from the OpenAPI file.