TikTok Keywords Discovery
Pricing
from $0.20 / 1,000 results
TikTok Keywords Discovery
Expands seed keywords into TikTok search autocomplete suggestions with A-Z/0-9 expansion, recursion, raw TikTok signals, clustering and an HTML report.
TikTok Keywords Discovery
Pricing
from $0.20 / 1,000 results
Expands seed keywords into TikTok search autocomplete suggestions with A-Z/0-9 expansion, recursion, raw TikTok signals, clustering and an HTML report.
You can access the TikTok Keywords Discovery programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, youโll need an Apify account and your API token, found in API & Integrations in Apify Console.
{ "openapi": "3.0.1", "info": { "version": "0.1", "x-build-id": "wqNFVutu65ga3hWge" }, "servers": [ { "url": "https://api.apify.com/v2" } ], "paths": { "/acts/solalab_digital~tiktok-keywords-discovery/run-sync-get-dataset-items": { "post": { "operationId": "run-sync-get-dataset-items-solalab_digital-tiktok-keywords-discovery", "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/solalab_digital~tiktok-keywords-discovery/runs": { "post": { "operationId": "runs-sync-solalab_digital-tiktok-keywords-discovery", "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/solalab_digital~tiktok-keywords-discovery/run-sync": { "post": { "operationId": "run-sync-solalab_digital-tiktok-keywords-discovery", "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": [ "keywords" ], "properties": { "keywords": { "title": "Seed keywords", "type": "array", "description": "Seed phrases to expand. Each seed is sent to TikTok search autocomplete. Up to 500 seeds; duplicates are removed.", "default": [ "skincare routine" ], "items": { "type": "string" } }, "regions": { "title": "Regions", "type": "array", "description": "Two-letter region codes sent as the region parameter, e.g. US, GB, DE. Each region costs one extra request per query. Without a matching proxy this is regional labelling, not a guarantee of local results.", "default": [ "US" ], "items": { "type": "string" } }, "language": { "title": "App language", "enum": [ "en", "es", "fr", "de", "it", "pt", "tr", "id", "ja", "ko", "ru" ], "type": "string", "description": "Value of the app_language parameter. The language of the seed itself influences results far more than this setting.", "default": "en" }, "includeSeedEcho": { "title": "Include seed echo", "type": "boolean", "description": "Keep suggestions that are identical to the query that produced them.", "default": false }, "resultOrder": { "title": "Result order", "enum": [ "score", "source", "alphabetical" ], "type": "string", "description": "Order of the rows in the dataset.", "default": "score" }, "expandMode": { "title": "Expansion mode", "enum": [ "none", "suffix", "prefix", "both" ], "type": "string", "description": "How each seed is expanded. 'none' sends one request per seed (10 suggestions). 'suffix' appends every letter/digit, 'prefix' prepends them, 'both' does both.", "default": "suffix" }, "alphabets": { "title": "Alphabets", "type": "array", "description": "Character sets used for expansion: latin (26), digits (10), cyrillic (33).", "items": { "type": "string", "enum": [ "latin", "digits", "cyrillic" ], "enumTitles": [ "Latin a-z", "Digits 0-9", "Cyrillic a-ya" ] }, "default": [ "latin", "digits" ] }, "recursionDepth": { "title": "Recursion depth", "minimum": 0, "maximum": 3, "type": "integer", "description": "How many times discovered suggestions are fed back as new seeds. 0 disables recursion. Recursive seeds are queried as-is, without alphabet expansion.", "default": 0 }, "recursionWidth": { "title": "Recursion width", "minimum": 1, "maximum": 50, "type": "integer", "description": "How many top suggestions from each level become seeds for the next level.", "default": 10 }, "maxRequests": { "title": "Max requests", "minimum": 1, "maximum": 5000, "type": "integer", "description": "Hard ceiling on HTTP requests for the whole run. The main guard against a runaway bill.", "default": 40 }, "maxResults": { "title": "Max results", "minimum": 1, "maximum": 20000, "type": "integer", "description": "Maximum number of unique suggestion rows pushed to the dataset.", "default": 50 }, "maxSuggestionsPerKeyword": { "title": "Max suggestions per seed", "minimum": 1, "maximum": 20000, "type": "integer", "description": "Cap on unique phrases attributed to a single seed. Leave empty for no cap." }, "minScore": { "title": "Minimum score", "minimum": 0, "maximum": 100, "type": "integer", "description": "Drop rows whose computed score is below this value.", "default": 0 }, "onlyEcommerce": { "title": "Only e-commerce intent", "type": "boolean", "description": "Keep only suggestions TikTok marks with a non-zero ecom_intent signal.", "default": false }, "includeTerms": { "title": "Include terms", "type": "array", "description": "Keep only suggestions containing at least one of these substrings (case-insensitive).", "default": [], "items": { "type": "string" } }, "excludeTerms": { "title": "Exclude terms", "type": "array", "description": "Drop suggestions containing any of these substrings (case-insensitive).", "default": [], "items": { "type": "string" } }, "enrichHashtags": { "title": "Enrich hashtags with view counts", "type": "boolean", "description": "Look up view and video counts for the hashtag each phrase maps to, using TikTok's public challenge endpoint. An explicit #tag wins; otherwise the phrase is squashed into one token the way TikTok forms hashtags ('skincare routine' becomes #skincareroutine). Costs one extra request per unique tag. In the cloud it needs Apify Proxy with the RESIDENTIAL group; even then only about half of the tags resolve, the rest stay empty.", "default": false }, "maxHashtagLookups": { "title": "Max hashtag lookups", "minimum": 1, "maximum": 500, "type": "integer", "description": "Ceiling on hashtag stat lookups per run.", "default": 25 }, "videoUrls": { "title": "Video URLs", "type": "array", "description": "TikTok video URLs to resolve via the public oEmbed endpoint. Returns the caption, author and thumbnail, plus every hashtag found in the caption, as extra rows of type videoCaption.", "default": [], "items": { "type": "string" } }, "compareWithPrevious": { "title": "Compare with previous run", "type": "boolean", "description": "Load the previous snapshot for this monitor key and mark each row as new or existing, with the score delta.", "default": false }, "monitorKey": { "title": "Monitor key", "type": "string", "description": "Name of the snapshot slot. Leave empty to derive it from the seeds, regions and language." }, "maxConcurrency": { "title": "Max concurrency", "minimum": 1, "maximum": 20, "type": "integer", "description": "Parallel in-flight requests.", "default": 8 }, "maxRequestsPerSecond": { "title": "Max requests per second", "minimum": 0.5, "maximum": 25, "type": "number", "description": "Request rate cap. Automatically halved when TikTok answers with 429.", "default": 8 }, "proxyConfiguration": { "title": "Proxy configuration", "type": "object", "description": "Optional Apify Proxy. Needed for hashtag stats: TikTok blocks datacenter IPs on that endpoint, so use the RESIDENTIAL group when enrichHashtags is on. Also useful for country-specific results. Without a proxy the actor connects directly.", "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 } } } } } } } } }}OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.
OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.
By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.
You can download the OpenAPI definitions for TikTok Keywords Discovery from the options below:
If youโd like to learn more about how OpenAPI powers GPTs, read our blog post.
You can also check out our other API clients: