Invoices
The Invoices API handles invoicing, open-item tracking, DATEV export for German accounting, and dunning automation.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v1/invoices | List invoices |
POST | /api/v1/invoices | Create an invoice |
GET | /api/v1/invoices/{id} | Get an invoice |
PUT | /api/v1/invoices/{id} | Update an invoice |
DELETE | /api/v1/invoices/{id} | Delete a draft invoice |
POST | /api/v1/invoices/{id}/send | Send invoice to party |
POST | /api/v1/invoices/{id}/mark-paid | Mark as paid |
GET | /api/v1/invoices/open-items | List open (unpaid) items |
POST | /api/v1/invoices/datev-export | Export to DATEV format |
Required scope: invoices:read for GET, invoices:write for POST/PUT/DELETE.
The Invoice Object
{
"id": "inv_01ABCDEFG",
"case_id": "550e8400-e29b-41d4-a716-446655440000",
"party_id": "pty_01ABCDEF",
"invoice_number": "RE-2026-042",
"status": "sent",
"issue_date": "2026-05-15",
"due_date": "2026-06-14",
"total_net": 2250.00,
"total_gross": 2677.50,
"tax_rate": 0.19,
"currency": "EUR",
"lines": [
{
"description": "Legal consultation (3h x 250 EUR)",
"quantity": 3,
"unit": "hours",
"unit_price": 250.00,
"total": 750.00,
"time_entry_ids": ["tte_01", "tte_02", "tte_03"]
}
],
"paid_at": null,
"created_at": "2026-05-15T10:00:00Z"
}
Create an Invoice
POST /api/v1/invoices
{
"case_id": "550e8400-e29b-41d4-a716-446655440000",
"party_id": "pty_01ABCDEF",
"lines": [
{
"description": "Legal consultation",
"quantity": 3,
"unit": "hours",
"unit_price": 250.00
}
],
"time_entry_ids": ["tte_01", "tte_02", "tte_03"]
}
When time_entry_ids are provided, the linked time entries are automatically marked as billed.
DATEV Export
POST /api/v1/invoices/datev-export
{
"from": "2026-01-01",
"to": "2026-03-31"
}
Returns a DATEV-compatible file download for import into German accounting software.
Next Steps
Was this helpful?