{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Trending Products - Product, Video & Price Feed",
    "description": "Trending TikTok Shop products as a ready-to-use feed: each product with its driving video, price + sale price, 'X sold', rank, and (on scheduled runs) sales velocity + price history. From public Creative Center Top Products + product pages - no seller account, no Shop API. PPE pricing.",
    "version": "0.2",
    "x-build-id": "Q2G7ArYovy1lv8eXc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/seibs.co~tiktok-trending-products/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-seibs.co-tiktok-trending-products",
        "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/seibs.co~tiktok-trending-products/runs": {
      "post": {
        "operationId": "runs-sync-seibs.co-tiktok-trending-products",
        "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/seibs.co~tiktok-trending-products/run-sync": {
      "post": {
        "operationId": "run-sync-seibs.co-tiktok-trending-products",
        "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": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "feed",
              "discover"
            ],
            "type": "string",
            "description": "feed = full record per product (trending product + price/sales enrichment + driving video; velocity + price history on scheduled runs). discover = the trending leaderboard only (name / rank / category / trend), no price or video enrichment - cheap reconnaissance.",
            "default": "feed"
          },
          "region": {
            "title": "Region",
            "type": "string",
            "description": "Two-letter market for the Top Products leaderboard (e.g. US, GB, DE, ID). Default US.",
            "default": "US"
          },
          "period_days": {
            "title": "Trend window (days)",
            "enum": [
              "7",
              "30",
              "120"
            ],
            "type": "string",
            "description": "Creative Center trend window: 7, 30, or 120 days. Shorter = fresher / more reactive trending signal. Default 7.",
            "default": "7"
          },
          "max_products": {
            "title": "Max products",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Hard cap on trending products per run. Default 50. Max 200.",
            "default": 50
          },
          "enrich_price": {
            "title": "Enrich price + sales from product pages (feed mode)",
            "type": "boolean",
            "description": "In feed mode, fetch each product's public TikTok Shop page to fill price, sale price, 'X sold', and rating that Creative Center does not expose. Adds an enriched_product PPE charge per enriched product. Turn off to keep only the trending list + driving video.",
            "default": true
          },
          "include_all_ad_objectives": {
            "title": "Keep every ad objective (Top Ads source)",
            "type": "boolean",
            "description": "When the feed is built from Creative Center Top Ads (TikTok no longer serves the public Top Products leaderboard), only ads whose campaign objective is Conversions or Product Sales are kept - the products advertisers are actively selling. Turn on to keep every objective (traffic, reach, video views, lead generation, app installs).",
            "default": false
          },
          "affiliate_tag": {
            "title": "Affiliate tag (optional)",
            "type": "string",
            "description": "Appended as a query string to every product buy_url so the feed is monetizable (e.g. 'aff_id=YOURID&source=dailyvirals'). Leave empty for clean links.",
            "default": ""
          },
          "monitor_webhook_url": {
            "title": "Monitor webhook URL (Slack / email, optional)",
            "type": "string",
            "description": "When this actor runs under an Apify Schedule (monitor mode), post the daily movers digest (new entrants, fastest-selling, biggest climbers) to this Slack-compatible webhook URL.",
            "default": ""
          },
          "use_apify_proxy": {
            "title": "Use Apify Proxy",
            "type": "boolean",
            "description": "Route requests through Apify Proxy. DATACENTER handles product pages; a RESIDENTIAL tier is provisioned for the browser tier that captures Creative Center's XHR.",
            "default": true
          },
          "use_browser_fallback": {
            "title": "Browser tier (live Creative Center capture)",
            "type": "boolean",
            "description": "Creative Center fires its lists via signed XHRs; capturing them needs the browser tier (we never forge the signature - the page fires its own call). ON by default: the browser blocks images/media/fonts so a capture costs a fraction of a cent. With it off the run returns a documented surface_pending note and an availability_notice (no charge) instead of live records.",
            "default": true
          },
          "browser_cdp_url": {
            "title": "Warm browser CDP endpoint (most reliable)",
            "type": "string",
            "description": "Optional. CDP/WebSocket endpoint of an already-running anti-detect browser. When set, the browser tier connects to it (inheriting its session + fingerprint + IP) to clear TikTok's edge most reliably. Otherwise a stealth headless Chromium launches (works on the playwright image). Can also be set as the BROWSER_CDP_URL env var.",
            "default": ""
          },
          "apify_proxy_groups": {
            "title": "Proxy groups (optional override)",
            "type": "array",
            "description": "Override the auto-selected proxy group. Leave empty to let the actor pick DATACENTER for pages and RESIDENTIAL for the browser tier.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "scroll_passes": {
            "title": "Scroll passes (browser tier)",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "How many times the browser scrolls the Top Products page to trigger deeper lazy-loaded products. More = more products but slower. Default 3.",
            "default": 3
          },
          "concurrency": {
            "title": "Max concurrent fetches",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "Parallel product-page enrichment fetches. TikTok is rate-sensitive; default 3.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}