{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Shop Scraper",
    "description": "TikTok Shop scraper — product listings, prices, ratings, sellers, and search results across US, UK, Singapore, Malaysia, Philippines, Thailand, Vietnam, and Indonesia. Two operations, one clean dataset per run. No API key required, no account setup.",
    "version": "1.0",
    "x-build-id": "OSKzHZo5pT2DaVlCc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~tiktok-shop-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-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/sian.agency~tiktok-shop-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-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/sian.agency~tiktok-shop-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-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",
        "required": [
          "operation"
        ],
        "properties": {
          "operation": {
            "title": "🎯 Operation — what do you want to scrape?",
            "enum": [
              "productDetail",
              "searchProducts"
            ],
            "type": "string",
            "description": "🎯 **PICK ONE OPERATION PER RUN.** Each run produces one clean dataset matching the chosen mode.\n\n- **🛒 Product Detail** — deep scrape of a single product by ID (title, description, price, gallery, seller, rating, sold count, currency)\n- **🔍 Search Products** — keyword-based product search across TikTok Shop, paginated\n\n💡 **TIP:** To analyze a batch of products, run `Search Products` first, then loop over the `productId` values with `Product Detail`.",
            "default": "searchProducts"
          },
          "productId": {
            "title": "🛒 Product ID (for Product Detail)",
            "type": "string",
            "description": "🛒 **Required for the `Product Detail` operation.**\n\nThe numeric TikTok Shop product ID (typically 18–19 digits). You can find it:\n- In any TikTok Shop product URL: `https://www.tiktok.com/shop/pdp/{slug}/{ID}` → the trailing numeric segment\n- In the `productId` field of any Search Products result row\n\n💡 **TIP:** Run `Search Products` first to gather a batch of IDs, then process them one by one with `Product Detail`.\n\n📝 **Note on prices:** TikTok Shop masks raw unit prices on the detail endpoint with placeholders. For hard pricing data (sale price, original price), use `Search Products` — it returns real prices. Detail still returns full product description, SKU list, seller stats, ratings, sold count, and image gallery.\n\n⚠️ **Ignored** for the Search Products operation."
          },
          "keyword": {
            "title": "🔍 Search Keyword (for Search Products)",
            "type": "string",
            "description": "🔍 **Required for the `Search Products` operation.**\n\nAny TikTok Shop search query — English or native-language. Examples:\n- `phone case`\n- `wireless earbuds`\n- `kitchen gadgets`\n- `skincare`\n\n💡 **TIP:** Narrow queries return higher-relevance results. Combine with `region` to surface market-specific trends."
          },
          "region": {
            "title": "🌍 Region",
            "enum": [
              "US",
              "GB",
              "SG",
              "MY",
              "PH",
              "TH",
              "VN",
              "ID"
            ],
            "type": "string",
            "description": "🌍 **Target TikTok Shop region.** Defaults to `US` if unset.\n\n- **US** — United States\n- **GB** — United Kingdom\n- **SG** — Singapore\n- **MY** — Malaysia\n- **PH** — Philippines\n- **TH** — Thailand\n- **VN** — Vietnam\n- **ID** — Indonesia\n\n💡 **TIP:** Same product can have different prices, ratings, and availability per region. Run the same keyword across multiple regions to map global demand.",
            "default": "US"
          },
          "maxPages": {
            "title": "📄 Max pages to fetch",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "📄 **Applies to the `Search Products` operation only.** Ignored for `Product Detail`.\n\nEach page returns up to 30 products. TikTok Shop caps results at ~50–60 unique products per keyword, so 2 pages is usually sufficient. Duplicates across pages are auto-deduplicated and not charged.\n\n💡 **TIP:** Use narrower keywords to surface more unique results per run. Run the same keyword across multiple regions to expand coverage.",
            "default": 2
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}