{
  "openapi": "3.0.1",
  "info": {
    "title": "US CPSC Product Recalls Scraper",
    "description": "Scrape US CPSC SaferProducts.gov recalls via the free official REST API, no key required. Search by title, product, category, date range, hazard, manufacturer, retailer, importer, distributor, or remedy type. Full product, hazard, injury, remedy, and image data included.",
    "version": "1.0",
    "x-build-id": "O6ryvJZzU5Bn2x1d4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/crawlerbros~us-cpsc-product-recalls-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-crawlerbros-us-cpsc-product-recalls-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/crawlerbros~us-cpsc-product-recalls-scraper/runs": {
      "post": {
        "operationId": "runs-sync-crawlerbros-us-cpsc-product-recalls-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/crawlerbros~us-cpsc-product-recalls-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-crawlerbros-us-cpsc-product-recalls-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "byRecallNumber"
            ],
            "type": "string",
            "description": "Search recalls with filters, or fetch specific recalls by their official recall number.",
            "default": "search"
          },
          "recallTitle": {
            "title": "Recall title contains",
            "type": "string",
            "description": "Filter recalls whose title contains this text (e.g. \"stroller\", \"heater\"). Leave blank to search across all recall titles. Used in search mode.",
            "default": ""
          },
          "productName": {
            "title": "Product name contains",
            "type": "string",
            "description": "Filter recalls whose product name contains this text. Used in search mode. Combine with Recall Title for a narrower search."
          },
          "productType": {
            "title": "Product category contains",
            "type": "string",
            "description": "Filter by official CPSC product category (case-insensitive substring match, sent server-side, e.g. \"Toy\", \"Bicycles\", \"Batteries and Chargers\", \"Clothing (Children)\"). CPSC publishes 600+ distinct category names — too many for a dropdown — so type any category name or keyword. Common examples: Clothing (Children), Bicycles & Accessories, Toy Animals Stuffed/Not Stuffed, Candles & Candle Holders, Adapter/Power Supply/Charger/Battery, Cribs, All Terrain Vehicles (ATVs), Electric Heaters, Grills Smokers & Accessories, Lawn Mowers & Accessories, Strollers & Accessories, Hair Dryers, Swing Sets, Batteries and Chargers, Furniture. Used in search mode."
          },
          "recallDateFrom": {
            "title": "Recall date from (YYYY-MM-DD)",
            "type": "string",
            "description": "Only include recalls announced on or after this date. Format: YYYY-MM-DD. Used in search mode."
          },
          "recallDateTo": {
            "title": "Recall date to (YYYY-MM-DD)",
            "type": "string",
            "description": "Only include recalls announced on or before this date. Format: YYYY-MM-DD. Used in search mode."
          },
          "lastPublishDateFrom": {
            "title": "Last updated from (YYYY-MM-DD)",
            "type": "string",
            "description": "Only include recalls last updated/published on or after this date. Format: YYYY-MM-DD. Used in search mode."
          },
          "lastPublishDateTo": {
            "title": "Last updated to (YYYY-MM-DD)",
            "type": "string",
            "description": "Only include recalls last updated/published on or before this date. Format: YYYY-MM-DD. Used in search mode."
          },
          "hazardKeyword": {
            "title": "Hazard keyword",
            "type": "string",
            "description": "Filter recalls whose hazard description contains this keyword (e.g. \"choking\", \"fire\", \"laceration\", \"fall\"). Used in search mode."
          },
          "descriptionKeyword": {
            "title": "Description contains",
            "type": "string",
            "description": "Filter recalls whose full recall description contains this keyword (e.g. \"lithium\", \"lead paint\", \"entrapment\"). Sent to CPSC as a server-side search term, so it narrows the fetch itself rather than only filtering already-downloaded results. Used in search mode."
          },
          "injuryKeyword": {
            "title": "Injury keyword",
            "type": "string",
            "description": "Filter recalls whose reported-injury text contains this keyword (e.g. \"hospitalized\", \"laceration\", \"burn\", \"death\"). Different from \"Only recalls with reported injuries\" below — this searches the injury narrative text itself. Used in search mode."
          },
          "manufacturer": {
            "title": "Manufacturer name contains",
            "type": "string",
            "description": "Filter recalls whose manufacturer name contains this text. Used in search mode."
          },
          "retailer": {
            "title": "Retailer name contains",
            "type": "string",
            "description": "Filter recalls whose retailer name contains this text. Used in search mode."
          },
          "importer": {
            "title": "Importer name contains",
            "type": "string",
            "description": "Filter recalls whose importer name contains this text. Only populated for a subset of recalls. Used in search mode."
          },
          "distributor": {
            "title": "Distributor name contains",
            "type": "string",
            "description": "Filter recalls whose distributor name contains this text. Only populated for a subset of recalls. Used in search mode."
          },
          "manufacturerCountry": {
            "title": "Manufacturer country contains",
            "type": "string",
            "description": "Filter recalls by country of manufacture (e.g. \"China\", \"United States\", \"Vietnam\"). Used in search mode."
          },
          "remedyOption": {
            "title": "Remedy type",
            "enum": [
              "",
              "Refund",
              "Repair",
              "Replace",
              "New Instructions",
              "Dispose",
              "Label",
              "Inspect",
              "No Remedy Available"
            ],
            "type": "string",
            "description": "Filter by the remedy offered to consumers (e.g. \"Refund\", \"Repair\"). Sent to CPSC as a server-side search term, so it narrows the fetch itself rather than only filtering already-downloaded results. Used in search mode.",
            "default": ""
          },
          "injuriesReportedOnly": {
            "title": "Only recalls with reported injuries",
            "type": "boolean",
            "description": "When enabled, only return recalls where at least one injury was reported to CPSC.",
            "default": false
          },
          "recallNumbers": {
            "title": "Recall numbers",
            "type": "array",
            "description": "One or more official CPSC recall numbers to fetch directly (e.g. \"26639\", \"24-001\"). Used in byRecallNumber mode.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum number of recall records to return.",
            "default": 50
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Uses Apify's free datacenter (AUTO) proxy group by default to rotate outbound IPs. CPSC's WAF occasionally blocks a single IP for several minutes at a time; rotating through the free AUTO group on retries recovers from this without any paid proxy. No residential proxy is needed. Leave enabled unless you have a specific reason to disable it.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}