TikTok API endpoint
Returns one page of a place's mixed video/photo grid unmodified in `item_list`: each row carries an `aweme` video object or a photo entry plus `media_type`/`item_type`, an `aweme_cover`, topic tags and a crop cover. `next_cursor` is the opaque paging token to pass back as `cursor` (send the returned `data_version` with it; the endpoint defaults it to `v1`). `size` is the app's page hint (default 6, max 30; the server caps larger values).
/tiktok/mobile/place/mediaQuery parameters:
poi_id: required. Place id from the place search/detail endpoints.cursor: optional. Opaque next_cursor token from the previous response.size: optional. Rows per page hint, bounded at 30. Default: 6 (the app's first-page size).data_version: optional. Paging data version carried with cursor; defaults to v1.Measured 2026-10-24 (route host pair aggr32/api32), place
42203861086875992 (Nam Coffee): poi_id + size=6 -> HTTP 200, 291,692 B, status_code 0, 6 rows,
next_cursor v0_#_#, data_version v1, has_more false; size=1 returns exactly one row and larger
sizes are server-capped. Passing the token back answers an empty page cleanly when the place has no more media.
Example request:
GET /api/v1/tiktok/mobile/place/media?poi_id=42203861086875992&size=6
Example response (truncated):
{
"code": 200,
"msg": "OK",
"data": {
"item_list": [
{
"media_type": 1,
"item_type": 1,
"aweme": {"aweme_id": "...", "desc": "...", "statistics": {"play_count": 1234}},
"aweme_cover": {"url_list": ["https://..."]}
}
],
"next_cursor": "v0_#_#",
"data_version": "v1",
"has_more": false,
"status_code": 0
}
}
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| poi_id | string | Yes | Place id from the place search/detail endpoints | 42203861086875992 | |
| cursor | string | No | Opaque next_cursor token from the previous response | ||
| size | integer | No | Rows per page hint (max 30) | ||
| data_version | string | No | v1 | Paging data version carried with cursor (defaults to v1) | v1 |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/place/media?poi_id=42203861086875992" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"item_list": [
{
"media_type": 1,
"item_type": 1,
"aweme": {
"aweme_id": "...",
"desc": "...",
"statistics": {
"play_count": 1234
}
},
"aweme_cover": {
"url_list": [
"https://..."
]
}
}
],
"next_cursor": "v0_#_#",
"data_version": "v1",
"has_more": false,
"status_code": 0
}
}Request schema
No body schema
Response schema
#/definitions/tiktokmobile.placeMediaResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | tiktokmobile.PlaceMediaResponse | No | ||||
| data.data_version | string | No | ||||
| data.extra | unknown | No | ||||
| data.has_more | boolean | No | ||||
| data.item_list | array | No | ||||
| data.log_pb | unknown | No | ||||
| data.next_cursor | string | No | ||||
| data.pos | unknown | No | ||||
| data.post_bottom_bar_style | unknown | No | ||||
| data.status_code | integer | No | ||||
| data.status_msg | string | No | ||||
| data.title | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Invalid input | #/definitions/app.Response |
| 429 | Rate limit exceeded | #/definitions/app.Response |
| 500 | Internal server error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/place/media?poi_id=42203861086875992" \
-H "x-api-key: $CRAWLORA_API_KEY"