Google has Search Console for submitting new pages, but Bing and Yandex have something simpler: IndexNow. You make one HTTP request naming a URL, and both search engines pick it up — usually within hours. No dashboard, no per-URL form, just a POST with a key. For a small tool site where I publish new pages in batches, it is the fastest way I know to get noticed.
The protocol is refreshingly primitive. First you generate a random key — a 32-character hex string is fine — and put it in a text file at the root of your site, e.g. https://example.com/2f8a1c...txt, with the key as the file's only content. That file is your proof of ownership. Then every time you have new or changed URLs, you POST a JSON payload to https://api.indexnow.org/indexnow:
function indexnow_submit($urls) { $key = trim(file_get_contents(__DIR__ . '/indexnow-key.txt')); $host = 'www.ramrom.io'; $payload = json_encode([ 'host' => $host, 'key' => $key, 'keyLocation' => 'https://' . $host . '/' . $key . '.txt', 'urlList' => $urls, ]); $ch = curl_init('https://api.indexnow.org/indexnow'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => $payload, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 15, ]); $resp = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); error_log('indexnow: HTTP ' . $code . ' for ' . count($urls) . ' urls'); return $code === 200; } That is genuinely the whole integration. One endpoint, one key file, one response code. Compare that with the dance of OAuth tokens and API quotas, and you see why it fits a plain PHP site on shared hosting.
A few things I learned running this on ramrom.io:
One key per host. The host field must match the site, and the key file must be fetchable at https://yourhost/<key>.txt. I keep the key in a tiny text file outside the web root (indexnow-key.txt in the API folder) and the public key file at the root is just a static copy of the same string. Two copies, zero database.
Batch the URLs. You can send up to 10,000 URLs per request, so do not fire one request per page. When I published three new guide pages at once, one call carried all three URLs plus the sitemap touch-ups. The limit you actually hit is politeness: send in small batches, once per deploy, not per page view.
Submit from the deploy script, not from the page. The temptation is to ping IndexNow inside the page controller every time someone visits a new page. That wastes requests and couples your SEO to your visitors. My deploy checklist has a small CLI step — a PHP script that takes the changed URLs and calls the function above. Deterministic, logged, and never fired twice.
A 202 means "accepted", not "indexed". The API returns HTTP 200 (or 202) when the submission is well-formed. That is a handshake, not a guarantee. The engines still crawl on their own schedule; IndexNow just moves your URLs to the front of the queue. In practice I have seen new pages discovered within a few hours, which beats waiting for the next organic crawl pass by days or weeks.
Keep your key safe-ish. It is not a password in the strict sense — anyone can read the key file, since that is the whole verification mechanism — but if you rotate it, update both copies at once. A mismatch means silent rejections.
Honest limits: IndexNow only reaches Bing, Yandex, and the search engines that joined the protocol (Seznam, Naver, Yep). Google is not part of it, so this does not replace a Google sitemap or Search Console. For a small site it is the cheapest piece of SEO plumbing I have: one static key file, one thirty-line function, one log line per deploy.
Nothing here requires a framework, a queue, or an account beyond the key itself. On a shared host where every extra dependency is a liability, that is exactly the right amount of machinery for telling the rest of the search web that new pages exist.


