RSS
Poll up to 100 RSS / Atom feeds per trigger with conditional GET, dedup, and OPML import.
The RSS trigger polls one or more RSS / Atom feeds at a configurable cadence and fires the workflow once per new item. Up to 100 feeds per trigger; conditional GET (If-None-Match + If-Modified-Since) keeps the bandwidth and downstream-fire bill low.
How to configure
- Paste up to 100 Feed URLs, one per line — RSS 2.0, Atom 1.0, and most well-formed legacy variants are supported. The trigger validates each URL on save by fetching it once; an invalid feed surfaces a save-time error rather than silently failing later. For private feeds (members-only blogs, internal Confluence exports), enable Basic Auth and supply credentials — they apply to every feed in the trigger.
- On the first poll the trigger baselines (no historical fires) unless you set Initial backfill to
last_10/last_50. New items dedupe on your chosen Deduplication key:guid(recommended) survives URL changes;linkworks for feeds without GUIDs;title_pubdateis the fallback for broken feeds that recycle GUIDs. - Each tick uses conditional GET (
If-None-Match+If-Modified-Since) — feeds returning304 Not Modifiedconsume zero downstream-fire budget. If Respect feed TTL is on and the feed declares e.g.<ttl>60</ttl>, the platform slows the cadence to honor it. Cadence default is 15m. - Read item fields via
<rss1.title>,<rss1.link>,<rss1.content>,<rss1.isoDate>,<rss1.feedUrl>. Verify by adding a known-active feed (e.g. a fast news feed) and waiting one cadence — or force an immediate poll per the triggers runbook:
curl -X POST -H "x-scheduler-key: $POLL_DISPATCH_SECRET" \
'https://mybotbox.com/api/webhooks/poll/dispatch?tier=15m'Authentication
Public feeds require no auth. For private feeds, the trigger supports HTTP Basic Auth (username + password) — the same credentials are sent to every feed listed in the trigger. Use separate triggers if different feeds need different credentials.
Settings reference
| Field | Default | Notes |
|---|---|---|
| Feed URLs | (required) | Up to 100, newline-separated. OPML import button supported. |
| Private feeds need Basic Auth | off | Toggles the username/password fields. |
| Item filter | (empty) | Case-insensitive substring or /regex/. Matches title + content. |
| Initial backfill | skip | skip, last_10, or last_50 items on first poll. |
| Deduplication key | guid | guid, link, or title_pubdate (broken-feed fallback). |
| Poll frequency | 15m | 5m / 15m / 30m / 60m. |
| Respect feed TTL | on | Honor <ttl> element if present. |
| Paused | off | Stop polling without deleting the trigger. |
Sample payload
{
"title": "Anthropic announces Claude 5 Sonnet",
"link": "https://www.anthropic.com/news/claude-5-sonnet",
"guid": "https://www.anthropic.com/news/claude-5-sonnet",
"pubDate": "Sat, 26 Apr 2026 20:00:00 +0000",
"isoDate": "2026-04-26T20:00:00.000Z",
"contentSnippet": "Today we are releasing Claude 5 Sonnet, our fastest and most capable model in the Sonnet line.",
"content": "<p>Today we are releasing <strong>Claude 5 Sonnet</strong>, our fastest and most capable model in the Sonnet line.</p>",
"author": "Anthropic",
"creator": "Anthropic Editorial",
"feedUrl": "https://www.anthropic.com/news/rss.xml",
"feedTitle": "Anthropic News"
}Verifying a poller
RSS triggers are poller-only — there is no webhook to POST against. Force-run the dispatcher and watch the workflow log. See apps/sat/tests/staging/triggers/pollers/README.md. For a 15m-tier RSS trigger:
POLL_DISPATCH_SECRET=$(gcloud secrets versions access latest \
--secret=poll-dispatch-secret --project=ystudio-core)
curl -X POST -H "x-scheduler-key: $POLL_DISPATCH_SECRET" \
'https://mybotbox.com/api/webhooks/poll/dispatch?tier=15m'Troubleshooting
- Save-time error on a feed URL — the validator could not parse the response as RSS / Atom. Confirm the URL renders feed XML in your browser; some sites serve HTML at the root and need
/feed/or/rss.xml. - Trigger fires too often — the source feed is recycling GUIDs (republishing the same item). Switch the Deduplication key to
title_pubdateto compensate. - Trigger never fires after first save — initial backfill defaults to
skip. Wait for a fresh item, or set backfill tolast_10. consecutive_failuresrising infeed_poller_state— usually 401 from a private feed (rotated password) or 410 from a removed feed. Inspectlast_error.