Your IndexNow Submission Didn’t Work. Here’s the Actual Reason Why.

SEOHACK DIAGNOSTIC

The SEO Reality Check

Ten fact-based questions on GEO/AI citations, schema, Core Web Vitals, and monetization — the stuff that actually moves rankings and revenue in 2026, not recycled 2019 advice. Answer honestly, no going back.

Q1 / 10
0 correct
CATEGORY
Question text
AUDIT COMPLETE
0% SCORE
— / 10 CORRECT

Answer review

Fix what you missed

IndexNow API Errors: Every Response Code Explained and Fixed (2026)
Technical SEO · IndexNow Protocol · 2026

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.

📅 Updated June 2026 ⏱ 14 min read 🔧 Practitioner-level
200 OK — Done
202 Pending verify
400 Bad format
403 Key invalid
422 Wrong domain
429 Too fast

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.

Your Server POST /indexnow IndexNow API api.indexnow.org Bing / MSN Indexes URL Yandex Indexes URL Seznam/Naver Indexes URL Key File /yourkey.txt POST verify HTTP code
Figure 1 — IndexNow request flow: your server POSTs a URL, the API verifies your key file, then fans out to all participating search engines simultaneously. The HTTP response code comes back before any indexing happens.

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:

  1. The API parses your request and checks that the required fields are present and properly formatted. If not → 400.
  2. The API looks up the key file at yourdomain.com/{yourkey}.txt (or the keyLocation you specified). If the file doesn’t exist, or the key string inside it doesn’t match → 403.
  3. 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.
  4. The API checks your submission frequency. Too many requests from your IP in too short a window → 429.
  5. 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

202
Accepted — Key Validation Pending
Appears on first submission or after key reset

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 official IndexNow documentation states this clearly: “URL received. IndexNow key validation pending.” The confusion arises because most SEO plugins display 202 with the same visual formatting as errors. It isn’t one — wait 24 hours and resubmit.

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

400
Bad Request — Invalid Format
The API understood what you sent, but it’s structurally broken

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.

Correct GET format https://api.indexnow.org/indexnow?url=https%3A//yourdomain.com/post-slug/&key=YOUR_KEY_HERE
Correct POST body (bulk submission)
{
  "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

  1. Test with a raw curl command rather than through a plugin, so you can see exactly what’s being sent.
  2. Validate your JSON at jsonlint.com if doing bulk POST submissions.
  3. Check that every URL in your array starts with https:// (not just http:// and not a relative path).
  4. Verify the Content-Type: application/json header is present on POST requests.
abc123def456.txt abc123def456 ← only this, nothing else no newline, no BOM, no quotes File name = your key + .txt File content = key string only (case-sensitive, exact match) BOM = instant 403 Watch for Windows text editors Hosted at: yourdomain.com/abc123def456.txt (root, publicly accessible)
Figure 2 — The IndexNow key file: filename equals key value plus .txt, content is only the key string. No BOM, no trailing newline. Windows Notepad adds a BOM by default — use Notepad++ or VS Code set to UTF-8 without BOM.

403 Forbidden — The Key File Problem You’re Probably Missing

403
Forbidden — Key Not Valid
Key file missing, inaccessible, or content mismatch

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 .txt files at root
  • The file was created successfully but a CDN is serving a cached 404 from before the file existed
  • Your .htaccess has a rule that denies access to files matching /*.txt for 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.

⚠️
Cloudflare users specifically: If you have Cloudflare’s CDN enabled and recently created the key file, Cloudflare may be serving a cached response for that URL path. Purge your cache for the key file URL specifically, then retest. There are documented cases of Cloudflare caching the initial 404 for the key file path and serving that cached 404 to the IndexNow API indefinitely.

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:

  1. 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 abc123 but 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.”
  2. Trailing newline or whitespace. Some editors automatically append a newline character. The key string must be the complete, exact, only content in the file.
  3. 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.
Terminal verification — run this from your server curl -I https://yourdomain.com/YOURKEY.txt

Should return HTTP/2 200 and the body should be exactly your key string, character for character.

Fix Sequence for 403

  1. Navigate directly to your key file URL in a browser. Confirm it returns the key string as plain text.
  2. 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.
  3. 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.
  4. 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.
  5. 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

422
Unprocessable Entity — Domain or Schema Mismatch
The API understood the request but can’t act on the URLs

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.txt but submitted URLs include http:// 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 host field in bulk POST doesn’t match the submitted URLs. In a bulk JSON submission, the host parameter must match the domain of every URL in the urlList array 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.
🔴
Multisite WordPress + IndexNow = 422 minefield. A WordPress multisite network with subdomains will generate a mix of URLs from different hosts. If a single plugin handles IndexNow for the entire network using one key from the main domain, every subsite submission triggers 422. Each subsite needs its own key file at its own root.

Fix Sequence for 422

  1. Identify which specific URLs are triggering the 422. The IndexNow History tab in your plugin will show you.
  2. Check whether those URLs come from a different subdomain than your key is registered for.
  3. For subdomain mismatches: create a separate key file at the subdomain’s root and configure each subdomain independently.
  4. For protocol mismatches: ensure all submitted URLs use https://. If your site has mixed content or redirects, fix canonical URLs first.
  5. For bulk POST submissions: verify the host field exactly matches the domain (no https:// prefix — just yourdomain.com).
SUBMISSION PATTERNS — SAFE VS. RATE-LIMITED ✓ Batched (safe) 50 9am 30 12pm 40 3pm 20 6pm ✗ Rapid-fire (→ 429) 429 → rapid burst Safe: batch changed URLs 2–4× per day via queue. Limit: 10,000 URLs per POST. Shared hosting risk: other sites on your IP can exhaust the per-IP quota. Check Retry-After header in the 429 response to know how long to wait.
Figure 3 — Batching IndexNow submissions is safer than per-publish pings at scale. The 10,000 URL POST limit sounds large, but the per-IP rate limit is a shared resource on shared hosting.

429 Too Many Requests — The Shared Hosting Problem Nobody Warns You About

429
Too Many Requests — Rate Limit Exceeded
Your IP is submitting faster than the protocol allows

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.

“I was getting 429 errors on a 12-page website. Turned out three WooCommerce stores on the same shared host had enabled IndexNow’s auto-submit and were blasting it on every product inventory update.”

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

  1. Stop automatic submissions immediately. Disable auto-submit in your plugin settings (Rank Math: Settings → Auto-Submit Post Types → deselect all).
  2. Check the Retry-After header in the 429 response — it tells you exactly how many seconds to wait before resubmitting. Most implementations ignore this header entirely.
  3. Wait the specified interval before any new submissions. On shared hosting, this might be several hours if other sites have also hit the limit.
  4. 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).
  5. 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.
  6. 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.
⚠️
Submit only genuinely changed URLs. Resubmitting URLs that haven’t changed wastes quota and accelerates rate limiting. A sensible IndexNow implementation tracks which URLs have been modified since the last submission and excludes unchanged pages entirely. Submitting the same stable URL three times a day because your plugin fires on every page load is a quota burn with zero indexing benefit.

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:

  • noindex meta 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.

ℹ️
Google doesn’t participate in IndexNow. As of mid-2026, Google continues to rely on its own Indexing API (restricted to specific content types like job postings and livestream event pages) and traditional crawling. IndexNow is primarily useful for Bing, Yandex, Seznam, and Naver. For Google, XML sitemaps with accurate lastmod timestamps and high-quality internal linking remain the primary discovery signals.
⚡ Diagnostic Quick Reference
400Check URL encoding & JSON syntax
403Verify key file at root URL directly
422Check subdomain & protocol match
429Stop auto-submit, check Retry-After
202Normal on first submission — wait 24h
200Accepted — check Bing WMT to confirm

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:

  1. 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.
  2. 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.
  3. 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.
Target metric: a healthy IndexNow implementation should maintain a 95%+ success rate (200 or 202 responses). Anything below that warrants investigation. If you’re tracking this and notice a gradual drift from 95% to 80%, something has changed — find it before it reaches 0%.
Key File Monitor UptimeRobot / BetterStack → Monitor /key.txt URL → Alert on non-200 → Check 5-min intervals Free tier sufficient Bing WMT Audit Weekly manual check → URL Submission report → Check response codes → Confirm URLs appear Ground truth source Server-Side Logging Custom implementations → Log code + timestamp → Alert on error spikes → Track success rate % Target: 95%+ success
Figure 4 — Three monitoring layers for IndexNow health. Key file accessibility monitoring catches 403 failures before they accumulate. Weekly Bing WMT audits confirm end-to-end delivery. Server-side logging gives you trends over time.

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.

Authoritative external resources