Health Canada Drug Database Scraper avatar

Health Canada Drug Database Scraper

Pricing

Pay per event

Go to Apify Store
Health Canada Drug Database Scraper

Health Canada Drug Database Scraper

Extract official Health Canada DPD records: DINs, statuses, ingredients, routes, schedules, company names, ATC classes, and product URLs.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Categories

Share

Extract official Canadian Drug Product Database (DPD) records from Health Canada's public JSON API. The actor returns product rows with DINs, brands, company names, statuses, active ingredients, dosage forms, routes, schedules, therapeutic classes, and official product URLs.

Use it when you need repeatable Canada-specific drug master data without building and maintaining your own DPD API joining pipeline.

What does Health Canada Drug Database Scraper do?

Health Canada Drug Database Scraper downloads structured records from the public Health Canada Drug Product Database API.

It starts with the official drugproduct endpoint and can join related DPD endpoints by drug_code.

The output is one normalized dataset row per drug product.

Each row includes identifiers, regulatory status, ingredient data, dosage form data, route data, schedule data, and provenance.

Who is it for?

🧪 Regulatory affairs teams use it to monitor Canadian marketed, approved, dormant, or cancelled products.

💊 Pharma data teams use it to enrich internal drug master-data tables with DIN and DPD attributes.

🏥 Healthcare analytics teams use it to build formularies, product catalogs, and Canada-specific drug reference datasets.

🔁 Compliance operators use it for recurring checks instead of one-off manual CSV exports.

Why use this actor?

The official source is public, structured, and maintained by Health Canada.

The actor saves you from writing endpoint loaders, retry logic, field normalization, and drug_code joins.

You can run a tiny brand/DIN lookup or a larger recurring monitoring job with the same input schema.

Data source

The actor uses Health Canada's public API under:

https://health-products.canada.ca/api/drug/

It does not require a login, API key, browser automation, or proxy.

What data can you extract?

FieldDescription
drugCodeHealth Canada DPD drug code
drugIdentificationNumberDIN, preserving leading zeros
brandNameProduct brand name
companyNameCompany associated with the product
currentStatusJoined product status
activeIngredientsIngredient names, strengths, and dosage units
formsPharmaceutical forms
routesRoutes of administration
schedulesPrescription / schedule data
therapeuticClassesATC number and class when available
officialProductUrlHealth Canada product detail URL

How much does it cost to scrape the Health Canada Drug Database?

The actor uses pay-per-event pricing.

There is a $0.005 start charge per run and a tiered per-item charge for each drug product saved.

Current BRONZE per-item price is $0.00002929 per DPD product row, with lower prices on higher Apify tiers.

Use filters and a reasonable maxItems value for low-cost targeted runs.

Input options

  • language: choose English or French source data.
  • maxItems: cap the number of drug products saved.
  • includeRelatedData: join related DPD endpoints into each product row.
  • drugCodes: extract exact DPD drug codes.
  • dins: extract exact DINs.
  • brandNames: match brand-name substrings.
  • companyNames: match company-name substrings.
  • statuses: match statuses such as Marketed.
  • activeIngredientNames: match active ingredient substrings.

Example input: marketed Advil products

{
"language": "en",
"maxItems": 50,
"brandNames": ["ADVIL"],
"statuses": ["Marketed"],
"includeRelatedData": true
}

Example input: active ingredient monitoring

{
"language": "en",
"maxItems": 200,
"activeIngredientNames": ["IBUPROFEN"],
"includeRelatedData": true
}

Example output

{
"drugCode": 12345,
"drugIdentificationNumber": "00000000",
"brandName": "EXAMPLE BRAND",
"companyName": "EXAMPLE COMPANY",
"currentStatus": "Marketed",
"activeIngredients": [
{ "name": "IBUPROFEN", "strength": "200", "strengthUnit": "MG", "dosageValue": null, "dosageUnit": null }
],
"forms": ["Tablet"],
"routes": ["Oral"],
"schedules": ["PRESCRIPTION"],
"officialProductUrl": "https://health-products.canada.ca/dpd-bdpp/info?lang=en&code=12345",
"language": "en"
}

How to run it

  1. Open the actor on Apify.
  2. Choose your language and filters.
  3. Keep includeRelatedData enabled when you need enriched product rows.
  4. Set maxItems to your desired limit.
  5. Run the actor and export the dataset as JSON, CSV, Excel, or via API.

Tips for better results

Use DIN filters for exact product lookups.

Use brand-name filters for product families.

Use status filters for monitoring only marketed or only cancelled products.

Use active ingredient filters for recurring ingredient-level surveillance.

Disable related data only when you need a faster raw product list.

Integrations

Send the dataset to Google Sheets for regulatory review queues.

Load JSON output into BigQuery, Snowflake, or Postgres for drug master-data enrichment.

Use Apify webhooks to trigger Slack, email, or downstream ETL jobs after each monitoring run.

Connect this actor with internal formularies or product-catalog workflows.

API usage with Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/health-canada-drug-database-scraper').call({
language: 'en',
maxItems: 100,
statuses: ['Marketed'],
includeRelatedData: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);

API usage with Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/health-canada-drug-database-scraper').call(run_input={
'language': 'en',
'maxItems': 100,
'statuses': ['Marketed'],
'includeRelatedData': True,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items[0])

API usage with cURL

curl "https://api.apify.com/v2/acts/automation-lab~health-canada-drug-database-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"language":"en","maxItems":100,"statuses":["Marketed"],"includeRelatedData":true}'

MCP for Claude and other clients

Use Apify MCP to run the actor from Claude Desktop, Claude Code, or other MCP clients.

MCP URL:

https://mcp.apify.com/?tools=automation-lab/health-canada-drug-database-scraper

Claude Code setup:

$claude mcp add apify-health-canada-drugs "https://mcp.apify.com/?tools=automation-lab/health-canada-drug-database-scraper"

Claude Desktop JSON configuration:

{
"mcpServers": {
"apify-health-canada-drugs": {
"url": "https://mcp.apify.com/?tools=automation-lab/health-canada-drug-database-scraper"
}
}
}

Example prompts:

  • "Run the Health Canada Drug Database scraper for marketed ibuprofen products and summarize the output."
  • "Extract DIN records for this brand and compare the current statuses."
  • "Create a weekly monitoring workflow for dormant Canadian drug products."

Data freshness

The actor fetches data live from the Health Canada API during each run.

Freshness depends on Health Canada's upstream DPD update cadence.

The output includes lastUpdateDate from the source and scrapedAt from the actor run.

Limitations

The actor returns data available in the public DPD API.

It does not infer medical advice, clinical equivalence, pricing, patents, recalls, or availability outside the DPD fields.

Very broad runs can return many products, so use maxItems deliberately.

Legality

This actor uses a public government data API and does not bypass login walls or collect personal data.

You are responsible for using the data according to Health Canada's terms and your local compliance requirements.

The dataset should not be treated as medical advice.

Troubleshooting

If you get fewer records than expected, check whether your filters are too narrow.

If a DIN search returns nothing, preserve leading zeros and pass DINs as strings.

If related arrays are empty, confirm includeRelatedData is set to true.

FAQ

Can I scrape all DPD products?

Yes. Set a high maxItems and leave filters empty. For cost control, start with a smaller test run first.

Does it support French?

Yes. Set language to fr to request French API responses and product URLs.

Does it need a proxy?

No. The actor uses the official public JSON API over normal HTTP requests.

Can I monitor only marketed products?

Yes. Set statuses to ["Marketed"].

You may also need other automation-lab healthcare or regulatory actors when available:

  • https://apify.com/automation-lab/openfda-scraper
  • https://apify.com/automation-lab/clinical-trials-fda-scraper
  • https://apify.com/automation-lab/fda-device-recalls

Support

If you need a field from another Health Canada endpoint, open an Apify issue with the endpoint name and an example product.

Changelog

Initial version extracts Health Canada DPD products and joins related public API endpoints by drug_code.