Приложение TikTok для API: пошаговая настройка
Для интеграции с TikTok нужно приложение в TikTok for Developers с двумя продуктами: Login Kit (OAuth и redirect URI) и Content Posting API с включённым Direct Post. Скопируйте Client key и Client secret, добавьте scope вроде video.publish, подтвердите домен или URL prefix для PULL_FROM_URL, протестируйте в sandbox и пройдите ревью — до аудита посты видны только в приватном режиме.
Обновлено:
Что даёт приложение TikTok?
Два значения: Client key (идентификатор приложения, в OAuth-запросах передаётся как client_key) и Client secret (секрет: обмен кода на токены и проверка подписи вебхуков). Пользовательский access token живёт 24 часа, refresh token — 365 дней; при обновлении refresh token может смениться, поэтому каждый раз сохраняйте новый.
Token endpoint ожидает application/x-www-form-urlencoded — запрос с JSON будет отклонён.
Scope делятся на две группы: профиль и список видео (user.info.*, video.list) и публикация контента (video.upload, video.publish). Все scope, кроме user.info.basic, требуют предварительного одобрения в конфигурации приложения.
Как создать и настроить приложение в TikTok for Developers
Зарегистрируйтесь и создайте приложение
Войдите в TikTok for Developers и создайте приложение. TikTok рекомендует регистрировать его от имени организации; личный аккаунт разработчика для реальных интеграций не рекомендуется.
Заполните данные приложения
Иконка (1024×1024 px, JPEG/JPG/PNG, до 5 МБ), название, категория, описание (показывается на странице авторизации), Terms of Service URL и Privacy Policy URL. У приложений, созданных после 9 сентября 2024 года, эти URL проверяются. Для платформы Web нужен URL официального сайта.
Добавьте Login Kit и redirect URI
Products → Add products → Login Kit. Правила redirect URI: абсолютный адрес на
https, статический, без query-параметров и#; не больше 10 штук, каждый короче 512 символов;redirect_uriв запросе должен в точности совпадать с зарегистрированным.Добавьте Content Posting API и включите Direct Post
Добавьте продукт Content Posting API и включите в его настройках конфигурацию Direct Post. Для прямой публикации приложение должно получить одобрение scope
video.publish, а пользователь — выдать его.Добавьте scope
В разделе Scopes добавьте только те scope, которые интеграция действительно использует (таблица ниже). В разделе Credentials скопируйте Client key и Client secret.
Подтвердите владение URL для PULL_FROM_URL
В виджете URL properties добавьте и подтвердите Domain (например,
cdn.example.com— все пути на нём) или URL prefix (https://+ хост + путь +/). URL медиа должен быть наhttps, без редиректов и доступен всё время загрузки (до часа после старта задачи). Иначе API вернётurl_ownership_unverified(403). При загрузке файла самостоятельно (FILE_UPLOAD) подтверждать домен не нужно.Настройте callback URL вебхуков
Укажите callback URL в настройках приложения (только HTTPS). Endpoint должен сразу отвечать 200: иначе TikTok считает доставку неуспешной и повторяет её до 72 часов с экспоненциальной задержкой. Доставка «хотя бы один раз» — отфильтровывайте дубли.
Протестируйте в sandbox
Sandbox — ограниченная среда, где интеграцию можно проверить без отправки на ревью. Пройдите в ней весь поток входа и публикации на тестовых аккаунтах — там же записывается демо-видео.
Отправьте на ревью с демо-видео
Подробно опишите, как в приложении используется каждый продукт и scope. Нужно хотя бы одно демо-видео (до 5, каждое до 50 МБ): полный сквозной поток, интерфейс и действия пользователя; для веб-приложения домен в видео должен совпадать с URL сайта. Сайт должен быть полностью готов, а ссылки на Terms of Service и Privacy Policy видны без открытия меню. Снятие ограничения приватности для Direct Post — отдельный аудит Content Posting API.
Как подключить приложение TikTok к Socialift
«Kalitlar» → «TikTok app»
В кабинете откройте «Kalitlar» (ключи) и карточку «TikTok app». Redirect URI из блока «Konsolga ko'chiring» (скопируйте в консоль) перенесите в настройки Login Kit символ в символ — даже
/в конце имеет значение.Введите Client key и Client secret
Поле «Scope'lar» необязательно: если пусто, запрашиваются
user.info.basic,user.info.profile,user.info.stats,video.list,video.upload,video.publish. «Saqlash va tekshirish» (сохранить и проверить) — Socialift запрашивает client access token у token endpoint TikTok и так проверяет ключ.Скопируйте Webhook URL
После сохранения в карточке появится Webhook URL — вставьте его в поле callback URL в TikTok. События проверяются по подписи вашим Client secret. В карточке также виден «Webhook verify token», но в TikTok такого поля нет — его можно игнорировать.
Подключите аккаунт
В «Ulanishlar» (подключения) нажмите «Ulash» (подключить) на карточке TikTok. Access token живёт 24 часа — «Token'ni yangilash» (обновить токен) обновляет его по refresh token. Методы публикации проверяйте в Playground с
SELF_ONLY.
Какие scope нужны и для чего
| Scope | Что даёт | В SDK |
|---|---|---|
user.info.basic | Профиль: open id, аватар, отображаемое имя | tt.me |
user.info.profile | profile_web_link, profile_deep_link, bio_description, is_verified | tt.me |
user.info.stats | Количество лайков, подписчиков, подписок и видео | tt.me |
video.list | Чтение публичных видео пользователя | tt.videos, tt.video, tt.iter_videos |
video.upload | Отправка контента автору как черновика (он редактирует и публикует в TikTok) | tt.upload_video |
video.publish | Прямая публикация контента в профиль | tt.creator_info, tt.publish_video, tt.publish_photos |
Перед публикацией обязателен вызов creator_info: privacy_level должен быть одним из возвращённых privacy_level_options, иначе privacy_level_option_mismatch.
Ключи TikTok в Python SDK
TikTok.from_env() читает TIKTOK_CLIENT_KEY и TIKTOK_CLIENT_SECRET.
import asyncio
import secrets
from socialift import TikTok
REDIRECT_URI = "https://example.com/auth/tiktok/callback" # символ в символ как в Login Kit
async def main() -> None:
# TIKTOK_CLIENT_KEY, TIKTOK_CLIENT_SECRET, SOCIALIFT_LICENSE_KEY
async with TikTok.from_env() as tt:
print(tt.login_url(redirect_uri=REDIRECT_URI, state=secrets.token_urlsafe(32)))
bundle = await tt.exchange_code(input("code: "), redirect_uri=REDIRECT_URI)
info = await tt.creator_info(bundle.access_token) # обязательно перед публикацией
print(info["privacy_level_options"])
result = await tt.publish_video(bundle.access_token, video_url="https://cdn.example.com/reel.mp4",
title="Hello TikTok!", privacy_level="SELF_ONLY", wait=True)
print(result)
asyncio.run(main())Явно: TikTok(client_key="...", client_secret="..."). video_url должен быть с подтверждённого домена; чтобы загрузить файл самому, передайте байты или путь в video=.
Подпись вебхука в SDK проверяет socialift.webhooks.verify_tiktok_request(client_secret, body, headers) — body должен быть сырыми байтами запроса.
Частые ошибки
- Redirect URI отличается от указанного в Login Kit:
http,/в конце или query-параметр. - Попытка опубликовать публичный пост без аудита — контент ограничен приватным режимом, а для публичного аккаунта вернётся
unaudited_client_can_only_post_to_private_accounts. - Не вызван
creator_info, илиprivacy_levelне входит в возвращённый список. PULL_FROM_URLс неподтверждённого домена или URL с редиректом —url_ownership_unverified.- После обновления сохранён старый refresh token — следующая попытка будет отклонена.
- В token endpoint отправлен JSON — нужен
application/x-www-form-urlencoded. - Домен в демо-видео не совпадает с URL сайта или один из продуктов не показан.
- Endpoint вебхука выполняет тяжёлую работу и поздно отвечает 200 — TikTok повторяет доставку, появляются дубли.
Частые вопросы
Где взять client key и client secret TikTok?
В TikTok for Developers, в разделе Credentials на странице приложения. Client key — аналог App ID у Meta, но называется иначе. В кабинете Socialift их вписывают в поля «Client key» и «Client secret» карточки «TikTok app».
Почему видео, отправленное в TikTok через API, приватное?
Весь контент от API-клиентов без аудита ограничен приватным режимом. Чтобы снять ограничение, нужно пройти аудит Content Posting API. Поэтому в Socialift SDK значение privacy_level по умолчанию — SELF_ONLY.
Обязательно ли подтверждать домен для PULL_FROM_URL?
Да. Для загрузки по ссылке нужно добавить в приложение Domain или URL prefix и подтвердить владение, иначе вернётся url_ownership_unverified. Если загружать файл частями самостоятельно (FILE_UPLOAD), такого требования нет.
Сколько живёт access token TikTok?
Access token — 24 часа, refresh token — 365 дней. Refresh token в ответе на обновление может отличаться от прежнего — всегда сохраняйте новый. В кабинете Socialift есть кнопка «Token'ni yangilash» (обновить токен), в SDK — tt.refresh_token(...).
Что показать в демо-видео для ревью TikTok?
Полный поток на сайте или в приложении, где будет интеграция: вход, выдачу разрешений и работу каждого выбранного продукта с интерфейсом. Если приложение ещё не одобрено, видео записывают в sandbox; для веб-приложения домен в видео должен совпадать с URL сайта.