{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Shop Scraper - Products, Sales, Prices, Stock & Sellers",
    "description": "Scrape TikTok Shop products by keyword, category, store or product link: price, original price, discount, units sold, rating, reviews, seller and images. Details add SKUs with stock, package size, shipping, specs, reviews, related videos and the seller's business entity. US, UK, SEA, JP. No login.",
    "version": "0.1",
    "x-build-id": "19FGEqd4WFNE9feUD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/topapi~tiktok-shop-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-topapi-tiktok-shop-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/topapi~tiktok-shop-scraper/runs": {
      "post": {
        "operationId": "runs-sync-topapi-tiktok-shop-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/topapi~tiktok-shop-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-topapi-tiktok-shop-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",
        "properties": {
          "searchQueries": {
            "title": "🔎 Search keywords",
            "type": "array",
            "description": "Words a shopper types into TikTok Shop search, e.g. \"lipstick\", \"water bottle\", \"phone case\". Each keyword is searched on its own.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 TikTok Shop links",
            "type": "array",
            "description": "Product (…/pdp/…, /view/product/…), store (…/store/<name>/<id>), category (…/c/<name>/<id>) or search (…/s?q=…) links from shop.tiktok.com or tiktok.com/shop, and vt.tiktok.com share links.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "productIds": {
            "title": "🆔 Product ids",
            "type": "array",
            "description": "TikTok Shop product ids instead of links, e.g. \"1729527313880355335\". Read in the market chosen below.",
            "items": {
              "type": "string"
            }
          },
          "region": {
            "title": "🌍 Market",
            "enum": [
              "US",
              "GB",
              "MY",
              "PH",
              "SG",
              "TH",
              "VN",
              "JP"
            ],
            "type": "string",
            "description": "TikTok Shop market for keywords and ids (links carry their own). Prices come in the market's currency.",
            "default": "US"
          },
          "includeSubcategories": {
            "title": "🗂️ Walk sub-categories",
            "type": "boolean",
            "description": "On a category link, also walk its sub-categories (US) to go past the ~100 products TikTok lists per category.",
            "default": false
          },
          "includeRelatedSearches": {
            "title": "➰ Follow related searches",
            "type": "boolean",
            "description": "When a keyword runs out, continue with TikTok's own related searches (e.g. \"water bottle\" → \"water bottle for kids\"). Rows keep your keyword in query and the related one in matchedKeyword.",
            "default": false
          },
          "minPrice": {
            "title": "💲 Min price",
            "minimum": 0,
            "type": "number",
            "description": "Keep products priced at or above this, in the market's currency, e.g. 10."
          },
          "maxPrice": {
            "title": "💲 Max price",
            "minimum": 0,
            "type": "number",
            "description": "Keep products priced at or below this, e.g. 50."
          },
          "minRating": {
            "title": "⭐ Min rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep products rated at least this (1-5), e.g. 4.5. Unrated products are removed when set."
          },
          "minReviews": {
            "title": "💬 Min reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Keep products with at least this many reviews, e.g. 100."
          },
          "minSold": {
            "title": "📈 Min units sold",
            "minimum": 0,
            "type": "integer",
            "description": "Keep products TikTok shows at least this many units sold for, e.g. 1000."
          },
          "maxSold": {
            "title": "📉 Max units sold",
            "minimum": 0,
            "type": "integer",
            "description": "Keep products with at most this many units sold, e.g. 500 to find new or rising products."
          },
          "onlyDiscounted": {
            "title": "🏷️ Discounted only",
            "type": "boolean",
            "description": "Keep products whose current price is below TikTok's original price.",
            "default": false
          },
          "minDiscountPercent": {
            "title": "🏷️ Min discount %",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep products at least this % off, e.g. 30."
          },
          "freeShippingOnly": {
            "title": "🚚 Free shipping only",
            "type": "boolean",
            "description": "Keep products TikTok labels with free shipping.",
            "default": false
          },
          "titleKeywords": {
            "title": "🔤 Title must contain",
            "type": "array",
            "description": "Keep a product only if its title contains one of these words, e.g. \"matte\", \"stainless\".",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "🚫 Title must not contain",
            "type": "array",
            "description": "Remove products whose title contains any of these words, e.g. \"case\", \"refill\".",
            "items": {
              "type": "string"
            }
          },
          "sellers": {
            "title": "🏬 Only these sellers",
            "type": "array",
            "description": "Keep products from these shops only (shop name or seller id, part of the name is enough), e.g. \"Goli\".",
            "items": {
              "type": "string"
            }
          },
          "excludeSellers": {
            "title": "🙅 Exclude sellers",
            "type": "array",
            "description": "Remove products from these shops (shop name or seller id).",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "📦 Include product details",
            "type": "boolean",
            "description": "Adds SKUs with price and stock, package size / weight, seller SKU codes, shipping, description, specs, category path, the first reviews, related videos and the seller's stats and business entity.",
            "default": false
          },
          "includeSellerStats": {
            "title": "🏬 Seller store stats",
            "type": "boolean",
            "description": "With details on (US): also read each seller's store page once for its experience scores (positive feedback, on-time delivery), official label, total sold, reviews and videos. Slower; no extra charge.",
            "default": false
          },
          "monitorMode": {
            "title": "🔁 Only new products",
            "type": "boolean",
            "description": "Skip products an earlier run with the same monitor store already delivered (they are not charged again).",
            "default": false
          },
          "monitorChanges": {
            "title": "📊 Also changed products",
            "type": "boolean",
            "description": "With monitoring on, also return products whose price, units sold, rating or review count changed, with the previous values and soldDelta.",
            "default": false
          },
          "monitorStoreName": {
            "title": "🗃️ Monitor store name",
            "type": "string",
            "description": "Named key-value store that remembers delivered products between runs. Use one name per schedule, e.g. \"tiktok-shop-lipstick\".",
            "default": "tiktok-shop-monitor"
          },
          "maxResultsPerSource": {
            "title": "🔢 Max products per source",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Per keyword, category, store or link list. Signed-out TikTok shows ~45-120 products per US keyword, ~100 per category page and a whole store. 0 = all.",
            "default": 100
          },
          "maxItems": {
            "title": "🧮 Max products in total",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many products across all sources. 0 = no total cap."
          },
          "compact": {
            "title": "🗜️ Compact output",
            "type": "boolean",
            "description": "Core fields only (id, title, link, price, discount, sold, rating, reviews, seller) - trimmed for AI / MCP pipelines.",
            "default": false
          },
          "includeRawData": {
            "title": "🧾 Include raw data",
            "type": "boolean",
            "description": "Attach TikTok's own product card object to each row as raw.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy",
            "type": "object",
            "description": "Leave empty for the built-in routing. Set your own proxy only if you need a specific exit; it is used for every request."
          },
          "maxConcurrency": {
            "title": "⚡ Sources in parallel",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "How many keywords / categories / stores run at once (1-6).",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}