Canada Recalls & Safety Alerts Search
Pricing
from $1.50 / 1,000 results
Canada Recalls & Safety Alerts Search
Search Government of Canada recalls and safety alerts for food, vehicles, health and consumer products.
Canada Recalls Search
Search the Government of Canada's Recalls and Safety Alerts (food, vehicles, health products, medical devices, consumer products and cannabis) and export structured results: title, category, dates, issue, product description, brand, models, hazard and what to do.
Unofficial tool. This Actor is not affiliated with, endorsed by or operated by the Government of Canada, Health Canada, the Canadian Food Inspection Agency or Transport Canada. All data comes from information the Government of Canada publishes openly at recalls-rappels.canada.ca. Always check the linked official notice before acting on a recall.
Use cases
1. E-commerce sellers: compliance checks before you list or restock
Amazon, Shopify and marketplace sellers in Canada can check a brand or product against recent recalls before listing it, and re-check their catalogue every week. A hit means: pause the listing, contact the supplier, and read the official notice.
{ "query": "baby crib", "category": "consumer-products", "dateFrom": "2026-01-01", "maxResults": 20 }
Feed every brand from your catalogue as a separate run (or Apify Task) and alert on any non-empty dataset.
2. AI agents: a tool call that answers "is this product recalled in Canada?"
The input is small and the output is flat JSON, so an LLM agent can call it through the Apify MCP server or the Apify API as a tool. A typical agent call is fast and feed-only:
{ "query": "peanut butter", "category": "food", "maxResults": 5, "includeDetails": false }
The agent then reads title, dateUpdated, hazard and url and links the user to the official notice. Turn includeDetails on when the agent needs brand, models or whatToDo.
3. Procurement and supply-chain teams: risk screening of suppliers and parts
Screen suppliers, brands or component types (lithium batteries, airbags, medical devices) before signing a purchase order, and monitor them on a schedule.
{ "query": "lithium battery", "category": "all", "dateFrom": "2025-10-01", "maxResults": 100 }
Run it weekly with an Apify Schedule and send new rows to Slack, email or a spreadsheet with an Apify integration.
How it works
-
Downloads the official open-data JSON feed of the Recalls and Safety Alerts site (updated daily):
- English:
https://recalls-rappels.canada.ca/sites/default/files/opendata-donneesouvertes/HCRSAMOpenData.json - French:
https://recalls-rappels.canada.ca/sites/default/files/opendata-donneesouvertes/SCRSAMDonneesOuvertes.json
Dataset page: Recalls and Safety Alerts – Open Government Portal.
- English:
-
Filters notices locally (see below), sorted with the most recently updated first.
-
Optionally (
includeDetails, on by default) opens each matching notice page over plain HTTP and reads the brand, models, hazard, product description, publication date and "What you should do" sections. No browser is used.
The feed has no brand, model or hazard columns. These fields come from the detail pages, and the page layout varies by publisher (CFIA, Health Canada, Transport Canada). When a section is missing, the Actor falls back to feed data. detailsFetched tells you whether the detail page was read.
How filtering works (local, not server-side)
All filtering (query, category, dateFrom, includeArchived) happens inside the Actor, after download. The official source is a static JSON file. It accepts no search, category, date or paging parameters, and any query string sent to it is ignored. The website's own search (/en/search/site?search_api_fulltext=…) is an HTML page, not an API, so the Actor does not use it.
- Keywords (
query): every word must appear, ignoring case and accents, in at least one oftitle,productDescription,brandormodels. Simple plurals match too (raspberryfinds "raspberries"). Text that appears only inissue, the category or the organization does not count. - Category: matched against the normalized
category, which is derived from the publishing organization and the feed's category text. dateFrom: compared with the feed's "Last updated" date (dateUpdated).- Paging and re-checking: matching notices are processed in pages, newest first. With
includeDetails, each page's detail pages are fetched and every item is checked again against its finaltitle,productDescription,brandandmodels. For example, a detail-page description can replace the feed's product name. Items that no longer match are dropped, and the Actor moves on to the next page. It stops atmaxResultsmatches or when no notices are left. - Limitation: brand and model names that appear only on a detail page, and not in the feed's title or product name, cannot be searched. Finding them would mean downloading every one of the ~34,000 detail pages.
To check the filters against the live feed, run npm run verify. It fails if any result does not contain the keywords or violates the category or date filter.
Input
| Field | Type | Default | Description |
|---|---|---|---|
query | string | "" | Keywords matched locally against title, productDescription, brand and models. All words must match. Matching ignores case and accents. Leave empty to list the latest notices. |
category | string | all | One of all, food, vehicles, health-products, medical-devices, consumer-products, cannabis. |
dateFrom | string | – | YYYY-MM-DD (a full ISO timestamp is also accepted). Only notices last updated on or after this date. |
maxResults | integer | 50 | 1–1000. |
language | string | en | en or fr. Selects the feed and the detail-page language. |
includeDetails | boolean | true | Visit notice pages for brand, models, hazard and similar fields. Turn it off for a fast, feed-only run. |
includeArchived | boolean | true | Include notices the publisher has archived. |
Example:
{"query": "peanut","category": "food","dateFrom": "2026-01-01","maxResults": 20,"language": "en"}
Output
Each dataset item:
| Field | Description |
|---|---|
recallId | Notice ID (the feed's NID). |
title | Notice title. |
category | Normalized category (food, vehicles, health-products, medical-devices, consumer-products, cannabis, other). |
subcategory | The feed's original category text, e.g. Allergen - Peanut. |
organization | Publishing organization from the feed (e.g. CFIA, TC). |
datePublished | Publication/start date from the notice page. Falls back to the feed's "Last updated" date. |
dateUpdated | The feed's "Last updated" date. |
issue | Short issue label from the feed (e.g. Allergen - Peanut, Fire hazard). |
productDescription | Product description section of the page. Falls back to the feed's product name. |
brand | Brand names from the affected-products table or labels. Falls back to the brand named in the title. |
models | Model names/numbers (consumer products, vehicles, devices), when listed. |
hazard | "Hazard identified" section. Falls back to the feed's issue label. |
whatToDo | "What you should do" section. |
recallClass | Recall class/type when provided (e.g. Class 2, Type II). |
archived | Whether the publisher archived the notice. |
language | en or fr. |
url | Official notice URL. |
detailsFetched | true if the detail page was loaded and parsed. |
fetchedAt | ISO timestamp of this run. |
Example item (illustrative; values depend on the live notice):
{"recallId": "82692","title": "Certain Summerhill Market brand raspberries and raspberry-containing products recalled due to norovirus","category": "food","subcategory": "Frozen - Other","organization": "CFIA","datePublished": "2026-09-29","dateUpdated": "2026-09-29","issue": "Norovirus","productDescription": "Frozen raspberries, frozen berry mix, frozen smoothie mix, protein power pod raspberry","brand": ["Summerhill Market"],"models": [],"hazard": "Norovirus","whatToDo": "Do not consume, serve, use, sell, or distribute recalled products.\nCheck to see if you have recalled products.","recallClass": "Class 2","archived": false,"language": "en","url": "https://recalls-rappels.canada.ca/en/alert-recall/certain-summerhill-market-brand-raspberries-and-raspberry-containing-products-recalled","detailsFetched": true,"fetchedAt": "2026-09-30T12:00:00.000Z"}
FAQ
Is this an official Government of Canada service? No. It is an unofficial tool that reads the Government of Canada's open data. Always confirm with the linked official notice.
How fresh is the data?
The official feed is refreshed daily. Every run downloads the current feed, so results are as fresh as the feed. fetchedAt shows when the run read it.
Why did my brand search miss a recall? Keywords are matched against the title, product description, brand and models. A brand that appears only deep inside a detail page and nowhere in the feed cannot be found (see "How filtering works").
How do I make it fast and cheap?
Set includeDetails to false. The run then reads only the feed and finishes in seconds. Keep maxResults small.
Does it cover the United States or other countries? No. Only notices published on recalls-rappels.canada.ca (Health Canada, CFIA, Transport Canada).
Can I get French results?
Yes. Set language to fr.
Can I monitor new recalls automatically?
Yes. Save your input as an Apify Task, run it on a Schedule with dateFrom set to a recent date, and connect an integration (Slack, email, webhook, Google Sheets) to the run's dataset.
Local development
npm installnpm test # unit tests (feed normalization, filtering, paging, detail-page parsing)npm run verify # check query/category/dateFrom filtering against the live feednpm run buildapify run --input '{"query":"peanut","maxResults":5}' # results in storage/datasets/default
Data licence
Contains information licensed under the Open Government Licence – Canada. Source: Government of Canada, Recalls and Safety Alerts.