Founding customers get 50% off the first year. Claim it →
← all posts

Regulatory news monitoring with RSS and a webhook

November 1, 20267 min readFeedmarkdown#regulatory-monitoring#google-news-rss#webhook#media-monitoring#rss

Regulatory monitoring means tracking what regulators announce and change so you can react. This post covers the cheap end of it: a regulator's own RSS feed plus a Google News query, sent to a webhook. It is a news-awareness feed, not a compliance product, and it is not legal advice. For the method (pull, count noise, cut noise), read media monitoring on a small budget. This post adds one measurement that guide lacks.

On 2026-11-01 we compared 25 SEC press releases with Google News coverage of the same announcements. We tried the FTC first, and that failed in a useful way. Feedmarkdown cannot poll a regulator's own RSS today, so you poll that part yourself.

What regulatory monitoring is (and is not)

There are three layers. Official publications (press releases, dockets, filings) are the source. Press coverage is what outlets and law firms say about them. Change management is the paid work of mapping a rule change to your obligations.

Regulatory news monitoring, the kind in this post, covers the second layer, and sometimes a pointer to the first. A small policy or comms team usually needs one thing: know within a day, then read the primary document. If a missed rule costs you money, hire counsel or buy a RegTech product.

Monitor regulatory changes from two feeds

The two inputs are the regulator's RSS feed and a Google News search feed. The search URL takes q, hl, gl and ceid, and when: and site: work inside q (see Google News RSS search operators).

# Official feed
curl -A "YourApp/1.0" "https://www.sec.gov/news/pressreleases.rss"

# Google News search feed, last 30 days
curl "https://news.google.com/rss/search?q=%22SEC+charges%22+when%3A30d&hl=en-US&gl=US&ceid=US:en"

A note on robots.txt: news.google.com/robots.txt has Disallow: / for User-agent: * and a short allow-list that does not include /rss/. We fetched the RSS URLs anyway: four one-off requests, every response cached, no loops. www.google.com/robots.txt also disallows /alerts/ for *, so Google Alerts RSS feeds fall under the same question. Whether you run this on a schedule is your call.

Pick a regulator whose coverage matches your query

We started with the FTC and "click to cancel". The regulator's feed failed: ftc.gov/feeds/press-release.xml returned 404 to a script twice on 2026-11-01 (13:45 and 13:46 UTC), although the FTC's RSS page still lists it. We stopped asking.

The Google News query FTC "click to cancel" returned 100 items (the feed caps out at about 100), dated 2024-10-16 to 2026-10-31, from 77 outlets. 37 headlines name the FTC, and the latest is dated 2026-08-23. Of the 12 items dated 2 to 31 October, none names the FTC. Nine name New York City's rule, one names state laws and two do not say. Ten of the 12 carry a date-only timestamp. The chart's October bar shows 17 because it also counts 5 items dated 1 October.

Bar chart of the FTC click to cancel Google News pull by month: headlines naming the FTC run through August 2026 and stop, while New York City rule coverage dominates July and October 2026, pulled 2026-11-01

The chart splits the 100 items by headline keywords ("other" is 29 items). For the federal rule's status, the FTC's Negative Option Rule page, read on 2026-11-01, lists an advance notice of proposed rulemaking dated March 13, 2026. The lesson is about the query: recent "click to cancel" coverage was about other rule-makers, so a query for the federal rule would have gone quiet while the topic stayed busy.

How soon did outlets cover two SEC releases?

The SEC feed returned 200 with 25 items, 2026-09-11 to 2026-10-30. We ran the "SEC charges" query once (29 items, 22 sources) and a headline query for two items. Then we tried to match all 25 official items to every cached outlet item. Google's links are redirects, so URL matching is out. The rule was the case wording from the official headline.

Eleven official items fall inside the 30-day query window. Two have outlet copies with a real time, one has a date-only copy, and eight have no copy in what we pulled. Only three of the eleven got a headline query, so "no copy found" is not "never covered". The gap is the first outlet pubDate with a time, minus the official pubDate. All times are UTC.

Official item Official time First outlet copy with a time Gap Copies found (query)
Two Entities Charged in $130 Million Fraud Scheme 2026-10-29 16:42 Securities.io, 18:52 2 h 10 min 7 (broad)
SEC Announces Fiscal Year 2027 Examination Priorities 2026-10-23 14:10 Securities.io, 14:12 2 min 20, 4 date-only (headline)

Strip chart of outlet copies by hours after the official SEC release: seven copies of the 130 million dollar case within 24 hours, and twenty copies of the exam priorities release spread over about 7 days, tested 2026-11-01

n=2, so we make no claim about how late outlets are. The chart shows the spread: copies of one release kept arriving for about 7 days. The third item, "Seeks Final Judgment Against Former Western Asset Co-CIO Ken Leech" (2026-10-06 20:30), has one copy, from planadviser, dated 2026-10-07 with no time. Its headline omits the name, so we matched it by case wording. The broad query missed it, because the headline says "Seeks Final Judgment" and not "charges".

Two limits apply:

  • The pubDate is what Google's feed states. It may be the outlet's publish time or when Google indexed the story, and we did not measure listing latency.
  • 15 of the 29 items in the broad pull carry a timestamp of exactly 07:00:00 or 00:00:00 GMT, which looks like a date only. We left those out of every gap. In the chart they are hollow diamonds at the placeholder time.

Only 8 of the 29 broad-pull items matched a release in the 25-item feed. The other 21 covered cases we could not match to it, and some may be older releases. Coverage also repeats: 7 copies of the $130 million case, 20 headlines for the exam priorities. For repeats see duplicate stories in Google News RSS and matching headlines.

What a feed will not tell you

A feed gives you a headline, a date and a link. It does not give you:

  • the primary document, the docket or the effective date;
  • items outside the query or past the 100-item cap;
  • an audit trail, or any control over Google's ranking.

If a regulator publishes no feed, watch the page with a change monitor instead (see Google Alerts alternatives). Counsel or a paid RegTech product is the right answer when a miss is expensive. Again: this is not legal advice.

What we did not test: Google Alerts for this topic, other regulators, end-to-end delivery speed, and anything older than 30 days.

Send new items to a webhook

A poller needs a seen-list and a signed POST. This stdlib script does both for the official feed. It marks an item seen only after a 2xx, so failures retry on the next run:

import hashlib, hmac, json, os, urllib.request
import xml.etree.ElementTree as ET

FEED = "https://www.sec.gov/news/pressreleases.rss"
TARGET = os.environ["WEBHOOK_URL"]
SECRET = os.environ["WEBHOOK_SECRET"]  # YOUR_WEBHOOK_SECRET
STATE = "seen.json"

seen = set(json.load(open(STATE))) if os.path.exists(STATE) else set()
req = urllib.request.Request(FEED, headers={"User-Agent": "YourApp/1.0"})
for it in ET.fromstring(urllib.request.urlopen(req, timeout=15).read()).iter("item"):
    guid = it.findtext("guid") or it.findtext("link")
    if guid in seen:
        continue
    body = json.dumps({"title": " ".join(it.findtext("title").split()), "url": it.findtext("link")}).encode()
    sig = "sha256=" + hmac.new(SECRET.encode(), body, hashlib.sha256).hexdigest()
    post = urllib.request.Request(TARGET, body, {"Content-Type": "application/json", "X-Signature": sig})
    urllib.request.urlopen(post, timeout=15)
    seen.add(guid)
    json.dump(sorted(seen), open(STATE, "w"))

RSS to webhook options compares this with automation tools and hosted services. For the Alerts route, see Google Alerts RSS feeds and setting up Google Alerts. Monitoring competitors with Google News RSS is the same loop for companies.

Feedmarkdown posts each new article as JSON. Below is a locally built sample, not a captured delivery: the title and date come from the $130 million row, markdown is shortened and the ids are placeholders.

{"title":"Two Entities Charged in $130 Million Fraud Scheme That Used False SEC Filings to Boost Investor Confidence","url":"https://www.sec.gov/newsroom/press-releases/2026-110-two-entities-charged-130-million-fraud-scheme-used-false-sec-filings-boost-investor-confidence","source":"example outlet","author":"","published_at":"2026-10-29T16:42:37Z","markdown":"SHORTENED FOR THE POST ...","id":"art_EXAMPLE","feed_id":"feed_EXAMPLE","source_id":"src_EXAMPLE"}

The first six fields (title, url, source, author, published_at, markdown) are the stable contract. id, feed_id and source_id are present but not promised. The signature header is an HMAC-SHA256 over the raw body. For this sample, with the secret YOUR_WEBHOOK_SECRET:

X-Feedmarkdown-Signature: sha256=817d78e0c5c877319f9cdd9227e67125794b8129eac0526f034f817eb146f3eb

Verify it against the bytes you receive, before parsing. The signature has no timestamp, so it does not protect against replay.

Where Feedmarkdown fits

Feedmarkdown runs the Google News part. It does not read the SEC or FTC feeds, so keep polling those yourself. For the topic query, create one google_news source and a webhook feed over it with the dashboard, or the API:

curl -X POST https://api.feedmarkdown.com/v1/source \
  -H "Authorization: Bearer $FEEDMARKDOWN_API_KEY" -H "Content-Type: application/json" \
  -d '{"kind":"google_news","name":"SEC charges","config":{"query":"\"SEC charges\" when:30d","lang":"en","country":"US"}}'

curl -X POST https://api.feedmarkdown.com/v1/feed \
  -H "Authorization: Bearer $FEEDMARKDOWN_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"SEC watch","source_ids":["SOURCE_ID"],"delivery":"webhook","webhook_url":"https://example.com/hook","dedup_scope":"feed"}'

Each new story arrives once, as full-text Markdown in a signed POST, with copies of the same story dropped by headline before any scraping. Prefer to pull instead? Set delivery to pull for a JSON Feed or Atom feed. A google_alerts source takes an alert's RSS URL, which Google Alerts RSS feeds and setting up Google Alerts explain. Starter allows 10 sources with a check every 6 hours (Pro checks hourly), so it fits "know by tomorrow" and not minute-level alerting. Start a 7-day trial at dash.feedmarkdown.com.