# Health Canada Medical Device Licences & Manufacturers Finder (`rel8ble/health-canada-device-suppliers-scraper`) Actor

Use this to find medical device manufacturers licensed in Canada, from Health Canada's official MDALL list. Input: device words, country, risk class. One result = one licensed device with its maker: name, class, licence type and date, company address. $0.75 per 1,000.

- **URL**: https://apify.com/rel8ble/health-canada-device-suppliers-scraper.md
- **Developed by:** [Giovanni Rich](https://apify.com/rel8ble) (community)
- **Categories:** Lead generation, Business, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.75 / 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

## Health Canada Medical Device Licences & Manufacturers Finder

This **Health Canada medical device licence scraper** turns the official **Medical Devices Active Licence Listing (MDALL)** into clean **supplier and product lists**: type a device such as `catheter`, `glucose` or `implant`, filter by manufacturer country, risk class or licence date, and get one row per licensed device with the **manufacturer name and full address, device name, risk class (2, 3, 4), licence type, licence number and first-licensed date**.

Use it as a **Canadian medical device manufacturer directory**, an **MDALL API alternative**, a **new-licence monitor** (who just got a device licensed in Canada), a **competitor map** of who sells a device type into Canada, or a **supplier finder** for distributors and importers, from your own code, Make, Zapier, n8n or an AI agent.

It reads Health Canada's public MDALL API (`health-products.canada.ca/api/medical-devices`), with **no browser and no login**. The prefilled demo returns 20 rows in a few seconds. **$0.75 per 1,000 results, no start fee.**

**What goes in:** device words, and optional filters on manufacturer country, province / state, risk class, licence type, manufacturer name and first-licensed date. **What comes out:** one row per active device licence, or one row per manufacturer with a switch. **When to use it:** you need to know which companies hold a Canadian licence for a device type, where they are, and since when.

**What it does not have:** **no prices, no minimum order quantities, no e-mails, no phone numbers and no people.** The licence list holds company names and addresses only.

### What you get

- **Licensed device**: licence name, licence number, risk class, licence type (Single Device, Device Family, System, Test Kit, Device Group, Device Group Family), status, first-licensed date.
- **Manufacturer**: company name, Health Canada company ID, street, second address line, city, province / state, postal code, country, company status.
- **Device trade names** (optional switch): every trade name listed under the licence, and search words then match those names too.
- **Supplier mode** (optional switch): one row per manufacturer with its number of matching licences, risk classes, newest licence date and up to 10 example device names.

Size of the list on 6 November 2026: **36,045 active licences held by 7,689 companies** (US 3,225, Canada 1,251, China 535, Germany 459, UK 321, France 267). Fill rates in a 380-row test (all Chinese manufacturers): name, street, city and country 100%; postal code 99%; province / state 88%.

### Sample output

Real rows from the prefilled run (`catheter`, newest first, 6 November 2026), a few of the 25 fields:

| manufacturer | country | city | licensed device | class | type | first licensed |
|---|---|---|---|---|---|---|
| LIFE VASCULAR DEVICES BIOTECH S.L. | ES | Sant Vicenc Dels Horts | IVASCULAR NAVISCORE, SCORING PTCA BALLOON CATHETER | 4 | Device Family | 2026-11-04 |
| STRYKER NEUROVASCULAR | US | Fremont | BROADWAY 8 ASPIRATION CATHETER | 4 | Single Device | 2026-11-02 |
| C2DX INC. (DBA EVERIS) | US | Schoolcraft | ADVANCE SALIVARY BALLOON CATHETER | 2 | Device Family | 2026-10-26 |
| BARD PERIPHERAL VASCULAR, INC. | US | Tempe | TRUE FLOW VALVULOPLASTY PERFUSION CATHETER | 4 | Device Family | 2026-10-08 |
| ABBOTT MEDICAL | US | Santa Clara | ARMADA 14 NC PTA CATHETER (OTW) | 4 | Device Family | 2026-09-28 |
| SHANGHAI MEKON MEDICAL DEVICES CO., LTD | CN | Shanghai | SAFETY I.V. CATHETER (SCALP VEIN SET TYPE) | 2 | Device Family | 2026-09-15 |

### Use cases

- **Supplier sourcing for distributors and importers**: find manufacturers that already hold a Canadian licence for a device type, by country
- **New market entrants**: set "First licensed on or after" to see who got a device licensed this month
- **Competitor mapping**: every licence one manufacturer holds, or every maker of one device type
- **Regulatory due diligence**: check that a supplier's device is licensed in Canada, its class and since when
- **Lead generation for suppliers to the industry**: lists of device makers by class and country (company data only)
- **Pair with FDA data**: combine with an FDA registration list to see who sells in both markets

### Pricing

**$0.75 per 1,000 results** (pay per result, $0.00075 each), no start fee, platform usage included. A result is one row saved to your dataset. Searches that find nothing, duplicates and failed downloads are never charged. Set **Max results per search** to cap the cost of a run.

The data comes from a free public API. You pay for the ready rows, the joined manufacturer address, the filters and the supplier mode, not for access. If you prefer, call the API yourself.

No Apify Store actor covered Health Canada device licences in the 21 October 2026 Store snapshot.

### FAQ

**Where does the data come from?** Health Canada's Medical Devices Active Licence Listing, published under the **Open Government Licence - Canada**. Contains information licensed under the Open Government Licence - Canada. Health Canada does not endorse this actor.

**How fresh is it?** Each run downloads the current list. On 6 November 2026 the records showed a refresh date of 2026-11-05. Every row carries `dataUpdated`.

**Why no class 1 devices?** In Canada class 1 devices need no device licence, so they are not in the licence list.

**Does it include phone numbers or e-mails?** No. The list has company names and addresses only.

**How are search words matched?** Every word must appear in the licence name, in any order, ignoring case and accents (`balloon catheter` finds "SCORING PTCA BALLOON CATHETER"). With **Add device trade names** on, the words also match the trade names under each licence.

**How do I get one row per company?** Turn on **One row per company**. You get each manufacturer once, with how many matching licences it holds.

**Why does a run take a few seconds even for 20 rows?** The actor downloads the full official list (about 12 MB, about 25 MB more with trade names) and filters it. That is why it can search words anywhere in the name.

**Known gaps**: the licence holder is the legal manufacturer, which can be a parent company rather than the factory; the province / state code is raw as filed (Spanish provinces show as numbers); archived (cancelled) licences are not included; Medical Device Establishment Licences (importers and distributors) are a different Health Canada list and are not covered.

### How to use

1. Open the actor and type one or more device words, e.g. `catheter`.
2. Optional: set manufacturer countries (`US`, `CN`), risk classes, licence types or a first-licensed date.
3. Set **Max results per search** (start with 20).
4. Click **Start**, then export the dataset as CSV, Excel or JSON.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Device words; each runs as its own search on the licence name. |
| `countries`, `regions` | Manufacturer country (ISO code) and province / state code. Any of them matches. |
| `riskClasses` | Class 2, 3, 4. |
| `licenceTypes` | Single Device, Device Family, System, Test Kit, Device Group, Device Group Family. |
| `companyNames` | Keep manufacturers whose name contains one of these. |
| `licensedAfter` | First licensed on or after this date (YYYY-MM-DD). |
| `uniqueCompanies` | One row per manufacturer instead of per licence. |
| `includeDeviceNames` | Add trade names under each licence (and match words on them). |
| `maxResultsPerSearch` | Rows per search, newest first; 0 = all. |

Invalid filter values are ignored and listed in the run summary. A filter where no value is valid stops the run instead of widening the search.

### Input example

```json
{
    "searchTerms": ["catheter", "insulin pump"],
    "countries": ["US", "CN"],
    "riskClasses": ["3", "4"],
    "licensedAfter": "2026-01-01",
    "maxResultsPerSearch": 200
}
```

### Output example

One real row from the prefilled run (6 November 2026):

```json
{
    "rowType": "licence",
    "licenceNumber": 116525,
    "licenceName": "IVASCULAR NAVISCORE, SCORING PTCA BALLOON CATHETER",
    "riskClass": 4,
    "licenceType": "Device Family",
    "licenceStatus": "Issued",
    "firstLicensedDate": "2026-11-04",
    "deviceTradeNames": null,
    "deviceCount": null,
    "companyName": "LIFE VASCULAR DEVICES BIOTECH S.L.",
    "companyId": 140101,
    "addressLine1": "Cami De Can Ubach,",
    "addressLine2": "11 (Pol. Ind. Les Fallulles)",
    "city": "Sant Vicenc Dels Horts",
    "region": "08",
    "postalCode": "08620",
    "countryCode": "ES",
    "companyStatus": "Active",
    "licenceCount": null,
    "sampleLicenceNames": null,
    "riskClasses": null,
    "latestLicensedDate": null,
    "searchTerm": "catheter",
    "dataUpdated": "2026-11-05",
    "scrapedAt": "2026-11-06T18:26:13.767Z"
}
```

A `RUN_SUMMARY` record in the key-value store lists, per search, how many licences match, how many rows were saved, why the search stopped and any input that was ignored.

### Integrations

Export the dataset as JSON, CSV, Excel, XML or HTML, or pull it with the Apify API and the JavaScript / Python clients. Connect it to Make, Zapier, n8n, Google Sheets, HubSpot or Slack with Apify integrations and webhooks, schedule it weekly with `licensedAfter` to catch new licences, or let an AI agent call it through the Apify MCP server.

Need a custom scraper or a ready dataset? Hire me on Fiverr: https://www.fiverr.com/rel8ble

# Actor input Schema

## `searchTerms` (type: `array`):

Device words, e.g. "catheter", "glucose", "implant". Each runs as its own search; every word must appear in the licence name (or a device trade name when those are added). Leave empty to search on the filters only.

## `countries` (type: `array`):

Two-letter ISO codes of the manufacturer, e.g. "CA", "US", "DE", "CN". Any of them matches.

## `regions` (type: `array`):

Province or state codes of the manufacturer, e.g. "ON", "QC", "CA", "MN". Any of them matches.

## `riskClasses` (type: `array`):

Canadian device risk class. Class 1 devices need no licence and are not in this list.

## `licenceTypes` (type: `array`):

Keep only these licence types.

## `companyNames` (type: `array`):

Keep licences of manufacturers whose name contains one of these, e.g. "Medtronic".

## `licensedAfter` (type: `string`):

YYYY-MM-DD. Use it to watch for newly licensed devices and new market entrants.

## `uniqueCompanies` (type: `boolean`):

On: one row per manufacturer with its count of matching licences and up to 10 example device names. This gives a supplier list instead of a product list.

## `includeDeviceNames` (type: `boolean`):

On: also downloads the device list (about 23 MB, ~10 s more) to add the trade names under each licence, and search words then also match those names.

## `maxResultsPerSearch` (type: `integer`):

Rows to save per search. 0 = everything that matches. Newest licences come first. You pay per row saved, so start small.

## `maxRequestRetries` (type: `integer`):

Retries per failed download.

## Actor input object example

```json
{
  "searchTerms": [
    "catheter"
  ],
  "uniqueCompanies": false,
  "includeDeviceNames": false,
  "maxResultsPerSearch": 20,
  "maxRequestRetries": 5
}
```

# Actor output Schema

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

One row per active device licence (or per manufacturer): device name, risk class, licence type, first licensed date, manufacturer name and address.

## `summary` (type: `string`):

Counts per search, stop reasons and any ignored input.

# 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 = {
    "searchTerms": [
        "catheter"
    ],
    "maxResultsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/health-canada-device-suppliers-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 = {
    "searchTerms": ["catheter"],
    "maxResultsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("rel8ble/health-canada-device-suppliers-scraper").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 '{
  "searchTerms": [
    "catheter"
  ],
  "maxResultsPerSearch": 20
}' |
apify call rel8ble/health-canada-device-suppliers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rel8ble/health-canada-device-suppliers-scraper"
        }
    }
}
```

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/n5tHYeTsmXpg6lVQi/builds/NxsGa1llZvboF9cCG/openapi.json
