CFDI de retenciones por premios

CFDI de Retenciones con el complemento de Premios

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

Quién debe emitirel complemento de Premios

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.

Bolas numeradas de una tómbola de sorteo

Qué datos lleva

Qué datos llevael complemento de Premios

  1. Entidad federativa

    EntidadFederativa

    El estado donde se paga el premio.

  2. Monto total del pago

    MontTotPago

    El valor total del premio.

  3. Monto gravado

    MontTotPagoGrav

    La parte del premio que causa impuesto.

  4. Monto exento

    MontTotPagoExent

    La 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

Ejemplo de CFDIpor premios

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).

Formulario de Nueva Retención en Facturama con la clave 20, Obtención de premios
Facturama

Ejemplo de CFDI emitido
para persona ganadora


Receptor
Persona física ganadora
Clave de retención
20 - Obtención de Premios
Complemento
Premios
Impuestos retenidos
Federal y local
Resultado
CFDI con UUID para persona ganadora

Para developers

Emisión por API del complemento de Premios

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.

Ver documentación API
POSThttps://apisandbox.facturama.mx/2/retenciones
$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

Errores frecuentes con el complemento de Premios

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

Precio del complemento de Premios

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.

Contratar ahora

Dudas

Preguntas frecuentes sobre el complemento de Premios

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

Otros complementos del CFDI de retenciones

Pagos a extranjeros

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.

Ver complemento

Enajenación de acciones

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.

Ver complemento

Intereses

Bancos, fintechs y casas de bolsa

Interés nominal, real y pérdida. Corresponde a la clave 16 de retención.

Ver complemento

Solo para API

Plataformas tecnológicas

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.

Ver complemento