Bancos y SOFIPO
Instituciones que pagan intereses por cuentas, pagarés e inversiones.
El complemento de Intereses se agrega al CFDI de Retenciones e Información de Pagos cuando pagas intereses de una cuenta, un pagaré, una inversión o una operación financiera derivada y debes informarlos al SAT. Se timbra con la clave de retención 16 (Intereses) y desglosa el interés nominal, el interés real y, si la hubo, la pérdida.
Quién lo emite
Bancos y SOFIPO
Instituciones que pagan intereses por cuentas, pagarés e inversiones.
Casas de bolsa y plataformas de inversión
Intermediarios que pagan intereses por las inversiones de sus clientes.
Empresas fuera del sistema financiero
Quien liquida intereses de un préstamo, por ejemplo entre una empresa y sus socios.
Qué datos lleva
Sistema financiero
SistFinancieroSi quien paga es una institución del sistema financiero (SI o NO).
Retiro en el periodo
RetiroAORESRetIntSi los intereses se retiraron durante el periodo (SI o NO).
Operaciones financieras
OperFinancDerivadSi derivan de operaciones financieras derivadas (SI o NO).
Interés nominal
MontIntNominalEl interés que se pagó, sin ajustar.
Interés real
MontIntRealEl interés después de ajustar por inflación.
Pérdida
PerdidaSi el interés real fue negativo, la pérdida.
¿Te llegó una constancia de intereses de tu banco o tu app de inversión? No tienes que emitir nada: la timbró esa institución. Descárgala de su portal y úsala en tu declaración anual.
Ejemplo
Un socio le presta dinero a la empresa y esta le liquida los intereses al cierre del año. Como la empresa no es una institución del sistema financiero, marca "No" en sistema financiero, captura el interés nominal pagado y el interés real del periodo y registra la retención que determinó. El socio recibe su CFDI de Retenciones como constancia.
En el sistema financiero, la retención de ISR se calcula sobre el capital que genera los intereses, a la tasa anual que fija la Ley de Ingresos de la Federación (artículo 54 de la LISR). Fuera del sistema financiero también se retiene a la tasa anual de la Ley de Ingresos sobre el capital (artículo 135).
Ejemplo de CFDI
emitido para quien recibe los intereses
Para developers
Si ya tienes tu propio sistema o ERP, puedes timbrar las constancias de intereses directamente desde tu software con la API de Facturama, incluso por lotes al cierre del año. Lo explicamos en la API del complemento de intereses.
$usuario = 'TU_USUARIO_API';
$password = 'TU_PASSWORD_API';
$payload = [
'CveRetenc' => '16',
'FechaExp' => '2026-10-01T12:40:06',
'DescRetenc' => 'No aplica',
'LugarExpRetenc' => '42501',
'Folio' => null,
'Emisor' => [
'RfcEmisor' => 'EKU9003173C9',
'NomDenRazSocE' => 'ESCUELA KEMPER URGATE',
'RegimenFiscalE' => '601',
],
'Receptor' => [
'Nacionalidad' => 'Nacional',
'Nacional' => [
'RfcRecep' => 'CACX7605101P8',
'NomDenRazSocR' => 'XOCHILT CASAS CHAVEZ',
'CurpR' => null,
'DomicilioFiscalR' => '36257',
],
],
'Periodo' => [
'MesIni' => 1,
'MesFin' => 1,
'Ejerc' => 2026,
],
'Totales' => [
'MontoTotOperacion' => 200,
'MontoTotGrav' => 200,
'MontoTotExent' => 0,
'MontoTotRet' => 1.8,
'ImpRetenidos' => [
[
'BaseRet' => 200,
'Impuesto' => '01',
'MontoRet' => 1.8,
'TipoPagoRet' => '03',
],
],
],
'Complemento' => [
'Intereses' => [
'sistFinanciero' => 'NO',
'retiroAORESRetInt' => 'SI',
'operFinancDerivad' => 'NO',
'montIntNominal' => 200,
'montIntReal' => 100,
'perdida' => 0,
],
],
];
$ch = curl_init('https://apisandbox.facturama.mx/2/retenciones');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERPWD, "$usuario:$password");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$respuesta = curl_exec($ch);
curl_close($ch);
echo $respuesta;
const usuario = 'TU_USUARIO_API';
const password = 'TU_PASSWORD_API';
const payload = {
CveRetenc: '16',
FechaExp: '2026-10-01T12:40:06',
DescRetenc: 'No aplica',
LugarExpRetenc: '42501',
Folio: null,
Emisor: {
RfcEmisor: 'EKU9003173C9',
NomDenRazSocE: 'ESCUELA KEMPER URGATE',
RegimenFiscalE: '601',
},
Receptor: {
Nacionalidad: 'Nacional',
Nacional: {
RfcRecep: 'CACX7605101P8',
NomDenRazSocR: 'XOCHILT CASAS CHAVEZ',
CurpR: null,
DomicilioFiscalR: '36257',
},
},
Periodo: {
MesIni: 1,
MesFin: 1,
Ejerc: 2026,
},
Totales: {
MontoTotOperacion: 200,
MontoTotGrav: 200,
MontoTotExent: 0,
MontoTotRet: 1.8,
ImpRetenidos: [
{
BaseRet: 200,
Impuesto: '01',
MontoRet: 1.8,
TipoPagoRet: '03',
},
],
},
Complemento: {
Intereses: {
sistFinanciero: 'NO',
retiroAORESRetInt: 'SI',
operFinancDerivad: 'NO',
montIntNominal: 200,
montIntReal: 100,
perdida: 0,
},
},
};
fetch('https://apisandbox.facturama.mx/2/retenciones', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Basic ' + btoa(`${usuario}:${password}`),
},
body: JSON.stringify(payload),
})
.then((res) => res.json())
.then((data) => console.log(data.Complemento.TimbreFiscalDigital.UUID));
import requests
from requests.auth import HTTPBasicAuth
usuario = 'TU_USUARIO_API'
password = 'TU_PASSWORD_API'
payload = {
'CveRetenc': '16',
'FechaExp': '2026-10-01T12:40:06',
'DescRetenc': 'No aplica',
'LugarExpRetenc': '42501',
'Folio': None,
'Emisor': {
'RfcEmisor': 'EKU9003173C9',
'NomDenRazSocE': 'ESCUELA KEMPER URGATE',
'RegimenFiscalE': '601',
},
'Receptor': {
'Nacionalidad': 'Nacional',
'Nacional': {
'RfcRecep': 'CACX7605101P8',
'NomDenRazSocR': 'XOCHILT CASAS CHAVEZ',
'CurpR': None,
'DomicilioFiscalR': '36257',
},
},
'Periodo': {
'MesIni': 1,
'MesFin': 1,
'Ejerc': 2026,
},
'Totales': {
'MontoTotOperacion': 200,
'MontoTotGrav': 200,
'MontoTotExent': 0,
'MontoTotRet': 1.8,
'ImpRetenidos': [
{
'BaseRet': 200,
'Impuesto': '01',
'MontoRet': 1.8,
'TipoPagoRet': '03',
},
],
},
'Complemento': {
'Intereses': {
'sistFinanciero': 'NO',
'retiroAORESRetInt': 'SI',
'operFinancDerivad': 'NO',
'montIntNominal': 200,
'montIntReal': 100,
'perdida': 0,
},
},
}
respuesta = requests.post(
'https://apisandbox.facturama.mx/2/retenciones',
json=payload,
auth=HTTPBasicAuth(usuario, password),
)
print(respuesta.json())
String usuario = "TU_USUARIO_API";
String password = "TU_PASSWORD_API";
String credenciales = Base64.getEncoder()
.encodeToString((usuario + ":" + password).getBytes());
String payload = """
{
"CveRetenc": "16",
"FechaExp": "2026-10-01T12:40:06",
"DescRetenc": "No aplica",
"LugarExpRetenc": "42501",
"Folio": null,
"Emisor": {
"RfcEmisor": "EKU9003173C9",
"NomDenRazSocE": "ESCUELA KEMPER URGATE",
"RegimenFiscalE": "601"
},
"Receptor": {
"Nacionalidad": "Nacional",
"Nacional": {
"RfcRecep": "CACX7605101P8",
"NomDenRazSocR": "XOCHILT CASAS CHAVEZ",
"CurpR": null,
"DomicilioFiscalR": "36257"
}
},
"Periodo": {
"MesIni": 1,
"MesFin": 1,
"Ejerc": 2026
},
"Totales": {
"MontoTotOperacion": 200,
"MontoTotGrav": 200,
"MontoTotExent": 0,
"MontoTotRet": 1.8,
"ImpRetenidos": [
{
"BaseRet": 200,
"Impuesto": "01",
"MontoRet": 1.8,
"TipoPagoRet": "03"
}
]
},
"Complemento": {
"Intereses": {
"sistFinanciero": "NO",
"retiroAORESRetInt": "SI",
"operFinancDerivad": "NO",
"montIntNominal": 200,
"montIntReal": 100,
"perdida": 0
}
}
}
""";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://apisandbox.facturama.mx/2/retenciones"))
.header("Content-Type", "application/json")
.header("Authorization", "Basic " + credenciales)
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
var usuario = "TU_USUARIO_API";
var password = "TU_PASSWORD_API";
var payload = new
{
CveRetenc = "16",
FechaExp = "2026-10-01T12:40:06",
DescRetenc = "No aplica",
LugarExpRetenc = "42501",
Folio = (string?)null,
Emisor = new
{
RfcEmisor = "EKU9003173C9",
NomDenRazSocE = "ESCUELA KEMPER URGATE",
RegimenFiscalE = "601",
},
Receptor = new
{
Nacionalidad = "Nacional",
Nacional = new
{
RfcRecep = "CACX7605101P8",
NomDenRazSocR = "XOCHILT CASAS CHAVEZ",
CurpR = (string?)null,
DomicilioFiscalR = "36257",
},
},
Periodo = new
{
MesIni = 1,
MesFin = 1,
Ejerc = 2026,
},
Totales = new
{
MontoTotOperacion = 200,
MontoTotGrav = 200,
MontoTotExent = 0,
MontoTotRet = 1.8,
ImpRetenidos = new[]
{
new
{
BaseRet = 200,
Impuesto = "01",
MontoRet = 1.8,
TipoPagoRet = "03",
},
},
},
Complemento = new
{
Intereses = new
{
sistFinanciero = "NO",
retiroAORESRetInt = "SI",
operFinancDerivad = "NO",
montIntNominal = 200,
montIntReal = 100,
perdida = 0,
},
},
};
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.UTF8.GetBytes($"{usuario}:{password}")));
var response = await client.PostAsJsonAsync("https://apisandbox.facturama.mx/2/retenciones", payload);
Console.WriteLine(await response.Content.ReadAsStringAsync());
require 'net/http'
require 'json'
require 'uri'
usuario = 'TU_USUARIO_API'
password = 'TU_PASSWORD_API'
payload = {
CveRetenc: '16',
FechaExp: '2026-10-01T12:40:06',
DescRetenc: 'No aplica',
LugarExpRetenc: '42501',
Folio: nil,
Emisor: {
RfcEmisor: 'EKU9003173C9',
NomDenRazSocE: 'ESCUELA KEMPER URGATE',
RegimenFiscalE: '601',
},
Receptor: {
Nacionalidad: 'Nacional',
Nacional: {
RfcRecep: 'CACX7605101P8',
NomDenRazSocR: 'XOCHILT CASAS CHAVEZ',
CurpR: nil,
DomicilioFiscalR: '36257',
},
},
Periodo: {
MesIni: 1,
MesFin: 1,
Ejerc: 2026,
},
Totales: {
MontoTotOperacion: 200,
MontoTotGrav: 200,
MontoTotExent: 0,
MontoTotRet: 1.8,
ImpRetenidos: [
{
BaseRet: 200,
Impuesto: '01',
MontoRet: 1.8,
TipoPagoRet: '03',
},
],
},
Complemento: {
Intereses: {
sistFinanciero: 'NO',
retiroAORESRetInt: 'SI',
operFinancDerivad: 'NO',
montIntNominal: 200,
montIntReal: 100,
perdida: 0,
},
},
}
uri = URI.parse('https://apisandbox.facturama.mx/2/retenciones')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri, { 'Content-Type' => 'application/json' })
request.basic_auth(usuario, password)
request.body = payload.to_json
puts http.request(request).body
Antes de timbrar
ERROR 01
Marcar mal "sistema financiero"
Causa
Ese campo cambia el tratamiento: no es lo mismo una institución financiera que una empresa que paga intereses de un préstamo.
Solución
Responde SI solo si quien paga es una institución del sistema financiero.
ERROR 02
Confundir interés nominal con interés real
Causa
Son dos montos distintos: el pagado y el ajustado por inflación.
Solución
Captura ambos, cada uno en su campo.
ERROR 03
Dejar vacía la pérdida
Causa
Si el ajuste por inflación vuelve negativo el interés real, esa diferencia es una pérdida.
Solución
Informa la pérdida cuando el interés real sea negativo; si no la hubo, va en 0.
Precio
El módulo se contrata una vez y desbloquea los complementos disponibles. Funciona distinto a los complementos individuales: esto es lo que cambia.
Módulo de Retenciones
$1,650 MXN / año
IVA incluido · vigencia de 12 meses a partir de la compra
Cuando uses los 25 folios incluidos, los que timbres se descuentan de tu suscripción principal.
Dudas
La 16, Intereses, del catálogo c_CveRetenc del SAT. Sobre esa clave se agrega el complemento de Intereses.
El nominal es el interés pagado, sin ajustar. El real es el que queda al descontar la inflación del periodo, y puede ser negativo; en ese caso se informa como pérdida.
Sí. Para eso existe el campo "sistema financiero": va en NO cuando quien paga no es una institución del sistema financiero, por ejemplo una empresa que liquida los intereses de un préstamo. Quien paga los intereses retiene a la tasa anual que fija la Ley de Ingresos de la Federación sobre el capital, sea o no del sistema financiero (artículos 54 y 135 de la Ley del ISR); el 20 % sobre los intereses nominales aplica a títulos valor no colocados entre el gran público inversionista (artículo 134). Confírmalo con tu contador.
No. Los intereses reales deducibles por créditos hipotecarios usan otra clave (la 23) y otro complemento, que no forma parte del Módulo de Retenciones de Facturama.
Va incluido en el Módulo de Retenciones: $1,650 MXN al año (IVA incluido), sin cobro adicional por complemento, e incluye 25 folios para timbrar. Cuando los uses, los folios se descuentan de tu plan de Facturación, que debe estar activo. Puedes probarlo antes en el sandbox de Facturama, que no tiene costo ni validez fiscal.
Sí. Cuando una persona moral paga honorarios o arrendamiento a una persona física, el CFDI de ingresos de esta, con la retención desglosada, puede servir como constancia de retención; esa facilidad no aplica a los intereses: quien los paga y retiene sigue emitiendo el CFDI de Retenciones.
Incluidos en el mismo módulo
Residentes en el extranjero
Retenciones por pagos a residentes en el extranjero sin establecimiento permanente en México. Corresponde a la clave 18 de retención.
Empresas que distribuyen utilidades
Reparto de dividendos o utilidades a personas físicas o morales. Corresponde a la clave 14 de retención.
Casas de bolsa e intermediarios bursátiles
Retenciones derivadas de la compraventa o enajenación de títulos accionarios. Corresponde a las claves 06 y 19 de retención.
Rifas, sorteos y concursos
Captura entidad federativa, monto gravado y exento. Corresponde a la clave 20 de retención.
Solo para API
Marketplaces y apps que integran por API
Retenciones de ISR e IVA a quienes prestan servicios o venden a través de tu plataforma. Corresponde a la clave 26 de retención.