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
Usa POST /certificados para subir tu certificado digital emitido por la DGII.
Llama a POST /facturas con los datos del documento. ¡Listo!
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
}
]
}'
Todas las peticiones a la API requieren autenticación. Hay dos métodos:
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.
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...
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.
Crea, firma digitalmente y envía un documento fiscal electrónico (e-CF) a la DGII.
| tipo_ecf | Nombre | RNC Comprador | Uso |
|---|---|---|---|
31 | Factura Crédito Fiscal | Obligatorio | Ventas a contribuyentes |
32 | Factura de Consumo | Opcional | Ventas a consumidores finales |
33 | Nota de Débito | Obligatorio | Recargos sobre facturas |
34 | Nota de Crédito | Obligatorio | Anulación/reducción facturas |
41 | Compras | Obligatorio | Registro de compras |
43 | Gastos Menores | No requiere | Gastos sin comprobante |
44 | Regímenes Especiales | Obligatorio | Zonas francas |
45 | Gubernamental | Obligatorio | Ventas al gobierno |
46 | Exportaciones | Opcional | Ventas al exterior |
47 | Pagos al Exterior | ID Extranjero | Pagos proveedores extranjeros |
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
tipo_ecf | string | Sí | 31, 32, 33, 34, 41, 43, 44, 45, 46, 47 |
tipo_ingresos | string | No | 01-06 (default: 01) |
tipo_pago | string | No | 1=Contado, 2=Crédito, 3=Gratuito |
fecha_emision | date | No | Default: hoy (YYYY-MM-DD) |
fecha_vencimiento | date | * | Obligatorio si tipo_pago=2 |
tipo_moneda | string | No | Código ISO (USD, EUR...) |
tipo_cambio | number | No | Tasa de cambio a RD$ |
comprador | object | * | Ver Objeto Comprador |
items | array | Sí | Ver Objeto Item |
pagos | array | No | Ver Objeto Pago |
referencia | object | * | Obligatorio para E33 y E34 |
descuentos_recargos | array | No | Descuentos/recargos globales |
indicador_nota_credito | int | * | Obligatorio para E34: 0-3 |
| Campo | Tipo | Descripción |
|---|---|---|
rnc | string | RNC o Cédula (obligatorio para E31,33,34,41,44,45) |
razon_social | string | Nombre legal |
direccion | string | Dirección |
municipio | string | Código municipio DGII (6 dígitos) |
provincia | string | Código provincia DGII |
correo | string | Email (también acepta "email") |
telefono | string | Teléfono principal |
contacto | string | Persona de contacto |
identificador_extranjero | string | Para E46/E47 |
codigo_interno | string | Tu código del comprador |
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
nombre | string | Sí | Nombre del producto/servicio |
indicador_facturacion | int | No | 1=Gravado 18%, 2=Gravado 16%, 3=Gravado 0%, 4=Exento |
indicador_bien_servicio | int | No | 1=Bien, 2=Servicio |
cantidad | number | Sí | Cantidad |
unidad_medida | string | No | Código DGII (43=Unidad) |
precio_unitario | number | Sí | Precio unitario |
monto | number | Sí | Monto total de la línea |
itbis_monto | number | No | Monto ITBIS de esta línea |
descuento_monto | number | No | Descuento en esta línea |
monto_itbis_retenido | number | No | ITBIS retenido (E41) |
monto_isr_retenido | number | No | ISR retenido (E41, E47) |
indicador_agente_retencion | int | No | 1=Agente retención, 2=Percepción |
forma_pago usa 1 dígito (1-8), NO 2 dígitos (01-08).
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
forma_pago | string | Sí | 1=Efectivo, 2=Cheque, 3=Tarjeta, 4=Transferencia, 5=Bonos, 6=Permuta, 7=NC, 8=Mixto |
monto | number | Sí | Monto del pago |
banco | string | No | Nombre del banco |
numero_cuenta | string | No | Número de cuenta |
tipo_cuenta | string | No | Tipo de cuenta |
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
ncf_modificado | string | Sí | e-NCF del documento a modificar |
fecha_ncf_modificado | date | Sí | Fecha emisión del doc original |
codigo_modificacion | string | Sí | 1=Anulación, 2=Texto, 3=Monto, 4=Desc/Bonif, 5=Devolución |
razon_modificacion | string | No | Explicación |
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"
{
"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.
Sube el logo que aparecerá en la Representación Impresa (PDF). PNG o JPG, máximo 500KB.
curl -X POST "https://api.facturaya.com.do/v1/empresas/logo" \
-H "X-Api-Key: tu_api_key" \
-H "X-Api-Secret: tu_api_secret" \
-F "logo=@mi_logo.png"
Eliminar logo:
curl -X DELETE "https://api.facturaya.com.do/v1/empresas/logo" \
-H "X-Api-Key: tu_api_key" \
-H "X-Api-Secret: tu_api_secret"
Si no hay logo, el PDF funciona normalmente sin imagen. Recomendado: 400×160px, fondo transparente.
Descarga la representación impresa (PDF) del e-CF con código QR según especificaciones DGII.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
uuid | path | Sí | UUID del documento |
formato | query | No | carta (default) — tamaño letter 8.5"×11"pos — ticket 80mm para impresoras térmicas |
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
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.
Cada documento pasa por estos estados durante su ciclo de vida:
| Estado | Descripción | Acción requerida |
|---|---|---|
pendiente | Documento creado, en proceso | Esperar |
firmado | XML firmado digitalmente | Esperar envío |
enviado | Enviado a DGII | Esperar respuesta |
encolado | DGII no respondió, en cola de reintentos | Consultar con GET /status. Reintentos automáticos: 2min, 10min, 30min, 2h |
aceptado | Aceptado por DGII | Ninguna — documento válido |
aceptado_condicional | Aceptado con observaciones | Revisar mensaje_dgii |
rechazado | Rechazado por DGII | Corregir según mensaje_error y reenviar |
anulado | Anulado vía Nota de Crédito | Ninguna |
error | Error interno | Contactar soporte |
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"]
}
| HTTP | Código | Descripción |
|---|---|---|
| 400 | BAD_REQUEST | Datos de entrada inválidos |
| 401 | UNAUTHORIZED | API Key/Secret inválidos o faltantes |
| 403 | FORBIDDEN | Sin permiso para esta acción |
| 404 | NOT_FOUND | Recurso no encontrado |
| 405 | METHOD_NOT_ALLOWED | Método HTTP incorrecto |
| 409 | CONFLICT | Recurso duplicado |
| 422 | VALIDATION_ERROR | Errores de validación (ver campo details) |
| 429 | RATE_LIMIT_EXCEEDED | Demasiadas solicitudes. Header Retry-After indica segundos de espera |
| 500 | SERVER_ERROR | Error interno del servidor |
| 503 | SERVICE_UNAVAILABLE | DGII no disponible temporalmente |
| Error | Causa | Solución |
|---|---|---|
| "comprador.rnc es obligatorio para tipo E31" | E31 requiere RNC del comprador | Agrega comprador.rnc con un RNC válido |
| "fecha_vencimiento es obligatorio cuando tipo_pago=2" | Crédito sin fecha límite | Incluye fecha_vencimiento |
| "Total calculado no coincide con total pagos" | Monto items+ITBIS ≠ suma pagos | Verifica que suma de pagos = subtotal + ITBIS - retenciones |
| "NCF modificado no encontrado" | Referencia a NCF inexistente | Verifica el ncf_modificado en referencia |
Recibe notificaciones HTTP POST cuando cambia el estado de tus documentos.
Configura webhooks desde el Panel de Administración. Especifica la URL de tu endpoint y los eventos que deseas recibir.
| Evento | Descripción |
|---|---|
documento.aceptado | Documento aceptado por DGII |
documento.rechazado | Documento rechazado por DGII |
documento.error | Error en el procesamiento |
documento.encolado | Documento encolado para reintento |
{
"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": ""
}
}
| Header | Descripción |
|---|---|
| Content-Type | application/json |
| User-Agent | FacturaYa-Webhook/1.0 |
| X-Webhook-Event | Nombre del evento |
| X-Webhook-Delivery | ID único de esta entrega |
| X-Webhook-Signature | sha256=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.
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.
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).
TBL_TIPO_FORMA_PAGO_ECF)Catálogo oficial para el campo forma_pago dentro del array pagos al emitir un e-CF.
| Código | Denominación oficial DGII |
|---|---|
1 | Efectivo |
2 | Cheque/Transferencia/Depósito (los 3 medios agrupados en un solo código) |
3 | Tarjeta de Débito/Crédito (ambas en un solo código) |
4 | Venta a Crédito ⚠ NO es "Transferencia" — Transferencia pertenece al código 2 |
5 | Bonos o Certificados de regalo |
6 | Permuta |
7 | Nota de crédito |
8 | Otras 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.
tipo_ecf)Catálogo oficial para el campo tipo_ecf al emitir comprobantes.
| Código | Denominación oficial DGII | Endpoint DGII |
|---|---|---|
31 | Factura de Crédito Fiscal | ecf |
32 | Factura de Consumo (<RD$250k usa RFCE) | ecf o rfce |
33 | Nota de Débito Electrónica ⚠ Recargos/intereses/correcciones de monto | ecf |
34 | Nota de Crédito Electrónica ⚠ Anulación/devolución/descuento | ecf |
41 | Comprobante de Compras | ecf |
43 | Comprobante para Gastos Menores | ecf |
44 | Comprobante para Regímenes Especiales | ecf |
45 | Comprobante Gubernamental | ecf |
46 | Comprobante de Exportaciones | ecf |
47 | Comprobante para Pagos al Exterior | ecf |
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).
indicador_nota_credito (solo E34)Campo obligatorio únicamente para Nota de Crédito Electrónica (E34). No aplica al E33 (Nota de Débito).
| Valor | Significado oficial DGII |
|---|---|
0 | Fecha de emisión del NCF afectado es ≤ 30 días calendario |
1 | Fecha 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.
fecha_vencimiento_secuenciaObligatoriedad por tipo de e-CF:
| Tipo e-CF | ¿Obligatorio? | Notas |
|---|---|---|
E31 (Crédito Fiscal) | ✅ Sí | |
E32 (Consumo) | ❌ NO | Excepción literal en norma DGII |
E33 (Nota de Débito) | ✅ Sí | |
E34 (Nota de Crédito) | ❌ NO | Excepció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.
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).
Cuando tu empresa emite una factura y el comprador es receptor electrónico:
Consulta el estado B2B con GET /v1/facturas/{uuid}/acuse.
Cuando un proveedor te envía una factura electrónica:
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
| GET | /v1/facturas/{uuid}/acuse | Estado B2B de factura emitida | API Key |
| GET | /v1/recibidos | Listar e-CF recibidos | API Key |
| GET | /v1/recibidos/{uuid} | Detalle de e-CF recibido | API Key |
| POST | /v1/recibidos/{uuid}/aprobar | Aprobar comercialmente | API Key |
| POST | /v1/recibidos/{uuid}/rechazar | Rechazar (requiere motivo) | API Key |
| ENDPOINTS PÚBLICOS — Para emisores externos | |||
| GET | /fe/{rnc}/autenticacion/api/semilla | Obtener semilla auth B2B | Ninguna |
| POST | /fe/{rnc}/autenticacion/api/validacioncertificado | Validar cert → token JWT | Ninguna |
| POST | /fe/{rnc}/recepcion/api/ecf | Enviar e-CF → ARECF | Bearer JWT |
| POST | /fe/{rnc}/aprobacioncomercial/api/ecf | Enviar ACECF | Ninguna |
Para detalles completos de cada endpoint (parámetros, schemas, respuestas), consulta la sección Swagger UI más abajo.
63 casos reales ejecutados contra DGII TestECF. Todos aceptados excepto 1 rechazado esperado.
Cargando 63 ejemplos verificados...
Explorador interactivo de todos los endpoints de la API.
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.
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"
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
Ya estás listo para emitir documentos con POST /v1/facturas. El sistema automáticamente:
Usa GET /v1/facturas/{uuid}/status para verificar documentos encolados.
Usa GET /v1/facturas/{uuid}/pdf para obtener la representación impresa en formato carta, o agrega ?formato=pos para ticket 80mm térmico.
Desde el panel, configura webhooks para recibir notificaciones cuando tus documentos cambien de estado.
X-Idempotency-Key en cada POST para evitar duplicadosforma_pago es 1 dígito (1-8), nunca 2 dígitos (01-08)monto_itbis_retenido y monto_isr_retenidoFacturaYa.com.do — Facturación Electrónica DGII © 2026