{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Shop Product Scraper",
    "description": "Scrape TikTok Shop products by keyword, category URL or product URL across 10 storefronts. Every row carries title, price, original_price, discount_percent, seller_name, rating, sold_count and the full category_path. Export JSON, CSV or Excel, or pull it from the API.",
    "version": "2.1",
    "x-build-id": "T4HoXvYfaA3WF0MFB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/herus13~tiktok-shop-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-herus13-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/herus13~tiktok-shop-scraper/runs": {
      "post": {
        "operationId": "runs-sync-herus13-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/herus13~tiktok-shop-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-herus13-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": {
          "search_terms": {
            "title": "Search Terms",
            "type": "array",
            "description": "Keywords to search on TikTok Shop. Each term returns every matching product up to `max_results`, with price, seller, rating and sold count. Works on every supported storefront. Examples: `wireless earbuds`, `silk pillowcase`. Provide at least one of `search_terms`, `category_urls` or `product_urls`; leave empty to scrape only from the other two.",
            "items": {
              "type": "string"
            }
          },
          "product_urls": {
            "title": "Product URLs",
            "type": "array",
            "description": "Direct product page URLs, one per entry: `https://shop.tiktok.com/{region}/pdp/{product_id}`, or the app's share link `https://www.tiktok.com/view/product/{product_id}` (read on the `region` storefront). For `ID` (Tokopedia): `https://www.tokopedia.com/{shop}/{product-slug}`. Each URL returns one product with the full detail set: description, images, variants and category breadcrumb. Leave empty to scrape only from `search_terms` and `category_urls`.",
            "items": {
              "type": "string"
            }
          },
          "category_urls": {
            "title": "Category URLs",
            "type": "array",
            "description": "Category browse URLs, one per entry. Most regions: `https://shop.tiktok.com/{region}/c/{slug}/{id}` (e.g. `https://shop.tiktok.com/us/c/beauty-personal-care/601450`). For `ID` (Tokopedia): `https://www.tokopedia.com/p/{slug}` (e.g. `https://www.tokopedia.com/p/handphone-tablet`). Each URL returns every product in that category up to `max_results`. Leave empty to scrape only from `search_terms` and `product_urls`.",
            "items": {
              "type": "string"
            }
          },
          "region": {
            "title": "Region",
            "enum": [
              "US",
              "VN",
              "TH",
              "PH",
              "MY",
              "SG",
              "ID",
              "GB",
              "MX",
              "JP",
              "BR"
            ],
            "type": "string",
            "description": "TikTok Shop storefront to scrape: decides the catalogue, listing language and currency. Default `US`. Supported: `US`, `VN`, `TH`, `PH`, `MY`, `SG`, `ID` (Tokopedia — search, category, detail and reviews), `GB`, `MX`, `JP` (no keyword search on these three; use `category_urls` or `product_urls`). `BR` is unavailable: choosing it ends the run at once, charging only the start fee.",
            "default": "US"
          },
          "max_results": {
            "title": "Max Results",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Most products returned per search term and per category URL. Default 100, minimum 1, maximum 1000. `product_urls` returns one product each and ignores this cap. A keyword feed usually runs out after 50-200 products, so a wider crawl means more search terms rather than a higher cap.",
            "default": 100
          },
          "scrape_product_details": {
            "title": "Scrape Product Details",
            "type": "boolean",
            "description": "Add the full detail set to every product found by a search term or a category URL: product description, full image gallery, variants, stock and the complete category breadcrumb root to leaf. Default `false`, which returns the listing fields only. Each enriched product is charged as a product detail instead of a search result. Products given in `product_urls` always carry the detail set, so this setting does not change them.",
            "default": false
          },
          "browser_endpoint": {
            "title": "Your own browser endpoint (optional)",
            "type": "string",
            "description": "WebSocket URL of a remote browser service you already pay for, used instead of the one this actor ships with. One URL, shaped `wss://user:password@host:9222`. Leave empty to use the browser included in the price of the run."
          },
          "proxyUrls": {
            "title": "Your own proxy URLs (optional)",
            "type": "array",
            "description": "Leave empty: the run uses the residential proxy this actor ships with, included in the price of the run. To route the run through your own provider instead, add one gateway URL per entry, for example `http://user:pass@host:port` — works with any provider that issues URLs. When set, the run uses these first and switches to the included proxy if they stop working, so a broken proxy never fails the run.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}