changedInput schema / properties / description_search / description
Previous value: -"Keyword search within the recall Description field only (does not search Title, Hazards, or remedy text). Use for product details not captured in product_name — model numbers, colors, sale channels. For hazard concepts, prefer hazard_search; for the recall headline, prefer title_search."New value: +"Keyword search within the recall description only — not the title, hazard text, or remedy instructions; matches descriptions containing every word, in any order. Use for product details not captured in product_name — model numbers, colors, sale channels. For hazard concepts, prefer hazard_search; for the recall headline, prefer title_search."
addedInput schema / properties / description_search / maxLength
Added value: +500
changedInput schema / properties / distributor / description
Previous value: -"Distributor company name, e.g. \"Walmart\", \"Costco\". Substring match against the Distributors array — a role distinct from retailer and importer, and populated on far fewer records."New value: +"Distributor company name, e.g. \"Walmart\", \"Costco\". Matches recalls whose distributor names contain every word, in any order — a role distinct from retailer and importer, and listed on far fewer recalls."
addedInput schema / properties / distributor / maxLength
Added value: +500
changedInput schema / properties / hazard_search / description
Previous value: -"Hazard or safety-concept keyword, e.g. \"fire\", \"choking\", \"burn\", \"laceration\". Applied client-side after the upstream fetch. Matches when the term appears in any of: hazard descriptions, product names, or remedy instructions (OR across the three, case-insensitive substring). Use this rather than the upstream Hazard parameter, which CPSC recognizes but never matches."New value: +"Hazard or safety-concept keyword, e.g. \"fire\", \"choking\", \"burn\", \"tip-over dresser\". Matches when every word appears in the hazard descriptions, product names, or remedy instructions — each word in any of the three, in any order, case-insensitive. The filter to use for hazard types; combine it with another filter to narrow a broad hazard."
addedInput schema / properties / hazard_search / maxLength
Added value: +500
changedInput schema / properties / importer / description
Previous value: -"Importer company name. Use when searching for recalls by the company that brought the product into the US."New value: +"Importer company name. Matches recalls whose importer names contain every word, in any order. Use when searching for recalls by the company that brought the product into the US."
addedInput schema / properties / importer / maxLength
Added value: +500
changedInput schema / properties / limit / description
Previous value: -"Maximum number of results to return (applied client-side — the API returns all matches). Defaults to 20."New value: +"Maximum number of recalls to return on this page. Defaults to 20. A page returns fewer when it reaches the 64,000-byte response size budget; has_more then says more remain."
changedInput schema / properties / manufacturer / description
Previous value: -"Manufacturer name, e.g. \"Samsung\", \"LEGO\". Substring match against the Manufacturers array. Note: many recalls list the importer or retailer as the primary org rather than the manufacturer — try importer or retailer if this returns no results."New value: +"Manufacturer name, e.g. \"Samsung\", \"LEGO\". Matches recalls whose manufacturer names contain every word, in any order. Many recalls name the importer, retailer, or distributor rather than the manufacturer — try those filters when this finds nothing."
addedInput schema / properties / manufacturer / maxLength
Added value: +500
changedInput schema / properties / offset / description
Previous value: -"Skip this many matching records before returning results. Combine with limit to page through total_found — e.g. limit 20 with offset 0, 20, 40. An offset at or past total_found returns an empty result set rather than an error."New value: +"Skip this many matching records before returning results. To page through total_found, raise offset by the number of recalls the previous page returned — limit, unless that page reached the response size budget. An offset at or past total_found returns an empty result set rather than an error."
changedInput schema / properties / product_name / description
Previous value: -"Product name to search for, e.g. \"crib\", \"space heater\", \"bicycle\". Substring match — partial names work."New value: +"Product name to search for, e.g. \"crib\", \"space heater\", \"bicycle\". Matches recalls whose product names contain every word, in any order — partial words work."
addedInput schema / properties / product_name / maxLength
Added value: +500
changedInput schema / properties / remedy / description
Previous value: -"Keyword search within the free-text remedy instructions, e.g. \"repair\", \"refund\", \"firmware update\". Substring match, applied upstream. This searches the remedy narrative, not the structured remedy_options enum — \"repair\" matches records whose remedy_options list only \"Refund\" but whose instructions describe a free repair kit. Combines with the other filters using AND; use hazard_search instead to match remedy text as one of several fields."New value: +"Keyword search within the free-text remedy instructions, e.g. \"repair\", \"refund\", \"firmware update\"; matches instructions containing every word, in any order. This searches the remedy text, not the remedy_options categories — \"repair\" matches records whose remedy_options list only \"Refund\" but whose instructions describe a free repair kit. Combines with the other filters using AND; use hazard_search instead to match remedy text as one of several fields."
addedInput schema / properties / remedy / maxLength
Added value: +500
changedInput schema / properties / retailer / description
Previous value: -"Retailer name, e.g. \"Walmart\", \"Target\", \"Amazon\". Substring match against the retailer narrative (which includes store name, dates sold, and price)."New value: +"Retailer name, e.g. \"Walmart\", \"Target\", \"Amazon\". Matches recalls whose retailer text (store name, dates sold, and price) contains every word, in any order."
addedInput schema / properties / retailer / maxLength
Added value: +500
changedInput schema / properties / title_search / description
Previous value: -"Keyword search within the recall Title, e.g. \"chandelier\", \"space heater\", \"inclined sleeper\". Substring match. CPSC titles name the brand, the product, and the hazard, which makes this the highest-signal single filter for most searches."New value: +"Keyword search within the recall title, e.g. \"chandelier\", \"space heater\", \"Graco crib\". Matches titles containing every word, in any order. CPSC titles name the brand, the product, and the hazard, which makes this the highest-signal single filter for most searches."
addedInput schema / properties / title_search / maxLength
Added value: +500
changedOutput schema / anyOf
Previous value: -[
- {
- "not": {
- "required": [
- "error"
- ]
- },
- "required": [
- "recalls",
- "total_found",
- "truncated",
- "offset",
- "has_more",
- "cpsc_jurisdiction",
- "source_note"
- ]
- },
- {
- "required": [
- "error"
- ]
- }
-]New value: +[
+ {
+ "not": {
+ "required": [
+ "error"
+ ]
+ },
+ "required": [
+ "recalls",
+ "total_found",
+ "truncated",
+ "offset",
+ "has_more",
+ "cpsc_jurisdiction",
+ "source_note",
+ "effectiveQuery"
+ ]
+ },
+ {
+ "required": [
+ "error"
+ ]
+ }
+]
changedOutput schema / properties / cpsc_jurisdiction / description
Previous value: -"CPSC covers consumer products — toys, electronics, furniture, appliances, tools, clothing. Does NOT cover: food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF)."New value: +"Which products CPSC covers and which agencies cover the rest — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF)."
addedOutput schema / properties / effectiveQuery
Added value: +{
+ "description": "The search criteria as applied, joined with AND: each non-blank text filter trimmed, the hazard alias resolved to hazard_search, and blank date bounds dropped.",
+ "type": "string"
+}
changedOutput schema / properties / error / properties / data / properties / reason / description
Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match. `no_results`: No recalls matched the search filters, including hazard_search. `upstream_error`: The saferproducts.gov API returned a transient error or timed out. `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `missing_criteria`: No search criterion was given: every text filter was omitted or blank and no date bound was set. `invalid_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match. `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, or sent an unreadable response. `upstream_rejected`: CPSC rejected the request instead of returning recalls, and it rejects the same request every time. Other values are possible when a failure originates below the handler."
changedOutput schema / properties / error / properties / data / properties / reason / examples
Previous value: -[
- "invalid_date_range",
- "no_results",
- "upstream_error",
- "upstream_rejected"
-]New value: +[
+ "missing_criteria",
+ "invalid_date_range",
+ "upstream_error",
+ "upstream_rejected"
+]
addedOutput schema / properties / notice
Added value: +{
+ "description": "Present when the page needs explaining: zero matches (with which criterion to relax), an offset past the last match, or a page cut short by the response size budget (with the offset to continue from).",
+ "type": "string"
+}
changedOutput schema / properties / recalls / items / properties / data_quality_notes / description
Previous value: -"Gaps this server observed in the upstream CPSC record — absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing."New value: +"Gaps this server observed in the CPSC record — absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing."
changedOutput schema / properties / recalls / items / properties / data_quality_notes / items / description
Previous value: -"One gap found in the upstream record."New value: +"One gap found in the CPSC record."
changedOutput schema / properties / recalls / items / properties / upcs / description
Previous value: -"UPC codes for this recall (sparse — ~4% of records have UPCs). UPCs are stored at the recall level in the API, not per-product; when a recall covers multiple products, all UPCs apply to the recall as a whole."New value: +"UPC codes for this recall (sparse — ~4% of records have UPCs). CPSC lists UPCs for the recall as a whole, not per product, so on a recall covering several products a UPC cannot be tied to one of them."
changedOutput schema / properties / total_found / description
Previous value: -"Total matching records, counted after hazard_search is applied and before offset and limit narrow the window."New value: +"Total matching records, counted after every filter is applied and before offset, limit, and the response size budget narrow the window."
changedOutput schema / properties / truncated / description
Previous value: -"True when total_found exceeds the limit. Independent of offset."New value: +"True when matching records remain past this page — always equal to has_more."