Documentation de l'API

Programme tes publications TikTok depuis tes propres scripts, avec les mêmes options que le tableau de bord : vidéos, carrousels photo, musique automatique, date et heure.

Démarrage rapide

1. Crée ton compte et ton abonnement, puis connecte au moins un compte TikTok dans le tableau de bord (onglet Connexion). 2. Génère ta clé dans Mon compte → Clé API (une seule clé par compte). 3. Envoie-la dans l'en-tête Authorization à chaque appel :

curl -H "Authorization: Bearer sch_VOTRE_CLE" https://schanalyse.fr/api/v1/me

URL de base : https://schanalyse.fr/api/v1. Toutes les réponses sont en JSON. La clé ne doit jamais figurer dans l'URL ni dans du code côté navigateur ; en cas de fuite, régénère-la (l'ancienne cesse de fonctionner immédiatement).

L'API ne couvre que la programmation (comptes, publications). Les statistiques et la facturation restent dans le tableau de bord.

Limites de requêtes et quotas

Nous préférons être transparents : voici exactement ce qui s'applique. Les limites sont comptées par compte utilisateur, quel que soit le nombre de scripts ou de clés.

ForfaitRequêtes / minuteRequêtes / jour (24 h glissantes)
Débutant (jusqu'à 5 comptes)202 000
Intermédiaire (jusqu'à 10 comptes)202 000
Avancé (jusqu'à 25 comptes)6010 000
Expert (jusqu'à 50 comptes)6010 000
Pro (jusqu'à 100 comptes)12030 000

Chaque forfait applique aussi, par compte TikTok : 15 publications par jour, 100 publications en attente et 1 Go de fichiers en attente (mutualisés entre tes comptes).

Certains comptes partenaires (accès offert) ont des limites supérieures. GET /me renvoie toujours les limites réelles de ton compte.

Chaque réponse contient X-RateLimit-Limit (par minute) et X-RateLimit-Remaining. Au-delà d'une limite, l'API répond 429 avec l'en-tête Retry-After (secondes à attendre). Les requêtes refusées en 429 ne comptent pas dans ton quota. Les appels sont journalisés (date, route, statut, jamais le contenu) pendant 30 jours, pour la sécurité et la détection d'abus.

Routes

GET /me

Ton profil : email, grade, fuseau horaire, limites de requêtes et quotas de l'abonnement.

{"email": "toi@exemple.com", "role": "customer", "timezone": "Europe/Paris",
 "rate_limit": {"per_minute": 20, "per_day": 2000},
 "plan": {"max_accounts": 5, "posts_per_account_per_day": 5, "storage_gb_total": 25.0}}

GET /accounts/{account_id}/creator-info

Interroge TikTok en direct : pseudo, privacy_level_options réellement disponibles pour ce compte, commentaires/duo/stitch désactivés par le compte, durée maximale d'une vidéo (max_video_post_duration_sec), et can_post (avec reason si TikTok refuse, par exemple quota de publications atteint).

{"can_post": true, "nickname": "Mon compte", "username": "mon_compte",
 "privacy_level_options": ["PUBLIC_TO_EVERYONE", "MUTUAL_FOLLOW_FRIENDS", "SELF_ONLY"],
 "comment_disabled": false, "duet_disabled": false, "stitch_disabled": false,
 "max_video_post_duration_sec": 3600}

GET /accounts

Tes comptes TikTok connectés : account_id (à utiliser pour programmer), username, display_name, ainsi que niche, language et favorite_hashtags (les hashtags favoris réglés dans le tableau de bord, 5 maximum).

[{"account_id": "-000abc…", "username": "mon_compte", "display_name": "Mon compte",
  "niche": "cuisine", "language": "fr", "favorite_hashtags": ["#fyp", "#recette"]}]

GET /posts

Liste tes publications, de la plus récente à la plus ancienne. Paramètres optionnels : account_id, status.

StatutSignification
pendingProgrammé, pas encore parti (modifiable et annulable)
publishing / processingEn cours d'envoi / de traitement par TikTok
publishedPublié
failedÉchec
[{"id": 181, "account_id": "-000abc…", "caption": "Ma description", "scheduled_time": "2026-10-01 18:30",
  "status": "pending", "media_type": "video", "privacy_level": "SELF_ONLY",
  "allow_comment": false, "allow_duet": false, "allow_stitch": false,
  "brand_organic": false, "brand_content": false, "is_aigc": false,
  "archived": false, "publish_id": null, "created_at": "2026-09-26T18:02:11+00:00"}]

La liste n'est pas paginée : filtre par account_id et status pour limiter la réponse. scheduled_time est dans ton fuseau horaire.

Les publications créées par l'API apparaissent aussi dans le calendrier du tableau de bord, comme celles créées à la main.

POST /posts (multipart/form-data)

Programme une vidéo ou un carrousel photo.

ChampRequisDescription
account_idouiCompte TikTok (voir GET /accounts). Doit être connecté.
media_typenonvideo (défaut) ou photo (carrousel).
scheduled_timeouiDate et heure de publication, format AAAA-MM-JJ HH:MM, dans le fuseau de ton compte (timezone dans GET /me, Europe/Paris par défaut). Entre maintenant et 365 jours ; une tolérance de 5 minutes dans le passé est acceptée (pour les gros envois), au-delà : erreur 400.
privacy_levelouiVisibilité, sans valeur par défaut (règle TikTok) : PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR ou SELF_ONLY. Les valeurs réellement permises dépendent du compte : voir GET /accounts/{id}/creator-info. Actuellement, l'application n'a pas encore été validée par TikTok : seules les publications SELF_ONLY (privées) sont acceptées (les autres valeurs renvoient une erreur 400).
allow_comment, allow_duet, allow_stitchnon1 pour autoriser (commentaires / duo / stitch). Tout est désactivé par défaut. Duo et stitch n'existent pas pour les carrousels. Un réglage interdit par le compte lui-même reste interdit.
brand_organic, brand_contentnonDivulgation de contenu commercial : brand_organic=1 pour promouvoir ta propre marque (« contenu promotionnel »), brand_content=1 pour promouvoir une autre marque (« partenariat rémunéré »). Un contenu de marque ne peut pas être SELF_ONLY. Tu t'engages à déclarer correctement le contenu commercial (conditions acceptées à la création de la clé).
is_aigcnonVidéos uniquement : 1 si le contenu est généré par IA (TikTok l'étiquette).
captionnonDescription, hashtags et mentions inclus. 2200 caractères maximum.
append_favorite_hashtagsnon1 pour ajouter à la fin de la description les hashtags favoris du compte (dans un ordre aléatoire, sans doublon avec ceux déjà présents, sans jamais dépasser 2200 caractères). Équivalent du bouton « Mes hashtags » du tableau de bord. La réponse renvoie la description finale dans caption.
filesi vidéoUn fichier vidéo : MP4, MOV ou WebM, 300 Mo maximum. Le format est vérifié sur le contenu du fichier, pas sur son nom.
filessi photoDe 1 à 35 images JPEG, PNG ou WebP, 20 Mo maximum chacune, envoyées en répétant le champ files. Chaque photo est convertie en JPEG optimisé (2160 px maximum sur le grand côté, métadonnées EXIF/GPS supprimées) ; une image illisible est refusée (400). L'ordre d'envoi est l'ordre du carrousel ; la première image sert de couverture.
auto_add_musicnonCarrousels uniquement : 1 pour que TikTok ajoute automatiquement une musique recommandée (modifiable ensuite dans l'app TikTok). Pour les vidéos, l'API TikTok n'offre aucune option musique : le son doit déjà être dans le fichier.

Réponse 201 : {"post_id": 123, "caption": "description finale", "message": "…"}.

# Vidéo
curl -X POST https://schanalyse.fr/api/v1/posts \
  -H "Authorization: Bearer $SCH_KEY" \
  -F account_id=ID_DU_COMPTE -F media_type=video \
  -F privacy_level=SELF_ONLY -F append_favorite_hashtags=1 \
  -F caption="Ma description #fyp" \
  -F scheduled_time="2026-10-01 18:30" \
  -F file=@video.mp4

# Carrousel (ordre = ordre des champs files)
curl -X POST https://schanalyse.fr/api/v1/posts \
  -H "Authorization: Bearer $SCH_KEY" \
  -F account_id=ID_DU_COMPTE -F media_type=photo -F auto_add_music=1 \
  -F privacy_level=SELF_ONLY -F allow_comment=1 \
  -F caption="Mon carrousel" -F scheduled_time="2026-10-01 18:30" \
  -F files=@1.jpg -F files=@2.jpg -F files=@3.jpg

Éviter les doublons. Ajoute l'en-tête Idempotency-Key: <valeur unique> (1 à 200 caractères : lettres, chiffres, - _ . :) à ton POST /posts. Si ton script réessaie la même requête (timeout, relance), l'API renvoie le résultat de la première requête avec l'en-tête Idempotent-Replayed: true au lieu de créer un second post. La clé est mémorisée 24 h ; une requête refusée (erreur 400) ne bloque pas la clé, tu peux corriger et réessayer. Une même clé ne doit servir qu'à une seule publication.

curl -X POST https://schanalyse.fr/api/v1/posts \
  -H "Authorization: Bearer $SCH_KEY" -H "Idempotency-Key: video-2026-10-01-compte42" \
  -F account_id=ID_DU_COMPTE -F privacy_level=SELF_ONLY -F scheduled_time="2026-10-01 18:30" -F file=@video.mp4

PATCH /posts/{id} (JSON)

Modifie caption et/ou scheduled_time d'un post encore pending. Mêmes règles de date que ci-dessus (strictement dans le futur).

curl -X PATCH https://schanalyse.fr/api/v1/posts/123 \
  -H "Authorization: Bearer $SCH_KEY" -H "Content-Type: application/json" \
  -d '{"caption": "Nouvelle description", "scheduled_time": "2026-10-02 12:00"}'

DELETE /posts/{id}

Annule un post encore pending (les fichiers sont supprimés). Un post déjà parti ne peut pas être annulé.

Exemple en Python

import requests

API = "https://schanalyse.fr/api/v1"
HEADERS = {"Authorization": "Bearer sch_VOTRE_CLE"}

account_id = requests.get(f"{API}/accounts", headers=HEADERS).json()[0]["account_id"]

with open("video.mp4", "rb") as f:
    r = requests.post(
        f"{API}/posts", headers=HEADERS,
        data={"account_id": account_id, "media_type": "video", "privacy_level": "SELF_ONLY",
              "caption": "Ma description #fyp", "scheduled_time": "2026-10-01 18:30"},
        files={"file": f},
    )
print(r.status_code, r.json())

Règles TikTok à connaître

  • Le contenu programmé est publié par TikTok via son API officielle : il peut prendre quelques minutes à être traité et visible sur le profil.
  • Tant que l'application n'a pas été validée (audit) par TikTok, toutes les publications sont forcées en privé.
  • En programmant du contenu, tu appliques la Music Usage Confirmation de TikTok ; pour un contenu de marque, la Branded Content Policy.

Erreurs

CodeSignification
413Fichier trop volumineux.
409Une requête avec la même Idempotency-Key est encore en cours de traitement.
400Requête invalide : privacy_level manquant, format de date, date hors plage, description trop longue, fichier non supporté, quota de publications ou de stockage atteint, compte déconnecté.
401Clé absente, invalide ou révoquée.
402Abonnement requis.
404Compte ou publication introuvable (ou qui n'est pas à toi).
429Limite de requêtes atteinte : attends Retry-After secondes.

Toutes les erreurs ont la forme {"error": "message"}.