Hice mi declaración de renta con Claude, y le regalo el agente
Lo que sí puede hacer una IA con su declaración de renta, lo que no puede, y por qué la diferencia importa. El proceso completo pantalla por pantalla, y el agente en GitHub con licencia MIT.
Este año presenté mi declaración de renta acompañado por Claude Code. No fue magia: fueron dos horas organizando documentos, cruzando cifras y revisando casilla por casilla. Lo cuento completo —con las pantallas reales— y al final dejo el agente para que cualquiera lo use.
Antes de nada, lo importante.
Lo que una IA NO puede hacer por usted
Empiezo por aquí porque es donde está el malentendido.
No consigue sus documentos. No entra a su banco, ni a su pagaduría, ni a la DIAN. Usted los descarga y se los entrega. Sin soportes no hay declaración: el agente para y se los pide. Esa es la parte que toma tiempo, y no se la puede delegar a nadie.
No hace el login. Su contraseña de la DIAN, su código de seguridad y la clave de su firma electrónica los escribe usted. Yo escribí las mías.
No firma ni presenta sola. Presentar es irreversible. Requiere que usted lo autorice explícitamente, y aun así el que aprieta el botón sabe lo que está aprobando.
No inventa cifras. Esta es la regla más importante que le puse: si no hay soporte, lo dice. Si estima, lo marca y muestra la fórmula. Una declaración es juramentada: la responsabilidad legal es del contribuyente, no del asistente.
Y se equivoca. Claude puede leer mal un PDF, confundir una casilla o aplicar un tope desactualizado. Por eso el agente tiene instrucción de mostrar la aritmética — para que usted la audite. Yo revisé todas las cuentas antes de firmar. Hágalo.
Cuándo esto no le sirve y necesita un contador
Si su caso tiene ingresos independientes con costos y deducciones, venta de inmuebles o vehículos, herencias, ingresos del exterior, sociedades, criptoactivos, arrendamientos, régimen SIMPLE o pérdidas por compensar: este agente no le basta. Ahí la declaración deja de ser un formulario y pasa a ser una decisión técnica, y equivocarse cuesta plata de verdad.
Lo que cuento aquí es el caso más simple: un asalariado, un empleador, sin negocio.
Y una precisión sobre la firma, que conviene decir bien
El artículo 596 numeral 6 del Estatuto Tributario exige firma de contador público solo cuando el declarante está obligado a llevar libros de contabilidad y su patrimonio o sus ingresos superan 100.000 UVT (unos $5.000 millones). Para un asalariado no se requiere: el formulario se firma con la firma electrónica del propio contribuyente.
Lo comprobé en mi propia declaración del año pasado, que hizo un contador: la casilla 982 (Cód. Contador) estaba vacía. Y está bien que lo estuviera — esa firma no aplicaba.
Eso no significa que un contador no aporte valor. Significa que su valor está en el criterio, no en la rúbrica. Lo que automaticé fue la parte mecánica: recolectar, sumar, cruzar, verificar topes. El criterio no se automatiza. Si su caso lo necesita, páguelo — es de las mejores inversiones que hay.
Ahora sí: cómo fue, pantalla por pantalla
Paso 0 · Reunir los soportes (esto lo hace usted)
- Certificado de ingresos y retenciones (formulario 220) — su empleador
- Certificados tributarios de cada banco — solo del portal, no llegan por correo
- Extractos con corte a 31 de diciembre de todas sus cuentas
- Saldos de créditos y tarjetas a 31 de diciembre
- Avalúo del vehículo / certificado de tradición del inmueble
- Su declaración del año anterior
- Firma electrónica (IFE) generada y vigente
No deje la firma electrónica para el final. Es el trámite que más se traba.
Paso 0.5 · Cómo automaticé la recolección de los soportes
Dije arriba que reunir los papeles es la parte lenta. Lo es — pero es la que más se puede automatizar, y aquí es donde una IA con navegador se gana el sueldo.
Aclaro el principio antes de la técnica, porque importa:
El login lo hace usted. Siempre. La automatización abre el navegador; usted escribe la contraseña. La sesión queda guardada en el perfil de Playwright y de ahí en adelante el agente solo navega y descarga. Nunca se guardan credenciales en un script, nunca se automatiza un formulario de acceso. Además de ser lo correcto, es lo único que funciona: los portales bancarios tienen reCAPTCHA y detección de automatización.
El correo es la mina
Casi todos los extractos llegan por correo. Con Playwright sobre Outlook Web, el buscador acepta operadores que hacen todo el trabajo:
received:2025-12-15..2026-02-10 ← el más útil de todos
hasattachment:yes
from:"Bancolombia"
Se combinan entre sí. La búsqueda que más rinde es el barrido del corte de diciembre:
hasattachment:yes received:2025-12-28..2026-01-25
Cada correo del listado es un div[role="option"] cuyo aria-label trae remitente,
asunto y fecha. Eso lo vuelve un selector estable para engancharse a un correo concreto:
// Buscar y listar lo que hay
await page.locator('#topSearchInput').fill('hasattachment:yes received:2025-12-28..2026-01-25');
await page.locator('#topSearchInput').press('Enter');
await page.waitForTimeout(3000);
const correos = await page.evaluate(() => {
const vistos = new Set(), salida = [];
for (const r of document.querySelectorAll('div[role="option"]')) {
const a = (r.getAttribute('aria-label') || '').slice(0, 130);
if (a && !vistos.has(a)) { vistos.add(a); salida.push(a); }
}
return salida;
});
Descargar los adjuntos
Son cuatro pasos, y el segundo es el que no se adivina: los adjuntos viven en su propio
listbox, y cada uno esconde la descarga detrás de un menú de «Más acciones».
// 1. abrir el correo (un trozo único del aria-label sirve de ancla)
await page.locator('div[role="option"][aria-label*="20251231"]').first().click();
await page.waitForTimeout(2500);
// 2. leer los nombres de los adjuntos
const nombres = await page.evaluate(() =>
[...document.querySelectorAll('div[role="listbox"][aria-label="archivos adjuntos"] div[role="option"]')]
.map(o => (o.getAttribute('aria-label') || '').split(' ')[0]).filter(Boolean));
// 3 y 4. por cada uno: Más acciones → Descargar → guardar donde uno quiera
for (const n of nombres) {
const opt = page.getByRole('option', { name: n });
await opt.getByLabel('Más acciones').click();
const [dl] = await Promise.all([
page.waitForEvent('download', { timeout: 20000 }),
page.locator('[role="menuitem"]:has-text("Descargar")').click()
]);
await dl.saveAs('/ruta/a/soportes/bancos/' + dl.suggestedFilename());
}
⚠️ Detalle que cuesta media hora si no se sabe: al guardar, los guiones bajos del nombre original se convierten en guiones normales. Si su script busca el archivo por nombre exacto después, no lo va a encontrar.
Los PDF de los bancos vienen cifrados
Casi todos piden clave. La convención más común es la cédula, pero no siempre: hay bancos que usan los últimos 4 dígitos y otros que no cifran nada. Toca probar.
Para leerlos no hace falta descifrarlos ni instalar qpdf. Poppler los abre en el sitio:
pdftotext -upw 1234567890 -layout extracto.pdf -
El -layout es importante: preserva las columnas. Sin él, las tablas de un extracto
salen convertidas en una sopa de números sin orden, y ahí sí es imposible saber qué
cifra corresponde a qué.
Cuando el texto sale desordenado, mírelo como imagen
Los formularios oficiales —el 210, el certificado de ingresos— son PDF con cajas
posicionadas en coordenadas. pdftotext los devuelve como una lista de números sueltos
sin las etiquetas de las casillas al lado, y ahí uno adivina. Adivinar no sirve.
La solución es dejar de leer texto y mirar la página:
pdftoppm -png -r 150 declaracion.pdf pagina
Eso genera un PNG por página. Una IA multimodal lee la imagen y ve la casilla con su número al lado, que es exactamente lo que uno necesita para no confundir la casilla 29 con la 30. Fue así como leí mi declaración del año anterior sin equivocarme.
La exógena es un Excel, no un PDF
Se procesa directo:
import openpyxl
wb = openpyxl.load_workbook('reporteExogena2025.xlsx', data_only=True)
for fila in wb['Reporte'].iter_rows(values_only=True):
print(' | '.join(str(c) for c in fila if c is not None))
Arriba trae los cinco topes ya calculados; abajo, línea por línea, quién reportó qué.
Qué manda cada entidad, y qué NO manda
Esto es lo que me habría ahorrado más tiempo saberlo antes. Los asuntos son bastante estables año a año:
| Entidad | Asunto a buscar | Qué trae |
|---|---|---|
| Bancolombia | «Extractos Bancolombia» / «Llegó tu extracto» | ahorros y tarjeta, en archivos separados |
| Davivienda | «Extractos Portafolio … AAAAMMDD» | el asunto trae la fecha de corte exacta |
| Davivienda TC | «Extractos tarjeta de Crédito …» | la tarjeta |
| Banco Falabella | «Extractos Banco Falabella» | tarjeta CMR |
| RappiPay | «Certificado tributario» | el mejor de todos: ahorro y créditos a 31-dic en un solo documento |
| Nu | «El extracto de tu Cuenta Nu ya está aquí» | sin clave |
| Cooperativas | «Extracto de su producto …» | normalmente solo la cuenta de ahorro |
Y lo que no llega por correo, que es lo que descuadra las cuentas:
- El certificado tributario de los bancos grandes. Por correo llega el aviso, no el documento. Hay que entrar al portal.
- El saldo de un crédito de libranza. El desprendible de nómina da la cuota, no el saldo. Para el saldo hay que entrar al portal de la entidad o pedir el estado de cuenta.
Esa segunda me costó: durante semanas trabajé con un saldo reconstruido con aritmética. La cifra real apareció al final, y no en un extracto: en la exógena, reportada por el propio acreedor. Otro argumento para bajarla de primeras.
Lo que no automaticé, a propósito
- Ningún login. Ni el del banco, ni el de la DIAN, ni el de la nómina.
- Ninguna contraseña en un archivo. Las claves de los PDF se pasan como argumento en el momento, no se guardan.
- Nada sale del computador. Los soportes tienen saldos, números de cuenta y cédula. Se quedan en una carpeta local y no se suben a ningún servicio.
Sobre lo último conviene ser exacto: Claude Code sí envía a la API de Anthropic el contenido de los archivos que lee durante la conversación. No es lo mismo que subirlos a un servicio de terceros, pero tampoco es que no salgan del equipo. Si eso no le sirve, esta herramienta no es para usted, y es legítimo.
Una advertencia más: automatizar un portal puede ir contra sus términos de servicio, y varios detectan navegadores automatizados. Todo lo que describo aquí es navegar y descargar sus propios documentos, con su propia sesión abierta por usted. No intente saltarse un captcha ni automatizar un acceso: no funciona y no vale la pena.
Paso 1 · El tablero: dos cosas que mirar apenas entra

- «Próximos vencimientos»: ahí está su fecha exacta, calculada por la DIAN. No hay que contar dígitos ni buscar el calendario.
- «Consultar información Exógena»: el siguiente paso, y el más valioso.
Paso 2 · La exógena — el paso que casi nadie da
La exógena es lo que los terceros ya le reportaron a la DIAN sobre usted: bancos, empleadores, cooperativas, fondos. Es, literalmente, la versión que la DIAN tiene de su año.

Vale la pena leer lo que dice antes de aceptar: la consulta «no reemplaza la información de su realidad económica», y si algo está mal reportado se le reclama a la entidad que reportó, no a la DIAN.

Descarga un Excel que trae los cinco topes ya calculados por la DIAN:
| Tope | Qué mide |
|---|---|
| 1 – Ingresos | Ingresos brutos del año |
| 2 – Patrimonio | Patrimonio bruto a 31-dic |
| 3 – Consumo TC | Consumos con tarjeta de crédito |
| 4 – Movimiento | Consignaciones y depósitos |
| 5 – Compras | Compras con factura electrónica |
Basta superar uno para estar obligado a declarar. Para el año gravable 2025 el tope es de 1.400 UVT = $69.718.600 (o 4.500 UVT de patrimonio).
🎯 El Tope 4 es el que sorprende, y es el que me obligó a mí. No mide lo que usted ganó, sino lo que se movió por sus cuentas. Traslados entre cuentas propias, plata que le prestaron y devolvió, dinero de terceros, pagar y volver a usar la tarjeta: todo suma. Mis ingresos quedaron por debajo del tope; mis movimientos, muy por encima.
Aquí Claude hizo algo que yo solo no habría hecho: leyó el Excel completo y encontró tres activos que yo no tenía contados —una cuenta de bajo monto olvidada, una billetera digital y unos aportes sociales en una cooperativa— más dos ingresos pequeños que no estaban en ningún soporte mío.
Paso 3 · El borrador, antes de abrir el formulario
Este es el consejo que más tiempo ahorra: no llegue al formulario a improvisar.
Claude armó una tabla casilla por casilla con el soporte de cada cifra, y verificó los tres límites que la gente olvida:
| Límite | Norma | Tope AG2025 |
|---|---|---|
| Cesantías 100 % exentas si el promedio de los últimos 6 meses no supera 350 UVT | art. 206-4 | $17.429.650 |
| Renta exenta del 25 %, tope 790 UVT | art. 206-10 | $39.341.210 |
| Exentas + deducciones ≤ 40 % del ingreso neto y ≤ 1.340 UVT | art. 336 | $66.730.660 |
Y lo más útil: la tabla del artículo 241 empieza a cobrar desde 1.090 UVT ($54.280.910) de renta líquida gravable — que no es su sueldo, sino lo que queda después de restar aportes, exenciones y deducciones. Por debajo, la tarifa es 0 %.
Mucha gente declara y paga cero. Declarar no es sinónimo de pagar.
Paso 4 · Entrar al formulario 210



💡 Baje primero la del año pasado. Sirve para no dar saltos raros de patrimonio y para ver qué criterios se usaron.


Más de 183 días en Colombia → residente fiscal → formulario 210.
Paso 5 · La «declaración sugerida»: úsela, pero revísela

La DIAN ofrece una declaración prellenada con la exógena. Acéptela: acierta en ingresos, aportes y deudas, y ahorra digitación.
🚩 Pero revise el patrimonio bruto. En mi caso trajo el patrimonio que declaré el año anterior, no el del año que estaba declarando. Si lo hubiera dejado así, habría omitido activos que sí tengo — que es justamente lo que castiga el artículo 239-1 del Estatuto Tributario.
Este fue el hallazgo más importante de todo el proceso, y es el tipo de cosa que se pasa por alto cuando uno le da «siguiente» a todo.
Paso 6 · Las 15 pantallas

El asistente tiene 15 pasos. Los renglones grises los calcula el sistema; usted solo digita los blancos.
| Paso | Qué es |
|---|---|
| 1 | Datos del declarante — género (286) y actividad económica (24) son nuevas y obligatorias |
| 2 | Deducciones sin límite — factura electrónica y 10 preguntas de beneficios especiales |
| 3 | Dependientes — hasta 4, a 72 UVT cada uno |
| 4 | Patrimonio — aquí es donde hay que corregir la sugerida |
| 5 | Rentas de trabajo |
| 6 | Honorarios sin relación laboral |
| 7 | Rentas de capital |
| 8 | Rentas no laborales |
| 9 | Cédula general — consolida todo |
| 10–13 | Pensiones, dividendos y ganancias ocasionales |
| 14 | Liquidación privada — aquí sale el impuesto |
| 15 | Pago total |
💡 Dos detalles prácticos que cuestan tiempo si no los sabe. Las cifras van redondeadas al mil más cercano. Y al corregir un campo, bórrelo primero: si escribe encima, algunos campos concatenan el número nuevo con el viejo y queda una cifra absurda. Me pasó.

Paso 7 · Antes de firmar
- ¿El patrimonio corresponde a este año y no al anterior?
- ¿Están todas las cuentas, incluidas las de bajo monto y las billeteras digitales?
- ¿Están los aportes en cooperativas y las cesantías del fondo?
- ¿Las deudas coinciden con lo que reportaron los acreedores?
- ¿Sus ingresos cuadran con el Tope 1 de la exógena?
La prueba de fuego: sume sus ingresos brutos y compárelos con el Tope 1. Si cuadran salvo unos pesos de redondeo, no se le escapó nada de lo que la DIAN conoce. En mi caso la diferencia fue de tres pesos. Ahí supe que podía firmar.
Paso 8 · Firmar



Pide el código de seguridad (llega al correo del RUT) y la contraseña de la firma electrónica. Eso lo escribí yo. Claude se detuvo ahí y esperó.
Paso 9 · Presentar — el punto de no retorno

🚩 Firmar NO es presentar. Después de firmar, el estado sigue diciendo «Borrador» y falta una pantalla más. Mucha gente cierra el navegador aquí creyendo que ya cumplió. No ha cumplido.

Ahí sí: «Documento presentado con éxito», estado Definitivo. Guarde el PDF con el sello de acuse de recibo, y verifique que el año aparezca en Declaraciones de renta presentadas. Esa es la confirmación que vale.
Lo que cuesta llegar tarde
Presentar a tiempo cuesta cero. Después, no:
| Situación | Norma | Costo |
|---|---|---|
| Presenta tarde, sin impuesto a cargo | art. 641 | 0,5 % de los ingresos brutos por mes (tope 5 %) |
| Sanción mínima | art. 639 | 10 UVT |
| La DIAN lo emplaza y usted no declara | art. 643 | 20 % de las consignaciones o de los ingresos, el mayor |
Ese último es el que duele: se calcula sobre lo que se movió, no sobre lo que ganó. Con movimientos de cien millones y un impuesto de cero pesos, la sanción puede ser de decenas de millones.
Corregir después, en cambio, suele ser barato: la sanción del artículo 644 es el 10 % del mayor valor a pagar; si no cambia lo que debe pagar, no hay sanción.
Más vale presentar a tiempo y corregir luego, que presentar tarde y perfecto.
El agente
Está en GitHub, con licencia MIT:
→ github.com/juandiegoandres/asesor-dian-claude
git clone https://github.com/juandiegoandres/asesor-dian-claude.git
cp asesor-dian-claude/asesor-dian.md ~/.claude/agents/
Necesita Claude Code. El repo trae también una plantilla de
CLAUDE.md para organizar su carpeta y la lista de lo que tiene que descargar.
El agente es genérico: no tiene datos míos ni de nadie. Y tiene siete reglas duras escritas, entre ellas no inventar cifras, no hacer el login, no firmar sin aprobación explícita y buscar los topes del año en línea en vez de citarlos de memoria — porque la UVT y el calendario cambian cada año.
Lo que aprendí
La parte lenta no es el formulario, es reunir los papeles. El 210 se llena en veinte minutos si uno llega con las cifras listas. Lo demás es tramitología bancaria.
La exógena debería ser el primer paso, siempre. Es gratis, está a dos clics, y le dice exactamente qué sabe la DIAN de usted.
Lo que la IA aportó de verdad no fue llenar campos: fue cruzar. Encontrar tres activos que yo no tenía contados, cuadrar mis ingresos contra el reporte de la DIAN con tres pesos de diferencia, y detectar que la declaración sugerida traía el patrimonio del año pasado.
Y lo que no aportó, porque no puede: los documentos, el login, la firma y la responsabilidad. Eso sigue siendo suyo.
Este texto describe un procedimiento y una experiencia personal. No constituye asesoría tributaria ni sustituye el criterio de un contador público. Las cifras en UVT corresponden al año gravable 2025 (UVT $49.799, Resolución DIAN 000193 de 2024) y cambian cada año. Las capturas son reales, con los datos personales y las cifras suprimidos. Verifique siempre contra las fuentes oficiales de la DIAN.
Comentarios (0)
- Sé el primero en comentar.