


Your IndexNow Submission Didn’t Work.
Here’s the Actual Reason Why.
403, 422, 429 — the numbers you get back from the IndexNow API when something is wrong. Most troubleshooting guides recite the official documentation. This one explains what’s actually happening under the hood, and what to do that isn’t obvious.
The IndexNow protocol is conceptually simple. You generate a key, host it at your domain root, and ping an endpoint whenever a URL changes. In a world where Bing, Yandex, Seznam, and Naver all participate, one POST request notifies every engine simultaneously. That’s the pitch.
The reality is that a non-trivial percentage of implementations break silently — plugins keep firing requests, WordPress shows green status indicators, and nobody notices for weeks that the actual API is returning 403 on every single submission. By the time you look at your Bing Webmaster Tools submission history and see nothing but red, you’ve missed weeks of faster indexing on every page you published.
This guide covers what each error code actually means — not just the one-line definition from IndexNow.org’s documentation, but the root causes that aren’t obvious and the failure patterns that repeat across hundreds of real implementations.
What IndexNow Is Actually Doing When You Submit a URL
Understanding the error codes requires understanding the sequence. When you call the IndexNow API — either GET for a single URL or POST with JSON for bulk — here’s what happens on the API’s side, in order:
- The API parses your request and checks that the required fields are present and properly formatted. If not → 400.
- The API looks up the key file at
yourdomain.com/{yourkey}.txt(or thekeyLocationyou specified). If the file doesn’t exist, or the key string inside it doesn’t match → 403. - The API checks that every submitted URL belongs to the same host as the key. If any URL is from a different domain or has a different schema structure → 422.
- The API checks your submission frequency. Too many requests from your IP in too short a window → 429.
- Everything checks out → 200 (or 202 on first submission while async verification completes).
The response code comes back to you before the search engines have crawled anything. A 200 doesn’t mean your page is indexed — it means the API accepted your notification. Those are different things, and conflating them causes a lot of unnecessary debugging of the wrong layer.
Every IndexNow Response Code, What It Means, and What to Do
| Code | Name | Is it an error? | Root cause | Time to fix |
|---|---|---|---|---|
| 200 OK | Success | No | URL accepted, key verified, notification dispatched | N/A |
| 202 Accepted | Pending | No — often misread as one | First-time submission; key verification running async | N/A — resolves itself |
| 400 Bad Request | Malformed request | Yes | Missing parameter, bad URL format, invalid JSON | Minutes |
| 403 Forbidden | Key invalid | Yes | Key file missing, wrong content, BOM character, permissions | Minutes–hours |
| 422 Unprocessable | Domain mismatch | Yes | URL host doesn’t match key host, or protocol mismatch | Minutes |
| 429 Too Many Requests | Rate limit hit | Yes | Exceeded per-IP daily quota; shared hosting compounds this | Hours |
202 Accepted — Not an Error, But Everyone Thinks It Is
Every week, someone opens a Rank Math or Yoast SEO support ticket because their IndexNow history shows 202 instead of 200. They assume the submission failed. It didn’t.
202 means the API received your request but is verifying your key file asynchronously. This always happens on your first submission after generating or changing a key. Once the search engine has verified the key once, subsequent submissions return 200.
The only time 202 becomes a problem is if you’re still seeing it after several days on the same key. That usually means the key file verification is failing silently — which puts you in 403 territory even though the response code says 202. Check your key file manually before assuming everything is fine.
400 Bad Request — Your Formatting Broke Something
A 400 error means your request reached the API successfully but had structural problems. This is distinct from a 422 (which is about the data inside a well-formed request). A 400 is a format issue, not a logic issue.
The Three Most Common Causes
1. Missing or malformed URL parameter. For GET requests, the url parameter must include the full protocol. yourdomain.com/page fails; https://yourdomain.com/page is required. URLs with spaces or special characters must be percent-encoded.
2. Invalid JSON body on POST requests. The bulk submission format requires Content-Type: application/json header and valid JSON. A trailing comma in your array, an unescaped quote in a URL, or a missing closing bracket all trigger 400.
3. Missing the key parameter. Both GET and POST formats require an explicit key value. Some implementations that auto-generate this parameter occasionally produce an empty string if the key hasn’t been saved properly.
https://api.indexnow.org/indexnow?url=https%3A//yourdomain.com/post-slug/&key=YOUR_KEY_HERE
{
"host": "yourdomain.com",
"key": "YOUR_API_KEY",
"keyLocation": "https://yourdomain.com/YOUR_API_KEY.txt",
"urlList": [
"https://yourdomain.com/page-1/",
"https://yourdomain.com/page-2/"
]
}
How to Debug a 400
- Test with a raw
curlcommand rather than through a plugin, so you can see exactly what’s being sent. - Validate your JSON at jsonlint.com if doing bulk POST submissions.
- Check that every URL in your array starts with
https://(not justhttp://and not a relative path). - Verify the
Content-Type: application/jsonheader is present on POST requests.
403 Forbidden — The Key File Problem You’re Probably Missing
The 403 is the error that most sites are getting silently, right now, without realizing it. Your SEO plugin says it’s configured. The Bing Webmaster Tools dashboard looks quiet. But every submission is returning 403 and being discarded.
The official definition: “In case of key not valid — key not found, file found but key not in the file.” That sentence contains two distinct failure modes, and they have different fixes.
Failure Mode 1: The Key File Isn’t Accessible at All
The API can’t find yourdomain.com/{key}.txt. This happens when:
- The plugin created the key file in the wrong directory (common on multisite WordPress setups)
- A Cloudflare firewall rule or Page Rule is blocking external access to
.txtfiles at root - The file was created successfully but a CDN is serving a cached 404 from before the file existed
- Your
.htaccesshas a rule that denies access to files matching/*.txtfor security reasons
Test this in under 30 seconds: open your browser and navigate directly to https://yourdomain.com/YOURKEY.txt. If you see your key string as plain text: the file is accessible. If you see a 404 or a login redirect or a blank page — that’s your 403 source, regardless of what the plugin UI shows.
Failure Mode 2: File Exists, But Key Content Doesn’t Match
This is more subtle. The file is there, the API can read it — but the key string inside the file doesn’t match the key in your API request. The most common ways this happens:
- BOM character. If the key file was created on Windows (or by certain text editors) with UTF-8 BOM encoding, there are three invisible bytes at the start of the file. The API reads those bytes as part of the key string. Your key is
abc123but the file contains[BOM]abc123. They don’t match → 403. Open the file in VS Code and check the bottom-right status bar. It should say “UTF-8” not “UTF-8 with BOM.” - Trailing newline or whitespace. Some editors automatically append a newline character. The key string must be the complete, exact, only content in the file.
- Key was regenerated in the plugin but the old key file is still on disk. Regenerating a key in Rank Math or Yoast updates the database value and the submission request, but if the automatic file replacement failed (permissions issue), the old file still sits at the root with the old key. Every submission uses the new key, every verification check finds the old key → 403.
curl -I https://yourdomain.com/YOURKEY.txtShould return
HTTP/2 200 and the body should be exactly your key string, character for character.
Fix Sequence for 403
- Navigate directly to your key file URL in a browser. Confirm it returns the key string as plain text.
- If the file is inaccessible: create it manually via FTP or cPanel and upload it to your site root (
/public_html/or equivalent). Name it{YOURKEY}.txt, contents = the key string only, saved as UTF-8 without BOM. - If the file is accessible but you’re still getting 403: compare the key string in the file character by character against what your plugin is submitting. Check for BOM, trailing spaces, or a line break.
- If you changed your key recently: delete the old key file from the root directory, create a new one with the new key, clear any CDN cache for that path.
- Resubmit a single URL manually and check Bing Webmaster Tools → URL Submission within 15 minutes. If the URL appears → fixed.
422 Unprocessable Entity — When the URL Doesn’t Belong to Your Key
The 422 error trips people up because the request format is valid — it would pass a 400 check — but the content is semantically wrong. The most common version: your key is registered for yourdomain.com, but you’re submitting URLs from subdomain.yourdomain.com.
The IndexNow specification treats each subdomain as a completely separate host. A key file at yourdomain.com/key.txt does not authorize submissions from blog.yourdomain.com. You need a separate key file at blog.yourdomain.com/key.txt (using the same or a different key), and each subdomain must submit its own URLs independently.
Other Causes of 422
- HTTP/HTTPS mismatch. Your key file is at
https://yourdomain.com/key.txtbut submitted URLs includehttp://versions. The protocol is part of the host check. - Submitting URLs from an external domain. Some automation setups accidentally include URLs scraped from internal links that point to third-party resources. Those fail 422 every time.
- The
hostfield in bulk POST doesn’t match the submitted URLs. In a bulk JSON submission, thehostparameter must match the domain of every URL in theurlListarray exactly. - URL-encoded characters that change the apparent host. Malformed URL encoding can produce a URL that appears to be from a different domain when parsed.
Fix Sequence for 422
- Identify which specific URLs are triggering the 422. The IndexNow History tab in your plugin will show you.
- Check whether those URLs come from a different subdomain than your key is registered for.
- For subdomain mismatches: create a separate key file at the subdomain’s root and configure each subdomain independently.
- For protocol mismatches: ensure all submitted URLs use
https://. If your site has mixed content or redirects, fix canonical URLs first. - For bulk POST submissions: verify the
hostfield exactly matches the domain (nohttps://prefix — justyourdomain.com).
429 Too Many Requests — The Shared Hosting Problem Nobody Warns You About
The official IndexNow specification allows up to 10,000 URLs in a single bulk POST request. What isn’t in the documentation is that the rate limit is applied per IP address, not per domain or API key.
On a VPS or dedicated server, this distinction doesn’t matter much — you’re the only one using that IP. On shared hosting, you share an IP with potentially dozens of other websites. If those sites also use IndexNow (or any of the SEO plugins that enable it by default), their submissions count against the same rate limit you’re hitting.
Why Auto-Submit Modes Cause 429 at Scale
Most WordPress IndexNow plugins offer an “auto-submit on publish/update” mode. This sounds ideal, and for small sites with occasional publishing cadences, it is. For sites that update frequently — news, e-commerce product feeds, sites that modify metadata in bulk — this mode generates a burst of sequential API calls that triggers rate limiting almost immediately.
The pattern that creates the worst 429 problems: a site runs a bulk SEO title update across 800 posts. The plugin treats every post save as a new publish event. 800 API calls fire within 60 seconds. 429 fires on roughly request number 50, and then every remaining submission is dropped. You’ve now missed 750 URL notifications, but the plugin UI shows the jobs as “completed.”
Fix Sequence for 429
- Stop automatic submissions immediately. Disable auto-submit in your plugin settings (Rank Math: Settings → Auto-Submit Post Types → deselect all).
- Check the
Retry-Afterheader in the 429 response — it tells you exactly how many seconds to wait before resubmitting. Most implementations ignore this header entirely. - Wait the specified interval before any new submissions. On shared hosting, this might be several hours if other sites have also hit the limit.
- Implement a submission queue instead of immediate auto-submit: buffer changed URLs and submit in batches 2–4 times per day using the bulk POST endpoint (up to 10,000 per batch).
- If 429 persists despite low submission volume: contact your host and ask whether other sites on your shared IP are hitting IndexNow rate limits. This is a legitimate hosting complaint, not a configuration problem on your side.
- For sites that generate high volumes of URL changes legitimately (news, e-commerce): consider moving to a VPS or dedicated environment where your IP is isolated.
Getting 200 Back But Your Pages Still Aren’t Indexed
This is the scenario that causes the most head-scratching, and it’s not actually an IndexNow error at all — it’s an indexing eligibility problem masquerading as one.
IndexNow guarantees notification, not indexing. A 200 response means search engines received your submission and queued your URLs for crawling. It does not mean they’ll index those pages. If your pages have any of these characteristics, they may be crawled and then rejected at the indexing stage:
noindexmeta tag present on the submitted URL- URL blocked in
robots.txt(the crawler still receives the IndexNow notification but won’t crawl) - Canonical tag pointing to a different URL (the page is treated as a duplicate)
- Page returns a non-200 status code when the crawler actually visits it
- Thin or duplicate content that the engine decides doesn’t merit indexing
- Site-level trust/authority signals too low (brand new domain, no backlinks)
The diagnostic here is Bing Webmaster Tools → URL Inspection. If a submitted URL appears in the submission history with a 200 response but isn’t indexed, check the URL Inspection output. It will tell you exactly why the crawler didn’t index it after the notification was received.
lastmod timestamps and high-quality internal linking remain the primary discovery signals.How to Monitor IndexNow So You Know When It Breaks Again
IndexNow implementations fail silently more often than any other technical SEO tool. The key file gets overwritten during a plugin update. A hosting migration loses the file. A CDN caching configuration change blocks access. None of these events produce notifications — you only discover the failure when you manually check the submission history and notice weeks of 403s.
Three things to set up now:
- External uptime monitoring for the key file URL. Services like UptimeRobot (free tier available) can monitor any URL and alert you if it returns anything other than 200. Set up a monitor for
https://yourdomain.com/{yourkey}.txt. If that URL ever starts returning 404, you’ll know immediately instead of in three weeks. - Weekly audit of Bing Webmaster Tools → URL Submission. This is the ground truth for whether IndexNow submissions are landing. A healthy implementation shows consistent 200 responses for every URL you publish. If you see the submission history go quiet — either no submissions showing up, or a sudden shift to 403 — something has broken.
- Log the HTTP response code from every IndexNow submission on your server side. If you’re using a custom implementation or have developer access, write the response code to a log file with a timestamp. This gives you a searchable history that plugin UIs typically don’t preserve.
IndexNow Is Only as Good as Your Monitoring
The gap between “I have IndexNow set up” and “IndexNow is working” is where most implementations quietly live. The protocol itself is reliable. The failure points are all in the plumbing around it: key files that get overwritten, rate limits that silently discard submissions, subdomain mismatches that nobody thinks to check because the plugin says green.
Every error in this guide has the same underlying fix: verify at the actual API response level, not at the plugin UI level. Open the submission history. Check Bing Webmaster Tools. Hit your key file URL in a browser. The tools exist to tell you exactly what’s happening — the only reason these errors persist for weeks is that most site owners never look at the output.
Once your implementation is genuinely healthy — not just configured, but verified — Bing’s URL submission report starts showing your published URLs within minutes instead of days. That speed advantage is real and compounds over time, especially for time-sensitive content. The work of getting there is mostly fixing things that broke silently before you noticed.
- 📄 IndexNow Official Documentation — canonical protocol specification and response codes
- 📄 IndexNow Official FAQ — rate limits, subdomain handling, key file requirements
- 🔧 Bing Webmaster Tools — IndexNow Submission — verify submissions, check URL history
- 📖 Google Indexing API — Google’s equivalent for eligible content types (not IndexNow-compatible)
- 🔧 Rank Math — Fix 403 with IndexNow — plugin-specific troubleshooting for WordPress