API de compras
El recurso /purchase-invoices emite comprobantes E41 para proveedores informales (no registrados en la DGII). La API exige que el proveedor exista activo en tu catálogo y queda registrado como E41 en tus reportes de compras.
El E41 cubre compras a proveedores informales: tú emites el e-CF a nombre del proveedor porque el proveedor no es contribuyente registrado en la DGII y no puede emitir E31. Si el proveedor figura registrado, usa el E31 que él mismo emite. El cuerpo reusa la misma forma de líneas, impuestos y retenciones que las facturas de venta.
Resumen
Antes de guardar, la API valida que supplierId referencie a un proveedor activo en tu catálogo y que ese proveedor no esté marcado como registrado en la DGII (isRegisteredInDGII = false). Si la suma de pagos no coincide con el total del documento, la API también responde 400.
Operaciones disponibles
-
GET /api/v1/purchase-invoices— Devuelve un PagedResult con los gastos, compras y pagos al exterior del espacio de trabajo; esta ruta no filtra por tipo de e-CF. -
GET /api/v1/purchase-invoices/{id}— Devuelve el detalle completo de un comprobante de compra (E41). -
POST /api/v1/purchase-invoices— Registra un comprobante de compra (E41) emitido al espacio de trabajo por un proveedor. -
POST /api/v1/purchase-invoices/{id}/void— Anula el comprobante; si la DGII ya lo aceptó, emite una nota de crédito (E34) y devuelve su creditNoteId. -
POST /api/v1/purchase-invoices/{id}/edit-amount— Emite una nota de débito (E33) que corrige los montos de el comprobante y devuelve el documentId de esa nota; el original no se modifica. -
POST /api/v1/purchase-invoices/{id}/edit-text— Emite una nota de débito (E33) que corrige la descripción de las líneas de el comprobante y devuelve el documentId de esa nota; el original no se modifica.
/api/v1/purchase-invoices X-Api-Key Estable Devuelve un PagedResult con los gastos, compras y pagos al exterior del espacio de trabajo; esta ruta no filtra por tipo de e-CF.
| Nombre | Tipo | Descripción |
|---|---|---|
pageNumber query | integer Opcional | Página solicitada. Por defecto 1. |
pageSize query | integer Opcional | Tamaño de página. Por defecto 10. La API no impone un máximo. |
search query | string Opcional | Filtra por número, RNC del proveedor o nombre. |
/api/v1/purchase-invoices/{id} X-Api-Key Estable Devuelve el detalle completo de un comprobante de compra (E41).
| Nombre | Tipo | Descripción |
|---|---|---|
id path | string (uuid) Requerido | Identificador del comprobante. |
/api/v1/purchase-invoices X-Api-Key Estable Registra un comprobante de compra (E41) emitido al espacio de trabajo por un proveedor.
| Nombre | Tipo | Descripción |
|---|---|---|
branchId body | string (uuid) Requerido | Sucursal receptora dentro del espacio de trabajo. |
sequence body | string Opcional | Opcional. NCF E41 a usar (formato `E410000000000`). Si lo omites, la API toma el siguiente de la secuencia activa; si no hay una secuencia E41 activa, responde `500`. |
externalReference body | string Opcional | Referencia externa libre del emisor (orden, ticket, ID en tu sistema). |
issuedAt body | string (ISO 8601) Requerido | Fecha de emisión del comprobante. |
paymentTermId body | integer Requerido | Identificador del término de pago aplicable. |
limitDate body | string (ISO 8601) Requerido | Fecha límite asociada al término de pago. |
supplierId body | string (uuid) Opcional | Proveedor activo en el catálogo del espacio de trabajo y no registrado en la DGII (los registrados deben emitir E31). Opcional sólo si la integración no exige proveedor identificable. |
currencyId body | integer Requerido | Identificador de la moneda del comprobante. |
currencyRate body | decimal Requerido | Tasa de cambio aplicada (1 cuando la moneda coincide con DOP). |
freight body | decimal Opcional | Monto del flete o transporte cuando aplica. |
notes body | string Opcional | Notas libres impresas en el comprobante. |
tipoBienServicioComprado body | integer Requerido | Tipo de bienes y servicios comprados según la clasificación del formato 606 de la DGII (1 a 11). Envíalo siempre, porque la API no lo valida; si lo omites, guarda 0 sin avisar y el 606 sale con ese egreso mal clasificado. |
lines body | V1LineDto[] Requerido | Líneas con producto, cantidad, precio, ITBIS y retenciones aplicables. |
payments body | V1PaymentDto[] Opcional | Opcional. Pagos asociados al comprobante; cada elemento lleva referencia y monto. Si lo omites, no se registra ningún pago. |
/api/v1/purchase-invoices/{id}/void X-Api-Key Estable Anula el comprobante; si la DGII ya lo aceptó, emite una nota de crédito (E34) y devuelve su creditNoteId.
| Nombre | Tipo | Descripción |
|---|---|---|
id path | string (uuid) Requerido | Identificador del comprobante de compra. |
/api/v1/purchase-invoices/{id}/edit-amount X-Api-Key Estable Emite una nota de débito (E33) que corrige los montos de el comprobante y devuelve el documentId de esa nota; el original no se modifica.
| Nombre | Tipo | Descripción |
|---|---|---|
id path | string (uuid) Requerido | Identificador del comprobante. |
lines body | V1EditAmountLineDto[] Requerido | Lista de líneas a editar. Cada elemento referencia el orden de la línea original y los campos que se desean sobreescribir. |
lines[].order body | integer Requerido | Posición de la línea en el comprobante original (1 para la primera, 2 para la segunda…). |
lines[].quantity body | decimal Opcional | Nueva cantidad. Solo se aplica si se envía. |
lines[].unitPrice body | decimal Opcional | Nuevo precio unitario. Solo se aplica si se envía. |
lines[].discount body | decimal Opcional | Nuevo descuento aplicable a la línea. |
lines[].recharge body | decimal Opcional | Nuevo recargo aplicable a la línea. |
lines[].taxes body | V1TaxDto[] Opcional | Nueva lista de impuestos aplicables a la línea. |
lines[].withholdings body | V1WithholdingDto[] Opcional | Nueva lista de retenciones aplicables a la línea. |
/api/v1/purchase-invoices/{id}/edit-text X-Api-Key Estable Emite una nota de débito (E33) que corrige la descripción de las líneas de el comprobante y devuelve el documentId de esa nota; el original no se modifica.
| Nombre | Tipo | Descripción |
|---|---|---|
id path | string (uuid) Requerido | Identificador del comprobante. |
lines body | V1EditTextLineDto[] Requerido | Lista de líneas a editar. Cada elemento referencia el orden de la línea original y la nueva descripción. |
lines[].order body | integer Requerido | Posición de la línea en el comprobante original (1 para la primera, 2 para la segunda…). |
lines[].description body | string Requerido | Nueva descripción a imprimir en la línea. |
Ejemplo: registrar comprobante de compra
El cuerpo incluye supplierId (referencia al catálogo de contactos), tipoBienServicioComprado (clasificación del 606, de 1 a 11), sequence (opcional: si lo omites, se usa el siguiente NCF E41 de la secuencia activa) y las líneas con sus impuestos y retenciones. Envía siempre tipoBienServicioComprado: la API no lo valida y, si falta, guarda 0 sin avisar y el 606 sale mal. Ten en cuenta también que el listado de /purchase-invoices devuelve gastos, compras y pagos al exterior mezclados, y que edit-amount y edit-text emiten una nota de débito (E33) nueva en lugar de editar la compra. La respuesta inmediata es la misma que el resto del recurso: documentId y consultationUrl.
POST /api/v1/purchase-invoices
curl -X POST https://tuempresa.factura.com.do/api/v1/purchase-invoices \ -H "X-Api-Key: $FACTURA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "branchId": "b1a2c3d4-e5f6-4789-abcd-1234567890ab", "sequence": "E410000000001", "issuedAt": "2026-05-08T10:00:00Z", "paymentTermId": 1, "limitDate": "2026-05-08T10:00:00Z", "supplierId": "8c2e4f1a-6d3b-4a9e-b7c5-1f0d2e3a4b6c", "tipoBienServicioComprado": 2, "currencyId": 1, "currencyRate": 1, "lines": [ { "code": "INSUMO-21", "order": 1, "description": "Insumos de oficina", "isService": false, "quantity": 5, "unitId": 1, "unitPrice": 1200.00, "taxes": [{ "taxId": "3a5e98e0-33ff-44be-bd37-e3f9b35a25e2", "rate": 18.0, "taxTypeId": 1 }], "withholdings": [{ "withholdingId": "0b6d81a6-083c-449e-8791-770ff5b3379d", "rate": 5.0 }] } ], "payments": [ { "reference": "TR-2026-05-001", "amount": 6720.00 } ] }'const res = await fetch( "https://tuempresa.factura.com.do/api/v1/purchase-invoices", { method: "POST", headers: { "X-Api-Key": process.env.FACTURA_API_KEY!, "Content-Type": "application/json", }, body: JSON.stringify({ branchId, sequence: "E410000000001", issuedAt: new Date().toISOString(), paymentTermId: 1, limitDate: new Date().toISOString(), supplierId, tipoBienServicioComprado: 2, // clasificación 606 (1 a 11); si falta, se guarda 0 currencyId: 1, currencyRate: 1, lines, payments, }), },);if (!res.ok) throw new Error(`factura.com.do: ${res.status}`);const { documentId, consultationUrl } = await res.json();Respuesta
{ "documentId": "c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f", "consultationUrl": "https://ecf.dgii.gov.do/ecf/ConsultaTimbre?RNCEmisor=131000001&ENCF=E410000000001&…"}Ejemplo: 400 cuando el proveedor está registrado en la DGII
{ "success": false, "message": "No se puede crear un Comprobante de Compras (E41) para un proveedor registrado en la DGII."}Validación del proveedor
El E41 se reserva para proveedores informales. Antes de aceptar el POST la API revisa dos condiciones contra el catálogo del espacio de trabajo: el proveedor debe estar activo y no debe estar marcado como registrado en la DGII. Si fallan, responde 400 con { success: false, message }.