Saltar al contenido
Volver al inicio

Integración

Ejemplos de uso

Copia y pega para emitir, firmar y transmitir tus e-CF ante la DGII. Empieza con cURL y JavaScript, y luego explora varios casos por cada tipo de comprobante: descuentos, impuestos adicionales (ISC), propina, retenciones, moneda extranjera y más.

Producción: api.ecf.synercore.do Pruebas / Certificación: devapi.ecf.synercore.do

Autenticación

Las integraciones máquina-a-máquina usan una API key en la cabecera Authorization. Los usuarios humanos del panel se autentican con JWT.

Authorization: Bearer <API_KEY>

Toda respuesta sigue el mismo formato: { success: true, data } en caso de éxito o { success: false, error } ante un fallo.

Cómo leer los ejemplos

En los ejemplos anotados (cURL/JavaScript) cada campo lleva un comentario que indica si es OBLIGATORIO u OPCIONAL (con su valor por defecto). La obligatoriedad depende del tipo de comprobante.

  • OBLIGATORIO Debe enviarse o la API responde 400.
  • OPCIONAL Puedes omitirlo; se aplica un valor por defecto.
  • Los comentarios // ... son anotaciones de la documentación: NO los envíes en el JSON real.

Numeración (eNCF) y trazabilidad

Cada integrador maneja su PROPIA secuencia. El eNCF es "E" + tipo (2 díg.) + secuencial (10 díg.) = 13 caracteres (ej. E310000000005).

  • Modo producción: si ENVÍAS tu eNCF, el servicio lo usa, FIRMA, TRANSMITE y lo REGISTRA tal cual. Debe ser único por emisor.
  • Modo certificación: si lo OMITES, el servicio reserva el siguiente número de tu secuencia interna y lo genera por ti (así están escritos los casos por tipo de abajo).
  • Deduplicación: un eNCF repetido para el mismo emisor devuelve 409 Conflict.
  • fechaVencimientoSecuencia (dd-MM-yyyy) la manejas junto con tu secuencia. Es obligatoria en 31, 33, 41, 43, 44, 45, 46 y 47; no aplica en 32 ni 34.

Primeros pasos · cURL

Emitir un Crédito Fiscal (tipo 31)

Crea, firma y transmite a la DGII un e-CF de Crédito Fiscal con una sola petición. Con transmitir: true el comprobante se encola para envío automático, y con esperarDgiiMs el servicio espera el veredicto de la DGII dentro de la misma respuesta: en un tipo 31 lo habitual es recibir EN_PROCESO con su trackId. Si omites la espera, la respuesta llega como ENCOLADO / EN_COLA con ambiente: null y el envío sigue en segundo plano.

Petición

curl -X POST https://api.ecf.synercore.do/v1/comprobantes \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -H "X-Emisor-RNC: <RNC_EMISOR>" \
  -d '{
    "tipo": "31",                              // OBLIGATORIO  tipo de e-CF
    "eNCF": "E310000000017",                   // OPCIONAL     tu secuencia (omítelo → lo genera el servicio)
    "fechaVencimientoSecuencia": "31-12-2026", // OBLIGATORIO  en 31 (dd-MM-yyyy); no aplica en 32/34
    "indicadorMontoGravado": 0,                // OPCIONAL     0 = precios SIN ITBIS (default) · 1 = CON ITBIS
    "tipoIngresos": "01",                      // OPCIONAL     default "01"
    "tipoPago": 1,                             // OPCIONAL     1 Contado (default) · 2 Crédito · 3 Gratuito
    "fechaEmision": "28-06-2026",              // OPCIONAL     dd-MM-yyyy; default hoy
    "comprador": {                             // OBLIGATORIO  en 31 (requiere RNC)
      "rnc": "131880681",                      // OBLIGATORIO  RNC/cédula del comprador
      "razonSocial": "CLIENTE SRL"             // OBLIGATORIO  razón social (req. en 31)
    },
    "items": [                                 // OBLIGATORIO  al menos un ítem
      {
        "nombre": "Servicio de consultoría",   // OBLIGATORIO
        "cantidad": 1,                         // OBLIGATORIO  > 0
        "precioUnitario": 10000,               // OBLIGATORIO  sin ITBIS (modo 0)
        "itbis": 18,                           // OPCIONAL     18 | 16 | 0 | "exento"; default 18
        "indicadorBienoServicio": 2            // OPCIONAL     1 bien (default) · 2 servicio
      }
    ],
    "transmitir": true,                        // OPCIONAL     firma y ENCOLA el envío a la DGII
    "esperarDgiiMs": 8000                      // OPCIONAL     espera el veredicto DGII en ESTA respuesta (máx. 20000)
  }'

# X-Emisor-RNC: OBLIGATORIO solo si <API_KEY> es de INTEGRADOR (así eliges por
# cuál de tus emisores emitir). Con una API key de EMISOR, omítelo: el emisor ya
# queda fijado por la propia key.

Respuesta esperada (201)

{
  "success": true,
  "data": {
    "id": "cmp_a3f1c9e2-7b54-4d2a-9f10-6c8e2b1d4a7e",
    "eNCF": "E310000000017",
    "codigoSeguridad": "k9Pf2A",
    "estado": "EN_PROCESO",
    "firmado": true,
    "estadoDgii": "EN_PROCESO",
    "trackId": "9f3a17c0d2b84e6f",
    "montoTotal": "11800.00",
    "ambiente": "ECF",
    "fechaFirma": "28-06-2026 14:32:08",
    "qrUrl": "https://ecf.dgii.gov.do/ecf/consultatimbre?...",
    "mensajeDgii": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}

# Nota: una Factura de Consumo (32) < RD$250,000 con esperarDgiiMs
# suele devolver directamente ACEPTADO o RECHAZADO (canal síncrono).

Variante · modo certificación (sin eNCF → lo genera el servicio)

curl -X POST https://api.ecf.synercore.do/v1/comprobantes \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "tipo": "31",                              // OBLIGATORIO
    "comprador": {
      "rnc": "131880681",
      "razonSocial": "CLIENTE SRL"
    },
    "items": [
      { "nombre": "Servicio de consultoría", "cantidad": 1, "precioUnitario": 10000, "itbis": 18 }
    ],
    "transmitir": true
  }'

# Sin "eNCF": el servicio reserva el siguiente número de TU secuencia interna
# (modo certificación) y devuelve el eNCF generado en la respuesta.
Al omitir eNCF, el servicio reserva el siguiente número de tu secuencia interna y lo devuelve en la respuesta. En producción envías tu propio eNCF (único por emisor; repetirlo devuelve 409).

Primeros pasos · JavaScript

Emitir y luego consultar el estado

Emite el e-CF con fetch y consulta su estado ante la DGII. Recuerda que firma y aceptación son dos estados separados: firmado indica que el XML ya está firmado, mientras que estadoDgii refleja la respuesta de la DGII.

Código

const API_BASE = "https://api.ecf.synercore.do";
const API_KEY = "<API_KEY>";

const headers = {
  Authorization: `Bearer ${API_KEY}`,
  "Content-Type": "application/json",
  // X-Emisor-RNC: OBLIGATORIO solo con API key de INTEGRADOR (elige por cuál de
  // tus emisores emitir/consultar). Con API key de EMISOR, omítelo. Aplica a
  // emitir Y consultar (mismo hook de auth en todo /v1).
  "X-Emisor-RNC": "<RNC_EMISOR>",
};

// 1. Emitir el e-CF (tipo 31 — Crédito Fiscal)
async function emitirComprobante() {
  const res = await fetch(`${API_BASE}/v1/comprobantes`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      tipo: "31",                              // OBLIGATORIO
      eNCF: "E310000000017",                   // OPCIONAL  tu secuencia (omítelo → lo genera el servicio)
      fechaVencimientoSecuencia: "31-12-2026", // OBLIGATORIO en 31 (dd-MM-yyyy)
      indicadorMontoGravado: 0,                // OPCIONAL  0 = precios SIN ITBIS (default)
      comprador: { rnc: "131880681", razonSocial: "CLIENTE SRL" },
      items: [
        { nombre: "Servicio de consultoría", cantidad: 1, precioUnitario: 10000, itbis: 18 },
      ],
      transmitir: true,
      esperarDgiiMs: 8000,                     // OPCIONAL  veredicto DGII en esta misma respuesta si llega a tiempo
    }),
  });

  const json = await res.json();
  if (!json.success) throw new Error(json.error.message);
  return json.data;
}

// 2. Consultar el estado del e-CF ante la DGII
async function consultarEstado(id) {
  const res = await fetch(`${API_BASE}/v1/comprobantes/${id}`, { headers });
  const json = await res.json();
  if (!json.success) throw new Error(json.error.message);
  return json.data;
}

// Flujo completo
const comprobante = await emitirComprobante();
console.log("e-NCF emitido:", comprobante.eNCF);

const estado = await consultarEstado(comprobante.id);
console.log("Firmado:", estado.firmado);
console.log("Estado DGII:", estado.estadoDgii);

Respuesta de la consulta

{
  "success": true,
  "data": {
    "id": "cmp_a3f1c9e2-7b54-4d2a-9f10-6c8e2b1d4a7e",
    "eNCF": "E310000000017",
    "codigoSeguridad": "k9Pf2A",
    "estado": "ACEPTADO",
    "firmado": true,
    "estadoDgii": "ACEPTADO",
    "trackId": "9f3a17c0d2b84e6f",
    "montoTotal": "11800.00",
    "ambiente": "ECF",
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Tras la aceptación, ambiente toma el valor del timbre (ECF en producción · CERTECF en certificación). Si aún está EN_COLA o EN_PROCESO, usa POST /v1/comprobantes/:id/refresh para forzar una re-consulta.

Primeros pasos · Conciliación

Sincronizar los estados con tu sistema

El servicio no envía webhooks: tu sistema consulta el estado. Dos patrones cubren todos los casos: una reconciliación periódica sobre los comprobantes pendientes, y la conciliación por lote (POST /v1/comprobantes/estados, hasta 500 e-NCF) para el cierre contable.

Código

// A) RECONCILIACIÓN PERIÓDICA (p. ej. cada 10 minutos):
// barre SOLO los comprobantes sin veredicto terminal.
// Un ACEPTADO / ACEPTADO_CONDICIONAL / RECHAZADO ya no cambia:
// márcalo en tu base y deja de consultarlo.
const pendientes = await fetch(
  `${API_BASE}/v1/comprobantes?estado=EN_PROCESO&limit=200`,
  { headers },
).then((r) => r.json());

for (const c of pendientes.data) {
  // actualiza tu base SOLO si el estado cambió
}

// B) CONCILIACIÓN POR LOTE (cierre contable):
// hasta 500 e-NCF en una sola llamada.
const lote = await fetch(`${API_BASE}/v1/comprobantes/estados`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    eNCF: ["E310000000001", "E310000000002", "E320000000007"],
  }),
}).then((r) => r.json());

console.log(lote.data.porEstadoDgii);
// → { ACEPTADO: 2, EN_PROCESO: 1 }

for (const item of lote.data.items) {
  if (!item.encontrado) {
    // Tu ERP lo dio por emitido y NO está registrado: investígalo.
    console.warn("No encontrado:", item.eNCF);
  }
}

Respuesta del lote

{
  "success": true,
  "data": {
    "solicitados": 3,
    "encontrados": 3,
    "noEncontrados": 0,
    "porEstadoDgii": { "ACEPTADO": 2, "EN_PROCESO": 1 },
    "items": [
      {
        "eNCF": "E310000000001",
        "encontrado": true,
        "id": "cmp_1a2b3c",
        "tipo": "31",
        "estado": "ACEPTADO",
        "estadoDgii": "ACEPTADO",
        "trackId": "9f3a17c0d2b84e6f",
        "montoTotal": "11800.00",
        "fechaFirma": "28-06-2026 14:32:08",
        "mensajeDgii": null
      }
    ]
  }
}
Un e-NCF inexistente llega con encontrado: false sin tumbar el lote. La guía completa del modelo de sincronización está en la documentación.

Casos por tipo

Ejemplos por tipo de comprobante

Cada tipo agrupa varios casos en pestañas: básico, con descuentos, con impuestos adicionales (ISC), propina, retenciones y moneda. Solo envías los datos económicos; el servicio calcula MontoTotal (un string con 2 decimales), el ITBIS por tramo, el código de seguridad y el XML firmado.

Tipo 31

Crédito Fiscal

Comprobante nominativo completo (requiere comprador con RNC). Admite descuentos, formas de pago, impuestos adicionales, propina, retención y percepción, y moneda extranjera. fechaVencimientoSecuencia obligatoria.

Emisión mínima: 1 ítem al 18%, contado.

Petición

{
  "tipo": "31",
  "fechaVencimientoSecuencia": "31-12-2026",
  "comprador": { "rnc": "131880681", "razonSocial": "CLIENTE SRL" },
  "items": [
    { "nombre": "Servicio de consultoría", "cantidad": 1, "precioUnitario": 10000, "itbis": 18 }
  ],
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_1a2b3c",
    "eNCF": "E310000000017",
    "codigoSeguridad": "k9Pf2A",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "11800.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Gravado 18% = 10.000 · ITBIS = 1.800. MontoTotal = 11.800,00.

Tipo 32

Consumo

Factura a consumidor final: el comprador es opcional (salvo MontoTotal ≥ RD$250,000, que exige RNC/Cédula + razón social) y NO se envía fechaVencimientoSecuencia. Admite descuentos, formas de pago, impuestos adicionales y propina, pero no retención ni percepción.

Punto de venta: dos ítems al 18%, sin datos del comprador.

Petición

{
  "tipo": "32",
  "items": [
    { "nombre": "Café americano", "cantidad": 2, "precioUnitario": 150, "itbis": 18 },
    { "nombre": "Sándwich de pollo", "cantidad": 1, "precioUnitario": 350, "itbis": 18 }
  ],
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_5aa1e7d",
    "eNCF": "E320000000043",
    "codigoSeguridad": "y7Fr2K",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "767.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Gravado 18% = 300 + 350 = 650 · ITBIS = 117. MontoTotal = 767,00.

Tipo 33

Nota de Débito

Aumenta el valor de un e-CF previo. Requiere comprador con RNC y el bloque referencia (con fechaNCFModificado y codigoModificacion). Sí lleva fechaVencimientoSecuencia.

Cargo adicional referenciando el e-NCF modificado.

Petición

{
  "tipo": "33",
  "fechaVencimientoSecuencia": "31-12-2026",
  "comprador": { "rnc": "131880681", "razonSocial": "CLIENTE SRL" },
  "referencia": { "ncfModificado": "E310000000017", "fechaNCFModificado": "15-06-2026", "codigoModificacion": 2 },
  "items": [
    { "nombre": "Cargo por mora", "cantidad": 1, "precioUnitario": 2000, "itbis": 18 }
  ],
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_822fc61",
    "eNCF": "E330000000004",
    "codigoSeguridad": "m4Qz7B",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "2360.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Base = 2.000 · ITBIS = 360. MontoTotal = 2.360,00. referencia.fechaNCFModificado y codigoModificacion son obligatorios.

Tipo 34

Nota de Crédito

Reduce o anula un e-CF previo. Requiere comprador con RNC y referencia. NO lleva fechaVencimientoSecuencia ni formas de pago. El MOTIVO va en referencia.codigoModificacion (1 anula · 2 corrige texto · 3 corrige montos · 4 reemplazo por contingencia · 5 referencia a Factura de Consumo). indicadorNotaCredito es OTRA cosa: el PLAZO de rebaja del ITBIS.

El MOTIVO es codigoModificacion=1 (anula el NCF). indicadorNotaCredito NO se envía: el servicio lo DERIVA de las fechas. Sin formasPago (el 34 no las emite).

Petición

{
  "tipo": "34",
  "fechaEmision": "10-07-2026",
  "comprador": { "rnc": "131880681", "razonSocial": "CLIENTE SRL" },
  "referencia": {
    "ncfModificado": "E310000000017",
    "fechaNCFModificado": "15-06-2026",
    "codigoModificacion": 1,
    "razonModificacion": "Devolución parcial de mercancía"
  },
  "items": [
    { "nombre": "Servicio de consultoría", "cantidad": 1, "precioUnitario": 10000, "itbis": 18 }
  ],
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_95f6b53",
    "eNCF": "E340000000009",
    "codigoSeguridad": "r5Wh3D",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "11800.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Base = 10.000 · ITBIS = 1.800. MontoTotal = 11.800,00. Se emite 25 días después del e-CF modificado (≤30), así que el servicio deriva indicadorNotaCredito = 0: la nota SÍ da derecho a rebajar el ITBIS.

Tipo 41

Compras

Registra compras a proveedores informales. Requiere comprador con RNC y retención OBLIGATORIA por ítem. Admite percepción (indicadorAgente=2), pero NO impuestos adicionales ni propina.

Servicios: retención ITBIS 100% + ISR 10%.

Petición

{
  "tipo": "41",
  "fechaVencimientoSecuencia": "31-12-2026",
  "comprador": { "rnc": "101023122", "razonSocial": "PROVEEDOR INFORMAL" },
  "items": [
    {
      "nombre": "Servicios profesionales",
      "cantidad": 1,
      "precioUnitario": 10000,
      "itbis": 18,
      "indicadorBienoServicio": 2,
      "indicadorAgente": 1,
      "itbisRetenidoRate": 1,
      "isrRetenidoRate": 0.10
    }
  ],
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_a9bda45",
    "eNCF": "E410000000012",
    "codigoSeguridad": "u2Zm6F",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "11800.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Base = 10.000 · ITBIS = 1.800. MontoTotal = 11.800,00. Retenido: ITBIS 1.800 + ISR 1.000 → ValorPagar 9.000,00 (XML).

Tipo 43

Gastos Menores

Comprobante mínimo SIN comprador: solo ítems. No admite descuentos, formas de pago, impuestos adicionales ni retención. Requiere fechaVencimientoSecuencia.

Gasto menor gravado al 18%.

Petición

{
  "tipo": "43",
  "fechaVencimientoSecuencia": "31-12-2026",
  "items": [
    { "nombre": "Café para oficina", "cantidad": 1, "precioUnitario": 500, "itbis": 18 }
  ],
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_c7680b0",
    "eNCF": "E430000000003",
    "codigoSeguridad": "x4Dq9I",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "590.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Base = 500 · ITBIS = 90. MontoTotal = 590,00.

Tipo 44

Regímenes Especiales

Operaciones exentas de regímenes especiales (razón social obligatoria). Su XSD solo define el campo OtrosImpuestosAdicionales: por eso únicamente los impuestos del grupo OTROS (002-005) son válidos; un ISC específico/advalorem (006-039) daría 400.

Operación exenta de zona franca.

Petición

{
  "tipo": "44",
  "fechaVencimientoSecuencia": "31-12-2026",
  "comprador": { "rnc": "131880681", "razonSocial": "EMPRESA ZONA FRANCA SRL" },
  "items": [
    { "nombre": "Bien régimen especial", "cantidad": 1, "precioUnitario": 50000, "itbis": "exento" }
  ],
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_db2efa2",
    "eNCF": "E440000000002",
    "codigoSeguridad": "z1Gs3L",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "50000.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Exento = 50.000. MontoTotal = 50.000,00 (también MontoPeriodo y ValorPagar).

Tipo 45

Gubernamental

Ventas al Estado (requiere comprador con RNC). Admite descuentos, formas de pago, impuestos adicionales y propina, pero NO retención ni percepción.

Suministro gravado al 18%.

Petición

{
  "tipo": "45",
  "fechaVencimientoSecuencia": "31-12-2026",
  "comprador": { "rnc": "401007551", "razonSocial": "MINISTERIO DE EDUCACION" },
  "items": [
    { "nombre": "Suministro de oficina", "cantidad": 100, "precioUnitario": 250, "itbis": 18 }
  ],
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_eef5e94",
    "eNCF": "E450000000006",
    "codigoSeguridad": "k9Pf2A",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "29500.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Base = 100×250 = 25.000 · ITBIS = 4.500. MontoTotal = 29.500,00.

Tipo 46

Exportaciones

Exportación de bienes (razón social + identificador extranjero). Toda la operación va en la franja tasa-0 (itbis: 0); no admite impuestos adicionales, propina ni retención. Suele acompañarse de moneda extranjera.

Exportación de bienes a tasa 0 con bloque moneda (USD).

Petición

{
  "tipo": "46",
  "fechaVencimientoSecuencia": "31-12-2026",
  "comprador": { "razonSocial": "FOREIGN BUYER INC", "identificadorExtranjero": "US-FEIN-123456789" },
  "items": [
    { "nombre": "Producto exportado", "cantidad": 1, "precioUnitario": 5900, "itbis": 0 }
  ],
  "moneda": { "tipo": "USD", "tipoCambio": 59 },
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_102bcd86",
    "eNCF": "E460000000003",
    "codigoSeguridad": "p2Vd9C",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "5900.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Gravado 0% = 5.900 (sin ITBIS). MontoTotal = 5.900,00. OtraMoneda: 5.900 / 59 = 100,00 USD.

Tipo 47

Pagos al Exterior

Pagos a beneficiarios extranjeros (identificador extranjero). Ítems exentos; retención de ISR OBLIGATORIA (sin ITBIS retenido ni percepción). No admite descuentos, impuestos adicionales ni propina.

Retención de ISR por fracción (27%) en moneda extranjera.

Petición

{
  "tipo": "47",
  "fechaVencimientoSecuencia": "31-12-2026",
  "comprador": { "identificadorExtranjero": "US-FEIN-123456789", "razonSocial": "GLOBAL HOSTING INC" },
  "items": [
    {
      "nombre": "Servicio de hosting internacional",
      "cantidad": 1,
      "precioUnitario": 59000,
      "itbis": "exento",
      "indicadorBienoServicio": 2,
      "indicadorAgente": 1,
      "isrRetenidoRate": 0.27
    }
  ],
  "moneda": { "tipo": "USD", "tipoCambio": 59 },
  "transmitir": true
}

Respuesta (201)

{
  "success": true,
  "data": {
    "id": "cmp_11683c78",
    "eNCF": "E470000000007",
    "codigoSeguridad": "t8Yk5E",
    "estado": "ENCOLADO",
    "firmado": true,
    "estadoDgii": "EN_COLA",
    "trackId": null,
    "montoTotal": "59000.00",
    "ambiente": null,
    "createdAt": "2026-06-28T14:32:08.501Z"
  }
}
Exento = 59.000. MontoTotal = 59.000,00. Retenido ISR 27% = 15.930 → ValorPagar 43.070,00 (XML). OtraMoneda: 1.000,00 USD.

Errores · 400 / 401 / 409

Respuestas de error

Ante un fallo la API responde con success: false y un objeto error con message y statusCode. Procesa siempre success antes de leer data.

400 · Validación (falta el RNC del comprador)

{
  "success": false,
  "error": {
    "message": "El tipo 31 requiere comprador con RNC",
    "statusCode": 400
  }
}

400 · Las formas de pago no cuadran con el total

{
  "success": false,
  "error": {
    "message": "La suma de formasPago (11500.00) no coincide con el MontoTotal (11800.00)",
    "statusCode": 400
  }
}

401 · API key inválida o ausente

{
  "success": false,
  "error": {
    "message": "API key inválida o ausente (Authorization: Bearer)",
    "statusCode": 401
  }
}

409 · e-NCF duplicado para el emisor

{
  "success": false,
  "error": {
    "message": "El e-NCF E310000000017 ya está registrado para este emisor",
    "statusCode": 409
  }
}
Lo que NO se envía nunca: el codigoSeguridad, los totales (montoTotal, ITBIS por tramo) ni el XML firmado. Todo eso lo calcula y genera el servicio. El ValorPagar de los casos con retención se emite en el XML (consúltalo en /v1/comprobantes/:id/xml), no en la respuesta JSON.

Empieza hoy

¿Listo para emitir tu primer e-CF?

Crea tu cuenta, da de alta a tus emisores, sube su certificado .p12 y empieza a transmitir comprobantes válidos ante la DGII en minutos.