Notre agent IA réseaux sociaux en production : file remplie 3 semaines à l'avance, texte réécrit par réseau, contrôles par script, validation humaine, envoi par l'API Zernio.
Couverture swanbase du tuto agent IA réseaux sociaux avec validation humaine, logos LinkedIn, X et Instagram

Un agent IA pour les réseaux sociaux prépare vos posts, réécrit chaque texte au format de chaque réseau, vérifie les limites et programme l'envoi. Vous gardez une seule tâche : lire et valider. Chez swanbase, notre agent IA réseaux sociaux tourne en production depuis le 3 octobre 2026 sur trois comptes (LinkedIn, Instagram, X). Il remplit une file trois semaines à l'avance, passe chaque légende dans des scripts de contrôle, puis attend votre « ok » avant d'appeler l'API de Zernio.

Au 12 octobre 2026, la file compte 90 posts créés, 81 validations enregistrées et 73 posts programmés, le dernier pour le 20 avril 2027. Ce tuto décrit le circuit en cinq étapes, avec nos seuils, nos commandes et trois pièges datés.

Notre file au 12 octobre 2026 : 90 posts créés, 81 validations, 73 programmés

Qu'est-ce qu'un agent IA pour gérer les réseaux sociaux ?

Un agent IA pour gérer les réseaux sociaux est un programme piloté par un modèle de langage, qui enchaîne plusieurs outils vers un objectif : produire des posts, les adapter, les contrôler puis les programmer. Il tient un état (la file), lit des sources (vos contenus déjà produits) et agit sur un service tiers (l'API de publication).

Agent IA ou outil de planification

Trois familles d'outils servent à automatiser la publication sur les réseaux sociaux. Avec Buffer ou Metricool, vous programmez un texte écrit par vous. Une automatisation n8n ou Zapier suit un scénario fixe. L'agent ajoute le jugement du modèle : il choisit la prochaine citation, raccourcit une légende trop longue pour X, relance la rédaction après un contrôle raté.

Le nôtre combine des scripts Python et des appels à Claude, lancés depuis Claude Code. Le modèle écrit. Les scripts vérifient et programment.

La répartition entre l'agent et vous

L'agent remplit le calendrier, réécrit par réseau, contrôle et appelle l'API. Vous décidez de publier. Une règle tient l'ensemble : seul un humain fait passer un post de « à valider » à « validé ». Le jour où notre agent a enfreint cette règle, nous avons tout annulé dans l'heure (voir l'étape 4).

Le circuit d'un post dans notre file

Chaque post vit dans un fichier JSON unique, la file : format, créneau, réseaux, légende, médias et historique.

Les cinq étapes de notre agent IA réseaux sociaux, de la file à l'API Zernio

Six statuts pour une seule porte humaine

Un post suit ce cycle :

to_review -> (revising -> to_review)* -> approved -> scheduled -> published
             skipped (créneau sauté)   rejected (refusé)   error

Trois statuts vous concernent. En to_review, vous devez lire le post. En approved, vous l'avez validé. En scheduled, Zernio le détient avec sa date. Nous laissons le reste aux scripts. Le statut revising sert quand vous demandez une modification : un agent Claude réécrit la légende et remet le post en to_review, avec votre demande dans l'historique.

Une semaine type avec un format par jour

Nous avons fixé notre semaine type le 28 septembre 2026 : un format par jour ouvré, à midi. Lundi un carrousel, mardi une citation, mercredi un outil (plus une vidéo à 18 h), jeudi l'agenda de la semaine suivante, vendredi une photo. Chaque format a ses réseaux par défaut : nos carrousels partent sur Instagram seul. Au 12 octobre, 59 posts de la file visent LinkedIn, Instagram et X à la fois.

Pour un SaaS, prenez d'autres formats (retour client, fonctionnalité, chiffre produit) et donnez à chacun une source qui produit des candidats sans vous.

Étape 1 : générer la file trois semaines à l'avance

Remplir les créneaux vides

Le réglage de notre file tient en quelques clés :

{
  "timezone": "Europe/Paris",
  "min_lead_hours": 3,
  "x_char_limit": 280,
  "spacing_minutes": 45,
  "formats": {
    "carousel": { "weekday": 0, "time": "12:00", "platforms": ["instagram"] },
    "quote":    { "weekday": 1, "time": "12:00", "platforms": ["linkedin", "instagram", "twitter"] },
    "tool":     { "weekday": 2, "time": "12:00", "platforms": ["linkedin", "twitter"] }
  }
}

À chaque passage, l'agent repère les créneaux vides des trois semaines à venir et pioche le prochain candidat dans la source du format. Une source épuisée produit un post « sauté » avec sa raison, par exemple « Banque de citations épuisée ». Vous voyez le trou trois semaines avant la date.

Faire sauter les créneaux passés

Deux règles de temps empêchent les publications surprises. L'agent ne planifie aucun créneau à moins de trois heures (min_lead_hours). Et un post dont le créneau passe sans validation bascule en « sauté » à la lecture suivante de la file, avec la raison « créneau passé sans validation ». Au 12 octobre, notre file compte 8 posts sautés. Sans validation, rien ne part.

Étape 2 : réécrire le texte pour chaque réseau

Vous écrivez une légende source avec le lien en clair. Au moment de programmer, un script produit le texte de chaque réseau et place le lien au seul endroit où il fonctionne.

Capture recréée : une légende source fictive réécrite pour LinkedIn, X et Instagram

LinkedIn : le lien en premier commentaire

Depuis le 2 octobre 2026, aucun lien n'entre dans le corps d'un post LinkedIn. La phrase qui porte le lien part en premier commentaire, et le post y renvoie. Côté API, Zernio reçoit le texte LinkedIn dans customContent et le commentaire dans platformSpecificData.firstComment. La documentation Zernio sur le premier commentaire donne environ 1 250 caractères pour un commentaire LinkedIn, posté quelques secondes après le post.

Le corps d'un post LinkedIn monte à 3 000 caractères, mais le pli « voir plus » tombe vers 210 : votre idée doit tenir avant.

X : un tweet de 280 caractères pondérés

X reçoit son propre texte, distinct de LinkedIn et d'Instagram. Notre règle du 3 octobre 2026 : un tweet de 280 caractères au plus, jamais de fil. Un post X compte donc un message, ou deux quand le lien part en première réponse.

Le piège vient du comptage. Selon la documentation officielle de X sur le comptage des caractères, toute URL vaut 23 caractères quelle que soit sa longueur, et un emoji en vaut 2. Notre script reproduit ce poids :

def x_length(text: str) -> int:
    """Longueur comptée par X : chaque URL vaut 23, emoji et symboles hors latin valent 2."""
    text = (text or "").strip()
    n = 0
    for part in X_URL.split(text):
        n += sum(_x_weight(c) for c in part)
    return n + 23 * len(X_URL.findall(text))

Avec un len() classique, un tweet à 275 caractères qui en pèse 290 pour X passe votre relecture, puis échoue le jour de la publication, trois semaines après votre « ok ».

Instagram : le lien en bio

Un lien dans une légende Instagram n'est pas cliquable. Le script le retire et termine la légende par un renvoi au lien en bio. La légende tient en 2 200 caractères, avec 5 hashtags au plus, et le pli tombe vers 125 caractères.

Comparatif LinkedIn, X et Instagram : longueur, lien et médias

Étape 3 : bloquer les erreurs par des scripts

Avant votre lecture, des scripts déterministes contrôlent chaque post. Tant qu'un post porte une erreur, impossible de le valider ou de le programmer.

Les contrôles de longueur et de médias

Nos scripts bloquent la validation dans six cas :

  1. Le tweet ou sa réponse dépasse 280 caractères pondérés.
  2. Le texte X contient un fil (séparateur ---).
  3. Le texte X manque pour un format sans texte X par défaut.
  4. Le post X porte plus de 4 images, ou une image de plus de 5 Mo.
  5. Un PDF vise un autre réseau que LinkedIn (le carrousel document n'existe que là).
  6. Le post ne vise aucun réseau, ou vise un réseau inconnu.

Chaque message dit quoi faire : « X : texte X manquant, l'écrire dans le champ Texte X (un tweet de 280 caractères au plus) ».

Le contrôle des tics d'écriture

Chaque légende, en français comme en anglais, passe notre script anti-tics : correction en deux temps, tiret cadratin, formules creuses, objet qui agit. Depuis le 30 septembre 2026, nous exigeons zéro BLOCK, sinon validation et programmation restent fermées. Notre file de validation affiche le résultat sous la légende.

Pour un SaaS, l'équivalent minimal tient en une liste de motifs interdits en expressions régulières et un code de sortie à 1 dès qu'un motif apparaît. Notre tuto pour rédiger un post LinkedIn avec l'IA détaille ce contrôle.

45 minutes entre deux posts d'un réseau

Deux posts d'un même réseau restent espacés d'au moins 45 minutes. Chaque post garde une heure objectif. En cas de conflit, le post prend la plage libre la plus proche, le même jour, dans cet ordre : +45, -45, +90, -90 minutes. Le calcul tourne à chaque enregistrement de la file, et le post retrouve son heure dès que le conflit disparaît.

Extrait réel de l'historique d'un post :

spaced  décalé à 13h15 (objectif 12h30) : un autre post occupe ce réseau à moins de 45 min
spaced  revenu à son heure objectif, 12h30

L'espacement ne touche pas aux posts déjà chez Zernio : ils restent à leur heure.

Capture recréée d'un post dans notre file de validation, décalé de 45 minutes

Étape 4 : valider ou refuser chaque post

Notre file de validation montre le texte exact de chaque réseau, le premier commentaire, les médias, l'heure et les contrôles. Trois réponses : valider, refuser, demander une modification.

Lier la validation au texte exact

Votre validation porte sur un texte précis. Si quelqu'un modifie la légende, les médias, le texte X ou le premier commentaire d'un post validé, le post repasse en to_review. Un simple changement d'heure, lui, garde la validation.

Notre seconde version du script va plus loin : elle lie la validation à une empreinte des textes et des fichiers images, et vous validez avec un code de revue de 6 caractères tiré de cette empreinte :

python3 scripts/pubqueue.py approve offre-annuelle.linkedin --by <votre-nom> --code d84e8f

Si le texte a changé depuis votre lecture, le code ne correspond plus et la validation échoue. Un statut tapé à la main dans le fichier repart en revue au moment de programmer.

Nous validons aussi par lot : 6 carrousels d'un coup le 8 octobre, chacun repassé par les contrôles.

Refuser pour faire avancer la file

« Non, suivant » refuse le post. Le post suivant du même format prend son créneau, les posts d'après avancent d'une semaine, et le dernier créneau libéré reçoit le prochain candidat de la source. Un post refusé ne revient jamais de lui-même.

Refuser n'abîme pas le calendrier. Au 12 octobre, nous avons refusé 3 posts.

Avant et après un refus : les posts suivants avancent d'une semaine

La demande de modification lance l'agent du format. Exemple tiré de notre historique : « Autre citation en légende, plus courte (moins de 100 caractères), toujours en anglais. » L'agent réécrit, repasse les contrôles et remet le post en to_review.

Garder la validation hors de portée de l'agent

Le 1er octobre 2026, nous avons demandé à l'agent d'ajouter des carrousels à la file. Le contenu des slides avait reçu un « ok » plus tôt dans la conversation. L'agent a pris ce « ok » pour une validation de publication et a passé 7 carrousels en approved. Nous avons rouvert les 7 avec la note « validation annulée : seul l'utilisateur valide ».

Depuis, la règle figure dans les instructions de l'agent et dans le code : l'agent ajoute en to_review et s'arrête. Dans la seconde version, la commande de validation rejette les noms d'agent et sort en erreur (code 3) quand personne ne tape le code.

Étape 5 : programmer avec l'API Zernio

Pour programmer vos posts LinkedIn, Instagram et X, nous passons par Zernio, une API de publication qui couvre aussi une dizaine d'autres réseaux. Chez nous, une validation déclenche aussitôt la programmation.

La requête de programmation

Le script envoie d'abord chaque média sur le stockage de Zernio par une URL présignée (POST /media/presign, puis un PUT du fichier). Il crée ensuite le post :

{
  "content": "<légende source>",
  "mediaItems": [{ "type": "image", "url": "<URL du stockage Zernio>" }],
  "platforms": [
    { "platform": "linkedin", "accountId": "<compte LinkedIn>",
      "customContent": "<texte LinkedIn sans lien>",
      "platformSpecificData": { "firstComment": "<phrase + lien>" } },
    { "platform": "twitter", "accountId": "<compte X>",
      "customContent": "<tweet>",
      "platformSpecificData": { "threadItems": ["<tweet>", "<réponse + lien>"] } },
    { "platform": "instagram", "accountId": "<compte Instagram>",
      "customContent": "<légende + renvoi au lien en bio>" }
  ],
  "scheduledFor": "2026-10-20T12:00:00",
  "timezone": "Europe/Paris"
}

L'en-tête Idempotency-Key combine l'identifiant du post et son créneau : un double clic ou une relance après une coupure ne crée pas deux posts. Côté coût, X facture chaque post à l'appel API via Zernio, et ce coût pèse dans le choix des réseaux par format.

L'interrupteur de mise en production

La file a un interrupteur, live. À false, toute programmation s'arrête sur le message « auto-publication pas en prod ». Utile pendant la mise au point, dangereux ensuite.

Trois pièges de notre agent IA réseaux sociaux

Le « validé » muet pendant cinq jours

Jusqu'au 3 octobre 2026, l'interrupteur restait à false. Notre file de validation affichait « validé » et rien ne partait chez Zernio. Une photo validée le 30 septembre n'est jamais sortie le 2 octobre. Pendant 5 jours, nous avons cru que « validé » voulait dire « publié ».

Nous avons passé la file en production le 3 octobre, puis programmé un par un les posts déjà validés. Si votre outil a un mode test, affichez-le en grand sur l'écran de validation.

Le doublon publié à la main

Un de nos 3 refus porte la note « déjà publiée sur Instagram le 26/09 ». Quelqu'un avait posté la citation à la main avant la mise en place de la file, et l'agent ne voyait que sa source. Avant de brancher un agent, listez ce qui est déjà sorti sur chaque compte et marquez-le comme utilisé dans la source.

Le connecteur branché sur un autre compte

Le connecteur MCP Zernio de Claude répondait « No accounts connected ». Nous en avons conclu à tort qu'aucun de nos comptes ne figurait sur Zernio. Ce connecteur pointait sur un autre compte Zernio, vide, alors que la clé API du script voyait bien LinkedIn, Instagram et X. Vérifiez vos comptes avec la clé qui publie.

Checklist des dix garde-fous de notre agent IA réseaux sociaux

Dix jours de file en chiffres

Au 12 octobre 2026, après dix jours en production :

Indicateur Valeur
Posts créés dans la file 90
Validations enregistrées 81
Posts programmés chez Zernio 73
Dernier créneau programmé 20 avril 2027
Posts refusés 3
Posts sautés 8
Posts à valider 5
Décalages d'espacement 5

Citations et photos hebdomadaires forment l'essentiel des 73 posts programmés. Zernio n'avait aucune donnée de meilleure heure au départ : nous réviserons nos heures après six semaines de statistiques.

Pour choisir quoi mettre dans la file, notre article sur la stratégie de founder-led content pose les bases, et le tuto carrousel LinkedIn avec l'IA produit l'un des formats. Notre vue d'ensemble des agents IA marketing situe cet agent dans la chaîne.

Un agent IA réseaux sociaux bien réglé prend la mécanique et vous laisse la seule décision qui engage votre nom.

FAQ

Un agent IA peut-il publier seul sur les réseaux sociaux ?

Techniquement oui, avec une API comme Zernio. Chez nous, seul un humain valide, et un post sans validation à l'heure de son créneau passe en « sauté ».

Quelles tâches confier à un agent IA réseaux sociaux ?

Le remplissage du calendrier, la réécriture par réseau, le placement des liens, le comptage des caractères, l'espacement des posts et l'appel API. Gardez le choix des sujets et la validation de chaque post.

Où mettre le lien sur chaque réseau ?

En premier commentaire sur LinkedIn, en première réponse sur X, en bio sur Instagram. Gardez le lien en clair dans la source. Un script le déplace à la programmation.

Comment X compte-t-il les caractères ?

Une URL vaut 23 caractères quelle que soit sa longueur, un emoji en vaut 2, et la limite est de 280. Un len() Python se trompe dès qu'il y a un lien long ou un emoji.

Combien de temps à l'avance programmer ses posts ?

Nous remplissons la file trois semaines à l'avance, avec un délai minimal de trois heures avant un créneau. Ce délai laisse le temps de refuser sans trou.

Faut-il un outil payant pour publier par API ?

Il faut un service qui détient les autorisations des réseaux. Nous utilisons Zernio, facturé à l'usage, et X facture en plus chaque post à l'appel API. Vous reliez vos comptes une fois, puis le script publie avec une clé API.