Tutoriel API Instagram : publier avec la Graph API

Tutoriel API Instagram : publier avec la Graph API

Comment publier sur Instagram via l’API : le flux de conteneur en deux étapes, les exigences de compte, la limite de 100 publications par jour, et ce qui coûte réellement du temps.

Publier sur Instagram via l’API se fait en deux appels : créer un conteneur média avec POST /<IG_ID>/media, puis le publier avec POST /<IG_ID>/media_publish. La difficulté ne vient pas des appels eux-mêmes. Elle vient des exigences de compte, de la revue d’application de Meta, et du fait qu’une réponse 200 à l’étape du conteneur ne signifie pas que quoi que ce soit est déjà en ligne.

Ce guide s’adresse à un développeur qui hésite à construire cela en interne.

Que peut réellement publier l’API Instagram ?

La documentation de publication de contenu de Meta liste quatre valeurs media_type pour les conteneurs : VIDEO, REELS, STORIES et CAROUSEL. Une simple image unique est la valeur par défaut lorsque vous passez image_url sans media_type.

FormatPris en chargeRemarques de la documentation
Image uniqueOuiJPEG, transmise via une image_url publique
Vidéo / ReelsOuimedia_type=REELS avec video_url
StoriesOuimedia_type=STORIES
CarrouselOuiJusqu’à 10 images, vidéos ou un mélange

Deux choses surprennent. D’abord, les stories sont publiables, mais quand vous relisez une story publiée, media_type renvoie IMAGE ou VIDEO, donc vous devez demander media_product_type pour savoir ce que c’est réellement. Ensuite, les images d’un carrousel sont toutes recadrées pour correspondre à la première image, par défaut en 1:1, donc vos choix de recadrage sont faits à votre place.

L’écart le plus important n’est pas un format. C’est le compte. La publication exige un compte Instagram professionnel (Entreprise ou Créateur) connecté à une page Facebook, avec les autorisations instagram_basic, instagram_content_publish et pages_read_engagement accordées. Un compte Instagram personnel ne peut absolument pas être publié via l’API, quel que soit votre code. Si vos utilisateurs sont des créateurs sur des comptes personnels, l’intégration est morte avant même d’écrire une ligne.

Remarque : les chiffres ci-dessus ont été vérifiés à partir de la documentation de publication de contenu de la plateforme Instagram de Meta en date de septembre 2026. Les plateformes modifient ces éléments sans préavis.

Comment fonctionne l’authentification, et combien de temps prend la revue d’application ?

Vous obtenez un jeton d’accès utilisateur via Facebook Login, puis échangez côté serveur le jeton de courte durée contre un jeton de longue durée via GET oauth/access_token avec grant_type=fb_exchange_token. Meta documente le jeton utilisateur de longue durée comme valable environ 60 jours. Le renouvellement automatique décrit par Meta s’applique aux jetons gérés par le SDK, donc si vous échangez les jetons vous-même, vous avez besoin de votre propre mécanisme de renouvellement ou de réauthentification avant le 60e jour.

La revue d’application est obligatoire pour les autorisations de publication avant que quiconque en dehors des rôles de votre propre application puisse utiliser l’intégration. Meta ne publie pas de délai de revue garanti dans cette documentation pour développeurs, donc considérez la durée comme inconnue et prévoyez au moins un cycle de rejet. Des captures vidéo font partie de la soumission, ce qui signifie que vous avez besoin d’une démo fonctionnelle avant d’obtenir l’approbation, sur une application qui ne peut pas encore servir de vrais utilisateurs.

Quelle est la séquence d’appels de publication ?

  1. Hébergez votre média quelque part d’accessible publiquement. Meta le récupère par URL, donc une URL signée qui expire en 60 secondes échouera.
  2. POST /<IG_ID>/media avec image_url ou video_url, caption, et media_type si ce n’est pas une simple image. Vous récupérez un identifiant de conteneur.
  3. Interrogez GET /<IG_CONTAINER_ID>?fields=status_code jusqu’à ce qu’il affiche FINISHED. Meta recommande d’interroger une fois par minute, pendant cinq minutes maximum.
  4. POST /<IG_ID>/media_publish avec creation_id défini sur l’identifiant du conteneur.
  5. Enregistrez l’identifiant de média renvoyé. C’est lui, et non l’identifiant du conteneur, qui correspond à la publication publiée.
# 1. create the container
curl -X POST "https://graph.facebook.com/v23.0/$IG_ID/media" \
  -d "image_url=https://example.com/photo.jpg" \
  -d "caption=Ship it." \
  -d "access_token=$TOKEN"
# -> {"id":"17889455560051444"}

# 2. poll until FINISHED
curl "https://graph.facebook.com/v23.0/17889455560051444?fields=status_code&access_token=$TOKEN"

# 3. publish
curl -X POST "https://graph.facebook.com/v23.0/$IG_ID/media_publish" \
  -d "creation_id=17889455560051444" -d "access_token=$TOKEN"

Le status_code du conteneur peut être IN_PROGRESS, FINISHED, ERROR, EXPIRED ou PUBLISHED. EXPIRED signifie que le conteneur n’a pas été publié dans les 24 heures. Pour un carrousel, vous créez un conteneur par élément avec is_carousel_item=true, puis un conteneur parent avec media_type=CAROUSEL et une liste children séparée par des virgules.

Quelles sont les limites de débit ?

La limite de publication documentée est directe : les comptes Instagram sont limités à 100 publications via l’API sur une période glissante de 24 heures, et un carrousel compte comme une seule publication. Vous pouvez lire l’usage actuel via GET /<IG_ID>/content_publishing_limit plutôt que de deviner, ce que vous devriez faire avant un envoi en masse.

C’est une fenêtre glissante, pas une journée civile. Si vous consommez 100 publications à 15 h, vous n’obtenez pas un nouveau quota à minuit. Toute file d’attente que vous construisez doit modéliser cette fenêtre, pas un compteur quotidien.

Remarque : les chiffres ci-dessus ont été vérifiés à partir de la documentation de publication de contenu de la plateforme Instagram de Meta en date de septembre 2026. Les plateformes modifient ces éléments sans préavis.

Qu’est-ce qui vous coûtera réellement trois semaines ?

Pas les deux appels d’API. Ces quatre choses :

La revue d’application. Vous ne pouvez pas mettre en production tant que Meta n’a pas approuvé instagram_content_publish, et vous ne pouvez pas faire une démo propre tant que vous n’avez pas construit la chose. Prévoyez une nouvelle soumission.

Le renouvellement des jetons. Des jetons de longue durée de soixante jours impliquent une tâche en arrière-plan, un état d’échec dans votre interface pour « ce compte doit être reconnecté », et un e-mail à l’utilisateur avant l’expiration du jeton plutôt qu’après. Sautez cette étape et chaque intégration cessera silencieusement de fonctionner deux mois après le lancement.

L’hébergement des médias et les contraintes de format. Meta récupère les médias depuis votre URL. Cela implique un hébergement public, des types de contenu corrects, et un transcodage vers ce qu’Instagram accepte. Les images uniques doivent être en JPEG. La vidéo doit survivre à sa propre étape de traitement chez Instagram, qui se produit après le retour de votre appel.

La gestion des échecs asynchrones. Un 200 sur l’appel de conteneur signifie que Meta a accepté une tâche. La publication peut encore échouer pendant le traitement, et vous ne le découvrez qu’en interrogeant status_code et en voyant ERROR. Si votre modèle de données ne connaît que « publié » et « échec », vous signalerez un succès pour des publications qui ne sont jamais apparues. Modélisez un état en cours de traitement et une vraie vérification finale, comme expliqué dans notre guide de l’API de programmation pour les réseaux sociaux.

Puis multipliez. Les reels et les stories ont leurs propres particularités, et si vous voulez aussi TikTok ou LinkedIn, vous recommencez avec un modèle d’authentification différent, un flux d’envoi différent et un processus de revue différent.

En bref

  • Deux appels : créer le conteneur, puis media_publish. Interroger status_code entre les deux.
  • Nécessite un compte Instagram professionnel lié à une page Facebook.
  • 100 publications via l’API par période glissante de 24 heures ; vérifiez content_publishing_limit.
  • Les jetons de longue durée durent environ 60 jours. Prévoyez le renouvellement avant le lancement.
  • La revue d’application est obligatoire et sa durée n’est pas publiée dans la documentation.

Si vous rédigez des légendes pendant que vous construisez, le compteur de caractères Instagram gratuit vous montre où intervient la troncature.

Faire cela une fois plutôt qu’une fois par plateforme

L’alternative à écrire cela pour chaque réseau est une seule API qui gère déjà les jetons, les conteneurs, l’interrogation et les nouvelles tentatives. BulkPublish publie sur 15 plateformes via une seule API REST et un seul SDK, donc une publication Instagram et une publication LinkedIn sont le même appel avec un identifiant de canal différent. Le renouvellement des jetons, la limite à fenêtre glissante et la vérification d’état asynchrone sont gérés de notre côté, et une publication qui échoue sur une plateforme est signalée comme partial plutôt que comme un faux succès. La référence se trouve sur /fr/developers/ et la page d’intégration REST sur /fr/integrations/rest-api/.

À lire aussi