IndexNow Publish Submitter and Receipt Ledger
Pricing
from $4.00 / 1,000 url submitteds
IndexNow Publish Submitter and Receipt Ledger
Submits published URLs to IndexNow endpoints (Bing, Yandex) with a preflight check and a receipt ledger. HTTP only, no login, no paid API.
Pricing
from $4.00 / 1,000 url submitteds
Rating
0.0
(0)
Developer
kingii98
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
This Actor tells Bing and Yandex about new or changed pages on your site, through the IndexNow protocol. It checks each page first, submits the ones that qualify, and writes a receipt for every URL and every endpoint.
It is HTTP only. It does not use a browser, a proxy, an account, or a paid API.
Before you run it
You must host an IndexNow key file on your own domain, at:
https://<host>/<indexNowKey>.txt
The file body must be exactly the key, with no extra text. The Actor checks this file first. If the file is missing or does not match, the run stops and reports the problem; it does not submit any URLs.
Input
| Field | Type | Default | Meaning |
|---|---|---|---|
host | string | — | The domain that owns the URLs. Must be a public host, not localhost or a private address. |
urls | string[] | — | The pages to submit. 1 to 10000 entries. Every URL must be on host. |
indexNowKey | string | — | The key you host at https://<host>/<indexNowKey>.txt. 8-128 letters, digits, or hyphens. |
endpoints | string[] | api.indexnow.org, www.bing.com/indexnow, yandex.com/indexnow | The IndexNow endpoints to submit to. Up to 10. |
preflight | boolean | true | Check each URL before submission: HTTP status, robots.txt, meta robots, and canonical tag. |
recheckAfterHours | number | 0 | Reserved for a later scheduled run. The Actor itself does not wait or schedule; use previousReceiptDatasetId on a later run to act on it. |
previousReceiptDatasetId | string | — | Optional. When set, the Actor runs in recheck mode: it re-reads the URLs from that dataset and reports whether they are still indexable. It does not submit new URLs in this mode. |
Output
The run dataset holds these record types:
keyFileCheck: one record, the result of checking the key file.endpointHandshake: one record for each IndexNow endpoint the Actor called.urlReceipt: one record for each URL, with itspreflightresult, itseligibility(ELIGIBLE,BLOCKED_NOINDEX,BLOCKED_ROBOTS,BLOCKED_CANONICAL_ELSEWHERE, orBLOCKED_NOT_200), and the endpoints it was submitted to.summary: one record with counts of submitted, blocked, and endpoint-rejected URLs.recheck: in recheck mode, one record for each re-checked URL, withstillIndexableandchangedSinceSubmission.
What "verify" means here
This Actor cannot prove that Google, Bing, or Yandex indexed a page; that
needs a paid, account-based API. The preflight and recheck steps check
only what a plain HTTP request can check: the page returns 200, it is
not marked no-index, robots.txt allows it, and its canonical tag (if
any) points back at itself. Endpoint acceptance means the endpoint
returned a success status for the batch; it does not mean the URL is
indexed.
Guardrails
- Rejects any URL, endpoint, or host that is not a public HTTP(S)
target: no
localhost, no private or reserved IP address (checked by literal address and by DNS resolution), no other scheme. Seesrc/indexnow_submitter/urlsafety.py. - Every input list is bounded: up to 10000 URLs, up to 10 endpoints.
- Every HTTP GET is bounded: a timeout, a redirect limit with a safety check on each hop, and a response-size limit.
- Preflight and recheck run with bounded concurrency (10 requests at a time).
robots.txtis fetched once per host and reused for the whole run.
Billing
Pay-per-event, charged from the run itself:
url-submitted— one event for each URL actually sent to the IndexNow endpoints (blocked and rejected URLs are not charged).url-rechecked— one event for each URL a later verification run re-reads.host-key-verified— one event per run once the key file check passes. A run that stops at a failed key file check charges nothing.
Default fixture
.actor/default_input.json points at example.com, the IANA reserved
example domain, which is always public and always available. It does
not host an IndexNow key file, so a run against it demonstrates the
key-file guardrail: the run succeeds without submitting anything and
writes a keyFileCheck record plus a zero-count summary with status
KEY_FILE_NOT_VERIFIED. To see a full submission, run with your own
host, urls, and indexNowKey.
The input schema gives host, urls, and indexNowKey the same values as
defaults. A run started with an empty input therefore takes these defaults
and succeeds, instead of a rejection for a missing required field.
Development
uv sync --devuv run pytestuv run ruff check .
src/indexnow_submitter/runner.py holds the pure run logic (run_submit,
run_recheck), independent of the Apify SDK, so it runs under pytest
without a platform connection. main.py is the thin Actor entrypoint
that wires Apify input/output to that logic.
