IndexNow URL notifications
Generate a local IndexNow key, verify its public key file and submit a bounded list of changed URLs without claiming they were indexed.
IndexNow tells participating search engines that a URL was added, updated, or deleted. It is a change notification, not an indexing request or a ranking signal you can verify from the response.
Set up one host
Choose the public asset directory that your site deploys at its root:
seo indexnow setup --site https://example.com --output ./public
The command generates a key, writes <key>.txt into that directory, and stores
the key locally. It does not deploy the file. Deploy the site, then check the
public file:
seo indexnow verify --site https://example.com
The local key mapping is stored in the system keychain when available, with a
private file fallback. seo indexnow status lists configured hosts and public
key locations. seo indexnow remove --site https://example.com removes the
local mapping but leaves the deployed file alone.
Validate before notifying search engines
Start with a dry run:
seo indexnow submit \
--site https://example.com \
--url https://example.com/changed-page \
--dry-run \
--json
The dry run validates the key, host, URLs, duplicates, and local limits. It does not fetch the key file or contact IndexNow.
Remove --dry-run after the key file is public and the URLs have genuinely
changed:
seo indexnow submit \
--site https://example.com \
--url https://example.com/changed-page
You can also pass comma-separated --urls or a newline-delimited --file.
Each run accepts at most 1,000 unique URLs, and every URL must belong to the
configured host. The command verifies the public key file before it sends the
bounded JSON request to the fixed IndexNow endpoint.
Agents and CI can set SEO_INDEXNOW_KEY for one process instead of saving a
key. Keep JSON mode explicit so the command never prompts:
SEO_INDEXNOW_KEY=<key> seo indexnow submit \
--site https://example.com \
--file ./changed-urls.txt \
--dry-run \
--json
Read the response accurately
HTTP 200 means the URLs were received. HTTP 202 means the URLs were received while key validation is pending. Neither response proves crawling, indexing, ranking, or traffic.
The implementation follows the IndexNow protocol documentation. The local 1,000 URL limit is deliberately lower than the protocol maximum so one accidental command cannot send a very large update.