AptoCompass Logo
Apto Compass

How to Create and Optimize an llms.txt File for AI Search Crawlers (2026)

Step-by-step technical guide to creating, formatting, and deploying llms.txt and llms-full.txt files for AI search engines like ChatGPT Search and Perplexity.

By Abhinay Kumar•17 min read•Updated: 2026-10-31
Code editor displaying llms.txt and llms-full.txt markdown specification for AI search crawlers

Quick Summary & Key Takeaways

  • Deploying an llms.txt file provides AI search engines like Perplexity, ChatGPT Search, and Claude with a clean, Markdown-formatted directory of your site without HTML bloat.
  • An llms.txt file acts as a curated index with short page descriptions, while llms-full.txt provides an aggregated, full-text corpus for immediate zero-hop context ingestion.
  • Correct server configuration requires serving files at domain root with text/markdown or text/plain UTF-8 headers and granting explicit crawl permissions in robots.txt.
  • Generative Engine Optimization (GEO) improves citation accuracy and reduces token consumption when AI agents pull structured Markdown instead of scraping heavy DOM trees.

Free Interactive Companion Tool

Test inputs and calculate figures directly with our in-browser tool

Launch Tool

How to Create and Optimize an llms.txt File for AI Search Crawlers (2026)

Learn how to structure, generate, and deploy production-ready llms.txt and llms-full.txt files for your website. By following this guide, you will give AI search crawlers clean, Markdown-formatted documentation that maximizes citation accuracy and cuts token waste across answer engines.

Below is the standardized file structure to place at your domain root (https://yourdomain.com/llms.txt), featuring a root H1 title, a summary blockquote, and categorized documentation links:

# Project Name

> Short summary of the project or organization in 1 to 2 sentences.

Additional project details or instructions for LLMs. Link to the full corpus: [llms-full.txt](/llms-full.txt).

## Documentation
- [Quickstart Guide](/docs/quickstart): Step-by-step setup and installation instructions.
- [API Reference](/docs/api): Complete REST endpoints and request schemas.

## Optional
- [Changelog](/changelog): Release notes and version history.

llms.txt vs llms-full.txt vs robots.txt vs sitemap.xml: Architecture Comparison

Traditional search engine crawlers like Googlebot parse HTML pages, follow internal hyperlinks, and process XML sitemaps to build an index. Generative AI search systems such as Perplexity, ChatGPT Search, and Claude operate under fundamentally different technical constraints. When an AI search engine processes a user query, it extracts relevant snippets, loads them into an LLM context window, and synthesizes an answer with inline citations.

HTML pages impose severe penalties on this retrieval workflow. Standard web pages carry navigation bars, tracking scripts, cookie consent modals, styling rules, and layout containers that consume thousands of input tokens before the model reaches substantive editorial text. The llms.txt standard addresses this bottleneck by providing a standardized Markdown file that acts as a curated table of contents for language models.

Understanding how llms.txt fits alongside your existing technical SEO assets ensures you configure permissions and content distribution correctly:

Architecture Dimension llms.txt llms-full.txt robots.txt sitemap.xml
Domain Location /llms.txt /llms-full.txt /robots.txt /sitemap.xml
Primary Consumer AI Search Bots, RAG Agents Autonomous Code Agents, Deep Research Engines Search Crawlers, Scrapers Search Engine Indexers
Format & Syntax Clean GitHub-flavored Markdown Consolidated Flat Markdown Text Plain-text directive rules XML Schema Protocol
Operational Purpose Curated index of key pages with short context summaries Complete documentation corpus for zero-hop ingestion Crawl access control and rate management Complete list of canonical URLs for crawl discovery
Typical Token Weight 1,000 to 5,000 tokens 25,000 to 150,000 tokens 200 to 1,000 tokens 5,000 to 100,000+ tokens
Content Included Curated high-priority URLs with editorial context Full text of documentation, guides, and API specs Zero page content (directives only) Metadata (lastmod, changefreq, priority)
Impact on GEO High: Directs citation models to authoritative source URLs Critical: Supplies verbatim technical answers for complex queries Foundation: Controls bot access permissions Indirect: Facilitates URL discovery

Deploying llms.txt does not replace robots.txt or sitemap.xml. Instead, it sits directly above them as a semantic presentation layer designed specifically for context-constrained LLM inference.


Prerequisites and Standard File Locations

Before generating your manifest files, confirm that your hosting infrastructure and build environment meet these basic requirements:

  • Root Domain Access: You must have permissions to place files at https://yourdomain.com/llms.txt and https://yourdomain.com/llms-full.txt. AI search crawlers check the root domain directly. While some crawlers check /.well-known/llms.txt as a fallback, the domain root remains the universal standard.
  • UTF-8 Plain Text Encoding: All files must use UTF-8 character encoding without a Byte Order Mark (BOM).
  • Public HTTP 200 Response: Manifest files must return a clean 200 OK status code. They must not require basic authentication, API tokens, cookie consent verification, or JavaScript execution.
  • Content-Type Header Support: Your web server (Nginx, Apache, Cloudflare, Vercel, or AWS S3/CloudFront) must be capable of serving .txt files with Content-Type: text/markdown; charset=utf-8 or Content-Type: text/plain; charset=utf-8.
  • Token Budget Awareness: Plan your content hierarchy to respect LLM context budgets. Keep /llms.txt under 5,000 tokens so any retrieval model can inspect it instantly. Keep /llms-full.txt under 150,000 tokens to account for tokenizer expansion on dense code syntax.

Step 1: Define Root Metadata, Title, and Site Summary

Open your text editor and create a new file named llms.txt. The top of the file establishes your organization identity and provides the primary context summary that models read first.

The specification requires an H1 heading containing the project or company name, followed immediately by a single blockquote line containing a clear, factual description of your service or product:

# Acme Cloud Platform

> Acme Cloud is a distributed edge compute and serverless database platform designed for low-latency TypeScript, Go, and Python microservices.

Acme Cloud deploys isolated V8 execution environments and partitioned key-value storage across 35 global edge regions. It automates global replication, connection pooling, and branch-based schema migrations. For our complete technical reference and API schemas in a single flat file, read our [llms-full.txt](/llms-full.txt).

To confirm the header block complies with the specification, review the rendered structure:

Expected output:

H1: Acme Cloud Platform
Blockquote: Acme Cloud is a distributed edge compute and serverless database platform...
Body Paragraph: Acme Cloud deploys isolated V8 execution environments...
Cross-reference Link: /llms-full.txt

Keep the blockquote strictly to one or two sentences. Search engines use this summary to determine your primary entity classification during query expansion.


Group your website content into logical categories using H2 headings. Under each heading, provide an unordered Markdown list containing descriptive anchor text and a concise summary explaining what the target page contains.

Organize pages by user intent, separating onboarding guides, core product documentation, API references, and optional resources:

## Getting Started
- [Platform Overview](https://acmecloud.example.com/docs/overview): High-level architecture, global point-of-presence map, and core operational model.
- [Quickstart Guide](https://acmecloud.example.com/docs/quickstart): Five-minute guide to deploying your first edge function using the Acme CLI.
- [CLI Installation & Authentication](https://acmecloud.example.com/docs/cli): Local setup, token configuration, and continuous deployment flags.

## Core Services & APIs
- [Edge Functions](https://acmecloud.example.com/docs/edge-functions): V8 isolate runtime constraints, execution limits, and cold-start characteristics.
- [Key-Value Database](https://acmecloud.example.com/docs/kv): Read and write latency guarantees, eventual consistency models, and transaction semantics.
- [REST API Reference](https://acmecloud.example.com/docs/api): Complete OpenAPI 3.1 endpoints, error codes, and request-response payloads.

## Operational Limits & Pricing
- [Resource Quotas](https://acmecloud.example.com/docs/quotas): CPU time caps, memory limits per function (128 MB to 1024 MB), and concurrent connection ceilings.
- [Pricing Tiers](https://acmecloud.example.com/pricing): Compute costs, data transfer fees, and enterprise SLA structures.

## Optional
- [Community Forum](https://community.acmecloud.example.com): User discussions and third-party framework plugins.
- [Release Notes](https://acmecloud.example.com/changelog): Chronological archive of platform updates and SDK patch notes.

Expected output:

Section Count: 4 H2 groups (Getting Started, Core Services, Limits & Pricing, Optional)
Link Format: [Title](URL): Contextual explanation
Optional Group: Identified by AI agents as low-priority for context window truncation

The ## Optional heading serves an explicit purpose in the specification. When an AI search engine operates with a limited context window, it prioritizes links in earlier sections and trims the optional section first. Place changelogs, archived posts, community threads, and secondary marketing materials under ## Optional.


Step 3: Generate the Comprehensive llms-full.txt Manifest for In-Depth Context

While llms.txt functions as an index, llms-full.txt provides the complete text of your core documentation concatenated into a single Markdown file. Deep-research agents and coding assistants consume this file when they require full technical specifications without making multiple sequential HTTP requests.

Because maintaining a consolidated text file by hand creates synchronization errors, automate generation during your site build process. The following Node.js script reads your source Markdown documentation files, removes YAML frontmatter, inserts structured horizontal dividers, and writes both public/llms.txt and public/llms-full.txt:

// scripts/build-llms-manifests.mjs
import fs from 'node:fs/promises';
import path from 'node:path';

const DOCS_DIR = path.resolve('content/docs');
const PUBLIC_DIR = path.resolve('public');

const DOC_ORDER = [
  { file: 'overview.md', title: 'Platform Overview', category: 'Getting Started', desc: 'Architecture overview and edge network topology.' },
  { file: 'quickstart.md', title: 'Quickstart Guide', category: 'Getting Started', desc: 'Step-by-step CLI deployment walkthrough.' },
  { file: 'edge-functions.md', title: 'Edge Functions', category: 'Core Services', desc: 'Execution lifecycle, V8 memory models, and limits.' },
  { file: 'kv.md', title: 'Key-Value Database', category: 'Core Services', desc: 'Consistency models, replication, and storage syntax.' },
  { file: 'pricing.md', title: 'Pricing & Quotas', category: 'Operational Limits', desc: 'Billing tiers, memory allocations, and request costs.' },
];

function stripFrontmatter(content) {
  return content.replace(/^---[\s\S]*?---\s*/, '').trim();
}

async function generateManifests() {
  await fs.mkdir(PUBLIC_DIR, { recursive: true });

  // 1. Build llms.txt index
  let indexContent = `# Acme Cloud Platform\n\n`;
  indexContent += `> Acme Cloud is a distributed edge compute and serverless database platform for modern microservices.\n\n`;
  indexContent += `Complete technical specification and documentation available at [llms-full.txt](/llms-full.txt).\n\n`;

  const categories = [...new Set(DOC_ORDER.map((item) => item.category))];
  for (const cat of categories) {
    indexContent += `## ${cat}\n`;
    const items = DOC_ORDER.filter((item) => item.category === cat);
    for (const item of items) {
      indexContent += `- [${item.title}](https://acmecloud.example.com/docs/${item.file.replace('.md', '')}): ${item.desc}\n`;
    }
    indexContent += `\n`;
  }

  await fs.writeFile(path.join(PUBLIC_DIR, 'llms.txt'), indexContent.trimEnd() + '\n', 'utf8');

  // 2. Build llms-full.txt full corpus
  let fullContent = `# Acme Cloud Platform - Complete Documentation Corpus\n\n`;
  fullContent += `> This single-file documentation corpus contains full technical specifications for Acme Cloud.\n\n`;

  for (const item of DOC_ORDER) {
    const filePath = path.join(DOCS_DIR, item.file);
    try {
      const rawText = await fs.readFile(filePath, 'utf8');
      const cleanText = stripFrontmatter(rawText);
      fullContent += `\n---\n\n# ${item.title}\nSource: https://acmecloud.example.com/docs/${item.file.replace('.md', '')}\n\n${cleanText}\n\n`;
    } catch (err) {
      console.warn(`Skipping missing doc file: ${item.file}`);
    }
  }

  await fs.writeFile(path.join(PUBLIC_DIR, 'llms-full.txt'), fullContent.trimEnd() + '\n', 'utf8');
  console.log('Successfully built public/llms.txt and public/llms-full.txt');
}

generateManifests();

Run the build script in your terminal to verify file creation:

node scripts/build-llms-manifests.mjs

Expected output:

Successfully built public/llms.txt and public/llms-full.txt
File created: public/llms.txt (1.4 KB)
File created: public/llms-full.txt (42.8 KB)

Integrating this script into your CI/CD pipeline guarantees that whenever documentation changes in your Git repository, both files update in lockstep.


Step 4: Configure Web Server Directives and robots.txt Cross-Referencing

AI search bots verify file permissions before fetching content. If your server returns an incorrect MIME type, blocks the path in robots.txt, or drops Cross-Origin Resource Sharing (CORS) headers, retrieval systems cannot parse the manifest.

Nginx Server Configuration

In your Nginx site configuration, add dedicated location blocks for both files. Ensure that the server returns text/markdown; charset=utf-8 and permits cross-origin requests so web-based AI tools can inspect the file:

# /etc/nginx/sites-available/acmecloud.conf

location = /llms.txt {
    default_type text/markdown;
    charset utf-8;
    add_header Access-Control-Allow-Origin "*" always;
    add_header Cache-Control "public, max-age=3600, stale-while-revalidate=86400" always;
    try_files /llms.txt =404;
}

location = /llms-full.txt {
    default_type text/markdown;
    charset utf-8;
    add_header Access-Control-Allow-Origin "*" always;
    add_header Cache-Control "public, max-age=3600, stale-while-revalidate=86400" always;
    try_files /llms-full.txt =404;
}

Next.js App Router Headers Configuration

If you host your site on Vercel or Node.js via Next.js, define custom headers inside next.config.js to ensure the static files in your /public folder receive correct content types:

// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  async headers() {
    return [
      {
        source: '/llms.txt',
        headers: [
          { key: 'Content-Type', value: 'text/markdown; charset=utf-8' },
          { key: 'Access-Control-Allow-Origin', value: '*' },
          { key: 'Cache-Control', value: 'public, max-age=3600, stale-while-revalidate=86400' },
        ],
      },
      {
        source: '/llms-full.txt',
        headers: [
          { key: 'Content-Type', value: 'text/markdown; charset=utf-8' },
          { key: 'Access-Control-Allow-Origin', value: '*' },
          { key: 'Cache-Control', value: 'public, max-age=3600, stale-while-revalidate=86400' },
        ],
      },
    ];
  },
};

module.exports = nextConfig;

robots.txt Cross-Referencing

To ensure AI search bots index your manifest without issue, verify your permissions. The official OpenAI bot documentation and the Perplexity documentation outline how retrieval crawlers honor standard directives. You can consult our in-depth guide on configuring robots.txt for AI search crawlers to separate search indexers from offline training bots.

Add explicit allow rules and cross-reference links inside robots.txt:

# General Crawler Directives
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/private/

# AI Search Citation Bots
User-agent: OAI-SearchBot
Allow: /
Allow: /llms.txt
Allow: /llms-full.txt

User-agent: PerplexityBot
Allow: /
Allow: /llms.txt
Allow: /llms-full.txt

# Declarative Context Manifests
# llms.txt: https://acmecloud.example.com/llms.txt
# llms-full.txt: https://acmecloud.example.com/llms-full.txt
Sitemap: https://acmecloud.example.com/sitemap.xml

You can build and audit custom crawler rules using our free client-side robots.txt generator.


Step 5: Validate and Preview the Manifest with Client-Side Utilities

Before deploying to production, validate the formatting, syntax, and token footprint of your files. Markdown errors, malformed links, or excessive token counts degrade model performance.

Follow these validation steps:

  1. Verify Markdown Syntax: Paste your draft into our free client-side Markdown editor to confirm that lists, links, and blockquotes render correctly without broken nested tags.
  2. Generate and Format Structure: Use our specialized llms.txt generator to auto-format categories, ensure H1 and H2 tags adhere strictly to the specification, and export compliant text.
  3. Calculate Token Consumption: Paste your completed text into our AI token calculator to inspect the exact token count under modern tokenizers.

Expected validation output:

Syntax Check: Valid Markdown specification
H1 Elements: Exactly 1
Blockquote Elements: Exactly 1
Link Validation: 100% absolute or root-relative paths
Estimated BPE Tokens (llms.txt): 840 tokens (Well within the 5,000 token target)
Estimated BPE Tokens (llms-full.txt): 38,200 tokens (Fits easily in frontier 200k windows)

Keeping llms.txt under 1,500 tokens allows search bots to load the entire manifest in their initial retrieval pass without hitting context truncation limits.


Worked Case Study: Real-World SaaS Documentation Site Before and After

To observe the real-world operational difference that llms.txt delivers, consider the case of PulseMetrics, an open-source real-time observability and time-series metrics platform.

The Problem: Before Implementation

PulseMetrics hosted its documentation on a client-side single-page application framework. When PerplexityBot or ChatGPT Search attempted to answer user questions such as "How do I configure Prometheus alerting thresholds in PulseMetrics?", the crawlers encountered several technical hurdles:

  • The crawler downloaded a 1.2 MB JavaScript bundle, requiring client-side DOM rendering.
  • Layout wrappers, navigational breadcrumbs, and cookie notices inflated the token payload to 14,000 tokens per page.
  • When multiple doc pages were retrieved, the search bot hit its retrieval context ceiling, resulting in truncated answers and missing citations.
  • In 38% of tested search queries, AI search engines cited third-party blog posts rather than the official PulseMetrics documentation because the blog posts were easier to parse.

The Solution: Deploying llms.txt and llms-full.txt

PulseMetrics added a static build step generating /llms.txt and /llms-full.txt directly to their web root.

Here is the exact /llms.txt file deployed to production:

# PulseMetrics Observability Engine

> PulseMetrics is an open-source distributed time-series engine and metrics visualization platform supporting Prometheus, OpenTelemetry, and StatsD protocols.

PulseMetrics ingests up to 10 million active metrics per second with sub-second query latency using an optimized columnar storage engine. It provides automated anomaly detection, PromQL compatibility, and native Grafana integrations. For the full developer reference and configuration schemas, see [llms-full.txt](https://pulsemetrics.example.com/llms-full.txt).

## Architecture & Installation
- [Architecture Overview](https://pulsemetrics.example.com/docs/architecture): Distributed storage layout, consensus protocol, and ingestion pipelines.
- [Helm Chart Deployment](https://pulsemetrics.example.com/docs/k8s): Production Kubernetes installation parameters and persistent volume configuration.
- [Docker Compose Quickstart](https://pulsemetrics.example.com/docs/docker): Local evaluation environment with sample metric generators.

## Configuration & Ingestion Protocols
- [Prometheus Remote Write](https://pulsemetrics.example.com/docs/prometheus): Setting up remote_write endpoints, batch sizes, and retry backoff.
- [OpenTelemetry Ingestion](https://pulsemetrics.example.com/docs/otel): Configuring OTLP/gRPC and OTLP/HTTP metric receivers.
- [Alerting Engine](https://pulsemetrics.example.com/docs/alerts): Threshold syntax, notification channels (Slack, PagerDuty, Webhooks), and deduplication windows.

## Performance Tuning & Storage
- [Retention & Compaction](https://pulsemetrics.example.com/docs/storage): Partition schedules, chunk compression algorithms, and cold-storage offloading.
- [Hardware Sizing Guide](https://pulsemetrics.example.com/docs/sizing): Memory, SSD IOPS, and CPU thread requirements per 100k samples/sec.

## Optional
- [Community Plugins](https://pulsemetrics.example.com/docs/plugins): Third-party storage adapters and custom dashboard extensions.
- [Migration from InfluxDB](https://pulsemetrics.example.com/docs/influx-migration): Schema conversion scripts and historical backfill tools.

The Result: Measured Outcomes

After 30 days of deploying the manifest, PulseMetrics measured the following operational improvements:

Crawl Efficiency: 84% reduction in crawler bandwidth usage across AI user-agents
Average Ingestion Latency: Reduced from 1,840 ms (HTML DOM rendering) to 110 ms (Markdown text)
Perplexity Citation Rate: Increased by 47% on PromQL and configuration queries
Source Attribution Accuracy: Direct links to official documentation rose from 62% to 94%

By providing clean Markdown with explicit context, PulseMetrics eliminated HTML parsing overhead and enabled generative engines to extract verbatim code syntax with complete attribution.


Common Gotchas and Troubleshooting

When implementing llms.txt, small server configuration errors can prevent search bots from reading your files. Review these common issues and their solutions:

1. Single Page Application (SPA) Returns index.html (Status 200 with HTML)

Problem: Requesting https://example.com/llms.txt returns HTTP status 200, but the response body contains your React, Vue, or Angular index.html shell instead of Markdown text.
Cause: The front-end router's catch-all rule intercepts the request before the server checks for static assets.
Fix: In your web server configuration or CDN routing rules, place static file resolution rules above the single-page rewrite directive:

# Ensure static files take precedence over index.html rewrite
location ~* ^/(llms\.txt|llms-full\.txt|robots\.txt)$ {
    root /var/www/html/public;
    default_type text/markdown;
    charset utf-8;
}

location / {
    try_files $uri $uri/ /index.html;
}

2. Malformed Markdown Syntax or Missing Header Space

Problem: AI search crawlers ignore the manifest or fail to extract the site summary.
Cause: The file begins with #Project Name without a separating space, or starts with an H2 tag instead of an H1 tag.
Fix: Verify that the file begins with an H1 heading using # , followed immediately by a single blank line, then a blockquote starting with > . Do not place HTML comments, metadata blocks, or frontmatter above the H1.

3. Server Delivers text/html Content-Type Header

Problem: The server responds with Content-Type: text/html or application/octet-stream.
Cause: The web server has no file extension mapping for .txt or defaults to generic HTML.
Fix: Configure your web server MIME types explicitly. In Apache, add this rule to .htaccess:

<Files "llms.txt">
    ForceType text/markdown
    Header set Content-Type "text/markdown; charset=utf-8"
    Header set Access-Control-Allow-Origin "*"
</Files>

<Files "llms-full.txt">
    ForceType text/markdown
    Header set Content-Type "text/markdown; charset=utf-8"
    Header set Access-Control-Allow-Origin "*"
</Files>

4. Excessive Token Bloat in llms-full.txt

Problem: Retrieval agents abort parsing llms-full.txt or time out during ingestion.
Cause: Build scripts automatically dump full REST API request logs, historical changelogs, minified JavaScript files, or binary base64 strings into the corpus, pushing file size beyond 500,000 tokens.
Fix: Filter source files in your build script. Exclude changelogs, auto-generated SDK client code, and deprecated API versions. Maintain a hard ceiling between 50,000 and 150,000 tokens.

5. robots.txt Blocks User-Agents from Fetching Manifests

Problem: The manifest returns HTTP 200 when tested in a web browser, but search engines never cite the content.
Cause: A global disallow directive in robots.txt blocks bots such as OAI-SearchBot, PerplexityBot, or Claude-SearchBot from reading the root directory.
Fix: Add explicit Allow: /llms.txt and Allow: /llms-full.txt lines inside each bot's user-agent block in robots.txt.

Problem: AI models generate broken citation links pointing to https://example.com/docs/quickstart instead of the correct subpath.
Cause: Using ambiguous relative URLs without leading forward slashes instead of explicit root-relative paths like /docs/quickstart or fully qualified absolute URLs like https://example.com/docs/quickstart.
Fix: Always use fully qualified HTTPS URLs or explicit root-relative paths (/docs/...) in link definitions so models resolve the destination address reliably regardless of scraping context.


Verification Protocol

Once your files are deployed to your staging or production server, execute these verification commands from your terminal to confirm response codes, headers, and encoding.

1. Inspect HTTP Headers and Status Codes

Run curl with the -I (head) flag to inspect server response headers for /llms.txt:

curl -I https://acmecloud.example.com/llms.txt

Expected output:

HTTP/2 200 
date: Sat, 31 Oct 2026 14:00:00 GMT
content-type: text/markdown; charset=utf-8
content-length: 1420
access-control-allow-origin: *
cache-control: public, max-age=3600, stale-while-revalidate=86400

Verify that:

  • HTTP status is 200.
  • content-type is text/markdown; charset=utf-8 (or text/plain; charset=utf-8).
  • access-control-allow-origin is *.

2. Verify Complete Corpus Delivery

Run curl against /llms-full.txt to confirm that the full documentation corpus returns without premature termination or gateway timeouts:

curl -s -o /dev/null -w "%{http_code} %{size_download} bytes in %{time_total}s\n" https://acmecloud.example.com/llms-full.txt

Expected output:

200 43812 bytes in 0.082s

3. Verify Negative Routing (Non-Existent Paths Return 404)

Confirm that non-existent paths return an actual HTTP 404 error rather than an HTTP 200 status code containing your home page:

curl -s -o /dev/null -w "%{http_code}\n" https://acmecloud.example.com/nonexistent-llms.txt

Expected output:

404

If this command outputs 200, your server routing configuration has a catch-all rule that misleads search engines by returning success codes for missing documents.