Desarrolladores · API v1 · versión 2026-10-22
Exportación y operaciones especiales
La misma POST /v1/invoices emite también la factura de exportación, en moneda extranjera, y las operaciones con tipo propio: AIU, mandatos, transporte de carga, notarios, compra y venta de divisas y sector salud.
1. Qué se puede emitir
| Operación | Cómo se pide |
|---|---|
| Exportación | document_type: "02", con customer en el exterior (country distinto de "CO", sin municipality_code) y, si se factura en otra moneda, currency. delivery_terms lleva el incoterm. |
| Moneda extranjera | currency: {"code", "exchange_rate", "rate_date"} y, opcional, alternative. Los valores del pedido van en esa moneda; la factura y el CUFE van en pesos y totals.currency trae el equivalente. |
| AIU | operation_type: "09"; cada línea lleva aiu ("A", "I" o "U") y la línea A, el aiu_contract. |
| Mandatos | operation_type: "11"; la línea de un ingreso para terceros lleva income: "third_party" y su mandator. |
| Transporte de carga | operation_type: "12"; cada línea lleva su consignment (remesa del RNDC). |
| Notarios | operation_type: "14"; la línea lleva notary (matrícula y valor comercial). |
| Divisas | operation_type: "15" (compra) o "16" (venta), con due_diligence ("01" a "04", obligatoria en esas dos). |
| Sector salud | operation_type: "SS-CUFE" con interoperability (obligatoria). |
Un campo que no corresponde a la operación (un aiu fuera del 09, un consignment fuera del 12…) es validation_error con el campo exacto, antes de numerar.
2. Una exportación
Valida, numera, firma y envía una factura a la DIAN. Además de la factura nacional acepta la exportación (document_type: "02"), la moneda extranjera (currency), los términos de entrega (delivery_terms), el AIU, los mandatos, el transporte de carga, los notarios, las divisas y el sector salud (operation_type). El envío físico de la mercancía va en shipment (no en delivery: ese es el estado del PDF, el ZIP y el correo en la respuesta). Las notas crédito y débito no admiten estos campos.
curl https://api.trevol.si/v1/invoices \
-H "Authorization: Bearer $TREVOL_LLAVE" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"external_id": "EXP-77",
"document_type": "02",
"currency": {
"code": "USD",
"exchange_rate": "3950.12",
"rate_date": "2026-10-21"
},
"delivery_terms": {
"incoterm": "FOB",
"conditions": "Puerto de Cartagena"
},
"customer": {
"document_type": "50",
"document_number": "US123456789",
"name": "ACME INC",
"country": "US",
"city": "Miami",
"region": "Florida",
"postal_code": "33131",
"address": "200 S Biscayne Blvd"
},
"items": [
{
"description": "Consultoría",
"quantity": "1",
"unit_price": "1000",
"taxes": [
{
"code": "01",
"excluded": true
}
]
}
],
"payment": {
"form": "credit",
"term_days": 30
}
}'La respuesta es la de toda factura (guía), con document_type, currency, delivery_terms y, si se pidieron, shipment e interoperability; totals siempre en pesos, y con moneda extranjera totals.currency con total_currency y total_cop.
3. Lo que hay que saber
- Solo facturas. Las notas crédito y débito no admiten moneda extranjera, exportación ni tipos de operación: cada campo sale con un mensaje que lo dice.
shipmentydeliveryson distintos. El envío físico de la mercancía se pide enshipment(date,address,carrier).deliveryes el estado del PDF, el ZIP y el correo en la respuesta y no se pide.- Contingencia.
document_type: "03"y"04"y el campocontingencysiguen sin estar disponibles. - Se valida a fondo antes de numerar, con la misma lógica del editor de Trevol: la fecha de la tasa de cambio no puede ser posterior a la factura, y las reglas de cada operación del Anexo técnico 1.9 se revisan antes de gastar el número.
- Se cobra como cualquier factura.
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.
4. Campos
Moneda extranjera (currency)
| Campo | Tipo | Qué es |
|---|---|---|
code obligatorio | texto | Moneda (tabla 13.3.3, ISO 4217), distinta de COP. |
exchange_rate obligatorio | decimal | TRM o tasa pactada: pesos por 1 unidad de la moneda (hasta 6 decimales). |
rate_date obligatorio | fecha (AAAA-MM-DD) | El día de la tasa; no puede ser posterior a la factura. |
alternative | SupportCurrency |
Moneda alterna (currency.alternative)
| Campo | Tipo | Qué es |
|---|---|---|
code obligatorio | texto | Una tercera moneda (ni la de la factura ni COP). |
exchange_rate obligatorio | decimal | Unidades de esa moneda por 1 unidad de la moneda de la factura. |
rate_date obligatorio | fecha (AAAA-MM-DD) |
Términos de entrega (delivery_terms)
| Campo | Tipo | Qué es |
|---|---|---|
incoterm | texto | |
conditions | texto |
Envío físico (shipment)
| Campo | Tipo | Qué es |
|---|---|---|
date | fecha (AAAA-MM-DD) | |
address | ForeignAddress | |
carrier | Carrier |
Transportador (shipment.carrier)
| Campo | Tipo | Qué es |
|---|---|---|
document_type | texto | Tipo de documento del transportador (tabla 13.2.1). |
document_number | texto | Sin DV ni puntos; el DV lo calcula Trevol. |
name | texto | |
tax_responsibilities | lista de texto | Tabla 13.2.6.1 (O-13, O-15, O-23, O-47, R-99-PN). Máximo 20. |
email | texto | |
phone | texto | |
address | ForeignAddress |
Dirección (shipment.address)
| Campo | Tipo | Qué es |
|---|---|---|
country | texto | País (tabla 13.4.1). Sin country: Colombia. |
city | texto | Obligatoria fuera de Colombia. |
region | texto | |
region_code | texto | |
postal_code | texto | |
municipality_code | texto | Solo en Colombia (DANE, 5 dígitos). |
street | texto | Calle y número. |
Interoperabilidad (interoperability)
| Campo | Tipo | Qué es |
|---|---|---|
group obligatorio | texto | |
collections obligatorio | lista de AirCollection | Máximo 10. |
Colección de interoperabilidad
| Campo | Tipo | Qué es |
|---|---|---|
name obligatorio | texto | |
data obligatorio | lista de InteroperabilityData | Máximo 50. |
Dato de interoperabilidad
| Campo | Tipo | Qué es |
|---|---|---|
name obligatorio | texto | |
value | texto |
Mandante (items[].mandator)
| Campo | Tipo | Qué es |
|---|---|---|
document_type obligatorio | texto | Tipo de documento (tabla 13.2.1 de la DIAN): 13 CC, 31 NIT, 22 CE, 41 PA… |
document_number obligatorio | texto | Sin DV ni puntos; el DV lo calcula Trevol. |
name obligatorio | texto |
Remesa de transporte de carga (items[].consignment)
| Campo | Tipo | Qué es |
|---|---|---|
rndc_filing obligatorio | texto | Número de radicación de la remesa en el RNDC (1 a 100 000 millones). |
number obligatorio | texto | Consecutivo interno de la remesa (alfanumérico, hasta 15 caracteres). |
freight obligatorio | decimal | Pesos, sin decimales (la ley los fija en pesos: no se convierte). |
quantity obligatorio | decimal | Cantidad transportada, sin decimales. |
unit obligatorio | texto | "KGM" kilogramos o "GLL" galones. |
Notario (items[].notary)
| Campo | Tipo | Qué es |
|---|---|---|
property_registration obligatorio | texto | |
commercial_value obligatorio | decimal | Pesos: no se convierte. |
Propiedad de la línea (items[].properties[])
| Campo | Tipo | Qué es |
|---|---|---|
name obligatorio | texto | |
value obligatorio | texto | |
quantity | decimal | Número o texto decimal con punto («150000.50»). |
unit | texto | Unidad de medida (tabla 13.3.6); solo con quantity (por defecto 94). |