Skip to main content

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.

Developer API · openapi.yaml

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
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

Endpoint overview
MethodPathSummary
Invoices
GET/invoicesList invoices
POST/invoicesCreate or update an invoice
POST/invoices/newCreate a draft invoice
GET/invoices/{id}Get one invoice
POST/invoices/{id}/shareCreate a share link
DELETE/invoices/{id}/shareRevoke a share link
POST/send-invoiceEmail an invoice
GET/invoices/{id}/analyticsInvoice view analytics
GET/invoices/recurring-rulesList recurring invoice rules
POST/invoices/recurring-rulesCreate a recurring invoice rule
Customers
GET/customersList customers
POST/customersCreate or update a customer
Expenses and reports
GET/expensesList expenses
GET/overview/workspace/financialProfit and loss for a date range
Templates
GET/templates/systemList built-in templates
GET/templatesList templates this plan can use
Plans and API keys
GET/subscriptions/plansList plans
GET/auth/workspaces/{workspaceId}/api-keysList API keys (JWT, not an API key)
POST/auth/workspaces/{workspaceId}/api-keysCreate an API key (JWT, not an API key)
AssistantRequires a signed-in session (JWT). An API key cannot call these routes.
GET/agent/usageAssistant messages used today
POST/agent/chatSend one assistant turn (needs X-Workspace-Id)

The full interactive reference loads in the browser from the OpenAPI file.