Créer un post via l'API
Publiez ou planifiez une publication sur plusieurs plateformes en un seul appel API, avec contenu et médias par plateforme.
https://post.adaptlypost.com/post/api/v1/social-postsCréez une nouvelle publication sur les réseaux sociaux. Les publications peuvent être publiées immédiatement, programmées pour plus tard ou enregistrées comme brouillons.
posts.draft suffit quand saveAsDraft vaut true. Un scheduledAt futur exige posts.schedule. Sans scheduledAt, ou avec une heure déjà passée, la publication part immédiatement et exige posts.publish. Une clé Contributeur ne peut donc qu'enregistrer des brouillons.
Paramètres du corps
| Paramètre | Taper | Description |
|---|---|---|
platformsREQUIS | PlatformType[] | Plateformes cibles (ex. TWITTER, LINKEDIN, INSTAGRAM). Chacune a aussi besoin de ses IDs de connexion |
contentTypeREQUIS | ContentType | TEXT, IMAGE, VIDEO, CAROUSEL ou DOCUMENT. DOCUMENT est réservé à LinkedIn : exactement un fichier PDF, PPT, PPTX, DOC ou DOCX dans mediaUrls, affiché comme un document à faire défiler |
text | string | Contenu texte de la publication. Sur LinkedIn, mentionnez une page entreprise avec @[Nom de la page](urn:li:organization:<id>), en écrivant le nom exactement comme LinkedIn l'affiche. LinkedIn n'autorise que les mentions de pages entreprise, pas de personnes |
platformTexts | PlatformText[] | Textes personnalisés par plateforme |
mediaUrls | string[] | URL des fichiers médias envoyés |
mediaAltTexts | string[] | Texte alternatif de chaque image, dans le même ordre que mediaUrls. 1000 caractères maximum par entrée ; une chaîne vide ignore une image. Envoyé à X, Bluesky, Mastodon, LinkedIn, Facebook, Instagram et Threads. Pinterest utilise le premier, tronqué à 500 caractères. TikTok, YouTube, la fiche d'établissement Google et les vidéos l'ignorent. |
thumbnailUrl | string | URL de la miniature pour les publications vidéo |
thumbnailTimestampMs | number | Image de la vidéo à utiliser comme miniature, en millisecondes depuis le début |
platformThumbnails | PlatformThumbnail[] | Une miniature différente pour une plateforme d'une publication vidéo, sous la forme { platform, thumbnailUrl?, thumbnailTimestampMs? }. YOUTUBE, FACEBOOK, LINKEDIN et TELEGRAM acceptent une image, INSTAGRAM et PINTEREST une image ou une image de la vidéo, TIKTOK seulement une image de la vidéo. Les plateformes sans entrée utilisent thumbnailUrl et thumbnailTimestampMs |
platformAspectRatios | PlatformAspectRatio[] | Recadre chaque image d'une publication IMAGE ou CAROUSEL dans un format sur une plateforme, sous la forme { platform, aspectRatio, fit? }. Une entrée par plateforme. aspectRatio vaut SQUARE (1:1), PORTRAIT (4:5), VERTICAL (9:16) ou LANDSCAPE (1.91:1) : INSTAGRAM accepte SQUARE, PORTRAIT ou LANDSCAPE, TIKTOK les quatre. fit vaut CROP (par défaut, coupé depuis le centre) ou PAD (l'image entière est gardée et le reste est rempli d'une copie floutée). Les autres plateformes, les publications vidéo, les stories Instagram et une deuxième entrée pour une même plateforme renvoient une erreur 400. Les plateformes sans entrée gardent les images telles que vous les avez envoyées |
firstComments | PlatformFirstComment[] | Un commentaire publié sous la publication depuis le même compte, sous la forme { platform, text }. Une entrée par plateforme. LINKEDIN accepte jusqu'à 1250 caractères, TWITTER 280, THREADS 500, BLUESKY 300, MASTODON 500, YOUTUBE 10000 (pas sur les vidéos privées ou conçues pour les enfants), FACEBOOK 8000 et INSTAGRAM 2200 (pas sur les stories). Les autres plateformes renvoient une erreur 400. Une page Facebook ou un compte Instagram connecté avant l'arrivée des premiers commentaires doit être reconnecté une fois ; d'ici là, son commentaire échoue avec firstCommentError |
threadReplies | PlatformThreadReplies[] | Transforme la publication en fil, sous la forme { platform, texts } : la publication l'ouvre et chaque texte part en réponse au précédent, depuis le même compte. Une entrée par plateforme, jusqu'à 25 textes. TWITTER accepte 280 caractères par réponse (plus avec X Premium), THREADS 500, BLUESKY 300 et MASTODON 500 (ou la limite de l'instance). Les autres plateformes, une réponse vide ou trop longue et une plateforme qui a aussi un premier commentaire renvoient une 400 |
scheduledAt | string | Date au format ISO 8601 pour la programmation. Omettez pour publier immédiatement. |
timezoneREQUIS | string | Fuseau horaire IANA (ex. America/New_York) |
saveAsDraft | boolean | Enregistrer comme brouillon au lieu de publier |
recurrence | Recurrence | Répète la publication selon un calendrier. Exige un scheduledAt futur. Voir Publications récurrentes plus bas |
twitterConnectionIds | string[] | Identifiants de connexion des comptes Twitter |
twitterKeepLinks | boolean | Garde les liens du texte X cliquables. Par défaut, chaque lien du texte X est coupé (example.com devient example. com), car X facture plus de 10 fois plus cher un post avec un lien. Seuls les comptes AppSumo à vie peuvent l'activer : un lien gardé coûte 20 crédits au lieu de 2, y compris pour un premier commentaire sur X, et sans assez de crédits le post X échoue. true renvoie une 400 sur toute autre offre. Ignoré quand le texte X ne contient aucun lien |
linkedinConnectionIds | string[] | Identifiants de connexion des comptes LinkedIn |
instagramConnectionIds | string[] | Identifiants de connexion des comptes Instagram |
tiktokConnectionIds | string[] | Identifiants de connexion des comptes TikTok |
youtubeConnectionIds | string[] | Identifiants de connexion des chaînes YouTube |
pinterestConnectionIds | string[] | IDs de connexion du compte Pinterest |
blueskyConnectionIds | string[] | IDs de connexion du compte Bluesky |
mastodonConnectionIds | string[] | IDs de connexion du compte Mastodon |
googleBusinessConnectionIds | string[] | IDs de connexion des établissements de la fiche Google |
googleBusinessConfigs | GoogleBusinessConfig[] | Paramètres de post de la fiche d'établissement Google par établissement : type de post (nouveauté, événement ou offre), bouton, dates de l'événement et détails de l'offre. Consultez Configurations des plateformes pour le schéma |
tumblrConnectionIds | string[] | ID de connexion des blogs Tumblr |
telegramConnectionIds | string[] | ID de connexion des canaux et groupes Telegram |
tumblrConfigs | TumblrConfig[] | Paramètres Tumblr par blog : tags, titre et lien source. Voir Configurations des plateformes pour le schéma |
threadsConnectionIds | string[] | IDs de connexion du compte Threads |
pageIds | string[] | Pages Facebook sur lesquelles publier. Accepte soit l'id du compte, soit le pageId de /social-accounts |
pinterestConfigs | PinterestConfig[] | Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes |
tiktokConfigs | TikTokConfig[] | Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes |
instagramConfigs | InstagramConfig[] | Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes |
facebookConfigs | FacebookConfig[] | Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes |
youtubeConfigs | YouTubeConfig[] | Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes |
linkedinConfigs | LinkedInConfig[] | Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes |
Texte spécifique par plateforme
Utilisez platformTexts pour personnaliser le contenu par plateforme tout en partageant la même publication.
Un compte par plateforme
Un seul compte par plateforme est autorisé par publication. Par exemple, vous ne pouvez pas inclure deux identifiants de connexion Twitter dans la même requête. Cette restriction est appliquée pour respecter les conditions d'utilisation des plateformes. Une violation renverra une erreur 400.Publications récurrentes
Ajoutez un objet recurrence pour répéter la publication. La publication à scheduledAt est la première de la série et fixe l'heure de la journée, dans la timezone envoyée. Seule la prochaine publication de la série existe. AdaptlyPost la crée environ 24 heures avant sa diffusion.
Objet récurrence
| Paramètre | Taper | Description |
|---|---|---|
frequencyREQUIS | RecurrenceFrequency | DAILY, WEEKLY, MONTHLY ou YEARLY. YEARLY publie chaque année à la même date ; une série commencée un 29 février publie le 28 février les autres années |
interval | number | Répéter tous les N jours, semaines, mois ou années (1-30, par défaut : 1) |
weekdays | Weekday[] | WEEKLY uniquement. Les jours de publication, de MONDAY à SUNDAY. Le jour de la semaine de scheduledAt est toujours inclus |
endsOn | string | Dernier jour où une publication peut partir, au format YYYY-MM-DD. Doit tomber le jour de la première publication ou après. Incompatible avec maxOccurrences |
maxOccurrences | number | Nombre total de publications de la série (2-365). Incompatible avec endsOn. Sans l'un ni l'autre, la série se répète jusqu'à ce que vous la mettiez en pause ou la supprimiez |
Règles des publications récurrentes
Une publication récurrente ne peut pas utiliser saveAsDraft: true ni inclure un compte TikTok. Chacun de ces cas renvoie 400. Les dates manquées pendant une pause sont ignorées, jamais publiées en retard. X et LinkedIn refusent un texte identique à une publication précédente. Ajoutez donc du spintax comme {Hi|Hello} pour que chaque publication soit différente.Quand une publication est refusée
Une publication refusée pour son contenu répond 400 avec code post_validation_failed et issues, qui liste tous les problèmes trouvés en une fois, sous la même forme que les issues de Vérifier une publication. message est le texte du problème quand il y en a un, et une liste de textes quand il y en a plusieurs.
{
"statusCode": 400,
"error": "Bad Request",
"code": "post_validation_failed",
"message": [
"Text exceeds maximum length for Twitter/X. Maximum is 280 characters",
"Video duration (185s) exceeds your TikTok account limit of 180 seconds"
],
"issues": [
{
"code": "TEXT_TOO_LONG",
"severity": "ERROR",
"message": "Text exceeds maximum length for Twitter/X. Maximum is 280 characters",
"platform": "TWITTER",
"connectionId": "conn_abc123"
},
{
"code": "TIKTOK_VIDEO_TOO_LONG",
"severity": "ERROR",
"message": "Video duration (185s) exceeds your TikTok account limit of 180 seconds",
"platform": "TIKTOK",
"connectionId": "conn_tt789"
}
]
}curl --request POST \
--url https://post.adaptlypost.com/post/api/v1/social-posts \
--header 'Authorization: Bearer <api-key>' \
--header 'Content-Type: application/json' \
--data '{
"platforms": ["TWITTER", "LINKEDIN"],
"contentType": "TEXT",
"text": "Exciting product update!",
"timezone": "America/New_York",
"twitterConnectionIds": ["conn_abc123"],
"linkedinConnectionIds": ["conn_def456"]
}'curl --request POST \
--url https://post.adaptlypost.com/post/api/v1/social-posts \
--header 'Authorization: Bearer <api-key>' \
--header 'Content-Type: application/json' \
--data '{
"platforms": ["LINKEDIN"],
"contentType": "TEXT",
"text": "{Hi|Hello} everyone, the weekly product tip is live!",
"scheduledAt": "2026-10-05T13:00:00Z",
"timezone": "America/New_York",
"linkedinConnectionIds": ["conn_def456"],
"recurrence": {
"frequency": "WEEKLY",
"weekdays": ["MONDAY", "THURSDAY"],
"maxOccurrences": 12
}
}'{
"postId": "post_xyz789",
"queuedPlatforms": ["TWITTER", "LINKEDIN"],
"skippedPlatforms": [],
"isScheduled": false,
"scheduledAt": null
}