REST APIPOST

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.

POSThttps://post.adaptlypost.com/post/api/v1/social-posts

Cré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.

Clé API (jeton Bearer)
Permission:posts.draftRôles et permissions

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ètreTaperDescription
platformsREQUISPlatformType[]Plateformes cibles (ex. TWITTER, LINKEDIN, INSTAGRAM). Chacune a aussi besoin de ses IDs de connexion
contentTypeREQUISContentTypeTEXT, 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
textstringContenu 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
platformTextsPlatformText[]Textes personnalisés par plateforme
mediaUrlsstring[]URL des fichiers médias envoyés
mediaAltTextsstring[]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.
thumbnailUrlstringURL de la miniature pour les publications vidéo
thumbnailTimestampMsnumberImage de la vidéo à utiliser comme miniature, en millisecondes depuis le début
platformThumbnailsPlatformThumbnail[]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
platformAspectRatiosPlatformAspectRatio[]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
firstCommentsPlatformFirstComment[]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
threadRepliesPlatformThreadReplies[]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
scheduledAtstringDate au format ISO 8601 pour la programmation. Omettez pour publier immédiatement.
timezoneREQUISstringFuseau horaire IANA (ex. America/New_York)
saveAsDraftbooleanEnregistrer comme brouillon au lieu de publier
recurrenceRecurrenceRépète la publication selon un calendrier. Exige un scheduledAt futur. Voir Publications récurrentes plus bas
twitterConnectionIdsstring[]Identifiants de connexion des comptes Twitter
twitterKeepLinksbooleanGarde 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
linkedinConnectionIdsstring[]Identifiants de connexion des comptes LinkedIn
instagramConnectionIdsstring[]Identifiants de connexion des comptes Instagram
tiktokConnectionIdsstring[]Identifiants de connexion des comptes TikTok
youtubeConnectionIdsstring[]Identifiants de connexion des chaînes YouTube
pinterestConnectionIdsstring[]IDs de connexion du compte Pinterest
blueskyConnectionIdsstring[]IDs de connexion du compte Bluesky
mastodonConnectionIdsstring[]IDs de connexion du compte Mastodon
googleBusinessConnectionIdsstring[]IDs de connexion des établissements de la fiche Google
googleBusinessConfigsGoogleBusinessConfig[]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
tumblrConnectionIdsstring[]ID de connexion des blogs Tumblr
telegramConnectionIdsstring[]ID de connexion des canaux et groupes Telegram
tumblrConfigsTumblrConfig[]Paramètres Tumblr par blog : tags, titre et lien source. Voir Configurations des plateformes pour le schéma
threadsConnectionIdsstring[]IDs de connexion du compte Threads
pageIdsstring[]Pages Facebook sur lesquelles publier. Accepte soit l'id du compte, soit le pageId de /social-accounts
pinterestConfigsPinterestConfig[]Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes
tiktokConfigsTikTokConfig[]Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes
instagramConfigsInstagramConfig[]Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes
facebookConfigsFacebookConfig[]Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes
youtubeConfigsYouTubeConfig[]Paramètres de cette plateforme, un objet par compte, chacun avec le connectionId auquel il s'applique (pageId pour Facebook). Consultez Configurations des plateformes
linkedinConfigsLinkedInConfig[]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.

Lorsqu'une plateforme n'a pas d'entrée dans platformTexts, le champ text par défaut est utilisé.

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ètreTaperDescription
frequencyREQUISRecurrenceFrequencyDAILY, 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
intervalnumberRépéter tous les N jours, semaines, mois ou années (1-30, par défaut : 1)
weekdaysWeekday[]WEEKLY uniquement. Les jours de publication, de MONDAY à SUNDAY. Le jour de la semaine de scheduledAt est toujours inclus
endsOnstringDernier 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
maxOccurrencesnumberNombre 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
La réponse ajoute recurringPostId, et postId est la première publication de la série. Passez recurringPostId aux endpoints des publications récurrentes pour mettre en pause, reprendre ou supprimer la série.

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"
    }
  ]
}
Pour voir ces problèmes sans rien créer, envoyez d'abord le même corps à Vérifier une publication (POST /api/v1/social-posts/validate).
Créer une publication sociale
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"]
  }'
Créer une publication récurrente
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
    }
  }'
201
{
  "postId": "post_xyz789",
  "queuedPlatforms": ["TWITTER", "LINKEDIN"],
  "skippedPlatforms": [],
  "isScheduled": false,
  "scheduledAt": null
}