Facturas
Emite facturas por el mismo camino que la pantalla Nueva factura: el comprobante se construye, firma y autoriza ante el SRI o la SUNAT, y la respuesta trae su estado y sus enlaces de descarga. La API emite únicamente comprobantes de producción — el modo de pruebas del workspace nunca sale por una llave.
Emitir una factura#
/api/v1/invoices
Bearer
Crea, confirma y emite la factura en una sola llamada. Con
external_ref
, un reintento devuelve
200
con el MISMO comprobante en lugar de emitir dos veces (la primera emisión responde
201
).
Content-Type: application/json
customer.identification
string
requerido
RUC, cédula o identificación fiscal del cliente.
customer.name
string
requerido
Nombre o razón social.
lines[]
array
requerido
Las líneas de la factura — al menos una.
lines[].description
string
requerido
Descripción de la línea.
lines[].unit_price
decimal (string)
requerido
Precio unitario sin impuestos.
lines[].quantity
decimal (string)
Cantidad; por defecto
"1"
.
lines[].discount
decimal (string)
Descuento en monto por línea.
lines[].iva
string
Tarifa de IVA (
"15"
,
"5"
,
"0"
) o tratamiento
"exento"
/
"no_objeto"
.
lines[].code
string
Código propio del producto o servicio.
external_ref
string
Tu identificador de la operación (hasta 255 caracteres) — la clave de idempotencia. Recomendado en toda integración.
issue_date
date
Fecha de emisión (AAAA-MM-DD); por defecto hoy.
transaction_type
string
Clave de un flujo de transacción del libro (ventas) que inicie con factura. Un flujo restringido a puestos del espacio de trabajo no admite llaves de API.
payment_method
string
Código de forma de pago (SRI Tabla 24 / catálogo local); por defecto
"20"
.
payment_terms
object
Condición de pago (Perú):
contado
o
credito
con sus cuotas. Omitido, el comprobante sale con la forma de pago de
payment_method
.
payment_terms.forma_pago
string
credito
exige al menos una cuota y
payment_method
ausente o
"999"
;
contado
exige un
payment_method
liquidado y ninguna cuota.
contadocredito
payment_terms.pending_amount
decimal (string)
Monto neto pendiente de pago; por defecto la suma de las cuotas.
payment_terms.cuotas[]
array
Las cuotas de una venta a crédito.
payment_terms.cuotas[].amount
decimal (string)
Importe de la cuota; las cuotas suman
pending_amount
.
payment_terms.cuotas[].due_date
date
Vencimiento (AAAA-MM-DD), no anterior a la fecha de emisión. Viaja tal cual en
cbc:PaymentDueDate
.
establishment
string
Establecimiento (
"001"
) si emites desde un punto distinto al configurado.
emission_point
string
Punto de emisión (
"002"
); va junto a
establishment
.
customer.email
string
Correo del cliente — recibe el comprobante autorizado.
customer.address
string
Dirección del cliente.
Devuelve
·
201
con el objeto factura (o
200
si
external_ref
ya fue emitido).
422 validation_failed
con
errors
por campo ·
422 emisor_not_configured
·
422 credit_limit_exceeded
(el cliente supera su límite de crédito) ·
409 in_progress
.
curl -X POST https://edge.datil.com/api/v1/invoices \
-H "Authorization: Bearer $DATIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_ref": "orden-1042",
"customer": {
"identification": "0992345678001",
"name": "ACME S.A.",
"email": "pagos@acme.ec"
},
"lines": [
{
"description": "Consultoría mensual",
"quantity": "1",
"unit_price": "100.00",
"iva": "15"
}
]
}'
{
"id": "9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43",
"doc_type": "factura",
"numero": "001-002-000000123",
"access_key": "0307202601179001234500110010020000001231234567811",
"status": "authorized",
"environment": "production",
"issue_date": "2026-07-03",
"currency": "USD",
"total": "115.00",
"customer": {
"identification": "0992345678001",
"name": "ACME S.A."
},
"authorization": {
"status": "AUTORIZADO",
"number": "0307202601179001234500110010020000001231234567811",
"date": "2026-07-03T14:07:00Z"
},
"failure_reason": null,
"links": {
"ride": "/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/ride",
"xml": "/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/xml"
}
}
Ajustar la forma de pago (nota tipo 13)#
/api/v1/invoices/:id/payment-terms-adjustments
Bearer
Perú. Emite una nota de crédito tipo 13 (Catálogo 09, ajustes de montos y/o fechas de la forma de pago) sobre una factura emitida: restablece la venta a crédito con las cuotas indicadas sobre el monto pendiente de pago de la factura. La nota no acredita importes.
Content-Type: application/json
id
uuid
requerido
Id de la factura emitida.
issue_date
date
Fecha de emisión de la nota (AAAA-MM-DD); por defecto hoy en Lima.
payment_terms
object
requerido
La condición de pago que la nota restablece:
credito
con sus cuotas. Sin
pending_amount
, la nota declara el monto pendiente vigente de la factura y las cuotas deben sumarlo; envíalo solo para corregirlo, nunca por encima del total de la factura.
payment_terms.forma_pago
string
credito
exige al menos una cuota y
payment_method
ausente o
"999"
;
contado
exige un
payment_method
liquidado y ninguna cuota.
contadocredito
payment_terms.pending_amount
decimal (string)
Monto neto pendiente de pago; por defecto la suma de las cuotas.
payment_terms.cuotas[]
array
Las cuotas de una venta a crédito.
payment_terms.cuotas[].amount
decimal (string)
Importe de la cuota; las cuotas suman
pending_amount
.
payment_terms.cuotas[].due_date
date
Vencimiento (AAAA-MM-DD), no anterior a la fecha de emisión. Viaja tal cual en
cbc:PaymentDueDate
.
notes
string
Motivo de la nota; por defecto la leyenda del tipo 13.
external_ref
string
Clave de idempotencia (hasta 255 caracteres), compartida con los demás endpoints que crean documentos en el libro. Un reintento devuelve la misma nota sin emitir otra.
Devuelve
·
201
con el objeto nota (la forma de las facturas) más
credited_document_number
y
reason_code
·
200
con la misma nota si el
external_ref
ya se emitió ·
422 validation_failed
con
errors
por campo (factura al contado o que no es factura, cuotas que no suman el pendiente, pendiente mayor al total, vencimientos que no son posteriores a la emisión de la factura) ·
404 not_found
·
409 in_progress
·
422 emisor_not_configured
.
curl -X POST https://edge.datil.com/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/payment-terms-adjustments \
-H "Authorization: Bearer $DATIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"issue_date": "2026-09-15",
"payment_terms": {
"forma_pago": "credito",
"cuotas": [
{
"amount": "57.50",
"due_date": "2026-10-15"
},
{
"amount": "57.50",
"due_date": "2026-11-14"
}
]
}
}'
{
"id": "3c1f7e9b-2d4a-4c8e-9b1f-6e2d5a8c0f17",
"doc_type": "credit_note",
"numero": "F001-00000124",
"access_key": "F001-00000124",
"status": "authorized",
"environment": "production",
"issue_date": "2026-09-15",
"currency": "PEN",
"total": "0.00",
"customer": {
"identification": "20605145648",
"name": "ACME S.A.C."
},
"authorization": {
"status": "ACEPTADO",
"number": "F001-00000124",
"date": "2026-09-15T14:07:00Z"
},
"failure_reason": null,
"links": {
"ride": "/api/v1/invoices/3c1f7e9b-2d4a-4c8e-9b1f-6e2d5a8c0f17/ride",
"xml": "/api/v1/invoices/3c1f7e9b-2d4a-4c8e-9b1f-6e2d5a8c0f17/xml"
},
"credited_document_number": "F001-00000123",
"reason_code": "13"
}
Emitir una nota de crédito#
/api/v1/invoices/:id/credit-notes
Bearer
Acredita en todo o en parte una factura emitida. Cada línea nombra la línea de la factura que acredita por su código, descripción y precio unitario; el descuento y el IVA de la línea dicen cuánto se acredita. No se acredita más de lo facturado, contando las notas anteriores. Idempotente por
external_ref
, como una factura.
Content-Type: application/json
id
uuid
requerido
Id de la factura emitida.
notes
string
requerido
Motivo de la nota de crédito.
lines[]
array
requerido
Las líneas acreditadas — al menos una.
lines[].code
string
Código de la línea de la factura que se acredita.
lines[].description
string
requerido
Descripción de la línea de la factura que se acredita.
lines[].unit_price
decimal (string)
requerido
Precio unitario de la línea de la factura, sin impuestos.
lines[].quantity
decimal (string)
Cantidad acreditada, hasta la facturada; por defecto
"1"
.
lines[].discount
decimal (string)
Descuento en monto: lo que de la línea no se acredita.
lines[].iva
string
Tarifa de IVA de la línea (
"15"
).
lines[].tax
decimal (string)
IVA acreditado de la línea, en monto.
external_ref
string
Tu identificador de la operación — la clave de idempotencia.
issue_date
date
Fecha de emisión de la nota (AAAA-MM-DD); por defecto hoy.
Devuelve
·
201
con el objeto nota (la forma de las facturas) más
credited_document_number
·
200
con la misma nota si el
external_ref
ya se emitió ·
422 validation_failed
con
errors
por campo (sin motivo, sin líneas, más de lo facturado) ·
404 not_found
·
409 in_progress
·
422 emisor_not_configured
.
curl -X POST https://edge.datil.com/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/credit-notes \
-H "Authorization: Bearer $DATIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_ref": "devolucion-1042",
"notes": "Devolución parcial del servicio",
"lines": [
{
"description": "Consultoría mensual",
"quantity": "1",
"unit_price": "100.00",
"discount": "40.00",
"iva": "15",
"tax": "9.00"
}
]
}'
{
"id": "7d2e4f10-5b6a-4c3d-8e9f-1a2b3c4d5e6f",
"doc_type": "credit_note",
"numero": "001-002-000000045",
"access_key": "001-002-000000045",
"status": "authorized",
"environment": "production",
"issue_date": "2026-07-10",
"currency": "USD",
"total": "69.00",
"customer": {
"identification": "0992345678001",
"name": "ACME S.A."
},
"authorization": {
"status": "AUTORIZADO",
"number": "001-002-000000045",
"date": "2026-07-10T14:07:00Z"
},
"failure_reason": null,
"links": {
"ride": "/api/v1/invoices/7d2e4f10-5b6a-4c3d-8e9f-1a2b3c4d5e6f/ride",
"xml": "/api/v1/invoices/7d2e4f10-5b6a-4c3d-8e9f-1a2b3c4d5e6f/xml"
},
"credited_document_number": "001-002-000000123",
"reason_code": null
}
Consultar una factura#
/api/v1/invoices/:id
Bearer
El estado del ciclo de vida y el resultado de la autorización. Solo comprobantes de producción del libro de la llave — cualquier otro id responde
404
.
id
uuid
requerido
Id del comprobante.
Devuelve
·
200
con el objeto factura ·
404 not_found
.
curl "https://edge.datil.com/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43" \
-H "Authorization: Bearer $DATIL_API_KEY"
{
"id": "9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43",
"doc_type": "factura",
"numero": "001-002-000000123",
"access_key": "0307202601179001234500110010020000001231234567811",
"status": "authorized",
"environment": "production",
"issue_date": "2026-07-03",
"currency": "USD",
"total": "115.00",
"customer": {
"identification": "0992345678001",
"name": "ACME S.A."
},
"authorization": {
"status": "AUTORIZADO",
"number": "0307202601179001234500110010020000001231234567811",
"date": "2026-07-03T14:07:00Z"
},
"failure_reason": null,
"links": {
"ride": "/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/ride",
"xml": "/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/xml"
}
}
Listar facturas#
/api/v1/invoices
Bearer
Los comprobantes emitidos del libro, los más recientes primero, hasta 100 por llamada. Para filtros y paginación completos usa
GET /api/v1/documents
.
since
date | datetime
Solo comprobantes emitidos desde esta fecha (ISO 8601).
Devuelve
·
200
con
{"invoices": [ … ]}
.
curl "https://edge.datil.com/api/v1/invoices?since=2026-07-01" \
-H "Authorization: Bearer $DATIL_API_KEY"
{
"invoices": [
{
"access_key": "0307202601179001234500110010020000001231234567811",
"authorization": {
"date": "2026-07-03T14:07:00Z",
"number": "0307202601179001234500110010020000001231234567811",
"status": "AUTORIZADO"
},
"currency": "USD",
"customer": {
"identification": "0992345678001",
"name": "ACME S.A."
},
"doc_type": "factura",
"environment": "production",
"failure_reason": null,
"id": "9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43",
"issue_date": "2026-07-03",
"links": {
"ride": "/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/ride",
"xml": "/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/xml"
},
"numero": "001-002-000000123",
"status": "authorized",
"total": "115.00"
}
]
}
Descargar el RIDE (PDF)#
/api/v1/invoices/:id/ride
Bearer
La representación impresa del comprobante, bajo la misma llave.
id
uuid
requerido
Id del comprobante.
Devuelve
·
200
con
application/pdf
.
curl "https://edge.datil.com/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/ride" \
-H "Authorization: Bearer $DATIL_API_KEY" \
-o factura.pdf
Descargar el XML legal#
/api/v1/invoices/:id/xml
Bearer
El XML autorizado (o, si aún no hay autorización, el firmado). Sin XML todavía:
404 not_ready
.
id
uuid
requerido
Id del comprobante.
Devuelve
·
200
con
application/xml
·
404 not_ready
.
curl "https://edge.datil.com/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/xml" \
-H "Authorization: Bearer $DATIL_API_KEY" \
-o factura.xml