kreatoai/Documentation API

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

POST
/v1/profiles

Créer ou retrouver (idempotent sur externalId)

GET
/v1/profiles

Lister, avec leurs comptes actifs

GET
/v1/profiles/:id

Un profil

PATCH
/v1/profiles/:id

Renommer, changer externalId

DELETE
/v1/profiles/:id

Refusé 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

POST
/v1/profiles/:id/connect-links

Lien à 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

GET
/v1/accounts?profileId=…

Chaque compte porte profileId et externalId

DELETE
/v1/accounts/:id

Déconnecter un compte (portée accounts:connect)

POST
/v1/posts

Cible { 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

TypeDéclencheur
account.connectedUn compte vient d’être relié par un lien de connexion
account.disconnectedUn compte a été déconnecté
account.reauth_requiredL’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

CodeSens
access_deniedLe client a annulé chez le réseau
link_expiredLien expiré (30 min) : créez-en un nouveau
link_usedLe lien a déjà relié un compte
channel_limit_reachedVotre formule ne permet pas un compte de plus
account_belongs_to_other_profileCompte déjà relié à un autre de vos clients
no_page_foundFacebook : le compte ne gère aucune Page
platform_unavailableLe réseau ne répond pas : réessayez
token_exchange_failedLe réseau a refusé l’échange : réessayez
invalid_stateRetour dans un autre navigateur ou cookies bloqués
connection_failedErreur imprévue : réessayez