# Clinical Trials and FDA Data (`jetlaunch/biomedical-regulatory-data`) Actor

Search ClinicalTrials.gov studies and look up FDA drug labels, drug approvals and 510(k) device clearances from official public APIs.

- **URL**: https://apify.com/jetlaunch/biomedical-regulatory-data.md
- **Developed by:** [Chris O'Byrne](https://apify.com/jetlaunch) (community)
- **Categories:** Other, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 study records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Clinical Trials and FDA Data

Search ClinicalTrials.gov studies and look up FDA drug labels, drug approvals and device 510(k) clearances, all from official public APIs, in one Actor and one output format.

**This Actor is information retrieval, not medical advice.** It returns public registry and label records as published. It does not interpret them, and it must not be used to make decisions about diagnosis, treatment or care. Always use the current official label and talk to a qualified professional.

### What does Clinical Trials and FDA Data do?

It has four modes:

- **study-search**: find ClinicalTrials.gov studies by condition, intervention, status, phase, sponsor, country and date filters.
- **study-detail**: get the full record for one or more NCT numbers: title, status, phase, conditions, interventions, sponsor, enrollment, dates, locations (facility and city level), eligibility criteria text and outcome measures.
- **label-lookup**: get FDA drug label sections (indications, dosage, warnings and more) by drug name, NDC code or set ID, with the label set ID, version and effective date.
- **approval-lookup**: get Drugs@FDA application records (NDA, ANDA, BLA) and device 510(k) clearances by application number, K number or name.

### Who is it for?

Researchers, regulatory affairs and competitive intelligence teams, health-tech developers, journalists and data teams who want clean JSON or spreadsheet-ready data from public registries without writing and maintaining API code.

### Data sources and licences

| Source | Used for | Terms |
|---|---|---|
| ClinicalTrials.gov API v2 (U.S. National Library of Medicine) | Studies | [Terms and Conditions](https://clinicaltrials.gov/about-site/terms-conditions): free use, attribute the source as ClinicalTrials.gov, show the date the data were processed, state modifications. Some records may carry third-party copyright. |
| openFDA (U.S. Food and Drug Administration) | Drug labels, Drugs@FDA, 510(k) | [Terms](https://open.fda.gov/terms/): content is CC0 except where noted. openFDA data are unvalidated, and openFDA says not to rely on it for medical care decisions. |
| DailyMed (National Library of Medicine) | Label set ID, current version, published date and link | [Web services](https://dailymed.nlm.nih.gov/dailymed/app-support-web-services.cfm). Used for identifiers and metadata only. |

How the Actor follows these terms:

- Every record carries a `source` field and a `sourceDataTimestamp` (the date the source says its data were processed) and a `modificationsNote` that states what was changed.
- Changes made by the Actor: fields are selected and renamed, dates in compact form are reformatted, label sections are joined into plain text and may be cut at your character limit (marked "\[truncated]"). Text is otherwise unchanged.
- Data are fetched live on each run and not cached by the Actor, so results reflect the source at run time. ClinicalTrials.gov refreshes its data on weekdays.
- Requests are spaced (about one per second to ClinicalTrials.gov and DailyMed, about two per second to openFDA) and rate-limit responses are retried with backoff. Nothing is fetched that the public APIs do not offer.
- The device data from openFDA can include GMDN terms, which are under a separate licence. This Actor does not return GMDN fields.

This Actor is not affiliated with or endorsed by ClinicalTrials.gov, the National Library of Medicine, the National Institutes of Health, the U.S. Food and Drug Administration, openFDA or DailyMed.

### What data does it exclude?

Public registry and label data only. The Actor deliberately leaves out:

- Names, titles, emails and phone numbers of investigators, study contacts and overall officials.
- When the lead sponsor is an individual investigator, the name is replaced by the investigator's affiliation (or "Individual investigator (name withheld)").
- Postal codes and map coordinates of study sites. Locations are facility, city, state and country only.
- Adverse event reports and any patient-level narratives. (Label text can describe adverse reactions as summarized in the official label; that is label content, not individual reports.)
- The contact person and street address of 510(k) applicants.

### Input

Choose a mode and fill only the fields for that mode.

| Field | Used by | Description |
|---|---|---|
| mode | all | study-search, study-detail, label-lookup or approval-lookup |
| maxItems | all | Upper limit on records returned and billed in the run (default 10) |
| condition, intervention, keywords, sponsor, country | study-search | Text filters |
| status, phase | study-search | Multi-select filters |
| startDateFrom, startDateTo, updatedFrom, updatedTo | study-search | Dates as YYYY, YYYY-MM or YYYY-MM-DD |
| fullRecords | study-search | Add eligibility, outcomes and locations to search results |
| nctIds | study-detail | One NCT number per line |
| drugNames, ndcs, setIds | label-lookup | Names, NDC codes (with or without hyphens), set IDs |
| labelSections | label-lookup | Sections to return (default: boxed warning, indications, dosage, contraindications, warnings) |
| labelProductType, maxLabelsPerQuery, maxCharsPerSection | label-lookup | Narrow and size the output |
| approvalQueries, approvalSource, maxApprovalsPerQuery | approval-lookup | NDA/ANDA/BLA numbers, K numbers or names |
| openFdaApiKey | label-lookup, approval-lookup | Optional free key from open.fda.gov, stored as a secret |

Example (this is the default input):

```json
{
  "mode": "study-search",
  "condition": "asthma",
  "status": ["RECRUITING"],
  "maxItems": 10
}
```

### Output

Every record has the same first columns: `recordType`, `id`, `title`, `status`, `organization`, `keyDate`, `url`. The dataset has table views for overview, studies, labels and approvals.

Study record (shortened):

```json
{
  "recordType": "study",
  "id": "NCT07139899",
  "title": "Downstream Effects of Airway Mucus Plugs on 129Xenon MRI in Severe Asthma",
  "status": "RECRUITING",
  "organization": "Duke University",
  "keyDate": "2025-11-17",
  "url": "https://clinicaltrials.gov/study/NCT07139899",
  "studyType": "OBSERVATIONAL",
  "conditions": ["Severe Asthma"],
  "enrollment": { "count": 5, "type": "ESTIMATED" },
  "countries": ["United States"],
  "source": "ClinicalTrials.gov",
  "sourceDataTimestamp": "2026-10-21T09:00:05"
}
```

Queries with no match, invalid input or an upstream error produce a marker record with `recordType` set to `not_found`, `invalid_input` or `error` and a `message`. Markers are never billed.

Label-lookup falls back to DailyMed when openFDA has no matching label. Those records contain identifiers and links only, and are not billed.

### Pricing

Pay per event. You pay only for records that were saved to the dataset.

| Event | Price | Charged when |
|---|---|---|
| study-record | $0.01 | One ClinicalTrials.gov study is returned |
| label-record | $0.01 | One drug label with at least one requested section is returned |
| approval-record | $0.01 | One Drugs@FDA application or one 510(k) clearance is returned |

There is also a very small Apify start charge per run. Set "Maximum records" or Apify's maximum cost per run to cap spend; the Actor stops when the cap is reached. A record already returned for an earlier query in the same run is not charged twice.

### FAQ

**Do I need an API key?** No. ClinicalTrials.gov and DailyMed need none. openFDA allows 1,000 requests per day per IP address without a key and 120,000 per day with a free key. Apify runs share IP addresses, so for heavy label or approval use, add your own key.

**Is the data current?** It is fetched live. Each record shows the source's own data date.

**Can I look up all labels for a generic drug?** Many manufacturers share a generic name. Use "Labels per drug name or NDC" to choose how many to return. Each label returned is billed.

**Why is a section missing from a label?** Labels differ. Older and over-the-counter labels use different section names. Only sections that exist are returned.

**Is this medical advice?** No. See the notice at the top.

### Limitations

- Study search returns up to 1,000 records per run.
- Label sections come from the openFDA label API, which is unvalidated and can lag the current DailyMed label. The set ID, version and published date from DailyMed are included so you can check.
- 510(k) coverage is clearances only, not PMA approvals.
- Free-text filters follow ClinicalTrials.gov search behavior, which includes synonyms.

### Support

Open an issue in the Issues tab of this Actor with the input you used and the run ID.

# Actor input Schema

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

study-search finds ClinicalTrials.gov studies by filters. study-detail returns full records for NCT numbers. label-lookup returns FDA drug label sections by drug name, NDC or set ID. approval-lookup returns Drugs@FDA applications and device 510(k) clearances.

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

Upper limit on records returned (and billed) in this run, across all queries.

## `condition` (type: `string`):

Disease or condition, for example asthma or type 2 diabetes.

## `intervention` (type: `string`):

Drug, device or other intervention, for example dupilumab.

## `keywords` (type: `string`):

Free text matched across the study record.

## `status` (type: `array`):

Keep only studies with one of these statuses. Leave empty for any.

## `phase` (type: `array`):

Keep only studies in these phases. Leave empty for any.

## `sponsor` (type: `string`):

Lead sponsor or collaborator organization, for example Novartis.

## `country` (type: `string`):

Country of at least one study location, for example Canada or Germany.

## `startDateFrom` (type: `string`):

Earliest study start date as YYYY, YYYY-MM or YYYY-MM-DD.

## `startDateTo` (type: `string`):

Latest study start date as YYYY, YYYY-MM or YYYY-MM-DD.

## `updatedFrom` (type: `string`):

Only studies whose record was last updated on or after this date (YYYY-MM-DD).

## `updatedTo` (type: `string`):

Only studies whose record was last updated on or before this date (YYYY-MM-DD).

## `fullRecords` (type: `boolean`):

Add eligibility criteria text, outcome measures and facility and city level locations to each search result. Same price per study.

## `nctIds` (type: `array`):

One NCT number per line, for example NCT07139899.

## `drugNames` (type: `array`):

Brand, generic or substance names, one per line, for example lipitor or metformin.

## `ndcs` (type: `array`):

National Drug Codes, with or without hyphens, for example 58151-155 or 58151-155-77.

## `setIds` (type: `array`):

DailyMed set IDs (GUIDs) to look up exact labels.

## `labelSections` (type: `array`):

Sections to return. Leave empty for boxed warning, indications, dosage, contraindications and warnings.

## `labelProductType` (type: `string`):

Restrict name and NDC matches to prescription or over-the-counter labels.

## `maxLabelsPerQuery` (type: `integer`):

Many generics share a name, so each name or NDC can match several labels. Each label returned is billed.

## `maxCharsPerSection` (type: `integer`):

Longer sections are cut at this length and marked as truncated.

## `approvalQueries` (type: `array`):

One per line: an application number such as NDA020702 or BLA125057, a 510(k) number such as K971754, or a drug or device name.

## `approvalSource` (type: `string`):

Where drug or device names are searched. Application numbers and K numbers are recognized automatically.

## `maxApprovalsPerQuery` (type: `integer`):

Each approval or clearance record returned is billed.

## `openFdaApiKey` (type: `string`):

Free key from open.fda.gov. Without a key, openFDA allows 1,000 requests per day per IP address, and Apify runs share IP addresses. A key raises the limit to 120,000 per day. Stored as a secret.

## Actor input object example

```json
{
  "mode": "study-search",
  "maxItems": 10,
  "condition": "asthma",
  "status": [
    "RECRUITING"
  ],
  "phase": [],
  "fullRecords": false,
  "labelSections": [],
  "labelProductType": "any",
  "maxLabelsPerQuery": 3,
  "maxCharsPerSection": 8000,
  "approvalSource": "drugs",
  "maxApprovalsPerQuery": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Records returned by the selected mode, plus markers for queries with no match.

# 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": "study-search",
    "maxItems": 10,
    "condition": "asthma",
    "status": [
        "RECRUITING"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jetlaunch/biomedical-regulatory-data").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": "study-search",
    "maxItems": 10,
    "condition": "asthma",
    "status": ["RECRUITING"],
}

# Run the Actor and wait for it to finish
run = client.actor("jetlaunch/biomedical-regulatory-data").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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": "study-search",
  "maxItems": 10,
  "condition": "asthma",
  "status": [
    "RECRUITING"
  ]
}' |
apify call jetlaunch/biomedical-regulatory-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jetlaunch/biomedical-regulatory-data"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mWfAyfTVNWXKgFutO/builds/Q9AfbtfY5SnOt1gr9/openapi.json
