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 |
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.
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