{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Profile, Hashtag, Search, Video & Trending Scraper",
    "description": "Scrape TikTok without login. Extract profiles, bios, follower stats and videos; search by hashtag or keyword; scrape individual videos with full engagement stats; or collect posts from the current trending feed.",
    "version": "1.0",
    "x-build-id": "oGRIvzoW4Swuvpvmd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~tiktok-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-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/abotapi~tiktok-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-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/abotapi~tiktok-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "profile",
              "search",
              "video",
              "trending",
              "url"
            ],
            "type": "string",
            "description": "profile: usernames or profile URLs -> profile info + their videos. search: hashtags or keywords -> matching videos. video: direct video URLs -> full video stats. url: paste TikTok links of any supported shape (routed automatically). trending: current trending feed, no input needed.",
            "default": "profile"
          },
          "startUrls": {
            "title": "TikTok URLs",
            "type": "array",
            "description": "Profile (/@user) and video (/@user/video/id) links are confirmed; hashtag (/tag/x), search (/search?q=), /explore and vm./vt. short links are accepted and routed to the matching lane. Only used when mode = url. Left untouched, it scrapes one example profile and one example video.",
            "default": [
              "https://www.tiktok.com/@tiktok",
              "https://www.tiktok.com/@tiktok/video/7673909736131038495"
            ],
            "items": {
              "type": "string"
            }
          },
          "usernames": {
            "title": "Usernames or profile URLs",
            "type": "array",
            "description": "One or more TikTok usernames (with or without @) or full profile URLs. Only used when mode = profile.",
            "items": {
              "type": "string"
            }
          },
          "queries": {
            "title": "Hashtags or search keywords",
            "type": "array",
            "description": "One or more search terms. Start a term with # to search that hashtag (e.g. \"#fyp\"); anything else is treated as a keyword search. Only used when mode = search.",
            "items": {
              "type": "string"
            }
          },
          "videoUrls": {
            "title": "Video URLs",
            "type": "array",
            "description": "One or more direct TikTok video URLs (https://www.tiktok.com/@user/video/1234567890). Only used when mode = video.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max results per unit",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "profile mode: max videos per username. search mode: max videos per hashtag/keyword. video mode: max videos from the URL list. trending mode: max videos from the feed. 0 = unlimited (walks until the feed itself ends).",
            "default": 3
          },
          "oldestPostDate": {
            "title": "Oldest post date",
            "type": "string",
            "description": "Keep only videos posted on or after this date. Use YYYY-MM-DD, an ISO timestamp, or a relative value such as \"30 days\". Empty = no limit."
          },
          "newestPostDate": {
            "title": "Newest post date",
            "type": "string",
            "description": "Keep only videos posted on or before this date. Use YYYY-MM-DD, an ISO timestamp, or a relative value such as \"7 days\". Empty = no limit."
          },
          "mostDiggs": {
            "title": "Max likes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only videos with at most this many likes. Empty = no limit."
          },
          "leastDiggs": {
            "title": "Min likes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only videos with at least this many likes. Empty = no limit."
          },
          "proxyTier": {
            "title": "Proxy tier",
            "enum": [
              "residential",
              "datacenter"
            ],
            "type": "string",
            "description": "Residential is the default. In our checks both tiers loaded video pages, and profile pages loaded on the datacenter tier while some residential exits were answered with a short \"Please wait\" challenge page instead of data (treated as a failed load, never as an empty result). Datacenter is cheaper; results vary by exit and page type. When a connection is refused the run moves on to the next one automatically and fails with a clear message if none works.",
            "default": "residential"
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Leave apifyProxyGroups unset (the default) so the 'Proxy tier' field above decides Residential vs Datacenter. Set apifyProxyGroups here only to pin some other, non-standard group. Leave the country empty for best results; the actor rotates across exits automatically."
          },
          "resumeFromRunId": {
            "title": "Resume from run or dataset ID",
            "type": "string",
            "description": "Paste the ID of an earlier run (or its dataset) to skip records it already collected. Leave empty for a fresh run."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring updates)",
            "type": "boolean",
            "description": "Remember what previous runs of the same targets returned and tag each row with changeType (NEW, UPDATED, UNCHANGED, REAPPEARED), changedFields, firstSeenAt and lastSeenAt. Unchanged rows are not pushed (and not charged) unless 'Emit unchanged' is on. Off = output is identical to a normal run. Removed or deleted items are not reported, because TikTok feeds have no end-of-feed marker. Link fields TikTok re-signs on every fetch (coverUrl, dynamicCoverUrl, originCoverUrl, authorAvatarUrl, avatarUrl, musicUrl, musicCoverMediumUrl, subtitleLinks, slideshowImageLinks) and scrapedAt are ignored when deciding whether a row changed.",
            "default": false
          },
          "stateKey": {
            "title": "State key (incremental mode only)",
            "type": "string",
            "description": "Optional name for the remembered baseline. Leave empty to key it automatically on mode, targets and filters (not on Max items or proxy settings)."
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows (incremental mode only)",
            "type": "boolean",
            "description": "Also push rows whose content did not change, tagged UNCHANGED. Off by default.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Field names to leave out when deciding whether a row changed, e.g. playCount, diggCount, followerCount for counters that move constantly. Applies to the previous baseline too.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify → Settings → API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}