IndexNow Publish Submitter and Receipt Ledger avatar

IndexNow Publish Submitter and Receipt Ledger

Pricing

from $4.00 / 1,000 url submitteds

Go to Apify Store
IndexNow Publish Submitter and Receipt Ledger

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

kingii98

Maintained by Community

Actor 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

FieldTypeDefaultMeaning
hoststringThe domain that owns the URLs. Must be a public host, not localhost or a private address.
urlsstring[]The pages to submit. 1 to 10000 entries. Every URL must be on host.
indexNowKeystringThe key you host at https://<host>/<indexNowKey>.txt. 8-128 letters, digits, or hyphens.
endpointsstring[]api.indexnow.org, www.bing.com/indexnow, yandex.com/indexnowThe IndexNow endpoints to submit to. Up to 10.
preflightbooleantrueCheck each URL before submission: HTTP status, robots.txt, meta robots, and canonical tag.
recheckAfterHoursnumber0Reserved for a later scheduled run. The Actor itself does not wait or schedule; use previousReceiptDatasetId on a later run to act on it.
previousReceiptDatasetIdstringOptional. 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 its preflight result, its eligibility (ELIGIBLE, BLOCKED_NOINDEX, BLOCKED_ROBOTS, BLOCKED_CANONICAL_ELSEWHERE, or BLOCKED_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, with stillIndexable and changedSinceSubmission.

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. See src/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.txt is 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 --dev
uv run pytest
uv 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.