# OpenFDA Scraper (`crawlerbros/openfda-scraper`) Actor

Scrape the FDA's openFDA API with drug labels, adverse events (FAERS), drug recalls, NDC directory, drugs@FDA, device events, and food enforcement. Layers in RxNorm (RxNav) drug-equivalence lookups and DailyMed label URLs.

- **URL**: https://apify.com/crawlerbros/openfda-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 7 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## OpenFDA Scraper

Scrape the U.S. Food and Drug Administration's **openFDA** open-data APIs for drug labels (Structured Product Labeling), adverse-event reports (FAERS), drug recalls, the NDC directory, drug approvals, device adverse events, and food enforcement actions. Layered with **RxNorm / RxNav** for drug-equivalence lookups (brand ↔ generic ↔ ingredient) and **DailyMed** for canonical label URLs.

The actor talks directly to the public FDA, NLM/RxNav and DailyMed APIs — **no login, no cookies, no proxy, no third-party API key** required. An optional openFDA `apiKey` can be passed in to raise the anonymous 240 requests/minute / 1,000 requests/day cap.

### Data Source

- **openFDA**: `https://api.fda.gov/` — the FDA's public, open, JSON REST APIs covering drugs, devices and food.
- **RxNorm / RxNav**: `https://rxnav.nlm.nih.gov/REST/` — the U.S. National Library of Medicine's open drug-concept service.
- **DailyMed**: `https://dailymed.nlm.nih.gov/` — the NIH/NLM authoritative Structured Product Labeling repository.

All three sources are freely accessible from any IP without registration.

### What you can do

Pick a **mode** and feed it the matching filters:

| Mode | Use it when you want… |
|---|---|
| `searchLabels` | Free-text search over drug labels (brand/generic/substance/manufacturer) |
| `searchEvents` | Search FAERS adverse-event reports for a drug, manufacturer or date range |
| `searchRecalls` | Search FDA drug-enforcement / recall actions by keyword, class or date |
| `searchNdcs` | Search the FDA NDC directory by name, manufacturer or dosage form |
| `byBrandName` | Pull every dataset (labels + NDC + events + recalls) for one brand name |
| `byGenericName` | Same as `byBrandName` but keyed on the generic name |
| `byNdcCode` | Resolve everything tied to a single National Drug Code |
| `rxNormLookup` | Resolve a drug name into an RxCUI plus brand/generic/ingredient equivalents |
| `deviceEvents` | Search device adverse-event reports (`/device/event.json`) |
| `foodEnforcement` | Search FDA food-enforcement / recall actions (`/food/enforcement.json`) |

### Inputs

| Field | Type | Purpose |
|---|---|---|
| `mode` | enum (10 values) | Endpoint to query |
| `searchQuery` | string | Free-text query (used by all `search*` and lookup modes) |
| `brandName` | string | Exact brand-name lookup |
| `genericName` | string | Exact generic-name lookup |
| `ndcCode` | string | NDC identifier (e.g. `0573-0164`) |
| `rxnormName` | string | Drug name for RxNorm lookup |
| `dataset` | multi-select enum | For brand/generic modes — pick which datasets (labels, events, recalls, ndc, shortages, deviceEvents, foodEnforcement) |
| `manufacturerName` | string | Filter by labeler / manufacturer (substring match) |
| `dosageForm` | multi-select enum | Tablet, Capsule, Injection, Solution, Cream, … (18 values) |
| `route` | multi-select enum | Oral, IV, IM, SC, Topical, Ophthalmic, … (16 values) |
| `marketingStatus` | multi-select enum | Prescription / OTC / NDA / ANDA / BLA / Monograph / Discontinued |
| `dateFrom` / `dateTo` | ISO date | Filter events / recalls by receive / initiation date |
| `seriousnessOnly` | boolean | Limit FAERS reports to those flagged "serious" |
| `recallClass` | enum (ALL / I / II / III) | FDA recall classification |
| `voluntaryMandated` | enum | Voluntary firm-initiated vs FDA-mandated recalls |
| `recallStatus` | enum (Ongoing / Completed / Terminated / Pending) | |
| `containsKeyword` | string | Final post-filter substring match across any text field |
| `apiKey` | string (secret, optional) | Optional openFDA API key to raise rate limits |
| `maxItems` | integer (1–1000) | Hard cap on emitted records |

### Output

Records are pushed into the actor's default dataset. Each record has a `recordType` (`drugLabel`, `adverseEvent`, `drugRecall`, `ndc`, `drugApproval`, `deviceEvent`, `foodRecall`, or `rxNorm`) and a `scrapedAt` ISO timestamp. Empty/null fields are stripped — every key that appears carries real data.

#### Drug label fields

`setId`, `splId`, `brandName`, `genericName`, `manufacturer`, `productType`, `route[]`, `dosageForm[]`, `substanceName[]`, `ndc[]`, `rxCui`, `nui[]`, `pharmClass[]`, `description`, `indicationsAndUsage`, `contraindications`, `warningsAndCautions`, `adverseReactions`, `dosageAndAdministration`, `packagingDescription`, `purpose`, `activeIngredient`, `effectiveDate`, `labelUrl` (DailyMed canonical lookup), `recordType`, `scrapedAt`.

#### Adverse-event fields

`reportId`, `receiveDate`, `serious`, `seriousnessCodes[]`, `reactions[]`, `outcomes[]`, `drugs[]` (with `name`, `role`, `dose`, `indication`), `patient` (`age`, `sex`, `weightKg`), `reporter` (`country`, `qualification`), `recordType`, `scrapedAt`.

#### Recall fields

`recallNumber`, `status`, `classification`, `productDescription`, `productType`, `codeInfo`, `reasonForRecall`, `voluntaryMandated`, `initialFirmNotification`, `distributionPattern`, `recallingFirm`, `city`, `state`, `country`, `productQuantity`, `recallInitiationDate`, `reportDate`, `centerClassificationDate`, `terminationDate`, `brandName`, `genericName`, `ndc[]`, `recordType`, `scrapedAt`.

#### NDC fields

`productNdc`, `productId`, `brandName`, `genericName`, `labelerName`, `productType`, `dosageForm`, `marketingCategory`, `marketingStatus`, `applicationNumber`, `marketingStartDate`, `marketingEndDate`, `listingExpirationDate`, `route[]`, `activeIngredients[]`, `packaging[]`, `pharmClass[]`, `splId`, `labelUrl`, `recordType`, `scrapedAt`.

#### RxNorm fields

`queryName`, `rxCui`, `ingredients[]`, `preciseIngredients[]`, `multiIngredients[]`, `brandNames[]`, `clinicalDrugs[]`, `brandedDrugs[]`, `dosageForm[]`, `dosageFormGroup[]`, `recordType`, `scrapedAt`.

### Example input

```json
{
  "mode": "searchLabels",
  "searchQuery": "ibuprofen",
  "maxItems": 15
}
````

```json
{
  "mode": "byBrandName",
  "brandName": "Tylenol",
  "dataset": ["labels", "recalls"],
  "maxItems": 30
}
```

```json
{
  "mode": "searchEvents",
  "searchQuery": "lipitor",
  "seriousnessOnly": true,
  "dateFrom": "2020-01-01",
  "maxItems": 50
}
```

```json
{
  "mode": "rxNormLookup",
  "rxnormName": "metformin"
}
```

### FAQ

**Q: Do I need an API key?**
No. The openFDA API is completely open. An optional `apiKey` field is exposed only to lift the 240 req/min / 1,000 req/day anonymous quota; you can register for one for free at <https://open.fda.gov/apis/authentication/>.

**Q: Do I need a proxy?**
No. All three upstream APIs (openFDA, RxNav, DailyMed) serve any IP without bot detection.

**Q: How fresh is the data?**
openFDA refreshes weekly for FAERS, monthly for NDC and SPL labels, weekly for enforcement reports. The actor always queries live — no caching layer.

**Q: Why are some drug-event fields missing on certain records?**
FAERS reports are voluntary and patient-completed; data quality varies. The actor strips every empty/null key from each record so you only ever see fields with real values.

**Q: How does pagination work?**
openFDA supports `skip` up to 25,000 records per query. The actor handles this transparently — set `maxItems` up to 1,000 per run; for larger pulls, narrow the query with date or manufacturer filters.

**Q: What is RxNorm used for?**
RxNorm gives you a canonical drug identifier (`RxCUI`) plus the full equivalence map: brand names, generic ingredients, branded vs. clinical drugs, dosage forms. Useful for cross-referencing brand-to-generic and finding all formulations of a substance.

**Q: Where do the `labelUrl` links go?**
DailyMed is the NIH's official public copy of the FDA Structured Product Labeling. Each label URL resolves to the human-readable label page on `dailymed.nlm.nih.gov`.

**Q: Can I filter by route and dosage form simultaneously?**
Yes. `route` and `dosageForm` are multi-select; any selected value matches (OR across the selection). The two filters compose with AND.

# Actor input Schema

## `mode` (type: `string`):

Which openFDA endpoint to query.

## `searchQuery` (type: `string`):

Free-text term searched across brand/generic/substance fields.

## `brandName` (type: `string`):

Exact brand-name lookup (mode=byBrandName).

## `genericName` (type: `string`):

Exact generic-name lookup (mode=byGenericName).

## `ndcCode` (type: `string`):

National Drug Code identifier, e.g. 0573-0164.

## `rxnormName` (type: `string`):

Drug name to resolve into an RxCUI and related concepts.

## `dataset` (type: `array`):

Which openFDA datasets to query when looking up by brand / generic name. Leave empty for all.

## `manufacturerName` (type: `string`):

Filter to records whose manufacturer / labeler matches this substring.

## `dosageForm` (type: `array`):

Filter to selected dosage forms.

## `route` (type: `array`):

Filter to selected administration routes.

## `marketingStatus` (type: `array`):

Filter by prescription/OTC status or marketing category.

## `dateFrom` (type: `string`):

ISO date (YYYY-MM-DD) lower bound for receive/initiation dates.

## `dateTo` (type: `string`):

ISO date (YYYY-MM-DD) upper bound for receive/initiation dates.

## `seriousnessOnly` (type: `boolean`):

Limit FAERS results to reports flagged as serious.

## `recallClass` (type: `string`):

Filter recalls by FDA classification class.

## `voluntaryMandated` (type: `string`):

Filter recall records by initiator type.

## `recallStatus` (type: `string`):

Filter recalls by status.

## `containsKeyword` (type: `string`):

Final post-filter substring match against any text field on each record.

## `apiKey` (type: `string`):

Optional api\_key value to bump rate limits past the 240/min anonymous quota. Get one for free at https://open.fda.gov/apis/authentication/

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "searchLabels",
  "searchQuery": "ibuprofen",
  "dataset": [],
  "dosageForm": [],
  "route": [],
  "marketingStatus": [],
  "seriousnessOnly": false,
  "recallClass": "ALL",
  "voluntaryMandated": "",
  "recallStatus": "",
  "maxItems": 15
}
```

# Actor output Schema

## `drugRecords` (type: `string`):

Dataset of all FDA drug records scraped.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "searchLabels",
    "searchQuery": "ibuprofen",
    "dataset": [],
    "dosageForm": [],
    "route": [],
    "marketingStatus": [],
    "seriousnessOnly": false,
    "recallClass": "ALL",
    "voluntaryMandated": "",
    "recallStatus": "",
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/openfda-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "searchLabels",
    "searchQuery": "ibuprofen",
    "dataset": [],
    "dosageForm": [],
    "route": [],
    "marketingStatus": [],
    "seriousnessOnly": False,
    "recallClass": "ALL",
    "voluntaryMandated": "",
    "recallStatus": "",
    "maxItems": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/openfda-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "searchLabels",
  "searchQuery": "ibuprofen",
  "dataset": [],
  "dosageForm": [],
  "route": [],
  "marketingStatus": [],
  "seriousnessOnly": false,
  "recallClass": "ALL",
  "voluntaryMandated": "",
  "recallStatus": "",
  "maxItems": 15
}' |
apify call crawlerbros/openfda-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/openfda-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "OpenFDA Scraper",
        "description": "Scrape the FDA's openFDA API with drug labels, adverse events (FAERS), drug recalls, NDC directory, drugs@FDA, device events, and food enforcement. Layers in RxNorm (RxNav) drug-equivalence lookups and DailyMed label URLs.",
        "version": "1.0",
        "x-build-id": "y7KI8xB0GIKE5eMZB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~openfda-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-openfda-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~openfda-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-openfda-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~openfda-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-openfda-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "searchLabels",
                            "searchEvents",
                            "searchRecalls",
                            "searchNdcs",
                            "byBrandName",
                            "byGenericName",
                            "byNdcCode",
                            "rxNormLookup",
                            "deviceEvents",
                            "foodEnforcement"
                        ],
                        "type": "string",
                        "description": "Which openFDA endpoint to query.",
                        "default": "searchLabels"
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Free-text term searched across brand/generic/substance fields.",
                        "default": "ibuprofen"
                    },
                    "brandName": {
                        "title": "Brand name",
                        "type": "string",
                        "description": "Exact brand-name lookup (mode=byBrandName)."
                    },
                    "genericName": {
                        "title": "Generic name",
                        "type": "string",
                        "description": "Exact generic-name lookup (mode=byGenericName)."
                    },
                    "ndcCode": {
                        "title": "NDC code (mode=byNdcCode)",
                        "type": "string",
                        "description": "National Drug Code identifier, e.g. 0573-0164."
                    },
                    "rxnormName": {
                        "title": "RxNorm name (mode=rxNormLookup)",
                        "type": "string",
                        "description": "Drug name to resolve into an RxCUI and related concepts."
                    },
                    "dataset": {
                        "title": "Datasets (for byBrandName / byGenericName)",
                        "type": "array",
                        "description": "Which openFDA datasets to query when looking up by brand / generic name. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "labels",
                                "events",
                                "recalls",
                                "ndc",
                                "shortages",
                                "deviceEvents",
                                "foodEnforcement"
                            ],
                            "enumTitles": [
                                "Drug labels (SPL)",
                                "Adverse events (FAERS)",
                                "Drug recalls / enforcement",
                                "NDC directory",
                                "Drugs@FDA (approvals)",
                                "Device adverse events",
                                "Food enforcement"
                            ]
                        },
                        "default": []
                    },
                    "manufacturerName": {
                        "title": "Manufacturer name",
                        "type": "string",
                        "description": "Filter to records whose manufacturer / labeler matches this substring."
                    },
                    "dosageForm": {
                        "title": "Dosage form",
                        "type": "array",
                        "description": "Filter to selected dosage forms.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "TABLET",
                                "CAPSULE",
                                "SOLUTION",
                                "INJECTION",
                                "INJECTABLE",
                                "SYRUP",
                                "SUSPENSION",
                                "POWDER",
                                "CREAM",
                                "OINTMENT",
                                "GEL",
                                "PATCH",
                                "SPRAY",
                                "LOZENGE",
                                "AEROSOL",
                                "SUPPOSITORY",
                                "LIQUID",
                                "GRANULE"
                            ],
                            "enumTitles": [
                                "Tablet",
                                "Capsule",
                                "Solution",
                                "Injection",
                                "Injectable",
                                "Syrup",
                                "Suspension",
                                "Powder",
                                "Cream",
                                "Ointment",
                                "Gel",
                                "Patch",
                                "Spray",
                                "Lozenge",
                                "Aerosol",
                                "Suppository",
                                "Liquid",
                                "Granule"
                            ]
                        },
                        "default": []
                    },
                    "route": {
                        "title": "Route of administration",
                        "type": "array",
                        "description": "Filter to selected administration routes.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ORAL",
                                "TOPICAL",
                                "INTRAVENOUS",
                                "INTRAMUSCULAR",
                                "SUBCUTANEOUS",
                                "OPHTHALMIC",
                                "OTIC",
                                "NASAL",
                                "INHALATION",
                                "RECTAL",
                                "VAGINAL",
                                "TRANSDERMAL",
                                "SUBLINGUAL",
                                "BUCCAL",
                                "INTRATHECAL",
                                "EPIDURAL"
                            ],
                            "enumTitles": [
                                "Oral",
                                "Topical",
                                "Intravenous",
                                "Intramuscular",
                                "Subcutaneous",
                                "Ophthalmic (eye)",
                                "Otic (ear)",
                                "Nasal",
                                "Inhalation",
                                "Rectal",
                                "Vaginal",
                                "Transdermal",
                                "Sublingual",
                                "Buccal",
                                "Intrathecal",
                                "Epidural"
                            ]
                        },
                        "default": []
                    },
                    "marketingStatus": {
                        "title": "Marketing status / product type",
                        "type": "array",
                        "description": "Filter by prescription/OTC status or marketing category.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "HUMAN PRESCRIPTION DRUG",
                                "HUMAN OTC DRUG",
                                "NDA",
                                "ANDA",
                                "BLA",
                                "OTC monograph final",
                                "OTC monograph not final",
                                "DISCONTINUED"
                            ],
                            "enumTitles": [
                                "Prescription drug",
                                "OTC drug",
                                "NDA (New Drug Application)",
                                "ANDA (Abbreviated NDA / generic)",
                                "BLA (Biologic License Application)",
                                "OTC monograph final",
                                "OTC monograph not final",
                                "Discontinued"
                            ]
                        },
                        "default": []
                    },
                    "dateFrom": {
                        "title": "Date from (events / recalls)",
                        "type": "string",
                        "description": "ISO date (YYYY-MM-DD) lower bound for receive/initiation dates."
                    },
                    "dateTo": {
                        "title": "Date to (events / recalls)",
                        "type": "string",
                        "description": "ISO date (YYYY-MM-DD) upper bound for receive/initiation dates."
                    },
                    "seriousnessOnly": {
                        "title": "Serious adverse events only",
                        "type": "boolean",
                        "description": "Limit FAERS results to reports flagged as serious.",
                        "default": false
                    },
                    "recallClass": {
                        "title": "Recall classification",
                        "enum": [
                            "ALL",
                            "I",
                            "II",
                            "III"
                        ],
                        "type": "string",
                        "description": "Filter recalls by FDA classification class.",
                        "default": "ALL"
                    },
                    "voluntaryMandated": {
                        "title": "Voluntary or Mandated recalls",
                        "enum": [
                            "",
                            "Voluntary: Firm Initiated",
                            "FDA Mandated"
                        ],
                        "type": "string",
                        "description": "Filter recall records by initiator type.",
                        "default": ""
                    },
                    "recallStatus": {
                        "title": "Recall status",
                        "enum": [
                            "",
                            "Ongoing",
                            "Completed",
                            "Terminated",
                            "Pending"
                        ],
                        "type": "string",
                        "description": "Filter recalls by status.",
                        "default": ""
                    },
                    "containsKeyword": {
                        "title": "Contains keyword",
                        "type": "string",
                        "description": "Final post-filter substring match against any text field on each record."
                    },
                    "apiKey": {
                        "title": "openFDA API key (optional)",
                        "type": "string",
                        "description": "Optional api_key value to bump rate limits past the 240/min anonymous quota. Get one for free at https://open.fda.gov/apis/authentication/"
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on emitted records.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
