<?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: Nate</title>
    <description>The latest articles on DEV Community by Nate (@th3nate).</description>
    <link>https://dev.to/th3nate</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%2F3860681%2F8394db14-1da2-44ec-a5ef-e90282045b83.png</url>
      <title>DEV Community: Nate</title>
      <link>https://dev.to/th3nate</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/th3nate"/>
    <language>en</language>
    <item>
      <title>Cloudflare's AI block names eight crawlers. None is ChatGPT's search bot</title>
      <dc:creator>Nate</dc:creator>
      <pubDate>Tue, 18 Aug 2026 15:35:36 +0000</pubDate>
      <link>https://dev.to/th3nate/cloudflares-ai-block-names-eight-crawlers-none-is-chatgpts-search-bot-4ikm</link>
      <guid>https://dev.to/th3nate/cloudflares-ai-block-names-eight-crawlers-none-is-chatgpts-search-bot-4ikm</guid>
      <description>&lt;p&gt;Eight user agents, and the one that decides whether ChatGPT cites you is not among them.&lt;/p&gt;

&lt;p&gt;An r/SEO post from April, 53 points and 40 comments, says Cloudflare quietly cut the author's site off from ChatGPT, from Perplexity and from Google's AI Overviews. I went and read the block. It names ChatGPT's training crawler and not its search crawler, and it never mentions Perplexity at all. The Google agent it does name is one Google says does not affect inclusion or ranking in Search.&lt;/p&gt;

&lt;p&gt;Take just two of the eight agents. GPTBot governs inclusion in OpenAI's training data, and Google-Extended governs grounding in Gemini Apps. Those are real things to give up. They are not the three things the warning names.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually in the file
&lt;/h2&gt;

&lt;p&gt;Cloudflare prints the whole block on its &lt;a href="https://developers.cloudflare.com/bots/additional-configurations/managed-robots-txt/" rel="noopener noreferrer"&gt;managed robots.txt page&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# BEGIN Cloudflare Managed content
&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;Agent&lt;/span&gt;: *
&lt;span class="n"&gt;Content&lt;/span&gt;-&lt;span class="n"&gt;signal&lt;/span&gt;: &lt;span class="n"&gt;search&lt;/span&gt;=&lt;span class="n"&gt;yes&lt;/span&gt;, &lt;span class="n"&gt;ai&lt;/span&gt;-&lt;span class="n"&gt;train&lt;/span&gt;=&lt;span class="n"&gt;no&lt;/span&gt;, &lt;span class="n"&gt;use&lt;/span&gt;=&lt;span class="n"&gt;reference&lt;/span&gt;
&lt;span class="n"&gt;Allow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;Amazonbot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;Applebot&lt;/span&gt;-&lt;span class="n"&gt;Extended&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;Bytespider&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;CCBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;ClaudeBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;Google&lt;/span&gt;-&lt;span class="n"&gt;Extended&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;GPTBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;meta&lt;/span&gt;-&lt;span class="n"&gt;externalagent&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /
&lt;span class="c"&gt;# END Cloudflare Managed Content
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that against Cloudflare's own &lt;a href="https://developers.cloudflare.com/ai-crawl-control/reference/bots/" rel="noopener noreferrer"&gt;crawler reference table&lt;/a&gt; and a pattern falls out. GPTBot is in, OAI-SearchBot is out. ClaudeBot is in, Claude-SearchBot is out. For both of those pairs the table calls the blocked agent an AI Crawler and the one left alone AI Search. Applebot-Extended is in and plain Applebot is not, the same split again. The table has no Applebot-Extended row, so it cannot tell you what Cloudflare calls that one. The block runs along the training and search seam, and that looks deliberate to me.&lt;/p&gt;

&lt;p&gt;OpenAI's side of it is one line: "Each setting is independent of the others". I worked through the three OpenAI bots and which one governs search visibility &lt;a href="https://thenichesitelab.com/blog/ai-citations-vs-google-rankings/" rel="noopener noreferrer"&gt;in an earlier post&lt;/a&gt;, so I will point there rather than do it twice.&lt;/p&gt;

&lt;p&gt;Google-Extended is the entry that causes the trouble, because it sounds like it governs AI answers in Search. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers" rel="noopener noreferrer"&gt;crawler documentation&lt;/a&gt; scopes it to training and grounding future Gemini models, then says flatly: "Google-Extended does not impact a site's inclusion in Google Search nor is it used as a ranking signal in Google Search."&lt;/p&gt;

&lt;p&gt;So what does control AI Overviews? Nothing, in the sense people mean. From Google's &lt;a href="https://developers.google.com/search/docs/appearance/ai-features" rel="noopener noreferrer"&gt;AI features page&lt;/a&gt;: "AI is built into Search and integral to how Search functions, which is why robots.txt directives for Googlebot is the control for site owners to manage access to how their sites are crawled for Search. To limit the information shown from your pages in Search, use &lt;code&gt;nosnippet&lt;/code&gt;, &lt;code&gt;data-nosnippet&lt;/code&gt;, &lt;code&gt;max-snippet&lt;/code&gt;, or &lt;code&gt;noindex&lt;/code&gt; controls." Those are the ordinary snippet controls, so opting out of the AI answer means opting out of the snippet. Google states the trade in one paragraph and almost nobody repeats it.&lt;/p&gt;

&lt;p&gt;One more from the crawler page, which kills a piece of advice I keep seeing: "Google-Extended doesn't have a separate HTTP request user agent string. Crawling is done with existing Google user agent strings..." Anyone telling you to check your access logs for Google-Extended is sending you after a string that does not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did anyone turn this on, or did it turn itself on
&lt;/h2&gt;

&lt;p&gt;Cloudflare's documentation describes the managed file as a switch, in the same grammatical mood every time. "When you turn on the managed &lt;code&gt;robots.txt&lt;/code&gt; setting, Cloudflare generates and maintains a &lt;code&gt;robots.txt&lt;/code&gt; file that instructs known AI crawlers to stay away from your content." I searched the docs, the changelog, four announcement posts and the July 2025 press release for a case where it got enabled on an existing domain without the owner acting. I did not find one. That is a failure to find rather than a proof of absence.&lt;/p&gt;

&lt;p&gt;What did change is adjacent and gets mistaken for it. The &lt;a href="https://www.cloudflare.com/press/press-releases/2025/cloudflare-just-changed-how-ai-crawlers-scrape-the-internet-at-large/" rel="noopener noreferrer"&gt;press release&lt;/a&gt; from 1 July 2025 says "every new domain will now be asked if they want to allow AI crawlers..." A question at onboarding, for new domains, governing the traffic block rather than the file.&lt;/p&gt;

&lt;p&gt;One Cloudflare default does appear in a file you never touched, and it is not a block: "Domains on the Free plan that do not have their own &lt;code&gt;robots.txt&lt;/code&gt; file and do not use the managed &lt;code&gt;robots.txt&lt;/code&gt; feature will display the Content Signals Policy when a crawler requests the &lt;code&gt;robots.txt&lt;/code&gt; file for your domain." Cloudflare adds that the policy "does not express any specific preferences about your content".&lt;/p&gt;

&lt;h2&gt;
  
  
  Check it over the network, not on disk
&lt;/h2&gt;

&lt;p&gt;The managed file is assembled at the edge. Cloudflare says it "will prepend our managed &lt;code&gt;robots.txt&lt;/code&gt; before your existing &lt;code&gt;robots.txt&lt;/code&gt;, combining both into a single response", so the file in your web root and the file the world receives are two different objects. Your hosting file manager, FTP and your SEO plugin's robots editor can none of them see the difference, because none of them sits downstream of the edge.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.com/robots.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opening the same URL in a browser tab does the same job.&lt;/p&gt;

&lt;p&gt;If the block is on, you get the &lt;code&gt;# BEGIN Cloudflare Managed content&lt;/code&gt; marker above whatever your own site serves, the eight &lt;code&gt;Disallow&lt;/code&gt; groups, then &lt;code&gt;# END Cloudflare Managed Content&lt;/code&gt;. Note the capitalisation: lowercase c on the opening marker, capital C on the closing one. Either marker is conclusive on its own, and so is &lt;code&gt;User-agent: GPTBot&lt;/code&gt; sitting in a file you never edited.&lt;/p&gt;

&lt;p&gt;The false positive to know about is the Content Signals preamble. It runs to a screenful, opens with "As a condition of accessing this website, you agree to abide by the following content signals:", and defines a vocabulary in lettered clauses. Every line of it starts with a &lt;code&gt;#&lt;/code&gt;, and a &lt;code&gt;robots.txt&lt;/code&gt; comment does nothing. So: if every line starts with a hash, nothing is blocked. A block is a &lt;code&gt;Disallow:&lt;/code&gt; line with no hash in front of it.&lt;/p&gt;

&lt;p&gt;If you find AI crawler rules and no Cloudflare markers, the source is inside your own stack. WordPress core's complete default output, from the &lt;a href="https://developer.wordpress.org/reference/functions/do_robots/" rel="noopener noreferrer"&gt;&lt;code&gt;do_robots()&lt;/code&gt; source&lt;/a&gt;, is three lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;admin&lt;/span&gt;/
&lt;span class="n"&gt;Allow&lt;/span&gt;: /&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;admin&lt;/span&gt;/&lt;span class="n"&gt;admin&lt;/span&gt;-&lt;span class="n"&gt;ajax&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Core adds no AI rules of any kind. The function ends by passing that output through a &lt;code&gt;robots_txt&lt;/code&gt; filter, which is the hook a plugin would use to append its own. So the rules came from a physical file in the web root, a plugin on that filter, an SEO plugin's own robots editor, or the edge. Those are the only four places I can find that they could come from, so checking in that order settles it.&lt;/p&gt;

&lt;p&gt;If you do change something, OpenAI is the only operator I found that publishes a lag: "it can take ~24 hours from a site's robots.txt update for our systems to adjust." Nobody else gives a figure, so do not read that one as the industry's.&lt;/p&gt;

&lt;h2&gt;
  
  
  The date is 15 September 2026, and it is a different toggle again
&lt;/h2&gt;

&lt;p&gt;Most of the argument is about a default Cloudflare changed in 2025. There is a second change dated 15 September 2026, and that one has an action attached. From the &lt;a href="https://developers.cloudflare.com/bots/additional-configurations/block-ai-bots/" rel="noopener noreferrer"&gt;Block AI bots documentation&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"On September 15, 2026, Cloudflare will set updated defaults for new domains: bots classified as Training or as Agent will be blocked on pages that display ads, and Search will remain allowed. Mixed-purpose crawlers that combine Search and Training will also be blocked by all configurations to block AI training, including the legacy 'Block AI bots' option. Before September 15, all customers can opt out of these new defaults."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two things happen there and they need keeping apart. The ads-page default is for new domains only, so if your site is already on Cloudflare that half does not reach you at all.&lt;/p&gt;

&lt;p&gt;The other half does. From Cloudflare's &lt;a href="https://blog.cloudflare.com/content-independence-day-ai-options/" rel="noopener noreferrer"&gt;announcement on 1 July 2026&lt;/a&gt;: "multi-purpose crawlers such as Googlebot, Applebot, and BingBot will be blocked by customers who have selected to block Training (either through the new options to manage AI traffic, or through the legacy Block AI bots service)." The legacy service there is the "AI Scrapers and Crawlers" toggle from July 2024.&lt;/p&gt;

&lt;p&gt;My reading, and Cloudflare does not put it in these words: if you clicked that toggle in 2024 and do nothing before 15 September 2026, you are opting into blocking a crawler Cloudflare itself names as Googlebot. I am not going to model what that does to any particular site. The opt-out sits in Security Settings and it closes on 15 September 2026.&lt;/p&gt;

&lt;p&gt;The category is not marginal either. Cloudflare Radar's &lt;a href="https://radar.cloudflare.com/ai-insights" rel="noopener noreferrer"&gt;AI insights page&lt;/a&gt; splits crawl traffic by declared purpose, and for the seven days to 18 August 2026 it put crawlers declaring both training and search at 33.3%, training alone at 40.2% and search alone at 18.5%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bot Fight Mode is not the same feature
&lt;/h2&gt;

&lt;p&gt;In the same thread, somebody undid all of Cloudflare's bot blocking and found Claude, Grok and Perplexity still blocked. Another commenter named Bot Fight Mode as the cause, on the grounds that those three are not verified bots. The mechanism is right. The list is not.&lt;/p&gt;

&lt;p&gt;Bot Fight Mode is a separate product with a separate toggle. It does not produce a file, it issues challenges, and it is rigid by design: "You cannot bypass or skip Bot Fight Mode using WAF custom rules or Page Rules. This is because Bot Fight Mode does not run on the Ruleset Engine..." Cloudflare's Free-plan table gives the type of bots it detects as "Simple bots from cloud hosting providers and headless browsers" and the control as "Applied to all traffic across a domain". A crawler on cloud IPs with no exemption and no rule you can write around it is the shape of a block that survives every AI setting you turn off. That is my reading of four documented properties, not a sentence Cloudflare writes.&lt;/p&gt;

&lt;p&gt;The list is where it comes apart. I went through all 693 entries in Cloudflare's own &lt;a href="https://radar.cloudflare.com/bots/directory" rel="noopener noreferrer"&gt;bots directory&lt;/a&gt; on 18 August 2026. ClaudeBot is in there, labelled Verified, operator Anthropic, and so is Claude-SearchBot. Perplexity has no entry, and Cloudflare has published why: on 4 August 2025 it wrote that it had "de-listed them as a verified bot and added heuristics to our managed rules that block this stealth crawling". Perplexity disputed that publicly and I am not going to adjudicate it. Grok and xAI have no entry, and I found nothing Cloudflare has published about them either way. Absence carries no single meaning: Bytespider and CCBot are missing too, and both sit on Cloudflare's own block list.&lt;/p&gt;

&lt;p&gt;One thing I would like to state and cannot. Cloudflare's &lt;a href="https://developers.cloudflare.com/bots/concepts/bot/verified-bots/" rel="noopener noreferrer"&gt;verified bots page&lt;/a&gt; says "Historically, Verified bots have been excluded in default bot configurations across all plans." The Bot Fight Mode page says nothing about verified bots either way, and I read all of it. Configurable allowlisting is a Super Bot Fight Mode feature, Pro and above.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Content-signal line does not do what its wording implies
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Content-signal: search=yes, ai-train=no, use=reference&lt;/code&gt; is the first non-comment line of the managed block, and it is the part people read as the actual instruction to AI companies.&lt;/p&gt;

&lt;p&gt;It is Cloudflare's convention. contentsignals.org is Cloudflare's own site, calls itself "Cloudflare's implementation", and now sits alongside the IETF's AI Preferences working group. That group is real and chartered, neither of its two standards-track documents is a published RFC, and its charter puts "Technical enforcement of preferences" out of scope in writing.&lt;/p&gt;

&lt;p&gt;The vocabulary has a sharp edge in it. Cloudflare's policy text defines &lt;code&gt;search&lt;/code&gt; as "building a search index and providing search results" and then adds: "Search does not include providing AI-generated search summaries." So &lt;code&gt;search=yes&lt;/code&gt; is not permission to be summarised in an AI answer. The signal for that is &lt;code&gt;ai-input&lt;/code&gt;, the managed block omits it entirely, and under the policy's own terms omitting a signal expresses no preference either way. A quick reader gets this backwards.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;use=reference&lt;/code&gt; is newer. Cloudflare calls &lt;code&gt;content-use&lt;/code&gt; a test, and added the field to existing customers' files on 1 July 2026, so anyone who turned the setting on before that got a fourth field without doing anything.&lt;/p&gt;

&lt;p&gt;Whether anybody acts on any of it, I could not establish. OpenAI's crawler documentation does not mention content signals. Google is worse than silent: its &lt;a href="https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt" rel="noopener noreferrer"&gt;robots.txt specification&lt;/a&gt; publishes a closed list, "Google supports the following fields (other fields such as &lt;code&gt;crawl-delay&lt;/code&gt; aren't supported)", and that list is &lt;code&gt;user-agent&lt;/code&gt;, &lt;code&gt;allow&lt;/code&gt;, &lt;code&gt;disallow&lt;/code&gt; and &lt;code&gt;sitemap&lt;/code&gt;. The same page says "Google ignores invalid lines in robots.txt files". Anthropic, Perplexity, Meta, Apple, Amazon and ByteDance say nothing either way, and Cloudflare makes no adoption claim of its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nobody else is doing this to you quietly
&lt;/h2&gt;

&lt;p&gt;I went looking for a second host with a silent AI default and did not find one. WP Engine &lt;a href="https://wpengine.com/support/read-use-robots-txt/" rel="noopener noreferrer"&gt;documents two&lt;/a&gt; and neither is AI related: a block on sites still running on a &lt;code&gt;.wpengine.com&lt;/code&gt; subdomain, and a platform-wide crawl delay of 10 seconds nobody asked for. &lt;a href="https://pressable.com/knowledgebase/pressable-sites-and-robots-txt/" rel="noopener noreferrer"&gt;Pressable's&lt;/a&gt; live-site default allows crawling. For Kinsta, SiteGround and cPanel I found no primary documentation either way.&lt;/p&gt;

&lt;p&gt;The one that surprised me sits lower down. hosting.com &lt;a href="https://kb.hosting.com/docs/disabling-automatic-creation-of-the-robots-txt-file" rel="noopener noreferrer"&gt;documents&lt;/a&gt; that on shared and reseller servers, "if a &lt;code&gt;robots.txt&lt;/code&gt; file does not exist in the document root (&lt;code&gt;public_html&lt;/code&gt;) directory, the server automatically creates a new &lt;code&gt;robots.txt&lt;/code&gt; file at midnight". The article never says what goes in that file, so I cannot tell you whether it mentions AI crawlers.&lt;/p&gt;

&lt;h2&gt;
  
  
  So should you block them
&lt;/h2&gt;

&lt;p&gt;I do not have an answer for you, and I want to be exact about why.&lt;/p&gt;

&lt;p&gt;Nothing I read measures the outcome. No study in any of it says what blocking training crawlers does to your citations or your traffic. The argument on both sides is people reasoning from first principles about a system nobody has measured. Fine as reasoning, not evidence.&lt;/p&gt;

&lt;p&gt;What I can tell you is narrower. The seam in that block list runs between training and search rather than across AI as a category, so what you give up by leaving it on is not what the loudest warning says you give up. And if you clicked an AI toggle in 2024 and have not opened the screen since, Cloudflare has put a date on it in writing. The opt-out window closes on 15 September 2026, and the screen it closes on is Cloudflare's Security Settings.&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>ai</category>
      <category>seo</category>
    </item>
    <item>
      <title>Amazon PA-API v5 deprecates April 30, 2026 and retires May 15. Here is what changes at the auth layer.</title>
      <dc:creator>Nate</dc:creator>
      <pubDate>Tue, 14 Apr 2026 10:12:10 +0000</pubDate>
      <link>https://dev.to/th3nate/amazon-pa-api-v5-is-shutting-down-april-30-2026-here-is-what-changes-at-the-auth-layer-22ek</link>
      <guid>https://dev.to/th3nate/amazon-pa-api-v5-is-shutting-down-april-30-2026-here-is-what-changes-at-the-auth-layer-22ek</guid>
      <description>&lt;p&gt;If you maintain anything that calls Amazon's Product Advertising API v5 (PA-API), this affects you. Amazon's published timeline has two dates: &lt;strong&gt;April 30, 2026&lt;/strong&gt; is the deprecation date and Amazon's recommended migration cutoff, and &lt;strong&gt;May 15, 2026&lt;/strong&gt; is when the endpoint itself is retired. Amazon explicitly recommends completing migration by April 30 to avoid service disruption. The replacement is the Creators API, and the migration is not a config change. It is a different authentication scheme, a different request shape, and a different token lifecycle.&lt;/p&gt;

&lt;p&gt;This post is a quick technical orientation: what changes at the auth layer, what changes in the request payload, and how to test your migration before the cutoff. Useful whether you are maintaining a WordPress plugin, a custom Node integration, or a one-off affiliate scraper.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes at the auth layer
&lt;/h2&gt;

&lt;p&gt;PA-API v5 uses &lt;strong&gt;AWS Signature Version 4&lt;/strong&gt;. You sign every request with your AWS Access Key ID and Secret Access Key, derive a signing key from your secret + date + region + service, and attach an &lt;code&gt;Authorization&lt;/code&gt; header that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: AWS4-HMAC-SHA256 Credential=AKIA.../20260413/us-east-1/ProductAdvertisingAPI/aws4_request,
               SignedHeaders=content-encoding;content-type;host;x-amz-date;x-amz-target,
               Signature=...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You also send &lt;code&gt;X-Amz-Date&lt;/code&gt;, &lt;code&gt;X-Amz-Target&lt;/code&gt;, and &lt;code&gt;Content-Encoding: amz-1.0&lt;/code&gt;. The signing process is finicky: every header has to be canonicalized, the body has to be hashed, and the timestamp window is tight (15 minutes). If you have ever debugged Sig V4, you know.&lt;/p&gt;

&lt;p&gt;The Creators API replaces all of that with &lt;strong&gt;OAuth 2.0 client credentials&lt;/strong&gt;. You register your application in the Amazon Associates portal, get a Client ID and Client Secret, and exchange them for a bearer access token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;# The URL depends on your credential Version (Amazon shows this on your credential page).

# v2.x credentials (Cognito-fronted OAuth):
POST https://creatorsapi.auth.us-east-1.amazoncognito.com/oauth2/token   # v2.1 (NA)
POST https://creatorsapi.auth.eu-south-2.amazoncognito.com/oauth2/token  # v2.2 (EU)
POST https://creatorsapi.auth.us-west-2.amazoncognito.com/oauth2/token   # v2.3 (FE)

# v3.x credentials (Login with Amazon path):
POST https://api.amazon.com/auth/o2/token      # v3.1 (NA)
POST https://api.amazon.co.uk/auth/o2/token    # v3.2 (EU)
POST https://api.amazon.co.jp/auth/o2/token    # v3.3 (FE)

# Common headers and body for v2.x (Cognito):
Content-Type: application/x-www-form-urlencoded
Authorization: Basic &amp;lt;base64(client_id:client_secret)&amp;gt;

grant_type=client_credentials&amp;amp;scope=creatorsapi/default
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Amazon issues credentials with a Version (2.1, 2.2, 2.3 for the Cognito path; 3.1, 3.2, 3.3 for the LwA path). The token endpoint, scope format, and Authorization header shape all depend on which Version you hold. For v3.x credentials, the scope is &lt;code&gt;creatorsapi::default&lt;/code&gt; (double colon) and the product Authorization header is &lt;code&gt;Bearer &amp;lt;access_token&amp;gt;&lt;/code&gt; without the Version suffix.&lt;/p&gt;

&lt;p&gt;Amazon documents both forms as valid for v2.x credentials: you can send &lt;code&gt;client_id&lt;/code&gt; and &lt;code&gt;client_secret&lt;/code&gt; in the body, or use the &lt;code&gt;Authorization: Basic &amp;lt;base64(id:secret)&amp;gt;&lt;/code&gt; header shown above. The Basic header form is what Amazon shows in the migration guide example, so that is the one I would default to.&lt;/p&gt;

&lt;p&gt;You get back a JSON envelope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"access_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;opaque-string&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;seconds&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For v2.x credentials, every product request carries &lt;code&gt;Authorization: Bearer &amp;lt;access_token&amp;gt;, Version &amp;lt;credential_version&amp;gt;&lt;/code&gt; plus an &lt;code&gt;x-marketplace&lt;/code&gt; header naming your storefront (for example &lt;code&gt;www.amazon.com&lt;/code&gt;). The &lt;code&gt;Version&lt;/code&gt; suffix is how Amazon ties the token to your Associates credential version - do not drop it. For v3.x credentials (Login with Amazon path), the header is just &lt;code&gt;Authorization: Bearer &amp;lt;access_token&amp;gt;&lt;/code&gt; without the Version suffix.&lt;/p&gt;

&lt;p&gt;Practical implications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more derived signing keys, no more canonical request strings, no more 15-minute timestamp window.&lt;/li&gt;
&lt;li&gt;The token is opaque to you. You do not roll your own crypto.&lt;/li&gt;
&lt;li&gt;You do need a token cache layer. In WordPress, any shared persistent store works: &lt;code&gt;set_transient&lt;/code&gt; with a TTL under &lt;code&gt;expires_in&lt;/code&gt;, or &lt;code&gt;update_option&lt;/code&gt; with a companion expiry timestamp that your code checks before each request. The must-have is "shared across PHP-FPM workers," not "auto-expiring" - you will check expiry yourself before every request anyway.&lt;/li&gt;
&lt;li&gt;Pre-emptive refresh works well here: keep an &lt;code&gt;expires_at&lt;/code&gt; timestamp next to your cached token and refresh before you hit it (a 60-second buffer is plenty). Refresh-on-401 also works as a fallback if a request races with expiry, but pre-emptive refresh keeps the common path to a single HTTP call.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What changes in the request payload
&lt;/h2&gt;

&lt;p&gt;The request body shape stays largely the same, but &lt;strong&gt;every parameter name has been converted from PascalCase to lowerCamelCase&lt;/strong&gt;. SearchItems now takes &lt;code&gt;keywords&lt;/code&gt;, &lt;code&gt;searchIndex&lt;/code&gt;, &lt;code&gt;itemCount&lt;/code&gt;, &lt;code&gt;resources[]&lt;/code&gt;. GetItems takes &lt;code&gt;itemIds[]&lt;/code&gt;. Both also take &lt;code&gt;partnerTag&lt;/code&gt; (lowercase p) and &lt;code&gt;marketplace&lt;/code&gt;. If you are porting existing PA-API v5 code, a find-and-replace across parameter names is mandatory - Amazon will reject the PascalCase forms. The big differences beyond the casing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint host changes.&lt;/strong&gt; PA-API v5 is &lt;code&gt;webservices.amazon.com&lt;/code&gt; (regional). Creators API uses a single global endpoint: &lt;code&gt;https://creatorsapi.amazon/catalog/v1/&lt;/code&gt;. Unlike PA-API v5 (which had regional hosts like &lt;code&gt;webservices.amazon.com&lt;/code&gt; baked into Sig V4 signing), Creators API is region-agnostic at the host level - regional routing is driven by your &lt;code&gt;x-marketplace&lt;/code&gt; header and credential Version. Note the &lt;code&gt;.amazon&lt;/code&gt; TLD - that is Amazon's own top-level domain, not a typo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No regional signing.&lt;/strong&gt; Sig V4 had &lt;code&gt;us-east-1&lt;/code&gt;, &lt;code&gt;eu-west-1&lt;/code&gt;, etc. baked into the signing key. The Creators API decouples auth from marketplace - you specify the marketplace in the request body and the &lt;code&gt;x-marketplace&lt;/code&gt; header, not in the auth itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-request item caps you will hit.&lt;/strong&gt; SearchItems returns up to 10 items per call (&lt;code&gt;itemCount&lt;/code&gt; max 10). GetItems accepts up to 10 &lt;code&gt;itemIds&lt;/code&gt; per call. If you were batching more than 10 ASINs per GetItems request on PA-API v5, you will need to split. The &lt;code&gt;resources[]&lt;/code&gt; field-selection array length is not numerically capped in Amazon's public docs - add what you need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throttling behavior may shift.&lt;/strong&gt; Check the Creators API rate-limit docs before assuming PA-API v5 limits carry over one-for-one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to test your migration before the cutoff
&lt;/h2&gt;

&lt;p&gt;Three steps that do not require burning your production setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Apply for Creators API credentials now.&lt;/strong&gt; Prerequisites you may hit: you need final-accepted Amazon Associates status, and Amazon requires at least 10 qualifying referred sales in the last 30 days to access Creators API. Only the primary account owner can register. If you clear those gates, go to Associates Central -&amp;gt; Tools -&amp;gt; Creators API, apply, and wait for approval. This unblocks everything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run both auth methods side-by-side on a staging site.&lt;/strong&gt; Keep your existing PA-API v5 wiring intact. Add a feature flag or a config toggle that routes a copy of each search to the Creators API endpoint with the bearer token. Compare the response shapes for the same query. You will catch any payload differences (mostly minor field naming) without touching production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrate one site, then the rest.&lt;/strong&gt; Pick your lowest-traffic affiliate site, flip it to Creators API, run for a week, watch error rates and CTR. If clean, roll the rest. Do not flip everything on April 29.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common gotchas
&lt;/h2&gt;

&lt;p&gt;A few things that catch people:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token caching across processes.&lt;/strong&gt; If you are running PHP-FPM with multiple workers, each worker can request its own token if you cache in process memory. Use a shared cache (WordPress options, transients, Redis, memcached) instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clock skew on the staging server.&lt;/strong&gt; OAuth tokens are timestamped. If your server clock is off by more than a few minutes, token validation can fail. &lt;code&gt;ntpdate&lt;/code&gt; is your friend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketplace defaults.&lt;/strong&gt; Make sure your migration code passes the same marketplace as your old code, both in the request body AND the &lt;code&gt;x-marketplace&lt;/code&gt; header. Default endpoint behavior is not always identical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throttling under load.&lt;/strong&gt; The new API may enforce different rate-limit shapes. If you were already cache-walking PA-API v5 (search 30 min, product 1 hr is a common pattern), keep that behavior - the cache layer insulates you from whatever the new limits turn out to be.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  After April 30
&lt;/h2&gt;

&lt;p&gt;April 30 is Amazon's recommended migration deadline and the official deprecation date - documentation stops being maintained and Amazon's guidance is to be off v5 by then. The endpoint itself keeps accepting requests until it retires on May 15, so you have a two-week tail, but there is no documented grace period on the retirement itself. Plugins and integrations that still send AWS Sig V4 requests after May 15 will start getting auth failures. The path forward is straightforward, but the window is fixed and the application-and-test cycle takes more than zero days. (These dates come from Amazon's April 2026 notification to existing PA-API customers. Amazon's public Creators API migration guide does not currently publish an endpoint retirement date, so if a reader checks that and finds nothing, this is why.)&lt;/p&gt;

&lt;p&gt;If you do nothing else this week: apply for Creators API credentials. Everything downstream depends on having them in hand.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Footnote: I maintain &lt;a href="https://paapiplugin.com/amazon-is-retiring-pa-api-v5-is-your-affiliate-plugin-ready/?utm_source=dev&amp;amp;utm_medium=post&amp;amp;utm_campaign=pa-api-migration" rel="noopener noreferrer"&gt;Product Search for Amazon&lt;/a&gt;, a WordPress plugin that supports both PA-API v5 and the Creators API during the migration window. If you are running WordPress and want a reference implementation of the dual-auth pattern, the source is on the WordPress.org plugin directory. Not the point of this post - just disclosing relevant context.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>amazon</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
