E-invoicing API · DIAN Colombia
The full tax cycle, in a single contract.
Invoicing, received documents and electronic payroll under one REST API. Without tying yourself to the technology provider underneath: you talk about invoices, not its dialect.
POST /invoices/v1/sales-invoices
Authorization: Bearer pk_live_…
Idempotency-Key: 8f2c1b90-4d17-4e0a-9c31
Content-Type: application/json
{
"customer": { "identification": "901234567", … },
"items": [ { "price": "70000.00", … } ],
"payment_details": [ { "amount": "83300.00" } ]
}
→ 202 Accepted
{
"transaction_id": "91003243-14b6-4bed-9fd7",
"status": "pending",
"totals": { "total": "83300.00" }
}- operations
- 47
- document types
- 7
- scopes
- 4
Three scopes, versioned separately
Each one is deployed and versioned on its own: if you only invoice, you don't carry the payroll module.
/invoices/v1
Invoicing
Five document types, each with its full lifecycle.
- Sales invoice
- Credit note and debit note
- Support document and adjustment note
- Numbering ranges
/receptions/v1
Received documents
What others issue to you, and how you respond to the DIAN.
- Inbox of received documents
- Upload by CUFE
- RADIAN events, with their three-day deadline
/payrolls/v1
Payroll
23 earning and 18 deduction concepts, with business names.
- Electronic payroll
- Adjustment notes (deletion)
- Payroll's own numbering ranges
Four things you won't have to solve
A number from the range authorized by the DIAN can't be given back: the only correction is another tax document. Almost all of the adapter's work goes into preventing that.
A retry never issues twice
Every POST that issues requires Idempotency-Key, and the guard lives in the database: the retry may reach another instance.
A 201 doesn't mean accepted
The only true signal is is_validated. The authority's warnings are kept even when the document was validated.
Totals are verified
Taxable base, tax and total are compared against what the provider returns. It's the cheapest detector of a calculation error.
Errors that say what happened
RFC 7807 with a correlation_id in every response, and an OpenAPI spec generated from the same code that validates — it can't drift out of sync.
Request access
Tell us what you issue and what you work with. We reply with sandbox credentials and a proposal based on your volume.