Canada Recalls & Safety Alerts Search avatar

Canada Recalls & Safety Alerts Search

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Canada Recalls & Safety Alerts Search

Canada Recalls & Safety Alerts Search

Search Government of Canada recalls and safety alerts for food, vehicles, health and consumer products.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Qi Wang

Qi Wang

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

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

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

  2. Filters notices locally (see below), sorted with the most recently updated first.

  3. 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 of title, productDescription, brand or models. Simple plurals match too (raspberry finds "raspberries"). Text that appears only in issue, 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 final title, productDescription, brand and models. 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 at maxResults matches 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

FieldTypeDefaultDescription
querystring""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.
categorystringallOne of all, food, vehicles, health-products, medical-devices, consumer-products, cannabis.
dateFromstring–YYYY-MM-DD (a full ISO timestamp is also accepted). Only notices last updated on or after this date.
maxResultsinteger501–1000.
languagestringenen or fr. Selects the feed and the detail-page language.
includeDetailsbooleantrueVisit notice pages for brand, models, hazard and similar fields. Turn it off for a fast, feed-only run.
includeArchivedbooleantrueInclude notices the publisher has archived.

Example:

{
"query": "peanut",
"category": "food",
"dateFrom": "2026-01-01",
"maxResults": 20,
"language": "en"
}

Output

Each dataset item:

FieldDescription
recallIdNotice ID (the feed's NID).
titleNotice title.
categoryNormalized category (food, vehicles, health-products, medical-devices, consumer-products, cannabis, other).
subcategoryThe feed's original category text, e.g. Allergen - Peanut.
organizationPublishing organization from the feed (e.g. CFIA, TC).
datePublishedPublication/start date from the notice page. Falls back to the feed's "Last updated" date.
dateUpdatedThe feed's "Last updated" date.
issueShort issue label from the feed (e.g. Allergen - Peanut, Fire hazard).
productDescriptionProduct description section of the page. Falls back to the feed's product name.
brandBrand names from the affected-products table or labels. Falls back to the brand named in the title.
modelsModel 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.
recallClassRecall class/type when provided (e.g. Class 2, Type II).
archivedWhether the publisher archived the notice.
languageen or fr.
urlOfficial notice URL.
detailsFetchedtrue if the detail page was loaded and parsed.
fetchedAtISO 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 install
npm test # unit tests (feed normalization, filtering, paging, detail-page parsing)
npm run verify # check query/category/dateFrom filtering against the live feed
npm run build
apify 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.