Documentación · Referencia · API v1 · versión 2026-10-22
Eventos RADIAN
Las operaciones de Eventos RADIAN de la API de Trevol: parámetros, cuerpo, respuestas y ejemplos de código.
Eventos sobre facturas: el acuse (030), el reclamo (031), el recibo del bien (032) y la aceptación expresa (033) de una factura RECIBIDA, y la aceptación tácita (034) de una factura PROPIA a crédito. Un rechazo es final: el siguiente intento es otro evento. Solo xml. Los eventos 035 a 051 necesitan un participante RADIAN y no están disponibles.
Los ejemplos son peticiones con cURL. La llave va en TREVOL_API_KEY; los cuerpos de ejemplo son los de la especificación. Los errores comunes están en Errores.
Emitir un evento RADIAN
POST /v1/radian_events · createRadianEvent
Envía un evento RADIAN sobre una factura: el acuse de recibo (030), el reclamo (031), el recibo del bien o servicio (032) y la aceptación expresa (033) de una factura RECIBIDA (invoice), o la aceptación tácita (034) de una factura PROPIA a crédito: de Trevol (invoice_id) o emitida antes con otro software y traída por la sincronización con la DIAN (invoice: {cufe, number?}; exactamente uno de los dos). Los eventos 035 a 051 necesitan un participante RADIAN y no están disponibles. El 030 y el 032 necesitan el representante legal de la empresa (lo firma): se configura en la app. Un rechazo es final: el siguiente intento es otro evento, con otro número (POST nuevo). Un evento vivo del mismo código sobre la misma factura es 409 duplicate_document con existing_id: reintenta ese con POST …/send. already_registered: true (con 201) solo significa que la DIAN ya mostraba el CUDE de ESTE evento; si la factura ya tenía ese evento por otro camino es 422 dian_rejected con already_registered_elsewhere: true. La DIAN pide el evento anterior antes del siguiente: en la 2026-10-21 es 409 previous_event_pending; en la 2026-10-22, 202 processing y Trevol lo manda cuando aparezca. Si la DIAN contesta 98 («en proceso de validación») es 202 validating: no reenvíes. Para saber si el 034 procede antes de pedirlo, usa GET /v1/invoices/{id}/tacit_acceptance (o, por CUFE, GET /v1/radian_events/tacit_acceptance?cufe=…).
Respuestas. 201 la DIAN lo validó (status: accepted). 202 solo en la versión 2026-10-22: la DIAN no contestó (processing), otra petición lo está enviando (sending) o, en habilitación, el set de pruebas todavía lo valida (validating, en las dos versiones); trae Location y Retry-After, y el resultado llega por GET y por webhook: no crees otro documento para la misma operación. 422 validation_error (se revisó a fondo ANTES de reservar: no se gastó el número, y errors[] dice el campo), dian_rejected (con document y las reglas traducidas; un rechazo es final: el siguiente intento es otro POST, con otro número), company_not_enabled o numbering_unavailable (con reason). 402 insufficient_balance (producción sin saldo: queda pending con su número). 409 external_id_in_use o duplicate_document (con existing_id). 503 dian_unavailable en la 2026-10-21. Pide Idempotency-Key: repetir la misma devuelve lo mismo sin enviar nada.
Parámetros
Idempotency-KeycabeceratextoobligatorioObligatoria: 1 a 255 caracteres ASCII visibles, única por pedido (7 días).
Cuerpo (RadianEventInput, obligatorio)
external_idtextoTu identificador del documento: único entre los documentos API de la empresa y el ambiente. En los eventos es único entre los eventos (aparte de las facturas y las nóminas).event_codetextoobligatorio"030" acuse de recibo, "031" reclamo, "032" recibo del bien o servicio, "033" aceptación expresa (las cuatro sobre una factura RECIBIDA) o "034" aceptación tácita (sobre una factura PROPIA a crédito). Los 035 a 051 necesitan un participante RADIAN y no están disponibles.invoiceReceivedInvoice030–033: la factura RECIBIDA sobre la que va el evento (CUFE, número y quién la emitió). 034: la factura PROPIA por su CUFE,{cufe, number?}(solo esos dos), en lugar deinvoice_id: sirve también para las facturas que no se emitieron con Trevol (las trae la sincronización con la DIAN). Si el CUFE es de una factura de Trevol, es lo mismo que mandar suinvoice_id.invoice_idtexto034: el id (inv_…) de una factura de Trevol: propia, validada, a crédito y que no sea de consumidor final. Va aparte deinvoicepara que cada esquema sea plano en los SDK. Para una factura que no se emitió con Trevol, usainvoice: {cufe}(exactamente uno de los dos).claimEventClaimSolo en el reclamo (031) y obligatorio en él: {code: "01" a "04", note?}.softwareown|dian_free030–033:own(el Software Propio de la empresa, por defecto) odian_free(el software gratuito de la DIAN). El 034 se firma con el Software Propio.providerdian|company030–033: quién es el proveedor tecnológico:dian(por defecto condian_free) ocompany(por defecto conown).
Respuestas
| Estado | Qué pasó |
|---|---|
| 201 | El documento (RadianEvent) |
| 202 | Versión 2026-10-22: la DIAN no contestó (status: processing; Trevol termina el documento y avisa por webhook; no crees otro documento para la misma venta, y si repites con la misma Idempotency-Key respondemos sin enviar) o el documento se está enviando (status: sending); también la contingencia (status: contingency). Lleva Location y, salvo la contingencia, Retry-After: 30. En 2026-10-21 la DIAN sin contestar es un 503 dian_unavailable. También status: validating (en las dos versiones): la DIAN respondió 98; reintentar con la misma Idempotency-Key o POST …/send responde lo mismo SIN reenviar. En la 2026-10-21, el evento anterior que aún no aparece es 409 previous_event_pending. (RadianEvent) |
| 402 | Error (application/problem+json) (Problem) |
| 409 | Error (application/problem+json) (Problem) |
| 422 | Error (application/problem+json) (Problem) |
| 429 | Error (application/problem+json) (Problem) |
| 503 | Error (application/problem+json) (Problem) |
| Error | Error (application/problem+json) (Problem) |
POST /v1/radian_events
curl -X POST "https://api.trevol.si/v1/radian_events" \
-H "Authorization: Bearer $TREVOL_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"external_id": "ERP-ACUSE-OJ1234",
"event_code": "030",
"invoice": {
"cufe": "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"number": "OJ1234",
"type": "01",
"issuer": {
"nit": "890330031",
"check_digit": 3,
"document_type": "31",
"name": "OSPINA Y ASOCIADOS SAS"
}
}
}'{
"id": "rev_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b",
"object": "radian_event",
"environment": "test",
"status": "accepted",
"event_code": "030",
"number": "AR994000123",
"prefix": "AR",
"external_id": "ERP-ACUSE-OJ1234",
"origin": "api",
"cude": "abababababababababababababababababababababababababababababababababababababababababababababababab",
"issued_at": "2026-10-23T09:15:02-05:00",
"invoice": {
"cufe": "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"number": "OJ1234",
"type": "01",
"issuer": {
"nit": "890330031",
"check_digit": 3,
"document_type": "31",
"name": "OSPINA Y ASOCIADOS SAS"
}
},
"claim": null,
"software": "own",
"provider": "company",
"dian": {
"status_code": "02",
"message": "Documento validado por la DIAN",
"rules": []
},
"already_registered": false,
"already_registered_elsewhere": false,
"tacit": false,
"created_at": "2026-10-23T09:15:02-05:00",
"updated_at": "2026-10-23T09:15:03-05:00"
}Reenviar una pendiente o en error
POST /v1/radian_events/{id}/send · sendRadianEvent
Vuelve a enviar un evento pending o error con el mismo número (por ejemplo, un 034 que todavía no procedía o un 031 que esperaba al evento anterior). Un evento que la DIAN verifica (validating) solo consulta; uno rejected es final (409 invalid_state): crea otro con POST.
Sin cuerpo. Con un documento accepted responde 200 con el documento tal cual; con uno que la DIAN todavía verifica no reenvía nada (202); con uno rejected es 409 invalid_state (se corrige con PUT). No pide Idempotency-Key (reintentarlo es seguro).
Respuestas
| Estado | Qué pasó |
|---|---|
| 200 | El documento (RadianEvent) |
| 202 | Versión 2026-10-22: la DIAN no contestó (status: processing; Trevol termina el documento y avisa por webhook; no crees otro documento para la misma venta, y si repites con la misma Idempotency-Key respondemos sin enviar) o el documento se está enviando (status: sending); también la contingencia (status: contingency). Lleva Location y, salvo la contingencia, Retry-After: 30. En 2026-10-21 la DIAN sin contestar es un 503 dian_unavailable. También status: validating (en las dos versiones): la DIAN respondió 98; reintentar con la misma Idempotency-Key o POST …/send responde lo mismo SIN reenviar. En la 2026-10-21, el evento anterior que aún no aparece es 409 previous_event_pending. (RadianEvent) |
| 409 | Error (application/problem+json) (Problem) |
| Error | Error (application/problem+json) (Problem) |
POST /v1/radian_events/{id}/send
curl -X POST "https://api.trevol.si/v1/radian_events/rev_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b/send" \
-H "Authorization: Bearer $TREVOL_API_KEY"{
"id": "rev_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b",
"object": "radian_event",
"environment": "test",
"status": "accepted",
"event_code": "030",
"number": "AR994000123",
"prefix": "AR",
"external_id": "ERP-ACUSE-OJ1234",
"origin": "api",
"cude": "abababababababababababababababababababababababababababababababababababababababababababababababab",
"issued_at": "2026-10-23T09:15:02-05:00",
"invoice": {
"cufe": "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"number": "OJ1234",
"type": "01",
"issuer": {
"nit": "890330031",
"check_digit": 3,
"document_type": "31",
"name": "OSPINA Y ASOCIADOS SAS"
}
},
"claim": null,
"software": "own",
"provider": "company",
"dian": {
"status_code": "02",
"message": "Documento validado por la DIAN",
"rules": []
},
"already_registered": false,
"already_registered_elsewhere": false,
"tacit": false,
"created_at": "2026-10-23T09:15:02-05:00",
"updated_at": "2026-10-23T09:15:03-05:00"
}Listar (evento RADIAN)
GET /v1/radian_events · listRadianEvents
Paginación por cursor y filtros status, external_id, created_from, created_to, event_code y invoice_cufe (el CUFE de la factura).
Parámetros
limitconsultaenterostarting_afterconsultatextostatusconsultatextoexternal_idconsultatextocreated_fromconsultatextocreated_toconsultatextoevent_codeconsulta030|031|032|033|034invoice_cufeconsultatexto
Respuestas
| Estado | Qué pasó |
|---|---|
| 200 | {object: list, data, has_more, next_cursor} (objeto) |
| Error | Error (application/problem+json) (Problem) |
GET /v1/radian_events
curl "https://api.trevol.si/v1/radian_events?limit=100" \
-H "Authorization: Bearer $TREVOL_API_KEY"Un evento radian
GET /v1/radian_events/{id} · retrieveRadianEvent
El evento tal como se envió, con su número, su CUDE, la factura y la respuesta de la DIAN. already_registered, already_registered_elsewhere y tacit se deducen de lo guardado.
Respuestas
| Estado | Qué pasó |
|---|---|
| 200 | El documento (RadianEvent) |
| Error | Error (application/problem+json) (Problem) |
GET /v1/radian_events/{id}
curl "https://api.trevol.si/v1/radian_events/rev_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b" \
-H "Authorization: Bearer $TREVOL_API_KEY"{
"id": "rev_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b",
"object": "radian_event",
"environment": "test",
"status": "accepted",
"event_code": "030",
"number": "AR994000123",
"prefix": "AR",
"external_id": "ERP-ACUSE-OJ1234",
"origin": "api",
"cude": "abababababababababababababababababababababababababababababababababababababababababababababababab",
"issued_at": "2026-10-23T09:15:02-05:00",
"invoice": {
"cufe": "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"number": "OJ1234",
"type": "01",
"issuer": {
"nit": "890330031",
"check_digit": 3,
"document_type": "31",
"name": "OSPINA Y ASOCIADOS SAS"
}
},
"claim": null,
"software": "own",
"provider": "company",
"dian": {
"status_code": "02",
"message": "Documento validado por la DIAN",
"rules": []
},
"already_registered": false,
"already_registered_elsewhere": false,
"tacit": false,
"created_at": "2026-10-23T09:15:02-05:00",
"updated_at": "2026-10-23T09:15:03-05:00"
}Archivo xml
GET /v1/radian_events/{id}/xml · downloadRadianEventXml
El ApplicationResponse firmado que se mandó a la DIAN (application/xml). Los eventos no tienen PDF, ZIP ni dian_response.
Respuestas
| Estado | Qué pasó |
|---|---|
| 200 | xml (archivo) |
| Error | Error (application/problem+json) (Problem) |
GET /v1/radian_events/{id}/xml
curl "https://api.trevol.si/v1/radian_events/rev_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b/xml" \
-H "Authorization: Bearer $TREVOL_API_KEY" \
-o radian_event_xml.xml¿Procede ya la aceptación tácita (034) de esta factura? (por CUFE)
GET /v1/radian_events/tacit_acceptance · retrieveTacitAcceptanceByCufe
Lo mismo que GET /v1/invoices/{id}/tacit_acceptance, pero por el CUFE de la factura propia: sirve también para las facturas que no se emitieron con Trevol (emitidas antes, con otro software, y traídas por la sincronización con la DIAN; la sincronización trae las de producción). Consulta GetStatusEvent y aplica la regla de los 3 días hábiles; no envía nada. invoice_id solo sale si la factura es de Trevol. 404 si el CUFE no es de una factura propia de la empresa y el ambiente de la llave; 422 si falta cufe o la factura no admite el 034 (de contado, una nota, a consumidor final, sin el XML leído por la sincronización…); 429 con más de 30 consultas por minuto por llave (el mismo límite de la otra consulta); 503 si la DIAN no contesta (reintentable).
Parámetros
cufeconsultatextoobligatorioEl CUFE de la factura propia.
Respuestas
| Estado | Qué pasó |
|---|---|
| 200 | El resultado (TacitAcceptance) |
| Error | Error (application/problem+json) (Problem) |
GET /v1/radian_events/tacit_acceptance
curl "https://api.trevol.si/v1/radian_events/tacit_acceptance?cufe=abababababababababababababababababababababababababababababababababababababababababababababababab" \
-H "Authorization: Bearer $TREVOL_API_KEY"{
"object": "tacit_acceptance",
"cufe": "abababababababababababababababababababababababababababababababababababababababababababababababab",
"number": "FE4722",
"allowed": true,
"available_from": "2025-05-14",
"rules": []
}