API de gastos
El recurso /expenses registra gastos menores (E43): viáticos, peajes, propinas y otros egresos sin proveedor identificable. La regla operativa que el handler aplica hoy es de impuesto, no de monto: el comprobante solo acepta líneas con ITBIS exento (0%).
Resumen
El DTO V1CreateMinorExpenseDto es similar al de compras pero no expone supplierId: el E43 vive sin proveedor identificable. La validación específica del E43 que vive en el dominio (E43DocumentValidations.ValidateRequiredTax) exige que cada línea use el impuesto exento (rate 0%); si una línea trae 18% u otra tasa, el handler rechaza el documento. Para egresos con proveedor formal y RNC, registra el comprobante como compra (E41).
Operaciones disponibles
-
GET /api/v1/expenses— 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/expenses/{id}— Devuelve el detalle completo de un gasto menor (E43). -
POST /api/v1/expenses— Registra un gasto menor (E43) con detalle por líneas hasta el tope DGII. -
POST /api/v1/expenses/{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/expenses/{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/expenses/{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/expenses 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 de comprobante o descripciones de las líneas. |
/api/v1/expenses/{id} X-Api-Key Estable Devuelve el detalle completo de un gasto menor (E43).
| Nombre | Tipo | Descripción |
|---|---|---|
id path | string (uuid) Requerido | Identificador del gasto. |
/api/v1/expenses X-Api-Key Estable Registra un gasto menor (E43) con detalle por líneas hasta el tope DGII.
| Nombre | Tipo | Descripción |
|---|---|---|
branchId body | string (uuid) Requerido | Sucursal receptora dentro del espacio de trabajo. |
sequence body | string Opcional | Opcional. NCF E43 a usar (formato `E430000000000`). Si lo omites, la API toma el siguiente de la secuencia activa; si no hay una secuencia E43 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. |
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 concepto, cantidad, precio unitario, descuento, recargo, impuestos 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/expenses/{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 gasto. |
/api/v1/expenses/{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 gasto. |
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/expenses/{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 gasto menor
El cuerpo replica el de una compra (E41) sin supplierId: branchId, tipoBienServicioComprado (clasificación del 606, de 1 a 11), sequence (opcional: si lo omites, se usa el siguiente NCF E43 de la secuencia activa), lines y payments. Envía siempre tipoBienServicioComprado: la API no lo valida y, si falta, guarda 0 sin avisar y el 606 sale mal. Para egresos sin ITBIS la línea va con isExempt: true y taxes vacío. El listado de /expenses devuelve gastos, compras y pagos al exterior mezclados, y edit-amount y edit-text emiten una nota de débito (E33) nueva. La respuesta es la convención del recurso: documentId y consultationUrl.
POST /api/v1/expenses
curl -X POST https://tuempresa.factura.com.do/api/v1/expenses \ -H "X-Api-Key: $FACTURA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "branchId": "b1a2c3d4-e5f6-4789-abcd-1234567890ab", "sequence": "E430000000001", "issuedAt": "2026-05-08T10:00:00Z", "paymentTermId": 1, "limitDate": "2026-05-08T10:00:00Z", "currencyId": 1, "currencyRate": 1, "tipoBienServicioComprado": 2, "notes": "Peaje autopista Las Américas", "lines": [ { "code": "PEAJE", "order": 1, "description": "Peaje autopista Las Américas", "isService": true, "quantity": 1, "unitId": 1, "unitPrice": 350.00, "isExempt": true, "taxes": [] } ], "payments": [ { "reference": "EFECTIVO", "amount": 350.00 } ] }'const res = await fetch( "https://tuempresa.factura.com.do/api/v1/expenses", { method: "POST", headers: { "X-Api-Key": process.env.FACTURA_API_KEY!, "Content-Type": "application/json", }, body: JSON.stringify({ branchId, sequence: "E430000000001", issuedAt: new Date().toISOString(), paymentTermId: 1, limitDate: new Date().toISOString(), currencyId: 1, currencyRate: 1, tipoBienServicioComprado: 2, // clasificación 606 (1 a 11); si falta, se guarda 0 notes: "Peaje autopista Las Américas", lines, payments, }), },);if (!res.ok) throw new Error(`factura.com.do: ${res.status}`);const { documentId, consultationUrl } = await res.json();Respuesta
{ "documentId": "e3b0c442-98fc-4c14-9afb-f4c8996fb924", "consultationUrl": "https://ecf.dgii.gov.do/ecf/ConsultaTimbre?RNCEmisor=131000001&ENCF=E430000000001&…"}Ejemplo: 400 cuando una línea trae ITBIS distinto a exento
El handler invoca ValidateE43Rules sobre las tasas declaradas. Si encuentra una distinta de cero responde con la regla del dominio textual.
{ "success": false, "message": "Los comprobantes E43 (Comprobante para gastos menores) solo permiten el impuesto exento (0%)."}Gasto menor vs. compra formal
- Gasto menor (E43): sin proveedor identificable, líneas con ITBIS exento. Casos: peaje, propina, viáticos puntuales.
- Compra formal (E41): proveedor en tu catálogo no registrado en la DGII, líneas con ITBIS y retenciones. Casos: insumos, servicios profesionales, alquileres.