tiktok · v1.0 · 2026-06-22 · sha256 152c2bb715d061a9

tiktok v1.0A

Immutable. This exact content is served forever at /api/v1/blob/152c2bb715d061a9.

---
name: tiktok
description: Upload videos to the user's TikTok inbox/drafts and read their TikTok profile via the Content Posting API. Use when the user wants to publish or post a generated video to TikTok, send a video to their TikTok drafts, or check their TikTok account.
when_to_use: |
  Trigger when the user wants to push a video (e.g. one generated by
  the video skills) to TikTok. v1 uploads to the user's **inbox /
  drafts** (they finish posting in the TikTok app) — the safe,
  pre-audit path. Confirm before uploading; the video must be a public
  URL on a verified domain (or a file you upload in chunks).
connections: [tiktok]
allowed_tools: [Bash]
license: Apache-2.0
metadata:
  author: acedatacloud
  version: "1.0"
---

Call the **TikTok Content Posting API** with `curl + jq`. The user's OAuth bearer
token is in `$TIKTOK_TOKEN`; every call needs `Authorization: Bearer
$TIKTOK_TOKEN`. Base URL: `https://open.tiktokapis.com/v2`.

Responses wrap everything in `{"data":...,"error":{"code","message","log_id"}}` —
`error.code == "ok"` means success; otherwise show `error.message` verbatim.
`401`/`access_token_invalid` = re-connect TikTok.

```bash
T="https://open.tiktokapis.com/v2"; AUTH="Authorization: Bearer $TIKTOK_TOKEN"
# Profile (account card)
curl -sS -H "$AUTH" "$T/user/info/?fields=open_id,display_name,avatar_url" \
  | jq '.data.user'
```

## Upload a video to the user's inbox / drafts (v1)

The simplest path is `PULL_FROM_URL`: TikTok fetches the video from a public URL
on a **verified domain** (AceData's `cdn.acedata.cloud` is verified for this app).

```bash
VIDEO_URL="https://cdn.acedata.cloud/...mp4"   # must be on a verified domain
curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" -d "$(jq -n --arg u "$VIDEO_URL" \
  '{source_info:{source:"PULL_FROM_URL", video_url:$u}}')" \
  "$T/post/publish/inbox/video/init/" | jq '{publish_id: .data.publish_id, error}'
```

This drops the video into the user's TikTok **inbox** — they open the TikTok app
to add caption / sound / privacy and post. Poll status:

```bash
curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"publish_id":"PUBLISH_ID"}' "$T/post/publish/status/fetch/" \
  | jq '.data | {status, fail_reason}'
```

## Gotchas

- **v1 = inbox upload only.** True "Direct Post" (set caption + privacy via API,
  posts immediately) needs the `video.publish` scope and a passed Content Posting
  audit — not available until then. Don't call `creator_info` /
  `/post/publish/video/init/` (Direct Post) here; they require that scope.
- `PULL_FROM_URL` only works from a **domain verified** in the TikTok developer
  app. If the video isn't on a verified domain, use the chunked `FILE_UPLOAD`
  flow instead (init → PUT byte ranges → status).
- Unaudited apps are rate-limited and may restrict visibility to `SELF_ONLY`.