API Docs v1.0.0
TestECF https://api.facturaya.com.do/v1/

Quickstart — Tu primera factura en 3 pasos

1

Obtén credenciales

Contacta a nuestro equipo para registrar tu empresa y recibir tu API Key y API Secret.
ventas@facturaya.com.do  |  809-781-4887  |  1 (809) 395-1654

2

Sube tu certificado P12

Usa POST /certificados para subir tu certificado digital emitido por la DGII.

3

Envía tu primera factura

Llama a POST /facturas con los datos del documento. ¡Listo!

Ejemplo rápido con curl

curl -X POST "https://api.facturaya.com.do/v1/facturas" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: tu_api_key" \
  -H "X-Api-Secret: tu_api_secret" \
  -d '{
    "tipo_ecf": "31",
    "tipo_ingresos": "01",
    "tipo_pago": "1",
    "comprador": {
      "rnc": "131880681",
      "razon_social": "MI CLIENTE SRL",
      "direccion": "Calle Principal #100",
      "municipio": "010100",
      "provincia": "010000"
    },
    "pagos": [{"forma_pago": "1", "monto": 59000.00}],
    "items": [
      {
        "nombre": "Servicio de consultoría",
        "indicador_facturacion": 1,
        "indicador_bien_servicio": 2,
        "cantidad": 1,
        "unidad_medida": "43",
        "precio_unitario": 50000.00,
        "monto": 50000.00,
        "itbis_monto": 9000.00
      }
    ]
  }'

Autenticación

Todas las peticiones a la API requieren autenticación. Hay dos métodos:

Método 1: API Key + Secret (recomendado)

Envía dos headers en cada request:

X-Api-Key: fy_81e6059cf1d9c2e8a5123a856db080dd872246d6
X-Api-Secret: f192345d36a5e8ece325b6ed8c301042ebcae0f1089905629cedc0248ba8f828

Las credenciales se generan al registrar tu empresa. Contacta a ventas@facturaya.com.do o llama al 809-781-4887 / 1 (809) 395-1654.

Método 2: JWT Bearer Token (alternativo)

Para integraciones que prefieran tokens temporales:

# 1. Obtener tokens
POST /auth/login
{"email": "tu@email.com", "password": "tu_password"}

# 2. Usar el access_token
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Idempotencia

Para evitar documentos duplicados al reintentar un request fallido, envía el header:

X-Idempotency-Key: mi-clave-unica-por-request-12345

Si se recibe un request con una clave ya procesada dentro de las últimas 24 horas, se devuelve la respuesta original sin crear un documento nuevo.

POST/facturas

Crea, firma digitalmente y envía un documento fiscal electrónico (e-CF) a la DGII.

Tipos de documento soportados

tipo_ecfNombreRNC CompradorUso
31Factura Crédito FiscalObligatorioVentas a contribuyentes
32Factura de ConsumoOpcionalVentas a consumidores finales
33Nota de DébitoObligatorioRecargos sobre facturas
34Nota de CréditoObligatorioAnulación/reducción facturas
41ComprasObligatorioRegistro de compras
43Gastos MenoresNo requiereGastos sin comprobante
44Regímenes EspecialesObligatorioZonas francas
45GubernamentalObligatorioVentas al gobierno
46ExportacionesOpcionalVentas al exterior
47Pagos al ExteriorID ExtranjeroPagos proveedores extranjeros

Campos del request

CampoTipoReq.Descripción
tipo_ecfstring31, 32, 33, 34, 41, 43, 44, 45, 46, 47
tipo_ingresosstringNo01-06 (default: 01)
tipo_pagostringNo1=Contado, 2=Crédito, 3=Gratuito
fecha_emisiondateNoDefault: hoy (YYYY-MM-DD)
fecha_vencimientodate*Obligatorio si tipo_pago=2
tipo_monedastringNoCódigo ISO (USD, EUR...)
tipo_cambionumberNoTasa de cambio a RD$
compradorobject*Ver Objeto Comprador
itemsarrayVer Objeto Item
pagosarrayNoVer Objeto Pago
referenciaobject*Obligatorio para E33 y E34
descuentos_recargosarrayNoDescuentos/recargos globales
indicador_nota_creditoint*Obligatorio para E34: 0-3

Objeto Comprador

CampoTipoDescripción
rncstringRNC o Cédula (obligatorio para E31,33,34,41,44,45)
razon_socialstringNombre legal
direccionstringDirección
municipiostringCódigo municipio DGII (6 dígitos)
provinciastringCódigo provincia DGII
correostringEmail (también acepta "email")
telefonostringTeléfono principal
contactostringPersona de contacto
identificador_extranjerostringPara E46/E47
codigo_internostringTu código del comprador

Objeto Item

CampoTipoReq.Descripción
nombrestringNombre del producto/servicio
indicador_facturacionintNo1=Gravado 18%, 2=Gravado 16%, 3=Gravado 0%, 4=Exento
indicador_bien_serviciointNo1=Bien, 2=Servicio
cantidadnumberCantidad
unidad_medidastringNoCódigo DGII (43=Unidad)
precio_unitarionumberPrecio unitario
montonumberMonto total de la línea
itbis_montonumberNoMonto ITBIS de esta línea
descuento_montonumberNoDescuento en esta línea
monto_itbis_retenidonumberNoITBIS retenido (E41)
monto_isr_retenidonumberNoISR retenido (E41, E47)
indicador_agente_retencionintNo1=Agente retención, 2=Percepción

Objeto Pago

Importante: forma_pago usa 1 dígito (1-8), NO 2 dígitos (01-08).
CampoTipoReq.Descripción
forma_pagostring1=Efectivo, 2=Cheque, 3=Tarjeta, 4=Transferencia, 5=Bonos, 6=Permuta, 7=NC, 8=Mixto
montonumberMonto del pago
bancostringNoNombre del banco
numero_cuentastringNoNúmero de cuenta
tipo_cuentastringNoTipo de cuenta

Objeto Referencia (E33/E34)

CampoTipoReq.Descripción
ncf_modificadostringe-NCF del documento a modificar
fecha_ncf_modificadodateFecha emisión del doc original
codigo_modificacionstring1=Anulación, 2=Texto, 3=Monto, 4=Desc/Bonif, 5=Devolución
razon_modificacionstringNoExplicación

GET/facturas/{uuid}/status

Consulta el estado actual de un documento. Especialmente útil para documentos encolados.

curl "https://api.facturaya.com.do/v1/facturas/22b2636e-a3fe-453c-8de2-6f9e08787e4f/status" \
  -H "X-Api-Key: tu_api_key" \
  -H "X-Api-Secret: tu_api_secret"

Respuesta exitosa

{
  "success": true,
  "data": {
    "uuid": "22b2636e-a3fe-453c-8de2-6f9e08787e4f",
    "encf": "E310000000138",
    "tipo_ecf": "31",
    "tipo_documento": "factura",
    "estado": "aceptado",
    "track_id": "78e54ba7-114f-45df-84f1-e11a8dd006cb",
    "codigo_seguridad": "ITgyFM",
    "mensaje_error": "",
    "fecha_emision": "2026-04-04",
    "monto_total": 42000,
    "fecha_firma": "2026-04-04 11:23:28",
    "fecha_envio": "2026-04-04 11:23:32",
    "fecha_respuesta": "2026-04-04 11:23:34",
    "intentos_envio": 0,
    "rnc_emisor": "04800833040",
    "rnc_comprador": "101893362",
    "razon_social_comprador": "CASO 1 EXENTO SIMPLE"
  },
  "message": "Estado del documento E310000000138."
}

Si el documento está encolado, la respuesta incluye un objeto cola con: estado, intentos, max_intentos, proximo_intento y ultimo_error.

GET/facturas/{uuid}/pdf

Descarga la representación impresa (PDF) del e-CF con código QR según especificaciones DGII.

ParámetroTipoRequeridoDescripción
uuidpathUUID del documento
formatoqueryNocarta (default) — tamaño letter 8.5"×11"
pos — ticket 80mm para impresoras térmicas

Formato carta (default)

curl "https://api.facturaya.com.do/v1/facturas/{uuid}/pdf" \
  -H "X-Api-Key: tu_api_key" \
  -H "X-Api-Secret: tu_api_secret" \
  --output factura.pdf

Formato POS 80mm NUEVO

curl "https://api.facturaya.com.do/v1/facturas/{uuid}/pdf?formato=pos" \
  -H "X-Api-Key: tu_api_key" \
  -H "X-Api-Secret: tu_api_secret" \
  --output ticket.pdf

Responde con Content-Type: application/pdf. El documento debe tener XML firmado. Ambos formatos cumplen especificaciones DGII y soportan los 10 tipos de e-CF.

Flujo de Estados

Cada documento pasa por estos estados durante su ciclo de vida:

pendiente firmado enviado aceptado ✓
Si DGII no responde: enviado encolado (reintento automático con backoff exponencial)
EstadoDescripciónAcción requerida
pendienteDocumento creado, en procesoEsperar
firmadoXML firmado digitalmenteEsperar envío
enviadoEnviado a DGIIEsperar respuesta
encoladoDGII no respondió, en cola de reintentosConsultar con GET /status. Reintentos automáticos: 2min, 10min, 30min, 2h
aceptadoAceptado por DGIINinguna — documento válido
aceptado_condicionalAceptado con observacionesRevisar mensaje_dgii
rechazadoRechazado por DGIICorregir según mensaje_error y reenviar
anuladoAnulado vía Nota de CréditoNinguna
errorError internoContactar soporte

Códigos de Error

Todas las respuestas de error siguen este formato:

{
  "success": false,
  "error": "CODIGO_ERROR",
  "message": "Descripción del error",
  "details": ["Error específico 1", "Error específico 2"]
}
HTTPCódigoDescripción
400BAD_REQUESTDatos de entrada inválidos
401UNAUTHORIZEDAPI Key/Secret inválidos o faltantes
403FORBIDDENSin permiso para esta acción
404NOT_FOUNDRecurso no encontrado
405METHOD_NOT_ALLOWEDMétodo HTTP incorrecto
409CONFLICTRecurso duplicado
422VALIDATION_ERRORErrores de validación (ver campo details)
429RATE_LIMIT_EXCEEDEDDemasiadas solicitudes. Header Retry-After indica segundos de espera
500SERVER_ERRORError interno del servidor
503SERVICE_UNAVAILABLEDGII no disponible temporalmente

Errores comunes de validación

ErrorCausaSolución
"comprador.rnc es obligatorio para tipo E31"E31 requiere RNC del compradorAgrega comprador.rnc con un RNC válido
"fecha_vencimiento es obligatorio cuando tipo_pago=2"Crédito sin fecha límiteIncluye fecha_vencimiento
"Total calculado no coincide con total pagos"Monto items+ITBIS ≠ suma pagosVerifica que suma de pagos = subtotal + ITBIS - retenciones
"NCF modificado no encontrado"Referencia a NCF inexistenteVerifica el ncf_modificado en referencia

Webhooks

Recibe notificaciones HTTP POST cuando cambia el estado de tus documentos.

Configuración

Configura webhooks desde el Panel de Administración. Especifica la URL de tu endpoint y los eventos que deseas recibir.

Eventos disponibles

EventoDescripción
documento.aceptadoDocumento aceptado por DGII
documento.rechazadoDocumento rechazado por DGII
documento.errorError en el procesamiento
documento.encoladoDocumento encolado para reintento

Formato del payload

{
  "evento": "documento.aceptado",
  "timestamp": "2026-04-04T11:23:34-04:00",
  "datos": {
    "documento_id": 208,
    "estado": "aceptado",
    "uuid": "22b2636e-a3fe-453c-8de2-6f9e08787e4f",
    "encf": "E310000000138",
    "tipo_ecf": "31",
    "track_id": "78e54ba7-114f-45df-84f1-e11a8dd006cb",
    "mensaje": ""
  }
}

Headers del webhook

HeaderDescripción
Content-Typeapplication/json
User-AgentFacturaYa-Webhook/1.0
X-Webhook-EventNombre del evento
X-Webhook-DeliveryID único de esta entrega
X-Webhook-Signaturesha256=HMAC_del_payload

Nota: el header de firma se llama exactamente X-Webhook-Signature (con el prefijo literal sha256= antes del HMAC). No existe ningún header X-FacturaYa-Signature — es un nombre que algunos integradores intuyen pero no está implementado.

Verificación de firma HMAC-SHA256

Valida que el webhook venga de FacturaYa calculando el HMAC del body con tu secret:

// PHP
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $payload, 'tu_webhook_secret');

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    die('Firma inválida');
}

$data = json_decode($payload, true);
// Procesar evento...

El webhook se desactiva automáticamente después de 10 fallos consecutivos. Responde con HTTP 2xx para confirmar la recepción.

Referencia DGII — Catálogos Oficiales

Tablas oficiales DGII República Dominicana que aplican al desarrollo contra esta API. Si en algún momento ves discrepancia con la respuesta del API, prevalecen estas tablas (son las que DGII valida contra su norma).

Tabla de Formas de Pago (TBL_TIPO_FORMA_PAGO_ECF)

Catálogo oficial para el campo forma_pago dentro del array pagos al emitir un e-CF.

CódigoDenominación oficial DGII
1Efectivo
2Cheque/Transferencia/Depósito (los 3 medios agrupados en un solo código)
3Tarjeta de Débito/Crédito (ambas en un solo código)
4Venta a Crédito ⚠ NO es "Transferencia" — Transferencia pertenece al código 2
5Bonos o Certificados de regalo
6Permuta
7Nota de crédito
8Otras Formas de pago (NO se denomina "Mixto")

Fuente: Formato Comprobante Fiscal Electrónico (e-CF) V1.0, Sección 2.2 (A. Encabezado), campo N° 12 <FormaPago>, Pág. 8.

Tipos de e-CF (tipo_ecf)

Catálogo oficial para el campo tipo_ecf al emitir comprobantes.

CódigoDenominación oficial DGIIEndpoint DGII
31Factura de Crédito Fiscalecf
32Factura de Consumo (<RD$250k usa RFCE)ecf o rfce
33Nota de Débito Electrónica ⚠ Recargos/intereses/correcciones de montoecf
34Nota de Crédito Electrónica ⚠ Anulación/devolución/descuentoecf
41Comprobante de Comprasecf
43Comprobante para Gastos Menoresecf
44Comprobante para Regímenes Especialesecf
45Comprobante Gubernamentalecf
46Comprobante de Exportacionesecf
47Comprobante para Pagos al Exteriorecf

Fuente: Formato Comprobante Fiscal Electrónico (e-CF) V1.0, Sección 1 (Introducción), Pág. 2. Informe Técnico e-CF v1.0, Sección 6.1, Pág. 12.

Mnemónico E33 vs E34: desde la perspectiva del emisor, la Nota de Crédito (E34) le da crédito al comprador (reduce su deuda); la Nota de Débito (E33) le genera un débito adicional al comprador (aumenta su deuda).

Campo indicador_nota_credito (solo E34)

Campo obligatorio únicamente para Nota de Crédito Electrónica (E34). No aplica al E33 (Nota de Débito).

ValorSignificado oficial DGII
0Fecha de emisión del NCF afectado es ≤ 30 días calendario
1Fecha de emisión del NCF afectado es > 30 días calendario

Atención: solo 2 valores oficiales (0 y 1). Cualquier otro valor será rechazado por validación XSD.

Fuente: Formato e-CF V1.0, Sección 2.2 (A. Encabezado), campo N° 5 <IndicadorNotaCredito>, Pág. 7.

Campo fecha_vencimiento_secuencia

Obligatoriedad por tipo de e-CF:

Tipo e-CF¿Obligatorio?Notas
E31 (Crédito Fiscal)✅ Sí
E32 (Consumo)❌ NOExcepción literal en norma DGII
E33 (Nota de Débito)✅ Sí
E34 (Nota de Crédito)❌ NOExcepción literal en norma DGII (lleva indicador_nota_credito en su lugar)

Fuente: Formato e-CF V1.0, Sección 2.2 (A. Encabezado), campo N° 4 <FechaVencimientoSecuencia>, Pág. 6. Descripción Técnica de Facturación Electrónica, Pág. 5.

Flujo B2B Emisor-Receptor NUEVO

FacturaYa soporta el flujo B2B completo definido por la DGII, tanto como emisor (enviar facturas a receptores electrónicos) como receptor (recibir facturas de proveedores).

Flujo como Emisor

Cuando tu empresa emite una factura y el comprador es receptor electrónico:

POST /facturas DGII acepta Auto-envío al receptor ARECF recibido ACECF (aprobación)

Consulta el estado B2B con GET /v1/facturas/{uuid}/acuse.

Flujo como Receptor

Cuando un proveedor te envía una factura electrónica:

Proveedor envía e-CF ARECF automático GET /recibidos Aprobar o Rechazar ACECF enviado

Endpoints B2B

MétodoEndpointDescripciónAuth
GET/v1/facturas/{uuid}/acuseEstado B2B de factura emitidaAPI Key
GET/v1/recibidosListar e-CF recibidosAPI Key
GET/v1/recibidos/{uuid}Detalle de e-CF recibidoAPI Key
POST/v1/recibidos/{uuid}/aprobarAprobar comercialmenteAPI Key
POST/v1/recibidos/{uuid}/rechazarRechazar (requiere motivo)API Key
ENDPOINTS PÚBLICOS — Para emisores externos
GET/fe/{rnc}/autenticacion/api/semillaObtener semilla auth B2BNinguna
POST/fe/{rnc}/autenticacion/api/validacioncertificadoValidar cert → token JWTNinguna
POST/fe/{rnc}/recepcion/api/ecfEnviar e-CF → ARECFBearer JWT
POST/fe/{rnc}/aprobacioncomercial/api/ecfEnviar ACECFNinguna

Para detalles completos de cada endpoint (parámetros, schemas, respuestas), consulta la sección Swagger UI más abajo.

Ejemplos por Tipo de e-CF

63 casos reales ejecutados contra DGII TestECF. Todos aceptados excepto 1 rechazado esperado.

Cargando 63 ejemplos verificados...

Todos los Endpoints — Swagger UI

Explorador interactivo de todos los endpoints de la API.

Guía de Integración Paso a Paso

1. Obtener credenciales

Contacta a nuestro equipo para registrar tu empresa y recibir tus credenciales API:

Recibirás tu API Key y API Secret — guárdalos de forma segura.

2. Subir certificado P12

curl -X POST "https://api.facturaya.com.do/v1/certificados" \
  -H "X-Api-Key: tu_api_key" \
  -H "X-Api-Secret: tu_api_secret" \
  -F "certificado=@tu_certificado.p12" \
  -F "password=password_del_certificado"

3. Crear secuencias NCF

POST /v1/secuencias
{
  "tipo_ecf": "31",
  "secuencia_desde": 1,
  "secuencia_hasta": 5000,
  "fecha_vencimiento": "2027-12-31"
}
// Repetir para cada tipo de e-CF que vayas a usar

4. Emitir facturas

Ya estás listo para emitir documentos con POST /v1/facturas. El sistema automáticamente:

5. Consultar estado

Usa GET /v1/facturas/{uuid}/status para verificar documentos encolados.

6. Descargar PDF

Usa GET /v1/facturas/{uuid}/pdf para obtener la representación impresa en formato carta, o agrega ?formato=pos para ticket 80mm térmico.

7. Configurar webhooks (opcional)

Desde el panel, configura webhooks para recibir notificaciones cuando tus documentos cambien de estado.

Tips

  • Usa X-Idempotency-Key en cada POST para evitar duplicados
  • forma_pago es 1 dígito (1-8), nunca 2 dígitos (01-08)
  • La suma de pagos debe ser igual a subtotal + ITBIS - retenciones
  • Para E41 (compras), cada item debe incluir monto_itbis_retenido y monto_isr_retenido
  • E32 con monto menor a RD$250,000 se envía por RFCE automáticamente
  • Los documentos encolados se reintentan: 2min → 10min → 30min → 2h → fallo

FacturaYa.com.do — Facturación Electrónica DGII © 2026

facturaya.com.do · ventas@facturaya.com.do