<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Samuel Deering</title>
    <description>The latest articles on Forem by Samuel Deering (@samuel_deering_c7e6384a18).</description>
    <link>https://forem.com/samuel_deering_c7e6384a18</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3754134%2Fe1f8e573-b140-42f3-9194-e399c64c6db6.png</url>
      <title>Forem: Samuel Deering</title>
      <link>https://forem.com/samuel_deering_c7e6384a18</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/samuel_deering_c7e6384a18"/>
    <language>en</language>
    <item>
      <title>I Watched an AI Agent Make 30+ Failed Requests Trying to Find My API Docs</title>
      <dc:creator>Samuel Deering</dc:creator>
      <pubDate>Thu, 26 Feb 2026 05:52:31 +0000</pubDate>
      <link>https://forem.com/samuel_deering_c7e6384a18/i-watched-an-ai-agent-make-30-failed-requests-trying-to-find-my-api-docs-1icn</link>
      <guid>https://forem.com/samuel_deering_c7e6384a18/i-watched-an-ai-agent-make-30-failed-requests-trying-to-find-my-api-docs-1icn</guid>
      <description>&lt;p&gt;We run &lt;a href="https://cryptodataapi.com" rel="noopener noreferrer"&gt;CryptoDataAPI&lt;/a&gt;, a market data API for crypto trading bots and AI agents. We had great documentation — a full &lt;code&gt;/llms.txt&lt;/code&gt; file, OpenAPI spec, custom docs page. We thought we were set.&lt;/p&gt;

&lt;p&gt;Then we watched a Claude-based AI agent try to use our API for the first time.&lt;/p&gt;

&lt;p&gt;It made &lt;strong&gt;30+ HTTP requests&lt;/strong&gt; before finding a single working endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Request Log (All 404s)
&lt;/h2&gt;

&lt;p&gt;Here's what the agent actually tried, in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v1                    → 404
GET /docs                      → 404
GET /redoc                     → 404
GET /api/v1/docs               → 404
GET /api/v1/openapi.json       → 404
GET /openapi.json              → 404
GET /documentation             → 404
GET /swagger                   → 404
GET /api-docs                  → 404
GET /schema                    → 404
GET /endpoints                 → 404
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After exhausting standard paths, it started brute-force guessing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v1/derivatives        → 404
GET /api/v1/binance/ticker     → 404
GET /api/v1/funding-rates      → 404
# ...15 more 404s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It then web-searched "cryptodataapi.com API documentation" — no useful results. Eventually it found working endpoints through pure trial and error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The irony?&lt;/strong&gt; Our &lt;code&gt;/llms.txt&lt;/code&gt; file — purpose-built for AI agent consumption — had everything the agent needed. It never found it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Happened
&lt;/h2&gt;

&lt;p&gt;Our docs existed. They were just at non-standard paths:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What the agent tried&lt;/th&gt;
&lt;th&gt;Where our docs actually were&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/api/docs&lt;/code&gt; (custom path)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/openapi.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/openapi.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No endpoint (404)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/llms.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Existed, but nothing pointed to it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every attempt was a near-miss. The agent was looking in the right places — we just weren't there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI Agents Try First
&lt;/h2&gt;

&lt;p&gt;Watching the agent revealed a clear priority order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/docs&lt;/code&gt;&lt;/strong&gt; — the FastAPI/Swagger UI default. First thing every agent tries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/openapi.json&lt;/code&gt;&lt;/strong&gt; — the OpenAPI spec. Agents parse this programmatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/v1&lt;/code&gt;&lt;/strong&gt; — the API root. Developers expect an index here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The homepage&lt;/strong&gt; — looking for an "API Docs" link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web search&lt;/strong&gt; — last resort, usually fruitless for smaller APIs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're not at these paths, AI agents won't find you.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Fixes That Took 30 Minutes
&lt;/h2&gt;

&lt;p&gt;We fixed everything in a single commit. Here's what we changed:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Enable &lt;code&gt;/docs&lt;/code&gt; at the standard path
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before
&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;

&lt;span class="c1"&gt;# After
&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/docs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One line. Highest impact change. Every developer and AI agent tries &lt;code&gt;/docs&lt;/code&gt; first.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Add breadcrumbs to 404 responses
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.exception_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;not_found_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;JSONResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;detail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not Found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/llms.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoints&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/api/openapi.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;JSONResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;detail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not Found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every wrong guess is a signpost instead of a dead end.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Add an API root index
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@router.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;api_v1_index&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/llms.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openapi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/api/openapi.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoints&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;health&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/v1/health&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/v1/daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;# ...all your endpoint groups
&lt;/span&gt;        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First-time consumers now have an entry point.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Standard discovery paths
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# /.well-known/ai-plugin.json — AI agent discovery manifest
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/.well-known/ai-plugin.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ai_plugin_manifest&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;schema_version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name_for_model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description_for_model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What your API does...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openapi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/api/openapi.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llms_txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/llms.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# /openapi.json → redirect to actual location
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/openapi.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;openapi_redirect&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;RedirectResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/openapi.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Link header on every API response
&lt;/h3&gt;

&lt;p&gt;We added this to our ASGI middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;LINK_HEADER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;https://example.com/llms.txt&amp;gt;; rel=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service-desc&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every API response now includes a &lt;code&gt;Link&lt;/code&gt; header. Agents that inspect headers find documentation from any endpoint — even ones they hit by accident.&lt;/p&gt;

&lt;h2&gt;
  
  
  The &lt;code&gt;llms.txt&lt;/code&gt; Standard
&lt;/h2&gt;

&lt;p&gt;If you haven't heard of it: &lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt; is a simple convention — a plain-text file at &lt;code&gt;/llms.txt&lt;/code&gt; that describes your API for LLM consumption. Think &lt;code&gt;robots.txt&lt;/code&gt; for AI agents.&lt;/p&gt;

&lt;p&gt;Ours includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API description and auth instructions&lt;/li&gt;
&lt;li&gt;Key endpoints with URLs&lt;/li&gt;
&lt;li&gt;Response format examples&lt;/li&gt;
&lt;li&gt;Tips for AI agents ("start with &lt;code&gt;/daily&lt;/code&gt; for a complete overview")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But having a great &lt;code&gt;llms.txt&lt;/code&gt; isn't enough — you need to make it &lt;strong&gt;findable&lt;/strong&gt;. We now surface it through 5 different paths:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;404 response breadcrumbs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/.well-known/ai-plugin.json&lt;/code&gt; manifest&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Link&lt;/code&gt; response header on all API responses&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;link rel="service-desc"&amp;gt;&lt;/code&gt; in homepage HTML&lt;/li&gt;
&lt;li&gt;API root index endpoint&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Checklist
&lt;/h2&gt;

&lt;p&gt;Here's what we now use for every API we build:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/docs&lt;/code&gt; returns Swagger UI&lt;/td&gt;
&lt;td&gt;First thing every agent tries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/openapi.json&lt;/code&gt; returns or redirects to spec&lt;/td&gt;
&lt;td&gt;Agents parse this programmatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API root (&lt;code&gt;/api/v1&lt;/code&gt;) returns an index&lt;/td&gt;
&lt;td&gt;Entry point for exploration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/llms.txt&lt;/code&gt; exists with endpoint docs&lt;/td&gt;
&lt;td&gt;LLM-optimized documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/.well-known/ai-plugin.json&lt;/code&gt; exists&lt;/td&gt;
&lt;td&gt;Emerging AI agent discovery standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404 responses include docs links&lt;/td&gt;
&lt;td&gt;Turns dead ends into signposts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Link&lt;/code&gt; header on API responses&lt;/td&gt;
&lt;td&gt;Discovery from any endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;link rel="service-desc"&amp;gt;&lt;/code&gt; in homepage&lt;/td&gt;
&lt;td&gt;Machine-readable homepage discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of these are hard. The entire set took us 30 minutes and ~100 lines of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Now
&lt;/h2&gt;

&lt;p&gt;AI agents are becoming a real source of API traffic. They don't read marketing pages or Google "best APIs" — they probe standard paths and parse structured responses. If your API isn't discoverable at the paths agents check, you're invisible to an entire class of consumers.&lt;/p&gt;

&lt;p&gt;The investment is trivial. The payoff is that every AI agent that touches your API finds documentation on first contact.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;We built &lt;a href="https://cryptodataapi.com" rel="noopener noreferrer"&gt;CryptoDataAPI&lt;/a&gt; for exactly this use case — a unified crypto market data API designed for AI agent consumption. If you're building crypto trading bots or research agents, check out our &lt;a href="https://cryptodataapi.com/llms.txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt; to see what AI-optimized API docs look like.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>fastapi</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>Building Trust in AI Agents: Why Identity Verification is the Missing Layer</title>
      <dc:creator>Samuel Deering</dc:creator>
      <pubDate>Thu, 05 Feb 2026 05:02:07 +0000</pubDate>
      <link>https://forem.com/samuel_deering_c7e6384a18/building-trust-in-ai-agents-why-identity-verification-is-the-missing-layer-5477</link>
      <guid>https://forem.com/samuel_deering_c7e6384a18/building-trust-in-ai-agents-why-identity-verification-is-the-missing-layer-5477</guid>
      <description>&lt;p&gt;If you're building AI agents, you've probably thought about capabilities, context windows, tool use, and memory. But have you thought about &lt;strong&gt;identity&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9a2fioneln7e42mvm2jn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9a2fioneln7e42mvm2jn.png" alt=" " width="800" height="493"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example ID: My personal assistant Jarvis Claw.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Right now, anyone can create an agent with any name. There's no verification. No identity layer. No way for users to confirm an agent is legitimate before trusting it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Anyone can do this
agent_name = "Official_Bank_Support_Bot"
# No verification required
# Users have no way to know this is fake

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is fine for demos and prototypes. It's a disaster for production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Attack Vectors
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Impersonation&lt;/strong&gt; - Create an agent mimicking a legitimate service&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name Squatting&lt;/strong&gt; - Claim names of popular agents before creators do&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social Engineering&lt;/strong&gt; - "I'm the official bot for [Company]"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential Harvesting&lt;/strong&gt; - Fake agents collecting user data&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What We Learned from Web Security
&lt;/h2&gt;

&lt;p&gt;The web faced this exact problem in the 1990s. Anyone could create a website claiming to be your bank. The solution? &lt;strong&gt;SSL/TLS certificates.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Certificate Authorities (CAs) verify website ownership. Browsers show the padlock. Users learn to trust the verification layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents need the same thing.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing TrustPass
&lt;/h2&gt;

&lt;p&gt;We're building the CA for AI agents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Instead of blind trust:
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support_bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Verify first:
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;trustpass&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;verify&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trustpass_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;warn_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unverified agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Registration&lt;/strong&gt; - Agent owner claims their agent on TrustPass&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification&lt;/strong&gt; - Cryptographic proof of ownership&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public Profile&lt;/strong&gt; - Anyone can look up an agent's verified identity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime Checks&lt;/strong&gt; - API to verify agents before trusting them&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why Now?
&lt;/h2&gt;

&lt;p&gt;The agent ecosystem is exploding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1.6M+ agents on MoltBook alone&lt;/li&gt;
&lt;li&gt;Frameworks like LangChain, CrewAI, AutoGPT mainstreaming agents&lt;/li&gt;
&lt;li&gt;Agents handling real tasks: payments, data, business logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Identity can't be an afterthought. It needs to be infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check an agent's verification status&lt;/span&gt;
curl &amp;lt;https://trustpass.ai/api/verify/&lt;span class="o"&gt;{&lt;/span&gt;agent_id&lt;span class="o"&gt;}&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# Response&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"verified"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
  &lt;span class="s2"&gt;"owner"&lt;/span&gt;: &lt;span class="s2"&gt;"verified_entity"&lt;/span&gt;,
  &lt;span class="s2"&gt;"created"&lt;/span&gt;: &lt;span class="s2"&gt;"2026-01-15"&lt;/span&gt;,
  &lt;span class="s2"&gt;"trust_score"&lt;/span&gt;: 94
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Free verification at &lt;a href="https://trustpass.ai/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;trustpass.ai&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SDK for popular frameworks (LangChain, CrewAI)&lt;/li&gt;
&lt;li&gt;Runtime verification middleware&lt;/li&gt;
&lt;li&gt;Reputation system based on agent behavior&lt;/li&gt;
&lt;li&gt;Integration with agent marketplaces&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Discussion
&lt;/h2&gt;

&lt;p&gt;How are you handling trust in your agent systems? What verification would be useful for your use case?&lt;/p&gt;

&lt;p&gt;Drop a comment - we're actively building based on community feedback.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building the identity layer for the agent internet at &lt;a href="https://trustpass.ai/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;TrustPass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>cybersecurity</category>
      <category>security</category>
    </item>
  </channel>
</rss>
