Sorteos y rifas promocionales
Empresas que premian a clientes o a quienes participan en una promoción.
El complemento Premios se agrega al CFDI de Retenciones e Información de Pagos cuando pagas un premio de lotería, rifa, sorteo, juego con apuesta o concurso y retienes impuestos al ganador. Se timbra con la clave de retención 20 (Obtención de premios) e informa la entidad federativa donde se paga el premio, el monto total y qué parte está gravada y cuál exenta.
Quién lo emite
Sorteos y rifas promocionales
Empresas que premian a clientes o a quienes participan en una promoción.
Concursos y certámenes
Organizadores que entregan premios en dinero o en especie.
Casas de juego y apuestas
Quien paga premios derivados de juegos con apuesta.
Qué datos lleva
Entidad federativa
EntidadFederativaEl estado donde se paga el premio.
Monto total del pago
MontTotPagoEl valor total del premio.
Monto gravado
MontTotPagoGravLa parte del premio que causa impuesto.
Monto exento
MontTotPagoExentLa parte que no lo causa.
Si la entidad cobra un impuesto local sobre premios que tú retienes, regístralo como una retención adicional a la federal: se captura por separado y no se calcula sola al elegir la entidad.
¿Ganaste un premio? No tienes que emitir nada: quien te lo pagó te entrega este CFDI. Si tus premios, junto con préstamos y donativos, superan $600,000 en el año, infórmalos en tu declaración anual para que la retención cuente como pago definitivo.
Ejemplo
Una cadena de tiendas hace un sorteo entre sus clientes y entrega un premio en efectivo a una persona física.
La empresa captura a la persona ganadora como receptor, elige la clave 20, indica la entidad donde se paga el premio, separa lo gravado de lo exento y registra las retenciones federal y local que haya determinado. Al timbrar, la persona ganadora recibe su CFDI de Retenciones como comprobante.
Si el impuesto local a premios de esa entidad no supera el 6 %, la retención federal de ISR es del 1 % sobre el valor del premio; si lo supera, del 21 % (artículo 138 de la LISR).
Ejemplo de CFDI emitido
para persona ganadora
Para developers
Si ya tienes tu propio sistema o ERP, puedes timbrar el CFDI de retenciones por premios directamente desde tu software con la API de CFDI de retenciones de Facturama.
$usuario = 'TU_USUARIO_API';
$password = 'TU_PASSWORD_API';
$payload = [
'CveRetenc' => '20',
'FechaExp' => '2026-10-01T12:38:41',
'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' => 2,
'ImpRetenidos' => [
[
'BaseRet' => 200,
'Impuesto' => '01',
'MontoRet' => 2,
'TipoPagoRet' => '03',
],
],
],
'Complemento' => [
'Premios' => [
'EntidadFederativa' => '01',
'MontTotPago' => 200,
'MontTotPagoGrav' => 200,
'MontTotPagoExent' => 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: '20',
FechaExp: '2026-10-01T12:38:41',
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: 2,
ImpRetenidos: [
{
BaseRet: 200,
Impuesto: '01',
MontoRet: 2,
TipoPagoRet: '03',
},
],
},
Complemento: {
Premios: {
EntidadFederativa: '01',
MontTotPago: 200,
MontTotPagoGrav: 200,
MontTotPagoExent: 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': '20',
'FechaExp': '2026-10-01T12:38:41',
'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': 2,
'ImpRetenidos': [
{
'BaseRet': 200,
'Impuesto': '01',
'MontoRet': 2,
'TipoPagoRet': '03',
},
],
},
'Complemento': {
'Premios': {
'EntidadFederativa': '01',
'MontTotPago': 200,
'MontTotPagoGrav': 200,
'MontTotPagoExent': 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": "20",
"FechaExp": "2026-10-01T12:38:41",
"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": 2,
"ImpRetenidos": [
{
"BaseRet": 200,
"Impuesto": "01",
"MontoRet": 2,
"TipoPagoRet": "03"
}
]
},
"Complemento": {
"Premios": {
"EntidadFederativa": "01",
"MontTotPago": 200,
"MontTotPagoGrav": 200,
"MontTotPagoExent": 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 = "20",
FechaExp = "2026-10-01T12:38:41",
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 = 2,
ImpRetenidos = new[]
{
new
{
BaseRet = 200,
Impuesto = "01",
MontoRet = 2,
TipoPagoRet = "03",
},
},
},
Complemento = new
{
Premios = new
{
EntidadFederativa = "01",
MontTotPago = 200,
MontTotPagoGrav = 200,
MontTotPagoExent = 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: '20',
FechaExp: '2026-10-01T12:38:41',
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: 2,
ImpRetenidos: [
{
BaseRet: 200,
Impuesto: '01',
MontoRet: 2,
TipoPagoRet: '03',
},
],
},
Complemento: {
Premios: {
EntidadFederativa: '01',
MontTotPago: 200,
MontTotPagoGrav: 200,
MontTotPagoExent: 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
Registrar solo la retención federal
Causa
Si la entidad cobra un impuesto local sobre premios que tú retienes, el comprobante no lo refleja.
Solución
Agrega la retención local junto a la federal.
ERROR 02
Dar por hecho que la tasa local se llena sola
Causa
Elegir la entidad federativa no calcula el impuesto local.
Solución
Captura la tasa local por separado, según lo que cobra la entidad.
ERROR 03
Usar otra clave de retención
Causa
Otra clave rompe la relación con el complemento Premios y el PAC rechaza el comprobante.
Solución
Timbra los premios con la clave 20, Obtención de premios.
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 20, Obtención de premios, del catálogo c_CveRetenc del SAT. El complemento Premios se agrega sobre esa clave.
Por regla general, el 1 % sobre el valor del premio, sin deducción alguna, en los estados donde el impuesto local a premios no excede del 6 %; donde lo supera, el 21 %. En juegos con apuestas es el 1 % sobre el valor total que se reparte entre los boletos premiados. Lo establece el artículo 138 de la Ley del ISR; el impuesto local depende de cada entidad, así que confírmalo con tu contador.
Quien paga el premio y retiene. El ganador lo recibe como comprobante y no tiene que emitir nada. Si el ganador es una persona moral, no se le retiene.
Sí. Aplica a loterías, rifas, sorteos, juegos con apuestas y concursos de toda clase, que son los ingresos por premios que define el artículo 137 de la Ley del ISR.
El complemento de Premios 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 premios: quien paga un premio y retiene sigue emitiendo el CFDI de Retenciones con el complemento Premios.
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.
Bancos, fintechs y casas de bolsa
Interés nominal, real y pérdida. Corresponde a la clave 16 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.