Endpoint Playground
Searches TikTok's effect catalogue by `keyword`, returning the app's full effect objects (`name`, `hint`, `icon_url`, `file_url`, `effect_id`, `types`, `tags`, `parent`/`children`, `effect_type`, `music`, `source`, `designer_id`, `schema`). The upstream is `/aweme/v1/search/effect/`; the page is unfolded to the top level (`effects`, `cursor`, `has_more`, `search_id`, `use_hot`, plus `bind_effects`/`collection` on some queries). Paging is real but needs BOTH halves of the token: pass the previous response's `cursor` and `search_id` together (measured: page 1 `cursor: 100`, page 2 with `cursor=100&search_id=...` returned the final effect with `has_more: false`; a cursor without its `search_id` returns an empty page, which the service rejects as a 400). `count` and `offset` were measured as no-ops. Measured 2026-10-21 with the pure-Go (device-free) signer: `keyword=green screen` -> 6 effects (11,831 B) + 1 on page 2, `green` -> 2, `字幕` -> 4; a keyword with no matches is a valid empty page. The route is not signature-gated, so it does not need the device-backed signer.
curl 'https://api.crawlora.net/api/v1/tiktok/mobile/search/effects?keyword=green+screen' \
-H "x-api-key: $CRAWLORA_API_KEY"| Parameter | Type | Required | Prefilled value | Description |
|---|---|---|---|---|
| keyword | string | Yes | green screen | Effect name or text, e.g. green screen |
| count | integer | No | Accepted for shape parity; the server was measured to ignore it | |
| cursor | integer | No | Next-page token from the previous response (0 = first page) | |
| search_id | string | No | Search-session token from the previous response; required together with cursor |
{
"code": 200,
"msg": "OK",
"data": {
"effects": [
{
"name": "Green Screen Brush",
"hint": "",
"effect_id": "123",
"types": [
"Green Screen"
],
"tags": [
"green screen",
"background"
],
"icon_url": {
"url_list": [
"https://p16-...tiktokcdn-us.com/..."
]
},
"file_url": {
"uri": "...",
"url_list": [
"..."
]
},
"designer_id": "456",
"source": "artist",
"schema": ""
}
],
"cursor": 100,
"has_more": true,
"search_id": "20261021173221C8185FF1D4A1062AD97C",
"use_hot": false,
"status_code": 0,
"status_msg": ""
}
}The sample response, schema and code snippets below work without an account. Sending a live request needs an API key.