Documentation menu
Docs / Reference / Search recalls

Search recalls

GET/recall

Parameters

ParameterTypeDescription
qstringoptionalFull-text search across the indexed fields of the record, including names (business, establishment, vendor, contractor) wherever the dataset carries them, e.g. q=brewery or q="Iron Hill".This is the name search: there is no separate name= parameter, and it works on every plan including free. It matches the BUSINESS or trade name, the address, city, county and licence/permit number. It does NOT match an owner, licensee or applicant's personal name: these datasets carry public business records only and never store an individual's name, so searching for a person returns nothing. Space-separated words require all terms (e.g. "wood panel"). Use OR to match any term ("wood OR panel OR acoustic"), quotes for exact phrases ("supply arrangement"), and a leading minus to exclude ("software -hardware").
categorystringoptionalProcurement category: CNST, GD, SRV, SRVTGD.For recalls: product category (e.g. 'Baby products', 'Toys and games'). For healthcare: facility category (acute, long_term, home, behavioral, outpatient, specialty). For storage tanks: record type (tank or release).
recall_typestringoptionalRecall type: food, vehicle, health_product, consumer_product, medical_device, cannabis
recall_agencystringoptionalRecall issuing agency: CFIA, Health Canada, Transport Canada
hazard_classstringoptionalHazard class: class_1, class_2, class_3
allergenstringoptionalFilter food recalls by allergen: milk, peanut, gluten, egg, fish, sesame, soy, sulphites, tree_nut, wheat, mustard, crustacean, shellfish
issued_afterstringoptionalFilter by recall date >= YYYY-MM-DD (event_date).Aliases: date_from, date_after
issued_beforestringoptionalFilter by date <= YYYY-MM-DD.Aliases: date_to, date_before
sort_bystringoptionalSort field: published (publication_date, tenders only), date (event date; this is award_date for contracts/awards), value (the entity's value field), closing (closing_date for tenders)
sort_orderstringoptionalSort order: asc or desc
limitintegeroptional
offsetintegeroptional
cursorstringoptionalPagination cursor from next_cursor in a previous response.Use instead of offset for deep pagination.
langstringoptionalReturn translations for a single language only: en or fr.

Request

curl --request GET \
  --url 'https://recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com/recall' \
  --header 'x-rapidapi-host: recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com' \
  --header 'x-rapidapi-key: YOUR_RAPIDAPI_KEY'
import requests

url = "https://recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com/recall"
headers = {"x-rapidapi-host": "recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com", "x-rapidapi-key": "YOUR_RAPIDAPI_KEY"}
resp = requests.get(url, headers=headers)
print(resp.json())
const res = await fetch("https://recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com/recall", {
  headers: {
    "x-rapidapi-host": "recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com",
    "x-rapidapi-key": "YOUR_RAPIDAPI_KEY",
  },
});
const data = await res.json();
console.log(data);
<?php
$ch = curl_init("https://recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com/recall");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "x-rapidapi-host: recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com",
    "x-rapidapi-key: YOUR_RAPIDAPI_KEY",
]);
echo curl_exec($ch);
require "net/http"
require "uri"

uri = URI("https://recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com/recall")
req = Net::HTTP::Get.new(uri)
req["x-rapidapi-host"] = "recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com"
req["x-rapidapi-key"] = "YOUR_RAPIDAPI_KEY"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
package main

import (
    "fmt"
    "io"
    "net/http"
)

func main() {
    req, _ := http.NewRequest("GET", "https://recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com/recall", nil)
    req.Header.Add("x-rapidapi-host", "recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com")
    req.Header.Add("x-rapidapi-key", "YOUR_RAPIDAPI_KEY")
    res, _ := http.DefaultClient.Do(req)
    defer res.Body.Close()
    body, _ := io.ReadAll(res.Body)
    fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.*;

HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com/recall"))
    .header("x-rapidapi-host", "recalltracker-canadian-product-and-vehicle-recalls.p.rapidapi.com")
    .header("x-rapidapi-key", "YOUR_RAPIDAPI_KEY")
    .build();
HttpResponse<String> res = HttpClient.newHttpClient()
    .send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());

Example response

{
  "entity_type": "recall",
  "count": 5,
  "next": "eyJkIjoiMjAyNS0wMy0xMiIsImkiOiI3NzQifQ==",
  "results": [
    {
      "record_id": "hc:77401",
      "recall_type": "food",
      "agency": "Health Canada",
      "hazard_class": "class_1",
      "event_date": "2025-03-12",
      "recalling_firm": "President's Choice",
      "allergens": [
        "listeria"
      ],
      "translations": {
        "en": {
          "title": "President's Choice Spinach recalled due to Listeria",
          "hazard_description": "May be contaminated with Listeria.",
          "what_to_do": "Do not consume. Return to place of purchase."
        },
        "fr": {
          "title": "Rappel \u00e9pinards President's Choice \u2014 Listeria"
        }
      }
    }
  ]
}

Response fields

One recall record. Measured over 500 live records sampled across municipalities. Percentages say how often each field is populated: sources publish different columns, so a field missing from a given record is normal rather than an error.

FieldTypeDescription
affected_modelsarrayPopulated in 35% of sampled records.
agencystringAlways present.
alert_typestringPopulated in 64% of sampled records.
categoriesarrayPopulated in 51% of sampled records.
categorystringPopulated in 73% of sampled records.
date_modifiedstringPopulated in 39% of sampled records.
event_datestringAlways present.
fetched_atstringWhen Nimbus last ingested this record. Bookkeeping, not source data. Always present.
hazard_classstringPopulated in 48% of sampled records.
identification_numberstringPopulated in 64% of sampled records.
image_urlstringPopulated in 19% of sampled records.
imagesarrayPopulated in 20% of sampled records.
last_updatedstringPopulated in 35% of sampled records.
manufacturer_recall_numberstringPopulated in 31% of sampled records.
notification_typestringPopulated in 35% of sampled records.
product_listarrayPopulated in 51% of sampled records.
recall_class_pagestringPopulated in 12% of sampled records.
recall_datestringAlways present.
recall_idstringAlways present.
recall_typestringAlways present.
recalling_firmstringPopulated in 11% of sampled records.
record_idstringStable identifier for this record. Pass it to the /{entity_type}/{record_id} endpoint. Always present.
statusstringAlways present.
systemstringPopulated in 35% of sampled records.
translationsobjectAlways present.
units_affectedintegerPopulated in 35% of sampled records.
url_enstringPopulated in 98% of sampled records.
url_frstringPopulated in 87% of sampled records.
vehicle_categorystringPopulated in 35% of sampled records.
vehicle_makestringPopulated in 34% of sampled records.
vehicle_modelstringPopulated in 34% of sampled records.
vehicle_slugsarrayPopulated in 35% of sampled records.
13 more fields published by only one or two cities

Present on under 10% of records. Useful when you are working with a specific city, not something to rely on across the dataset.

FieldTypePopulated
allergensarray4.6%
cfia_idstring0.0%
companiesarray8.4%
dinstring0.0%
distributionarray7.4%
importerstring1.8%
manufacturerstring3.2%
municipalitystring0.0%
npnstring0.0%
place_of_originstring6.2%
time_period_soldstring5.6%
units_soldstring6.2%
upcstring0.0%

Errors

Every error returns {"detail": "…"}, a sentence naming what was wrong and, where there is one, the fix.

StatusWhen
400The request is understood but cannot be served as asked, e.g. offset above 9500, or cursor combined with sort_by=value. The message names the fix.
403Missing or invalid API key.
404No such endpoint, or no record with that id.
422A parameter is invalid: an unknown city slug, an impossible date, a limit above 500, an unrecognised sort field, or a misspelled parameter name. The message names the parameter and, where there is one, the nearest valid value.
429Rate limit or plan quota exceeded.
500Unexpected server error.
504The query took too long. Narrow it with a municipality or a date range.
Ready to build?Subscribe on RapidAPI to get your key and start calling RecallTracker in minutes.
Get your API key →