# solari tiktok account posts

> TikTok 계정 하나의 포스트를 최신순으로 페이지 단위로 훑어요.

- **CLI**: `solari tiktok account posts`
- **MCP 도구**: `solari_tiktok_account_posts`
- **권한**: `solari:read` — 로그인한 SOLARI 계정이면 쓸 수 있어요.

TikTok 계정 하나의 포스트를 최신순으로, 페이지네이션과 필터와 함께 반환해요. 계정은 account_id(solari_tiktok_account_search가 주는 TikTok 계정 UUID) 또는 username(TikTok 핸들)으로 지정해요. 각 항목에는 post_id(SOLARI 포스트 UUID), video_id(공개 숫자 TikTok id)와 url, post_type(video 또는 carousel), posted_at, caption, duration_seconds, play/like/comment/share/collect 카운트, is_ad, cover_url, images(캐러셀 슬라이드), hashtags, mentions가 담기고, include_transcript=true면 transcript도 담겨요. 전사문은 길기 때문에 include_transcript는 기본적으로 꺼져 있어요. 음성 내용이 중요할 때만 켜세요. 응답에는 found, account_id, username, total, has_more, items가 실려요. limit과 offset으로 페이지를 넘기고, since/until(UTC 날짜, 양끝 포함)과 post_type으로 범위를 좁혀요. 아직 추적 중이 아닌 핸들은 첫 요청 때 실시간으로 수집되며(10~40초 소요), fetched_on_demand=true는 백그라운드 크롤이 들어오기 전까지 가장 최근 포스트만 사용할 수 있다는 표시예요. found=false는 그 핸들이 TikTok에 존재하지 않는다는 뜻이에요. 로그인한 모든 SOLARI 계정에서 사용할 수 있어요.

**언제 쓰나** — 프로필 미리보기보다 더 깊이 파고들 때, 또는 기간과 포맷으로 범위를 좁힐 때.

**무엇이 돌아오나** — 포스트. 선택적으로 음성 전사문 포함.

## 파라미터

- `account_id` (string, 선택, uuid, pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$) — TikTok 계정의 account_id(SOLARI 계정 UUID). 이 값 또는 username 중 하나를 주세요.
- `username` (string, 선택, ≤ 64 chars) — TikTok 핸들. 앞의 @는 있어도 없어도 돼요. account_id가 설정되면 무시돼요.
- `limit` (integer, 선택, ≥ 1) — 페이지당 포스트 수, 기본값 12. 200을 넘는 값은 200으로 잘려요.
- `offset` (integer, 선택, 기본값 0, ≥ 0) — 페이지네이션 offset, 기본값 0.
- `since` (string, 선택, pattern ^\d{4}-\d{2}-\d{2}$) — 이 UTC 날짜 이후의 포스트만. YYYY-MM-DD, 해당일 포함.
- `until` (string, 선택, pattern ^\d{4}-\d{2}-\d{2}$) — 이 UTC 날짜 이전의 포스트만. YYYY-MM-DD, 해당일 포함.
- `post_type` (enum, 선택) — 이 포맷의 포스트만. video는 단일 클립, carousel은 이미지 슬라이드쇼예요. 값: `video`, `carousel`.
- `include_transcript` (boolean, 선택, 기본값 false) — 각 항목에 음성 전사문을 붙여요. 전사문이 길어서 기본값은 꺼짐.

## 응답

### `Response`

- `found` (boolean) — false면 그 핸들이 TikTok에 존재하지 않는다는 뜻이에요.
- `account_id / username` (string) — 확인된 계정.
- `total` (integer) — 필터에 맞는 포스트 수.
- `has_more` (boolean) — 다음 페이지가 있는지 여부.
- `items` (object[]) — 포스트. 최신순.
- `fetched_on_demand` (boolean) — 지금까지 가장 최근 포스트만 사용할 수 있으면 true.

### `items[]`

- `post_id` (uuid) — SOLARI 포스트 id. Instagram 포스트 id와는 다른 네임스페이스예요.
- `video_id` (string) — 공개 숫자 TikTok id — /video/ 또는 /photo/ 뒤에 오는 숫자.
- `url` (string) — 공개 TikTok 퍼머링크.
- `account_id` (uuid) — 작성자의 TikTok account_id.
- `username` (string) — 작성자 핸들.
- `post_type` (string) — video(단일 클립) 또는 carousel(이미지 슬라이드쇼).
- `posted_at` (timestamp) — 게시 시각(UTC).
- `caption` (string) — 캡션 텍스트.
- `duration_seconds` (integer) — 영상 길이.
- `width / height` (integer) — 영상 해상도.
- `play_count` (integer) — 재생 수.
- `like_count` (integer) — 좋아요 수.
- `comment_count` (integer) — 댓글 수.
- `share_count` (integer) — 공유 수.
- `collect_count` (integer) — 저장 수.
- `is_ad` (boolean) — TikTok이 이 포스트를 광고로 표시했는지 여부.
- `is_pinned` (boolean) — 프로필 상단에 고정됨.
- `aigc_label_type` (string | null) — TikTok이 붙인 경우의 AI 생성 콘텐츠 라벨.
- `original_language_code` (string | null) — 원본 언어 코드.
- `cover_url` (string) — 커버 이미지 URL.
- `video_url` (string) — 영상 파일 URL.
- `images` (string[]) — 캐러셀 슬라이드. video 포스트에서는 비어 있어요.
- `hashtags` (string[]) — 캡션에서 파싱한 해시태그.
- `mentions` (string[]) — 캡션에서 멘션된 핸들.
- `transcript` (string | null) — 음성 전사문. include_transcript=true일 때만 채워져요.

## 예시

```console
$ solari tiktok account posts username=innisfree_official limit=2
```

_읽기 편하도록 긴 문자열과 반복되는 배열 항목을 줄였어요._

```json
{
  "found": true,
  "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed",
  "username": "innisfree_official",
  "total": 87,
  "has_more": true,
  "items": [
    {
      "post_id": "01a0631e-f0df-7e9d-a09b-d84bc31d3834",
      "video_id": "7680375687139642645",
      "url": "https://www.tiktok.com/@innisfree_official/video/7680375687139642645",
      "account_id": "019b2137-f76e-7b33-9437-26044fa7b1ed",
      "username": "innisfree_official",
      "post_type": "video",
      "posted_at": "2026-09-02T12:00:00Z",
      "caption": "Deeply hydrated skin—NO OFF HOURS. 💚  wherever the day takes MINGYU—his hydration stays SUPERCHARGED ⚡️ Green Tea Ceramide Milk: Lightweight milky toner that won't clog your pores  Green Tea Ceramide Mist: Touch-free, fa …",
      "duration_seconds": 23,
      "width": 1080,
      "height": 1920,
      "play_count": 493,
      "like_count": 37,
      "comment_count": 2,
      "share_count": 0,
      "collect_count": 3,
      "is_ad": false,
      "is_pinned": false,
      "aigc_label_type": null,
      "original_language_code": null,
      "cover_url": "https://smr-images-b.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/cover.jpg",
      "video_url": "https://smr-images-a.bzine.co/tiktok/users/019b2137-f76e-7b33-9437-26044fa7b1ed/posts/01a0631e-f0df-7e9d-a09b-d84bc31d3834/medias/origin.mp4",
      "images": [],
      "hashtags": [],
      "mentions": [],
      "transcript": null
    },
    "… 1 more"
  ],
  "fetched_on_demand": false
}
```

## MCP 호출로 쓰면

```json
{
  "name": "solari_tiktok_account_posts",
  "arguments": {
    "username": "innisfree_official",
    "limit": 2
  }
}
```

## 주의사항

- 전사문은 길기 때문에 include_transcript는 기본적으로 꺼져 있어요. 음성 내용이 중요할 때만 켜세요.
- 페이지당 최대 200개.

## 관련 도구

- [`solari_tiktok_account_profile`](https://solari.sh/docs/tools/tiktok-account-profile.md?lang=ko)
- [`solari_tiktok_content_detail`](https://solari.sh/docs/tools/tiktok-content-detail.md?lang=ko)
- [`solari_instagram_account_posts`](https://solari.sh/docs/tools/instagram-account-posts.md?lang=ko)
