FDA APIaccessdata.fda.gov ↗
Search and retrieve FDA Premarket Approval (PMA) records for medical devices, including approval details, supplements, applicant info, and decision dates.
What is the FDA API?
This API exposes 2 endpoints for querying the FDA Premarket Approval (PMA) database at accessdata.fda.gov, covering original approvals and all associated supplement records. Use search_pma to filter PMA records by device name, product code, applicant, or PMA number, and get_pma_details to retrieve a complete approval history — including every supplement — for a specific PMA number. Each result includes structured fields such as trade_name, applicant, decision_date, decision_code, and product_code.
curl -X GET 'https://api.parse.bot/scraper/21ac37c7-dfa1-44a5-8cc3-d79df24d98b8/search_pma?skip=0&sort=decision_date%3Adesc&limit=5&applicant=medtronic' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace accessdata-fda-gov-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""FDA PMA Database: search approvals, drill into details, handle errors."""
from parse_apis.fda_premarket_approval_pma_database_api import FdaPma, PmaNotFound
client = FdaPma()
# Search for recent pacemaker-related PMA records
for record in client.pmarecords.search(device_name="pacemaker", limit=3):
print(record.trade_name, record.decision_date, record.applicant)
# Drill into the full approval history for a specific PMA
approval = client.pmaapprovals.get(pma_number="P200049")
print(approval.pma_number, approval.total_records)
print(approval.original_approval.trade_name, approval.original_approval.decision_date)
# Browse supplements on the approval
for supp in approval.supplements[:3]:
print(supp.supplement_number, supp.supplement_type, supp.decision_date)
# Typed error handling for a non-existent PMA
try:
missing = client.pmaapprovals.get(pma_number="P999999")
except PmaNotFound as exc:
print(f"PMA not found: {exc.pma_number}")
print("exercised: pmarecords.search / pmaapprovals.get / PmaApproval.supplements / PmaNotFound")
Search the FDA PMA database by device name, product code, applicant, or PMA number. At least one search parameter (device_name, product_code, applicant, or pma_number) is required. Supports combining multiple filters and pagination. Returns paginated results sorted by the specified field.
| Param | Type | Description |
|---|---|---|
| skip | integer | Number of results to skip for pagination |
| sort | string | Sort field and direction (e.g., 'decision_date:desc') |
| limit | integer | Number of results per page (1-100) |
| applicant | string | Applicant/manufacturer name (e.g., 'medtronic', 'abbott') |
| pma_number | string | PMA number (e.g., 'P200049') |
| device_name | string | Device/trade name to search for (e.g., 'pacemaker', 'cardiac') |
| product_code | string | FDA product code (e.g., 'LWP', 'NGV') |
{
"type": "object",
"fields": {
"skip": "integer number of results skipped",
"limit": "integer page size used",
"total": "integer total count of matching records",
"results": "array of PMA record objects with pma_number, trade_name, applicant, decision_date, decision_code, product_code, and other fields"
},
"sample": {
"data": {
"skip": 0,
"limit": 5,
"total": 12708,
"results": [
{
"zip": "55112",
"city": "Mounds View",
"state": "MN",
"applicant": "Medtronic, Inc.",
"pma_number": "P240036",
"trade_name": "OmniaSecure MRI SureScan Lead Model 3930M",
"ao_statement": "removing a redundant inspection and manufacturing tolerance changes",
"generic_name": "Permanent defibrillator electrodes",
"product_code": "NVY",
"date_received": "2026-03-25",
"decision_code": "OK30",
"decision_date": "2026-04-24",
"supplement_type": "30-Day Notice",
"supplement_number": "S005",
"supplement_reason": "Process Change - Manufacturer/Sterilizer/Packager/Supplier",
"advisory_committee": "CV",
"expedited_review_flag": "N",
"advisory_committee_description": "Cardiovascular"
}
]
},
"status": "success"
}
}About the FDA API
Searching PMA Records
The search_pma endpoint accepts at least one of four filter parameters: device_name, product_code, applicant, or pma_number. Filters can be combined — for example, searching for a specific applicant like medtronic alongside a product code like LWP. Results are paginated via limit (1–100 per page) and skip, and can be sorted using the sort parameter (e.g., decision_date:desc). Each result object in the results array includes pma_number, trade_name, applicant, decision_date, decision_code, and product_code, along with additional fields. The response also returns total — the count of all matching records — which is useful for building pagination logic.
Retrieving Full PMA Approval History
The get_pma_details endpoint takes a single required pma_number (e.g., P200049) and returns the complete regulatory history for that device. The response includes an original_approval object with fields such as trade_name, applicant, decision_date, and openfda metadata, plus a supplements array sorted by supplement_number covering every post-approval change filed with the FDA. The total_records field gives the combined count of the original approval and all supplements, making it straightforward to track how a device's approval has evolved over time.
Data Coverage and Source
The FDA PMA database covers Class III medical devices that require the most rigorous premarket review. Records span decades of approvals and include both original PMAs and supplements for label changes, manufacturing changes, design modifications, and more. The decision_code field distinguishes approval outcomes, and the openfda object within original_approval provides normalized identifiers that can be used to cross-reference other FDA datasets.
The FDA API is a managed, monitored endpoint for accessdata.fda.gov — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when accessdata.fda.gov changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official accessdata.fda.gov API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track all PMA supplements filed by a specific manufacturer like Abbott or Medtronic using the
applicantfilter - Monitor new Class III medical device approvals by sorting
search_pmaresults bydecision_date:desc - Look up the complete regulatory history of a device using
get_pma_detailswith a known PMA number - Identify all devices approved under a specific FDA product code using the
product_codefilter - Build a competitive intelligence dataset of approved cardiac or orthopedic devices by filtering on
device_name - Count post-approval supplements for a device via
total_recordsto assess how frequently a manufacturer has modified an approved product - Cross-reference
openfdaidentifiers from PMA records with other FDA datasets for regulatory research
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the FDA provide an official developer API for PMA data?+
What does `get_pma_details` return beyond the original approval?+
original_approval object with fields including trade_name, applicant, decision_date, and openfda metadata, plus a supplements array sorted by supplement_number. Each supplement record captures post-approval changes such as labeling updates or design modifications. The total_records field covers the original plus all supplements.Does `search_pma` return advisory committee meeting details?+
pma_number, trade_name, applicant, decision_date, decision_code, and product_code. Advisory committee meeting details are not currently surfaced as distinct structured fields in the search results. You can fork this API on Parse and revise it to add an endpoint that exposes advisory committee data.Is there a limit on how many results `search_pma` returns per request?+
limit parameter accepts values from 1 to 100 results per page. Use skip in combination with total from the response to paginate through larger result sets. Searches with very broad terms may match thousands of records, so filtering by multiple parameters together will narrow results to manageable pages.