Talero API
The Talero public API is a REST API for Danish bookkeeping: invoices, customers, products, expenses, suppliers, accounts, transactions, reports, SAF-T exports and webhooks. All requests and responses use JSON.
Base URL
https://app.talero.dk/api/v1
All requests must be made over HTTPS. The interactive API reference documents every endpoint and schema, generated from the OpenAPI 3.1 contract.
Authentication
The fastest way to integrate is with an API key. A company owner creates one in Talero under Indstillinger → API-nøgler (Settings → API keys), selecting the minimum set of scopes the integration needs. The key is shown once and looks like tlr_live_ followed by 48 hex characters.
Send it in the X-API-Key header on every request:
curl https://app.talero.dk/api/v1/customers \
-H "X-API-Key: tlr_live_4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e"
Partner applications acting on behalf of multiple Talero companies use OAuth 2.0 instead. See Authentication for API key details, scopes and the full OAuth flow.
Response envelope
Every successful response wraps the resource in a data field. List responses add a meta object with pagination details:
{
"data": [ ... ],
"meta": { "page": 1, "per_page": 50, "total": 132, "total_pages": 3 }
}
DELETE requests return the same envelope:
{ "data": { "id": "0d5a1f5e-9c1b-4a53-8f70-2f6d2f9a1c34", "deleted": true } }
Errors are returned as application/problem+json (RFC 9457) with a stable machine-readable code — see Errors. Every response also carries an X-Request-ID header (quote it in support requests) and an X-API-Version header.
Quickstart
1. Create an API key
In Talero, go to Indstillinger → API-nøgler, create a key with the invoices:read and invoices:write scopes, and store it in your server-side secret manager. Only the company owner can create keys, and the full key is displayed only once.
export TALERO_API_KEY="tlr_live_..."
2. List invoices
curl "https://app.talero.dk/api/v1/invoices?per_page=2" \
-H "X-API-Key: $TALERO_API_KEY"
Response — 200 OK
{
"data": [
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"invoice_number": "1042",
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"customer_name": "Nordisk Handel ApS",
"status": "sent",
"issue_date": "2026-07-28",
"due_date": "2026-08-11",
"subtotal": 8000.00,
"vat_amount": 2000.00,
"total": 10000.00,
"currency": "DKK",
"created_at": "2026-07-28T09:14:03Z",
"updated_at": "2026-07-28T10:02:41Z"
},
{
"id": "3b2f1e0d-8a7b-4c5d-9e6f-1a2b3c4d5e6f",
"invoice_number": "",
"customer_id": null,
"customer_name": "",
"status": "draft",
"issue_date": "2026-07-30",
"due_date": "2026-08-13",
"subtotal": 1200.00,
"vat_amount": 300.00,
"total": 1500.00,
"currency": "DKK",
"created_at": "2026-07-30T13:45:12Z",
"updated_at": "2026-07-30T13:45:12Z"
}
],
"meta": { "page": 1, "per_page": 2, "total": 132, "total_pages": 66 }
}
3. Create an invoice
Every POST that creates a resource requires an Idempotency-Key header, so a retried request can never create a duplicate. Use a fresh UUID per logical operation — see Idempotency.
curl -X POST https://app.talero.dk/api/v1/invoices \
-H "X-API-Key: $TALERO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 018f6c1e-9d2a-7c3b-8e4f-5a6b7c8d9e0f" \
-d '{
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"issue_date": "2026-08-02",
"due_date": "2026-08-16",
"lines": [
{
"description": "Consulting, July",
"quantity": 10,
"unit_price": 950.00,
"vat_rate": 25.0
}
]
}'
Response — 201 Created
{
"data": {
"id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"invoice_number": "",
"status": "draft",
"subtotal": 9500.00,
"vat_amount": 2375.00,
"total": 11875.00
}
}
The create response is a compact summary; fetch GET /api/v1/invoices/{id} for the full invoice including lines. With "auto_approve": true the response additionally carries invoice_number, posted_transaction_id and posted_system_id once the invoice is posted to the general ledger.
Repeating the exact same request with the same Idempotency-Key returns the original response with the header X-Idempotency-Replayed: true instead of creating a second invoice.
Data conventions
- Amounts are DKK decimals (for example
1250.00). - Dates are ISO 8601 (
YYYY-MM-DD); timestamps are ISO 8601 with a UTC offset. - VAT defaults to 25% when a line omits
vat_rate. - IDs are UUIDs.
- Invoices: passing
"auto_approve": truerequirescustomer_id, assigns the next sequential document number and posts the invoice to the general ledger. Only draft invoices can be updated or deleted. - Transactions must balance (total debit equals total credit) and must respect the company lock date.
Resources
- GET
/api/v1/invoicesInvoices - GET
/api/v1/customersCustomers - GET
/api/v1/productsProducts - GET
/api/v1/expensesExpenses - GET
/api/v1/suppliersSuppliers - GET
/api/v1/accountsChart of accounts - GET
/api/v1/transactionsLedger transactions - GET
/api/v1/reports/balanceReports - GET
/api/v1/exports/saftSAF-T export - GET
/api/v1/webhooksWebhook subscriptions
Full request and response schemas for every endpoint are in the API reference.