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
The PMA clock starts at the last module
Practice
The Q-Sub that doesn't buy you more time
Method
Lapsed and revoked end an EUA differently
Practice
A recall strategy has a grade. openFDA doesn't.
Method
A granted De Novo becomes a predicate.
Practice
Least burdensome changes the ask, not the bar.
Method
The lab is accredited. Not the device.
Practice
Breakthrough is law. STeP is a guidance.
Practice
MDSAP replaces routine. Not for-cause.
Method
No field on a 510(k) says what it treats
Method
Discretion is a policy. Exclusion is a statute.
Practice
Designated by one office. Approved by another.
Method
MedSun sits beside MAUDE, not inside it
Practice
The five-unit device never gets a K-number
Practice
Meeting the criteria isn't a tracking order
Method
The PMA clock doesn't stop at approval
Practice
The K-number doesn't track today's device
Method
A MAUDE report proves it was filed
Practice
Not every MDR starts with the manufacturer
Method
Completed. Not terminated.
Practice
The device-ban list has three entries
Method
The UDI exception has its own deadline
Method
MDUFA VI is being negotiated in public
Practice
The inspection manual changed, not the rule
Method
The count Congress had to legislate
Practice
The small-business rate isn't retroactive
Method
A detention order has no docket to read
Practice
PMA approvals moved off the Federal Register
Method
A citizen petition names names
Practice
A market withdrawal isn't a recall
Method
Not every device letter comes from CDRH
Practice
Closed on one device. Open on the rest.
Method
No IDE is confirmed until the PMA is
Practice
The remedial-action call sets the clock
Method
Jurisdiction is a letter, not a field
Practice
An address is not a footprint
Method
The final rule that isn't final yet
Practice
The special controls aren't in the record
Method
Exempt from GMP. Not from complaints.
Practice
The notify list isn't the shortage list
Method
A constraint can't be skipped. A script can.
Practice
No cron sends this. A person does.
Method
Corrected, not rewritten
Practice
Quiet is a finding, not a default
Method
The summary is public. The statement isn't.
Practice
A competitor's 513(g) leaves no trace
Practice
An empty response field proves nothing
Method
A petition is public. Its outcome isn't.
Practice
The panel is a category, not a meeting
Method
An accessory carries its own classification
Method
A TPLC report is a category, not a device
Practice
A 522 order is a question, not a verdict
Method
A PCCP change leaves no new record
Practice
Not every signal becomes a recall
Method
eSTAR did not remove the acceptance check
Practice
An early alert has no recall number yet
Practice
A consent decree isn't a database row
Method
The record has no cybersecurity field
Practice
Classification Change is not one event
Method
Publication date is not effective date
Method
One event. Many recall numbers.
Practice
Quantity is a sentence, not a number
Practice
How a firm told you is a field too
Method
A RIN outlives the document number
Method
The docket ID is not the comments
Practice
The 510(k) record doesn't name the predicate
Practice
The 510(k) FDA didn't review first
Method
The letter FDA doesn't have to post
Practice
Cleared doesn't say which track it took
Method
The clock stops. The calendar doesn't.
Method
Why a guessed match never reaches you
Practice
The standards list never names a device
Method
The guidance isn't in the Federal Register.
Practice
Filtered. Not discarded.
Method
There are two recall databases, not one
Practice
Breakthrough status is confidential by law
Practice
One MAUDE report is not one malfunction
Method
A supplement number is not a track
Method
Cleared is not approved
Practice
Nationwide doesn't mean your building
Practice
Not every correction reaches FDA
Method
Registered. Not reviewed.
Method
Contact ODE is not a pathway
Practice
Almost no recall is FDA-mandated
Method
FDA's device names read like a card catalog
Practice
openFDA is free. It is not unlimited.
Method
GUDID stores the model. Not the box.
Practice
Detention doesn't need a warning letter
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