Posts
TikTok 영상을 나열합니다: 크리에이터, 해시태그, 사운드, 재생목록의 영상, 또는 탐색 피드.
GET | POST /v1/tiktok/posts파라미터는 GET의 쿼리 문자열로도, POST의 JSON 본문으로도 보낼 수 있습니다. 둘은 같습니다.
넘길 값
| 넘기는 값 | 읽는 것 | 비고 |
|---|---|---|
username 또는 userId | 크리에이터의 영상 | type: posts (기본값), reposts, likes (공개된 경우) |
hashtag | 해시태그의 영상 | 이름 또는 숫자 id (조회 한 번을 절약) |
sound | 사운드를 사용한 영상 | |
playlist | 재생목록의 영상 | |
| 없음 | 탐색 피드 | category (기본값 120) |
호출마다 소스는 하나만 넘기세요. 모든 식별자는 페이지 URL도 받습니다.
파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
category | string | Default feed only: explore category id (default 120). | |
cursor | string | Opaque cursor from the previous page's cursor. Pass it alone for the next page. | |
hashtag | string | Videos under a hashtag: its name, or its numeric id (saves the lookup). A hashtag that is itself a number takes its # (#2024). | |
limit | integer 1–30 | Items per page, 1–30. | |
playlist | string | Videos in a playlist: id or URL (…/playlist/-<id>). | |
sound | string | Videos using a sound: sound id or URL (…/music/-<id>). | |
type | enum | username/userId: the creator's posts (default), reposts or likes. posts reposts likes | |
userId | string | Creator secUid. Pass it instead of a username to save the lookup (1 unit instead of 2). | |
username | string | Creator @handle (with or without @), or the profile URL. |
요청
curl "https://gateway.apinoa.com/v1/tiktok/posts?username=tiktok&limit=3" \
-H "x-api-key: $APINOA_API_KEY"응답
data에 Post Page를 돌려줍니다. 실제 응답을 줄인 것입니다. 배열은 앞쪽 항목만 남기고 긴 텍스트는 잘랐습니다.
{
"success": true,
"data": {
"platform": "tiktok",
"items": [
{
"platform": "tiktok",
"id": "7700009319382650142",
"url": "https://www.tiktok.com/@tiktok/video/770000931938…",
"author": {
"platform": "tiktok",
"id": "107955",
"handle": "tiktok",
"displayName": "TikTok",
"url": "https://www.tiktok.com/@tiktok",
"avatarUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-usea…",
"verified": true,
"counts": {
"followers": 96400000,
"following": 1,
"posts": 1512
},
"ext": {
"secUid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBS…",
"signature": "Your next discovery is waiting on TikTok.",
"totalLikes": 466000000,
"likesGiven": 4377
}
},
"text": "The best part of searching a new city on TikTok?…",
"createdAt": "2026-10-23T23:29:02.000Z",
"lang": "en",
"media": [
{
"type": "video",
"url": "https://www.tiktok.com/aweme/v1/play/?faid=1988&f…",
"width": 720,
"height": 1280,
"thumbnailUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-usea…",
"durationSec": 107,
"variants": [
{
"url": "https://www.tiktok.com/aweme/v1/play/?faid=1988&f…",
"width": 720,
"height": 1280,
"bitrate": 740138,
"contentType": "video/mp4"
}
],
"ext": {
"playAddr": "https://v16-webapp-prime.us.tiktok.com/video/tos/…",
"downloadAddr": "https://v16-webapp-prime.us.tiktok.com/video/tos/…",
"dynamicCover": "https://p19-common-sign.tiktokcdn-us.com/tos-usea…",
"definition": "720p",
"videoQuality": "normal",
"ratio": "720p",
"codec": "h264",
"format": "mp4",
"bitrate": 740138,
"sizeBytes": 9949494,
"loudness": -19.9,
"peak": 1,
"hasOriginalAudio": true,
"autoCaption": true,
"bitrateVariants": [
{
"gearName": "normal_720_0",
"fps": 23,
"codec": "h264",
"sizeBytes": 9949494
}
],
"subtitles": [
{
"lang": "eng-US",
"langId": "2",
"url": "https://v16m-webapp.tiktokcdn-us.com/be8291ee2919…",
"format": "webvtt",
"source": "ASR"
}
]
}
}
],
"metrics": {
"likes": 2235,
"comments": 553,
"shares": 144,
"views": 122800,
"reposts": 0,
"saves": 132
},
"entities": {
"mentions": [
{
"handle": "morimatcha__",
"id": "7547085538516485175"
}
]
},
"audio": {
"id": "7700009421400869662",
"title": "original sound",
"artist": "TikTok",
"url": "https://v16m.tiktokcdn-us.com/b9eda378f913298c1de…"
},
"ext": {
"music": {
"original": true,
"coverUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-usea…",
"durationSec": 107,
"isCommerceMusic": true,
"appleMusicId": "1543888610",
"spotifyId": "5Cf5U4MLpSJQb29IqY8bWA"
},
"duetEnabled": true,
"stitchEnabled": true
}
}
],
"cursor": "z3_ejXLXnHrW_fwkl8jd8OBVtLZI0s7eC6UysxOBxhQMNFiYF…"
}
}에러
| 상태 | 코드 | 의미 |
|---|---|---|
| 400 | INVALID_CURSOR | 이 오퍼레이션이 돌려준 cursor가 아닙니다. cursor 없이 처음부터 다시 호출하세요. |
| 400 | INVALID_PARAMS | 파라미터가 없거나, 알 수 없거나, 범위를 벗어났습니다. 메시지에 이름이 나옵니다. |
| 401 | UNAUTHORIZED | x-api-key 헤더가 없거나, 폐기되었거나 알 수 없는 키입니다. |
| 402 | INSUFFICIENT_BALANCE | 잔액이 이 호출 비용에 모자랍니다. 대시보드에서 충전하세요. |
| 404 | NOT_FOUND | 계정·게시물·그룹이 없거나, 비공개·삭제·연령 제한 상태입니다. |
| 429 | MARKETPLACE_SATURATED | 동시 호출이 너무 많습니다. Retry-After 초만큼 기다린 뒤 다시 시도하세요. |
| 502 | UPSTREAM_ERROR | 플랫폼이 쓸 수 없는 응답을 보냈습니다. 간격을 두고 다시 시도하세요. |
모든 코드는 Errors에 있습니다. 실패한 호출은 과금되지 않습니다.
가격
가격 호출당 $0.001, 추가 호출마다 $0.001 — 최대 1번 더, 합계 최대 $0.002. 정가 기준이며, 하루 1,000회를 넘으면 단가가 내려갑니다.
참고
userId는 크리에이터의secUid입니다.username대신 넘기면 조회 한 번을 절약해 2단위가 아닌 1단위입니다.