Desarrolladores · API v1 · versión 2026-10-22
Documento soporte
Genera el documento soporte (05) de una compra a quien no está obligado a facturar —una persona natural, un campesino, un proveedor del exterior— y su nota de ajuste (95). Trevol valida, numera con tu rango, firma y envía a la DIAN.
1. Antes de emitir
La empresa necesita, en la app de Trevol:
- la habilitación ante la DIAN y su software asociado al modo de documento soporte (si falta:
422 company_not_enabled,reason: "missing_software"); - un rango de documento soporte registrado, vigente y con números libres (si no:
422 numbering_unavailable,reason: "no_resolution").GET /v1/companylo lista encapabilities.support_documents.numbering, con elnextde cada uno; - el certificado de firma.
La nota de ajuste no usa rango: tiene su consecutivo propio. Todo esto se comprueba antes de numerar: un pedido que no puede salir no gasta número.
2. Emitir un documento soporte
Genera un documento soporte (tipo 05): el respaldo de una compra a quien no está obligado a facturar (una persona natural, un campesino, un proveedor del exterior). Trevol valida a fondo ANTES de reservar un número, numera con el rango de documento soporte vigente más nuevo (o el del prefijo de numbering), firma con el certificado de la empresa y lo manda a la DIAN. Se genera, no se expide: no hay PDF, ZIP ni correo; el XML y la respuesta de la DIAN se descargan en las dos versiones. La empresa necesita su software registrado ante la DIAN (company_not_enabled con reason: missing_software) y un rango vigente con números libres (numbering_unavailable, no_resolution). La purchase_date de cada línea no puede ser posterior a hoy (DSFC02b/c). Cuenta como documento de facturación en el cobro.
curl https://api.trevol.si/v1/support_documents \
-H "Authorization: Bearer $TREVOL_LLAVE" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"external_id": "OC-991",
"seller": {
"resident": true,
"person_type": "natural",
"document_type": "31",
"document_number": "1020304050",
"name": "PEREZ GOMEZ ANA MARIA",
"address": "Vereda El Silencio, finca La Esperanza",
"municipality_code": "25053",
"postal_code": "252007",
"tax_responsibilities": [
"R-99-PN"
]
},
"items": [
{
"description": "Leche cruda",
"unit": "LTR",
"quantity": "120",
"unit_price": "1800"
}
],
"payment": {
"form": "cash",
"methods": [
{
"code": "10"
}
]
},
"notes": [
"Compra de la semana 42 de octubre"
]
}'HTTP/1.1 201 Created
Location: /v1/support_documents/sd_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b
{
"id": "sd_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b",
"object": "support_document",
"environment": "test",
"status": "accepted",
"number": "DS994001",
"prefix": "DS",
"external_id": "OC-991",
"origin": "api",
"cuds": "abababababababababababababababababababababababababababababababababababababababababababababababab",
"qr": "https://catalogo-vpfe-hab.dian.gov.co/document/searchqr?documentkey=abababababababababababababababababababababababababababababababababababababababababababababababab",
"issued_at": "2026-10-23T09:15:02-05:00",
"seller": {
"resident": true,
"person_type": "natural",
"document_type": "31",
"document_number": "1020304050",
"name": "PEREZ GOMEZ ANA MARIA",
"address": "Vereda El Silencio, finca La Esperanza",
"municipality_code": "25053",
"postal_code": "252007",
"tax_responsibilities": [
"R-99-PN"
]
},
"items": [
{
"description": "Leche cruda",
"unit": "LTR",
"quantity": "120",
"unit_price": "1800"
}
],
"payment": {
"form": "cash",
"methods": [
{
"code": "10"
}
]
},
"transmission": "per_operation",
"adjustment_note": null,
"totals": {
"subtotal": "216000.00",
"discounts": "0.00",
"line_extension": "216000.00",
"tax_exclusive": "0.00",
"taxes": [],
"allowances": "0.00",
"charges": "0.00",
"rounding": "0.00",
"total": "216000.00",
"withholdings": [],
"prepayments": "0.00",
"net_payable": null,
"items": [
{
"gross": "216000.00",
"discount": "0.00",
"line_extension": "216000.00"
}
]
},
"dian": {
"status_code": "00",
"message": "Procesado Correctamente.",
"rules": []
},
"delivery": {
"status": null,
"pdf": false,
"zip": false,
"xml": true,
"email": null
},
"created_at": "2026-10-23T09:15:02-05:00",
"updated_at": "2026-10-23T09:15:03-05:00"
}
3. La nota de ajuste
Genera la nota de ajuste de un documento soporte (95): corrige o anula una compra ya validada. El documento que ajusta es de Trevol (support_document.id) o de otra plataforma (number, cuds, issue_date y total). concept 1 a 5; el 2 anula y lleva exactamente los valores del documento. Sin seller hereda el del documento de Trevol. La suma de las notas no puede pasar del saldo del documento. Un documento soporte rechazado no se ajusta: se corrige con PUT.
curl https://api.trevol.si/v1/support_document_adjustments \
-H "Authorization: Bearer $TREVOL_LLAVE" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"external_id": "OC-991-ANULA",
"concept": "2",
"description": "Anulación: la compra de leche se registró dos veces en el ERP",
"support_document": {
"id": "sd_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b"
},
"items": [
{
"description": "Leche cruda",
"unit": "LTR",
"quantity": "120",
"unit_price": "1800"
}
]
}'El documento que se ajusta se referencia por su id ("support_document": {"id": "sd_…"}, uno de Trevol) o, si es de otra plataforma, por sus datos (number, cuds, issue_date y total); en ese caso hay que mandar también el seller (y, para anularlo, el total). El concept va de 1 a 5: 1 devolución parcial, 2 anulación (lleva exactamente los valores del documento), 3 rebaja o descuento, 4 ajuste de precio y 5 otros. Trevol revisa antes de numerar que las notas no pasen del saldo del documento.
4. Lo que es distinto de una factura
- Se genera, no se expide. No hay PDF, ZIP ni correo:
delivery.statuses siemprenull. Se descargan…/xmly…/dian_response, en las dos versiones de la API. - No hay
customer: la empresa es la compradora. El que cuenta es elseller. - El código de seguridad se llama
cuds. - Retenciones: solo las de cada línea (
items[].withholdings). Las del documento no se publican. numbering: {"prefix": "…"}(opcional) elige el rango por su prefijo; sin él, el más nuevo vigente.purchase_datede una línea no puede ser posterior a hoy.- El
external_ides único entre facturas, notas, documentos soporte y equivalentes (y sus notas) de la empresa y el ambiente. - Cuenta como facturación en el cobro: lo que se cobra al validarse un documento de producción.
Las respuestas son las de toda la API: 201 cuando la DIAN valida, 422 dian_rejected con document cuando la rechaza, 422 validation_error si Trevol lo rechaza antes de numerar (no se gasta ningún número), 402 sin saldo, y con la DIAN sin contestar un 202 processing (versión 2026-10-22) o un 503 dian_unavailable (2026-10-21). Idempotency-Key es obligatoria al crear o corregir, y external_id es opcional.
5. Rutas
| Método | Ruta | Qué hace |
|---|---|---|
| POST | /v1/support_documents | Emitir un documento soporte |
| GET | /v1/support_documents | Listar (documento soporte) |
| POST | /v1/support_documents/preview | Calcular un documento soporte sin emitirlo |
| GET | /v1/support_documents/{id} | Un documento soporte |
| PUT | /v1/support_documents/{id} | Corregir un documento soporte rechazado (mismo número) y reenviarlo |
| POST | /v1/support_documents/{id}/send | Reenviar una pendiente o en error |
| GET | /v1/support_documents/{id}/xml | Archivo xml |
| GET | /v1/support_documents/{id}/dian_response | Archivo dian_response |
| POST | /v1/support_document_adjustments | Emitir una nota de ajuste del documento soporte |
| GET | /v1/support_document_adjustments | Listar (nota de ajuste del documento soporte) |
| POST | /v1/support_document_adjustments/preview | Calcular una nota de ajuste del documento soporte sin emitirla |
| GET | /v1/support_document_adjustments/{id} | Una nota de ajuste del documento soporte |
| PUT | /v1/support_document_adjustments/{id} | Corregir una nota de ajuste del documento soporte rechazada (mismo número) y reenviarla |
| POST | /v1/support_document_adjustments/{id}/send | Reenviar una pendiente o en error |
| GET | /v1/support_document_adjustments/{id}/xml | Archivo xml |
| GET | /v1/support_document_adjustments/{id}/dian_response | Archivo dian_response |
6. Avisos (webhooks)
Salen por cualquier camino (la API o la app). El data es un resumen: nunca el vendedor ni las líneas.
| Tipo | Cuándo |
|---|---|
support_document.accepted | La DIAN validó el documento soporte. Pasa por cualquier camino (API, app, conector o verificación de fondo). (Catálogo 2: un * de un endpoint creado antes de la fase 3 no lo recibe hasta que se guarde de nuevo su lista de eventos.) |
support_document.rejected | La DIAN rechazó el documento soporte. Corrígela con PUT y se reenvía con el mismo número. (Catálogo 2: un * de un endpoint creado antes de la fase 3 no lo recibe hasta que se guarde de nuevo su lista de eventos.) |
support_document.error | El documento soporte quedó en error: la DIAN no confirmó y Trevol dejó de reintentar. data.error lleva un code y un texto fijo (nunca el mensaje de la DIAN). (Catálogo 2: un * de un endpoint creado antes de la fase 3 no lo recibe hasta que se guarde de nuevo su lista de eventos.) |
support_document_adjustment.accepted | La DIAN validó la nota de ajuste del documento soporte. Pasa por cualquier camino (API, app, conector o verificación de fondo). (Catálogo 2: un * de un endpoint creado antes de la fase 3 no lo recibe hasta que se guarde de nuevo su lista de eventos.) |
support_document_adjustment.rejected | La DIAN rechazó la nota de ajuste del documento soporte. Corrígela con PUT y se reenvía con el mismo número. (Catálogo 2: un * de un endpoint creado antes de la fase 3 no lo recibe hasta que se guarde de nuevo su lista de eventos.) |
support_document_adjustment.error | La nota de ajuste del documento soporte quedó en error: la DIAN no confirmó y Trevol dejó de reintentar. data.error lleva un code y un texto fijo (nunca el mensaje de la DIAN). (Catálogo 2: un * de un endpoint creado antes de la fase 3 no lo recibe hasta que se guarde de nuevo su lista de eventos.) |
{
"id": "evt_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b",
"object": "event",
"type": "support_document.accepted",
"timestamp": "2026-10-23T14:15:03Z",
"environment": "test",
"api_version": "2026-10-22",
"data": {
"object": "support_document",
"id": "sd_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b",
"status": "accepted",
"environment": "test",
"number": "DS994001",
"prefix": "DS",
"external_id": "OC-991",
"origin": "api",
"cuds": "abababababababababababababababababababababababababababababababababababababababababababababababab",
"issued_at": "2026-10-23T09:15:02-05:00",
"total": "216000.00",
"delivery": null,
"dian": {
"status_code": "00",
"rules": []
}
}
}
7. Campos
SupportItemTax
| Campo | Tipo | Qué es |
|---|---|---|
code obligatorio | texto | Código (texto). |
rate | decimal | Tarifa en % (ICA y ReteICA: por mil). |
excluded | booleano |
SupportItemCharge
| Campo | Tipo | Qué es |
|---|---|---|
reason | texto | |
percent | decimal | Número o texto decimal con punto («150000.50»). |
amount | decimal | Número o texto decimal con punto («150000.50»). |
SupportItemWithholding
| Campo | Tipo | Qué es |
|---|---|---|
code obligatorio | texto | Código (texto). |
rate obligatorio | decimal | Tarifa en % (ICA y ReteICA: por mil). |
SupportItem
| Campo | Tipo | Qué es |
|---|---|---|
code | texto | Código (texto). |
description obligatorio | texto | |
unit | texto | Unidad de medida (tabla 13.3.6). Por defecto 94 (unidad). |
quantity obligatorio | decimal | Número o texto decimal con punto («150000.50»). |
unit_price obligatorio | decimal | Precio unitario SIN impuestos. |
taxes | lista de SupportItemTax | Solo IVA: {code: "01", rate: 0 | 5 | 19} o {code: "01", excluded: true}. Máximo 12. |
discounts | lista de ItemAllowance | Descuentos de la línea, sin código; la razón va de 10 a 5000 caracteres (DSBE04). Máximo 10. |
charges | lista de SupportItemCharge | Máximo 10. |
withholdings | lista de SupportItemWithholding | Las practica la empresa al vendedor: 05 ReteIVA (15 o 100 %) o 06 ReteRenta. No restan del total a pagar. Máximo 10. |
standard_code | StandardCode | |
purchase_date | fecha (AAAA-MM-DD) | Fecha de la compra. Obligatoria en el acumulado semanal (entre 6 días antes de hoy y hoy); por operación no se informa. |
SupportAdjustmentItem
| Campo | Tipo | Qué es |
|---|---|---|
code | texto | Código (texto). |
description obligatorio | texto | |
unit | texto | Unidad de medida (tabla 13.3.6). Por defecto 94 (unidad). |
quantity obligatorio | decimal | Número o texto decimal con punto («150000.50»). |
unit_price obligatorio | decimal | Precio unitario SIN impuestos. |
taxes | lista de SupportItemTax | Solo IVA: {code: "01", rate: 0 | 5 | 19} o {code: "01", excluded: true}. Máximo 12. |
discounts | lista de ItemAllowance | Descuentos de la línea, sin código; la razón va de 10 a 5000 caracteres (NSBE04). Máximo 10. |
charges | lista de SupportItemCharge | Máximo 10. |
standard_code | StandardCode |
SupportCurrency
| Campo | Tipo | Qué es |
|---|---|---|
code obligatorio | texto | Moneda del documento (ISO 4217); los valores del pedido van en ESA moneda. |
exchange_rate obligatorio | decimal | Pesos por 1 unidad de la moneda. |
rate_date obligatorio | fecha (AAAA-MM-DD) |
SupportDocumentInput
| Campo | Tipo | Qué es |
|---|---|---|
external_id | texto | Tu identificador del documento: único entre los documentos API de la empresa y el ambiente. |
seller obligatorio | Seller | Quien vende y no está obligado a facturar (el SNO). La empresa de la llave es la compradora: sus datos salen de la empresa. No hay customer. |
items obligatorio | lista de SupportItem | Las líneas (1 a 500). Retenciones solo por línea (withholdings: 05 ReteIVA, 06 ReteRenta); las del documento no se publican. Máximo 500. |
payment | Payment | |
notes | lista de texto | Máximo 10. |
references | References | |
allowance_charges | lista de AllowanceCharge | Descuentos y recargos globales (no tocan las bases). Máximo 20. |
currency | SupportCurrency | |
transmission | per_operation | weekly | per_operation (por defecto, un documento por compra) o weekly (acumulado semanal con un mismo vendedor: cada línea lleva su purchase_date). |
adjustment_note | SupportAdjustmentReference | La nota de ajuste que originó este documento (opcional): {"id": "sda_…"} o {number, cuds, issue_date}. |
numbering | Numbering | Opcional: el prefijo de la resolución de documento soporte que numera (una empresa con varios rangos). Sin él, la más nueva vigente. Si no existe, numbering_unavailable (no_resolution). |
SupportDocumentAdjustmentInput
| Campo | Tipo | Qué es |
|---|---|---|
external_id | texto | Tu identificador del documento: único entre los documentos API de la empresa y el ambiente. |
seller | Seller | Opcional con support_document.id: se toma el vendedor del documento soporte (si viene, tiene que ser el mismo). |
items obligatorio | lista de SupportAdjustmentItem | Las líneas de la nota (1 a 500): sin retenciones ni fecha de compra. Máximo 500. |
payment | Payment | |
notes | lista de texto | Máximo 10. |
references | References | |
allowance_charges | lista de AllowanceCharge | Descuentos y recargos globales (no tocan las bases). Máximo 20. |
currency | SupportCurrency | |
concept obligatorio | texto | Concepto de la nota de ajuste (tabla 16.2.4): "1" devolución parcial, "2" anulación del documento soporte (lleva exactamente sus valores), "3" rebaja o descuento, "4" ajuste de precio, "5" otros. |
description obligatorio | texto | Qué se corrige y por qué (de 20 a 5000 caracteres, NSBF04). |
support_document obligatorio | SupportDocumentReference | El documento soporte que ajusta: {"id": "sd_…"} (de Trevol: validado, de la empresa y el ambiente de la llave) o {number, cuds, issue_date, total?} si es de otra plataforma (total hace falta para anularlo). |
SupportDocumentReference
- id (obligatorios: id)
- number, cuds, issue_date, total (obligatorios: number, cuds, issue_date)
SupportAdjustmentReference
- id (obligatorios: id)
- number, cuds, issue_date (obligatorios: number, cuds, issue_date)
SupportDocument
Un documento soporte en adquisiciones a no obligados a facturar (Invoice 05). Se genera, no se expide: archivos xml y dian_response.
| Campo | Tipo | Qué es |
|---|---|---|
id | texto | sd_… |
object | support_document | |
environment | test | live | |
status | pending | sending | accepted | rejected | error | processing | processing solo en la versión 2026-10-22: la DIAN no confirmó y Trevol sigue resolviendo el documento (el resultado llega por GET y por webhook; no crees otro documento para la misma venta). En 2026-10-21 ese documento se ve como error. |
number | texto (puede ser null) | |
prefix | texto (puede ser null) | |
external_id | texto (puede ser null) | |
origin | api | app | contapyme | |
qr | texto (puede ser null) | |
issued_at | fecha y hora (puede ser null) | |
items | lista de SupportItem | |
payment | Payment | |
currency | SupportCurrency | |
totals | objeto (puede ser null) | Montos como texto decimal con 2 decimales, siempre en pesos. Con moneda extranjera, currency trae el equivalente. |
dian | objeto | |
delivery | objeto | El documento soporte se genera, no se expide: no hay PDF, ZIP ni correo. Solo hay XML y la respuesta de la DIAN. |
created_at | fecha y hora | |
updated_at | fecha y hora (puede ser null) | |
cuds | texto (puede ser null) | El código único del documento (CUDS, 96 hex). |
seller | Seller | |
notes | lista de texto | |
references | References | |
allowance_charges | lista de AllowanceCharge | |
transmission | per_operation | weekly | |
adjustment_note | SupportAdjustmentReference (puede ser null) |
SupportDocumentAdjustment
Una nota de ajuste de un documento soporte (CreditNote 95). Se genera, no se expide: archivos xml y dian_response.
| Campo | Tipo | Qué es |
|---|---|---|
id | texto | sda_… |
object | support_document_adjustment | |
environment | test | live | |
status | pending | sending | accepted | rejected | error | processing | processing solo en la versión 2026-10-22: la DIAN no confirmó y Trevol sigue resolviendo el documento (el resultado llega por GET y por webhook; no crees otro documento para la misma venta). En 2026-10-21 ese documento se ve como error. |
number | texto (puede ser null) | |
prefix | texto (puede ser null) | |
external_id | texto (puede ser null) | |
origin | api | app | contapyme | |
qr | texto (puede ser null) | |
issued_at | fecha y hora (puede ser null) | |
items | lista de SupportAdjustmentItem | |
payment | Payment | |
currency | SupportCurrency | |
totals | objeto (puede ser null) | Montos como texto decimal con 2 decimales, siempre en pesos. Con moneda extranjera, currency trae el equivalente. |
dian | objeto | |
delivery | objeto | El documento soporte se genera, no se expide: no hay PDF, ZIP ni correo. Solo hay XML y la respuesta de la DIAN. |
created_at | fecha y hora | |
updated_at | fecha y hora (puede ser null) | |
cuds | texto (puede ser null) | El código único del documento (CUDS, 96 hex). |
seller | Seller | |
notes | lista de texto | |
references | References | |
allowance_charges | lista de AllowanceCharge | |
concept | texto | Concepto de la nota (tabla 16.2.4): 1 a 5. |
description | texto | |
support_document | SupportDocumentReference |
Seller
| Campo | Tipo | Qué es |
|---|---|---|
resident | booleano | Residente fiscal en Colombia. Por defecto, country es CO. |
person_type | legal | natural | Por defecto se deduce del NIT. |
document_type obligatorio | texto | Residente: solo "31" (NIT). No residente: 21, 22, 31, 41, 42, 47 o 50 (tabla 16.2.1). |
document_number obligatorio | texto | Sin dígito de verificación; Trevol calcula el DV del NIT. |
check_digit | entero | Opcional: si viene, tiene que ser el DV del NIT. |
name obligatorio | texto | |
address | texto | |
tax_scheme | texto | "ZZ" (no aplica, por defecto) o "01" (IVA). |
tax_responsibilities | lista de texto | O-13, O-15, O-23, O-47, O-48, O-49 o R-99-PN (por defecto R-99-PN). Máximo 20. |
country | texto | ISO 3166-1 alfa-2 (tabla 16.4.1). Por defecto CO. |
municipality_code | texto | Solo vendedor residente: código DANE del municipio. |
department_code | texto | |
postal_code | texto | Residente: de la tabla 16.4.4, del mismo departamento. No residente: libre, hasta 10 caracteres. |
city | texto | Obligatoria si no es residente. |
region | texto | Solo vendedor no residente. |
Numbering
| Campo | Tipo | Qué es |
|---|---|---|
prefix obligatorio | texto | Prefijo de la resolución POS o de documento soporte que numera (el de GET /v1/company → capabilities.equivalent_documents.pos_numbering o capabilities.support_documents.numbering). |