Emitir CFDI
Retenciones e información de pagos
El CFDI de retenciones, para cuando retienes impuestos a un tercero.
El CFDI de retenciones es un comprobante aparte del CFDI 4.0 de ingresos: se emite cuando retienes impuestos a un tercero —dividendos, arrendamiento, pagos al extranjero, intereses— por un periodo, no por una operación individual.
POST /api/authenticated/{org}/retenciones
Scope: invoices.create
Cuerpo
{
"cveRetenc": "14",
"descripcion": "Dividendos o utilidades distribuidos",
"receptorNacionalidad": "Nacional",
"receptorRfc": "ACM980101ABC",
"receptorNombre": "ACME SA DE CV",
"receptorRegimen": "601",
"receptorCp": "06600",
"periodoEjercicio": 2026,
"periodoMesInicial": 1,
"periodoMesFinal": 12,
"montoTotalOperacion": 500000,
"montoTotalGravado": 500000,
"montoTotalExento": 0,
"retenidoIsr": 50000,
"idempotencyKey": "mi-erp:prod:retencion:2026:0007"
}
| Campo | Requerido | Descripción |
|---|---|---|
cveRetenc | sí | Clave de retención del SAT (c_ClaveRetenc), hasta 3 caracteres. |
receptorNacionalidad | sí | "Nacional" o "Extranjero". |
receptorNombre | sí | Hasta 254 caracteres. |
periodoEjercicio | sí | Año, 2000–2099. |
periodoMesInicial, periodoMesFinal | sí | 1–12. |
montoTotalOperacion | sí | Monto total de la operación. |
montoTotalGravado | sí | Parte gravada. |
montoTotalExento | sí | Parte exenta. |
idempotencyKey | sí | 8–128 caracteres. |
receptorRfc | condicional | Requerido si la nacionalidad es "Nacional". |
receptorRegimen, receptorCp | recomendado | Para receptores nacionales. |
receptorPaisResidencia, receptorNumRegId | condicional | Para receptores extranjeros: clave de país y tax id. |
retenidoIsr, retenidoIva, retenidoIeps | no | Al menos uno debería traer importe. |
descripcion | no | Hasta 1000 caracteres. |
serie | no | Sobrescribe la serie de retenciones. |
Receptor extranjero
{
"cveRetenc": "22",
"receptorNacionalidad": "Extranjero",
"receptorNombre": "GLOBAL SERVICES LLC",
"receptorPaisResidencia": "USA",
"receptorNumRegId": "98-7654321",
"periodoEjercicio": 2026,
"periodoMesInicial": 6,
"periodoMesFinal": 6,
"montoTotalOperacion": 120000,
"montoTotalGravado": 120000,
"montoTotalExento": 0,
"retenidoIsr": 30000,
"idempotencyKey": "mi-erp:prod:retencion:2026:0008"
}
Con "Extranjero" no mandas receptorRfc: mandas receptorPaisResidencia (clave
de 3 letras) y receptorNumRegId (el tax id del país de residencia).
Consultar
GET /api/authenticated/{org}/retenciones?status=stamped&limit=25
Scope: invoices.read. Filtros: status (draft, pending, stamped,
failed, cancelled), limit (1–100, default 25) y cursor. Devuelve
{ "retenciones": [...], "nextCursor": ... }.
Detalle de uno:
GET /api/authenticated/{org}/retenciones/{retencionId}
Cancelar
POST /api/authenticated/{org}/retenciones/{retencionId}/cancel
{ "motivo": "02" }
Scope: invoices.cancel. Mismos motivos que cualquier cancelación, y consume un
timbre. Ver Cancelaciones.
Qué clave de retención usar
cveRetenc sale del catálogo c_ClaveRetenc del SAT y depende del acto:
dividendos, enajenación de acciones, intereses, arrendamiento en fideicomiso,
pagos a residentes en el extranjero… No la adivines: confírmala con quien lleva la
contabilidad de la empresa. Una clave equivocada produce un comprobante válido
para el PAC pero incorrecto para el SAT, que es la peor combinación posible.