Saltar al contenido
↑↓ navegar ↵ abrir Esc cerrar
Recurso · E43

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

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

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

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

expense.sh
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 }
]
}'
expense.ts
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

response.json
{
"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.

400-impuesto-no-exento.json
{
"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.

Siguientes pasos

Siguiente paso

Continúa por aquí