Liens de connexion
Pour les agences et les SaaS qui gèrent plusieurs clients : chaque client relie lui-même ses réseaux depuis votre interface, sans créer de compte Kreatoai. Ses comptes arrivent dans votre espace, rangés sous son profil, et vous publiez pour lui par l'API. Portée de clé requise : accounts:connect (les clés créées avant le 9 octobre 2026 ne l'ont pas : créez-en une nouvelle).
Principe
1. Créez le profil du client. 2. Créez un lien pour un réseau et ouvrez-le à votre client. 3. Il donne son accord directement au réseau sur une page qui affiche le nom et le logo de votre espace. 4. Il revient sur votre adresse avec l'issue en paramètres. 5. Revérifiez par l'API et publiez.
Profils clients
/v1/profilesCréer ou retrouver (idempotent sur externalId)
/v1/profilesLister, avec leurs comptes actifs
/v1/profiles/:idUn profil
/v1/profiles/:idRenommer, changer externalId
/v1/profiles/:idRefusé tant qu’un compte actif y est rattaché
curl -X POST https://api.kreatoai.com/v1/profiles \
-H "Authorization: Bearer sk-kre-v1-…" \
-H "Content-Type: application/json" \
-d '{ "name": "Boulangerie Diallo", "externalId": "client-42" }'
# 201 (créé) ou 200 (existait déjà)
{
"id": "6f1c2b9e-1d1f-4a8e-9a55-3c2d1e0f9a11",
"name": "Boulangerie Diallo",
"externalId": "client-42",
"accounts": [],
"createdAt": "2026-10-09T17:05:41.000Z"
}Créer un lien
/v1/profiles/:id/connect-linksLien à usage unique, valable 30 minutes
curl -X POST https://api.kreatoai.com/v1/profiles/6f1c2b9e-…/connect-links \
-H "Authorization: Bearer sk-kre-v1-…" \
-H "Content-Type: application/json" \
-d '{
"platform": "instagram",
"returnUrl": "https://votre-site.com/kreato/retour",
"state": "client-42:instagram:a8f3"
}'
# 201
{
"url": "https://kreatoai.com/connect/Qm9uam91ci1…",
"expiresAt": "2026-10-09T17:42:03.000Z",
"platform": "instagram",
"profileId": "6f1c2b9e-…"
}platform : facebook, instagram, linkedin, tiktok ou youtube. state vous revient tel quel. Un lien relie un seul compte ; tant que la connexion n'a pas abouti (le client a annulé), il peut être rouvert jusqu'à son expiration. Sur Facebook, si le compte gère plusieurs Pages, le client choisit la sienne sur notre page.
Retour chez vous
Le navigateur du client revient sur votre returnUrl, avec ces paramètres en plus des vôtres :
# Succès
?status=connected&accountId=…&profileId=…&externalId=client-42&platform=instagram&state=…
# Échec ou annulation
?status=error&error=access_denied&state=…Ce retour n'est pas signé : revérifiez toujours avec GET /v1/accounts?profileId=… ou le webhook account.connected. Sans returnUrl, le client termine sur une page « C'est relié, vous pouvez fermer cet onglet ».
Adresses de retour
Seules les adresses de votre liste blanche sont acceptées (sinon 400 return_url_not_allowed). Réglez-la dans le tableau de bord : Réglages → Claude et API → « Liens de connexion : adresses de retour », une par ligne, en https. Une adresse est permise si elle a la même origine qu'une entrée et que son chemin est égal ou en dessous. http://localhost et http://127.0.0.1 sont toujours permis, pour vos essais.
Comptes et publication
/v1/accounts?profileId=…Chaque compte porte profileId et externalId
/v1/accounts/:idDéconnecter un compte (portée accounts:connect)
/v1/postsCible { platform, profileId }
{
"targets": [{ "platform": "instagram", "profileId": "6f1c2b9e-…" }],
"content": "Nos croissants sortent du four à 7 h.",
"mediaUrls": ["https://exemple.com/croissants.jpg"]
}Si le profil a plusieurs comptes sur ce réseau, la cible est refusée (ambiguous_target) : passez alors channelId. Reconnecter un compte déjà relié au même profil rafraîchit son accès sans doublon ; un compte relié à un autre profil est refusé (account_belongs_to_other_profile). Le nombre de comptes suit votre formule, tous profils confondus.
Webhooks
| Type | Déclencheur |
|---|---|
account.connected | Un compte vient d’être relié par un lien de connexion |
account.disconnected | Un compte a été déconnecté |
account.reauth_required | L’accès a expiré ou a été retiré chez le réseau : créez un nouveau lien |
Charge : accountId, platform, name, profileId, externalId. Les événements publish.* portent aussi profileId et externalId.
Codes d’erreur du retour
| Code | Sens |
|---|---|
access_denied | Le client a annulé chez le réseau |
link_expired | Lien expiré (30 min) : créez-en un nouveau |
link_used | Le lien a déjà relié un compte |
channel_limit_reached | Votre formule ne permet pas un compte de plus |
account_belongs_to_other_profile | Compte déjà relié à un autre de vos clients |
no_page_found | Facebook : le compte ne gère aucune Page |
platform_unavailable | Le réseau ne répond pas : réessayez |
token_exchange_failed | Le réseau a refusé l’échange : réessayez |
invalid_state | Retour dans un autre navigateur ou cookies bloqués |
connection_failed | Erreur imprévue : réessayez |