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"
}
CampoRequeridoDescripción
cveRetencClave de retención del SAT (c_ClaveRetenc), hasta 3 caracteres.
receptorNacionalidad"Nacional" o "Extranjero".
receptorNombreHasta 254 caracteres.
periodoEjercicioAño, 2000–2099.
periodoMesInicial, periodoMesFinal1–12.
montoTotalOperacionMonto total de la operación.
montoTotalGravadoParte gravada.
montoTotalExentoParte exenta.
idempotencyKey8–128 caracteres.
receptorRfccondicionalRequerido si la nacionalidad es "Nacional".
receptorRegimen, receptorCprecomendadoPara receptores nacionales.
receptorPaisResidencia, receptorNumRegIdcondicionalPara receptores extranjeros: clave de país y tax id.
retenidoIsr, retenidoIva, retenidoIepsnoAl menos uno debería traer importe.
descripcionnoHasta 1000 caracteres.
serienoSobrescribe 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.