La era de la búsqueda con IA ya está aquí. Búsqueda web de ChatGPT, Perplexity, Google AI Overviews... Las oportunidades de que los usuarios obtengan información a través de IA están creciendo rápidamente, y con ello aumenta la importancia de «que la IA entienda correctamente tu sitio web».

Ahí es donde entra llms.txt. Si robots.txt es el archivo que indica a crawlers como Googlebot «esta página puedes rastrearla / esta no», llms.txt es el archivo que le dice a crawlers de IA como GPTBot o ClaudeBot: «nuestro sitio es así y trata de esto».

En este artículo explicamos a fondo la especificación del formato de llms.txt, qué información incluir, los criterios para elegir entre archivo estático y generación dinámica, y el código de implementación en los principales frameworks.

1. ¿Qué es llms.txt?

llms.txt es un archivo de texto plano (formato Markdown) que se coloca en el directorio raíz de un sitio web y cuyo objetivo es transmitir a los LLM (modelos de lenguaje de gran tamaño) un resumen del sitio, su estructura y la lista de contenidos.

Información básica

CampoContenido
Nombre del archivollms.txt
UbicaciónRaíz del dominio (https://example.com/llms.txt)
FormatoMarkdown (texto plano)
CodificaciónUTF-8
Propuesto porllmstxt.org (Jeremy Howard y otros)
Estado de estandarizaciónEstándar de facto (no es un RFC formal)
Bots que lo leenGPTBot, ClaudeBot, PerplexityBot, Google-Extended, etc.

En una frase

robots.txt = «no entres» / llms.txt = «nuestro sitio es esto»

Mientras robots.txt es un archivo de control de acceso (permitir/denegar), llms.txt es un archivo de descripción del contenido (autopresentación). No compiten entre sí; de hecho, están pensados para usarse juntos.

2. ¿Por qué es necesario? — Diferencias con robots.txt

Podrías pensar: «con el sitemap y las meta tags, la IA ya puede entender mi sitio, ¿no?». Es cierto hasta cierto punto, pero llms.txt ofrece ventajas propias.

Comparación de funciones: robots.txt / sitemap.xml / llms.txt

ArchivoPropósitoDestinatarioContenido
robots.txtPermitir/denegar rastreoTodos los crawlersReglas Allow/Disallow
sitemap.xmlLista de páginasMotores de búsquedaURLs, fechas de actualización, prioridad
llms.txtDescripción del sitioCrawlers LLMResumen, estructura, síntesis de contenidos

3 razones por las que llms.txt es necesario

Razón 1: Los LLM no pueden rastrear un sitio entero de forma eficiente

Googlebot rastrea miles de millones de páginas para construir un índice masivo, pero los crawlers de LLM no son tan exhaustivos. Con llms.txt puedes comunicar eficientemente a la IA: «este es el contenido más importante de mi sitio».

Razón 2: Aumenta la posibilidad de ser citado en respuestas de IA

Cuando ChatGPT o Perplexity generan respuestas con búsqueda web, indicar claramente la especialización y el contenido del sitio mediante llms.txt hace que sea más fácil que se reconozca como fuente de información fiable. Esto forma parte del LLMO (Large Language Model Optimization).

Para una explicación detallada de LLMO, consulta «¿Qué es LLMO?».

Razón 3: Puedes transmitir metainformación que sitemap.xml no incluye

sitemap.xml es solo una lista de URLs. Con llms.txt también puedes comunicar:

  • El tema y área de especialización del sitio
  • Resumen y categoría de cada contenido
  • Frecuencia de actualización y tamaño del sitio
  • Si tiene soporte multilingüe
  • Información de contacto

3. Especificación del formato — Qué escribir y cómo

Estructura del formato llms.txt: H1 para el nombre del sitio, bloque de cita para el resumen, H2 para secciones, lista de contenidos e información del sitio

llms.txt se escribe en formato Markdown. El formato basado en la especificación de llmstxt.org es el siguiente.

Estructura básica

# Nombre del sitio

> Descripción del sitio. En 1 a 3 frases, comunica de forma concisa el tema, el público objetivo y el valor que ofrece.

## Nombre de sección 1

- [Título de página](URL): Resumen de la página

## Nombre de sección 2

- [Título de página](URL): Resumen de la página
- [Título de página](URL): Resumen de la página

Reglas del formato

ElementoSintaxis MarkdownFunción
Encabezado H1# Nombre del sitioNombre oficial del sitio. Solo uno por archivo
Bloque de cita> Texto de resumenDescripción del sitio. Se coloca justo después del H1
Encabezado H2## Nombre de secciónAgrupación de contenidos
Lista con enlaces- [Título](URL): DescripciónInformación de cada contenido individual

Ejemplo práctico

# My Tech Blog

> My Tech Blog is a software engineering blog covering web development, cloud infrastructure, and AI tools. Updated weekly with practical tutorials and comparisons.

## Main Sections

- [Articles](https://example.com/articles): 50+ in-depth technical articles
- [Tutorials](https://example.com/tutorials): Step-by-step coding tutorials

## Popular Articles

- [React vs Vue in 2026](https://example.com/articles/react-vs-vue): A detailed comparison of React and Vue.js for modern web development, covering performance, ecosystem, and learning curve.
- [Docker for Beginners](https://example.com/articles/docker-beginners): Complete guide to Docker containers for developers who have never used containerization.

## Site Information

- URL: https://example.com
- Sitemap: https://example.com/sitemap.xml
- Languages: en, ja
- Contact: admin@example.com

Notas importantes

  • Escribir en inglés por defecto. La especificación y los ejemplos de llms.txt están en inglés, lo que lo convierte en la mejor práctica. Para sitios multilingües, se recomienda escribir en inglés e indicar los idiomas soportados con Languages: ja, en, es, .... Sin embargo, para sitios en un solo idioma (por ejemplo, un sitio completamente en francés o ruso), es perfectamente válido escribir en el idioma del sitio. Los principales LLM (GPT, Claude, Gemini, etc.) procesan la mayoría de los idiomas con alta precisión, y los usuarios de estos sitios consultarán en el mismo idioma, garantizando respuestas coherentes
  • La codificación debe ser siempre UTF-8. Con otras codificaciones se producirán caracteres ilegibles
  • Evitar caracteres especiales como el em dash (--). Como se muestra como texto plano, algunos navegadores podrían mostrarlos incorrectamente. Usa guiones (-) o doble guión (--)
  • Las URLs deben ser absolutas (URLs completas que empiecen por https://)
  • Solo un H1 por archivo. Para dividir secciones, usa H2

4. Información a incluir — Obligatoria, recomendada y opcional

Muchas personas dudan sobre qué escribir, así que lo organizamos por nivel de prioridad.

Información obligatoria (sin esto, llms.txt pierde su sentido)

InformaciónDónde se escribeEjemplo
Nombre del sitioEncabezado H1# AI Arte
Resumen del sitioBloque de cita> AI learning platform...
Secciones principalesH2 + lista de enlaces- [Articles](URL): Descripción

Información recomendada (mejora la comprensión de la IA)

InformaciónPor qué es necesaria
Lista completa de contenidosLa IA puede conocer toda la cobertura del sitio
Resumen de una línea por contenidoLa IA puede entender el contenido de cada página de antemano
Sistema de categorías/etiquetasMuestra la estructura informativa del sitio
URL del sitioIndica explícitamente la URL canónica
URL del SitemapDirige a la lista detallada de URLs
Idiomas soportadosImportante para sitios multilingües
ContactoIdentifica al operador del sitio

Información opcional (deseable pero no obligatoria)

  • Stack tecnológico: con qué está construido (framework, etc.)
  • Frecuencia de actualización: con qué periodicidad se añade contenido
  • Cantidad total de contenidos: número de artículos, etc.
  • Licencia/política de citas: si la IA puede citar o no
  • Información de API: si existe acceso programático

Información que no debe incluirse

  • Información confidencial: URL del panel de administración, endpoints de API internos, etc.
  • Datos personales: información personal innecesaria (dirección, teléfono, etc.)
  • Credenciales: claves de API, contraseñas, etc.

5. Diferencias entre llms.txt y llms-full.txt

La especificación de llmstxt.org define, además de llms.txt, un archivo llamado llms-full.txt.

ArchivoContenidoTamaño aprox.Uso
llms.txtResumen, estructura y lista de enlaces del sitio1 - 50 KB«Índice» de todo el sitio
llms-full.txtTexto completo de todos los contenidos100 KB - varios MBProporcionar el texto íntegro a la IA

Cuándo es necesario llms-full.txt

  • Documentación técnica: referencias de API, documentación de bibliotecas, etc., donde la IA mejora sus respuestas al comprender el texto completo
  • Bases de conocimiento: colecciones de FAQ o glosarios, contenido que suele citarse de forma fragmentaria

Cuándo no es necesario llms-full.txt

  • Blogs y sitios de medios: con muchos artículos, unir todo el texto en un solo archivo resulta demasiado grande. El resumen de llms.txt es suficiente
  • Tiendas online: la información de productos se proporciona mejor con datos estructurados (JSON-LD, etc.)
  • Sitios corporativos: con pocas páginas, llms.txt solo ya los cubre

Para la mayoría de blogs y sitios de medios, llms.txt solo es suficiente. Considera llms-full.txt como algo orientado a documentación técnica.

6. Archivo estático vs generación dinámica — ¿Cuál elegir?

Comparación entre archivo estático y generación dinámica: el estático es simple pero corre el riesgo de quedar desactualizado; el dinámico siempre está al día y tiene menor coste operativo

Existen dos formas principales de gestionar llms.txt.

Opción 1: Archivo estático

Consiste en colocar directamente un archivo de texto en public/llms.txt (o ruta equivalente).

Ventajas:

  • Implementación muy sencilla (solo colocar el archivo)
  • Carga del servidor igual a cero
  • Funciona sin framework

Desventajas:

  • Hay que actualizar manualmente el archivo cada vez que se añade o modifica contenido
  • Si olvidas actualizar, se transmite información desactualizada a la IA
  • El número de contenidos y categorías puede desincronizarse con la realidad del sitio

Opción 2: Generación dinámica

La aplicación recibe la solicitud a /llms.txt, obtiene la información más reciente de la base de datos y genera el texto dinámicamente.

Ventajas:

  • Siempre refleja la información más reciente
  • Al añadir un artículo, se refleja automáticamente en llms.txt
  • El número de contenidos y los nombres de categorías siempre son exactos

Desventajas:

  • Requiere más esfuerzo de implementación (definición de ruta + controlador)
  • Se produce un acceso a la base de datos en cada solicitud (se puede mitigar con caché)
  • Necesita un framework

Criterios de decisión

CondiciónRecomendación
Menos de 10 contenidos y rara vez se añadenArchivo estático es suficiente
10 o más contenidos o actualización mensual o másSe recomienda generación dinámica
Usa WordPress / Laravel / Django, etc.La generación dinámica es fácil
Sitio estático (Hugo, Jekyll, Astro, etc.)Lo ideal es generar automáticamente durante el build
Operación unipersonal, mínimo mantenimientoGeneración dinámica (una vez creada, se puede olvidar)

Conclusión: en caso de duda, generación dinámica. Aunque el coste inicial de implementación es mayor, como se puede «instalar y olvidar», a largo plazo el coste operativo es menor. El peor escenario es empezar con un archivo estático y que la IA reciba información desactualizada porque olvidaste actualizarlo.

7. Implementación — Código por framework

A continuación, mostramos cómo implementar la generación dinámica de llms.txt en los principales frameworks.

Laravel (PHP)

Definición de ruta (routes/web.php):

use App\Http\Controllers\LlmsTxtController;

Route::get('/llms.txt', [LlmsTxtController::class, 'index']);

Controlador (app/Http/Controllers/LlmsTxtController.php):

class LlmsTxtController extends Controller
{
    public function index()
    {
        $articles = Article::published()
            ->with(['translations' => fn($q) => $q->where('locale', 'en')])
            ->orderBy('published_at')
            ->get();

        $lines = [];
        $lines[] = '# My Site Name';
        $lines[] = '';
        $lines[] = '> Site description here.';
        $lines[] = '';
        $lines[] = '## All Articles (' . $articles->count() . ')';
        $lines[] = '';

        foreach ($articles as $article) {
            $t = $article->translations->first();
            if (!$t) continue;
            $url = 'https://example.com/en/articles/' . $article->slug;
            $lines[] = '- [' . $t->title . '](' . $url . '): ' . $t->meta_description;
        }

        $content = implode("\n", $lines);
        return response($content, 200)
            ->header('Content-Type', 'text/plain; charset=utf-8');
    }
}

El punto clave es indicar explícitamente Content-Type: text/plain; charset=utf-8. Si lo olvidas, podría interpretarse como HTML.

Django (Python)

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('llms.txt', views.llms_txt, name='llms_txt'),
]

# views.py
from django.http import HttpResponse
from .models import Article

def llms_txt(request):
    articles = Article.objects.filter(
        status='published'
    ).order_by('published_at')

    lines = ['# My Site', '', '> Description.', '', '## Articles', '']
    for a in articles:
        lines.append(f'- [{a.title}](https://example.com/articles/{a.slug}): {a.meta_description}')

    content = '\n'.join(lines)
    return HttpResponse(content, content_type='text/plain; charset=utf-8')

Next.js (TypeScript)

// app/llms.txt/route.ts (App Router)
import { NextResponse } from 'next/server'

export async function GET() {
  // Obtener datos de la BD o CMS
  const posts = await getAllPosts()

  const lines = [
    '# My Site',
    '',
    '> Description.',
    '',
    '## Articles',
    '',
    ...posts.map(p =>
      `- [${p.title}](https://example.com/posts/${p.slug}): ${p.description}`
    ),
  ]

  return new NextResponse(lines.join('\n'), {
    headers: { 'Content-Type': 'text/plain; charset=utf-8' },
  })
}

WordPress (PHP)

Añadir en functions.php o como plugin:

// functions.php
add_action('init', function() {
    add_rewrite_rule('^llms\.txt$', 'index.php?llms_txt=1', 'top');
});

add_filter('query_vars', function($vars) {
    $vars[] = 'llms_txt';
    return $vars;
});

add_action('template_redirect', function() {
    if (!get_query_var('llms_txt')) return;

    header('Content-Type: text/plain; charset=utf-8');
    $posts = get_posts(['numberposts' => -1, 'post_status' => 'publish']);

    echo "# " . get_bloginfo('name') . "\n\n";
    echo "> " . get_bloginfo('description') . "\n\n";
    echo "## Articles (" . count($posts) . ")\n\n";

    foreach ($posts as $post) {
        $url = get_permalink($post);
        $desc = get_the_excerpt($post);
        echo "- [{$post->post_title}]({$url}): {$desc}\n";
    }
    exit;
});

En el caso de WordPress, no olvides guardar de nuevo la configuración de enlaces permanentes (flush de reglas de reescritura).

Generadores de sitios estáticos (Hugo / Astro, etc.)

Se escribe un script que genere automáticamente durante el build.

# build-llms-txt.sh (ejemplo para Hugo)
#!/bin/bash
echo "# My Site" > public/llms.txt
echo "" >> public/llms.txt
echo "> Site description." >> public/llms.txt
echo "" >> public/llms.txt
echo "## Articles" >> public/llms.txt
echo "" >> public/llms.txt

for file in content/posts/*.md; do
  title=$(grep '^title:' "$file" | sed 's/title: //')
  slug=$(basename "$file" .md)
  desc=$(grep '^description:' "$file" | sed 's/description: //')
  echo "- [${title}](https://example.com/posts/${slug}): ${desc}" >> public/llms.txt
done

Si se ejecuta antes del build en un pipeline CI (GitHub Actions, etc.), se actualiza automáticamente con cada despliegue.

8. Verificación tras la instalación

Una vez instalado llms.txt, verifica los siguientes puntos.

Lista de comprobación básica

Punto a verificarCómo comprobarlo
¿Es accesible por URL?curl https://tusitio.com/llms.txt
¿El Content-Type es correcto?curl -I para verificar text/plain; charset=utf-8
¿Se muestran bien los caracteres?Abrir directamente en el navegador y comprobar
¿Los enlaces son correctos?Comprobar que las URLs indicadas son accesibles
¿El código HTTP es 200?curl -o /dev/null -w "%{http_code}"
¿No está bloqueado en robots.txt?Verificar que no exista Disallow: /llms.txt en robots.txt

Comprobaciones adicionales para generación dinámica

  • Comprobar llms.txt después de añadir un artículo: ¿se refleja el nuevo artículo?
  • ¿Es correcto el recuento de contenidos? ¿Coincide el número en «All Articles (27)» con los artículos publicados realmente?
  • ¿No se incluyen artículos no publicados? Confirmar que no aparecen borradores ni publicaciones programadas

Herramientas de verificación

A fecha de abril de 2026, no existe un validador oficial para llms.txt. Sin embargo, puedes verificar de estas formas:

  • Pedir a ChatGPT o Claude que lo lean: pregunta «lee https://tusitio.com/llms.txt y dime de qué trata este sitio»
  • Previsualizador de Markdown: pega el contenido de llms.txt en un previsualizador y comprueba que la estructura se renderiza correctamente
  • Herramientas de auditoría SEO: algunas herramientas de auditoría SEO están empezando a incluir la verificación de la existencia de llms.txt

9. Ejemplos reales de llms.txt en sitios web

Veamos las tendencias entre los sitios que han adoptado llms.txt.

Características de los sitios con mayor adopción

Tipo de sitioTasa de adopciónMotivo
Servicios y herramientas de IAAltaLa propia industria de IA tiene alta conciencia de LLMO
Documentación técnicaAltaNecesidad de transmitir información precisa a la IA
Blogs de tecnologíaMediaAlta sensibilidad hacia las tendencias técnicas
Sitios corporativosBajaEl conocimiento aún no está extendido
Tiendas onlineBajaSe prioriza el uso de datos estructurados (JSON-LD)

Características de un buen llms.txt

  • Descripción clara y concisa -- la especialidad del sitio se entiende de un vistazo
  • Todos los contenidos listados con resumen -- la IA puede captar la visión general
  • Sistema de categorías explícito -- se entiende la estructura de la información
  • Generación dinámica -- siempre actualizado

Características de un mal llms.txt

  • Solo nombre del sitio y contacto -- demasiado poca información para ayudar a la IA
  • Texto completo de todos los contenidos copiado -- llms.txt es un «índice», no el «texto completo». El texto íntegro es responsabilidad de llms-full.txt
  • Información desactualizada y abandonada -- dice «10 articles» pero en realidad hay 50, lo que perjudica la credibilidad
  • Contiene información confidencial -- URLs del panel de administración o claves de API expuestas

Preguntas Frecuentes

P. ¿Si no instalo llms.txt, mi sitio no aparecerá en los resultados de búsqueda de IA?

No, la IA puede rastrear tu sitio y mostrarlo en resultados incluso sin llms.txt. Este es simplemente un «archivo auxiliar que ayuda a la IA a entender mejor tu sitio». Sin embargo, al instalarlo, la IA puede comprender con mayor precisión la estructura y el contenido del sitio, por lo que se considera que aumenta la probabilidad de ser citado en búsquedas con IA. Es similar al papel de sitemap.xml en el SEO: funciona sin él, pero es mejor tenerlo.

P. Si estoy bloqueando crawlers de IA con robots.txt, ¿tiene sentido llms.txt?

Si usas Disallow en robots.txt para User-agent: GPTBot, etc., ese bot no rastreará tu sitio. Sin embargo, llms.txt es independiente de las reglas de robots.txt. Existe la posibilidad de que la IA acceda a llms.txt por otra vía (por ejemplo, cuando un usuario pega directamente la URL). Si estás bloqueando deliberadamente a los crawlers de IA, lo coherente sería no instalar llms.txt tampoco.

P. ¿En qué idioma se debe escribir llms.txt?

Para sitios multilingües, en inglés. Para sitios en un solo idioma, el idioma del sitio también es válido. La especificación y los ejemplos están predominantemente en inglés, lo que lo convierte en la opción más lógica para sitios multilingües. Sin embargo, si el contenido del sitio está completamente en un solo idioma, escribir llms.txt en ese idioma es aceptable. Los principales LLM procesan la mayoría de los idiomas con alta precisión, y los usuarios consultarán en el mismo idioma del sitio, obteniendo respuestas coherentes.

P. ¿Hay un límite de tamaño para llms.txt?

No hay un límite explícito en la especificación. Sin embargo, en la práctica se recomienda mantenerlo por debajo de 50 KB. Incluso para sitios con cientos de artículos, el título más un resumen de una línea por artículo cabe perfectamente en menos de 50 KB. Si quieres incluir el texto completo, prepara un archivo llms-full.txt aparte.

P. ¿Con qué frecuencia debería actualizarlo?

Con generación dinámica, la información más reciente se devuelve con cada solicitud, así que no hay que preocuparse. Con archivo estático, lo ideal es actualizarlo cada vez que se añade o modifica contenido. Como mínimo, revísalo y actualízalo una vez al mes. Si el riesgo de que quede desactualizado es alto, se recomienda pasar a generación dinámica.

P. ¿Afecta al SEO?

llms.txt no afecta directamente al SEO tradicional (posicionamiento en Google). Google rastrea HTML con Googlebot y no utiliza llms.txt como factor de posicionamiento. Sin embargo, puede influir en la probabilidad de ser citado en búsquedas con IA como AI Overviews (respuestas IA que aparecen en los resultados de Google), ChatGPT o Perplexity. Considéralo una medida de una capa diferente al SEO tradicional: la capa de LLMO.

P. ¿Existe algún plugin para WordPress?

A fecha de abril de 2026, han aparecido varios plugins de WordPress que generan llms.txt automáticamente. Sin embargo, la calidad y funcionalidad varían, así que si optas por un plugin, revisa siempre el contenido generado. También puedes lograrlo añadiendo unas pocas decenas de líneas de código en functions.php, así que es perfectamente viable sin plugin.