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

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.

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