Documentación

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#

POST /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

Cuerpo de la solicitud

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
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"
    }
  ]
}'
Respuesta · 201
{
  "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)#

POST /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

Parámetros

id uuid requerido

Id de la factura emitida.

Cuerpo de la solicitud

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
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"
      }
    ]
  }
}'
Respuesta · 201
{
  "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#

POST /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

Parámetros

id uuid requerido

Id de la factura emitida.

Cuerpo de la solicitud

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
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"
    }
  ]
}'
Respuesta · 201
{
  "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#

GET /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 .

Parámetros

id uuid requerido

Id del comprobante.

Devuelve · 200 con el objeto factura · 404 not_found .

cURL
curl "https://edge.datil.com/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43" \
  -H "Authorization: Bearer $DATIL_API_KEY"
Respuesta · 200
{
  "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#

GET /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 .

Parámetros

since date | datetime

Solo comprobantes emitidos desde esta fecha (ISO 8601).

Devuelve · 200 con {"invoices": [ … ]} .

cURL
curl "https://edge.datil.com/api/v1/invoices?since=2026-07-01" \
  -H "Authorization: Bearer $DATIL_API_KEY"
Respuesta · 200
{
  "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)#

GET /api/v1/invoices/:id/ride Bearer

La representación impresa del comprobante, bajo la misma llave.

Parámetros

id uuid requerido

Id del comprobante.

Devuelve · 200 con application/pdf .

cURL
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#

GET /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 .

Parámetros

id uuid requerido

Id del comprobante.

Devuelve · 200 con application/xml · 404 not_ready .

cURL
curl "https://edge.datil.com/api/v1/invoices/9f2c6e1a-4b3d-4e9a-8d2f-5a7c1b9e0d43/xml" \
  -H "Authorization: Bearer $DATIL_API_KEY" \
  -o factura.xml
Sin conexión — reintentando…

Esenciales

Sesión, seguridad, idioma y tema. Sin ellas el sitio no funciona.

Siempre activas