API errors

Fix "Error submitting page to IndexNow" (400, 403, 422, 429)

updated 2026-09-30
The symptom

Error submitting page to IndexNow.

TL;DR — the fix

A generic "Error submitting page to IndexNow" hides an HTTP status code from the IndexNow endpoint, and the code is the diagnosis. 403 means the engine couldn't verify your key: the key file at https://yourdomain/<key>.txt is missing, redirected, or doesn't contain exactly the key. 422 means a submitted URL isn't on the host the key belongs to. 400 is a malformed request. 429 is too many submissions too fast. 200 and 202 are both success; 202 only means the key is still being checked.

IndexNow has no dashboard that explains a failure, and most CMS plugins and site builders flatten every non-success response into one line of text. The information is in the HTTP status code the endpoint returned. If your plugin logs it, read it there; if it doesn't, submit one URL by hand (below) and read it yourself.

What each status code means

  • 200 OK: the URLs were received. Nothing to fix.
  • 202 Accepted: the URLs were received and the key is still being validated. Also a success; it usually settles into 200 on later submissions once the engine has fetched your key file.
  • 400 Bad Request: the request itself is malformed: invalid JSON, a missing host or key field, or a urlList that isn't an array of absolute URLs.
  • 403 Forbidden: the key could not be verified. This is the common one; see below.
  • 422 Unprocessable Entity: at least one URL doesn't belong to the host in the request, or the key doesn't match the format the protocol requires.
  • 429 Too Many Requests: you are submitting too often. Back off and batch.

Fixing a 403: the key file

Before an engine accepts a submission it fetches your key file to prove you control the domain. By default that file lives at the root: https://yourdomain.com/<key>.txt, and its entire content must be the key itself. Every 403 comes down to that fetch failing or returning the wrong thing.

  1. Open https://yourdomain.com/<key>.txt in a private browser window. It must load with HTTP 200, directly, without a redirect to a login page, a homepage or a 404 template.
  2. Check the body is the key and nothing else: no HTML wrapper, no BOM, no extra lines. A site builder that serves every unknown path through its page template will fail here even though the URL "works" in a browser.
  3. Check the key matches: 8 to 128 characters, letters, digits and hyphens only, identical in the file name, the file content and the key your plugin sends.
  4. If the file sits somewhere other than the root, the request must name it in keyLocation, and that location only authorises URLs at or below its own path.
  5. Make sure robots.txt, a firewall or a bot-protection layer isn't blocking the engine's crawler from fetching the file.
Check the key file in one step

The free IndexNow checker fetches your key file the way an engine does and tells you which of these conditions it fails: unreachable, redirected, not plain text, or not an exact match.

Fixing a 422: host mismatch

Every URL in one submission has to be on the host named in the request, and that host must be the one serving the key file. www.example.com and example.com are different hosts to IndexNow, and so are subdomains. Split a mixed list into one submission per host, each with a key file that host serves.

Fixing a 429: rate limiting

Send changed URLs in batches rather than one request per URL, and only when a page actually changes. A plugin that pings on every save, or re-submits the whole sitemap on a schedule, is the usual cause. Wait before retrying; resubmitting immediately keeps you throttled.

Submit one URL by hand to see the real code

curl -i -X POST "https://api.indexnow.org/indexnow" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{"host":"www.example.com","key":"YOUR_KEY","keyLocation":"https://www.example.com/YOUR_KEY.txt","urlList":["https://www.example.com/page"]}'

The first line of the response is the status code. Compare it against the list above; the fix for your plugin's error is the fix for that code.

IndexerNow checks that your IndexNow key file is live before it submits anything, so a 403 is caught before it is spent, and records what each engine did with every URL instead of one line of error text.

Submit through IndexNow

Frequently asked

What does "Error submitting page to IndexNow" mean?

It means the IndexNow endpoint answered with something other than 200 or 202, and whatever sent the request reported it without the status code. Find the code (in the plugin's log, or by submitting one URL with curl) and it tells you the cause: 403 is the key file, 422 is a host mismatch, 429 is rate limiting, 400 is a malformed request.

Is a 202 response an error?

No. 202 Accepted means the URLs were received while the engine is still validating your key. It is a success; you don't need to resubmit.

Why does my IndexNow key file work in the browser but still return 403?

Usually because the browser is showing you a page, not the file. Site builders often serve unknown paths through a template, so the key appears inside HTML, or the URL redirects first. The engine needs a direct 200 whose body is exactly the key. Fetch it with curl -i to see what an engine sees.

Does IndexNow submit to Google?

No. Google does not participate in IndexNow. Submissions reach Bing, Yandex, Seznam, Naver and the other participating engines, which share them with each other. For Google you need the Indexing API or Search Console.

Further reading

Related fixes