Skip to main content
TikTok On your own instance the TikTok app is yours: register it on TikTok for Developers, then put its client id and secret in your environment.
This integration requires that you have a TikTok developer account. It also requires that you have a public website, with https, and can upload files to that site to verify ownership.TikTok will also not allow http:// for your app redirect URI, so you will need to be accessing PostQueen from HTTPS.
NOTE: Photo posts are the ones TikTok pulls from a URL, so for those your media has to be publicly reachable over HTTPS; localhost or private routes such as /uploads will fail. Serve your uploads through a reverse proxy (e.g. Caddy) or object storage such as Cloudflare R2 with public access. Videos are streamed up by PostQueen itself, so a private path works for those.Ensure the media domain is listed under your TikTok developer account’s verified sites.
TikTok approval is not the final step for Direct Post access. TikTok allows unaudited API clients to use the Direct Post API, but posts are restricted to private visibility until the API client completes TikTok’s audit process for Terms of Service compliance.If your API client has not passed this audit, TikTok also limits Direct Post usage to up to 5 users posting in a 24-hour window, and those user accounts must be private at the time of posting. See TikTok’s Direct Post API developer guidelines for the current requirements.In practice this means: before your TikTok developer app passes audit, TikTok accepts nothing but SELF_ONLY (private). PostQueen does not downgrade it for you, it sends the level you picked, so anything else comes back as a failed post reading App not approved for public posting, contact support. Set SELF_ONLY yourself until the audit clears, then every level becomes available.
1

Create your app

Go here: https://developers.tiktok.com/apps
Create a new app
  • App Name: MyPostQueen
  • Redirect URI: your PostQueen callback URL, shown in the next step
Your TikTok OAuth2 Redirect URI:
  • Production: https://postqueen.example.com/integrations/social/tiktok
  • Local development (HTTPS required): https://localhost:4200/integrations/social/tiktok
  • Docker (HTTPS required): https://localhost:4007/integrations/social/tiktok
Serve your local instance over HTTPS and set FRONTEND_URL to match. Leave it on plain http and she wraps the callback through redirectmeto.com before sending it, which makes the literal string TikTok receives https://redirectmeto.com/http://localhost:4200/integrations/social/tiktok. Register whichever of the two your FRONTEND_URL actually produces, because a mismatch stops the login on TikTok.
2

Set a TOS and Privacy Policy

This needs to be on a public domain that you have access to, that is hosted on HTTPS.Tick “Web” for your platforms.
3

Add apps

Add the “Login Kit” and “Content Posting API” to your app.For “Login Kit”, set the redirect URI to the same value you registered two steps back. It is one URI across the app, not a second one just for Login Kit.For Content posting API, enable “Direct Post”.
4

Add scopes

Add all six. The connect is refused if any one of them is missing, and video.create is not one of them:
  • user.info.basic
  • user.info.profile
  • user.info.stats
  • video.list
  • video.upload
  • video.publish
5

Copy your client secret to environment variables

These can be found immediately after registering your application. The client ID is 16 characters long and the secret is 32 characters long.
Restart PostQueen with the updated environment variables
6

Add a TikTok channel in the PostQueen web interface

Go to the PostQueen web interface, and click on the “Add Channel” button. Select “TikTok” from the list of available channels. You should be redirected to TikTok to authorize the application.
The channel is in the left sidebar with its avatar and name. That is the whole confirmation: if it is in the list, she can post to it.

Next steps

What she can post to TikTok

Limits, post types and settings

Configuration reference

Every variable she reads

Connect errors

Invalid state, invalid_grant and the rest

Another channel

Every network, and what each one asks for