Method·July 27, 2026 · 3 min read

FDA's warning letters, addressed by column number

The data behind fda.gov's warning-letter search has no field names — company, date, and subject are positions in an array, and nothing FDA publishes promises they'll stay in order. What a monitoring pipeline does about a contract nobody signed.

By Connor Griggs — Regulatory & Quality Strategist

Open fda.gov’s warning-letter search and open a browser’s network tab alongside it, and the page gives up its trick immediately: the table is not server-rendered HTML. It is populated by a JSON call to a Drupal endpoint built to paginate a search widget, not to be read by anyone’s pipeline. That is good news — a free, keyless, paginated feed of every CDRH warning letter, no scraping required. The shape of what comes back is the part worth being careful about.

An array, not an object

Every other source this instrument reads returns named fields. The Federal Register API hands back title, publication_date, cfr_references; openFDA hands back recall_number, product_code. Ask for a field by name and you get it, or an explicit null. The warning-letter endpoint returns something else entirely: each row is a bare array of eight strings, most of them small fragments of HTML, in a fixed order, with no keys attached anywhere. Position two, verified against a live row, holds the company name wrapped in a hyperlink to the letter itself. Position four holds the subject line — the closest thing this source has to a violation theme. Nothing in the response says so. That mapping exists in exactly one place: whoever last counted columns against the rendered page.

The contract nobody signed

That is a real risk, not a theoretical one. FDA is free to reorder those eight columns, insert a ninth, or drop the frequently empty excerpt field at position seven, and the endpoint will keep returning perfectly valid JSON — just JSON in a different order. Code that reads position two and calls it the company will, from the moment the order shifts, read whatever now sits in position two instead: the issuing office, say, or the subject line. It will not throw. It will attribute a warning letter to the wrong firm, confidently, for as long as nobody happens to check it against the page by eye.

A silent reorder is not a crash. It is a data set that is wrong in a way nothing downstream is built to notice.

Fail loud, on purpose

The defense here isn’t cleverness, just a shape check that runs before any field is trusted: exactly eight positions, the first two each carrying an HTML time element with a datetime attribute, the third carrying a hyperlink. Any one of those checks failing raises immediately, and the ingest run stops rather than finishing on data it can no longer vouch for. On an ordinary Tuesday — the day CDRH letters typically post — the check costs nothing; it passes and moves on, the way an assertion should. On the day the table’s shape actually changes, it is the difference between a loud failure fixed that morning and a quiet one that ships wrong company names for months before anyone reads closely enough to catch it.

Past this one endpoint

Plenty of official data behaves like this: genuinely public, free to reach, and never designed to be read by anything other than the page it renders. The Federal Register API and openFDA are documented contracts — versioned, keyed, meant to be depended on, with a published schema behind every field. A datatables endpoint behind a search box is not; it is an implementation detail that happens to be inspectable, and treating it as sturdier than that is the mistake. Which of the two a given feed actually is — contract or convenience — is worth checking before a pipeline is built on it, not after the feed has quietly answered the question itself. That check is an engineering habit, not a regulatory judgment call; it is also the only thing standing between a monitoring product and a warning letter filed under the wrong company’s name.

Regulatory intelligence, not regulatory advice. This post describes method and published FDA records as of its date; decisions about a specific device belong with your regulatory professional.

Method
A Class I device, a Class I recall
Practice
21 CFR 820 didn't move. Its contents did.
Method
The product code that doesn't exist yet
Practice
The classification posts. The 483 behind it doesn't.
Method
A recall has three dates, and the pipeline had to pick one
Practice
The count is real. The rate is not.
Method
The firm on the record is not the firm on the box
Practice
Low confidence is an instruction, not a hedge
Method
The same company, spelled three ways
Practice
A device that was never a medical device
Practice
Your regulation has a decimal. FDA's watch doesn't.
Method
Three letters is too short to search for
Practice
Most warning letters never close
Method
The guidance that skipped the draft
Practice
Ongoing, as of when?
Method
The least interesting fact in a 510(k)
Practice
No recall arrives with a product code attached
Practice
The deadline that doesn't email you
Method
The warning letter has two dates
Method
How to monitor FDA without drowning
Practice
Your predicate was recalled. Now what?
Method
Why no item reaches you without a human