e-CF 47 — Comprobante para Pagos al Exterior Electrónico¶
El emisor.rnc del cuerpo dice de qué empresa es el comprobante y, a la vez, en nombre de quién se emite: la API
comprueba que su token esté habilitado para esa empresa (cómo funciona).
Documenta un pago a un beneficiario en el extranjero —servicios profesionales, regalías, intereses, dividendos— sobre el que usted debe practicar la retención del ISR.
Como en el 41, lo emite quien paga.
Particularidades¶
| Aspecto | Regla |
|---|---|
| Numeración | id_doc.e_ncf (E47 + 10 dígitos) y id_doc.fecha_vencimiento_secuencia (dd-MM-aaaa) obligatorios: la numeración la lleva su sistema. Ver numeracion.md. |
| Comprador | Beneficiario extranjero: sin rnc, se identifica con identificador_extranjero y razon_social. |
retencion en cada ítem |
Obligatoria, con indicador e isr_retenido. Es la razón de ser del comprobante. |
| ITBIS | No lleva. |
| Impuestos adicionales (ISC) | No aplican. |
| Líneas de detalle | Máximo 1.000. |
La retención del ISR es obligatoria¶
"retencion": {
"indicador": "1", // indicador de retención / percepción
"isr_retenido": 2700.00 // ISR retenido sobre este ítem
}
Sin este bloque el comprobante no tiene sentido: lo que la DGII espera de un 47 es precisamente
cuánto se retuvo al pagar al exterior. Y el total, totales.total_isr_retencion, es obligatorio y
tiene que ser la suma de los isr_retenido de las líneas: sin él la DGII rechaza el comprobante
(«el campo TotalISRRetencion … no es válido»).
Ejemplo¶
Pago de servicios de consultoría a una empresa española, reteniendo el 27% de ISR.
{
"emisor": {
"rnc": "133802074"
},
"comprador": {
"identificador_extranjero": "ES-B12345678",
"razon_social": "CONSULTORA IBERICA SL"
},
"id_doc": {
"e_ncf": "E470000000001",
"fecha_vencimiento_secuencia": "31-12-2028",
"tipo_pago": "1",
"formas_pago": [
{ "forma": "3", "monto": 10000.0 }
]
},
"items": [
{
"nombre": "Servicios de consultoría",
"cantidad": 1,
"unidad_medida": "43",
"precio_unitario": 10000.0,
"monto": 10000.0,
"indicador_facturacion": 4,
"indicador_bien_servicio": "2",
"retencion": {
"indicador": "1",
"isr_retenido": 2700.0
}
}
],
"totales": {
"monto_exento": 10000.0,
"monto_total": 10000.0,
"total_isr_retencion": 2700.0
}
}
Archivo: ejemplos/ecf-47-minimo.json
TrackID. La respuesta
202siempre traetrack_id: null: la transmisión ocurre después, en segundo plano. Al transmitirse, este tipo completo recibe su TrackID y el documento pasa ain_process_dgii(dónde aparece el TrackID).
Errores frecuentes¶
Cada mensaje llega en un 422 dentro de document.errors (y, por campo, en document.detailed_errors); la forma completa está en Cómo responde la API.
| Mensaje | Causa |
|---|---|
| El campo retención del ítem es obligatorio. | Todo ítem de un 47 debe declarar la retención. |
| El campo ISR retenido del ítem es obligatorio. | Falta retencion.isr_retenido. |
| El campo RNC/Cédula del comprador no está permitido. | El beneficiario es extranjero: use identificador_extranjero. |
| El campo total ITBIS no está permitido. | El 47 no lleva ITBIS. |
| Hay ISR retenido en el detalle, así que totales.total_isr_retencion es obligatorio (…). | Falta totales.total_isr_retencion: es la suma de los retencion.isr_retenido de las líneas. |
| El total de ISR retenido (…) no coincide con la suma de las líneas (…). | Revise que el total sea exactamente la suma de las retenciones de los ítems. |
| Escriba el país con su nombre …, sin números y con al menos 3 letras… | transporte.pais_destino es el nombre del país ("España"), no su código ("ES"). |