# Canada Clinical Trials (Health Canada Database) (`loonieledger/canada-clinical-trials`) Actor

Search Health Canada-authorized clinical trials from the official Clinical Trials Database: protocol, title, phase, status, dates, medical conditions, sponsors and investigational products. Filter by keyword, condition, sponsor, phase and date.

- **URL**: https://apify.com/loonieledger/canada-clinical-trials.md
- **Developed by:** [Keegan Carpentier](https://apify.com/loonieledger) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

## Canada Clinical Trials Scraper – Health Canada Clinical Trials Database

Export **Health Canada-authorized clinical trials** (phase I–III, pharmaceutical and biological drugs) as clean JSON, CSV or Excel: protocol number, full title, **phase**, status (ongoing, closed, pending), No Objection Letter date, start and end dates, **medical conditions**, study populations, **sponsors** and investigational products. Filter by keyword, condition, sponsor, phase, status and date, or schedule a **"new trials only"** monitor.

- ✅ Official Health Canada Clinical Trials Database API (about 9,700 trials). No scraping, no login, no API key
- ✅ Canada-specific: every row is a trial Health Canada has authorized to run in Canada – something ClinicalTrials.gov filters don't give you cleanly
- ✅ Phase parsed from the title, sponsors and products joined in
- ✅ `onlyNew` monitoring mode: returns new trials **and trials whose status changed** (e.g. pending → ongoing → closed)
- ✅ English **or French**; pay only for the results you get

### Who it's for

- **CROs, site networks and patient-recruitment companies** looking for new Canadian trials and sponsors
- **Pharma and biotech competitive-intelligence teams** following competitors' Canadian programs
- **Investors and analysts** tracking pipeline activity by indication
- **Patient-advocacy groups, journalists and researchers**

### Input

| Field | What it does | Default |
|---|---|---|
| `language` | `en` or `fr` | `en` |
| `keywords` | Title, condition, sponsor or product contains **any** of these | `["obesity","alzheimer"]` (prefill) |
| `conditions` | Medical condition contains any of these | all |
| `sponsors` | Sponsor name contains any of these | all |
| `statuses` | `ONGOING`, `CLOSED`, `PENDING` | all |
| `phases` | `1`, `2`, `3`, `4` (a Phase 1/2 trial matches 1 and 2) | all |
| `studyPopulations` | `ADULT MALE`, `ADULT FEMALE`, `PEDIATRIC` | all |
| `authorizedWithinDays` / `authorizedSince` | Window on the No Objection Letter date | no limit |
| `onlyNew` | Only new or status-changed trials | off |
| `maxItems` | Hard cap on results (and on cost), newest authorization first | 200 |

Example: ongoing phase 3 oncology trials authorized this year

```json
{ "keywords": ["cancer", "carcinoma", "lymphoma"], "phases": ["3"], "statuses": ["ONGOING"], "authorizedSince": "2026-01-01" }
```

### Output

One row per trial protocol. A real record from a live test (29 Sep 2026):

```json
{
  "protocolId": 80426,
  "protocolNumber": "E2511-A001-102",
  "submissionNumber": "504791",
  "title": "A PROOF-OF-MECHANISM, OPEN-LABEL, PARALLEL GROUP STUDY WITH AN OPEN-LABEL EXTENSION PHASE TO ASSESS THE SAFETY, TOLERABILITY, PHARMACOKINETICS, AND …",
  "phase": null,
  "status": "PENDING",
  "noObjectionLetterDate": "2026-09-25",
  "startDate": null,
  "endDate": null,
  "medicalConditions": [
    "ALZHEIMER'S DISEASE"
  ],
  "studyPopulations": [
    "ADULT FEMALE",
    "ADULT MALE"
  ],
  "sponsors": [
    "EISAI INC"
  ],
  "products": [
    "E2511 / [11C] MK 6884 / [18F] FEOBV"
  ],
  "searchPortalUrl": "https://clinical-trials-search.canada.ca/en/home",
  "language": "en",
  "source": "Health Canada – Clinical Trials Database API",
  "licence": "Open Government Licence – Canada",
  "attribution": "Contains information licensed under the Open Government Licence – Canada.",
  "scrapedAt": "2026-09-29T22:47:36+00:00"
}
```

The full field list is in `.actor/dataset_schema.json`; more real rows are in `sample_output.json`.

### Scheduling a trial monitor

Save your input as a **Task** with `onlyNew: true`, add a daily or weekly **Schedule**, then connect Slack, email, Google Sheets, Zapier or Make. State lives in the named key-value store `canada-clinical-trials-state`.

### Pricing

**Pay per result.** You're charged once per trial written to the dataset.

### Data source, licence and privacy

- Source: Health Canada **Clinical Trials Database API** – https://health-products.canada.ca/api/documentation/cta-documentation-en.html (dataset: https://open.canada.ca/data/en/dataset/d6fe4b32-2eaf-4ac0-9e35-b3841f25e3a7). Human-readable search: https://clinical-trials-search.canada.ca
- Licence: **Open Government Licence – Canada**. Every row carries the required attribution statement.
- Sponsors are companies, hospitals and universities. **No personal information** (no investigator names or contacts).
- Unofficial tool, not affiliated with or endorsed by Health Canada.

### Limits and notes

- `phase` is parsed from the protocol title and is `null` when the title doesn't state it (about 40% of the 9,700 trials; only a few dozen of those mention a phase in a non-standard way). Use keywords or conditions rather than `phases` if you need full coverage.
- The database covers trials of drugs and biologics authorized by Health Canada; device-only and many academic non-drug studies aren't included.
- The API doesn't give a per-trial web page, so `searchPortalUrl` points to the official search portal; search by protocol number there.
- The French version of the database is sometimes slow to respond (up to about a minute).

# Actor input Schema

## `language` (type: `string`):

Language of statuses, conditions and study populations.

## `keywords` (type: `array`):

Keep trials whose title, medical condition, sponsor or product contains ANY of these words (case-insensitive), e.g. obesity, CAR-T, pembrolizumab.

## `conditions` (type: `array`):

Keep trials with a listed medical condition containing any of these (e.g. BREAST CANCER, ASTHMA).

## `sponsors` (type: `array`):

Sponsor (company or institution) name contains any of these, e.g. Pfizer, Novo Nordisk, University of Toronto.

## `statuses` (type: `array`):

ONGOING, CLOSED or PENDING (English names; French: EN COURS, FERMÉ, EN ATTENTE). Leave empty for all.

## `phases` (type: `array`):

1, 2, 3 or 4 (parsed from the protocol title). A 'Phase 1/2' trial matches both 1 and 2. Trials without a phase in the title are excluded when this is set.

## `studyPopulations` (type: `array`):

ADULT MALE, ADULT FEMALE, PEDIATRIC (contains-match). Leave empty for all.

## `authorizedWithinDays` (type: `integer`):

Only trials whose Health Canada No Objection Letter (NOL) is dated within this many days. 0 = no limit. Ignored if 'Authorized on or after' is set.

## `authorizedSince` (type: `string`):

Only trials with a No Objection Letter dated on or after this date.

## `onlyNew` (type: `boolean`):

Remembers returned trials and their status in the named key-value store 'canada-clinical-trials-state'. Next runs return only new trials and trials whose status changed.

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

Stop after this many trials (newest authorization first). Controls cost.

## Actor input object example

```json
{
  "language": "en",
  "keywords": [
    "obesity",
    "alzheimer"
  ],
  "authorizedWithinDays": 0,
  "onlyNew": false,
  "maxItems": 200
}
```

# Actor output Schema

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

Clinical trials written to the default dataset

# 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 = {
    "keywords": [
        "obesity",
        "alzheimer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("loonieledger/canada-clinical-trials").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 = { "keywords": [
        "obesity",
        "alzheimer",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("loonieledger/canada-clinical-trials").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 '{
  "keywords": [
    "obesity",
    "alzheimer"
  ]
}' |
apify call loonieledger/canada-clinical-trials --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,loonieledger/canada-clinical-trials"
        }
    }
}
```

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/jAm9uOo8srXKk9qSl/builds/Kqo3XjJWxGrH7gcPk/openapi.json
