{
  "openapi": "3.0.1",
  "info": {
    "title": "CPSC Recalls Scraper & API — UPC, brand & retailer monitor",
    "description": "Search official U.S. CPSC product recalls (saferproducts.gov API) by product, brand, UPC, retailer or date. Returns one JSON row per recall: number, date, title, products, hazards, remedies, retailers, UPCs, CPSC link. Use it to check if a product was recalled. Not affiliated with CPSC.",
    "version": "0.1",
    "x-build-id": "4cV6l1oUQr4SN17z5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/brightish_ascent~cpsc-product-recalls-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-brightish_ascent-cpsc-product-recalls-monitor",
        "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/brightish_ascent~cpsc-product-recalls-monitor/runs": {
      "post": {
        "operationId": "runs-sync-brightish_ascent-cpsc-product-recalls-monitor",
        "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/brightish_ascent~cpsc-product-recalls-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-brightish_ascent-cpsc-product-recalls-monitor",
        "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",
        "properties": {
          "productName": {
            "title": "Product name",
            "type": "string",
            "description": "Product name keyword (wildcard match on the CPSC ProductName field), e.g. \"crib\", \"space heater\", \"stroller\". Optional. All filters you set are combined with AND."
          },
          "manufacturer": {
            "title": "Manufacturer",
            "type": "string",
            "description": "Brand or manufacturer name keyword (wildcard match), e.g. \"Graco\", \"IKEA\". Optional."
          },
          "hazard": {
            "title": "Hazard",
            "type": "string",
            "description": "Hazard keyword (official CPSC Hazard parameter). WARNING: the official API currently returns 0 recalls for every Hazard value, so leave this empty. Filter with other fields, then match the hazards array in the results instead."
          },
          "remedy": {
            "title": "Remedy",
            "type": "string",
            "description": "Remedy text keyword (wildcard match), e.g. \"refund\", \"repair\", \"replace\". Optional."
          },
          "retailer": {
            "title": "Retailer",
            "type": "string",
            "description": "Retailer keyword (wildcard match), e.g. \"Amazon\", \"Walmart\", \"Target\". Optional."
          },
          "upc": {
            "title": "UPC",
            "type": "string",
            "description": "Product UPC barcode digits (official UPC parameter), e.g. \"012345678905\". Use it to check whether one specific product was recalled. Many recalls have no UPC on file, so also try productName + manufacturer."
          },
          "recallNumber": {
            "title": "Recall number",
            "type": "string",
            "description": "CPSC recall number, exact or partial, e.g. \"26669\". Use it to fetch one known recall."
          },
          "recallTitle": {
            "title": "Recall title",
            "type": "string",
            "description": "Keyword in the recall title (wildcard match), e.g. \"mattress\", \"lithium battery\". Optional."
          },
          "manufacturerCountry": {
            "title": "Manufacturer country",
            "type": "string",
            "description": "Country of manufacture (wildcard match), e.g. \"China\", \"Vietnam\". Optional."
          },
          "importer": {
            "title": "Importer",
            "type": "string",
            "description": "Importer name keyword (wildcard match). Optional."
          },
          "inconjunctionUrl": {
            "title": "In-conjunction URL",
            "type": "string",
            "description": "Rarely needed. Text in the joint-recall URL (official InconjunctionURL parameter), e.g. \"canada\". There is no free-text \"in conjunction with\" filter on the public API."
          },
          "recallDateStart": {
            "title": "Recall date start",
            "type": "string",
            "description": "Earliest recall date, inclusive, format YYYY-MM-DD, e.g. \"2025-01-01\". If you set no filter at all, the last ~90 days are searched automatically."
          },
          "recallDateEnd": {
            "title": "Recall date end",
            "type": "string",
            "description": "Latest recall date, inclusive, format YYYY-MM-DD, e.g. \"2026-12-31\". Optional."
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum recalls to return, 1-5000 (default 100). You pay per returned recall, so AI agents should usually set 5-20. The CPSC API returns the full match set at once and the Actor keeps the first maxItems.",
            "default": 100
          },
          "includeRaw": {
            "title": "Include raw API object",
            "type": "boolean",
            "description": "If true, attach the original CPSC JSON object under raw on each row (much larger output). Default false. Ignored when outputFormat is compact.",
            "default": false
          },
          "descriptionSnippetMaxLength": {
            "title": "Description snippet max length",
            "minimum": 50,
            "maximum": 5000,
            "type": "integer",
            "description": "Max characters of descriptionSnippet, 50-5000 (default 400). Not included in compact output.",
            "default": 400
          },
          "allowUnfiltered": {
            "title": "Allow unfiltered full dump",
            "type": "boolean",
            "description": "Default false: with no filters set, only the last ~90 days are searched. Set true only for an intentional unfiltered dump of the whole CPSC catalog (still capped by maxItems).",
            "default": false
          },
          "onlyNewSinceLastRun": {
            "title": "Only new since last run",
            "type": "boolean",
            "description": "For scheduled runs. If true, returns only recalls not returned by earlier runs with the same filters, so you are not charged twice. The first run is a baseline. State: key-value store cpsc-recalls-monitor-state in your account, one record per filter set; delete it to reset. New = newer recall date (old-recall edits not re-sent). Default false.",
            "default": false
          },
          "outputFormat": {
            "title": "Output format",
            "enum": [
              "full",
              "compact"
            ],
            "type": "string",
            "description": "full (default) = every field. compact = only the key fields per recall (recallId, recallNumber, recallDate, title, manufacturers, products, hazards, remedies, retailers, upc, url), with long texts cut to 200 characters. Use compact for AI agents and LLM context. Same price per row.",
            "default": "full"
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}