- Blog
- Tipo de cambio
Tipo de cambio SUNAT: cuál usar y en qué fecha
Tipo de cambio SUNAT: de dónde sale, compra o venta, cuál usar para el IGV y para renta, qué pasa los fines de semana y feriados, y cómo automatizarlo.
Emites una factura en dólares y el sistema pide un tipo de cambio. ¿Compra o venta? ¿El de hoy o el de ayer? ¿El de SUNAT, el de la SBS o el que te dio el banco esta mañana? Y si es sábado, ¿cuál? Cada una de esas preguntas tiene una respuesta concreta, y cada respuesta equivocada termina en un registro de ventas que no cuadra o en un IGV en soles distinto al que el contador esperaba.
Este artículo explica qué es exactamente el tipo de cambio que publica SUNAT, de dónde sale, cuándo se usa compra y cuándo venta, qué cambia entre el IGV y el impuesto a la renta, cómo resolver los días sin publicación y cómo dejar todo esto automatizado en tu ERP o facturador.
Qué publica SUNAT y de dónde sale
SUNAT no calcula el tipo de cambio. Quien lo calcula es la Superintendencia de Banca, Seguros y AFP (SBS): cada día hábil toma las operaciones de compra y venta de dólares del sistema financiero y obtiene un promedio ponderado por monto, uno para compra y otro para venta. Lo publica al cierre de ese día.
SUNAT toma ese valor y lo publica en su tabla al día siguiente: el dato que SUNAT muestra para una fecha es el que la SBS calculó el día anterior. Ese desfase de un día es la fuente de la mayoría de las discusiones entre sistemas y contadores: la fecha de publicación no es la fecha de las operaciones que lo originaron.
Los valores de referencia de todo el artículo:
| Fecha en la tabla de SUNAT | Compra | Venta |
|---|---|---|
| 2026-10-09 (viernes) | 3.708 | 3.712 |
El valor viene con tres decimales. Guárdalo así en una columna decimal; nunca lo redondees a dos "para que se vea mejor", porque en montos grandes la diferencia aparece en el IGV.
Compra o venta
Los dos valores existen porque el banco compra dólares a un precio y los vende a otro, y la venta siempre es mayor que la compra. El tipo compra es lo que te pagan por tus dólares; el tipo venta es lo que te cobran por dárselos.
Para decidir cuál usar sirve la regla general de la contabilidad, a grandes rasgos: lo que tienes o te deben (activos: caja en dólares, cuentas por cobrar) se valoriza a compra, porque es lo que obtendrías al convertirlo a soles; lo que debes (pasivos: cuentas por pagar, préstamos) se valoriza a venta, porque es lo que pagarías por los dólares para cancelarlo.
Para facturar y declarar el IGV la regla es más simple: se usa el tipo venta. Y si tu módulo de facturación solo guarda uno de los dos valores, guarda los dos; vas a necesitar el otro en el cierre contable. El detalle de los casos, con ejemplos numéricos, está en operaciones en dólares: compra o venta.
Qué tipo usar para el IGV
Cuando emites un comprobante en dólares, la base y el IGV van en dólares en el XML, pero tu registro de ventas y tu declaración mensual van en soles. Para esa conversión la regla del IGV, a grandes rasgos, es: tipo de cambio promedio ponderado venta publicado por la SBS en la fecha en que nace la obligación tributaria, que para una venta normal es la fecha de emisión. Los días sin publicación se usa el último publicado.
"Publicado en la fecha" significa el valor que aparece en la tabla de SUNAT bajo esa fecha. Con el ejemplo anterior, una factura emitida el 2026-10-09 por USD 1 000.00 más IGV se convierte así:
- Base: 1 000.00 × 3.712 = S/ 3 712.00
- IGV: 180.00 × 3.712 = S/ 668.16
- Total: S/ 4 380.16
La misma regla aplica del lado del comprador: el crédito fiscal de esa factura se registra con el tipo venta de la fecha de emisión. Por eso emisor y receptor deberían llegar al mismo monto en soles, y por eso un tipo de cambio equivocado en tu sistema no es un error cosmético: tu cliente lo va a notar cuando sus números no cuadren con los tuyos.
Si el pedido se tomó el lunes, la factura se emitió el miércoles y el cliente pagó el viernes, el tipo de cambio para el IGV es el del miércoles. El cobro del viernes se registra con el tipo real al que se recibió el dinero, y la diferencia entre ambos es diferencia de cambio, no un ajuste a la factura.
Qué tipo usar para renta y contabilidad
Para el impuesto a la renta y los libros contables la lógica es la de activos y pasivos: a grandes rasgos, una cuenta por cobrar en dólares se registra al tipo compra y una cuenta por pagar al tipo venta, con el tipo de cambio vigente en la fecha de la operación. Y al cierre de cada periodo, los saldos en moneda extranjera se actualizan con el tipo de cambio de cierre, lo que genera una ganancia o pérdida por diferencia de cambio.
Aquí aparece el matiz que confunde a muchos sistemas. Para el IGV la norma habla del tipo de cambio "publicado" en la fecha; para renta se suele interpretar como el "vigente" al cierre de ese día, que es el que la SBS calcula ese mismo día y que SUNAT muestra recién al día siguiente. Es decir, para una misma fecha de emisión el IGV puede usar un valor y la cuenta por cobrar otro, con un día de desfase.
No es un error de tu sistema ni del contador: son dos reglas para dos impuestos distintos. Lo que sí es un error es no saber cuál estás aplicando. Guarda el histórico completo por fecha de publicación y deja que el módulo contable elija el día según su regla. Y antes de fijarla en código, confírmala con el contador, porque hay casos (anticipos, servicios, exportaciones) donde la fecha de nacimiento de la obligación no coincide con la de emisión.
Fines de semana y feriados
La SBS calcula el promedio ponderado solo en días hábiles, porque solo entonces hay operaciones. Los días sin operaciones no tienen publicación propia. La regla tributaria es la que ya viste: en los días sin publicación se usa el último publicado.
En la práctica, para tu sistema: una factura emitida un domingo o un feriado usa el último tipo de cambio publicado antes de esa fecha. Si hay varios días seguidos sin publicación, todos usan ese mismo valor, y el siguiente valor nuevo aparece con la siguiente publicación.
Tu código no debería depender de que alguien recuerde esto. La forma correcta de resolverlo es pedir el tipo de cambio de la fecha de emisión y, si para esa fecha no existe publicación, retroceder un día hasta encontrar la última. Además, guarda en el registro de la factura qué valor usaste y de qué fecha venía, para que una auditoría pueda reconstruirlo sin adivinar.
Un error frecuente es el contrario: tomar el valor del siguiente día hábil porque la tarea de actualización corre el lunes y sobrescribe los días anteriores. Los días sin publicación se congelan con el último valor anterior, nunca con el siguiente.
Cómo automatizarlo
Automatizar el tipo de cambio tiene tres partes: obtener el valor, guardarlo por fecha y resolver los días sin publicación. Lo que no debes hacer es copiarlo a mano de una página web cada mañana ni pedirle al usuario que lo escriba al emitir.
Obtener el valor. La API de tipo de cambio de endpoint.pe devuelve el valor más reciente publicado por SUNAT, con la fecha a la que corresponde, en JSON. No recibe parámetros:
curl "https://api.endpoint.pe/v1/tipo-cambio" \
-H "Authorization: Bearer TU_TOKEN"
{
"success": true,
"message": "Consulta exitosa",
"data": {
"fecha": "2026-10-09",
"moneda": "USD",
"compra": 3.708,
"venta": 3.712,
"fuente": "SUNAT"
},
"meta": {
"fuente": "SUNAT",
"consultado_en": "2026-10-12T07:40:12Z",
"creditos_cobrados": 1,
"creditos_disponibles": 14621
}
}
Guardarlo. Una tabla tipo_cambio con fecha (clave única), compra, venta, fuente y consultado_en. Una tarea programada la llena cada día hábil por la mañana. Con una consulta diaria, el mes entero entra dentro de las 150 consultas gratis que incluye la cuenta sin tarjeta.
Resolver días sin publicación. La API ya aplica la regla al responder: si SUNAT todavía no publicó el valor de hoy, devuelve el último publicado y su fecha. Para fechas pasadas, la regla se resuelve en tu tabla: busca la fila más reciente cuya fecha no supere la pedida. Un ejemplo en Python con las dos partes:
import os
from datetime import date
import requests
BASE = "https://api.endpoint.pe/v1"
TOKEN = os.environ["ENDPOINT_PE_TOKEN"]
def tipo_cambio_vigente() -> dict:
"""El tipo de cambio más reciente publicado por SUNAT y la fecha a la que corresponde."""
r = requests.get(
f"{BASE}/tipo-cambio",
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=10,
)
r.raise_for_status()
return r.json()["data"]
def aplicable(tabla: dict[date, dict], fecha: date) -> dict:
"""Valor aplicable a una fecha: la última fila guardada que no la supere."""
candidatas = [d for d in tabla if d <= fecha]
if not candidatas:
raise RuntimeError("No hay tipo de cambio guardado para esa fecha")
return tabla[max(candidatas)]
tc = tipo_cambio_vigente()
print(tc["fecha"], tc["compra"], tc["venta"]) # fecha del valor vigente y sus valores
La tarea diaria llama a tipo_cambio_vigente() y guarda la fila por fecha (si ese día aún no hay valor nuevo, el que recibe ya está guardado y no pasa nada). El resto del sistema usa aplicable() sobre la tabla y nunca llama a la API en cada operación. Cómo armar la tarea programada, los reintentos y el histórico está desarrollado en automatizar el tipo de cambio diario en tu ERP.
Si además recibes facturas de proveedores en dólares, usa la misma función para registrar el crédito fiscal con el tipo venta de la fecha de emisión del proveedor, no de la fecha en que llegó el documento.
En resumen
- SUNAT publica el promedio ponderado compra y venta que calcula la SBS del día anterior. SUNAT no lo calcula; lo republica con un día de desfase.
- Para el IGV (ventas y compras en dólares) se usa el tipo venta publicado en la fecha de emisión del comprobante.
- Para renta y contabilidad, a grandes rasgos: activos a compra, pasivos a venta, con el matiz de la fecha de cierre. Confírmalo con tu contador.
- Los días sin publicación (fines de semana, feriados) usan el último publicado. Nunca el siguiente.
- Guarda compra y venta con tres decimales, por fecha, con la fuente y el momento de consulta.
- Una tarea diaria que consulte la API y guarde el valor por fecha, más una función que busque la última fila publicada, cubren todos los casos sin intervención manual.
Preguntas frecuentes
¿Uso el tipo de cambio del día que emito o del día que cobro?
Para el comprobante y el IGV, el de la fecha de emisión. Lo que recibas al cobrar, al tipo real al que el banco te cambió los dólares, se registra como diferencia de cambio. Son dos registros distintos y los dos son correctos.
¿Qué pasa si emití con un tipo de cambio equivocado?
Si el comprobante está en dólares, los montos en dólares del XML siguen siendo correctos; lo que hay que corregir es la conversión en tu registro de ventas y la declaración, si ya se presentó. Habla con tu contador antes de emitir cualquier nota de crédito, porque el problema suele ser contable y no del comprobante en sí.
¿Cuántos decimales tiene el tipo de cambio?
SUNAT lo publica con tres decimales (por ejemplo 3.712). Guárdalo en una columna decimal con al menos esa precisión y haz la conversión con el valor completo; redondea a dos decimales solo el resultado en soles.
¿Y si la factura es en euros u otra moneda?
La tabla diaria de SUNAT es del dólar. Para otras monedas la SBS publica cotizaciones de referencia; confirma el criterio de conversión con el contador y la fuente oficial antes de programarlo. En la práctica, casi todos los comprobantes en moneda extranjera en el Perú son en dólares.






