{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Hashtag Scraper - Videos, Views & Captions",
    "description": "TikTok hashtag scraper: the videos under a hashtag, one row each with plays, likes, comments, shares and saves, the caption, author and sound, a link to the video, and a flag on branded posts. The limit covers the whole run, not each tag. $0.25 per 1,000 videos.",
    "version": "0.1",
    "x-build-id": "fHUC7rrMQ2IWyl2QW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dami_studio~tiktok-hashtag-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dami_studio-tiktok-hashtag-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/dami_studio~tiktok-hashtag-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dami_studio-tiktok-hashtag-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/dami_studio~tiktok-hashtag-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dami_studio-tiktok-hashtag-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": {
          "hashtags": {
            "title": "Hashtags",
            "type": "array",
            "description": "Hashtags (with or without #) to pull videos from.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Hashtag URLs",
            "type": "array",
            "description": "Or paste TikTok /tag/ URLs (https://www.tiktok.com/tag/cats). A plain word or #word here counts as a hashtag too.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search words",
            "type": "array",
            "description": "Words to search TikTok videos for, one search per line. You get the videos TikTok's search shows for those words.",
            "items": {
              "type": "string"
            }
          },
          "profiles": {
            "title": "Profiles",
            "type": "array",
            "description": "TikTok usernames (with or without @) or profile links. Each one returns that creator's newest videos, about 10, which is as far as the public profile goes. No row for the profile itself; switch on creator numbers below for followers and likes.",
            "items": {
              "type": "string"
            }
          },
          "musicUrls": {
            "title": "Sounds",
            "type": "array",
            "description": "Links to TikTok sounds (https://www.tiktok.com/music/original-sound-7571394799887076110) or just the number at the end. Each one returns videos that use that sound.",
            "items": {
              "type": "string"
            }
          },
          "videoUrls": {
            "title": "Video links",
            "type": "array",
            "description": "Links to single TikTok videos (https://www.tiktok.com/@nasa/video/7691727731800673549) or share links like https://vm.tiktok.com/.... Each one returns that video's row.",
            "items": {
              "type": "string"
            }
          },
          "resultsPerPage": {
            "title": "Max videos per run",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Most videos the whole run returns, counted across all your hashtags and other inputs together, so the first one can use it all. Charged per result. Not used when Videos per input is set.",
            "default": 50
          },
          "resultsPerInput": {
            "title": "Videos per input",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Optional. When set, each hashtag, search, profile, sound and link stops at this many videos, so every input gets its share, and Max videos per run is not used. A run can then return up to this many videos for each input you list. Leave it empty to keep one limit for the whole run."
          },
          "sortBy": {
            "title": "Order",
            "enum": [
              "feed",
              "mostLiked",
              "mostPlayed",
              "newest",
              "oldest"
            ],
            "type": "string",
            "description": "TikTok's order returns videos as the feed serves them. Any other choice reads up to ten times as many videos as you ask for (2,000 at most per input), sorts them and returns the top ones. It sorts what the feed serves today, not TikTok's all-time ranking, and the videos it reads but does not return are not charged.",
            "default": "feed"
          },
          "minLikes": {
            "title": "Minimum likes (optional add-on)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional add-on, off unless you set a value. Keeps only videos with at least this many likes. A video whose like count could not be read is left out. Leave it empty to keep every video."
          },
          "maxLikes": {
            "title": "Maximum likes (optional add-on)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional add-on, off unless you set a value. Keeps only videos with at most this many likes. Leave it empty to keep every video."
          },
          "postedAfter": {
            "title": "Posted on or after (optional add-on)",
            "type": "string",
            "description": "Optional add-on, off unless you set a date. Keeps only videos posted on or after this day, counted in UTC, for example 2026-10-01. Leave it empty for no date limit."
          },
          "postedBefore": {
            "title": "Posted before (optional add-on)",
            "type": "string",
            "description": "Optional add-on, off unless you set a date. Keeps only videos posted before this day, counted in UTC: 2026-10-15 keeps videos up to the end of 14 October. Leave it empty for no date limit."
          },
          "postedWithinDays": {
            "title": "Posted in the last N days (optional add-on)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Optional add-on. Keeps only videos posted in the last this many days, counted back from the start of the run. Use it instead of Posted on or after, not with it."
          },
          "maxVideosPerCreator": {
            "title": "Videos per creator",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Optional. At most this many videos from the same creator in the whole run. 1 gives one video per creator, which is how you build a list of the creators behind a tag. The first ones found are kept, or the top ones when an order is chosen."
          },
          "excludePinned": {
            "title": "Leave out pinned videos",
            "type": "boolean",
            "description": "Profiles only. Leaves out the videos a creator pinned to the top of their profile, so you get just their newest ones. TikTok marks nothing as pinned, so they are read from the order of the profile's list, and a pinned video that is also the creator's newest stays in.",
            "default": false
          },
          "includeCreatorStats": {
            "title": "Add creator numbers",
            "type": "boolean",
            "description": "Adds a creator block to each video: followers, following, total likes, video count, the verified and private flags, when the account was made, the bio text and the bio link. One extra lookup per creator, about a second each, so a run with many creators takes longer.",
            "default": false
          },
          "includeVideoDetails": {
            "title": "Add video size and place",
            "type": "boolean",
            "description": "Adds the video's width and height, and the place the creator tagged (name, address, city) when there is one, which is on a minority of videos. Reads each video's own page, so runs take longer.",
            "default": false
          },
          "includeSubtitles": {
            "title": "Add TikTok's subtitles",
            "type": "boolean",
            "description": "Adds the subtitles TikTok itself publishes for each video, as plain text, with their language. Empty when TikTok has none for that video, which is most of them. Nothing is generated: no transcript is made from the audio.",
            "default": false
          },
          "commentsPerVideo": {
            "title": "Comments per video",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Optional. Adds up to this many comments under each video returned, each as its own row (type comment), in the order TikTok gives them. Top-level comments only, no replies. Each comment row is charged as a result, at the same price as a video, and does not count towards your video limits. Leave it empty or at 0 for none."
          },
          "storeImages": {
            "title": "Keep copies of the images (optional add-on)",
            "type": "boolean",
            "description": "Optional add-on. Saves each video's cover, the creator's picture, the sound's cover and the photos of a photo post into this run's own storage, and adds links to those copies in storedImages. TikTok's image links stop working after about a day; the copies last as long as this run's storage does. One download per image, and the same image is kept once.",
            "default": false
          },
          "notionConnector": {
            "title": "Notion connector ID (optional)",
            "type": "string",
            "description": "Optional. Deliver results to your connected Notion via Apify MCP connectors."
          },
          "notionParentId": {
            "title": "Notion data-source ID (optional)",
            "type": "string",
            "description": "Optional Notion database/data-source id."
          },
          "sessionCookies": {
            "title": "Account cookies (not needed)",
            "type": "array",
            "description": "Optional: your own session, used only for your run. You are responsible for using it within the site's terms. Runs work without it."
          },
          "proxyConfiguration": {
            "title": "Proxy (optional)",
            "type": "object",
            "description": "Not required, this scraper needs no proxy.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}