{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Scraper With Sponsor and Brand Tags",
    "description": "TikTok Scraper With Sponsor and Brand Tags extracts videos, captions, hashtags, sponsor labels, brand tags, creator details, engagement metrics, music, and timestamps. Export structured data to JSON, CSV, Excel, or API.",
    "version": "0.1",
    "x-build-id": "BaQAh2uh0etHv7cGw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scraply~tiktok-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scraply-tiktok-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/scraply~tiktok-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scraply-tiktok-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/scraply~tiktok-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scraply-tiktok-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": {
          "startUrls": {
            "title": "👤 TikTok Profile URLs or Usernames",
            "type": "array",
            "description": "📋 Add TikTok profile URLs (e.g., https://www.tiktok.com/@username) or just usernames (e.g., username). Supports bulk input - add as many profiles as you want! 💪 Leave empty if you only want to do search scraping.",
            "items": {
              "type": "string"
            }
          },
          "profileScrapeSections": {
            "title": "📹 Profile Scrape Sections",
            "type": "array",
            "description": "🎯 Choose which sections to scrape from profiles: 📺 'videos' (all profile videos) and/or 🔄 'repost' (reposted content). Select one or both!",
            "items": {
              "type": "string",
              "enum": [
                "videos",
                "repost"
              ]
            },
            "default": [
              "videos"
            ]
          },
          "searchQuery": {
            "title": "🔍 Search Query",
            "type": "string",
            "description": "🔎 Enter a search query for hashtag or keyword search. Leave empty if you only want to scrape profiles. Examples: 'Ronaldo', '#travel', 'cooking tips'",
            "default": ""
          },
          "searchType": {
            "title": "🏷️ Search Type",
            "enum": [
              "keyword",
              "hashtag"
            ],
            "type": "string",
            "description": "📌 Choose search type: 🔑 'keyword' (general TikTok search) or #️⃣ 'hashtag' (hashtag-specific search). Default: keyword",
            "default": "keyword"
          },
          "maxResults": {
            "title": "📊 Maximum Results",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "🎯 Maximum number of MATCHING results to collect per profile/search query (applied AFTER the sponsor/brand filters below, so you get up to this many qualifying rows, not raw ones). Range: 1-1000. Higher values = more data but longer scraping time. ⏱️",
            "default": 100
          },
          "includeAdDisclosure": {
            "title": "🏷️ Read Paid-Partnership & Ad-Label Fields",
            "type": "boolean",
            "description": "📢 Adds the commercial-marker fields TikTok already attaches to every video but never surfaces: adAuthorization (creator authorised this to run as an ad), adLabelVersion (the on-screen ad-label version TikTok is showing), brandOrganicType (TikTok's branded-content code), and BAInfo (the branded-content disclosure string). These sit right next to isAd and explain WHY it's set - e.g. a real video with isAd=false still had brandOrganicType=1010, which a single isAd column would miss entirely. Default: true.",
            "default": true
          },
          "onlySponsoredVideos": {
            "title": "💰 Only Keep Videos With a Commercial Marker",
            "type": "boolean",
            "description": "🎯 Drops every row where TikTok set NO commercial marker at all, so the run comes back as a brand-deal list instead of a feed. A row survives if ANY of isAd, adAuthorization, brandOrganicType, or adLabelVersion is set, or the video has a pinned anchor card. Set to false to keep the WHOLE feed and read the columns yourself - that's how you see the ratio (e.g. 31% of one creator's feed vs. 100% of a brand storefront account). Default: true.",
            "default": true
          },
          "brandHandles": {
            "title": "🔖 Only Keep Videos Tagging These Brand @Handles",
            "type": "array",
            "description": "🏢 A list of @handles (e.g. 'nike', 'starbucks'). When set, a row is kept only if one of these appears in the video's tagged accounts (TikTok's own @mention data in the caption, matched case-insensitively, leading @ optional). Use this to pull one brand's whole creator roster out of a hashtag or check whether a creator has ever posted for a competitor. Leave empty to keep every sponsored video regardless of who's tagged. Default: empty (no brand restriction).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeProductAnchors": {
            "title": "🛒 Read Anchor Cards & Commerce Hashtags",
            "type": "boolean",
            "description": "🧷 Adds anchors (the card TikTok pins under a video - a CapCut template, app, or product page link) and commerceHashtags (hashtags TikTok itself marks as commercial) plus isECVideo (TikTok Shop flag). Shipped exactly as TikTok returns them - low/no observed coverage for shop-specific anchors in our sampling, so treat this as 'what TikTok returns,' not a guaranteed shop-product feed. Default: true.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy Configuration",
            "type": "object",
            "description": "🔒 Proxy settings for enhanced reliability. By default, no proxy is used (direct connection). If TikTok blocks requests, the actor automatically falls back: no proxy → datacenter → residential proxy. 🛡️ Smart protection!"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}