{
  "openapi": "3.0.1",
  "info": {
    "title": "Target Scraper: Product Prices, Deals & Stock Alerts",
    "description": "Target scraper for prices, sale prices and stock: search target.com by keyword or look up products by TCIN. One row per product with price, regular price, discount, rating and stock. Monitor price drops, new sales and back-in-stock with Discord, Slack or Telegram alerts. No login or API key.",
    "version": "1.0",
    "x-build-id": "EWaEYDqH69rQWFzxp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/accountable_eel~target-product-lookup/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-accountable_eel-target-product-lookup",
        "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/accountable_eel~target-product-lookup/runs": {
      "post": {
        "operationId": "runs-sync-accountable_eel-target-product-lookup",
        "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/accountable_eel~target-product-lookup/run-sync": {
      "post": {
        "operationId": "run-sync-accountable_eel-target-product-lookup",
        "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": {
          "searches": {
            "title": "Target searches (keywords or search links)",
            "type": "array",
            "description": "One search per line: plain keywords such as \"lego\" or \"nintendo switch\", or a search link copied from target.com. Add product ids or product links below to look up single products. No login required. Accepted formats: lego, nintendo switch, https://www.target.com/s?searchTerm=air+fryer. You're only charged for the ones we actually find — a miss costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "tcins": {
            "title": "Product ids or links (optional)",
            "type": "array",
            "description": "Optional. One Target product id (TCIN, 6 to 10 digits, the number after A- in a target.com/p/... link) or the product link itself per line. Each is looked up directly; a product already returned by a search above is not repeated or billed twice. Up to 200.",
            "items": {
              "type": "string"
            }
          },
          "maxProducts": {
            "title": "Products to read per search",
            "type": "integer",
            "description": "How many products to read from each search, 28 per page, up to 200. This counts products read, before the 'On sale only' filter below.",
            "default": 24
          },
          "onSaleOnly": {
            "title": "On sale only",
            "type": "boolean",
            "description": "Keeps only products at a Sale or Clearance price. Applied after the fetch, so monitoring still remembers the products that are not on sale yet and can tell you when one goes on sale.",
            "default": false
          },
          "checkStock": {
            "title": "Check stock (one extra request per product)",
            "type": "boolean",
            "description": "Adds the online stock status (in stock, limited, out of stock, preorder) to every product. Needed for back-in-stock alerts. Billed per product at the stock-check price. A search lists only products Target can sell, so to watch a sold-out product add its id under Product ids.",
            "default": false
          },
          "storeId": {
            "title": "Store number for in-store stock (optional)",
            "type": "string",
            "description": "A physical Target store number (3 to 5 digits, from a target.com/sl/... store link). With Check stock on, the row also carries that store's pickup stock in 'In-store stock'. Prices do not change with the store (measured), so this only affects stock.",
            "default": ""
          },
          "deltaMode": {
            "title": "Track products across runs",
            "type": "boolean",
            "description": "Turns the actor into a price and stock monitor. Each run compares every product with the previous run's reading and fills in 'Change since last run', previous price, change % and the lowest price seen. Schedule it daily and combine with 'Only return rows that changed' and 'Send alerts to'.",
            "default": false
          },
          "deltaName": {
            "title": "Watchlist name (optional)",
            "type": "string",
            "description": "Leave empty and one is derived from your searches, product ids and options. Type your own name to keep one memory across changes, or to run several independent watchlists.",
            "default": ""
          },
          "alertOn": {
            "title": "Alert on",
            "enum": [
              "all",
              "price-drop",
              "new-on-sale",
              "back-in-stock"
            ],
            "type": "string",
            "description": "Which change raises an alert message and the alert flag in the row. All is price drops, new sales and back-in-stock.",
            "default": "all"
          },
          "minPriceDropPct": {
            "title": "Price drop counts from (%)",
            "type": "integer",
            "description": "A price change smaller than this counts as unchanged.",
            "default": 5
          },
          "alertOnChangeOnly": {
            "title": "Only return rows that changed",
            "type": "boolean",
            "description": "With monitoring on, a product whose price and stock did not move (change = unchanged) writes no row and is not billed. New, back-in-stock, new-on-sale, price-drop and price-rise products are returned.",
            "default": false
          },
          "skipFirstRun": {
            "title": "Seed silently (no rows for products seen the first time)",
            "type": "boolean",
            "description": "The first reading of a product has nothing to compare with. Turn this on to remember it without returning or billing it, so rows and alerts start from the second reading.",
            "default": false
          },
          "notifyUrl": {
            "title": "Send alerts to (Discord or Slack webhook, Telegram bot link, or any URL)",
            "type": "string",
            "description": "Optional. After a product row is billed, each price drop, new sale and back-in-stock is posted here as one message with title, price, previous price and a link. Discord or Slack: paste the channel's webhook URL. Telegram: https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>. Any other URL receives JSON. Messages are free, and a failed message never fails the run (the row's notifyErrors says why). Stored encrypted, never logged or written to the results."
          },
          "notifyFormat": {
            "title": "Message format",
            "enum": [
              "auto",
              "discord",
              "slack",
              "telegram",
              "json"
            ],
            "type": "string",
            "description": "Leave on 'Detect from the link': discord.com links get Discord messages, hooks.slack.com Slack, api.telegram.org Telegram, anything else JSON. Pick one only to override that.",
            "default": "auto"
          },
          "maxNotificationsPerRun": {
            "title": "Most alert messages per run",
            "type": "integer",
            "description": "Up to 100. After this, one 'more alerts' message says the rest are in the run's dataset. 0 sends only that one message.",
            "default": 20
          },
          "testRun": {
            "title": "Try it first — only process the first 5",
            "type": "boolean",
            "description": "Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.",
            "default": false
          },
          "onlyFound": {
            "title": "Hide rows with no result",
            "type": "boolean",
            "description": "Only keep rows where something was actually found. Misses are always free, whether or not you show them here.",
            "default": false
          },
          "includeKeywords": {
            "title": "Only keep rows containing",
            "type": "array",
            "description": "Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip rows containing",
            "type": "array",
            "description": "Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Stop after this many results",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit."
          },
          "columns": {
            "title": "Which columns do you want?",
            "type": "array",
            "description": "Choose which pieces of information to include in each result row. All are included by default.",
            "items": {
              "type": "string",
              "enum": [
                "tcin",
                "search",
                "url",
                "title",
                "brand",
                "price",
                "regularPrice",
                "discountPct",
                "onSale",
                "rating",
                "reviewCount",
                "availability",
                "stockChecked",
                "checkedAt"
              ],
              "enumTitles": [
                "Product id (TCIN)",
                "Found by search",
                "Target link",
                "Title",
                "Brand",
                "Price (USD)",
                "Regular price (USD)",
                "Discount (%)",
                "On sale",
                "Rating (out of 5)",
                "Reviews",
                "Online stock",
                "Stock checked",
                "Checked at"
              ]
            },
            "default": [
              "tcin",
              "search",
              "url",
              "title",
              "brand",
              "price",
              "regularPrice",
              "discountPct",
              "onSale",
              "rating",
              "reviewCount",
              "availability",
              "stockChecked",
              "checkedAt"
            ]
          },
          "expandRows": {
            "title": "One row per product (recommended) — turn off for one row per search instead",
            "type": "boolean",
            "description": "When on, each product found gets its own row instead of being grouped under its search. You're still only charged once per search, no matter how many rows it produces.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 1,
            "type": "integer",
            "description": "Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy config. Residential recommended for anti-bot-sensitive targets.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}