Guía de inicio
Tu primer comprobante en cuatro llamadas
La API recibe los datos de una venta y se encarga del resto: calcula los montos, genera el XML de la DGII, lo firma con tu certificado, lo envía y guarda el resultado. Todo funciona sobre HTTPS con JSON.
Estado del producto. El motor está en pruebas. Hasta completar la validación con el ambiente de pre-certificación de la DGII, los comprobantes no tienen validez fiscal. Las empresas se crean en el ambiente testecf.
URL BASE
Cada empresa tiene su propia llave y sus datos están aislados de las demás. El emisor de cada comprobante es siempre tu empresa: el RNC viene de tu cuenta, no de la petición.
Autenticación
Mammoth da de alta tu empresa y te entrega una llave que empieza con ecf_. Envíala en cada petición:
Authorization: Bearer ecf_xxxxxxxxxxxxxxxx
La llave se muestra una sola vez; guárdala en un lugar seguro. Puedes crear otras y desactivar las que no uses desde el panel o con POST /llaves y DELETE /llaves/:id. No puedes desactivar la única llave activa.
No pongas la llave en código que corra en un navegador o una app móvil. Llama a la API desde tu servidor.
1. Carga tu certificado digital
Para firmar necesitas el certificado digital de tu empresa (archivo .p12 o .pfx) y su contraseña. Se guarda cifrado y no se vuelve a mostrar. El RNC o la cédula del certificado debe coincidir con el RNC de tu empresa; si no coincide, la respuesta incluye una advertencia.
curl -X PUT /certificado \
-H "Authorization: Bearer $LLAVE" -H "Content-Type: application/json" \
-d "{\"p12_base64\": \"$(base64 -w0 certificado.p12)\", \"password\": \"tu-contraseña\"}"
RESPUESTA
{ "ok": true, "titular_id": "131880600", "valido_hasta": "2027-10-02T00:00:00.000Z", "advertencias": [] }
Subir otro certificado reemplaza al anterior. Un certificado vencido o con la contraseña incorrecta se rechaza.
2. Registra tus secuencias de e-NCF
La DGII te autoriza rangos de numeración por tipo de comprobante (se piden en la Oficina Virtual). Regístralos tal como te los autorizaron:
curl -X POST /secuencias \
-H "Authorization: Bearer $LLAVE" -H "Content-Type: application/json" \
-d '{ "tipo": 31, "desde": 1, "hasta": 1000, "vence": "2027-12-31" }'
El motor entrega los números en orden, sin repetirlos, y rechaza una secuencia agotada, vencida o que se solape con otra. vence es obligatorio para los tipos 31 y 33; los tipos 32 y 34 no vencen.
3. Emite un comprobante
Envías la venta sin e-NCF: el motor reserva el siguiente número, calcula, genera y firma. Responde 202 porque el envío a la DGII ocurre después.
curl -X POST /comprobantes \
-H "Authorization: Bearer $LLAVE" -H "Content-Type: application/json" \
-d '{
"idempotency_key": "orden-5521",
"tipo": 31,
"tipoPago": 1,
"emisor": { "razonSocial": "MI EMPRESA SRL", "direccion": "Av. Winston Churchill 10, Santo Domingo" },
"comprador": { "rnc": "101672919", "razonSocial": "Cliente SRL" },
"formasPago": [{ "forma": 1, "monto": 118 }],
"items": [
{ "nombre": "Consultoría", "tipo": 2, "cantidad": 1, "precio": 100, "itbis": 18 }
]
}'
RESPUESTA 202
{ "id": "25c72c31-…", "encf": "E310000000001", "estado": "pendiente", "monto_total": 118,
"codigo_seguridad": "kP3x9Q", "via_resumen": false,
"totales": { "montoGravadoTotal": "100.00", "totalItbis": "18.00", "montoTotal": "118.00" } }
- Los precios van sin ITBIS. El motor calcula el impuesto por línea y el total.
- Idempotencia. Si repites la petición con la misma
idempotency_key(por un corte de red, por ejemplo), recibes el mismo comprobante con"repetido": truey no se gasta otro número. - Si los datos no cumplen el esquema de la DGII, recibes
422con el detalle y no se consume ningún e-NCF.
Después consulta el resultado con GET /comprobantes/{id} (también acepta el e-NCF en lugar del id). El XML firmado se descarga en GET /comprobantes/{id}/xml.
Factura de consumo (tipo 32)
No necesita comprador ni fecha de vencimiento; sin comprador se usa «Consumidor Final». Las facturas de consumo menores de RD$250,000 no se envían completas a la DGII: se envía un resumen (RFCE) y el comprobante completo se conserva. El motor lo hace por ti; la respuesta trae "via_resumen": true y puedes descargar el resumen en GET /comprobantes/{id}/resumen. Tú debes conservar el comprobante completo y ponerlo a disposición de tu cliente.
Nota de crédito (tipo 34)
Requiere la referencia al comprobante que modifica:
{ "tipo": 34, "tipoPago": 1,
"emisor": { "razonSocial": "MI EMPRESA SRL", "direccion": "Av. Winston Churchill 10" },
"referencia": { "ncfModificado": "E310000000001", "fecha": "02-10-2026", "codigoModificacion": 3, "razon": "Corrección de importe" },
"items": [{ "nombre": "Consultoría (ajuste)", "tipo": 2, "cantidad": 1, "precio": 10, "itbis": 18 }] }
Los códigos de modificación son los de la tabla del Formato e-CF de la DGII: 1 anula el documento, 2 corrige texto, 3 corrige montos, 4 reemplaza un e-NCF emitido en contingencia y 5 referencia una factura de consumo. El tipo 33 (nota de débito) funciona igual, con su secuencia propia.
Campos del comprobante
| Campo | Obligatorio | Descripción |
|---|---|---|
| tipo | Sí | 31 crédito fiscal, 32 consumo, 33 nota de débito, 34 nota de crédito. |
| tipoPago | Sí | 1 contado, 2 crédito. |
| emisor | Sí | razonSocial y direccion obligatorios. Opcionales: nombreComercial, sucursal, correo, telefonos, actividadEconomica, numeroFacturaInterna. El RNC es el de tu empresa. |
| comprador | 31, 33: sí | rnc, razonSocial, correo, direccion, contacto. |
| items[] | Sí | Hasta 1,000 líneas. Ver abajo. |
| fechaEmision | No | DD-MM-AAAA. Por defecto, hoy en hora de República Dominicana. |
| formasPago[] | No | { forma, monto }, hasta 7. Formas: 1 efectivo, 2 cheque/transferencia/depósito, 3 tarjeta, 4 venta a crédito, 5 bonos o certificados de regalo, 6 permuta, 7 nota de crédito, 8 otras. |
| tipoIngresos | No | Por defecto "01" (ingresos por operaciones). Otros: 02 financieros, 03 extraordinarios, 04 arrendamientos, 05 venta de activo depreciable, 06 otros. |
| fechaLimitePago | No | DD-MM-AAAA, para ventas a crédito. |
| referencia | 33, 34: sí | ncfModificado, fecha, codigoModificacion, y opcionales razon, rncOtroContribuyente. |
| indicadorNotaCredito | No | Solo tipo 34: 0 dentro de 30 días, 1 pasados 30 días. |
| idempotency_key | No | Texto único por venta (hasta 120 caracteres). Recomendado. |
Cada línea (items)
| Campo | Obligatorio | Descripción |
|---|---|---|
| nombre | Sí | Nombre del bien o servicio. |
| tipo | Sí | 1 bien, 2 servicio. |
| cantidad | Sí | Mayor que cero, hasta 2 decimales. |
| precio | Sí | Precio unitario sin ITBIS, hasta 4 decimales. |
| itbis | Sí | 18, 16, 0 o "exento". |
| descuento | No | Monto total del descuento de la línea (no porcentaje). |
| unidadMedida | No | Código de unidad de la tabla de la DGII. |
| descripcion | No | Texto adicional. |
| propinaLegal | No | true si a esa línea se le aplica la propina legal del 10 % (negocios que la cobran, como restaurantes y hoteles). |
Los montos se calculan con aritmética exacta y el redondeo de la DGII (el tercer decimal de 5 o más sube al segundo).
Estados de un comprobante
| Estado | Qué significa |
|---|---|
| pendiente | Generado y firmado, esperando su envío a la DGII. |
| enviado | La DGII lo recibió (tiene track_id) y aún lo está validando. Se consulta solo hasta tener resultado. |
| aceptado | La DGII lo validó. El comprobante es válido. |
| aceptado_condicional | No cumplió algún punto menor, pero no ameritó rechazo; es válido. Revisa dgii_mensajes. |
| rechazado | La DGII lo anuló. Mira dgii_mensajes y ultimo_error. secuencia_reutilizable indica si ese e-NCF puede volver a usarse. |
| error | No se pudo completar después de varios reintentos. ultimo_error explica la causa. |
Si la DGII no responde, el motor reintenta con esperas cada vez más largas. En ese tiempo el comprobante sigue pendiente y ultimo_error muestra el último fallo temporal. Por ahora el seguimiento se hace consultando el comprobante; aún no hay avisos automáticos a tu sistema.
Errores
Las respuestas de error siempre llevan { "error": "mensaje" }.
| Código | Cuándo |
|---|---|
| 400 | Petición mal formada o campos faltantes. |
| 401 | Falta la llave, es inválida, está desactivada o tu empresa está desactivada. |
| 404 | El comprobante o la ruta no existen (o son de otra empresa). |
| 409 | No hay certificado cargado, no hay secuencia disponible para ese tipo (agotada, vencida o sin registrar), o hay un conflicto (rango solapado, última llave activa). |
| 422 | Los datos no cumplen el esquema de la DGII o el certificado no se pudo abrir. El campo detalle.problemas indica la etiqueta y el motivo. No se consume e-NCF. |
| 500 | Error interno. Si persiste, avisa a Mammoth con la hora aproximada. |
Límites actuales
- Tipos soportados: 31, 32, 33 y 34. Aún no están los tipos 41 y 43 al 47.
- Impuestos: ITBIS (18 %, 16 %, 0 %, exento) y propina legal. Todavía no hay ISC ni otros impuestos adicionales, ni moneda extranjera.
- Los precios se entienden sin ITBIS.
- Ambiente de pruebas (
testecf) hasta completar la certificación. - El seguimiento es por consulta; los avisos automáticos (webhooks) no están disponibles.
La referencia completa de la API se genera desde la especificación OpenAPI, que también puedes descargar para generar un cliente en tu lenguaje.