A Python script collects the records and draws the map. A language model helps with one step, matching names. I check every claim against the original filing and write the report.
| Step | What happens | Done by |
|---|---|---|
| Lobbyist declarations | Collected for each bill from the Iowa Legislature’s website. | Python script |
| Tax filings | Form 990s and their schedules, pulled for each organization. | ProPublica Nonprofit Explorer API |
| Clear name matches | Names that are exact or nearly exact across records are linked by rule. | Python |
| Hard name matches | Only pairs the scripts rate as uncertain reach the model. It gets the two names and what is already known about them, and answers one question: same group or not. I confirm each answer, and every decision is saved so the same pair is never decided twice. | Language model, then me |
| Network map | Drawn from a table of ties. Each tie carries its source link and the date it was pulled. A tie with no source is not drawn. | Python |
| Verification | Every claim is checked against the original filing. | Me |
| Summaries and report | Written by me, in a report template I built. | Me |
A company can file under an LLC name in one record and a trade name in the next, and nothing in either one says they’re the same company. A declaration might name Caesars Enterprise Services, LLC. A campaign finance record names Caesars Entertainment PAC. Linking the two is a matching question.
Scripts handle the clear cases, first by rule and then by fuzzy scoring. The language model sees only the pairs the scripts can’t settle. It judges the names it is handed and never supplies a fact. Every tax ID, dollar amount and officer name comes from a downloaded record. I confirm each match before it goes into a report.
The diagram is wide. Scroll sideways to see all of it.
You can try. Here is where it runs into trouble.
Lobbyist declarations are on the legislature’s website, campaign contributions are in a state database, and tax filings are in IRS files. A chatbot answers from what it already has or can find on the open web, and most of these records aren’t in a form it can read as a set.
Whether two records name the same group is a judgment call, and a model makes that call with the same confidence whether or not it’s right. In this process the scripts handle the clear cases, the model sees only the hard ones, and I check the result.
A language model writes fluent text whether or not a document backs it up. In a report someone will rely on, a claim that sounds right and has no source is the worst error. Every line in a Delotrope report traces to a filing you could pull yourself.
The collection, the matching, the line by line checking, and a finished report by morning. A chatbot can help with the reading. Someone still has to check each claim against the filing, and that is the part you are buying.
A filing states a fact, such as who registered For or Against a bill, or who gave how much to whom. The report cites it.
Two filings can point at the same thing without either one saying so. The report labels these as readings, not as facts in a filing.
It doesn’t monitor anything continuously yet.
It won’t tell you anyone broke the law, it won’t guess at motives, and it doesn’t take a side. The same standard applies no matter who’s asking or which party the filing belongs to. When the filings don’t say something, the report says that plainly instead of filling the gap, and every report ends with a section on what’s not there.
I’ll tell you what the public records can show, and whether it’s a fit.