{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Hashtag Scraper: Posts, Free Date Filter",
    "description": "Scrape TikTok hashtag feeds with no login: posts under a tag with play, like, comment, share and save counts, caption, author stats, music and media URLs, plus the exact video and view count of the tag. Date window, minimum plays, per tag cap and ad exclusion are free. JSON, CSV, API. Pay per post.",
    "version": "0.1",
    "x-build-id": "XPoNxv0x2PffUTRgv"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/automation_craft~tiktok-hashtag-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-automation_craft-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/automation_craft~tiktok-hashtag-scraper/runs": {
      "post": {
        "operationId": "runs-sync-automation_craft-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/automation_craft~tiktok-hashtag-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-automation_craft-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": "TikTok hashtags to scrape, one per line: nike, #nike or a tag URL such as https://www.tiktok.com/tag/nike. Each post under the tag is one row. A tag that does not exist, or has no public web feed, gets a free status row.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerHashtag": {
            "title": "Maximum posts per hashtag",
            "minimum": 0,
            "type": "integer",
            "description": "Stop a hashtag after this many delivered posts. 0 takes everything TikTok's web feed serves (measured: about 140 posts per hashtag, see the README). Left out, 30."
          },
          "maxPosts": {
            "title": "Maximum posts in total",
            "minimum": 0,
            "type": "integer",
            "description": "Stop the whole run after this many delivered posts across all hashtags. 0 means no total cap. Filtered posts, duplicates and posts already in your memory do not count."
          },
          "includeHashtagCard": {
            "title": "Include the hashtag card",
            "type": "boolean",
            "description": "Add one free row per hashtag (type \"hashtag\") with the tag id, description and the exact video count and view count TikTok reports for it."
          },
          "postedAfter": {
            "title": "Posted on or after (date)",
            "type": "string",
            "description": "Free filter: keep only posts created on or after this day (YYYY-MM-DD, UTC). The feed is not in date order, so older posts are skipped, not a stop signal. An unreadable date stops the run before anything is charged."
          },
          "postedBefore": {
            "title": "Posted on or before (date)",
            "type": "string",
            "description": "Free filter: keep only posts created on or before this day (YYYY-MM-DD, UTC, the whole day included)."
          },
          "minPlays": {
            "title": "Minimum plays",
            "minimum": 0,
            "type": "integer",
            "description": "Free filter: keep only posts with at least this many plays, as TikTok prints the count. Empty or 0 keeps every post."
          },
          "requireTagInCaption": {
            "title": "Only posts that carry the hashtag",
            "type": "boolean",
            "description": "Free filter: keep only posts whose caption or hashtag list names the tag you asked for. TikTok's feed also shows related posts without it. Every row carries containsTagInCaption either way."
          },
          "excludeAds": {
            "title": "Exclude ads",
            "type": "boolean",
            "description": "Free filter: skip promoted posts (isAd true) that TikTok mixes into the feed."
          },
          "slideshowsOnly": {
            "title": "Slideshows only",
            "type": "boolean",
            "description": "Free filter: keep only photo slideshow posts. The web hashtag feed rarely carries them (1 in 1,541 feed posts in our measurement), so expect few or no rows."
          },
          "memoryName": {
            "title": "Memory name",
            "type": "string",
            "description": "Optional. A name for a cross run memory of delivered post ids. With a memory, a post delivered in an earlier run under the same name is skipped for free, so a scheduled run pays only for new posts."
          },
          "resetMemory": {
            "title": "Reset the memory",
            "type": "boolean",
            "description": "Forget every post id stored under the memory name before this run starts."
          },
          "tryDirectFirst": {
            "title": "Try the platform IP first",
            "type": "boolean",
            "description": "The first page session of a run uses the Apify platform's own IP with no proxy (the fastest and cheapest exit we measured); every later or replacement session uses the proxy below."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Proxy for replacement page sessions. The default datacenter group is the measured fallback. Residential proxies work but cost far more per post, so they are never chosen automatically."
          },
          "maxConcurrency": {
            "title": "Parallel page sessions",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "How many hashtags are scraped in parallel, each in its own page session (1 to 3). One is the measured fastest and cheapest: the page is CPU bound, and a second session starts on a proxy exit."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}