# Connecting TikTok to Social Quack — the complete guide

TikTok is the one platform where connecting takes a form and a short screen recording instead of two clicks. This page gets you through it in about 20 minutes, with every answer ready to paste. You only do this once.

> **Rather skip TikTok's review?** Connect through Zernio instead: paste one key, sign in, post — a few minutes, no form. See the [Zernio guide](/guides/zernio). This page is the do-it-yourself route with your own developer app.

**Two phases, and you can start posting after phase 1:**

| Phase | What you get | Time |
|---|---|---|
| **1. Create the app** | Connect your account and post — but posts are **private (only you can see them)** until TikTok reviews the app | ~10 min |
| **2. Submit for review** | Public posting | ~10 min of your time, then 1–5 business days on TikTok's side |

## Phase 1 — create your TikTok developer app

1. Go to **https://developers.tiktok.com** and log in with your TikTok account. (You may be asked to verify your email and accept the developer terms.)
2. **Manage apps → Connect an app.** Fill in:
   - **App name**: anything, e.g. `My Social Quack`
   - **App icon**: any 1024×1024 image (your logo or a photo)
   - **Category**: *Productivity* (or the closest match)
   - **Description**: paste the one from the [copy-paste answers](#copy-paste-answers) below
   - **Terms of Service URL**: `https://socialquack.com/terms` · **Privacy Policy URL**: `https://socialquack.com/privacy`
   - **Platform**: tick **Desktop**
3. **Add products** (left sidebar): add **Login Kit** and **Content Posting API**.
   - In **Content Posting API**, switch on **Direct Post**.
4. **Login Kit → Redirect URI**: tick **Desktop** and paste the redirect URI exactly as shown in Social Quack (Channels → TikTok → **Set up keys ▾ → Set up app keys** — it looks like `http://localhost:4400/oauth/tiktok/callback`). Save.
   > Why *Desktop* and not *Web*? Social Quack runs on your own computer. TikTok's Desktop platform allows `localhost` redirects and doesn't require you to verify a domain. Web would.
5. **Scopes**: make sure these three are listed under your products: `user.info.basic`, `video.upload`, `video.publish`.
6. **Create a Sandbox** — this is the step everyone misses. Until TikTok has reviewed your app, its main ("production") client key is rejected with `unauthorized_client`. On your app's page click **Sandbox** (top right) → **Create sandbox**. Give it the same products (Login Kit, Content Posting API with Direct Post), the same scopes and the same Redirect URI, and under **Target users** add your own TikTok username.
7. **Sandbox → Client key / Client secret**: copy both into Social Quack (Channels → TikTok → **Set up keys ▾ → Set up app keys**) and click **Connect**. Approve the TikTok login page. Your account appears under Connected.
8. **Use a throwaway TikTok account for testing.** Sandbox apps can only post to *private* accounts (`unaudited_client_can_only_post_to_private_accounts` otherwise) — and you don't want to flip your real account private. Create a fresh TikTok account (any email), set it to Private (Profile → ☰ → Settings and privacy → Privacy → **Private account**), add its username under the sandbox's **Target users**, and connect *that* account in Social Quack.
9. Post a test video from Compose. When you tick the TikTok channel, a **TikTok options** panel appears — choose who can see the post (only "Only you" is offered in sandbox), the comment/duet/stitch switches, and whether it's commercial content. It publishes to the throwaway account. That's phase 1 done.

> **After review is approved:** go back to **Edit keys ▾ → Edit app keys**, paste the app's **production** Client key/secret (from App details, not the sandbox), and click Connect — this time with your **real** account. From then on the privacy selector offers Everyone / Friends / Followers / Only you.

**Photo posts** need one extra step: TikTok fetches photos from a public URL, so configure *Media hosting* in Social Quack Settings, then in your TikTok app open **Content Posting API → URL properties** and verify that domain. Videos don't need this.

## Phase 2 — submit for review (lifts the private-only limit)

In the developer portal open your app → **Submit for review**. TikTok asks three things: an explanation of each product and scope, a demo video, and the app's basics. Everything you need is below.

### Copy-paste answers

**App description**
> Personal social-media scheduling tool. I write posts on my own computer (Social Quack, a self-hosted scheduler that runs locally on my Mac/PC) and it publishes them to my own TikTok account at the scheduled time. Single user: me. No data about other TikTok users is collected or stored; nothing runs on a server.

**Explain how each product and scope works within your app**
> **Login Kit** — used once to sign in with my own TikTok account so the app can obtain an access token for that account. The token is stored encrypted on my computer only.
>
> **Content Posting API (Direct Post)** — used to publish videos and photo posts that I create and schedule myself. The app uploads the video file directly (FILE_UPLOAD) at the scheduled time with the caption I wrote, using the privacy level I chose.
>
> **user.info.basic** — reads my own display name, avatar and username to show which account is connected in the app.
>
> **video.upload** — uploads the video file to TikTok for a post I scheduled.
>
> **video.publish** — publishes that upload as a post on my own account, with my caption and privacy setting.
>
> Data handling: the app is local-only software. Access tokens are stored encrypted on my device, never transmitted to any third-party server, and are deleted when I disconnect the account. No content or data from other users is accessed.

**If asked "Does your app allow users to post publicly?"** → Yes — the user chooses the privacy level (public, friends, or private) for each post, matching what they'd pick in the TikTok app.

**If asked about a website / how users access the app** → Desktop application installed on the user's computer; the website is https://socialquack.com.

### The demo video — what to record

TikTok wants to *see* the flow, not a marketing video. A 60–90 second screen recording is perfect. Mac: **QuickTime → File → New Screen Recording**, or ⌘⇧5.  No voice-over needed; captions are a nice touch but optional.

**Script (follow it in order — reviewers look for these exact beats):**

1. **(0:00)** Open Social Quack. Show the **Channels** page briefly.
2. **(0:05)** Click **Connect** on TikTok. The TikTok login page opens in your browser — **show the permission screen** listing the scopes (user info, upload, publish) and click **Authorize**. Show that it returns to Social Quack with your TikTok account now listed under *Connected*.
3. **(0:25)** Go to **Compose**. Type a caption, click **Upload** and attach a short video, tick the TikTok channel. **Linger on the TikTok options panel that appears** — reviewers check for it: the "Posting to TikTok as …" line, open the *Who can see this post* dropdown and pick a value, show the Allow comments / Duet / Stitch switches, flick *Disclose commercial content* on and off to reveal *Your brand* / *Branded content*, and let the "By posting, you agree to TikTok's Music Usage Confirmation" line be visible. Then pick a time a minute or two ahead (or click **Post now**).
4. **(0:45)** Show the post in the **Queue** with status *scheduled*, then wait for it (or after *Post now*) to flip to *published*. Click the **view** link.
5. **(1:00)** Show the post on TikTok itself — the web profile or your phone screen — so the reviewer sees the caption and video landed on the account.
6. **(1:15, optional but strong)** Go to Channels → **Remove** the TikTok channel, showing that disconnecting revokes the app's access.

Keep the whole thing in one take; edits aren't needed. Save as MP4 and upload it in the review form's demo-video field.

### After you submit

- Typical turnaround: 1–5 business days. You get an email either way.
- If rejected, the reason is usually one of: the demo video didn't show the permission screen, didn't show the post appearing on TikTok, or the scope explanation didn't mention what *each* scope is for. Fix that one thing and resubmit — same day is fine.
- Meanwhile keep using the app: private posts work throughout.
- Once approved, nothing changes in Social Quack — your next post simply uses the privacy level you chose.

## Troubleshooting

| You see | It means | Do this |
|---|---|---|
| `unauthorized_client` / `client_key` on the TikTok login page | You used the production keys before review | Create a Sandbox, add yourself as target user, use the **sandbox** client key/secret |
| `redirect_uri` error on the TikTok login page | The URI in Login Kit doesn't match exactly | Copy it from Social Quack's TikTok card again, including the port; make sure **Desktop** is ticked |
| `unaudited_client_can_only_post_to_private_accounts` | Sandbox app + the connected account is public | Connect a throwaway account that is set to **Private** (step 8) |
| "TikTok: choose who can see this post" | The privacy level wasn't picked in the TikTok options panel | Tick the TikTok channel in Compose and choose an audience |
| Post fails with `privacy_level_option_mismatch` | App not yet reviewed, so only private is allowed | Expected before review — the post is private; submit for review to lift it |
| Post fails with `unaudited_client_can_only_post_to_private_accounts` | Same as above | Same |
| "TikTok session fully expired" | You haven't posted in a year; the refresh token lapsed | Channels → Remove → Connect again |
| Photo post fails, video works | Media domain not verified | Content Posting API → URL properties → verify your media host domain |
