Docs développeur

Intégrez Chat33
à votre stack.

Pixel de suivi, événements webhook, postbacks d’installation MMP et suivi des revenus. Tout ce qu’il faut pour connecter Chat33 à votre site ou à votre app.

Pour commencer

Pour utiliser les intégrations développeur de Chat33, vous avez besoin d’un token MMP. Vous le trouvez dans votre tableau de bord, sous Réglages → Intégrations.

1. Récupérez votre token

Allez dans Réglages → Intégrations → Token MMP. Cliquez sur « Générer le token » si vous n’en avez pas.

2. Choisissez votre intégration

Site web / app web

Utilisez le pixel de suivi pour suivre les pages vues, les inscriptions et les achats.

App mobile

Utilisez les postbacks MMP (AppsFlyer, Adjust, Branch, Tenjin, Singular) pour suivre les installations.

Pixel de suivi

Suivez les événements de votre site et attribuez-les aux conversations en DM

Installation

Ajoutez cette balise script dans le <head> de votre site, ou avant </body>. Remplacez YOUR_PIXEL_KEY par la clé du pixel dans Réglages, Intégrations. N’utilisez jamais votre token MMP ici : c’est un secret.

html
<script src="https://chat33.io/pixel.js" data-token="YOUR_PIXEL_KEY"></script>

Suivre des événements

Le pixel suit automatiquement les pages vues. Pour suivre des événements personnalisés (achats, inscriptions, etc.), utilisez la méthode chat33.track() :

javascript
// Track a purchase with value
chat33.track("purchase", {
  value: 49.99,
  currency: "USD",
  product: "Pro Plan"
});

// Track a signup
chat33.track("signup");

// Track a lead
chat33.track("lead", { source: "landing_page" });

// Track any custom event
chat33.track("tutorial_complete", { step: 5 });

Comment ça marche

Liens intelligents

Chat33 ajoute ?cid=xxx aux liens suivis envoyés en DM

Attribution automatique

Le pixel lit l’ID du contact dans l’URL et le conserve d’une page à l’autre

Étiquetage automatique

Les événements comme « purchase » étiquettent automatiquement le contact dans votre CRM

Référence de l’API

MéthodeParamètresDescription
chat33.track(event, metadata?)event: string, metadata: objectEnvoie un événement personnalisé
chat33.identify(contactId)contactId: stringDéfinit manuellement l’ID du contact
chat33.getContactId()—Renvoie l’ID du contact actuel

API d’événements webhook

Envoyez des événements personnalisés de votre serveur vers Chat33

Endpoint

http
POST https://chat33.io/api/webhooks/events?token=YOUR_TOKEN

Content-Type: application/json

{
  "event": "purchase",
  "contactId": "cm1abc123...",
  "value": 49.99,
  "currency": "USD",
  "metadata": {
    "product": "Pro Plan",
    "source": "checkout"
  }
}

Corps de la requête

ChampTypeObligatoireDescription
eventstringOuiNom de l’événement (purchase, signup, lead, etc.)
contactIdstringNonID du contact Chat33 pour l’attribution
valuenumberNonValeur monétaire de l’événement
currencystringNonCode de la devise (USD, EUR, etc.)
metadataobjectNonToute donnée supplémentaire

Exemples

bash
# cURL
curl -X POST "https://chat33.io/api/webhooks/events?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"event":"purchase","value":29.99,"currency":"USD"}'
javascript
// Node.js / fetch
await fetch("https://chat33.io/api/webhooks/events?token=YOUR_TOKEN", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    event: "purchase",
    contactId: "cm1abc123...",
    value: 29.99,
    currency: "USD",
  }),
});

Limite de débit : 100 événements par minute et par token. Les événements sont enregistrés comme événements d’analytics et les contacts sont étiquetés automatiquement selon le nom de l’événement (par ex. « purchase » → étiquette « Purchased »).

API de publication sociale

Programmez et publiez du contenu sur Instagram, Facebook, TikTok, YouTube, X (Twitter), LinkedIn, Bluesky et Threads

Authentification

Générez une clé API dans Réglages → Clés API. Transmettez-la dans l’en-tête x-api-key de toutes les requêtes.

bash
# All API requests require this header:
x-api-key: sk_live_your_api_key_here

Plateformes prises en charge

Instagram

Photos, reels, carrousels (via l’API Graph d’Instagram)

Facebook

Texte, photos, vidéos avec programmation native

TikTok

Vidéos et publications photo via la Content Posting API

YouTube

Envoi de vidéos avec publication programmée native

X (Twitter)

Texte, photos, vidéo et fils via l’API X v2 (utilise des crédits)

LinkedIn

Texte, cartes de lien, jusqu’à 9 images ou une vidéo, publiés sur le profil du membre

Bluesky

Texte, cartes de lien, jusqu’à 4 images ou une vidéo, via l’AT Protocol

Threads

Texte, images, vidéo, carrousels jusqu’à 20, sondages et tags de sujet

Créer une publication

bash
curl -X POST "https://chat33.io/api/v1/posts" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "accountIds": ["channel_id_here"],
    "text": "Check out our new product! #launch",
    "mediaUrls": ["https://your-blob-url.com/image.jpg"],
    "mediaType": "image"
  }'

Options par plateforme (platformConfig)

Les réglages propres à chaque plateforme se placent sous une clé portant le nom de la plateforme. Seules les clés des plateformes présentes dans accountIds sont lues : une même requête peut donc porter les options de plusieurs plateformes à la fois. Chaque plateforme accepte un champ text qui remplace le texte principal, pour qu’une publication se lise différemment sur chaque réseau.

Deux comportements à connaître avant votre premier appel : youtube.madeForKids est rejeté s’il manque, au lieu d’avoir une valeur par défaut, car YouTube exige cette déclaration pour chaque vidéo envoyée. Et une publication TikTok sans objet consent arrive dans les brouillons du compte au lieu d’être publiée.

json
{
  "instagram": {
    "text": "...",                     // caption for this platform only
    "firstComment": "#tags #here"      // posted right after publish
  },
  "facebook": {
    "text": "..."
  },
  "linkedin": {
    "text": "...",
    "visibility": "PUBLIC",            // or "CONNECTIONS" (1st-degree only)
    "articleUrl": "https://...",       // link card, ignored when the post has media
    "mediaTitle": "...",
    "mediaDescription": "..."
  },
  "youtube": {
    "madeForKids": false,              // REQUIRED for any YouTube channel
    "privacyStatus": "public",         // or "unlisted" / "private"
    "title": "...",
    "description": "...",
    "tags": ["one", "two"],            // up to 30
    "categoryId": "22",                // default: People & Blogs
    "notifySubscribers": true
  },
  "x": {
    "text": "...",
    "thread": true,                    // split text into a thread
    "splitOn": "---",
    "replyControl": "everyone"         // or "following" / "mentionedUsers"
  },
  "tiktok": {
    "text": "...",
    "consent": {
      "publishMode": "DIRECT_POST",    // or "MEDIA_UPLOAD" (drafts)
      "privacyLevel": "SELF_ONLY",     // required for DIRECT_POST
      "disableComment": false,
      "disableDuet": false,
      "disableStitch": false,
      "aiGenerated": false
    }
  }
}

Particularités de LinkedIn

  • Les publications sont postées sur le profil personnel du membre authentifié. Les Pages d’entreprise nécessitent la Community Management API de LinkedIn, qui fait l’objet d’une validation distincte et n’est pas encore prise en charge.
  • Une publication contient jusqu’à 9 images ou 1 vidéo, jamais les deux. Un dépassement est rejeté et non réduit en silence.
  • La légende est limitée à 3 000 caractères. Vidéo : 200 Mo, images : 10 Mo chacune.
  • articleUrl ne s’applique qu’aux publications de texte. Les médias sont prioritaires et le lien est ignoré.
  • L’accès expire après 60 jours et LinkedIn ne délivre pas de refresh token : le compte doit être reconnecté manuellement. La publication renvoie une erreur de reconnexion explicite une fois l’accès expiré.
  • LinkedIn limite à 150 requêtes d’API par membre et par jour, et chaque image coûte deux appels de plus : la limite porte donc sur les requêtes, pas sur le nombre de publications.

Programmer une publication

bash
curl -X POST "https://chat33.io/api/v1/posts" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "accountIds": ["ig_channel_id", "fb_channel_id"],
    "text": "Coming soon!",
    "mediaUrls": ["https://your-blob-url.com/video.mp4"],
    "mediaType": "video",
    "scheduledAt": "2026-04-15T14:00:00Z",
    "callbackUrl": "https://your-server.com/webhook"
  }'

Importer des médias

L’envoi multipart est strictement limité à 4,5 Mo. Les corps plus volumineux sont rejetés avec 413 FUNCTION_PAYLOAD_TOO_LARGE avant d’atteindre l’API. Pour tout fichier plus gros, importez depuis une URL publique, ou obtenez une URL présignée et envoyez directement vers le stockage.

bash
# Small files (< 4.5MB): multipart upload
curl -X POST "https://chat33.io/api/v1/media/upload" \
  -H "x-api-key: sk_live_your_key" \
  -F "file=@photo.jpg"

# Large files, already on a public URL: URL ingestion (up to 4GB)
curl -X POST "https://chat33.io/api/v1/media/upload" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/large-video.mp4", "filename": "video.mp4"}'

# Large LOCAL file: presigned direct upload (up to 500MB per PUT)
# 1. ask for an upload URL
curl -X POST "https://chat33.io/api/v1/media/upload-url" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"filename": "video.mp4", "contentType": "video/mp4", "size": 16352652}'
# -> {"uploadUrl": "https://...", "headers": {"content-type": "video/mp4"}, ...}

# 2. PUT the bytes straight to storage (never touches the API)
curl -X PUT "<uploadUrl>" \
  -H "Content-Type: video/mp4" \
  --data-binary @video.mp4
# -> {"url": "https://....public.blob.vercel-storage.com/...", ...}
#    pass that url in mediaUrls when creating the post

Référence de l’API

MéthodeEndpointDescription
POST
/api/v1/postsCréer et mettre en file une ou plusieurs publications
GET
/api/v1/postsLister les publications (paginées, filtrables)
GET
/api/v1/posts/:idObtenir le détail d’une publication
PATCH
/api/v1/posts/:idModifier un brouillon ou une publication en file, ou l’annuler
DELETE
/api/v1/posts/:idSupprimer un brouillon ou annuler une publication
POST
/api/v1/posts/:id/duplicateDupliquer une publication
POST
/api/v1/media/uploadImporter un média (fichier de moins de 4,5 Mo, ou URL publique)
POST
/api/v1/media/upload-urlURL présignée pour l’envoi direct d’un gros fichier local

Corps de la requête : créer une publication

ChampTypeObligatoireDescription
accountIdsstring[]OuiID des canaux sur lesquels publier (10 maximum)
textstringNonLégende / description de la publication
mediaUrlsstring[]NonURL des fichiers médias (importés via /media/upload)
mediaTypestringNonimage, video, reel ou carousel
scheduledAtstringNonDate et heure ISO 8601 pour la programmation
callbackUrlstringNonURL de webhook pour les notifications de publication
platformConfigobjectNonOptions propres à la plateforme (titre YouTube, confidentialité, etc.)
coverImageUrlstringNonImage de couverture / miniature pour les vidéos

Limites de débit : 50 publications par minute et par organisation. Limites quotidiennes par canal : Instagram (25), Facebook (50), TikTok (20), YouTube (100), X (300).

Callbacks : quand une publication est publiée ou échoue, une requête POST est envoyée à votre callbackUrl avec l’ID de la publication, son statut et l’URL de la publication externe.

Spécification OpenAPI 3.1

Explorateur d’endpoints interactif et JSON lisible par machine pour la génération de code, n8n, MCP.

Docs IA · llms.txt

Documentation en Markdown pour Claude, ChatGPT, Cursor. Copiez-collez pour que l’IA génère des appels d’API corrects.

Node n8n · node communautaire

Node communautaire n8n officiel. Listez les comptes, créez et programmez des publications, importez des médias depuis n’importe quel workflow n8n. Installez n8n-nodes-chat33 depuis Settings → Community Nodes.

Serveur MCP

Connectez Claude, Cursor ou n’importe quel client MCP à Chat33. Publiez, récupérez les statistiques et créez des automatisations de DM en langage naturel.

Connecter les comptes de vos utilisateurs

Laissez vos propres utilisateurs connecter leurs comptes Instagram, Facebook, TikTok, YouTube, X, LinkedIn, Bluesky ou Threads via Chat33, puis publiez pour eux via l’API

L’API Connect pour développeurs émet un lien à usage unique qui envoie l’un de vos utilisateurs vers l’écran de consentement OAuth de la plateforme elle-même, en votre nom, sans jamais toucher à son mot de passe. Une fois l’accès accordé, le compte connecté se comporte comme n’importe quel autre dans l’API de publication sociale ci-dessus : vous publiez dessus, vous lisez ses statistiques lorsque la plateforme les fournit, et vous le déconnectez, le tout limité à l’utilisateur final (le « profil ») auquel il appartient.

Comment ça marche

  1. Créez un profil pour l’utilisateur (POST /v1/profiles), ou réutilisez-en un, identifié par votre propre externalId.
  2. Demandez un lien de connexion pour ce profil et une plateforme (POST /v1/connect). Il est valable une seule fois, pendant 15 minutes.
  3. Envoyez l’utilisateur vers l’url renvoyée. Il valide sur l’écran de la plateforme elle-même, qui indique Chat33 comme l’app qui demande l’accès : c’est normal, et personne ne voit son mot de passe.
  4. Il revient sur votre redirectUrl avec status, profileId et accountIds (ou status=error&code=… s’il a annulé ou si un problème est survenu : un consentement annulé ne consomme pas le lien).

Créer un profil

bash
curl -X POST "https://chat33.io/api/v1/profiles" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Fitness",
    "externalId": "user_482"
  }'

Créer un lien de connexion

bash
curl -X POST "https://chat33.io/api/v1/connect" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "profileId": "prof_abc123",
    "platform": "instagram",
    "redirectUrl": "https://yourapp.com/oauth/done",
    "skipIntro": false
  }'
# -> {"url": "https://chat33.io/connect/...", "expiresAt": "...", "platform": "instagram", "profileId": "prof_abc123"}
# send your user to that url
# skipIntro: true returns a url that goes straight to the platform's consent screen

Ce que voit votre utilisateur

Une page hébergée par Chat33 qui indique le nom de votre app, puis l’écran de connexion et de consentement de la plateforme elle-même, qui indique Chat33 comme l’app qui demande l’accès, et non votre app. C’est ainsi que fonctionne l’OAuth sous-jacent, et c’est normal. L’utilisateur peut révoquer l’accès depuis la plateforme à tout moment.

Pour ignorer la page d’introduction et envoyer votre utilisateur directement à l’écran de consentement de la plateforme, passez "skipIntro": true à la création du lien. Le lien devient alors une redirection immédiate : même token, même expiration de 15 minutes, même retour vers votre redirectUrl. Si vous l’ignorez, indiquez à votre utilisateur sur votre propre écran que la page de consentement mentionnera Chat33, et privilégiez l’envoi par un clic sur un bouton plutôt que par un lien dans un e-mail : les clients de messagerie et les apps de chat préchargent les liens, et le préchargement d’un lien skipIntro ouvre la fenêtre de la plateforme dans l’outil d’analyse (le token n’est pas consommé).

$1 par emplacement de connexion et par période de 30 jours. Un emplacement est acheté sur vos crédits prépayés au moment où un compte se connecte (ou à l’avance avec Acheter des emplacements) et renouvelé tous les 30 jours tant que le compte reste connecté. Pas de calcul au prorata ni de remboursement, mais un emplacement libéré par une déconnexion reste à vous jusqu’à son expiration, et le prochain compte que vous connectez le prend. Si votre solde ne couvre pas un renouvellement, le compte continue de fonctionner pendant 7 jours, le montant apparaissant comme à régler ; ensuite, il est suspendu jusqu’à ce que vous rechargiez. Les comptes suspendus ne sont pas facturés.

Règles

  • Un vrai compte n’existe qu’une seule fois dans tout Chat33 : il ne peut pas être connecté une seconde fois, par vous ou par quelqu’un d’autre, que ce soit via l’API ou le tableau de bord Chat33.
  • Les comptes connectés via l’API ne comptent jamais dans la limite de canaux du forfait de votre organisation.
  • Les messages et commentaires reçus sur ces comptes ne sont ni enregistrés ni automatisés par Chat33 (la v1 sert uniquement à publier).
  • Facebook connecte chaque Page à laquelle l’utilisateur donne accès ; chaque Page est son propre compte et son propre emplacement.
  • Instagram se connecte via Instagram Login, pour les comptes professionnels ou de créateur.
  • Les publications X faites via les comptes connectés puisent aussi dans votre solde de crédits, comme celles des comptes de votre propre tableau de bord.

Comptes suspendus

Un compte dont l’emplacement est resté impayé pendant 7 jours est suspendu : la publication renvoie 402 account_paused avec les accountIds concernés ; elle reprend automatiquement dès que vous rechargez. POST /v1/posts, POST /v1/posts/validate et POST /v1/posts/:id/duplicate vérifient tous ce point d’emblée, avant de mettre quoi que ce soit en file.

json
// 402
{
  "error": "ACCOUNT_PAUSED",
  "code": "account_paused",
  "message": "These accounts are paused until outstanding connection charges are paid. Top up credits.",
  "accountIds": ["chan_abc123"]
}

Référence de l’API

MéthodeEndpointDescription
GET
/api/v1/profilesLister vos utilisateurs finaux
POST
/api/v1/profilesCréer (ou retrouver, par externalId) un utilisateur final
GET
/api/v1/profiles/:idObtenir un profil et ses comptes
PATCH
/api/v1/profiles/:idModifier le nom ou l’externalId d’un profil
DELETE
/api/v1/profiles/:idDéconnecter ses comptes et supprimer le profil
POST
/api/v1/connectCréer un lien de connexion à usage unique pour un profil
GET
/api/v1/accounts?source=apiLister tous les comptes connectés par vos utilisateurs, tous profils confondus
GET
/api/v1/accounts?profileId=Lister les comptes connectés d’un profil
DELETE
/api/v1/accounts/:idDéconnecter un compte
GET
/api/v1/posts?profileId=Lister les publications d’un profil
GET
/api/v1/analytics/posts?profileId=Statistiques agrégées des publications d’un profil
GET
/api/v1/billing/connectionsSolde de crédits, montant à régler et historique des emplacements
POST
/api/v1/billing/slotsAcheter des emplacements de connexion à l’avance

Vous êtes responsable du contenu que vous publiez via les comptes de vos utilisateurs et de l’obtention de leur consentement. Chat33 peut désactiver les clés API qui mettent en danger ses apps de plateforme.

Activer l’autorisation

Obtenez l’autorisation connect:write : créez une clé dans Réglages → Clés API et cochez Connecter les comptes de vos utilisateurs. Elle est désactivée par défaut sur chaque clé.

Postbacks d’installation MMP

Suivez les installations d’app depuis AppsFlyer, Adjust, Branch, Tenjin ou Singular

URL de postback

Configurez cette URL dans le tableau de bord de votre MMP comme endpoint de postback. Remplacez YOUR_SECRET par le secret de webhook MMP indiqué dans Réglages.

text
https://chat33.io/api/webhooks/mmp?secret=YOUR_SECRET

MMP pris en charge

AppsFlyer

Lit event_type, app_id, appsflyer_id, af_sub1/af_sub2 pour l’attribution

Adjust

Lit activity_kind (install, rejected_install, event), label et adid depuis le callback, en GET ou POST. Pour le revenu des achats, ajoutez le placeholder revenue_float (pas revenue, qui est en centimes) et currency

Branch

Lit les événements webhook (INSTALL, PURCHASE), les ID d’appareil dans user_data ainsi que le créateur et la publication que Chat33 ajoute aux données du lien

Tenjin

Lit campaign_id, site_id pour l’attribution

Singular

Lit network, source pour l’attribution

Configuration du lien intelligent

Utilisez l’étape Envoyer un lien de téléchargement d’app dans vos automatisations. Elle envoie les utilisateurs d’iPhone vers le lien App Store et ceux d’Android vers le lien Google Play, et compte chaque appui sur votre tableau de bord, par automatisation. Collez le lien de suivi de votre MMP (OneLink, Adjust, Branch, Singular ou Tenjin) avec un nom de campagne par publication, et votre MMP indique les installations par publication. Pour les campagnes d’influenceurs Chat33, les ID du contact et de l’influenceur sont ajoutés automatiquement au lien.

1

Ajoutez l’étape de téléchargement

Dans votre automatisation, ajoutez Envoyer un lien de téléchargement d’app avec les liens de suivi de votre MMP

2

Configurez le MMP

Configurez l’URL de postback dans AppsFlyer, Adjust, Branch (un webhook pour l’événement Install), Tenjin ou Singular

3

Suivez les installations

Les appuis par automatisation dans Chat33, les installations par campagne dans votre MMP, les totaux d’installations sur votre tableau de bord

Pas de MMP ? Utilisez les liens de campagne des stores

Apple et Google comptent gratuitement les installations par campagne. Mettez un nom de campagne dans chaque lien de store, un par publication, et collez les liens dans l’étape de téléchargement. Les installations apparaissent dans App Store Connect (App Analytics, Sources, Campaigns) et dans Play Console (rapports d’acquisition par campagne UTM), environ un jour plus tard et de façon agrégée.

App Store : générez-le dans App Store Connect, ou construisez-le

text
https://apps.apple.com/app/apple-store/id<APP_ID>?pt=<PROVIDER_TOKEN>&ct=<campaign_name>&mt=8

Google Play : les tags UTM vont dans referrer, encodés en URL

text
https://play.google.com/store/apps/details?id=<PACKAGE>&referrer=utm_source%3Dchat33%26utm_medium%3Ddm%26utm_campaign%3D<campaign_name>

Pas à pas : suivi gratuit des installations sans MMP.

Générateur de liens de campagne UTM

Générez des URL suivies avec des paramètres UTM pour Google Analytics

Astuce : utilisez des liens UTM dans les messages de vos automatisations Chat33. Combinés au pixel de suivi, ils vous montrent tout le parcours, du DM à la conversion, dans Google Analytics.

Besoin d’aide pour l’intégration ?

Notre équipe peut vous aider à configurer le suivi et à tirer le meilleur des outils développeur de Chat33.