openFDA search - drug events, recalls, labels, devices (API)
Pricing
from $5.00 / 1,000 records
openFDA search - drug events, recalls, labels, devices (API)
Query openFDA (api.fda.gov): drug adverse events, drug and food recalls, drug labels, device events and device recalls. Pass openFDA search syntax plus a date range; get one normalised row per record (id, dates, product, classification, status, reason or reaction terms, firm) plus the raw JSON.
Pricing
from $5.00 / 1,000 records
Rating
0.0
(0)
Developer
RetrainMap Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
openFDA search — drug events, recalls, labels, devices (API)
One normalised row per openFDA record from six collections on https://api.fda.gov: drug adverse event reports (FAERS), drug recall enforcement reports, drug labels (SPL), device adverse event reports (MAUDE), device recalls and food recall enforcement reports. Pass any openFDA search expression plus a date range; get record id, dates, product/drug names, classification, status, reason or reaction terms, firm, state and country in the same columns whichever endpoint you chose, with the record's own JSON attached — ready for CSV or JSON.
The default input (drug recalls, last 90 days by report date, 300 rows) succeeds within 5 minutes and returns rows — Apify auto-tests it daily.
Data source and status
| Publisher | U.S. Food and Drug Administration — openFDA (https://open.fda.gov) |
| API | https://api.fda.gov/{drug,device,food}/… — public; an API key is optional (https://open.fda.gov/apis/authentication/). Without a key: 1,000 requests per day per IP, 240 per minute; with a key: 120,000 per day |
| What this Actor reads | Plain GET requests with search=(your query) AND <date_field>:[from TO to], sort=<date_field>:desc, limit=100, skip=N, at most two requests per second; the key, when given, is sent only as the api_key query parameter and never logged or written to the dataset |
| Refresh cadence | openFDA refreshes each collection on its own schedule (enforcement reports and labels roughly weekly, FAERS and MAUDE files roughly quarterly/monthly — see https://open.fda.gov/apis/). The Actor reads live on every run; the API's own last_updated for the endpoint is stored in RUN_SUMMARY, and fetched_at on each row is the fetch time |
| Copyright | Works of the United States Government are not subject to copyright in the U.S. (17 U.S.C. §105); openFDA data are released under the terms at https://open.fda.gov/license/. Please cite openFDA as the source |
| Known caveats | One query returns at most 25,100 records (openFDA rejects skip above 25,000) — narrow the search or dates for more; "no matches" is the API's HTTP 404 and yields zero rows with a warning; a malformed search expression makes the API answer HTTP 500 and the run fails with the API's message; the state column is empty for FAERS and labels (the API carries none); raw_json is trimmed to 6,000 characters (raw_json_truncated says when) |
Honesty note: openFDA data are unvalidated per the API's own disclaimer and are informational, not medical advice — the rows are the API's own fields mapped to a common set, nothing is inferred, summarised or classified by this Actor, and a run stops with an error rather than guess when the API's shape changes.
Identification: the requests carry a product-token User-Agent
(SteelyardActor/0.1 (openfda-search; …) — api.fda.gov's WAF rejects any agent string
containing "nmap", which the brand name RetrainMap does) and the operator's contact address in
the standard From: header (RFC 9110 §10.1.2).
Input
| Field | Type | Meaning |
|---|---|---|
endpoint | select | drug_enforcement (default), drug_event, drug_label, device_event, device_recall, food_enforcement |
search | string | Optional openFDA search expression in the endpoint's own field names, e.g. patient.drug.medicinalproduct:"ibuprofen", classification:"Class I" AND state:CA |
date_field | string | Optional; default per endpoint: receivedate, report_date, effective_time, date_received, event_date_posted, report_date |
date_from / date_to | YYYY-MM-DD | Optional, inclusive. Both empty = the last 90 days; only date_from = through today; only date_to = from 1900-01-01 |
max_records | integer | Default 300, at most 25,100 |
api_key | secret string | Optional openFDA key |
request_interval_ms | integer | Default 500 (floor 250) |
contact_email | string | Sent in the From: header |
Example — FAERS reports naming ibuprofen received since January 2026:
{ "endpoint": "drug_event", "search": "patient.drug.medicinalproduct:\"ibuprofen\"", "date_from": "2026-01-01", "max_records": 500 }
Output (dataset row)
Common columns for every endpoint: endpoint, endpoint_path, record_id, record_id_field
(which field the id came from — for recalls not yet classified recall_number is empty and
event_id is used instead), date_field,
date (the date field's value, YYYY-MM-DD), secondary_date, product, generic_names
(list), classification, status, reason_or_terms, firm, state, country,
source_url (the openFDA page query the record came from, without any key), raw_json
(the record's JSON, ≤ 6,000 characters), raw_json_truncated, fetched_at.
How the common columns are filled per endpoint:
| Endpoint | record_id | date / secondary_date | product / generic_names | classification / status | reason_or_terms | firm |
|---|---|---|---|---|---|---|
| drug_enforcement, food_enforcement | recall_number | report_date / recall_initiation_date | product_description / openfda.generic_name | classification (Class I–III) / status | reason_for_recall | recalling_firm |
| drug_event | safetyreportid | receivedate / receiptdate | drug medicinalproduct names / active substances | serious (1 = Serious, 2 = Not serious) / seriousness flags set (death, hospitalization, …) | MedDRA reaction terms | sender.senderorganization |
| drug_label | set_id | effective_time / — | openfda.brand_name / openfda.generic_name | openfda.product_type / label version | purpose or indications_and_usage | openfda.manufacturer_name |
| device_event | mdr_report_key | date_received / date_of_event | device brand_name / generic_name | event_type / type_of_report | product_problems | manufacturer name |
| device_recall | product_res_number | event_date_posted / event_date_initiated | product_description / openfda.device_name | openfda.device_class / recall_status | reason_for_recall | recalling_firm |
Text columns are trimmed to 1,000 characters; the full record is in raw_json. A run
summary (query, the API's own match count and last_updated, pages, requests, whether the
skip ceiling or the pay-per-event budget stopped the run) is stored as RUN_SUMMARY in the
run's key-value store.
Pricing (pay per event)
| Event | Price |
|---|---|
run-start — once per run | $0.10 |
record — per row written | $0.005 |
The default pull (≤ 300 rows) costs at most $1.60; 1,000 records cost $5.10. Rows stop when your run's maximum charge is reached; the run summary says so.
Operator
Steelyard Ventures LLC (RetrainMap) — info@steelyardclinical.com. Not affiliated with the U.S. Food and Drug Administration. The Actor writes only to its own dataset and key-value store; it stores no credentials and sends nothing else.