{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Videos Scraper: Hashtags, Profiles, Video URLs, No Login",
    "description": "For influencer vetting, trend research and campaign reports: TikTok videos from hashtags, profiles or URLs with views, likes, comments, shares, saves, caption, sound, author and date. No login. Hashtag results carry the hashtag. No filter fees. Monitoring returns only new videos. CSV, Excel, JSON.",
    "version": "0.1",
    "x-build-id": "7rwdS6Fwpk7vHYEks"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~tiktok-videos-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-tiktok-videos-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/neverempty~tiktok-videos-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-tiktok-videos-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/neverempty~tiktok-videos-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-tiktok-videos-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 to list the videos of: booktok, #booktok or https://www.tiktok.com/tag/booktok. One per line (commas and spaces also separate entries). Videos come in the order TikTok's hashtag page shows them (popular first, not newest first). Leave empty to skip hashtags.",
            "items": {
              "type": "string"
            }
          },
          "profiles": {
            "title": "TikTok accounts",
            "type": "array",
            "description": "Accounts to list the videos of, newest first: a username (nasa or @nasa), a profile URL (https://www.tiktok.com/@nasa) or a secUid (MS4wLjABAAAA...). One per line. Short links (vm.tiktok.com) are not followed: open one in a browser and paste the profile URL. Leave empty to skip accounts.",
            "items": {
              "type": "string"
            }
          },
          "videoUrls": {
            "title": "Video URLs",
            "type": "array",
            "description": "Single videos to read: https://www.tiktok.com/@user/video/1234567890123456789 or the video id alone. One row per video with its current counts. Short links (vm.tiktok.com) are not followed. Leave empty to skip.",
            "items": {
              "type": "string"
            }
          },
          "maxVideosPerInput": {
            "title": "Maximum videos per hashtag or account",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Reading a hashtag or an account stops once this many charged video rows have been returned for it, and a free row says so. If TikTok's list ends earlier, a free row says how many it listed. In monitoring mode it also sets how deep each hashtag list is read; for accounts it limits only the first check.",
            "default": 100
          },
          "onlyVideosWithHashtag": {
            "title": "Only videos that carry the hashtag",
            "type": "boolean",
            "description": "On (default) = a hashtag returns only videos that carry that hashtag themselves. TikTok's hashtag page also shows related videos without it; those are skipped, not charged, and counted in a free row. Off = every video the hashtag page lists is returned, and the hashtagInVideo column says which ones carry it.",
            "default": true
          },
          "postedAfter": {
            "title": "Only videos posted on or after",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}([T ][\\d:.]+(Z|[+-]\\d{2}:?\\d{2})?)?|\\d{1,5}\\s*(d|day|days))$",
            "type": "string",
            "description": "Optional. A date (2026-09-01, read as 00:00 UTC), a time (2026-09-01T12:00:00Z) or a number of days back (30 days). Older videos are not returned or charged. For accounts, reading stops once it reaches videos 3 days older than this."
          },
          "postedBefore": {
            "title": "Only videos posted before",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}([T ][\\d:.]+(Z|[+-]\\d{2}:?\\d{2})?)?|\\d{1,5}\\s*(d|day|days))$",
            "type": "string",
            "description": "Optional. Same formats as postedAfter. Accounts start reading at this time instead of at the newest video, so older periods can be exported without paying for newer videos; hashtags skip newer videos without charging them. Not available in monitoring mode."
          },
          "monitoringMode": {
            "title": "Monitoring mode: return only videos not returned before",
            "type": "boolean",
            "description": "Off = every run returns the videos, charged per row. On = the first run of a hashtag or account returns up to maxVideosPerInput videos and remembers them; later runs return only new ones (accounts: posted after the previous check; hashtags: videos in the first maxVideosPerInput of the list that were not returned before). **In monitoring mode every hashtag or account checked costs $0.30 per 1,000 checks, whether or not it has new videos**, plus the row price for the videos returned. Video URLs are returned every run with their current counts. Remembered per hashtag and per account; do not put the same one in two schedules that can run at the same time.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was remembered and start over",
            "type": "boolean",
            "description": "Clears everything remembered for every hashtag and account, so the next monitoring run treats each one as a first check again. Turn it off again after one run: left on in a schedule, every run is a first check.",
            "default": false
          },
          "useProxy": {
            "title": "Use a proxy if TikTok refuses",
            "type": "boolean",
            "description": "Every page is requested directly first. Accounts and video URLs: only a rate limit (HTTP 429 or 503), an empty response or no response is retried through a US proxy. Hashtags: only if the hashtag page sends no video list is it opened again through a US datacenter proxy. A verification page is never retried: the run stops there. Off = no proxy is used or paid for.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}