Feed Autodiscovery, Self-Link, and Serving-Header Publish Gate avatar

Feed Autodiscovery, Self-Link, and Serving-Header Publish Gate

Pricing

$4.00 / 1,000 site checkeds

Go to Apify Store
Feed Autodiscovery, Self-Link, and Serving-Header Publish Gate

Feed Autodiscovery, Self-Link, and Serving-Header Publish Gate

Checks that each site advertises its RSS, Atom, or JSON feed, that the feed resolves and is served correctly, and that it points back to the site.

Pricing

$4.00 / 1,000 site checkeds

Rating

0.0

(0)

Developer

kingii98

kingii98

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

This Actor is a stateless gate for feed publishers. Run it before and after a site deploy. It checks the path from the HTML page to the feed, not only the feed body.

What it checks

For each site, the Actor runs these checks. You can select a subset with checks.

CheckWhat it doesReason codes
discoveryReads <link rel="alternate"> in the page. Feed types: RSS, Atom, JSON.SITE_UNREACHABLE, SITE_HTTP_ERROR, NO_FEED_DISCOVERED, FEED_NOT_ADVERTISED, BLOCKED_TARGET
feed_statusFetches each feed. Records the HTTP status and the redirect chain.FEED_UNREACHABLE, FEED_HTTP_ERROR, TOO_MANY_REDIRECTS, FEED_TOO_LARGE, BLOCKED_TARGET
content_typeCompares the served Content-Type with the detected format.CONTENT_TYPE_MISSING, CONTENT_TYPE_MISMATCH
formatDetects RSS 2.0, Atom 1.0, or JSON Feed 1.0/1.1.FORMAT_UNKNOWN
self_linkCompares atom:link rel="self" (or feed_url) with the final fetched URL.SELF_LINK_MISSING, SELF_LINK_MISMATCH
home_linkCompares the channel/home link host with the site host. www. is ignored.HOME_LINK_MISSING, HOME_HOST_MISMATCH
item_backlinksFetches up to 5 item pages (HTML head only). Checks that each page advertises the feed.ITEM_UNREACHABLE, ITEM_NO_BACKLINK

Each failed check has one reason code for each feed. A check that did not run has the state skipped.

Accepted Content-Type values: RSS: application/rss+xml, application/xml, text/xml. Atom: application/atom+xml, application/xml, text/xml. JSON Feed: application/feed+json, application/json.

Input

FieldDefaultNotes
sites2 public sites1 to 100 public http(s) URLs. The Actor removes duplicates.
feedUrls{}Map of site URL to at most 2 explicit feed URLs.
checksallSubset of the check names above.
maxConcurrency51 to 10.
requestTimeoutSecs153 to 60.

An empty input {} runs with the defaults and succeeds.

Output

One dataset row for each site. Main fields: site_url, final_site_url, site_status, discovered_feeds, feeds, checks, failures, passed. Each entry in feeds has the feed URL, HTTP status, redirect chain, content_type, format, self-link data, home-link data, and sampled_items. Each entry in failures has check, code, and feed_url.

A failed gate is a normal result. The run still ends as SUCCEEDED. Read passed in the dataset to decide whether your CI (continuous integration) job passes. The status message shows the totals. The run fails only for a real malfunction of the Actor.

Limits and safety

  • 1 MB per HTML page. 2 feeds per site. 2 MB per feed. 5 item pages per feed. The Actor reads at most 256 KB of each item page.
  • At most 5 redirects for each request.
  • The Actor uses HTTP only. It does not run a browser.
  • The Actor rejects private, loopback, link-local, and reserved addresses. It checks the address of every redirect hop. Only ports 80 and 443 are allowed.
  • The Actor refuses feeds that contain a DTD (document type definition) or entity declarations. These feeds get FORMAT_UNKNOWN.
  • Known limit: the address check and the connection use two separate DNS lookups. A hostile DNS server could change its answer between them.

Pricing (pay-per-event)

The Actor calls Actor.charge for one event: site-checked. It charges once for each site checked. One event covers up to 2 feeds and 10 sampled item pages. The Actor does not charge for a site that has an invalid URL, a blocked private target, or an internal error. It charges for a site whose target is down, because it did check that site. The Actor stops when the charge limit is reached. The status message says so.

The pricing proposal is $0.004 for each site-checked event. Set the price in the Apify Console. This repository does not change pricing.

Development

uv run pytest
uv run ruff check .

Local run: apify run with .actor/default_input.json.