adkix transforme un site en vidéo courte de marque, étape par étape. Avec l'API, c'est ton IA qui conduit : Claude, ChatGPT, Cursor ou ton propre code. adkix propose, la personne valide chaque étape et dit oui à chaque prix.
Sur adkix.ai/compte, section API, crée une clé. Elle commence par adk_live_ et n'est montrée qu'une fois : garde-la dans une variable d'environnement, jamais dans ton code.
Terminal
export ADKIX_API_KEY="adk_live_..."# la clé, montrée une seule fois
Vérifie le compte
GET /me répond avec ton solde de crédits et l'état de la vidéo de bienvenue. Un 401 veut dire que la clé est fausse ou révoquée.
GET /contents/{id}?waitSec=25 attend qu'il se passe quelque chose. Lis step, montre les previews, et propose suggested : le prochain clic qu'adkix ferait.
Une fois la personne d'accord, lance l'action. Si elle est payante, la réponse est un devis : { quote: { proposalId, price, text } }. Rien n'est dépensé.
Montre quote.text, et seulement après un oui explicite, confirme. Le tournage prend 15 à 20 minutes ; à la fin, video.shareUrl ouvre le film dans n'importe quel navigateur.
Un contenu, c'est un projet vidéo. Il avance sur un rail d'étapes, de la marque au film monté. Ton IA conduit, adkix propose, et la personne garde la main sur chaque décision et chaque crédit.
01Marquemarque
adkix lit le site : nom, promesse, couleurs, typos.
02Élémentselements
Produits ou lieux à montrer, phrase imposée.
03Formatformat
Plateformes, langue, durée.
04Angleangle
Trois idées d'histoire, la personne en choisit une.
devis
05Stylemedium
Tournage, UGC, motion design, dessin animé, pâte à modeler…
Toute action payante répond d'abord par un devis : proposalId, action, price en crédits, text à lire à la personne, free (vidéo de bienvenue, rien de débité) et expiresInSec: 600.
Seul POST /contents/{id}/confirm avec ce proposalId (ou l'action confirm) dépense. Un devis non confirmé expire au bout de 10 minutes ; il apparaît aussi dans le fil du site et dans state.pendingQuote.
Certaines actions gratuites qui défont du travail (changer la narration après le script, retirer un personnage…) répondent elles aussi par un devis à 0 crédit, avec l'avertissement dans text.
Après la confirmation de approve_script, chaque scène est filmée par l'IA : comptez 15 à 20 minutes pour 30 secondes. Ne bloque jamais la conversation : suis l'avancement avec waitSec et donne des nouvelles.
Réponse d'une action payante
{
"quote": {
"proposalId": "p-7c41e9a02b6d",
"action": "approve_script",
"price": 1180,
"text": "Tourner coûte environ 1180 crédits, débités au coût réel au fil des étapes.",
"free": false,
"expiresInSec": 600
}
}
La règle d'or
Ton IA ne confirme jamais un devis sans un oui explicite de la personne sur ce prix exact. Le serveur n'exécute jamais suggested tout seul.
Toutes les routes vivent sous https://adkix.ai/api/v1, répondent en JSON (sauf les fichiers) avec Cache-Control: no-store, et une erreur a toujours la forme { error, code }.
Pas encore de clé : ton IA demande l'email de la personne et l'envoie ici. Un code à 6 chiffres part par mail. Même chemin pour un nouveau compte et un compte existant ; rien n'est créé avant le code.
Le code vit 15 minutes et ne sert qu'une fois. 3 mails par adresse et par heure (429 au-delà).
La personne donne le code reçu à ton IA. Le compte est créé s'il n'existe pas (email vérifié, crédits de bienvenue), puis une clé API est rendue, une seule fois.
5 mauvais codes tuent la demande (401 expired : recommence /auth/start). 5 clés actives au plus (409 too_many_keys).
Range la clé dans un fichier privé, jamais dans la conversation.
Paramètres
requestIdstringbodyrequis
Rendu par /auth/start.
codestringbodyrequis
Les 6 chiffres du mail.
keyNamestringbody
Nom de la clé sur /compte (Claude Code par défaut).
Le compte de la clé : nom, solde de crédits, offre, et si la vidéo de bienvenue est encore disponible. Appelle-le en premier pour vérifier que la clé fonctionne.
freeVideo vaut available, verify_email (adresse à confirmer d'abord), used ou unavailable. available = createContent accepte offer: "free".
Démarre un projet vidéo à partir d'un site, d'un compte @instagram ou d'une idée, et lit la marque sur le site. Rien de coûteux ne part ici : chaque étape payante répondra plus tard par un devis.
Le brief ne lance rien : il pré-remplit state.suggested (format, langue, durée, note pour les angles).
offer: "free" utilise la vidéo de bienvenue du compte et demande source.url ; un refus répond free_refused avec reason.
Limite : 10 créations par jour et par clé, 20 par compte.
Paramètres
source.urlstring ≤ 500body
Un site (https://…) ou un compte @instagram. source.url ou source.idea est requis.
source.ideastring ≤ 1000body
Une idée en texte libre, sans site. Elle part dans la note du brief.
offer"paid" | "free"body
paid par défaut. free = la vidéo de bienvenue (source.url requis).
igConsentbooleanbody
true quand la personne accepte qu'on lise ses posts Instagram publics.
brief.duration15 | 30 | 60body
Durée en secondes (6, 12 ou 24 scènes).
brief.languagestringbody
Langue de la voix off : fr, en, es, de, it, pt…
brief.platformsstring[]body
instagram, tiktok, shorts, youtube… Les inconnues sont ignorées.
brief.notestring ≤ 2000body
Brief libre : offre, public, ton, ce qui doit être dit.
Requête
curl-X POST "https://adkix.ai/api/v1/contents" \
-H"Authorization: Bearer $ADKIX_API_KEY" \
-H"Content-Type: application/json" \
-d '{
"source": {
"url": "https://maisonlumen.fr"
},
"brief": {
"duration": 30,
"language": "fr",
"platforms": [
"instagram",
"tiktok"
],
"note": "Lancement de la collection d'hiver, ton chaleureux."
}
}'
La source de vérité : étape, progression, actions permises, suggestion d'adkix, aperçus, film et devis en attente. Avec waitSec, la réponse attend qu'un changement arrive.
waitSec (0 à 25) tient la requête ouverte et répond dès que l'étape, la tâche en cours, une image, un clip, une voix, le film ou une erreur bouge.
L'en-tête x-adkix-waited vaut changed, timeout ou none (pas d'attente demandée).
Paramètres
idstringpathrequis
Identifiant du contenu (contentId de createContent, ou id de listContents).
waitSecinteger 0–25query
Attente longue (long poll). Remplace les sleep entre deux appels.
Exécute une action de l'étape en cours (les noms sont dans state.actions). Une action gratuite part tout de suite ; une action payante ne dépense rien et répond par un devis.
Réponse : soit { ok, note } (fait), soit { quote } à montrer à la personne. Ne confirme qu'après un oui explicite.
action: "cancel" + proposalId retire un devis. action: "confirm" + proposalId équivaut à confirmQuote.
Un nom inconnu répond 400 bad_action avec validActions ; set_mode, edit_scene, revert_scene_edit, set_cast_photo et derive_reel répondent 400 not_in_api.
Paramètres
idstringpathrequis
Identifiant du contenu (contentId de createContent, ou id de listContents).
actionstringbodyrequis
Un nom de state.actions, ou cancel.
argsobjectbody
Arguments, de la forme que donne le hint de l'action.
Les shareUrl et downloadUrl de l'état. Ils s'ouvrent dans n'importe quel navigateur, sans Bearer, pendant 24 h : c'est ce que ton IA donne à la personne.
Lien expiré, clé révoquée ou mot de passe changé : 404 link_invalid. Relis l'état pour un lien neuf.
Les actions sont les mêmes que celles de l'assistant du site. Celles permises à l'instant sont dans state.actions, avec leur hint : la forme exacte de args. Les actions du chemin principal sont en tête de chaque étape.
chemin chemin principalestimation le devis est une estimation, les crédits sont débités au coût réel au fil des étapesconfirmation peut défaire du travail : répond par un devis, même gratuit
Marque
marque7
brand_from_sitechemin
{ "url": string }
keep_brandchemin
{}
pick_brand
{ "brandId": string }
manual_brand
{ "name": string, "description"?: string, "promise"?: string, "audience"?: string } — fill what the user already said
set_brand_field
{ "field": "name" | "promise" | "description" | "audience" | "features" | "cta" | "url" | "language" | "colors" | "fonts" | "pronunciations", "value": unknown } — free, changes the brand itself (this reel's next pictures and every later reel); features is a string[]
sync_brand
{}
suggest_brand_copy
{}
Éléments
elements3
finish_elementschemin
{ "skip"?: boolean }
set_reel_elementsconfirmation
{ "elementIds": string[], "mustInclude"?: string } (elements of the brand, at most 3; find them by name in the brand elements; mustInclude also sets the phrase in the same call)
set_must_includeconfirmation
{ "text": string } (what the reel must say word for word, ≤ 200 characters; "" removes it)
Format
format1
set_formatscheminconfirmation
{ "platforms"?: string[] (all vertical — tiktok/instagram/shorts — or only youtube, never both; left out = the format on screen), "language"?: "fr" | "en" | "es" | "de" | "it" | "pt", "duration"?: 15 | 30 | 60 (seconds: 6, 12 or 24 scenes) }
Angle
angle5
propose_angleschemin
{ "note"?: string }
pick_anglechemin
{ "proposalId": string }
start_reelcheminestimation
{}
retry_element_angles
{}
custom_angle
{ "text": string }
Style
medium2
choose_mediumchemin
{ "pack": number } (0-based, when packs are offered: medium + narration in one pick) or { "medium": string } — a catalogue id (tournage, ugc, motion-design, dessin-anime, anime, 3d-clay…), its French or English label, or any free wording (« en pâte à modeler ») taken as a custom medium. Free while the grid is shown; the next draw after « Changer de médium » costs the 4 styles.
change_medium
{} — back to the medium grid while the 4 styles wait; the styles already drawn stay until a new medium is chosen.
Narration
narration2
choose_narrationchemin
{ "mode": string, "settings"?: object } — a catalogue id (voix-off, histoire, ugc, voix-interieure, fondateur, dialogue, interview) or its French / English label. "settings" (optional): { "titles": boolean (words painted on the pictures), "cta": boolean (the film ends on a call to action), "ctaText": string (its exact words, 60 characters at most; empty = written from the site) }. Free. The casting, the script and every plan are then made for that narration.
back_style_flow
{ "to": "medium" | "narration" } — Style flow: back to the Style (texture) or Narration screen before the ambiances are drawn. Free; the choices stay pre-checked.
Options
options1
set_optionschemin
{ "titles": boolean (words painted on the pictures), "logo": "never" | "end" | "corner", "cta": boolean (the film ends on a call to action), "ctaText": string (its exact words, 60 characters at most; empty = written from the site) } — Style flow screen 3 « Générer »: saves the options and draws the 4 ambiances (one in turbo). Prefer letting the person use the Options screen.
Look
style4
approve_stylechemin
{ "index"?: number } (index = the style picked among the proposed ones, 0-based)
regenerate_moodboard
{ "note"?: string }
redo_typecard
{ "note"?: string }
redo_board
{ "index": 1 | 2 | 3 | 4 }
Casting
casting6
approve_castingchemin
{} — keeps the drawn casting and writes the script with it
do_casting
{} — does the casting the server skipped on this content: the script is rewritten with it, the shots redrawn
set_cast_fieldconfirmation
{ "id": "<casting element id>", "fields": { … } } — free edit of the fiche, no drawing; keys: "name", character ["age","hair","outfit","accessories","signature"], place ["materials","light","never"]. e.g. « Joe s'appelle Gino » → { "id": "joe", "fields": { "name": "Gino" } }; "redraw": true also draws the element again from the edited fiche (one image, in the same run)
add_cast
{ "name": string, "kind": "character" | "place" | "object", "description": "the person's words" } — one new element, drawn once
remove_castconfirmation
{ "id": "<casting element id>" } — the element leaves the casting (free before the validation; after it, the scenes that showed it are redrawn)
redraw_cast_unitconfirmation
{ "unit": "character-<id>" | "place-<id>" | "objects", "note"?: "the person's instruction word for word (« brune, mate de peau »): the look is rewritten from it before drawing; without note the same look is drawn again" } — then offer recast_plans: the scenes keep the old look until their plans are redrawn — WITH A CASTING (the Casting card): { "id": "<casting element id>", "note"?: "the person's instruction word for word" } — e.g. « Refais Joe plus jeune » → { "id": "joe", "note": "plus jeune" }; without note the element is drawn again from its fiche. After the validation the scenes showing it are redrawn too.
Script
script16
approve_scriptcheminestimation
{} (the SHOOT, paid: films every scene of the reel — only when the person asks to film / tourner / lancer le reel; validating the script or going to the voice is open_voice)
open_voicechemin
{} (the script is validated: on to picking and hearing the voice-over, free)
change_narrationconfirmation
{ "mode": string, "settings"?: object } — same ids as choose_narration (the current id to change only its settings). "settings" (optional): { "titles": boolean (words painted on the pictures), "cta": boolean (the film ends on a call to action), "ctaText": string (its exact words, 60 characters at most; empty = written from the site) }. Only while the script is read (before the shoot): the script is written again for that narration and those settings, its voice and plans redone; the casting stays.
change_optionsconfirmation
{ "titles": boolean (words painted on the pictures), "logo": "never" | "end" | "corner", "cta": boolean (the film ends on a call to action), "ctaText": string (its exact words, 60 characters at most; empty = written from the site) } — Style flow, while the script is read (before the shoot): the logo end/corner is saved as it is (free); titles, the call to action or the logo to/from "never" rewrite the script (its voice and plans redone).
{ "shotId": number, "kind": "whip"|"through"|"match-action"|"match-shape"|"pass-lens"|"focus"|"crane", "prompt"?: "one English sentence naming the concrete element (the object the camera dives into, the gesture that carries on)" } (free: how the camera passes from this scene to the next, filmed in the clip; « fais un filé entre la 3 et la 4 » = shotId 3, kind whip; then offer redo_clip when that clip is already filmed)
sketch_scenes
{ "shotIds"?: number[] } (the scenes whose plan is missing or out of date; all of them when absent)
set_pronunciations
{ "list": [{ "word": string (one word, as written), "say": string (how the voice must say it) }] } (saved on the brand; the phrases it touches are read again, free)
set_scene_pronunciation
{ "phraseId": number, "word": string (one word of that phrase, as written), "say": string (how to say it; "" removes it) } (that scene only, re-read free; for every scene use set_pronunciations)
toggle_sfx
{ "on": boolean }
redo_sfx
{ "note"?: string }
remove_sfx_cue
{ "cueId": string ("sfx-N") } (before the shoot; after it, the montage removes a cue)
recast_plans
{}
Voix off
voix3
open_qualitychemin
{} (the voice is ready: on to choosing the video quality, free; only for a content that has the quality step)
pick_voicechemin
{ "voiceId": string, "ownerId"?: string (library voice), "name"?: string, "speaker"?: "a" | "b" (a two-voice script: whose voice, default a), "read"?: boolean (false = only select it, make_voice reads it later; default true) } (then the voice-over is read with it, free; on a finished reel it is re-cut on the new voice, free)
make_voice
{} (reads the missing phrases again with the current voice, e.g. after a phrase edit; free)
Qualité
qualite1
choose_qualitychemin
{ "id": string } — the video quality, free: h3-768, h3-2k, sd2-720, sd2-1080 or sd25-1080 when nobody speaks on camera; omni-1080 when someone does. The price of the shoot follows it.
Tournage
tournage7
redo_scene
{ "shotId": number (1 to the scene count), "note"?: string, "refs"?: ["c_…" ids from context.media, 3 at most — the pictures the scene must be drawn from; [] takes them off; leave it out to keep the ones the scene has] }
redo_scenes
{ "scenes": [{ "shotId": number, "note"?: string, "refs"?: ["c_…" ids from context.media, 3 at most — the pictures the scene must be drawn from; [] takes them off; leave it out to keep the ones the scene has] }] } — several scenes redone at once, one price
redo_clip
{ "shotId": number (1 to the scene count) }
retry_task
{ "taskId": string } — a failed task from context.tasks, tried again
redo_clips
{}
add_landscape
{}
refilm_missing
{}
Son
son5
pick_musicchemin
{ "candidateId": string }
set_voice
{ "voiceId": string }
new_music_candidates
{}
rewrite_music_briefs
{ "note"?: string }
set_caption_style
{ "style": "karaoke"|"pop"|"clean"|"none", "layout"?: { "font": "inter"|"inter-heavy"|"inter-light"|null, "scale": 0.6-1.6, "y": 15-95 (bas du texte, % depuis le haut)|null } }
Reel
reel6
open_exportchemin
{} (the montage is fine: on to the export step — downloads, captions, other language or format; free)
edit_montage
{ "phrasePadSec"?: { [phraseId]: seconds -0.3..1.5 | null }, "musicGainOffsetDb"?: -12..6 | null, "effectsGainOffsetDb"?: -20..6 | null (every sound effect and the sound of the clips at once), "captions"?: { [phraseId]: { "text"?: same word count, "highlight"?: word } | null }, "sfx"?: { [cueId]: { "anchor"?: "in"|"mid"|"out", "offsetSec"?: -0.5..0.5, "gainDb"?: -14..0, "removed"?: boolean } | null }, "cuts"?: { [shotId]: { "splits"?: seconds from the scene start[], "removed"?: [from, to][] (pieces taken out of the reel) } | null }, "wholeClips"?: true | false | null (true: every clip whole at its own speed, nothing cut, only the voice laid on the titles, the reel may pass 30 s; false: clips fitted to the voice; null: the reel default, context.wholeClipsDefault) }
export_clean
{}
write_post
{ "note"?: string }
open_montage
{} (back from the export to the montage step, to adjust scene lengths, music, captions or effects; free)
rerender
{}
À toutes les étapes
3
forget_constraint
{ "id": string } — a constraint id from context.constraints
Cinq actions répondent 400 not_in_api : elles demandent un envoi de fichier, ou dépenseraient sans devis. Envoie la personne sur webUrl.
Action
Pourquoi
set_mode
Le mode turbo enchaîne les étapes payantes sans devis.
edit_scene
Retouche d'une scène avec images envoyées.
revert_scene_edit
Annule une retouche faite sur le site.
set_cast_photo
Envoi d'une photo pour un personnage.
derive_reel
Déclinaison d'un contenu, prévue en v2.
400 bad_action
{
"error": "Action inconnue : les noms valides sont dans « validActions » ; celles de l'étape en cours sont dans GET /api/v1/contents/:id (« actions »).",
"code": "bad_action",
"validActions": [
"add_cast",
"add_landscape",
"approve_casting",
"…"
]
}
Une IA sans terminal ne peut pas donner à la personne une URL qui demande un en-tête Bearer. Chaque aperçu porte donc un shareUrl, et le film un shareUrl et un downloadUrl.
Ils s'ouvrent dans n'importe quel navigateur, sans clé, pendant 24 heures (linkExpiresInSec: 86400).
Chacun ouvre un seul fichier d'un seul contenu, et ne contient ni la clé ni une session.
Ils sont signés par la clé qui a lu l'état : révoquer la clé ou changer de mot de passe les coupe aussitôt.
Expiré : 404 link_invalid. Relis l'état pour en obtenir des neufs.
Le film accepte les requêtes Range : on peut le lire et avancer dedans directement.
Lire une marque prend quelques secondes, dessiner des styles une à deux minutes, tourner 15 à 20 minutes. Plutôt que d'appeler en boucle, demande à l'API d'attendre pour toi.
?waitSec=25 tient la requête jusqu'à 25 secondes et répond dès que quelque chose change : étape, tâche, image, clip, voix, film, erreur.
L'en-tête x-adkix-waited dit changed ou timeout. Dans les deux cas, enchaîne simplement l'appel suivant.
Sans waitSec, respecte pollAfterSec : 10 secondes quand busy est rempli, 30 sinon.
Une requête de 25 s tient dans les 45 s d'une Action ChatGPT et dans le délai d'un outil MCP.
Pendant le tournage, donne des nouvelles à la personne (progress.label, progress.pct) au lieu de la faire attendre en silence.
Une erreur a toujours un corps JSON { error, code } : error est une phrase en français qu'on peut montrer, code est stable et sert au code. Certains codes ajoutent un champ.
adkix/
├── SKILL.md # quand l'utiliser, la boucle, les règles de prix
├── reference/*.md # étapes, actions, erreurs, détails de l'API
└── scripts/adkix.py # petit client : clé lue sans jamais l'afficher
Actions, Créer une action, Importer depuis une URL : https://adkix.ai/api/v1/openapi.json?profile=gpt.
Authentification : Clé API, type Bearer, colle ta clé.
Enregistre le GPT en mode « Moi uniquement » : il agit avec ta clé.
Le profil gpt ne garde que les opérations JSON. confirmQuote y est marquée conséquente : ChatGPT te demande toujours avant de dépenser. Les images et le film s'ouvrent par leurs liens signés. Le pas à pas complet est dans /connect/chatgpt/README.md.
Importer depuis une URL
https://adkix.ai/api/v1/openapi.json?profile=gpt
Connecteurs web
Les connecteurs de claude.ai et de ChatGPT sur le web demandent OAuth, pas encore disponible. Utilise le skill ou le GPT en attendant.
Codex découvre les skills rangés dans ~/.codex/skills/<nom>/SKILL.md : la même commande d'installation fonctionne. Cursor, Codex et VS Code peuvent aussi parler à adkix par le serveur MCP.
Installer dans Codex
codex"Installe ce skill dans ~/.codex/skills/adkix/SKILL.md : https://adkix.ai/connect/adkix.md"
Un serveur Model Context Protocol en Streamable HTTP, sans état, à l'adresse https://adkix.ai/api/mcp. Deux façons d'entrer : la connexion OAuth (ton assistant ouvre une page adkix, tu acceptes, rien à copier) ou ta clé dans l'en-tête Authorization.
Versions du protocole : 2025-11-25, 2025-06-18 et 2025-03-26. POST seulement (GET répond 405).
Le serveur envoie ses consignes (instructions) à l'initialisation : ton IA connaît les règles de prix d'emblée.
Une page web d'une autre origine qu'adkix.ai reçoit 403.
Mêmes limites et mêmes devis que l'API REST.
Outil
Rôle
adkix_get_account
Compte, solde, vidéo de bienvenue (getAccount).
adkix_list_contents
Les 50 derniers contenus (listContents).
adkix_create_content
Nouveau contenu depuis un site, un @compte ou une idée (createContent).
adkix_get_content
L'état, avec waitSec pour attendre un changement (getContent).
adkix_view_preview
Regarde un aperçu (file: frames/3, moodboard/option-2) : renvoyé en image MCP (JPEG, 1024 px max), ton IA peut le décrire.
adkix_run_action
Une action de l'étape ; les payantes renvoient un devis (runAction).
adkix_confirm_quote
Accepte un devis après le oui de la personne (confirmQuote). Annoté destructiveHint : le client demande la permission.
La dernière livraison : lastDelivery { at, event, http, ok, error? }.
5 adresses au plus par compte (sinon 409 too_many_webhooks), https publique seulement (sinon 400 bad_webhook). Sans events, tous les événements.
Un webhook appartient à la clé qui l'a créé : la révoquer arrête ses livraisons.
Un événement part environ 3 secondes après que le contenu s'est posé, une fois par changement ; il repart si la même étape revient avec un contenu neuf.
Événement
Quand
content.step_ready
Une étape attend la personne (choisir un angle, valider le script…).
content.quote_pending
Un prix attend un oui ; data.quote porte proposalId, action et price.
Chaque livraison (User-Agent adkix-webhooks/1.0) porte Adkix-Event-Id, Adkix-Event-Type et Adkix-Signature: t=<secondes unix>,v1=<hex>, où v1 est le HMAC-SHA256 de "<t>.<corps brut>" avec ton secret.
Lis le corps brut, avant tout parsing JSON.
Recalcule le HMAC et compare-le en temps constant.
3 tentatives : tout de suite, après 1 minute, après 10 minutes. Délai de 10 secondes par tentative ; toute réponse 2xx vaut livraison, et les redirections ne sont pas suivies. Réponds vite et traite ensuite.
Le serveur MCP accepte OAuth 2.1 (PKCE S256, inscription dynamique) : Claude, ChatGPT ou Codex se connectent avec la seule adresse https://adkix.ai/api/mcp, sans copier de clé.
adkix est inscrit au registre MCP officiel sous le nom ai.adkix/adkix.
Liens signés, attente longue, OpenAPI
Liens signés 24 h (shareUrl, downloadUrl) sur chaque aperçu et sur le film.
waitSec sur getContent (jusqu'à 25 s) et en-tête x-adkix-waited.
Route POST /contents/{id}/confirm pour accepter un devis.
Spécification OpenAPI 3.1 publique, profil gpt pour les Actions.
Serveur MCP et webhooks en bêta, sur activation.
Skill Claude v3 (dossier complet) et kit GPT pour ChatGPT.
API v1
Clés personnelles adk_live_…
Contenus : créer, lister, lire l'état.
Actions de chaque étape, mêmes noms que l'assistant du site.
Une question, un bug, une intégration qui coince : écris à [email protected]. On répond en français, en anglais ou en espagnol, en général sous 24 h ouvrées.
Donne l'id du contenu (contentId) et l'heure de l'appel : on retrouve tout de suite le journal.
Les connexions de tes assistants (Claude, ChatGPT…) se voient et se coupent dans « Applications connectées », sur ton compte.