<?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>DEV Community: Gustavo Garcia</title>
    <description>The latest articles on DEV Community by Gustavo Garcia (@gustavo_garcia_dev).</description>
    <link>https://dev.to/gustavo_garcia_dev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4059722%2F479f6fa2-6bda-4d8a-91a8-b83d6517a452.jpg</url>
      <title>DEV Community: Gustavo Garcia</title>
      <link>https://dev.to/gustavo_garcia_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gustavo_garcia_dev"/>
    <language>en</language>
    <item>
      <title>How to make your Next.js site appear in ChatGPT (and any LLM)</title>
      <dc:creator>Gustavo Garcia</dc:creator>
      <pubDate>Mon, 03 Aug 2026 02:11:43 +0000</pubDate>
      <link>https://dev.to/gustavo_garcia_dev/how-to-make-your-nextjs-site-appear-in-chatgpt-and-any-llm-3mph</link>
      <guid>https://dev.to/gustavo_garcia_dev/how-to-make-your-nextjs-site-appear-in-chatgpt-and-any-llm-3mph</guid>
      <description>&lt;p&gt;You blocked &lt;code&gt;GPTBot&lt;/code&gt; in &lt;code&gt;robots.txt&lt;/code&gt; to keep your content out of training runs — and then wondered why ChatGPT Search never cites your docs. Those are &lt;strong&gt;different systems&lt;/strong&gt;. OpenAI’s own crawler docs say each bot is independent: allowing &lt;code&gt;OAI-SearchBot&lt;/code&gt; keeps you eligible for ChatGPT search answers while disallowing &lt;code&gt;GPTBot&lt;/code&gt; opts you out of foundation-model training.&lt;/p&gt;

&lt;p&gt;This article is a Next.js App Router playbook for &lt;strong&gt;Generative Engine Optimization (GEO)&lt;/strong&gt;: how answer engines discover pages, which user-agents actually matter, how to configure &lt;code&gt;robots.ts&lt;/code&gt; and sitemaps, how to keep HTML crawlable, and what &lt;code&gt;llms.txt&lt;/code&gt; does — and does not — guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  How LLMs find your site
&lt;/h2&gt;

&lt;p&gt;Treat “appearing in an LLM” as three separate pipelines:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pipeline&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Typical bots / tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Training crawl&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Collects public pages that &lt;em&gt;may&lt;/em&gt; enter future model training&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;ClaudeBot&lt;/code&gt;, &lt;code&gt;Google-Extended&lt;/code&gt; (token), Common Crawl’s &lt;code&gt;CCBot&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search / answer index&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Builds or refreshes retrieval so answers can &lt;strong&gt;cite&lt;/strong&gt; your URLs&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;OAI-SearchBot&lt;/code&gt;, &lt;code&gt;Claude-SearchBot&lt;/code&gt;, &lt;code&gt;PerplexityBot&lt;/code&gt;, classic &lt;code&gt;Googlebot&lt;/code&gt; / &lt;code&gt;Bingbot&lt;/code&gt; (and partners)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User-triggered fetch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Downloads a specific URL because a human asked for it (or pasted a link)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ChatGPT-User&lt;/code&gt;, &lt;code&gt;Claude-User&lt;/code&gt;, &lt;code&gt;Perplexity-User&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Blocking the training bot does &lt;strong&gt;not&lt;/strong&gt; automatically block the search bot. OpenAI states this explicitly for &lt;code&gt;GPTBot&lt;/code&gt; vs &lt;code&gt;OAI-SearchBot&lt;/code&gt;. Anthropic documents the same split for &lt;code&gt;ClaudeBot&lt;/code&gt;, &lt;code&gt;Claude-SearchBot&lt;/code&gt;, and &lt;code&gt;Claude-User&lt;/code&gt;. Perplexity documents &lt;code&gt;PerplexityBot&lt;/code&gt; for search indexing and &lt;code&gt;Perplexity-User&lt;/code&gt; for live fetches.&lt;/p&gt;

&lt;p&gt;ChatGPT Search can also partner with third-party search providers. OpenAI’s help center documents that rewritten queries may be sent to partners such as &lt;strong&gt;Bing&lt;/strong&gt; (and others listed in that article). Independently, OpenAI recommends allowing &lt;strong&gt;&lt;code&gt;OAI-SearchBot&lt;/code&gt;&lt;/strong&gt; if you want to appear in ChatGPT search answers. Practical implication: keep search bots allowed &lt;strong&gt;and&lt;/strong&gt; stay healthy in major web indexes — do not optimize for a single rumor about which partner is “really” used this month.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAI: the bots that decide ChatGPT visibility
&lt;/h2&gt;

&lt;p&gt;From &lt;a href="https://developers.openai.com/api/docs/bots" rel="noopener noreferrer"&gt;OpenAI’s crawler overview&lt;/a&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  OAI-SearchBot — citations in ChatGPT Search
&lt;/h3&gt;

&lt;p&gt;Used to surface websites in ChatGPT’s search features. Sites opted out of &lt;code&gt;OAI-SearchBot&lt;/code&gt; &lt;strong&gt;will not be shown in ChatGPT search answers&lt;/strong&gt;, though they can still appear as plain navigational links. OpenAI recommends allowing it in &lt;code&gt;robots.txt&lt;/code&gt; and permitting its &lt;a href="https://openai.com/searchbot.json" rel="noopener noreferrer"&gt;published IP ranges&lt;/a&gt;. Changes can take about &lt;strong&gt;24 hours&lt;/strong&gt; to propagate.&lt;/p&gt;

&lt;h3&gt;
  
  
  GPTBot — training, not Search opt-out
&lt;/h3&gt;

&lt;p&gt;Crawls content that may be used to train generative foundation models. Disallowing &lt;code&gt;GPTBot&lt;/code&gt; signals that content should not be used for that training. It does &lt;strong&gt;not&lt;/strong&gt; control ChatGPT Search eligibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  ChatGPT-User — live, user-initiated fetches
&lt;/h3&gt;

&lt;p&gt;Used when ChatGPT or Custom GPTs fetch a page because of a user action. OpenAI notes it is &lt;strong&gt;not&lt;/strong&gt; used for automatic web crawling, &lt;strong&gt;not&lt;/strong&gt; used to decide Search inclusion, and that &lt;strong&gt;robots.txt rules may not apply&lt;/strong&gt; because the fetch is user-initiated. Manage Search with &lt;code&gt;OAI-SearchBot&lt;/code&gt;; treat &lt;code&gt;ChatGPT-User&lt;/code&gt; as a separate live-fetch channel.&lt;/p&gt;

&lt;h3&gt;
  
  
  OAI-AdsBot
&lt;/h3&gt;

&lt;p&gt;Only visits pages submitted as ads on ChatGPT; not used to train foundation models. Relevant if you run ChatGPT ads — ignore it for organic GEO.&lt;/p&gt;

&lt;p&gt;A common, defensible policy for content sites that want citations but not training:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: OAI-SearchBot
Allow: /

User-agent: GPTBot
Disallow: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Other answer engines (same idea, different names)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Anthropic (Claude)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler" rel="noopener noreferrer"&gt;Anthropic’s help center&lt;/a&gt; (updated April 2026) defines three bots:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ClaudeBot&lt;/code&gt;&lt;/strong&gt; — possible contribution to model training&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Claude-SearchBot&lt;/code&gt;&lt;/strong&gt; — indexes content for search quality; disabling it may reduce visibility in search results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Claude-User&lt;/code&gt;&lt;/strong&gt; — user-directed fetches; disabling it may reduce visibility for user-directed web search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anthropic honors &lt;code&gt;robots.txt&lt;/code&gt; (including non-standard &lt;code&gt;Crawl-delay&lt;/code&gt;) and warns that &lt;strong&gt;IP-blocking alone is unreliable&lt;/strong&gt; because it can prevent the bot from reading your &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perplexity
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.perplexity.ai/docs/resources/perplexity-crawlers" rel="noopener noreferrer"&gt;Perplexity’s crawler docs&lt;/a&gt; recommend allowing &lt;strong&gt;&lt;code&gt;PerplexityBot&lt;/code&gt;&lt;/strong&gt; so your site can appear in Perplexity search results. &lt;strong&gt;&lt;code&gt;Perplexity-User&lt;/code&gt;&lt;/strong&gt; handles user-initiated fetches and &lt;strong&gt;generally ignores robots.txt&lt;/strong&gt; because a person requested the page. If you use a WAF, whitelist by &lt;strong&gt;user-agent + published IP JSON&lt;/strong&gt; (&lt;code&gt;perplexitybot.json&lt;/code&gt; / &lt;code&gt;perplexity-user.json&lt;/code&gt;) — robots.txt alone is not enough when the edge drops the request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Gemini vs Google Search
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers" rel="noopener noreferrer"&gt;&lt;code&gt;Google-Extended&lt;/code&gt;&lt;/a&gt; is a &lt;strong&gt;robots.txt control token&lt;/strong&gt;, not a separate HTTP user-agent. It governs whether crawled content may be used for &lt;strong&gt;training future Gemini models&lt;/strong&gt; and for &lt;strong&gt;grounding&lt;/strong&gt; in Gemini Apps / Vertex AI Grounding with Google Search. Google states it &lt;strong&gt;does not&lt;/strong&gt; affect inclusion or ranking in Google Search.&lt;/p&gt;

&lt;p&gt;Important trade-off: for OpenAI you can allow search and disallow training separately. For Google, &lt;code&gt;Google-Extended&lt;/code&gt; covers &lt;strong&gt;both&lt;/strong&gt; Gemini training and Gemini grounding. Allow it if you want Gemini apps to ground on your content; disallow it if you want to opt out of those Gemini uses (Search itself stays separate via &lt;code&gt;Googlebot&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Next.js: configure &lt;code&gt;app/robots.ts&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;App Router can generate &lt;code&gt;/robots.txt&lt;/code&gt; from a typed file. Official docs: &lt;a href="https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots" rel="noopener noreferrer"&gt;robots.txt file convention&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Example that keeps &lt;strong&gt;search/citation&lt;/strong&gt; bots allowed, optionally opts out of &lt;strong&gt;training&lt;/strong&gt;, fences private routes, and advertises the sitemap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/robots.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MetadataRoute&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SITE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;robots&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;MetadataRoute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Robots&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="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;disallow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/admin/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/drafts/&lt;/span&gt;&lt;span class="dl"&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;// ChatGPT Search + live fetch&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OAI-SearchBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ChatGPT-User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="c1"&gt;// Training opt-out (optional — remove this rule to allow training)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GPTBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;disallow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="c1"&gt;// Claude&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Claude-SearchBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Claude-User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ClaudeBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;disallow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="c1"&gt;// Perplexity&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PerplexityBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Perplexity-User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="c1"&gt;// Gemini grounding/training token (allow if you want Gemini apps to use you)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Google-Extended&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;sitemap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;SITE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/sitemap.xml`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SITE&lt;/span&gt;&lt;span class="p"&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;After deploy, open &lt;code&gt;https://your-domain/robots.txt&lt;/code&gt; and confirm the groups look right. Spoofed user-agents exist — for verification, OpenAI and Perplexity publish IP range JSON files; Anthropic currently points publishers at robots.txt rather than relying on IP blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sitemap, Bing, Google, and freshness
&lt;/h2&gt;

&lt;p&gt;Crawlers need URLs to discover. Next.js can generate &lt;code&gt;/sitemap.xml&lt;/code&gt; from &lt;code&gt;app/sitemap.ts&lt;/code&gt; (&lt;a href="https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap" rel="noopener noreferrer"&gt;docs&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/sitemap.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MetadataRoute&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sitemap&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MetadataRoute&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Sitemap&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPublishedPosts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// your data layer&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;lastModified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://example.com/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;lastModified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;updatedAt&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publishedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;changeFrequency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;monthly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&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;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Google Search Console&lt;/strong&gt; — verify the property, submit the sitemap, fix crawl errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bing Webmaster Tools&lt;/strong&gt; — verify (you can often import from GSC), submit the same sitemap. Microsoft’s February 2026 &lt;strong&gt;AI Performance&lt;/strong&gt; preview in Bing Webmaster Tools reports citations across &lt;strong&gt;Copilot&lt;/strong&gt;, Bing AI summaries, and select partner integrations — useful GEO telemetry for Microsoft surfaces; do not treat it as a complete ChatGPT citation dashboard unless Microsoft says so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.indexnow.org/" rel="noopener noreferrer"&gt;IndexNow&lt;/a&gt;&lt;/strong&gt; — ping participating engines (Bing, Yandex, and others listed on the site) when URLs are added, updated, or deleted so fresh content is prioritized sooner than passive crawl alone.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If ChatGPT Search partners with Bing for some queries, a healthy Bing index is still cheap insurance. A healthy Google index still matters for Google Search, AI Overviews / AI Mode, and anything that grounds on Google’s index.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the HTML worth crawling (Next.js-specific)
&lt;/h2&gt;

&lt;p&gt;Answer engines and classic crawlers are more reliable when the &lt;strong&gt;important prose is in the first HTML response&lt;/strong&gt;. App Router Server Components and SSR help; shipping an empty shell that only fills after client JavaScript is a classic way to look invisible.&lt;/p&gt;

&lt;p&gt;Practical checklist for Next.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prefer &lt;strong&gt;Server Components&lt;/strong&gt; (or SSR) for article bodies, docs, and product copy.&lt;/li&gt;
&lt;li&gt;Put real &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, meta description, and Open Graph tags via the Metadata API — they travel with the document.&lt;/li&gt;
&lt;li&gt;Avoid gating the main answer behind client-only fetches, infinite scroll without crawlable URLs, or auth walls for content you want cited.&lt;/li&gt;
&lt;li&gt;Keep canonical URLs stable; use &lt;code&gt;alternates.languages&lt;/code&gt; in the sitemap when you ship locales.&lt;/li&gt;
&lt;li&gt;Return fast, stable &lt;code&gt;200&lt;/code&gt; responses for public pages — timeouts and soft 404s waste crawl budget.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Structured data (JSON-LD for &lt;code&gt;Article&lt;/code&gt;, &lt;code&gt;FAQPage&lt;/code&gt;, &lt;code&gt;Organization&lt;/code&gt;, etc.) does not replace good prose, but clear headings, short definitional paragraphs, tables, and FAQ sections match how Bing’s own GEO guidance describes content that is easier to cite accurately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content shape that answer engines can quote
&lt;/h2&gt;

&lt;p&gt;Technical access is necessary but not sufficient. Pages that get cited tend to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answer the query early in plain language (then go deep)&lt;/li&gt;
&lt;li&gt;Use descriptive &lt;code&gt;##&lt;/code&gt; / &lt;code&gt;###&lt;/code&gt; headings that match how people ask questions&lt;/li&gt;
&lt;li&gt;Separate facts from opinion; link primary sources&lt;/li&gt;
&lt;li&gt;Stay updated — stale version numbers get skipped or contradicted&lt;/li&gt;
&lt;li&gt;Avoid thin listicles that every other site already paraphrased&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not need a new CMS. You need pages that are &lt;strong&gt;the best extractable answer&lt;/strong&gt; for a specific intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;llms.txt&lt;/code&gt;: useful map, not a ranking switch
&lt;/h2&gt;

&lt;p&gt;Jeremy Howard’s &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llms.txt proposal&lt;/a&gt; suggests a Markdown file at &lt;code&gt;/llms.txt&lt;/code&gt;: site name as &lt;code&gt;#&lt;/code&gt; heading, a short &lt;code&gt;&amp;gt;&lt;/code&gt; summary, then &lt;code&gt;##&lt;/code&gt; sections with curated absolute links. Optional companion files (for example full concatenated context) exist in the ecosystem. Docs platforms (and many agent workflows) already use this pattern.&lt;/p&gt;

&lt;p&gt;What it is &lt;strong&gt;not&lt;/strong&gt;: a formal standard enforced by OpenAI, Google, or Anthropic for citation ranking. It does not replace &lt;code&gt;robots.txt&lt;/code&gt;. It cannot block crawlers. Treat it as a &lt;strong&gt;curated table of contents&lt;/strong&gt; for agents and humans who fetch &lt;code&gt;/llms.txt&lt;/code&gt; on demand — especially documentation sites — not as a guaranteed ChatGPT ranking lever.&lt;/p&gt;

&lt;p&gt;In Next.js you can start with &lt;code&gt;public/llms.txt&lt;/code&gt;, or generate it from a Route Handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/llms.txt/route.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`# Acme Docs
&amp;gt; Official documentation for the Acme API and SDKs.

## Docs
- [Quick start](https://example.com/docs/quickstart.md): Install and make your first request
- [Auth](https://example.com/docs/auth.md): API keys and OAuth

## Optional
- [Changelog](https://example.com/changelog): Release history
`&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public, max-age=3600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&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;If you also serve Markdown mirrors of key pages (the proposal’s &lt;code&gt;.md&lt;/code&gt; suffix idea), agents get cleaner context than parsing your marketing HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Disallowing &lt;code&gt;GPTBot&lt;/code&gt; and assuming you left ChatGPT Search&lt;/strong&gt; — you need &lt;code&gt;OAI-SearchBot&lt;/code&gt; allowed for Search answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correct &lt;code&gt;robots.txt&lt;/code&gt;, hostile WAF&lt;/strong&gt; — Cloudflare / AWS WAF “block AI bots” rules can drop search crawlers before they read your allow rules. Whitelist by user-agent &lt;strong&gt;and&lt;/strong&gt; published IPs where vendors provide them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-only content&lt;/strong&gt; — if &lt;code&gt;curl&lt;/code&gt; does not show the answer text, many crawlers will not either.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No sitemap / never submitted to Bing or Google&lt;/strong&gt; — discovery stalls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating &lt;code&gt;llms.txt&lt;/code&gt; as access control&lt;/strong&gt; — it guides; it does not enforce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocking &lt;code&gt;Google-Extended&lt;/code&gt; while expecting Gemini grounding&lt;/strong&gt; — that token covers training &lt;em&gt;and&lt;/em&gt; Gemini grounding, not Search ranking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expecting overnight miracles&lt;/strong&gt; — OpenAI notes ~24h for Search robots adjustments; indexes and reputation still take time and quality.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When this matters (and when it does not)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Invest in GEO when&lt;/strong&gt; you publish public expertise (docs, tutorials, comparisons, research) and want referral traffic or brand citation from ChatGPT, Claude, Perplexity, Copilot, or Gemini.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;De-prioritize (or fully opt out) when&lt;/strong&gt; the product is private, paywalled, legally sensitive, or you deliberately do not want model/training or answer-engine reuse — then disallow the relevant bots and accept lower AI visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does blocking GPTBot hide me from ChatGPT?
&lt;/h3&gt;

&lt;p&gt;No. Per OpenAI, Search visibility is governed by &lt;strong&gt;&lt;code&gt;OAI-SearchBot&lt;/code&gt;&lt;/strong&gt;. &lt;code&gt;GPTBot&lt;/code&gt; is the training-oriented crawler. You can disallow &lt;code&gt;GPTBot&lt;/code&gt; and still allow &lt;code&gt;OAI-SearchBot&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Bing enough to appear in ChatGPT?
&lt;/h3&gt;

&lt;p&gt;OpenAI documents third-party search partners (including Bing) &lt;strong&gt;and&lt;/strong&gt; its own &lt;code&gt;OAI-SearchBot&lt;/code&gt;. Do both: allow &lt;code&gt;OAI-SearchBot&lt;/code&gt; and keep a healthy presence in major indexes. Do not rely on a single secondary blog’s claim about exclusive Bing or Google dependency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will &lt;code&gt;llms.txt&lt;/code&gt; make ChatGPT cite me?
&lt;/h3&gt;

&lt;p&gt;There is no public commitment from major AI labs that &lt;code&gt;llms.txt&lt;/code&gt; controls ChatGPT citation ranking. It is still worth shipping for docs and agent UX. Citations still depend on crawl access, indexability, and content quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I allow every AI bot?
&lt;/h3&gt;

&lt;p&gt;Not automatically. Decide per pipeline: search/citation vs training vs user fetch. Many content sites allow search bots, allow or disallow training consciously, and keep sensitive paths disallowed for everyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does App Router hurt SEO or AI visibility?
&lt;/h3&gt;

&lt;p&gt;No — Server Components and the Metadata / sitemap / robots file conventions are well suited to crawlable HTML. Problems come from client-only rendering patterns, not from App Router itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;To show up in ChatGPT Search and other LLM answers: &lt;strong&gt;allow the search crawlers&lt;/strong&gt;, &lt;strong&gt;do not let your WAF undo robots.txt&lt;/strong&gt;, &lt;strong&gt;ship crawlable HTML from Next.js&lt;/strong&gt;, &lt;strong&gt;submit sitemaps&lt;/strong&gt; (and IndexNow where it helps), and &lt;strong&gt;write pages that answer specific questions clearly&lt;/strong&gt;. Optionally add &lt;code&gt;llms.txt&lt;/code&gt; as a curated map. Optionally disallow training bots if that is your policy — without confusing them for search bots.&lt;/p&gt;

&lt;p&gt;Ship the &lt;code&gt;OAI-SearchBot&lt;/code&gt; allow rule this week if it is missing. Everything else compounds on top of being fetchable.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://developers.openai.com/api/docs/bots" rel="noopener noreferrer"&gt;Overview of OpenAI Crawlers&lt;/a&gt; — OpenAI Developers (accessed Aug 2026)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://help.openai.com/en/articles/9237897-chatgpt-search" rel="noopener noreferrer"&gt;ChatGPT Search&lt;/a&gt; — OpenAI Help Center&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler" rel="noopener noreferrer"&gt;Does Anthropic crawl data from the web…&lt;/a&gt; — Anthropic / Claude Help Center (Apr 2026)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.perplexity.ai/docs/resources/perplexity-crawlers" rel="noopener noreferrer"&gt;Perplexity Crawlers&lt;/a&gt; — Perplexity Docs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers" rel="noopener noreferrer"&gt;Google’s common crawlers (incl. Google-Extended)&lt;/a&gt; — Google for Developers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;The /llms.txt file&lt;/a&gt; — Jeremy Howard / Answer.AI proposal&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots" rel="noopener noreferrer"&gt;Next.js robots.txt&lt;/a&gt; — Next.js Docs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap" rel="noopener noreferrer"&gt;Next.js sitemap&lt;/a&gt; — Next.js Docs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blogs.bing.com/webmaster/February-2026/Introducing-AI-Performance-in-Bing-Webmaster-Tools-Public-Preview" rel="noopener noreferrer"&gt;Introducing AI Performance in Bing Webmaster Tools&lt;/a&gt; — Bing Webmaster Blog (Feb 2026)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.indexnow.org/" rel="noopener noreferrer"&gt;IndexNow&lt;/a&gt; — IndexNow protocol&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://openai.com/searchbot.json" rel="noopener noreferrer"&gt;OAI-SearchBot IP ranges&lt;/a&gt; — OpenAI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://openai.com/gptbot.json" rel="noopener noreferrer"&gt;GPTBot IP ranges&lt;/a&gt; — OpenAI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gustavogarcia.tech/en/articles/nextjs-visibility-in-chatgpt-and-llms?utm_source=dev_to&amp;amp;utm_medium=social" rel="noopener noreferrer"&gt;How to make your Next.js site appear in ChatGPT&lt;/a&gt; - Personal Portfolio Article&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>chatgpt</category>
      <category>llm</category>
      <category>nextjs</category>
      <category>seo</category>
    </item>
    <item>
      <title>6 problems your API gateway is already suffering from</title>
      <dc:creator>Gustavo Garcia</dc:creator>
      <pubDate>Mon, 03 Aug 2026 02:04:21 +0000</pubDate>
      <link>https://dev.to/gustavo_garcia_dev/6-problems-your-api-gateway-is-already-suffering-from-k4l</link>
      <guid>https://dev.to/gustavo_garcia_dev/6-problems-your-api-gateway-is-already-suffering-from-k4l</guid>
      <description>&lt;p&gt;An API gateway looks like a thin proxy until the night it becomes the outage.&lt;/p&gt;

&lt;p&gt;Centralization is the point: one place for TLS termination, authentication, rate limiting, routing, and policy enforcement.&lt;/p&gt;

&lt;p&gt;Centralization is also the risk.&lt;/p&gt;

&lt;p&gt;Every request shares the same event-loop budget, connection pools, memory, and blast radius.&lt;/p&gt;

&lt;p&gt;Microsoft's Gateway Offloading guidance says it plainly: keep the gateway highly available, ensure it never becomes the bottleneck, and &lt;strong&gt;don't put business logic inside it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Canva's public incident report from November 2024 demonstrated what happens when that shared front door saturates: approximately &lt;strong&gt;1.5 million requests per second&lt;/strong&gt;—around &lt;strong&gt;3× normal peak traffic&lt;/strong&gt;—combined with a telemetry lock that blocked Netty's event loop until Linux began OOM-killing gateway instances.&lt;/p&gt;

&lt;p&gt;This article walks through &lt;strong&gt;six production problems&lt;/strong&gt; API gateways commonly suffer from—and how to prevent them before the next traffic spike.&lt;/p&gt;




&lt;h2&gt;
  
  
  What an API Gateway Is (and Isn't)
&lt;/h2&gt;

&lt;p&gt;An API gateway is the &lt;strong&gt;edge facade&lt;/strong&gt; sitting in front of backend services.&lt;/p&gt;

&lt;p&gt;Typical responsibilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TLS termination&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;li&gt;Metrics and tracing&lt;/li&gt;
&lt;li&gt;Header or path transformation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is &lt;strong&gt;not&lt;/strong&gt; responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business authorization&lt;/li&gt;
&lt;li&gt;UI composition&lt;/li&gt;
&lt;li&gt;Unlimited retries&lt;/li&gt;
&lt;li&gt;Product-specific business rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treating the gateway as "just a proxy" hides its failure modes.&lt;/p&gt;

&lt;p&gt;Treating it like an application server creates new ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Shared Blast Radius
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Everything appears offline even though backend services remain healthy.&lt;/p&gt;

&lt;p&gt;Autoscaling launches new gateway instances that immediately fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it happens
&lt;/h3&gt;

&lt;p&gt;One gateway cluster fronts every public request.&lt;/p&gt;

&lt;p&gt;A traffic spike, blocking plugin, or memory leak impacts the entire platform simultaneously.&lt;/p&gt;

&lt;p&gt;Microsoft explicitly warns against allowing the gateway to become a single bottleneck.&lt;/p&gt;

&lt;p&gt;Canva provides a textbook example.&lt;/p&gt;

&lt;p&gt;A delayed CDN asset caused over &lt;strong&gt;270,000 clients&lt;/strong&gt; to reconnect simultaneously.&lt;/p&gt;

&lt;p&gt;Once the asset became available, every client resumed requests at nearly the same moment.&lt;/p&gt;

&lt;p&gt;The gateway fleet saturated.&lt;/p&gt;

&lt;p&gt;Off-heap memory exploded.&lt;/p&gt;

&lt;p&gt;Linux OOM-killed containers faster than autoscaling could replace them.&lt;/p&gt;

&lt;p&gt;Recovery only became possible after traffic was blocked at the CDN.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keep baseline capacity well above average load&lt;/li&gt;
&lt;li&gt;Load test the gateway as a Tier-0 service&lt;/li&gt;
&lt;li&gt;Add load shedding (HTTP 503) before queues consume the fleet&lt;/li&gt;
&lt;li&gt;Isolate listener pools or gateways by product area&lt;/li&gt;
&lt;li&gt;Practice traffic blocking at the CDN instead of relying only on cluster scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saturation isn't simply "high latency."&lt;/p&gt;

&lt;p&gt;It's when &lt;strong&gt;the gateway itself becomes the system bottleneck.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Broken Timeout Hierarchies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Clients receive HTTP 504 while backend requests continue executing.&lt;/p&gt;

&lt;p&gt;Connection pools fill.&lt;/p&gt;

&lt;p&gt;Latency increases until the entire gateway stalls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it happens
&lt;/h3&gt;

&lt;p&gt;Timeouts are configured independently instead of forming a hierarchy.&lt;/p&gt;

&lt;p&gt;If the gateway waits longer than the client, it continues consuming resources after users have already disconnected.&lt;/p&gt;

&lt;p&gt;Slow upstreams then exhaust connection pools.&lt;/p&gt;

&lt;p&gt;Queues continue growing.&lt;/p&gt;

&lt;p&gt;New requests begin failing.&lt;/p&gt;

&lt;p&gt;AWS documents this behavior in API Gateway timeout guidance.&lt;/p&gt;

&lt;p&gt;Increasing timeout values without redesigning timeout relationships simply keeps abandoned requests alive longer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct timeout ordering
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client timeout
      &amp;gt;
Gateway → Backend timeout
      &amp;gt;
Per-retry timeout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Recommendations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gateway timeouts should always be shorter than client timeouts&lt;/li&gt;
&lt;li&gt;Propagate deadlines downstream&lt;/li&gt;
&lt;li&gt;Cap pending request queues&lt;/li&gt;
&lt;li&gt;Prefer early HTTP 503 over extremely long waits&lt;/li&gt;
&lt;li&gt;Long-running work belongs in asynchronous workflows, not synchronous gateway paths&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Retry Storms
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;A minor upstream failure becomes a platform-wide outage.&lt;/p&gt;

&lt;p&gt;CPU utilization spikes.&lt;/p&gt;

&lt;p&gt;Request volume multiplies.&lt;/p&gt;

&lt;p&gt;Recovery takes longer than the original incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it happens
&lt;/h2&gt;

&lt;p&gt;Retries amplify traffic.&lt;/p&gt;

&lt;p&gt;AWS Well-Architected explicitly warns against retries without:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exponential backoff&lt;/li&gt;
&lt;li&gt;jitter&lt;/li&gt;
&lt;li&gt;retry limits&lt;/li&gt;
&lt;li&gt;centralized retry ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Multiple retry layers compound.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client retries × Gateway retries × Service Mesh retries
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single failed request can become dozens.&lt;/p&gt;

&lt;p&gt;Envoy recommends using retry budgets rather than unlimited retry counts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendations
&lt;/h3&gt;

&lt;p&gt;Retry only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;connection failures&lt;/li&gt;
&lt;li&gt;transient timeouts&lt;/li&gt;
&lt;li&gt;selected HTTP 5xx&lt;/li&gt;
&lt;li&gt;HTTP 429&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never retry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validation errors&lt;/li&gt;
&lt;li&gt;authentication failures&lt;/li&gt;
&lt;li&gt;authorization failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use exponential backoff&lt;/li&gt;
&lt;li&gt;add jitter&lt;/li&gt;
&lt;li&gt;cap retry attempts&lt;/li&gt;
&lt;li&gt;configure retry budgets&lt;/li&gt;
&lt;li&gt;retry in &lt;strong&gt;one layer only&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. The God Gateway
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Every product change requires modifying gateway configuration.&lt;/p&gt;

&lt;p&gt;Gateway plugins begin parsing JSON.&lt;/p&gt;

&lt;p&gt;Business rules appear inside Lua or JavaScript extensions.&lt;/p&gt;

&lt;p&gt;Latency slowly increases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it happens
&lt;/h3&gt;

&lt;p&gt;Cross-cutting concerns gradually become business logic.&lt;/p&gt;

&lt;p&gt;Microsoft's Gateway Offloading documentation is unambiguous:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Business logic should never be offloaded to the gateway.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Good gateway responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TLS&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;routing&lt;/li&gt;
&lt;li&gt;API versioning&lt;/li&gt;
&lt;li&gt;correlation IDs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Poor gateway responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entitlement rules&lt;/li&gt;
&lt;li&gt;product workflows&lt;/li&gt;
&lt;li&gt;screen composition&lt;/li&gt;
&lt;li&gt;response shaping&lt;/li&gt;
&lt;li&gt;domain validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rule of thumb
&lt;/h3&gt;

&lt;p&gt;If a Product Manager is approving gateway changes more often than an SRE, the gateway is doing too much.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Blind Observability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Monitoring shows "API latency."&lt;/p&gt;

&lt;p&gt;Nobody knows whether the delay comes from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TLS&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;plugins&lt;/li&gt;
&lt;li&gt;gateway overhead&lt;/li&gt;
&lt;li&gt;backend services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or worse:&lt;/p&gt;

&lt;p&gt;Everything works until load increases.&lt;/p&gt;

&lt;p&gt;Then a seemingly harmless metrics library blocks the event loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it happens
&lt;/h3&gt;

&lt;p&gt;Observability itself becomes part of the request path.&lt;/p&gt;

&lt;p&gt;Canva's postmortem identified a telemetry lock that reduced Netty throughput precisely when the traffic spike arrived.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendations
&lt;/h3&gt;

&lt;p&gt;Measure separately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gateway processing time&lt;/li&gt;
&lt;li&gt;Upstream latency&lt;/li&gt;
&lt;li&gt;Pending queue depth&lt;/li&gt;
&lt;li&gt;Active connections&lt;/li&gt;
&lt;li&gt;Retry overflow&lt;/li&gt;
&lt;li&gt;Circuit breaker events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prefer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local JWT verification&lt;/li&gt;
&lt;li&gt;cached JWKS&lt;/li&gt;
&lt;li&gt;asynchronous logging&lt;/li&gt;
&lt;li&gt;non-blocking plugins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can't answer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is the gateway slow, or is Payments slow?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;within one minute, observability needs improvement.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Weak Edge Hardening
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Rate limits work inconsistently.&lt;/p&gt;

&lt;p&gt;Backends remain publicly accessible.&lt;/p&gt;

&lt;p&gt;Administrative APIs are internet-exposed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it happens
&lt;/h3&gt;

&lt;p&gt;Three common mistakes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-node rate limiting
&lt;/h3&gt;

&lt;p&gt;Each gateway replica enforces its own counters.&lt;/p&gt;

&lt;p&gt;Four replicas effectively quadruple the intended limit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend bypass
&lt;/h3&gt;

&lt;p&gt;Clients can reach backend services directly.&lt;/p&gt;

&lt;p&gt;Gateway security policies become optional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exposed control plane
&lt;/h3&gt;

&lt;p&gt;Administrative APIs remain publicly reachable.&lt;/p&gt;

&lt;p&gt;For products like Kong, exposing the Admin API effectively grants full control over the gateway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recommendations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep backend services private&lt;/li&gt;
&lt;li&gt;Enforce authentication at the gateway&lt;/li&gt;
&lt;li&gt;Use shared rate limiting for cluster-wide quotas&lt;/li&gt;
&lt;li&gt;Protect administrative APIs with private networking and RBAC&lt;/li&gt;
&lt;li&gt;Continuously scan for routes bypassing the gateway&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How These Problems Reinforce Each Other
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traffic spike
      │
      ▼
Gateway saturation
      │
      ├── Timeout inversion
      │         │
      │         ▼
      │   Pool exhaustion
      │
      ├── Retry storms
      │         │
      │         ▼
      │   Traffic amplification
      │
      ├── Business logic
      │         │
      │         ▼
      │   Reduced capacity
      │
      ▼
Observability failures
      │
      ▼
Security and control-plane gaps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fixing only retries while telemetry still blocks the event loop doesn't solve the outage.&lt;/p&gt;

&lt;p&gt;These issues reinforce one another.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is an API Gateway always a single point of failure?
&lt;/h3&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;Multiple gateway instances remove a single process as a SPOF.&lt;/p&gt;

&lt;p&gt;However, shared configuration, shared telemetry, or synchronized traffic spikes can still create a shared failure domain.&lt;/p&gt;




&lt;h3&gt;
  
  
  Should the gateway perform retries?
&lt;/h3&gt;

&lt;p&gt;Sometimes.&lt;/p&gt;

&lt;p&gt;Only for idempotent operations and only within a defined retry budget.&lt;/p&gt;

&lt;p&gt;Avoid retries simultaneously in the client, gateway, and service mesh.&lt;/p&gt;




&lt;h3&gt;
  
  
  Gateway vs BFF vs Service Mesh
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway&lt;/td&gt;
&lt;td&gt;North–south traffic, TLS, authentication, routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BFF&lt;/td&gt;
&lt;td&gt;Product-specific aggregation and UI contracts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Mesh&lt;/td&gt;
&lt;td&gt;East–west resilience, mTLS, retries, service communication&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  How do I know my timeout hierarchy is wrong?
&lt;/h3&gt;

&lt;p&gt;Typical indicators include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backend work continues after clients disconnect&lt;/li&gt;
&lt;li&gt;growing pending queues&lt;/li&gt;
&lt;li&gt;frequent HTTP 504 responses&lt;/li&gt;
&lt;li&gt;connection pool exhaustion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instrument client timeout, gateway timeout, and upstream duration in the same trace.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Production gateways rarely fail because routing is difficult.&lt;/p&gt;

&lt;p&gt;They fail because every concern eventually accumulates at the edge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shared saturation&lt;/li&gt;
&lt;li&gt;inverted timeout budgets&lt;/li&gt;
&lt;li&gt;retry amplification&lt;/li&gt;
&lt;li&gt;business logic&lt;/li&gt;
&lt;li&gt;opaque observability&lt;/li&gt;
&lt;li&gt;weak control-plane security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each problem has well-established architectural guidance.&lt;/p&gt;

&lt;p&gt;The goal isn't building a smarter gateway.&lt;/p&gt;

&lt;p&gt;It's building one that is &lt;strong&gt;boring&lt;/strong&gt;, &lt;strong&gt;observable&lt;/strong&gt;, &lt;strong&gt;predictable&lt;/strong&gt;, and capable of failing in small pieces instead of taking the entire platform down.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.canva.dev/blog/engineering/canva-incident-report-api-gateway-outage/" rel="noopener noreferrer"&gt;Canva incident report: API Gateway outage&lt;/a&gt; — Canva Engineering (Dec 2024)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/gateway-offloading" rel="noopener noreferrer"&gt;Gateway Offloading pattern&lt;/a&gt; — Microsoft Azure Architecture Center&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/azure/architecture/microservices/design/gateway" rel="noopener noreferrer"&gt;API gateways in microservices&lt;/a&gt; — Microsoft Azure Architecture Center&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/gateway-routing" rel="noopener noreferrer"&gt;Gateway Routing pattern&lt;/a&gt; — Microsoft Azure Architecture Center&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/circuit_breaking" rel="noopener noreferrer"&gt;Circuit breaking&lt;/a&gt; — Envoy Proxy documentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/outlier" rel="noopener noreferrer"&gt;Outlier detection&lt;/a&gt; — Envoy Proxy documentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/cluster/v3/circuit_breaker.proto" rel="noopener noreferrer"&gt;Circuit breakers (proto) — retry_budget&lt;/a&gt; — Envoy Proxy API&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_mitigate_interaction_failure_limit_retries.html" rel="noopener noreferrer"&gt;REL05-BP03 Control and limit retry calls&lt;/a&gt; — AWS Well-Architected&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/wellarchitected/latest/framework/rel_mitigate_interaction_failure_client_timeouts.html" rel="noopener noreferrer"&gt;REL05-BP05 Set client timeouts&lt;/a&gt; — AWS Well-Architected&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://repost.aws/knowledge-center/api-gateway-504-errors" rel="noopener noreferrer"&gt;Troubleshoot API Gateway HTTP 504 timeout errors&lt;/a&gt; — AWS re:Post&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/about-aws/whats-new/2024/06/amazon-api-gateway-integration-timeout-limit-29-seconds/" rel="noopener noreferrer"&gt;Amazon API Gateway integration timeout limit increase beyond 29 seconds&lt;/a&gt; — AWS News (Jun 2024)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.konghq.com/gateway/secure-the-admin-api/" rel="noopener noreferrer"&gt;Secure the Admin API&lt;/a&gt; — Kong Gateway documentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.trendmicro.com/vinfo/us/security/news/virtualization-and-cloud/kong-api-gateway-misconfigurations-an-api-gateway-security-case-study" rel="noopener noreferrer"&gt;Kong API Gateway Misconfigurations: An API Gateway Security Case Study&lt;/a&gt; — Trend Micro&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/" rel="noopener noreferrer"&gt;Timeouts, retries, and backoff with jitter&lt;/a&gt; — Amazon Builders’ Library&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/" rel="noopener noreferrer"&gt;Exponential Backoff And Jitter&lt;/a&gt; — AWS Architecture Blog&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gustavogarcia.tech/en/articles/six-api-gateway-problems" rel="noopener noreferrer"&gt;6 problems your API gateway is already suffering from&lt;/a&gt; - Personal Portfolio Article&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>apigateway</category>
      <category>distributedsystems</category>
      <category>microservices</category>
      <category>sre</category>
    </item>
  </channel>
</rss>
