Methodology
How the wire is built
From a regulator's website to a Discord channel in six steps, every thirty minutes, with the failure modes named. This page exists so you can decide how much to trust what you read here.
1. Poll
Each bot fetches its sources in parallel — RSS feeds where the regulator offers one, JSON APIs such as openFDA, and for the regulators that publish only an HTML list, the listing page itself with a fixed selector recipe. Every fetch carries a ten-second cap. 24 sources in total; the full list is on the agencies page.
2. Filter at ingest
Two sources are noisy by design and are keyword-filtered before anything else happens: the FTC's consumer-protection feed (kept to payments, lending, credit, crypto and data-broker matters) and the California Attorney General's news feed (kept to privacy and AI). Everything else passes through whole.
3. Deduplicate
Each item is keyed on the regulator's own identifier. Seen keys are skipped for seven days (thirty for FDA recalls, whose openFDA classification lands late). A material change to a known notice produces a new content hash and is recorded as an update rather than dropped.
4. Summarize and label
A language model writes the headline, synopsis and tags and assigns a severity — urgent, notice or info — using rules written per domain. Calls are capped at ten seconds and run in parallel; a cycle processes at most eight new notices so a cold start never floods a channel, and the backlog drains over the following cycles. If the model fails, a templated summary from the notice's own title is used. Summaries are machine-written and are flagged as such everywhere.
5. Archive
Every alert is stored permanently and published on this site within minutes: on its vertical's hub, in the rolling this week page, in the weekly and monthly archives, and on its agency's page. The public JSON and RSS feeds are generated from the same store.
6. Deliver
Subscribed servers with an active Discord subscription receive an embed for every alert matching their /filter. Servers without one receive a weekly digest instead. Every embed carries the disclaimer in its footer; the code refuses to send one without it. A heartbeat is written after each cycle, and /status.json reports a fault if any domain has gone quiet for more than two hours.
Data rights and attribution
openFDA data is released by the FDA under CC0 and the FDA asks that results be treated as unvalidated; RegPing does. Other sources are public government publications quoted and linked on a fair-use basis, attributed to the issuing agency on every alert. The Hunton privacy blog, used as an aggregator for multi-state actions, is quoted by headline and linked.
What can go wrong
- A regulator changes its page layout and a listing scraper returns nothing. The status page shows the domain going stale; the other sources are unaffected.
- A summary mischaracterizes a notice. The link to the original is always one click away; corrections go to michael@complianceghost.com.
- A source publishes without dates (some state cannabis pages do). Those records are filed under the time RegPing first saw them.
Questions people ask
How fresh is an alert?
Sources are polled every thirty minutes. A notice usually posts within an hour of appearing on the regulator's site, subject to the regulator's own delays — openFDA classifications, for example, trail the first recall notice by weeks.
What happens when a source is down?
Each source is fetched independently with a ten-second cap. One failing source is logged and skipped; the others proceed. Failed Discord deliveries are retried on later cycles for up to a day.
How are duplicates handled?
Every notice gets a stable key from the regulator's own identifier (a GUID, a K-number, a recall number, a URL). A key already seen is skipped; a materially changed notice gets a new content hash and is treated as an update. FDA recalls keep a thirty-day window because classification arrives late.
Who writes the summaries?
A language model (Anthropic's Claude), given the notice text and a fixed schema: an 80-character headline, a 280-character synopsis, tags, and a severity from a rule set per domain. If the model times out, a templated summary built from the notice's own title is used instead — never silence.
What do the severity labels mean?
Urgent: penalty-bearing enforcement, rules effective immediately, Class I recalls, death or injury reports. Notice: proposed rules, guidance, Class II/III recalls, notable clearances. Info: routine or administrative items. Labels are triage hints, not legal categories.