# Make Agent Fast documentation (fr)
---
# Journal des modifications
Source: /fr/docs/account/changelog.md
{/* docs-visuals */}
## 2026-08-27 [#2026-08-27]
* Documentation du lancement d'un agent à partir d'une URL : attente pendant la génération, **Review & publish**, **Approve & publish**, et activation dès la première conversation ou le premier lead d'un visiteur.
* Documentation de l'option d'apparence **Use website** par rapport à Light/Dark, et du fait que l'enregistrement de l'apparence met à jour l'intégration en direct (ainsi que les éventuelles pages hébergées restantes) sans nouvelle publication.
* Alignement des extraits d'intégration sur les attributs actuels de `embed.js` et sur le paramètre anti-cache `?v=` du tableau de bord.
* Documentation de la conversation vocale en direct dans le testeur de la plateforme par rapport au site publié et à l'intégration.
* Suppression du domaine personnalisé, de l'achat de domaine et des paramètres de sous-domaine en tant que fonctionnalités du produit. Intégrez l'agent sur le site web existant de votre client. Les événements résiduels liés au module complémentaire de domaine Polar restent ignorés ou annulés.
## 2026-07-28 [#2026-07-28]
* Simplification de l'historique d'utilisation : il affiche désormais les crédits finalement consommés au lieu de lignes distinctes de réservation et de remboursement ; les très faibles consommations s'affichent sous la forme `<0.001`.
* Les coins de la sélection dans le menu d'actions de la documentation s'adaptent désormais aux contenus multilignes, tout en conservant une géométrie identique entre le déclencheur et l'enveloppe du menu.
* Enrichissement des guides en anglais, en coréen et en ouzbek : facturation des appels en direct, saisie de médias dans le créateur visuel, modifications du sous-domaine hébergé, contrôles de confidentialité et de sécurité du compte, et flux d'événements des notifications.
## 2026-07-15 [#2026-07-15]
* Lancement de la plateforme de documentation bilingue de Make Agent Fast.
* Ajout, pour chaque page, du Markdown, des téléchargements, de la recherche et des actions ChatGPT et Claude.
* Ajout de `/docs/llms.txt`, de `/docs/llms-full.txt` et des routes `.md` canoniques.
* Documentation de l'API publique, du contrat du SDK, des webhooks, des intégrations, des connecteurs, de l'exploitation, de la tarification, de la sécurité et de la confidentialité.
* Ajout de guides de mise en œuvre pour les principaux frameworks et créateurs de sites web.
## Politique de versionnement [#politique-de-versionnement]
Les corrections de la documentation et les ajouts de champs à l'API peuvent être publiés en continu. Toute modification majeure de l'API publique nécessite un nouveau chemin majeur ou une période de migration documentée.
---
# Offres et tarifs
Source: /fr/docs/account/pricing.md
{/* docs-visuals */}
## Comparatif des offres [#comparatif-des-offres]
| Offre | Facturation mensuelle | Total annuel | Crédits mensuels | Agents | Voix en direct | Badge de marque |
| ------- | --------------------: | -----------: | ---------------: | -----------------------------------------: | -------------: | --------------- |
| Launch | 15 $/mois | 144 $/an | 1000 | 1 | Non incluse | Obligatoire |
| Operate | 35 $/mois | 336 $/an | 3000 | 3 | 30 min/mois | Amovible |
| Scale | 79 $/mois | 758 $/an | 8000 | Illimité, sous réserve d'usage raisonnable | 90 min/mois | Amovible |
La facturation annuelle revient à 20 % de moins que douze paiements au tarif mensuel. Launch et Operate commencent par un essai gratuit de sept jours, sans carte bancaire ; ajoutez une carte après le jour 7 pour que l'agent reste en ligne. Scale est facturée dès le départ et ne comporte pas d'essai. Lorsqu'une carte est requise, la page de paiement affiche le prix exact, la période de renouvellement, les taxes et les conditions avant l'achat.
Launch vous donne un agent intégré opérationnel dès cette semaine. Operate est l'étape suivante lorsque vos clients commencent réellement à échanger : voix en direct, widget plus complet et canaux de messagerie. Scale est le studio complet : tous les contrôles Look, des rôles pour l'équipe et vos propres clés de fournisseur.
## Échelle des fonctionnalités [#échelle-des-fonctionnalités]
| Fonctionnalité | Launch | Operate | Scale |
| --------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------- |
| Agents | 1 | 3 | Illimité, sous réserve d'usage raisonnable |
| Studio du widget | Couleur d'accent, position, clair/sombre | + libellé du lanceur, préréglages, couleurs supplémentaires | Tous les contrôles (rayon, ombre, bordure, police, effet verre) |
| Langues de la voix | 1 | 2 | Toutes les langues prises en charge |
| Ingestion des connaissances | Texte collé, URL, fichiers | + YouTube, podcast, RSS | Identique à Operate |
| Canaux de messagerie | Les connexions existantes continuent de fonctionner | Nouvelles connexions | Nouvelles connexions |
| Clés personnelles (BYOK) | Les clés existantes continuent de fonctionner | Les clés existantes continuent de fonctionner | Enregistrement de nouvelles clés |
| Invitations d'équipe | Les membres existants restent | Les membres existants restent | Nouvelles invitations avec rôles |
Nous ne vendons ni ne rattachons de noms de domaine à nos clients. Intégrez l'agent sur le site web que vous possédez déjà.
## Inclus dans toutes les offres [#inclus-dans-toutes-les-offres]
Toutes les offres actuelles comprennent :
* Une intégration sur le site web que vous possédez déjà (`embed.js` + `data-agent`).
* Le chat textuel, les messages vocaux, les voix prédéfinies, la recherche dans les connaissances, les FAQ et produits structurés, ainsi que la capture de leads.
* L'intégration sur un site web avec contrôle précis des origines autorisées.
* L'accès à l'API publique avec des clés à portée limitée, OAuth pour les applications validées, OpenAPI et des limites de débit proportionnelles à l'offre.
* Les statistiques, les conversations, le suivi de l'utilisation et la possibilité d'acheter des packs de crédits.
Le quota de l'API publique est de 120 requêtes par clé d'API et par minute pour Launch, 600 pour Operate et 1 800 pour Scale. Ces limites de requêtes ne remplacent pas les droits liés aux ressources, les vérifications de crédits, l'idempotence ni les limites propres aux fournisseurs. Consultez [Limites de débit](/fr/docs/api/rate-limits).
## Comprendre les crédits [#comprendre-les-crédits]
Les crédits servent à payer les tâches d'IA mesurées, telles que la génération, les tours de l'agent, les embeddings des connaissances, la transcription et la synthèse vocale. Ils ne correspondent pas à un nombre fixe de messages : le fournisseur, le modèle, la longueur des entrées et des sorties, la durée des médias et le type d'opération font varier le coût.
Les crédits mensuels de l'offre sont renouvelés à chaque période de facturation. Le solde mensuel inutilisé est reporté pour un cycle supplémentaire, puis expire. Les crédits de recharge achetés n'expirent pas tant qu'un abonnement est actif. Un solde de crédits positif ne débloque pas une fonctionnalité réservée à certaines offres, comme les appels en direct, les sites supplémentaires ou la suppression du badge.
Les clés de fournisseur personnelles (BYOK) entraînent des frais distincts facturés par OpenRouter (texte) ou Speko (voix), les deux fournisseurs pour lesquels une nouvelle clé peut être ajoutée ; les anciennes clés de fournisseurs directs déjà enregistrées continuent de fonctionner jusqu'à leur révocation. L'enregistrement d'une clé est réservé à Scale. Avec votre propre clé, chaque action coûte des frais de plateforme forfaitaires (1 crédit par réponse de chat) au lieu d'une facturation basée sur les tokens. Le BYOK ne convertit pas les factures des fournisseurs en crédits Make Agent Fast et ne supprime pas les vérifications de droits de la plateforme. Consultez [Clés de fournisseur d'IA](/fr/docs/account/provider-keys).
## Droits liés à la voix [#droits-liés-à-la-voix]
Les messages vocaux sont inclus dans toutes les offres, mais leur transcription, leur modèle et leur synthèse vocale peuvent consommer des crédits. La voix en temps réel en direct utilise un quota mensuel de minutes distinct : aucune sur Launch, 30 minutes sur Operate et 90 minutes sur Scale.
## Agents et marque [#agents-et-marque]
Launch prend en charge un agent destiné aux clients, et Operate jusqu'à trois. La description « agents illimités » de Scale est soumise à un usage raisonnable : elle n'autorise pas la création abusive ou automatisée d'un volume de tenants. Un agent comprend ses connaissances, sa configuration d'intégration, ses connecteurs, ses statistiques et ses données de conversation. Chaque agent dispose d'un Agent link, une page de chat publique hébergée sur son propre sous-domaine. Les anciennes pages de démonstration hébergées continuent de s'afficher sur des sous-domaines ; les nouveaux agents n'obtiennent pas de page marketing hébergée.
Le badge de parrainage « Made with Make Agent Fast » reste affiché sur Launch. Les owners des offres Operate et Scale peuvent le retirer des sites publiés éligibles.
## Packs de crédits [#packs-de-crédits]
| Achat | Prix | Effet |
| ---------- | ---------------: | ------------------------------------------------------------------------ |
| Petit pack | 8 $ en une fois | Ajoute 1000 crédits qui n'expirent pas tant que l'abonnement est actif |
| Pack moyen | 35 $ en une fois | Ajoute 5000 crédits qui n'expirent pas tant que l'abonnement est actif |
| Grand pack | 90 $ en une fois | Ajoute 15 000 crédits qui n'expirent pas tant que l'abonnement est actif |
Les recharges ajoutent uniquement de la capacité d'utilisation. Elles n'augmentent ni le nombre de sites, ni les limites de requêtes de l'API, ni les minutes en direct, ni les droits liés à la marque.
## Essais, renouvellement et résiliation [#essais-renouvellement-et-résiliation]
L'essai gratuit de Launch et Operate ne se convertit pas automatiquement : au jour 7, l'agent est mis en pause jusqu'à ce que vous ajoutiez une carte. Une fois une carte enregistrée, une résiliation ou un échec de renouvellement peut entraîner la suppression de l'accès actif après la période ou la transition de statut applicable chez le fournisseur. Les intégrations, les connecteurs, les clients API et les appels vocaux peuvent s'arrêter, même si les données enregistrées de l'espace de travail sont conservées.
## Choisir une offre [#choisir-une-offre]
* Choisissez **Launch** pour un agent intégré avec chat textuel, messages vocaux et widget de base.
* Choisissez **Operate** lorsque vos clients commencent à échanger : appels en direct, canaux de messagerie, widget personnalisé, voix en deux langues ou suppression du badge.
* Choisissez **Scale** lorsque plusieurs agents sont en production : tous les contrôles du widget, la voix dans toutes les langues prises en charge, des rôles pour l'équipe et vos propres clés d'API.
Faites vos estimations à partir de véritables tests d'acceptation, plutôt qu'en vous basant uniquement sur le nombre de messages. Publiez un agent représentatif, mesurez l'utilisation du texte, de la voix et des connaissances, puis projetez le trafic et prévoyez une marge pour les nouvelles tentatives, les connecteurs, l'automatisation et les pics de lancement.
## Source de référence pour la facturation [#source-de-référence-pour-la-facturation]
La page de paiement en direct et le tableau de bord de facturation font foi pour un achat donné. Les taxes, l'affichage de la devise, les moyens de paiement, l'éligibilité à l'essai et la formulation du fournisseur peuvent varier selon le lieu et l'état du compte. Si la page de paiement diffère de cette page, arrêtez-vous et appliquez les conditions de la page de paiement, ou contactez le support avant de payer.
---
# Confidentialité et données
Source: /fr/docs/account/privacy.md
{/* docs-visuals */}
Le propriétaire du site décide quelles connaissances, quelles saisies de visiteurs et quelles intégrations sont utilisées pour son expérience. Make Agent Fast traite les données de la plateforme afin de fournir le service, conformément aux conditions applicables et à l'avis de confidentialité.
## Mention destinée aux visiteurs [#mention-destinée-aux-visiteurs]
Expliquez l'utilisation de l'IA, l'enregistrement, la collecte de leads, les analyses et le suivi dans un langage adapté à l'expérience proposée et aux exigences locales. Ne demandez pas à l'agent de collecter des données dont vous n'avez pas besoin.
## Cycle de vie des données [#cycle-de-vie-des-données]
La suppression d'une source n'affecte que les recherches futures. La suppression d'un identifiant coupe l'accès autorisé. Les conversations passées, les exports, les données des canaux externes et les enregistrements des fournisseurs peuvent avoir des règles de conservation distinctes.
## Contrôles du propriétaire [#contrôles-du-propriétaire]
La page **Analytique** du site permet d'exporter les leads collectés au format JSON et de supprimer un lead individuel. Les rapports d'analyse peuvent également être exportés au format Markdown, Excel ou dans une vue d'impression/PDF. Un export crée une nouvelle copie que vous contrôlez ; la suppression de l'enregistrement sur la plateforme n'efface pas un téléchargement antérieur, une conversation associée, un enregistrement chez un fournisseur externe ni des données conservées en vertu d'une obligation légale.
Utilisez les **Paramètres du compte** pour déconnecter tous les appareils ou supprimer définitivement le compte. La suppression du compte tente d'abord d'arrêter l'abonnement à la plateforme, les abonnements complémentaires de domaine Polar restants et les ressources des connecteurs, puis supprime les sites, agents, connaissances, conversations, leads, identifiants API/OAuth, sessions et l'historique de facturation stocké localement du compte. Si l'arrêt de la facturation externe ne peut pas être confirmé, la suppression échoue par mesure de sécurité et laisse le compte intact afin de permettre une nouvelle tentative en toute sécurité ou un examen par le support.
## Demandes [#demandes]
Utilisez les contrôles en libre-service lorsqu'ils correspondent à la demande. Pour une demande plus large d'accès, de rectification, d'export ou de suppression, contactez le support du compte et suivez la procédure décrite dans la Politique de confidentialité en vigueur. Vérifiez l'identité du demandeur avant de divulguer des données du compte, et incluez les exports en aval et les fournisseurs externes dans votre plan de réponse.
---
# Clés de fournisseurs d'IA
Source: /fr/docs/account/provider-keys.md
{/* docs-visuals */}
Le principe « apportez votre propre clé » (BYOK) permet aux requêtes d'IA prises en charge d'utiliser votre compte auprès du fournisseur d'IA. Vous n'avez pas besoin de clé : la plateforme fournit les modèles par défaut. L'enregistrement d'une clé nécessite le plan Scale. Les clés déjà enregistrées continuent de fonctionner sur Launch et Operate. Vous payez toujours le plan Make Agent Fast ainsi que des frais de plateforme forfaitaires par action ; le fournisseur facture directement l'utilisation de ses modèles à votre compte.
## Fournisseurs pris en charge [#fournisseurs-pris-en-charge]
De nouvelles clés ne peuvent être ajoutées que pour deux fournisseurs, l'un pour le texte et l'autre pour la voix :
| Fournisseur | Utilisation | Créer ou consulter une clé |
| ----------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------- |
| OpenRouter | Génération de texte de l'agent via les modèles vers lesquels OpenRouter route les requêtes | [Clés API OpenRouter](https://openrouter.ai/keys) |
| Speko | Reconnaissance vocale (speech-to-text) et synthèse vocale (text-to-speech) | [Plateforme Speko](https://platform.speko.ai) |
### Clés héritées [#clés-héritées]
Les clés directes des fournisseurs enregistrées avant le passage à OpenRouter et Speko apparaissent sous **Clés héritées**. Elles continuent de fonctionner jusqu'à ce que vous les révoquiez, et vous pouvez toujours les révoquer, mais vous ne pouvez plus en ajouter ni en remplacer :
| Fournisseur hérité | Utilisation | Référence du fournisseur |
| ----------------------------------------------- | ----------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Anthropic, OpenAI, Google Gemini, xAI, DeepSeek | Génération de texte de l'agent | [Documentation de l'API Anthropic](https://platform.claude.com/docs/en/api/overview), [Démarrage rapide de l'API OpenAI](https://developers.openai.com/api/docs/quickstart), [Clés API Gemini](https://ai.google.dev/gemini-api/docs/api-key) |
| Deepgram | Reconnaissance vocale lorsque Deepgram est le fournisseur STT configuré | [Clés API Deepgram](https://developers.deepgram.com/docs/create-additional-api-keys) |
| ElevenLabs | Synthèse vocale lorsque ElevenLabs est configuré | [Authentification ElevenLabs](https://elevenlabs.io/docs/api-reference/authentication) |
La disponibilité des fournisseurs dépend également des fournisseurs de texte, de voix et de temps réel configurés sur la plateforme. L'enregistrement d'une clé valide n'oblige pas chaque fonctionnalité à utiliser ce fournisseur.
Une clé de fournisseur autorise les facturations et les appels de modèles chez le fournisseur d'IA externe. Une clé `maf_live_...` autorise votre logiciel à appeler l'API publique de Make Agent Fast. Ne collez jamais l'une dans le champ de l'autre.
## Ajouter une clé de fournisseur [#ajouter-une-clé-de-fournisseur]
1. Créez une clé dans la console OpenRouter ou Speko et activez la facturation du fournisseur ou une limite de dépenses si nécessaire.
2. Ouvrez **Tableau de bord → Paramètres → Clés de fournisseurs d'IA**. Seul le propriétaire de la facturation d'un espace de travail Scale peut enregistrer une clé.
3. Collez la clé dans la carte **OpenRouter** ou **Speko**.
4. Sélectionnez **Tester et enregistrer**.
5. Attendez le résultat de la validation, puis testez la fonctionnalité qui utilise le fournisseur.
Make Agent Fast effectue une requête de validation en direct avant d'enregistrer une clé ; aucun jeton de modèle ni crédit de la plateforme n'est consommé. La clé ne doit contenir ni espaces ni sauts de ligne et doit comporter entre 16 et 512 caractères. Les clés OpenRouter doivent commencer par `sk-or-` ; les clés Speko doivent commencer par `sk_speko_` ou `sk_live_`. La validation en direct fait foi.
L'enregistrement d'une autre clé fonctionnelle pour le même fournisseur remplace la valeur précédemment stockée. Une clé qui échoue à la validation n'est pas enregistrée ; la clé déjà en place continue donc de fonctionner. Le tableau de bord ne conserve que des données d'identification sûres, telles que les quatre derniers caractères, la date de validation et l'état.
## Fonctionnement de la sélection du fournisseur de texte [#fonctionnement-de-la-sélection-du-fournisseur-de-texte]
Pour la génération de texte, une clé OpenRouter active est prioritaire. À défaut, Make Agent Fast recherche une clé héritée active correspondant au fournisseur de texte configuré sur la plateforme, puis les autres clés de texte héritées (Anthropic, OpenAI, Gemini, xAI, DeepSeek) dans cet ordre. Si aucune clé BYOK adaptée n'existe, il utilise le fournisseur de la plateforme lorsque le plan et le déploiement le permettent.
Les clés de voix sont propres à chaque fournisseur. Une clé Speko est utilisée lorsque la voix passe par Speko. Une clé Deepgram héritée n'est utilisée que lorsque le fournisseur de reconnaissance vocale actif est Deepgram ; une clé ElevenLabs héritée n'est utilisée que lorsque la synthèse vocale est configurée sur ElevenLabs.
Les clés BYOK ne remplacent pas pour l'instant les identifiants d'embeddings de connaissances de la plateforme. L'ingestion et la récupération des connaissances continuent d'utiliser le fournisseur d'embeddings configuré pour le déploiement.
## Facturation et crédits [#facturation-et-crédits]
* Le fournisseur externe facture la consommation de jetons d'IA au compte qui a émis la clé.
* Make Agent Fast facture toujours l'abonnement ainsi que des frais de plateforme forfaitaires pour chaque action exécutée avec votre clé : 1 crédit par réponse de chat, au lieu de la facturation basée sur les jetons. Ces frais couvrent la récupération, l'orchestration et l'hébergement autour de l'appel, et ne représentent pas un pourcentage de votre facture de jetons.
* Les frais s'appliquent à chaque appel au fournisseur. Les étapes vocales financées par la plateforme (par exemple, la transcription lorsque vous n'avez qu'une clé de texte) sont facturées au tarif normal, et les appels en direct utilisent toujours le tarif de la plateforme.
* L'épuisement du quota du fournisseur peut faire échouer une requête même s'il reste des crédits Make Agent Fast.
Consultez à la fois **Utilisation et crédits** dans Make Agent Fast et le tableau de bord d'utilisation du fournisseur.
## États des clés et gestion des échecs [#états-des-clés-et-gestion-des-échecs]
| État | Signification | Que faire |
| --------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `active` | La validation en direct a réussi | Testez la fonctionnalité visée et surveillez l'utilisation côté fournisseur |
| `invalid` | Le fournisseur a rejeté la clé stockée par la suite | Vérifiez la facturation, les restrictions, le quota et l'état de révocation chez le fournisseur, puis enregistrez une clé de remplacement (OpenRouter ou Speko) |
| `revoked` | La clé est désactivée dans Make Agent Fast | Enregistrez une nouvelle clé OpenRouter ou Speko si la fonctionnalité doit continuer à utiliser le BYOK |
Si une requête échoue parce qu'un fournisseur rejette l'identifiant ou le quota, Make Agent Fast peut marquer la clé stockée comme invalide. Corriger la clé chez le fournisseur ne révèle ni ne réécrit le secret stocké ; pour une clé OpenRouter ou Speko, utilisez **Tester la connexion** pour la revérifier, ou enregistrez à nouveau la clé fonctionnelle. Une clé héritée devenue invalide ne peut pas être remplacée par une autre clé héritée : migrez plutôt ce fournisseur vers OpenRouter ou Speko.
## Renouveler une clé de fournisseur [#renouveler-une-clé-de-fournisseur]
1. Créez une nouvelle clé chez le fournisseur sans supprimer l'ancienne.
2. Enregistrez la nouvelle clé dans Make Agent Fast et vérifiez qu'elle devient active.
3. Testez le chat texte ou les messages vocaux, selon ce qui utilise ce fournisseur.
4. Révoquez l'ancienne clé dans la console du fournisseur.
5. Consultez les journaux du fournisseur pour détecter toute utilisation inattendue de l'ancienne clé.
Si une clé est exposée dans un système de gestion de versions ou dans du code navigateur, révoquez-la immédiatement chez le fournisseur. La supprimer uniquement de Make Agent Fast n'empêche pas une autre personne qui la détient de l'utiliser directement auprès du fournisseur.
---
# Sécurité
Source: /fr/docs/account/security.md
{/* docs-visuals */}
## Accès au compte [#accès-au-compte]
Utilisez un mot de passe unique, protégez la messagerie utilisée pour la récupération du compte, mettez fin aux sessions que vous ne reconnaissez pas et limitez l'accès aux sites de production.
Vérifiez l'adresse e-mail du compte à l'aide du lien envoyé après l'inscription. Les comptes avec mot de passe peuvent utiliser **Mot de passe oublié** sur la page de connexion ; une réinitialisation réussie révoque les sessions existantes. Les **Paramètres du compte** permettent de modifier un mot de passe local, de lier explicitement Google lorsque cette option est activée et de déconnecter tous les appareils. Les comptes OAuth uniquement n'ont pas de mot de passe local à modifier, et une connexion normale ne lie jamais silencieusement une nouvelle identité.
## Secrets [#secrets]
Les clés API, jetons de connecteur, secrets d'application, secrets de webhook et clés de fournisseur vocal sont des identifiants. Stockez-les dans un gestionnaire de secrets approuvé, jamais dans le code côté client, et renouvelez-les après toute exposition.
## Principe du moindre privilège [#principe-du-moindre-privilège]
Choisissez des portées d'API restreintes, des applications dédiées sur les plateformes externes, des origines d'embed précises et des clés distinctes pour chaque système. Supprimez les identifiants et les intégrations inutilisés.
## Contenu et confidentialité [#contenu-et-confidentialité]
Importez uniquement les données que l'agent est autorisé à utiliser. Testez les refus et les parcours d'escalade, et appliquez des règles de conservation aux exports de conversations et de leads.
## Signalement [#signalement]
Lorsque vous signalez une vulnérabilité présumée, indiquez l'URL ou le composant concerné, l'impact et les étapes de reproduction, sans accéder aux données d'autres utilisateurs.
---
# Dépannage
Source: /fr/docs/account/troubleshooting.md
{/* docs-visuals */}
## Commencez par un cas reproductible [#commencez-par-un-cas-reproductible]
Avant de modifier les paramètres, notez :
* L'espace de travail/le site, la route publique ou le point de terminaison de l'API, ainsi que l'heure exacte avec le fuseau horaire.
* Le résultat attendu et le résultat obtenu.
* Le navigateur/l'appareil ou le canal du fournisseur externe.
* Si le problème touche l'aperçu du owner, la page de démonstration hébergée résiduelle, l'intégration, le connecteur et/ou l'API.
* Le texte d'état/d'erreur sans risque, l'en-tête de réponse `x-request-id`, la dernière erreur du connecteur ou l'ID d'événement de livraison du fournisseur.
* La dernière heure de bon fonctionnement connue et la plus petite modification récente.
N'incluez pas d'identifiants d'API/de fournisseur/de connecteur en clair, de secrets de webhook, de données privées de customers, d'en-têtes d'autorisation complets ni de contenu de conversation superflu.
## Les modifications du site n'apparaissent pas [#les-modifications-du-site-napparaissent-pas]
1. Vérifiez que l'URL du tableau de bord correspond bien au site et à l'espace de travail prévus.
2. Vérifiez que l'action d'enregistrement a bien indiqué un succès.
3. Les instructions et les connaissances indexées s'appliquent aux nouvelles conversations sans nouvelle publication. Si le widget lui-même est masqué, réactivez-le depuis le menu **Mettre en ligne** de la page de l'agent → **Widget de site web** (ou depuis la carte **Sur votre site web** de l'onglet **Vue d'ensemble**).
4. Pour les paramètres d'**Affichage** (et le badge de marque), les modifications sont enregistrées automatiquement et actualisent déjà l'intégration en ligne : inutile de republier, ouvrez simplement une fenêtre de navigation privée.
5. Ouvrez une véritable intégration (ou un slug hébergé résiduel, si vous en avez encore un) dans une fenêtre de navigation privée.
6. Si seul un aperçu sur les réseaux sociaux est périmé, utilisez le cache/l'outil de débogage de cette plateforme.
Dépublier et modifier sont deux choses différentes. Un connecteur de messagerie connecté peut continuer à répondre même lorsque l'intégration est désactivée.
## La réponse de l'agent est faible ou erronée [#la-réponse-de-lagent-est-faible-ou-erronée]
Posez la même question dans le testeur du owner et dans une nouvelle conversation publique. Vérifiez que la source de connaissances concernée a été indexée, qu'elle contient une réponse explicite, qu'elle est à jour et qu'elle n'entre pas en conflit avec une autre source. Examinez les règles de langue/de persona pour détecter une limite qui empêcherait la réponse.
Lorsque la source ne contient pas de réponse, améliorez le comportement de repli/d'escalade plutôt que de demander à l'agent de deviner. Utilisez [Sources de connaissances](/fr/docs/build/knowledge) pour créer un jeu de validation avec des questions directes, des paraphrases et des cas limites.
## Le lanceur d'intégration est absent ou bloqué [#le-lanceur-dintégration-est-absent-ou-bloqué]
Vérifiez que le site est publié, que l'intégration est activée, que le script contient le slug exact du site et que l'origine parente finale du navigateur (schéma, nom d'hôte et port compris) figure dans la liste d'autorisation. Dans les DevTools, inspectez la requête `embed.js`, les erreurs CSP, l'état du gestionnaire de consentement, la requête de l'iframe et la présence d'une seule racine `data-maf-embed`.
Si le texte fonctionne mais pas le microphone, vérifiez le HTTPS, l'autorisation du navigateur, l'autorisation `allow` de l'iframe et la Permissions Policy de l'hôte. Suivez la [Présentation de l'intégration](/fr/docs/embed/overview) complète ainsi que [Sécurité et CSP](/fr/docs/embed/security).
## La voix ne fonctionne pas [#la-voix-ne-fonctionne-pas]
Distinguez le mode en échec : message vocal, appel en direct ou voix via un connecteur. Un parcours texte fonctionnel prouve uniquement que la clé du modèle de langage est valide.
Vérifiez séparément les clés des fournisseurs de transcription, de synthèse vocale (TTS) et de temps réel ; vérifiez ensuite les droits du forfait, le solde de credits, le quota de minutes en direct, l'autorisation du navigateur et les langues configurées. Testez un enregistrement court et clair avant d'étudier un fichier long ou bruité.
## Le connecteur ne reçoit aucun message [#le-connecteur-ne-reçoit-aucun-message]
Utilisez le guide du canal et comparez les deux côtés. Vérifiez que le connecteur est activé, que les identifiants sont toujours valides, que l'URL de webhook/d'interaction/de skill du fournisseur est bien l'URL actuelle, que l'événement/la Page/le numéro/le bloc requis est abonné, que le mode de l'application inclut l'utilisateur de test et que la livraison HTTPS publique fonctionne.
Le succès de la vérification du webhook ne prouve pas l'abonnement aux événements à l'exécution ni les autorisations d'envoi. Comparez les journaux de livraison du fournisseur avec **Dernier message** et l'erreur enregistrée du connecteur. Testez le texte avant la voix.
## Les domaines personnalisés ne sont pas proposés [#les-domaines-personnalisés-ne-sont-pas-proposés]
Nous ne vendons ni ne rattachons de domaines de customers. Placez l'agent sur le site que vous possédez déjà grâce à l'[intégration](/fr/docs/embed/overview). Les événements résiduels de module complémentaire de domaine Polar sont ignorés ou annulés et ne génèrent jamais de credits.
## La requête API échoue [#la-requête-api-échoue]
Notez la méthode, le chemin versionné, le statut, le code d'erreur stable, l'en-tête de réponse `x-request-id` et les en-têtes de limite de débit pertinents. Classez ensuite le problème :
| Statut | Action la plus probable |
| ------ | ------------------------------------------------------------------------------------------------------------------ |
| `400` | Corrigez la structure JSON/du formulaire ou les détails de validation ; ne réessayez pas à l'identique |
| `401` | Utilisez un identifiant MAF valide, non expiré et non révoqué ; n'utilisez jamais une clé de fournisseur |
| `403` | Ajoutez le scope requis ou rétablissez l'accès au forfait/à la ressource |
| `404` | Vérifiez que l'ID appartient à l'espace de travail authentifié et que le chemin est correct |
| `409` | Résolvez le conflit d'état ou rejouez la même clé d'idempotence/le même payload |
| `415` | Envoyez le type de contenu documenté |
| `429` | Respectez les en-têtes `retry-after`/de réinitialisation avec une part d'aléa (jitter) ; ne bouclez pas en continu |
| `500` | Réessayez une requête sûre/idempotente et conservez l'ID de requête et l'heure |
Consultez [Identifiants et jetons](/fr/docs/api/credentials), [Scopes et erreurs](/fr/docs/api/scopes-errors) et [Limites de débit](/fr/docs/api/rate-limits). Ne résolvez jamais une erreur d'API en déplaçant un identifiant serveur dans du code navigateur.
## La facturation ou l'utilisation semble incorrecte [#la-facturation-ou-lutilisation-semble-incorrecte]
Distinguez l'accès à la plateforme, les credits mensuels, les credits achetés, le nombre de sites, les minutes en direct, le débit de l'API, les canaux de messagerie (Operate+) et le BYOK/les team members (Scale). Une recharge ne modifie que les credits. Les frais du fournisseur BYOK sont distincts de la facturation de Make Agent Fast.
En cas d'utilisation inattendue, circonscrivez la source probable avant d'enquêter : désactivez un connecteur, révoquez une clé, supprimez une origine d'intégration involontaire ou arrêtez une boucle de nouvelles tentatives de l'API. Conservez la plage horaire et les ID de requête/de fournisseur sans exposer de secrets.
## Rassembler des informations sûres pour le support [#rassembler-des-informations-sûres-pour-le-support]
Si vous êtes toujours bloqué, utilisez le contrôle de feedback du guide le plus pertinent ou contactez le support depuis le tableau de bord en indiquant :
* L'identifiant du site/de l'espace de travail et la fonctionnalité concernée.
* L'horodatage exact avec le fuseau horaire et les étapes de reproduction.
* Le résultat attendu et le résultat obtenu.
* L'URL publique sans secret, le cas échéant.
* Le statut HTTP, le code d'erreur stable, le `x-request-id` ou l'ID d'événement du fournisseur.
* Une capture d'écran expurgée ou un payload minimal dont les secrets et les données personnelles ont été retirés.
Indiquez ce que vous avez déjà vérifié. Cela évite de répéter des conseils de configuration et permet de délimiter clairement la source de la défaillance.
---
# Authentification
Source: /fr/docs/api/authentication.md
{/* docs-visuals */}
Utilisez une clé API pour votre propre backend ou vos automatisations. Utilisez OAuth lorsque votre application demande à d'autres utilisateurs de Make Agent Fast de lui accorder un accès. Les deux types d'identifiants appellent les mêmes ressources `/api/v1` et respectent les mêmes portées, droits liés au forfait, isolation entre locataires et limites de débit.
## Clés API [#clés-api]
Un forfait payant actif est requis pour créer et utiliser une clé API publique.
1. Ouvrez **Dashboard → Settings → Developer**.
2. Saisissez un nom qui identifie le service et l'environnement, par exemple `Production lead export`.
3. Sélectionnez les portées minimales dont le service a besoin.
4. Choisissez une expiration : 30 jours, 90 jours, un an ou jamais.
5. Créez la clé et copiez immédiatement la valeur `maf_live_...`.
Make Agent Fast stocke un hachage SHA-256 plutôt qu'un texte en clair récupérable. Le tableau de bord affiche ensuite un préfixe sans risque, les portées, l'expiration, la date de dernière utilisation et l'état de révocation.
```http
Authorization: Bearer maf_live_...
```
Envoyez l'en-tête depuis du code serveur :
```bash
curl --fail-with-body https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
L'absence d'identifiants renvoie `401 authentication_required`. Une clé invalide, expirée ou révoquée renvoie `401 invalid_api_key`. Une clé dont le compte n'a plus de forfait payant actif renvoie `403 subscription_required`.
### Faire tourner ou révoquer une clé [#faire-tourner-ou-révoquer-une-clé]
Créez une clé de remplacement avant de révoquer l'ancienne. Déployez la nouvelle clé, effectuez une vraie requête, vérifiez son `x-request-id`, puis cliquez sur **Revoke** sur l'ancienne clé. La révocation est immédiate et irréversible.
Dans les paramètres **Developer**, **Edit** vous permet de modifier le nom et les portées d'une clé active ; la modification s'applique immédiatement à la même clé. Son expiration et son jeton ne peuvent pas être modifiés : créez une clé de remplacement pour obtenir une nouvelle expiration ou un jeton renouvelé.
## Applications OAuth [#applications-oauth]
OAuth est destiné aux logiciels qui se connectent à des comptes appartenant à d'autres utilisateurs de Make Agent Fast. Il utilise le flux Authorization Code avec PKCE (`S256`) et n'émet ni n'exige de secret client. L'identifiant client (client ID) est public ; les codes d'autorisation, les jetons d'accès, les jetons d'actualisation et le vérificateur PKCE sont sensibles.
### 1. Enregistrer l'application [#1-enregistrer-lapplication]
Ouvrez **Dashboard → Settings → Developer → OAuth applications**. Ajoutez :
* Un nom d'application de 2 à 100 caractères.
* Entre 1 et 10 URL de redirection exactes.
* Les portées maximales que votre application peut demander.
Les URL de redirection en production doivent utiliser HTTPS et ne peuvent contenir ni identifiants ni fragments. L'URI complète doit correspondre à une valeur enregistrée lors de l'autorisation et de l'échange du jeton. Les applications nouvellement soumises ont le statut `pending` ; l'autorisation ne fonctionne qu'une fois l'application examinée et marquée `approved`.
Le propriétaire de la plateforme examine les identifiants client en attente
grâce au workflow audité `oauth:review`. Conservez l'identifiant client
affiché après la soumission ; son statut est visible sur la page Developer, et
les applications rejetées incluent la décision de l'examen avant de pouvoir
être soumises à nouveau.
### 2. Générer les valeurs PKCE [#2-générer-les-valeurs-pkce]
Générez un nouveau vérificateur pour chaque tentative d'autorisation et conservez-le dans la même session protégée et de courte durée que `state`.
```ts
import { createHash, randomBytes } from "node:crypto";
const verifier = randomBytes(48).toString("base64url");
const challenge = createHash("sha256").update(verifier).digest("base64url");
const state = randomBytes(24).toString("base64url");
```
Le vérificateur doit contenir de 43 à 128 caractères PKCE compatibles avec les URL. Seul `code_challenge_method=S256` est accepté.
### 3. Rediriger l'utilisateur pour le consentement [#3-rediriger-lutilisateur-pour-le-consentement]
```text
https://makeagent.fast/oauth/authorize
?client_id=maf_app_...
&redirect_uri=https%3A%2F%2Fapp.example.com%2Foauth%2Fcallback
&response_type=code
&scope=sites%3Aread%20leads%3Aread
&state=RANDOM_STATE
&code_challenge=PKCE_CHALLENGE
&code_challenge_method=S256
```
L'utilisateur se connecte, examine les portées demandées, puis autorise ou refuse l'accès. En cas de succès, Make Agent Fast redirige vers l'URI enregistrée exacte avec `code` et le `state` d'origine. En cas de refus, il envoie `error=access_denied` ainsi que le `state` d'origine s'il a été fourni.
Rejetez le callback si `state` ne correspond pas exactement à la valeur stockée pour cette session de navigateur.
### 4. Échanger le code d'autorisation [#4-échanger-le-code-dautorisation]
Le code d'autorisation expire au bout de 10 minutes et ne peut être utilisé qu'une seule fois.
```bash
curl --fail-with-body https://makeagent.fast/api/oauth/token \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "client_id=maf_app_..." \
--data-urlencode "code=$AUTHORIZATION_CODE" \
--data-urlencode "redirect_uri=https://app.example.com/oauth/callback" \
--data-urlencode "code_verifier=$PKCE_VERIFIER"
```
```json
{
"access_token": "maf_live_...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "maf_refresh_...",
"scope": "sites:read leads:read"
}
```
Le jeton d'accès est valable une heure. Le jeton d'actualisation est valable jusqu'à 90 jours, sauf s'il est renouvelé ou révoqué plus tôt.
### 5. Renouveler le jeton d'actualisation [#5-renouveler-le-jeton-dactualisation]
Chaque actualisation réussie révoque à la fois le jeton d'actualisation soumis et son jeton d'accès précédent, puis renvoie une nouvelle paire. Enregistrez la nouvelle paire de manière atomique avant de supprimer l'état de la réponse précédente.
```bash
curl --fail-with-body https://makeagent.fast/api/oauth/token \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=refresh_token" \
--data-urlencode "client_id=maf_app_..." \
--data-urlencode "refresh_token=$REFRESH_TOKEN"
```
La réutilisation d'un code d'autorisation ou d'un jeton d'actualisation déjà renouvelé renvoie `invalid_grant`. Le point de terminaison de jeton OAuth renvoie des réponses de style OAuth `{ "error", "error_description" }` plutôt que l'enveloppe d'erreur de l'API publique, et autorise 30 requêtes de jeton par adresse IP d'appelant et par minute.
## N'authentifiez jamais les requêtes de gestion dans du code navigateur [#nauthentifiez-jamais-les-requêtes-de-gestion-dans-du-code-navigateur]
Ne placez jamais de clé API secrète, de jeton d'accès ou de jeton d'actualisation dans des composants client React, du JavaScript statique, du web mobile, Webflow, Framer, Wix ou du Liquid Shopify. Utilisez votre backend authentifié. L'intégration publique pour site web utilise un slug de site non secret et une liste d'origines autorisées, et non des identifiants de l'API de gestion.
Consultez [Credentials and tokens](/fr/docs/api/credentials), [Scopes and errors](/fr/docs/api/scopes-errors) et [API quickstart](/fr/docs/api/quickstart).
---
# Identifiants et jetons
Source: /fr/docs/api/credentials.md
{/* docs-visuals */}
Make Agent Fast utilise plusieurs types d'identifiants. Ils ne sont pas interchangeables. Avant de copier une valeur, identifiez quel système l'a émise, quel système la reçoit et si elle peut être exposée sans risque dans un navigateur.
## Cartographie des identifiants [#cartographie-des-identifiants]
| Identifiant | Créé dans | Utilisé par | Secret ? | Format ou valeur type |
| ------------------------------------------------ | ---------------------------------------------------------- | ----------------------------------------- | -------- | ------------------------------------------------- |
| Slug du site publié | Tableau de bord du site | Chargeur d'intégration du site web | Non | `my-agent` |
| Clé API Make Agent Fast | **Paramètres → Développeur** | Votre backend ou votre automatisation | Oui | `maf_live_...` |
| ID client OAuth | **Paramètres → Développeur** | Application multi-comptes | Non | `maf_app_...` |
| Jeton d'accès OAuth | Point de terminaison de jeton OAuth | Le backend de votre application | Oui | Jeton Bearer, durée de vie d'une heure |
| Jeton d'actualisation OAuth | Point de terminaison de jeton OAuth | Votre stockage sécurisé de jetons | Oui | `maf_refresh_...`, renouvelé à chaque utilisation |
| Clé API de fournisseur d'IA (facultative, Scale) | OpenRouter (texte) ou Speko (voix) | Backend de Make Agent Fast | Oui | `sk-or-...` ou `sk_speko_...` |
| Jeton de connecteur ou secret d'application | Telegram, Meta, Discord ou Kakao | Service de connecteurs de Make Agent Fast | Oui | Propre à chaque fournisseur |
| Secret de signature de webhook | Création du point de terminaison webhook de l'API publique | Votre récepteur de webhook | Oui | `whsec_...` |
Le chargeur d'intégration a besoin d'un slug de site public et d'une origine de site web autorisée. N'ajoutez jamais à la balise script une clé API Make Agent Fast, une clé de fournisseur, un jeton de connecteur ou un secret de webhook.
## Choisir la bonne méthode d'autorisation [#choisir-la-bonne-méthode-dautorisation]
Utilisez une **clé API Make Agent Fast** pour un serveur que vous contrôlez et un seul compte Make Agent Fast. Choisissez uniquement les portées dont ce serveur a besoin.
Utilisez **OAuth Authorization Code avec PKCE** lorsque votre produit connecte des comptes appartenant à d'autres utilisateurs de Make Agent Fast. Les applications OAuth doivent être examinées avant que l'autorisation en production n'aboutisse.
Utilisez une **clé de fournisseur d'IA** uniquement si vous souhaitez que Make Agent Fast appelle ce fournisseur d'IA avec votre compte fournisseur. Une clé de fournisseur n'autorise pas l'accès à l'API publique de Make Agent Fast.
Utilisez les **identifiants de connecteur** uniquement dans le formulaire de connecteur correspondant ou dans la requête d'API de connecteur correspondante. Un jeton de bot Telegram ne peut pas autoriser Discord, Meta ni les requêtes de l'API Make Agent Fast.
## Stocker les secrets en toute sécurité [#stocker-les-secrets-en-toute-sécurité]
En développement local, placez les secrets dans un fichier d'environnement ignoré par Git ou dans l'environnement de votre shell :
```bash
export MAF_API_KEY="maf_live_..."
```
Pour le déploiement, utilisez le gestionnaire de secrets chiffré de votre hébergeur. Ne placez pas de secrets dans :
* Les commits Git, les descriptions de tickets, les captures d'écran, les propriétés d'analytique ou les messages d'assistance.
* Les variables `NEXT_PUBLIC_*`, `VITE_*` ou toute autre variable intégrée au JavaScript du navigateur.
* Webflow, Framer, Wix, le Liquid de Shopify, le HTML de WordPress ou un bundle web mobile.
* Les chaînes de requête. Les URL sont souvent conservées dans l'historique du navigateur, les proxys et les journaux.
Effectuez les appels d'API depuis votre backend authentifié. Le navigateur doit appeler votre backend, et c'est votre backend qui doit joindre le secret.
```ts
const response = await fetch("https://makeagent.fast/api/v1/sites", {
headers: { Authorization: `Bearer ${process.env.MAF_API_KEY}` },
});
```
## Règles pour les secrets affichés une seule fois [#règles-pour-les-secrets-affichés-une-seule-fois]
Les clés API, les secrets de signature de webhook et les jetons d'actualisation OAuth nouvellement émis doivent être copiés au moment où ils s'affichent. La valeur complète en clair ne peut pas être récupérée par la suite. En cas de perte, créez un remplacement au lieu de demander au support de la révéler.
Les identifiants de fournisseur d'IA et de connecteur sont chiffrés avant d'être stockés et ne sont pas renvoyés par les API de liste. Le tableau de bord peut afficher un libellé, un préfixe, les quatre derniers caractères, un état de validation ou la date de dernière utilisation afin que vous puissiez identifier un identifiant sans l'exposer.
## Liste de contrôle pour le renouvellement [#liste-de-contrôle-pour-le-renouvellement]
1. Créez le remplacement avec les mêmes portées minimales ou les mêmes autorisations de fournisseur.
2. Mettez à jour un déploiement ou un récepteur à la fois.
3. Vérifiez qu'une requête réelle aboutit et notez son `x-request-id`.
4. Révoquez l'ancien identifiant.
5. Vérifiez que les anciennes requêtes échouent avec `401 invalid_api_key` ou l'erreur équivalente du fournisseur.
Pour OAuth, enregistrez le nouveau jeton d'actualisation renvoyé par chaque réponse d'actualisation avant de supprimer le précédent. Pour le renouvellement d'un secret de webhook, faites fonctionner l'ancien et le nouveau point de terminaison en parallèle jusqu'à ce que tous les producteurs et récepteurs utilisent le remplaçant.
## En cas d'exposition d'un secret [#en-cas-dexposition-dun-secret]
Révoquez-le ou renouvelez-le immédiatement. Le supprimer du dernier commit Git ne suffit pas, car il peut subsister dans l'historique, les caches, les journaux ou les forks. Examinez l'activité chez Make Agent Fast et chez le fournisseur émetteur, puis remplacez tout identifiant qui partageait le même emplacement de stockage ou le même environnement de déploiement.
Poursuivez avec [Authentification](/fr/docs/api/authentication), [Portées et erreurs](/fr/docs/api/scopes-errors) ou [Clés de fournisseur d'IA](/fr/docs/account/provider-keys).
---
# Présentation de l'API
Source: /fr/docs/api/overview.md
{/* docs-visuals */}
L'API publique repose sur du JSON orienté ressources, via HTTPS, sous `/api/v1`. Elle est disponible avec les offres payantes et applique les mêmes droits d'accès aux sites, aux crédits et aux fonctionnalités que le tableau de bord.
## Ce que vous pouvez automatiser [#ce-que-vous-pouvez-automatiser]
* Les sites et leur état de publication
* La configuration des agents, les FAQ, les produits et les connaissances
* Les conversations (y compris les réponses du propriétaire, la mise en pause et la reprise), les leads, les statistiques, les notifications et les diffusions
* La création de leads et le recueil du consentement, les pipelines d'opportunités, les résultats CRM et la reprise après échec de synchronisation
* Les connecteurs, la monétisation, les tickets, l'équipe, l'utilisation et les informations du compte
* Les abonnements à des webhooks signés pour les événements pris en charge
Les actions sensibles passent par des points de terminaison d'action explicites, et non par une modification directe et sans restriction de la base de données. Les secrets des connecteurs sont acceptés en écriture, mais ne sont jamais renvoyés.
Il s'agit d'une **API de gestion et de synchronisation**. Elle permet de créer et de mettre à jour des leads,
de les intégrer à un pipeline d'opportunités, d'importer des résultats CRM gagnés/perdus
avec leur source d'attribution, de relancer les imports de résultats ayant échoué, et de répondre à un visiteur au nom de l'entreprise,
en mettant l'agent en pause puis en le relançant sur cette conversation. L'envoi de messages en tant que visiteur
reste une opération réservée au widget ; les statistiques et l'utilisation restent en lecture seule. Les domaines personnalisés ont été
supprimés, et les routes `/domains` renvoient `409`.
## Démarrer en toute sécurité [#démarrer-en-toute-sécurité]
Créez une clé à portée limitée dans le tableau de bord, appelez le point de terminaison du compte courant, puis développez votre intégration sur un site de test avant de toucher au contenu de production.
```bash
curl https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer maf_live_YOUR_KEY"
```
Consultez [Authentification](/fr/docs/api/authentication), le [démarrage rapide de l'API](/fr/docs/api/quickstart) et la [référence de l'API](/fr/docs/api/reference).
---
# Démarrage rapide de l'API
Source: /fr/docs/api/quickstart.md
{/* docs-visuals */}
Ce guide de démarrage rapide permet de vérifier qu'un backend peut s'authentifier et lire les données de votre compte. Vous avez besoin d'un forfait payant actif, d'un terminal avec `curl` et d'un accès à **Tableau de bord → Paramètres → Développeur**.
L'API v1 actuelle permet de gérer et de synchroniser des ressources. Ce n'est pas un
transport de chat personnalisé : vous ne pouvez pas envoyer de messages en tant que visiteur. Les leads peuvent être créés, mis à jour
et acceptés (`leads:write`), et un owner peut répondre à une conversation, la mettre en pause ou la reprendre
(`conversations:write`).
## 1. Créer une clé à privilèges minimaux [#1-créer-une-clé-à-privilèges-minimaux]
Créez une clé nommée `Local API quickstart`, sélectionnez `account:read` et `sites:read`, puis choisissez une durée de validité courte. Copiez immédiatement la clé en clair : elle ne sera plus affichée par la suite.
N'utilisez pas une clé de fournisseur d'IA, telle qu'une clé OpenRouter ou Speko. L'API publique exige une clé Make Agent Fast commençant par `maf_live_`.
## 2. La stocker pour ce terminal [#2-la-stocker-pour-ce-terminal]
```bash
export MAF_API_KEY="maf_live_..."
```
Vérifiez que la variable existe sans afficher le secret :
```bash
test -n "$MAF_API_KEY" && echo "MAF_API_KEY is set"
```
Ne placez pas la clé dans un fichier `.env`, dans des exemples d'historique du shell, dans des fixtures de test ou dans un bundle de navigateur. Pour le code déployé, utilisez le gestionnaire de secrets de votre hébergeur.
## 3. Consulter le compte [#3-consulter-le-compte]
```bash
curl --fail-with-body --include https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
Statut attendu : `200 OK`. Le corps de la réponse contient `data.id`, les informations sur le forfait et les droits d'accès, ainsi qu'un résumé du portefeuille. La réponse contient également `x-request-id` ; conservez cette valeur lorsque vous signalez une requête en échec.
```json
{
"data": {
"id": "ACCOUNT_ID",
"email": "owner@example.com",
"plan": { "id": "pro", "status": "active" },
"entitlements": { "site_limit": 3, "live_voice": true },
"wallet": { "balance": 151 }
}
}
```
Des champs peuvent être ajoutés sans modifier le chemin `/v1`. Ignorez les champs inconnus au lieu de rejeter la réponse.
## 4. Lister les sites [#4-lister-les-sites]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites?limit=20" \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
Les réponses de type collection utilisent cette enveloppe :
```json
{
"data": [],
"has_more": false,
"next_cursor": null
}
```
Si `has_more` est vrai, envoyez la valeur exacte de `next_cursor` comme paramètre de requête `cursor` de la requête suivante. Ne décodez pas les curseurs et n'en construisez pas.
## 5. Gérer une erreur structurée [#5-gérer-une-erreur-structurée]
Supprimez temporairement l'en-tête Authorization et répétez l'appel à `/me`. La réponse doit être un `401` accompagné d'un code stable :
```json
{
"error": {
"code": "authentication_required",
"message": "Provide an API key in the Authorization bearer header.",
"request_id": "6c0b2f2e-..."
}
}
```
Le code de production doit se baser sur `error.code`, et non comparer `message`. Journalisez l'opération, le statut HTTP et l'identifiant de requête, sans journaliser la clé.
## 6. Effectuer une première écriture en toute sécurité [#6-effectuer-une-première-écriture-en-toute-sécurité]
Créez une clé distincte qui dispose également de `sites:write`, `agents:write` et `knowledge:write` ; n'étendez pas la clé de lecture du démarrage rapide. Suivez les [recettes de l'API](/fr/docs/api/recipes) pour créer un site, ajouter des connaissances fiables et le publier en utilisant des clés d'idempotence explicites.
## Échecs courants de la première requête [#échecs-courants-de-la-première-requête]
| Résultat | Cause | Solution |
| ----------------------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------- |
| `401 authentication_required` | En-tête manquant ou différent de `Bearer TOKEN` | Ajoutez l'en-tête Authorization exact depuis le code serveur |
| `401 invalid_api_key` | Faute de frappe, clé expirée, clé révoquée ou mauvais type d'identifiant | Créez et copiez une nouvelle clé API Make Agent Fast |
| `403 subscription_required` | Aucun forfait payant actif | Rétablissez l'abonnement du compte |
| `403 insufficient_scope` | La clé n'inclut pas le scope requis pour l'opération | Créez une clé de remplacement avec le scope minimal manquant |
| `403 account_paused` | L'accès à l'API a été suspendu pour ce compte | Reprenez l'accès à l'API ou contactez l'owner du compte |
| `429 rate_limit_exceeded` | Quota d'une minute de la clé épuisé | Attendez la valeur de `Retry-After` et réduisez la concurrence |
Poursuivez avec [Scopes et erreurs](/fr/docs/api/scopes-errors), la [référence de l'API](/fr/docs/api/reference) et les [Limites de débit](/fr/docs/api/rate-limits).
---
# Limites de débit
Source: /fr/docs/api/rate-limits.md
{/* docs-visuals */}
L'API publique applique un compteur de requêtes sur une minute glissante à chaque clé API ou jeton d'accès OAuth. Créer davantage de clés pour contourner une limite n'est pas pris en charge et peut entraîner des restrictions sur vos identifiants ou votre compte.
## Limites par forfait [#limites-par-forfait]
| Forfait actif | Requêtes par clé et par minute |
| ------------- | -----------------------------: |
| Launch | 120 |
| Operate | 600 |
| Scale | 1 800 |
Un identifiant dont le compte n'a aucun forfait payant actif reçoit une erreur `403 subscription_required` avant que toute capacité de débit ne lui soit accordée. Make Agent Fast peut introduire des limites plus basses, propres à certains endpoints, pour les opérations particulièrement coûteuses ; le cas échéant, la référence de l'endpoint les indiquera explicitement.
## Une réponse limitée en débit [#une-réponse-limitée-en-débit]
Lorsque le quota est épuisé, l'API renvoie `429 rate_limit_exceeded` avec :
```http
HTTP/1.1 429 Too Many Requests
Retry-After: 17
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-Request-Id: 6c0b2f2e-...
Content-Type: application/json
```
`Retry-After` indique le nombre minimal de secondes à attendre. Chaque réponse authentifiée inclut également `X-RateLimit-Limit`, `X-RateLimit-Remaining` et `X-RateLimit-Reset` (un horodatage Unix), ce qui permet aux applications de limiter leur débit avant d'obtenir une erreur `429`.
## Implémenter les nouvelles tentatives [#implémenter-les-nouvelles-tentatives]
Utilisez un backoff exponentiel avec un jitter aléatoire, respectez une valeur de `Retry-After` plus élevée et plafonnez le nombre total de tentatives.
```ts
async function requestWithRetry(url: string, init: RequestInit, attempts = 4) {
for (let attempt = 0; attempt < attempts; attempt += 1) {
const response = await fetch(url, init);
if (response.status !== 429 && response.status < 500) return response;
if (attempt === attempts - 1) return response;
const retryAfter = Number(response.headers.get("retry-after") ?? 0) * 1_000;
const exponential = 500 * 2 ** attempt;
const jitter = Math.random() * 250;
await new Promise((resolve) =>
setTimeout(resolve, Math.max(retryAfter, exponential + jitter)),
);
}
throw new Error("unreachable");
}
```
Pour `POST`, `PATCH` et `DELETE`, conservez la même clé `Idempotency-Key` valide à chaque nouvelle tentative, qu'elle fasse suite à une erreur réseau ou serveur. Une nouvelle clé d'idempotence peut répéter un effet de bord déjà exécuté.
## Réduire le volume de requêtes [#réduire-le-volume-de-requêtes]
* Mettez en cache les lectures de compte, de site et de configuration qui n'exigent pas une fraîcheur en temps réel.
* Demandez jusqu'à `100` enregistrements par page plutôt que de solliciter à répétition de très petites pages.
* Traitez les événements de webhook au lieu d'interroger régulièrement les conversations, les leads ou les diffusions.
* Limitez la concurrence des workers par clé API : une rafale provenant de nombreuses invocations serverless partage le même compteur.
* Utilisez des clés distinctes pour des services distincts afin d'assurer l'isolation et la traçabilité, et non pour multiplier la capacité d'une même charge de travail.
## Tableau des réponses à retenter ou non [#tableau-des-réponses-à-retenter-ou-non]
| Réponse | Nouvelle tentative ? | Condition |
| --------------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------- |
| `429` | Oui | Attendez la durée indiquée par `Retry-After`, ajoutez du jitter et plafonnez le nombre de tentatives |
| `500` | Parfois | Lectures sûres ou mutations protégées par la même clé d'idempotence |
| `409` conflit de traitement | Oui | Attendez la durée de son en-tête `Retry-After: 2` et conservez la même clé d'idempotence |
| Autre `409` | Pas immédiatement | Lisez l'état actuel de la ressource et résolvez le conflit |
| `503` `outcome_unknown` | Non | La mutation a peut-être abouti ; vérifiez la ressource avant d'utiliser une nouvelle clé d'idempotence |
| `400`, `401`, `403`, `404`, `415` | Non | Corrigez d'abord les données saisies, les identifiants, les droits d'accès, le chemin ou le type de contenu |
Si une charge de travail soutenue dépasse légitimement le quota de son forfait, réduisez l'interrogation régulière, regroupez les traitements ou contactez le support en fournissant des identifiants de requête représentatifs et le trafic attendu, plutôt que d'ajouter une boucle de nouvelles tentatives sans limite.
---
# Recettes d'API
Source: /fr/docs/api/recipes.md
{/* docs-visuals */}
Ces recettes utilisent l'API REST brute, elles fonctionnent donc avant l'installation d'un SDK public. Définissez `MAF_API_KEY` dans l'environnement du serveur et remplacez les identifiants par ceux renvoyés par les étapes précédentes.
## Recette : créer et publier un agent ancré dans vos sources [#recette--créer-et-publier-un-agent-ancré-dans-vos-sources]
Créez une clé d'API avec les portées `sites:write`, `agents:write` et `knowledge:write`. Ajoutez `sites:read` si l'automatisation doit aussi lister ou vérifier des sites.
### 1. Créer le site [#1-créer-le-site]
```bash
curl --fail-with-body https://makeagent.fast/api/v1/sites \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-site-2026-01" \
-d '{
"title": "Acme support",
"slug": "acme-support",
"type": "business",
"template": "minimal",
"content": {
"headline": "Ask Acme support"
},
"persona_mode": "assistant",
"languages": ["en"]
}'
```
Une réponse réussie renvoie `201 Created`, inclut le site sous `data` et renvoie le chemin canonique de la ressource dans l'en-tête `Location`. Enregistrez `data.id` sous le nom `SITE_ID`.
### 2. Configurer l'agent et la politique d'intégration [#2-configurer-lagent-et-la-politique-dintégration]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/agent" \
-X PATCH \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-agent-2026-01" \
-d '{
"display_name": "Acme guide",
"persona_mode": "assistant",
"instructions": "Answer only from confirmed Acme sources. If the answer is missing, say that a teammate will follow up.",
"languages": ["en"],
"embed_enabled": true,
"allowed_origins": ["https://www.acme.example", "https://staging.acme.example"]
}'
```
Les origines autorisées sont des origines exactes : schéma, nom d'hôte et port facultatif. N'incluez ni chemin ni caractère générique final.
### 3. Ajouter une source de connaissances textuelle [#3-ajouter-une-source-de-connaissances-textuelle]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/knowledge" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-returns-2026-01" \
-d '{
"name": "Returns policy 2026-01",
"text": "Customers may request a return within 30 days of delivery. Contact support before sending an item back."
}'
```
Le texte collé doit comporter entre 5 et 200 000 caractères. Le même endpoint permet aussi d'explorer un site web avec `{ "url", "max_pages", "refresh_hours" }` (`max_pages` jusqu'à 40) ou d'importer `{ "kind": "youtube" | "podcast" | "feed", "url" }` ; ces sources multimédias nécessitent l'offre Operate ou Scale et renvoient `409` sur l'offre Launch. Le téléversement de fichiers reste réservé au tableau de bord.
### 4. Ajouter une FAQ structurée [#4-ajouter-une-faq-structurée]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/faqs" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-faq-returns-2026-01" \
-d '{
"question": "How long do I have to return an order?",
"answer": "You may request a return within 30 days of delivery.",
"approved": true
}'
```
### 5. Publier [#5-publier]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/publish" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-publish-2026-01" \
-d '{"published": true}'
```
La réponse doit contenir `{"data":{"id":"...","status":"published"}}`. Ouvrez une intégration réelle et posez une question dont la réponse figure dans la source. La publication prouve que l'état de l'agent a changé ; elle ne prouve pas que la qualité de la source ou l'origine de l'intégration sont correctes.
## Recette : paginer les leads en toute sécurité [#recette--paginer-les-leads-en-toute-sécurité]
Utilisez une clé disposant de la portée `leads:read`. Traitez `next_cursor` comme une valeur opaque et encodez-la pour une URL.
```ts
const base = `https://makeagent.fast/api/v1/sites/${siteId}/leads`;
let cursor: string | null = null;
do {
const url = new URL(base);
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("cursor", cursor);
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.MAF_API_KEY}` },
});
if (!response.ok) throw await response.json();
const page = await response.json();
for (const lead of page.data) await exportLead(lead);
cursor = page.next_cursor;
} while (cursor);
```
Ne décodez pas, ne modifiez pas, ne triez pas un curseur et ne le réutilisez pas pour une autre collection.
## Recette : désactiver une intégration pendant un incident [#recette--désactiver-une-intégration-pendant-un-incident]
Utilisez la portée `agents:write` et conservez la même clé d'idempotence lors des nouvelles tentatives dues au réseau :
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/agent" \
-X PATCH \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: incident-2026-07-embed-off" \
-d '{"embed_enabled": false}'
```
Une fois la réponse reçue avec succès, vérifiez que le lanceur ne s'initialise plus sur un hôte autorisé. Réactivez-le avec une nouvelle clé de résolution d'incident après avoir corrigé le problème d'origine, de contenu ou d'identifiants.
## Liste de contrôle pour la production [#liste-de-contrôle-pour-la-production]
* Utilisez une clé distincte par service et par environnement.
* Conservez les identifiants de ressources et les clés d'idempotence avant d'envoyer une mutation.
* Définissez des délais d'expiration pour la connexion et la réponse.
* Respectez `Retry-After` et plafonnez le nombre de nouvelles tentatives.
* Journalisez le nom de l'opération, le statut HTTP et l'identifiant de requête, sans consigner de secrets ni de données personnelles.
* Testez sur un site hors production avant d'accorder des portées d'écriture en production.
---
# Référence de l'API
Source: /fr/docs/api/reference.md
{/* docs-visuals */}
Le contrat canonique lisible par machine est le [JSON OpenAPI](/api/openapi.json). Cette page est l'index des opérations, rédigé pour les humains, et explique les règles communes à tous les endpoints.
## URL de base et version [#url-de-base-et-version]
```text
https://makeagent.fast/api/v1
```
La version majeure fait partie du chemin. Des champs supplémentaires peuvent apparaître sans changement de version majeure : ignorez donc les champs de réponse inconnus. Toutes les requêtes de gestion utilisent HTTPS ainsi qu'une clé d'API bearer ou un jeton d'accès OAuth.
## En-têtes courants [#en-têtes-courants]
```http
Authorization: Bearer maf_live_...
Accept: application/json
Content-Type: application/json
Idempotency-Key: your-stable-operation-key
```
`Content-Type` est obligatoire pour les corps JSON des requêtes `POST` et `PATCH`, y compris `{}`. `Idempotency-Key` est facultatif, mais vivement recommandé pour chaque `POST`, `PATCH` et `DELETE`.
## Compte et sites [#compte-et-sites]
| Méthode | Chemin | Scope | Objectif |
| -------- | ---------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/me` | `account:read` | Lire le résumé du compte, du forfait, des droits et du portefeuille |
| `GET` | `/sites` | `sites:read` | Lister les sites dont vous êtes propriétaire |
| `POST` | `/sites` | `sites:write` | Créer un site et son agent par défaut |
| `GET` | `/sites/{site_id}` | `sites:read` | Récupérer un site dont vous êtes propriétaire |
| `PATCH` | `/sites/{site_id}` | `sites:write` | Mettre à jour les champs du site modifiables en toute sécurité |
| `DELETE` | `/sites/{site_id}` | `sites:write` | Supprimer le site et les ressources qui en dépendent |
| `POST` | `/sites/{site_id}/publish` | `sites:write` | Publier ou dépublier avec `{ "published": boolean }` |
| `GET` | `/sites/{site_id}/agent` | `agents:read` | Lire les paramètres de l'agent |
| `PATCH` | `/sites/{site_id}/agent` | `agents:write` | Mettre à jour le mode de persona, l'objectif, le nom affiché, les instructions, la voix, les langues, le modèle, l'apparence, l'habillage de l'intégration, le badge, l'état de l'intégration ou les origines |
| `GET` | `/sites/{site_id}/billing` | `account:read` | Lire le forfait, la période, le portefeuille, les modules complémentaires et les liens de facturation du tableau de bord |
| `PATCH` | `/sites/{site_id}/workspace` | `team:write` | Renommer l'entreprise propriétaire de l'agent |
| `PATCH` | `/sites/{site_id}/retention` | `team:write` | Définir la durée de conservation des conversations |
La création d'un site exige `title` et `content.headline`. Les champs facultatifs comprennent `slug`, `type`, `template`, du contenu supplémentaire, `persona_mode`, ainsi qu'une à quatre langues parmi `en`, `ko`, `uz` et `ru`.
`PATCH /agent` soumet `model`, `appearance`, `embed_chrome` et `badge_hidden` aux mêmes contrôles de forfait que le tableau de bord ; `badge_hidden: true` nécessite un forfait éligible ou le module complémentaire de badge.
## Installation et widget de site web [#installation-et-widget-de-site-web]
| Méthode | Chemin | Scope | Objectif |
| ------- | -------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------ |
| `GET` | `/sites/{site_id}/install` | `agents:read` | Lire la cible d'installation, l'état de l'intégration, les origines autorisées et les preuves d'installation |
| `PATCH` | `/sites/{site_id}/install` | `agents:write` | Définir la page sur laquelle le widget doit être installé |
| `POST` | `/sites/{site_id}/install/check` | `agents:write` | Vérifier si l'extrait d'intégration est actif sur la page cible |
## Connaissances et FAQ [#connaissances-et-faq]
| Méthode | Chemin | Scope | Objectif |
| ------------------ | -------------------------------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/knowledge` | `knowledge:read` | Lister les sources de connaissances |
| `POST` | `/sites/{site_id}/knowledge` | `knowledge:write` | Ingérer du texte collé, explorer un site web ou importer une source YouTube, de podcast ou de flux |
| `PATCH` | `/sites/{site_id}/knowledge/{source_id}` | `knowledge:write` | Définir `refresh_hours` ou le `approval_status` du buyer pack |
| `POST` | `/sites/{site_id}/knowledge/{source_id}/recrawl` | `knowledge:write` | Mettre en file d'attente une nouvelle lecture d'une source récupérée ; renvoie `202` |
| `DELETE` | `/sites/{site_id}/knowledge/{source_id}` | `knowledge:write` | Retirer une source des futures recherches |
| `GET` | `/sites/{site_id}/faqs` | `knowledge:read` | Lister les FAQ structurées |
| `POST` | `/sites/{site_id}/faqs` | `knowledge:write` | Créer `{ "question", "answer", "approved" }` |
| `POST` | `/sites/{site_id}/faqs/generate` | `knowledge:write` | Rédiger des brouillons de FAQ à partir des connaissances de l'agent |
| `POST` | `/sites/{site_id}/faqs/approve-all` | `knowledge:write` | Approuver et publier toutes les FAQ en brouillon |
| `PATCH` | `/sites/{site_id}/faqs/{faq_id}` | `knowledge:write` | Mettre à jour la question, la réponse ou l'état d'approbation |
| `DELETE` | `/sites/{site_id}/faqs/{faq_id}` | `knowledge:write` | Supprimer une FAQ |
| `GET` / `PATCH` | `/sites/{site_id}/fact-sheet` | `knowledge:read` / `knowledge:write` | Lire la fiche d'informations de l'entreprise extraite, ou corriger les informations que l'extraction a mal interprétées |
| `POST` | `/sites/{site_id}/fact-sheet/reextract` | `knowledge:write` | Relire le site web et reconstruire la fiche d'informations |
| `POST` | `/sites/{site_id}/qa` | `knowledge:write` | Publier des paires de questions-réponses sélectionnées |
| `POST` | `/sites/{site_id}/answers/revise` | `knowledge:write` | Apprendre à l'agent la réponse qu'il aurait dû donner |
| `GET` | `/sites/{site_id}/knowledge-connections` | `knowledge:read` | Lister les connexions de connaissances Notion, Drive et MCP |
| `GET` | `/sites/{site_id}/knowledge-connections/connect-links` | `knowledge:read` | Obtenir les URL du tableau de bord qui lancent une connexion Notion ou Drive |
| `PATCH` / `DELETE` | `/sites/{site_id}/knowledge-connections/{connection_id}` | `knowledge:write` | Définir la fréquence de synchronisation, les éléments sélectionnés ou l'outil d'importation ; ou déconnecter la connexion et purger ses données |
| `GET` | `/sites/{site_id}/knowledge-connections/{connection_id}/items` | `knowledge:read` | Lister les pages, bases de données ou fichiers qu'une connexion peut importer |
| `POST` | `/sites/{site_id}/knowledge-connections/{connection_id}/sync` | `knowledge:write` | Mettre en file d'attente la synchronisation d'une connexion de connaissances |
`POST /knowledge` accepte trois corps : `{ "name", "text" }` avec 5 à 200 000 caractères ; `{ "url", "max_pages", "refresh_hours" }` pour explorer un site web (`max_pages` de 1 à 40, `refresh_hours` de 1 à 8 760 ou `null`) ; et `{ "kind": "youtube" | "podcast" | "feed", "url", "refresh_hours" }`. Les sources YouTube, de podcast et de flux nécessitent Operate ou Scale ; avec Launch, elles renvoient `409 conflict`. L'envoi de fichiers reste un workflow du tableau de bord.
## Conversations, leads, analytique et utilisation [#conversations-leads-analytique-et-utilisation]
| Méthode | Chemin | Scope | Objectif |
| ------- | --------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------------ |
| `GET` | `/sites/{site_id}/conversations` | `conversations:read` | Lister les fils de conversation |
| `GET` | `/sites/{site_id}/conversations/{conversation_id}` | `conversations:read` | Récupérer un fil et ses messages paginés |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/reply` | `conversations:write` | Répondre à un visiteur au nom de l'entreprise |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/pause` | `conversations:write` | Mettre l'agent en pause sur cette conversation et la prendre en charge |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/resume` | `conversations:write` | Rendre la conversation à l'agent |
| `GET` | `/sites/{site_id}/leads` | `leads:read` | Lister les leads capturés |
| `POST` | `/sites/{site_id}/leads` | `leads:write` | Créer un lead canonique avec un consentement explicite et des préférences de contact |
| `GET` | `/sites/{site_id}/leads/{lead_id}` | `leads:read` | Récupérer un lead |
| `PATCH` | `/sites/{site_id}/leads/{lead_id}` | `leads:write` | Mettre à jour un lead, le qualifier ou modifier sa politique de contact |
| `POST` | `/sites/{site_id}/leads/{lead_id}/accept` | `leads:write` | Accepter un lead dans le pipeline d'opportunités |
| `POST` | `/sites/{site_id}/leads/{lead_id}/followup` | `leads:write` | Envoyer le message de relance à un lead |
| `POST` | `/sites/{site_id}/leads/{lead_id}/followup/draft` | `leads:write` | Rédiger à nouveau le message de relance sans l'envoyer |
| `GET` | `/sites/{site_id}/analytics` | `analytics:read` | Lister les événements d'analytique |
| `GET` | `/sites/{site_id}/report` | `analytics:read` | Lire le rapport d'analytique agrégé |
| `POST` | `/sites/{site_id}/report/unanswered-faq` | `knowledge:write` | Répondre à une question sans réponse en la transformant en nouvelle FAQ |
| `GET` | `/sites/{site_id}/usage` | `usage:read` | Lister les événements d'utilisation mesurée |
Ces collections d'événements et d'activité acceptent `limit` et `cursor`. Les enregistrements renvoyés peuvent contenir des données personnelles ; stockez-les et exportez-les conformément à vos obligations en matière de confidentialité.
Les réponses du owner sont prises en charge : `reply`, `pause` et `resume` reprennent la main sur un fil web ou sur une discussion Telegram, WhatsApp, Messenger ou Instagram, exactement comme le fait le tableau de bord. L'envoi de messages au nom du visiteur n'est pas une opération de l'API publique.
La mutation des leads est prise en charge ; ne définissez pas `consent_status: granted` sauf si votre système
dispose d'un enregistrement de consentement défendable. Les consentements inconnus sont exclus des diffusions.
## Pipeline d'opportunités et résultats CRM [#pipeline-dopportunités-et-résultats-crm]
| Méthode | Chemin | Scope | Objectif |
| --------------- | ------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `GET` / `POST` | `/sites/{site_id}/pipeline/stages` | `pipeline:read` / `pipeline:write` | Lister ou configurer les étapes |
| `GET` / `POST` | `/sites/{site_id}/pipeline/accounts` | `pipeline:read` / `pipeline:write` | Lister ou créer des comptes d'entreprise |
| `GET` | `/sites/{site_id}/pipeline/accounts/{account_id}` | `pipeline:read` | Récupérer un compte d'entreprise |
| `GET` / `POST` | `/sites/{site_id}/pipeline/opportunities` | `pipeline:read` / `pipeline:write` | Lister ou créer des opportunités |
| `GET` / `PATCH` | `/sites/{site_id}/pipeline/opportunities/{opportunity_id}` | `pipeline:read` / `pipeline:write` | Lire l'activité ou mettre à jour l'attribution, la valeur, l'étape, la prochaine action et la réponse humaine |
| `POST` | `/sites/{site_id}/pipeline/outcomes` | `pipeline:write` | Importer de manière idempotente un résultat gagné ou perdu provenant d'un CRM |
| `GET` | `/sites/{site_id}/pipeline/sync-records` | `pipeline:read` | Lister l'état de synchronisation, les tentatives et les erreurs |
| `POST` | `/sites/{site_id}/pipeline/sync-records/{sync_record_id}/retry` | `pipeline:write` | Relancer un résultat en échec à partir de sa charge utile enregistrée |
| `GET` / `PATCH` | `/sites/{site_id}/pipeline-workflow` | `pipeline:read` / `pipeline:write` | Lire ou mettre à jour la politique de réponse commerciale |
| `GET` / `POST` | `/sites/{site_id}/pilots` | `pipeline:read` / `pipeline:write` | Lister ou démarrer des pilotes guidés |
| `GET` | `/sites/{site_id}/pilots/{pilot_id}` | `pipeline:read` | Lire un pilote, son étape, ses compteurs et sa liste de tâches |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/setup`, `/start`, `/stop`, `/review`, `/decision`, `/complete`, `/delete` | `pipeline:write` | Faire avancer un pilote à travers la configuration, la mesure, la revue, la décision et la clôture, ou le supprimer avec ses preuves (sept opérations) |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/outcomes`, `/bookings` | `pipeline:write` | Enregistrer le résultat d'un lead ou le résultat d'une réservation (deux opérations) |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/report/approve`, `/report/revoke` | `pipeline:write` | Approuver ou révoquer le rapport de pilote partageable (deux opérations) |
| `GET` / `POST` | `/sites/{site_id}/buyer-packs` | `pipeline:read` / `pipeline:write` | Lister les buyer packs, ou en créer un à partir de sources approuvées |
| `PATCH` | `/sites/{site_id}/buyer-packs/{pack_id}` | `pipeline:write` | Remplacer le titre, le public cible, le résumé, les sources et les sections d'un pack |
| `POST` | `/sites/{site_id}/buyer-packs/{pack_id}/approve`, `/revoke` | `pipeline:write` | Activer ou désactiver le lien de partage du pack (deux opérations) |
Le `provider` du CRM, l'ID externe et la clé d'idempotence fournis sont conservés dans la
piste d'audit. Une nouvelle tentative ne prend en charge qu'un enregistrement en échec et ne transforme jamais une
écriture externe en cours en faux succès.
## Connecteurs [#connecteurs]
| Méthode | Chemin | Scope | Objectif |
| -------- | --------------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/connectors` | `connectors:read` | Lister l'état des connecteurs sans les secrets |
| `POST` | `/sites/{site_id}/connectors` | `connectors:write` | Connecter un canal : valider les identifiants en direct, provisionner son webhook et renvoyer la liste de contrôle de configuration |
| `PATCH` | `/sites/{site_id}/connectors/{connector_id}` | `connectors:write` | Définir `status` ou `reply_with_voice` |
| `DELETE` | `/sites/{site_id}/connectors/{connector_id}` | `connectors:write` | Déprovisionner et supprimer un connecteur |
| `POST` | `/sites/{site_id}/concierge` | `connectors:write` | Demander à la plateforme de connecter un canal de messagerie à votre place |
| `GET` | `/sites/{site_id}/domains` | `domains:read` | Supprimé — renvoie `409`. Les domaines personnalisés ne sont pas proposés |
| `POST` | `/sites/{site_id}/domains` | `domains:write` | Supprimé — renvoie `409` |
| `PATCH` | `/sites/{site_id}/domains/{domain_id}` | `domains:write` | Supprimé — renvoie `409` |
| `POST` | `/sites/{site_id}/domains/{domain_id}/verify` | `domains:write` | Supprimé — renvoie `409` |
| `DELETE` | `/sites/{site_id}/domains/{domain_id}` | `domains:write` | Supprimé — renvoie `409` |
La création d'un connecteur utilise un corps discriminé par canal. Les champs d'identifiants diffèrent pour `telegram`, `whatsapp`, `messenger`, `instagram`, `discord` et `kakao` ; consultez le guide du connecteur correspondant avant d'envoyer des secrets.
## Diffusions, notifications et monétisation [#diffusions-notifications-et-monétisation]
| Méthode | Chemin | Scope | Objectif |
| -------- | ----------------------------------------------------- | --------------------- | --------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/broadcasts` | `broadcasts:read` | Lister les diffusions |
| `POST` | `/sites/{site_id}/broadcasts` | `broadcasts:write` | Créer un brouillon de diffusion Kakao |
| `POST` | `/sites/{site_id}/broadcasts/{broadcast_id}/send` | `broadcasts:write` | Mettre en file d'attente un brouillon existant ; renvoie `202` |
| `GET` | `/sites/{site_id}/notifications` | `notifications:read` | Lister les notifications du owner |
| `POST` | `/sites/{site_id}/notifications/read-all` | `notifications:write` | Marquer comme lues toutes les notifications du owner pour cet agent |
| `PATCH` | `/sites/{site_id}/notifications/{notification_id}` | `notifications:write` | Marquer comme lue ou non lue avec `{ "read": boolean }` |
| `GET` | `/sites/{site_id}/alerts` | `notifications:read` | Lire l'état du canal d'alertes du owner et son lien vers le tableau de bord |
| `GET` | `/sites/{site_id}/monetization/products` | `monetization:read` | Lister les produits du site |
| `POST` | `/sites/{site_id}/monetization/products` | `monetization:write` | Créer un produit `access`, `consult`, `tip` ou `digital` |
| `PATCH` | `/sites/{site_id}/monetization/products/{product_id}` | `monetization:write` | Mettre à jour les champs du produit et son état actif |
| `DELETE` | `/sites/{site_id}/monetization/products/{product_id}` | `monetization:write` | Supprimer un produit |
La création d'une diffusion n'accepte actuellement que le canal `kakao`. La mise en file d'attente échoue avec `409 conflict` lorsqu'il n'y a aucun destinataire joignable ou que la diffusion n'est plus un brouillon.
## Actions, tickets et équipe [#actions-tickets-et-équipe]
| Méthode | Chemin | Scope | Objectif |
| ------------------ | --------------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------ |
| `GET` / `PATCH` | `/sites/{site_id}/actions` | `agents:read` / `agents:write` | Lire ou configurer les procédures, le webhook public, le lien de réservation et les tickets de support |
| `GET` | `/sites/{site_id}/tickets` | `tickets:read` | Lister les tickets de support |
| `GET` | `/sites/{site_id}/tickets/{ticket_id}` | `tickets:read` | Lire un ticket et ses messages |
| `PATCH` | `/sites/{site_id}/tickets/{ticket_id}` | `tickets:write` | Définir le statut, la priorité et, facultativement, la personne assignée |
| `POST` | `/sites/{site_id}/tickets/{ticket_id}/messages` | `tickets:write` | Ajouter une note interne, ou définir `internal: false` pour répondre au customer par e-mail |
| `GET` | `/sites/{site_id}/team` | `team:read` | Lire les membres, les invitations et les événements d'audit autorisés |
| `POST` | `/sites/{site_id}/team/invitations` | `team:write` | Créer un lien d'invitation sans envoyer d'e-mail |
| `DELETE` | `/sites/{site_id}/team/invitations/{invitation_id}` | `team:write` | Révoquer une invitation en attente |
| `PATCH` / `DELETE` | `/sites/{site_id}/team/members/{membership_id}` | `team:write` | Modifier le rôle d'un membre qui n'est pas owner, ou retirer ce membre |
## Webhooks pour développeurs et outils de configuration [#webhooks-pour-développeurs-et-outils-de-configuration]
| Méthode | Chemin | Scope | Objectif |
| -------- | ---------------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/webhook-endpoints` | `webhooks:read` | Lister l'état des endpoints sans les secrets de signature |
| `POST` | `/webhook-endpoints` | `webhooks:write` | Enregistrer une URL HTTPS publique et révéler une seule fois son secret de signature |
| `DELETE` | `/webhook-endpoints/{endpoint_id}` | `webhooks:write` | Supprimer un endpoint et arrêter les futures livraisons |
| `GET` | `/setup/tools` | Tout identifiant valide | Découvrir les outils de configuration pour les intégrations API, MCP et GitHub |
| `POST` | `/setup/tools/{tool_name}` | Propre à l'outil | Exécuter un outil de configuration ; les requêtes de plateforme nécessitent les scopes de leurs endpoints, l'inspection GitHub utilise `integrations:read` et la préparation de PR utilise `integrations:write` |
Les URL de webhook doivent utiliser HTTPS, ne peuvent pas inclure d'identifiants ni de port personnalisé, et doivent se résoudre uniquement vers des adresses IP publiques.
## Pagination [#pagination]
Les collections paginées acceptent `limit` de `1` à `100` ; la valeur par défaut est `50`. Utilisez le `next_cursor` opaque renvoyé uniquement avec la même collection et les mêmes filtres.
```json
{
"data": [],
"has_more": false,
"next_cursor": null
}
```
Certaines petites collections de configuration renvoient la même enveloppe avec `has_more: false` et n'ont pas besoin de curseur.
## Idempotence [#idempotence]
Une clé d'idempotence doit comporter de 8 à 200 caractères parmi les lettres, les chiffres, `.`, `_`, `:` et `-`. Les résultats sont conservés pendant 24 heures et limités au propriétaire de l'identifiant.
* Même clé et mêmes méthode, chemin, requête et corps : renvoie la réponse enregistrée avec `x-idempotent-replayed: true`.
* Même clé avec des données différentes : renvoie `409 conflict`.
* Même clé pendant que la première requête est en cours de traitement : renvoie `409 conflict` et `Retry-After: 2`.
Enregistrez la clé de façon persistante avant d'envoyer la mutation et réutilisez-la uniquement pour les nouvelles tentatives de cette même opération logique.
## Réponses et erreurs [#réponses-et-erreurs]
Les réponses réussies encapsulent leur ressource dans `data`. Les opérations de création renvoient normalement `201` ; les envois de diffusion mis en file d'attente renvoient `202` ; les autres opérations réussies renvoient `200`. Chaque réponse inclut `x-request-id` et utilise `Cache-Control: no-store` pour les données de l'API.
Consultez [Scopes et erreurs](/fr/docs/api/scopes-errors) pour le tableau complet des codes d'erreur et [Recettes d'API](/fr/docs/api/recipes) pour des workflows à copier.
## Clients MCP [#clients-mcp]
Connectez un client MCP Streamable HTTP à `https://makeagent.fast/api/mcp`. Les clients qui prennent en charge la découverte OAuth ouvrent le navigateur pour la connexion et le consentement. Vérifiez l'identité du client, l'entreprise et les scopes demandés avant d'approuver. La première approbation demande les scopes utilisés par les outils (`sites:read`, `sites:write`, `agents:write`, `analytics:read`, `conversations:read`, `conversations:write`, `leads:read`, `leads:write`, `knowledge:write`) ; un identifiant auquel il manque l'un d'eux doit être autorisé à nouveau. Un forfait actif est requis.
Pour les clients qui utilisent des identifiants configurés manuellement, créez une clé d'API limitée à certains scopes dans les [paramètres développeur](/dashboard/settings/developer) et fournissez-la dans un en-tête `Authorization: Bearer ...`. Ne placez jamais d'identifiants dans le contrôle de code source ni dans le code du navigateur. Révoquez les clés d'API ou les autorisations OAuth depuis les paramètres développeur.
Outils de lecture : `list_agents`, `get_agent`, `get_report`, `list_unanswered_questions`, `list_conversations`, `get_conversation`, `list_leads`. Outils d'écriture : `create_agent_from_website`, `create_agent_from_notes`, `test_agent`, `add_knowledge`, `save_answer`, `reply_to_customer`, `update_lead`, `set_website_widget`. Chaque outil d'agent prend un `agent_id` issu de `list_agents`. `test_agent` consomme des credits comme une réponse normale ; `reply_to_customer` envoie un message au customer et met l'agent en pause sur cette conversation ; `set_website_widget` active ou désactive le widget de chat du site web ; les canaux de messagerie se gèrent depuis le tableau de bord. Les clients pour lesquels MCP Apps est activé (par défaut, la connexion Claude authentifiée) disposent aussi de `list_pending_approvals`, `list_action_runs` et `decide_approval`, qui approuve ou refuse une modification confirmée par le customer ; les autres clients ne voient que les 15 outils ci-dessus. Pour les outils de configuration et d'intégration GitHub, utilisez l'assistant de configuration intégré à l'application ou `/api/v1/setup/tools`.
Les révisions de protocole prises en charge sont `2026-07-28`, `2025-11-25` et `2025-06-18`. Le transport renvoie du JSON ; il ne propose ni SSE hérité ni sessions serveur. Les jetons MCP OAuth n'autorisent que `/api/mcp`, et non les requêtes REST directes. Les jetons d'accès OAuth durent une heure ; les identifiants de rafraîchissement sont renouvelés et expirent après 90 jours. Les clés d'API créées manuellement utilisent l'expiration configurée.
---
# Scopes et erreurs
Source: /fr/docs/api/scopes-errors.md
{/* docs-visuals */}
Chaque opération de l'API publique exige un scope explicite. Un identifiant valide qui ne dispose pas de ce scope reçoit `403 insufficient_scope` ; il n'est jamais élevé silencieusement vers un accès plus large.
## Référence des scopes [#référence-des-scopes]
| Scope | Autorise |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `account:read` | Lire le compte authentifié, le forfait, les droits et le résumé du portefeuille |
| `tickets:read` | Lire les tickets de support et leurs messages |
| `tickets:write` | Mettre à jour les tickets, assigner des collègues et ajouter des notes internes ou des réponses aux clients |
| `team:read` | Lire les membres de l'équipe, les invitations en attente et les événements d'audit autorisés |
| `team:write` | Créer ou révoquer des invitations et gérer les rôles des membres de l'équipe autres que le propriétaire |
| `integrations:read` | Consulter les installations et les dépôts de GitHub App autorisés |
| `integrations:write` | Préparer des modifications d'intégration et créer des pull requests en brouillon |
| `sites:read` | Lister et récupérer les sites |
| `sites:write` | Créer, mettre à jour, publier, dépublier et supprimer des sites |
| `agents:read` | Lire les paramètres de l'agent |
| `agents:write` | Mettre à jour le comportement, la langue, la voix et les paramètres d'intégration de l'agent |
| `knowledge:read` | Lister les sources de connaissances et les FAQ |
| `knowledge:write` | Créer, mettre à jour et supprimer des sources de connaissances et des FAQ |
| `conversations:read` | Lister les conversations et récupérer leurs messages |
| `conversations:write` | Prendre le relais d'une conversation : répondre à un visiteur au nom de l'entreprise, mettre l'agent en pause sur cette conversation et la lui rendre |
| `leads:read` | Lister les leads capturés |
| `leads:write` | Créer, mettre à jour, qualifier et intégrer des leads dans le pipeline d'opportunités |
| `pipeline:read` | Lire les étapes, les comptes, les opportunités, les activités, l'attribution et l'état de synchronisation du CRM |
| `pipeline:write` | Configurer les étapes ; créer ou mettre à jour des opportunités et des comptes ; importer ou relancer des résultats CRM |
| `analytics:read` | Lire les événements d'analytique des sites |
| `connectors:read` | Lister l'état des connecteurs sans renvoyer de secrets |
| `connectors:write` | Créer, mettre à jour, activer, désactiver et supprimer des connecteurs |
| `domains:read` | Supprimé. Conservé uniquement pour la compatibilité ; chaque route `/domains` renvoie `409`, car les domaines personnalisés ne sont pas proposés |
| `domains:write` | Supprimé. Conservé uniquement pour la compatibilité ; chaque route `/domains` renvoie `409` |
| `broadcasts:read` | Lister les diffusions et l'état de leur envoi |
| `broadcasts:write` | Créer des brouillons et mettre en file d'attente l'envoi d'une diffusion |
| `notifications:read` | Lister les notifications du propriétaire |
| `notifications:write` | Marquer les notifications comme lues ou non lues |
| `monetization:read` | Lister les produits de monétisation |
| `monetization:write` | Créer, mettre à jour, activer, désactiver et supprimer des produits |
| `usage:read` | Lire les événements d'utilisation mesurée |
| `webhooks:read` | Lister les endpoints de webhook et l'état des livraisons |
| `webhooks:write` | Créer et supprimer des endpoints de webhook |
Utilisez des scopes en lecture pour les tâches de reporting. N'ajoutez un scope en écriture que si l'intégration effectue réellement cette modification. Par exemple, un export de leads nécessite normalement `sites:read` et `leads:read`, et non `sites:write` ou `agents:write`.
## Échecs liés aux scopes [#échecs-liés-aux-scopes]
```json
{
"error": {
"code": "insufficient_scope",
"message": "The API key does not grant the required scope.",
"details": { "required": ["sites:write"] },
"request_id": "6c0b2f2e-..."
}
}
```
Ajoutez le scope manquant à la clé dans **Paramètres → Développeur → Modifier**, ou créez une clé de remplacement et mettez à jour le secret côté serveur. La modification change le nom et les scopes de la clé sur place ; son expiration et son jeton restent identiques. Les clés émises via OAuth ne peuvent pas être modifiées ; reconnectez l'application pour changer les autorisations qui lui ont été accordées.
## Enveloppe d'erreur [#enveloppe-derreur]
Toutes les erreurs de l'API utilisent la même structure de premier niveau :
```ts
type ApiError = {
error: {
code: string;
message: string;
details?: unknown;
request_id: string;
};
};
```
Basez votre logique sur `error.code`, et non sur le `message` en anglais. Les messages peuvent être améliorés sans changement de version. Consignez `error.request_id` et l'en-tête de réponse `x-request-id` avec le nom de l'opération, le statut et le numéro de la tentative, mais ne consignez jamais l'en-tête d'autorisation ni les secrets de la requête.
## Référence des statuts et des codes [#référence-des-statuts-et-des-codes]
| HTTP | Code stable | Signification | Réponse habituelle |
| ----- | ------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `400` | `invalid_request` | La validation a échoué ou un champ n'est pas pris en charge | Corrigez les champs indiqués dans `details` ; ne réessayez pas avec les mêmes données |
| `400` | `invalid_json` | Le corps n'est pas un objet JSON ou contient du JSON invalide | Sérialisez un seul objet JSON valide |
| `401` | `authentication_required` | L'en-tête Bearer est absent | Joignez un identifiant côté serveur |
| `401` | `invalid_api_key` | La clé est invalide, expirée ou révoquée, ou son propriétaire n'existe plus | Remplacez la clé ou effectuez-en la rotation |
| `403` | `subscription_required` | Le propriétaire n'a pas de forfait payant actif | Rétablissez l'abonnement avant de réessayer |
| `403` | `insufficient_scope` | L'identifiant ne dispose pas du scope requis pour l'opération | Créez un identifiant de remplacement au moindre privilège |
| `403` | `account_paused` | L'accès à l'API est suspendu pour ce compte | Reprenez l'accès à l'API ou contactez le propriétaire du compte |
| `404` | `not_found` | L'endpoint ou la ressource du compte est introuvable | Vérifiez le chemin et l'ID appartenant au tenant |
| `409` | `conflict` | L'état actuel de la ressource empêche l'action | Lisez l'état actuel avant de réessayer |
| `413` | `payload_too_large` | Le corps JSON dépasse la limite de 256 Ko par requête | Envoyez un corps plus petit ; répartissez les contenus volumineux sur plusieurs requêtes |
| `415` | `invalid_request` | Le corps de la requête de modification n'est pas de type `application/json` | Envoyez `Content-Type: application/json` |
| `429` | `rate_limit_exceeded` | Le quota d'une minute du forfait pour cette clé est épuisé | Attendez le délai indiqué par `Retry-After` et appliquez un jitter |
| `500` | `internal_error` | La requête n'a pas pu être traitée | Réessayez une opération sûre ou idempotente et signalez l'ID de requête |
| `503` | `outcome_unknown` | Une modification a peut-être abouti, mais son résultat n'a pas pu être enregistré ; `details.retryable` vaut `false` | Ne réessayez pas. Lisez la ressource pour vérifier si la modification a eu lieu ; la même clé d'idempotence continue de renvoyer ce résultat |
Les ressources extérieures au compte du propriétaire de l'identifiant peuvent renvoyer `404` plutôt que de révéler si l'ID d'un autre tenant existe.
## Détails de validation [#détails-de-validation]
La validation des champs renvoie des chemins que vous pouvez afficher à côté de vos propres champs de formulaire :
```json
{
"error": {
"code": "invalid_request",
"message": "Request validation failed.",
"details": [
{ "path": "content.headline", "message": "String must contain at least 1 character(s)" }
],
"request_id": "6c0b2f2e-..."
}
}
```
Les corps des requêtes de modification doivent être des objets JSON. Les tableaux, les corps vides, les données de formulaire et le JSON envoyé avec un type de contenu texte sont rejetés.
## Décisions de nouvelle tentative [#décisions-de-nouvelle-tentative]
* Réessayez une erreur `429` après le nombre de secondes indiqué dans `Retry-After`.
* Ne réessayez une erreur `500` que pour des lectures sûres ou des écritures protégées par la même `Idempotency-Key`.
* Réessayez l'erreur `409` d'idempotence « en cours » après le délai de l'en-tête `Retry-After: 2`.
* Ne réessayez jamais aveuglément une erreur `503 outcome_unknown`. Vérifiez d'abord la ressource ; n'utilisez une nouvelle clé d'idempotence qu'après avoir confirmé que la modification n'a pas eu lieu.
* Ne réessayez pas les erreurs `400`, `401`, `403`, `404`, `413` ni un conflit d'état tant que la cause n'a pas changé.
Consultez [Limites de débit](/fr/docs/api/rate-limits) pour le comportement de backoff et la [Référence de l'API](/fr/docs/api/reference) pour le scope requis par chaque opération.
---
# État des SDK
Source: /fr/docs/api/sdks.md
{/* docs-visuals */}
L'API REST versionnée est aujourd'hui la seule surface d'intégration publique prise en charge. Le code source des clients JavaScript, Python et des clients pour frameworks existe dans le dépôt du produit, mais les paquets ne sont actuellement publiés ni sur npm ni sur PyPI.
## Disponibilité [#disponibilité]
| Client | Statut | Comment l'utiliser |
| ------------------------------ | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| REST sur HTTPS | **Disponible** | Appelez `https://makeagent.fast/api/v1` depuis n'importe quel client HTTP côté serveur |
| Document OpenAPI | **Disponible** | Téléchargez [/api/openapi.json](/api/openapi.json) et examinez-le avant de générer un client |
| `@make-agent-fast/sdk` | **Préversion en code source — absent de npm** | N'ajoutez pas cet import à un projet de production tant qu'une version publiée sur un registre n'est pas indiquée ici |
| Paquet Python `makeagentfast` | **Préversion en code source — absent de PyPI** | Utilisez `requests`, `httpx` ou la bibliothèque standard de Python tant qu'une version PyPI n'est pas indiquée ici |
| Adaptateurs React, Vue, Svelte | **Préversion en code source — absents de npm** | Privilégiez le modèle de chargement par script documenté pour votre framework |
| Composant web | **Préversion en code source — absent de npm** | Privilégiez le chargeur standard `embed.js` |
N'exécutez pas `npm install @make-agent-fast/sdk` ni `pip install makeagentfast` sur la seule base d'un exemple d'import. Cette page indiquera l'URL du registre, la version, les recommandations d'intégrité et la commande d'installation dès qu'un paquet public sera publié.
## JavaScript sans SDK [#javascript-sans-sdk]
```ts
const response = await fetch("https://makeagent.fast/api/v1/sites?limit=100", {
headers: {
Authorization: `Bearer ${process.env.MAF_API_KEY}`,
Accept: "application/json",
},
});
const body = await response.json();
if (!response.ok) {
console.error(body.error.code, body.error.request_id);
throw new Error(`Make Agent Fast request failed (${response.status})`);
}
for (const site of body.data) console.log(site.id, site.title);
```
Conservez la clé API côté serveur. Un bundle navigateur React, Vue ou Svelte doit appeler votre propre backend ou installer le chargeur d'intégration public ; il ne doit pas appeler l'API de gestion avec un secret.
## Python sans SDK [#python-sans-sdk]
```python
import json
import os
import urllib.request
request = urllib.request.Request(
"https://makeagent.fast/api/v1/sites?limit=100",
headers={
"Authorization": f"Bearer {os.environ['MAF_API_KEY']}",
"Accept": "application/json",
},
)
with urllib.request.urlopen(request, timeout=20) as response:
payload = json.load(response)
for site in payload["data"]:
print(site["id"], site["title"])
```
En production, interceptez `urllib.error.HTTPError` et analysez son corps JSON à l'aide de l'[enveloppe d'erreur stable](/fr/docs/api/scopes-errors).
## Clients générés [#clients-générés]
La génération à partir d'OpenAPI n'est utile que si le document contient les opérations et les schémas dont dépend votre application. Figez la spécification téléchargée, générez le code dans un répertoire facile à relire et examinez chaque différence avant toute mise à niveau.
```bash
curl --fail-with-body https://makeagent.fast/api/openapi.json \
--output make-agent-fast.openapi.json
```
Ne régénérez pas et ne déployez pas automatiquement un client à partir de l'URL en ligne. L'ajout d'un nouveau champ ne devrait pas casser un client, mais le comportement du générateur et les noms des méthodes générées peuvent tout de même changer.
## Ce que doit inclure une version publique d'un SDK [#ce-que-doit-inclure-une-version-publique-dun-sdk]
Avant qu'un client en préversion soit déclaré disponible, il doit proposer :
* Une page publique sur un registre et une version sémantique immuable.
* Des instructions d'installation, de mise à niveau et des environnements d'exécution pris en charge.
* Des modèles typés de requêtes et de réponses générés à partir du contrat d'API complet.
* Des erreurs structurées qui conservent le statut HTTP et l'identifiant de requête.
* Des utilitaires de pagination qui traitent les curseurs comme opaques.
* Une prise en charge explicite des clés d'idempotence pour les mutations.
* Des tests CI par rapport au contrat `/api/v1` actuel et un journal des modifications publié.
Tant que ces conditions ne sont pas remplies, utilisez les exemples REST du [démarrage rapide de l'API](/fr/docs/api/quickstart) et des [recettes d'API](/fr/docs/api/recipes).
---
# Webhooks
Source: /fr/docs/api/webhooks.md
{/* docs-visuals */}
Les webhooks développeur envoient les événements de votre compte à votre serveur, ce qui vous évite d'effectuer des interrogations régulières (polling). La livraison s'effectue au moins une fois : les événements peuvent être dupliqués, retardés ou arriver dans le désordre.
## Enregistrer un point de terminaison [#enregistrer-un-point-de-terminaison]
Créez une clé disposant de la permission `webhooks:write`, puis enregistrez un récepteur HTTPS public ainsi que le plus petit ensemble d'événements dont vous avez besoin.
```bash
curl --fail-with-body https://makeagent.fast/api/v1/webhook-endpoints \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: webhook-production-v1" \
-d '{
"url": "https://api.example.com/webhooks/make-agent-fast",
"events": ["lead.created", "conversation.started"]
}'
```
L'URL doit utiliser HTTPS, ne peut contenir ni nom d'utilisateur, ni mot de passe, ni fragment, ni port personnalisé, et ne doit se résoudre que vers des adresses IP publiques. Les redirections ne sont pas suivies lors de la livraison.
La réponse `201` révèle une seule fois un secret de signature `whsec_...`. Enregistrez-le dans le gestionnaire de secrets du récepteur avant de fermer la réponse. La liste des points de terminaison renvoie ensuite l'URL, les événements, le statut, la dernière livraison et la dernière erreur, mais pas le secret.
## Types d'événements [#types-dévénements]
| Événement | Émis lorsque |
| ------------------------------ | -------------------------------------------------------------------------------------------- |
| `site.published` | Un site est publié |
| `site.unpublished` | Un site repasse à l'état de brouillon |
| `lead.created` | L'agent enregistre un nouveau lead |
| `lead.qualified` | L'agent qualifie un lead, ou un lead est accepté dans le pipeline commercial |
| `booking.requested` | Un visiteur demande ou réserve un créneau |
| `handoff.requested` | L'agent transmet une conversation à une personne |
| `opportunity.created` | Un lead devient une opportunité du pipeline |
| `opportunity.updated` | L'attribution, la valeur, la prochaine action ou d'autres champs d'une opportunité changent |
| `opportunity.stage_changed` | Une opportunité passe à une autre étape |
| `opportunity.won` | Une opportunité est clôturée comme gagnée |
| `opportunity.lost` | Une opportunité est clôturée comme perdue |
| `conversation.started` | Un nouveau fil de conversation démarre |
| `conversation.message.created` | Un message est ajouté à une conversation |
| `knowledge.ready` | Une source de connaissances termine son traitement |
| `broadcast.sent` | Une diffusion termine son flux d'envoi |
| `domain.activated` | Obsolète : les domaines personnalisés ne sont pas proposés ; cet événement n'est jamais émis |
## Format de la requête [#format-de-la-requête]
Make Agent Fast envoie une requête `POST` avec `Content-Type: application/json`, `User-Agent: MakeAgentFast-Webhooks/1.0` et les en-têtes suivants :
```http
maf-event-id: evt_...
maf-event-type: lead.created
maf-signature: t=1784210566,v1=HEX_HMAC_SHA256
```
Le corps JSON repose sur une enveloppe stable. Les champs contenus dans `data` dépendent de l'événement et peuvent recevoir des champs supplémentaires.
```json
{
"id": "evt_2c34...",
"type": "lead.created",
"created_at": "2026-07-16T10:02:46.000Z",
"data": {
"site_id": "SITE_ID",
"lead_id": "LEAD_ID"
}
}
```
Utilisez l'`id` du corps ou `maf-event-id` comme clé de déduplication. N'utilisez ni l'heure de livraison ni un identifiant de base de données généré.
## Vérifier la signature en Node.js [#vérifier-la-signature-en-nodejs]
Lisez les octets bruts exacts avant l'analyse du JSON. La valeur signée est `TIMESTAMP + "." + RAW_BODY`.
```ts
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyWebhook(rawBody: Buffer, header: string, secret: string) {
const values = Object.fromEntries(header.split(",").map((part) => part.split("=", 2)));
const timestamp = values.t;
const supplied = values.v1;
if (!timestamp || !supplied || !/^[a-f0-9]{64}$/.test(supplied)) return false;
const age = Math.abs(Date.now() / 1_000 - Number(timestamp));
if (!Number.isFinite(age) || age > 300) return false;
const expected = createHmac("sha256", secret)
.update(`${timestamp}.`)
.update(rawBody)
.digest("hex");
return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(supplied, "hex"));
}
```
Rejetez les signatures malformées et les horodatages plus anciens que la fenêtre de rejeu que vous acceptez ; cinq minutes constituent une valeur par défaut raisonnable. Comparez des octets de longueur fixe en temps constant.
## Vérifier la signature en Python [#vérifier-la-signature-en-python]
```python
import hashlib
import hmac
import time
def verify_webhook(raw_body: bytes, header: str, secret: str) -> bool:
values = dict(part.split("=", 1) for part in header.split(",") if "=" in part)
timestamp = values.get("t", "")
supplied = values.get("v1", "")
try:
if abs(time.time() - int(timestamp)) > 300:
return False
except ValueError:
return False
signed = timestamp.encode() + b"." + raw_body
expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, supplied)
```
N'analysez et ne traitez le JSON qu'une fois la vérification de la signature réussie.
## Accuser réception et traiter [#accuser-réception-et-traiter]
1. Vérifiez la signature et l'horodatage.
2. Insérez l'identifiant de l'événement dans une table dotée d'une contrainte d'unicité.
3. S'il existe déjà, renvoyez `204` sans répéter l'effet de bord.
4. Validez l'événement (commit) ou mettez votre tâche interne en file d'attente.
5. Renvoyez rapidement une réponse `2xx`.
L'expéditeur de Make Agent Fast expire après 10 secondes. Il ne considère comme réussies que les réponses `2xx` et ne suit pas les redirections.
## Comportement des nouvelles tentatives [#comportement-des-nouvelles-tentatives]
Les livraisons échouées sont mises en file d'attente pour huit tentatives au maximum. Le délai d'attente commence autour de deux secondes, double avec une variation aléatoire (jitter) et est plafonné à une heure ; l'heure réelle de livraison peut être plus tardive lorsque les workers sont occupés. Comme les nouvelles tentatives peuvent survivre à la requête d'origine et arriver dans le désordre, ne partez jamais du principe qu'un événement arrive immédiatement avant un autre.
Ne renvoyez une réponse non `2xx` que si vous souhaitez que Make Agent Fast réessaie. Pour une version d'événement définitivement non prise en charge ou une destination supprimée, acceptez et consignez l'événement, ou supprimez le point de terminaison, plutôt que de produire des échecs transitoires sans fin.
## Renouveler un secret de signature [#renouveler-un-secret-de-signature]
Les secrets de signature ne peuvent être ni révélés ni modifiés. Pour les renouveler en toute sécurité :
1. Créez un second point de terminaison pointant vers un chemin de récepteur temporaire ou versionné.
2. Enregistrez le secret nouvellement révélé.
3. Acceptez et dédupliquez les événements provenant des deux points de terminaison.
4. Vérifiez que le nouveau point de terminaison reçoit des livraisons valides.
5. Supprimez l'ancien point de terminaison avec `DELETE /webhook-endpoints/{endpoint_id}`.
Si l'URL du récepteur reste identique, faites en sorte que l'application réceptrice accepte les deux secrets pendant la période de chevauchement et utilisez les identifiants d'événement pour éviter les effets de bord en double.
## Dépannage [#dépannage]
| Symptôme | À vérifier |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Aucune livraison | Statut du point de terminaison, événements sélectionnés, DNS public, certificat HTTPS, et si l'événement s'est réellement produit |
| Signature non concordante | Accès au corps brut, concaténation exacte `timestamp.body`, secret correct du point de terminaison, et transformations du corps par un proxy |
| Livraisons répétées | Code de retour, délai d'expiration de 10 secondes, exceptions internes et unicité des identifiants d'événement |
| Erreur d'adresse privée | Les enregistrements DNS ne doivent se résoudre que vers des adresses publiques ; localhost et les plages internes sont rejetés |
| Échec de redirection | Enregistrez directement l'URL HTTPS finale ; les redirections ne sont pas suivies |
N'incluez jamais le secret de signature, la clé bearer ni la charge utile complète d'un visiteur dans un message adressé au support. Indiquez l'identifiant du point de terminaison, l'identifiant de l'événement, l'heure de l'échec et des journaux du récepteur nettoyés de toute donnée sensible.
---
# Affichage
Source: /fr/docs/build/appearance.md
{/* docs-visuals */}
L'apparence du widget stylise ensemble le **chat** et l'**appel en direct** du visiteur : couleurs, thème, angles, ombre, effet verre et polices. Elle ne crée pas de page marketing hébergée. Les nouveaux agents sont mis en ligne sous forme d'intégration sur votre site existant.
Ouvrez la page **Agent** de l'agent, puis choisissez l'onglet **Affichage**. Chaque réglage s'applique aux deux surfaces, et le canevas en direct à côté de l'onglet affiche le véritable widget.
## Les modifications sont appliquées automatiquement [#les-modifications-sont-appliquées-automatiquement]
Il n'y a pas de bouton d'enregistrement. Les champs de texte et les curseurs s'enregistrent après une courte pause ; les interrupteurs, les préréglages et les choix s'enregistrent immédiatement, et une info-bulle **Enregistré** apparaît à côté du réglage. Chaque enregistrement met à jour l'agent et actualise l'intégration (ainsi que toute page hébergée résiduelle), de sorte que les visiteurs voient la modification sans attendre une nouvelle publication. Vérifiez le résultat dans une fenêtre privée, sur une véritable intégration.
Le masquage ou l'affichage du badge sur les offres Operate et Scale utilise la même actualisation en direct.
## Utiliser le site, Clair ou Sombre [#utiliser-le-site-clair-ou-sombre]
**Thème de l'agent** propose trois choix :
| Choix | Effet |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| **Utiliser le site** | Suit le mode clair ou sombre de chaque visiteur (d'abord la page hôte, puis le système d'exploitation). Valeur par défaut. |
| **Clair** | Fixe le chat et l'appel en direct sur la palette claire. |
| **Sombre** | Fixe le chat et l'appel en direct sur la palette sombre. |
**Utiliser le site** correspond à `auto`. Un thème Clair ou Sombre fixe s'applique au chat et à l'appel en direct pour tous les visiteurs. Modifiez les palettes claire et sombre séparément ; le sélecteur de l'aperçu change uniquement la palette que vous modifiez.
Dans une intégration, le chargeur peut toujours transmettre `data-theme="light"` ou `data-theme="dark"` comme remplacement défini par l'hôte. Consultez [Présentation de l'intégration](/fr/docs/embed/overview).
## Couleurs, préréglages et typographie [#couleurs-préréglages-et-typographie]
* **Préréglages** (Net, Doux, Verre, Minimal) : ils définissent ensemble les angles, l'ombre, la bordure et l'effet verre.
* **Couleur principale** : bulles du visiteur, accents de l'appel et actions principales. **Auto (accent du site)** reprend la couleur d'accent de la marque détectée sur votre site, utilisée pour le widget.
* Ajustez finement la couleur secondaire, l'arrière-plan, la surface du panneau, les angles, l'ombre, la bordure, l'effet verre et la police.
* **Identique au site** pour la police s'applique lorsque l'agent est intégré à un site externe ; **Widget par défaut** conserve la police du widget.
Veillez à un contraste suffisant et à des états interactifs bien distincts. Faites un aperçu en largeur de bureau et en largeur réduite, avec des libellés en coréen et en anglais.
## Appel en direct dans l'aperçu de l'affichage [#appel-en-direct-dans-laperçu-de-laffichage]
Le canevas à côté de l'onglet **Affichage** montre le véritable widget : le chat et l'appel en direct apparaissent donc avec la palette claire ou sombre sélectionnée et le même habillage visiteur que dans l'intégration. Parler à l'agent à cet endroit reste un test réalisé par le propriétaire. Consultez [Voix et appels en direct](/fr/docs/build/voice).
## Badge de marque [#badge-de-marque]
La suppression du badge est disponible sur les offres Operate et Scale. Les sites de l'offre Launch conservent le badge de parrainage Make Agent Fast. La modification du réglage du badge (**Afficher le badge « Made with »**) met également à jour l'intégration en direct, sans nouvelle publication.
---
# Réservation avec Cal.com
Source: /fr/docs/build/cal-com.md
{/* docs-visuals */}
## Connecter votre calendrier [#connecter-votre-calendrier]
Ouvrez **Agent → Actions → Cal.com**. Saisissez une clé API Cal.com commençant par `cal_`, l'identifiant numérique positif du type d'événement et un fuseau horaire IANA tel que `Asia/Seoul`. Choisissez **Enregistrer la connexion**. Chaque agent dispose de sa propre connexion. La clé est chiffrée côté serveur ; le tableau de bord n'en affiche que les quatre derniers caractères. Lorsque vous mettez à jour une connexion existante, laissez le champ de la clé vide pour la conserver.
Choisissez **Tester la connexion** pour lire jusqu'à trois prochains créneaux sur les sept jours à venir, à partir des paramètres saisis. Ce test n'enregistre pas la connexion et ne crée aucune réservation. L'absence de créneaux peut simplement signifier que le type d'événement n'a aucune disponibilité sur cette période. Si le test échoue, vérifiez la clé, le type d'événement et le planning dans Cal.com. La suppression de la connexion interrompt les nouvelles réservations Cal.com ; elle n'annule pas les réservations existantes.
Les paiements ne sont pas pris en charge. [Google Calendar](/fr/docs/build/google-calendar) constitue une option distincte, qui n'est pas encore disponible pour tous.
## Des créneaux à la réservation [#des-créneaux-à-la-réservation]
1. L'agent appelle `find_slots` pour obtenir les vraies disponibilités futures. Il présente jusqu'à huit horaires dans le fuseau horaire configuré. La plage par défaut va d'aujourd'hui jusqu'à sept jours plus tard ; l'intervalle maximal est de 14 jours. Lorsqu'un seul horaire est disponible, il est présenté seul.
2. Le client choisit un horaire et fournit son nom, son e-mail et, facultativement, une note. L'agent vérifie à nouveau que l'horaire est libre et qu'il a bien été proposé dans cette conversation. Les propositions de créneaux expirent au bout de 15 minutes.
3. Une carte de confirmation indique la date, l'heure, le fuseau horaire et les informations du participant. Le client doit appuyer sur **Confirmer**. Un message dans le chat ou la simple sélection d'un horaire ne réserve rien. La proposition expire au bout de 15 minutes et ne bloque pas le créneau.
4. Ce n'est qu'après la confirmation que l'adaptateur demande la réservation à Cal.com. Un résultat Cal.com `accepted` devient `done`, avec l'UID de la réservation comme référence. Les statuts `pending` ou `awaiting_host` restent en attente ; un refus ou une annulation devient un échec.
Sur les canaux de messagerie, les propositions de réservation ne sont disponibles que dans les conversations privées. La répétition ne appelle pas Cal.com et ne crée aucune réservation. Sans connexion Cal.com, le flux existant de demande de réservation reste disponible ; il ne prouve pas qu'un créneau a été réservé dans un calendrier. Modifier la clé, le type d'événement ou le fuseau horaire invalide la cible d'exécution d'une proposition : recommencez après toute modification de la connexion.
## Si un créneau est pris ou si le résultat est incertain [#si-un-créneau-est-pris-ou-si-le-résultat-est-incertain]
Un autre client peut prendre un créneau avant que la confirmation ne soit terminée. Si l'horaire n'est plus libre, l'agent indique qu'il n'est pas disponible ; si Cal.com refuse la réservation lors de sa création, le reçu indique un échec. Demandez de nouveaux horaires et confirmez une nouvelle proposition. Le reçu d'échec ne joint pas automatiquement de nouveaux choix.
Un délai d'attente réseau ne prouve ni l'échec ni la réussite. Le reçu affiche un résultat inconnu pendant que le service effectue une nouvelle vérification. Le point de terminaison de création de Cal.com n'a pas de contrat d'idempotency-key documenté ; l'adaptateur enregistre donc l'identifiant d'exécution dans `metadata.maf_run` et recherche cette réservation, tous statuts et toutes pages confondus, avant de retenter la création. Une recherche incomplète n'autorise jamais une nouvelle requête de création. Cela réduit le risque de doublon, mais ne constitue pas une garantie d'exécution unique (exactly-once) offerte par le fournisseur. Avant de faire une nouvelle réservation après l'épuisement des tentatives, vérifiez dans Cal.com.
L'approbation de l'hôte dans Cal.com est distincte de l'approbation du propriétaire pour les actions de modification personnalisées. Une réservation Cal.com en attente n'est pas actualisée automatiquement par cette intégration ; vérifiez son statut final dans Cal.com. Le widget web peut interroger régulièrement le reçu d'exécution enregistré, et les canaux privés pris en charge reçoivent des reçus différés, dans la limite de leurs fenêtres de service. Consultez [la remise des reçus](/fr/docs/build/change-actions#customer-confirmation-and-receipts).
## Versions de l'API et vérifications avant mise en production [#versions-de-lapi-et-vérifications-avant-mise-en-production]
L'adaptateur envoie une authentification Bearer et les valeurs `cal-api-version` suivantes, propres à chaque point de terminaison, vérifiées dans la documentation officielle le **2026-10-13** :
| Opération | Version | Référence |
| ------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------- |
| Lecture des créneaux | `2024-09-04` | [GET /v2/slots](https://cal.com/docs/api-reference/v2/slots/get-available-time-slots-for-an-event-type) |
| Création d'une réservation | `2026-02-25` | [POST /v2/bookings](https://cal.com/docs/api-reference/v2/bookings/create-a-booking) |
| Rapprochement d'une réservation | `2026-05-01` | [GET /v2/bookings](https://cal.com/docs/api-reference/v2/bookings/get-all-bookings) |
Avant de l'utiliser avec des clients, testez une réservation contrôlée, vérifiez l'UID dans Cal.com, essayez un créneau déjà pris et contrôlez les reçus sur chaque canal prévu. Un test de connexion réussi prouve uniquement qu'une lecture de créneaux fonctionne, pas qu'une vraie réservation est possible ni que la configuration est prête pour la production.
---
# Actions de modification
Source: /fr/docs/build/change-actions.md
{/* docs-visuals */}
## Définir une modification [#définir-une-modification]
Utilisez une action de modification pour mettre à jour un enregistrement dans votre propre système, par exemple pour annuler une commande. Ouvrez **Agent → Actions**, configurez le secret de votre agent dans **Clients connectés**, puis ajoutez une **Action de modification** : un nom unique, une description des cas d'utilisation, un point de terminaison HTTPS public et des entrées de type chaîne déclarées. Un nom tel que `cancel_order` devient l'outil du modèle `change_cancel_order`. Les modifications des actions existantes sont enregistrées automatiquement ; attendez l'indicateur d'enregistrement.
Laissez l'option **Client connecté requis** activée pour les enregistrements privés. Votre point de terminaison doit tout de même vérifier que le client authentifié est autorisé à accéder à l'enregistrement demandé, à partir de son identifiant vérifié. Un nom, un e-mail ou un numéro de commande saisi dans le chat ne constitue pas une preuve d'identité. Si vous désactivez ce paramètre, `customer` peut être nul : n'autorisez alors que les modifications adaptées à des visiteurs anonymes. Les paiements sont en dehors du périmètre de cette fonctionnalité.
## Choisir l'approbation du propriétaire [#choisir-lapprobation-du-propriétaire]
La confirmation du client est requise dans tous les modes :
| Mode | Après la confirmation du client |
| ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Sans approbation (`none`) | Exécution sans décision distincte du propriétaire. |
| Toujours approuver (`always`) | Attente de la décision du propriétaire. |
| Au-delà d'une limite (`over_limit`) | Attente lorsqu'une entrée numérique déclarée est strictement supérieure à la limite ; l'égalité ne nécessite pas d'approbation. Une entrée numérique invalide est rejetée. |
Consultez les demandes en attente dans **Agent → Actions → Approbations**. Le propriétaire du site peut approuver ou refuser. Si des alertes privées Telegram pour le propriétaire sont associées, l'alerte comporte aussi les boutons **Approuver / Refuser**. Seul le chat privé du propriétaire associé peut les utiliser ; les appuis expirés ou répétés ne peuvent pas déclencher une nouvelle exécution. L'approbation expire 24 heures après la confirmation du client. Le client reçoit le résultat, y compris un refus ou une expiration. Les exécutions récentes affichent le statut, les horodatages, la référence et l'identifiant du client.
## Ce que reçoit votre point de terminaison [#ce-que-reçoit-votre-point-de-terminaison]
Aucune requête n'est envoyée lorsque le modèle propose la modification. Après la confirmation du client et l'éventuelle approbation requise du propriétaire, Make Agent Fast envoie :
```http
POST /agent/cancel-order HTTP/1.1
Content-Type: application/json
x-maf-timestamp:
x-maf-signature: v1=<64-lowercase-hex-characters>
x-maf-idempotency-key: c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b
```
```json
{
"version": 1,
"action": "cancel_order",
"runId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"requestId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"siteId": "YOUR_SITE_ID",
"input": { "order_id": "A128" },
"customer": { "id": "customer_123", "email": "customer@example.com" }
}
```
`action` n'inclut pas le préfixe `change_`. Les deux identifiants et l'en-tête d'idempotence restent identiques lors des nouvelles tentatives. `input` ne contient que des chaînes déclarées et nettoyées des espaces superflus ; `customer` est nul ou correspond à l'objet vérifié comprenant `id` et, en option, `email`/`name`.
Utilisez le [vérificateur de signature des consultations](/fr/docs/build/lookups#verify-the-signature) : HMAC-SHA256 avec le secret de votre agent sur `"maf-webhook-v1:" + timestamp + "." + rawBody`, en hexadécimal minuscule précédé de `v1=`. Vérifiez les octets d'origine, la fraîcheur de l'horodatage, le site et l'action attendus, ainsi que l'appartenance au client avant toute écriture. **Dédoublonnez de façon atomique `x-maf-idempotency-key` avec votre modification et conservez le résultat.** Une requête répétée doit renvoyer le résultat enregistré sans modifier à nouveau l'enregistrement. Le verrouillage de la plateforme ne peut pas remplacer le dédoublonnage dans votre système.
## Renvoyer un résultat [#renvoyer-un-résultat]
Renvoyez un JSON 2xx avec le champ obligatoire `status` (`done`, `pending` ou `failed`) et les champs facultatifs `message`, `reference` et `card` :
```json
{
"status": "done",
"message": "Order cancelled.",
"reference": "A128",
"card": {
"kind": "status",
"title": "Order A128",
"fields": [{ "label": "Order", "value": "A128" }]
}
}
```
La carte de statut facultative requiert `title` et `fields` ; `kind: "status"` est facultatif. Elle prend en charge `status: { label, tone }`, `reference`, `asOf` et `link: { label, url }`, comme dans les [consultations](/fr/docs/build/lookups#return-a-response). Les tons possibles sont `neutral`, `success`, `warning` ou `danger` ; les liens doivent être des URL HTTPS sûres. Les champs de schéma inconnus sont rejetés. Gardez des textes courts et simples. Le `status` de niveau supérieur détermine le résultat ; le libellé de la carte ne peut pas transformer un résultat en attente en succès.
Utilisez `done` uniquement lorsque la modification est terminée, `pending` lorsqu'elle est encore en cours de traitement, et `failed` en cas d'échec avéré. Les délais d'attente dépassés, les erreurs réseau, les erreurs 5xx et les réponses invalides sont considérés comme incertains (`unknown`). Le rapprochement réessaie après une minute, puis cinq minutes, avec au maximum trois tentatives d'exécution et la même clé ; la planification des files d'attente peut retarder ces délais. Une erreur HTTP 4xx échoue sans nouvelle tentative. Si l'incertitude persiste après épuisement des tentatives, l'exécution échoue et le propriétaire est averti, mais cela ne prouve pas que votre système n'a effectué aucune modification. Vérifiez avant de lancer une autre exécution. `pending` ne déclenche pas de nouvelle exécution.
## Envoyer un rappel final signé [#envoyer-un-rappel-final-signé]
Lorsqu'une exécution `pending` ou `unknown` est résolue, envoyez une réponse finale par POST à `https://makeagent.fast/api/agent/actions/RUN_ID/callback`. Envoyez le même contrat de réponse avec `status: "done"` ou `"failed"` ; `pending` n'est pas accepté ici.
Contrat de rappel mis à jour le 2026-10-14 : signez `maf-callback-v1:` + runId + `:` + timestamp + `.` + rawBody. Si le corps contient `runId`, il doit correspondre à l'identifiant d'exécution du chemin ; une différence renvoie 400. Les signatures d'une autre exécution ou de l'ancien format non lié renvoient 403.
```js
import { createHmac } from "node:crypto";
const body = JSON.stringify({ status: "done", reference: "A128" });
const timestamp = String(Math.floor(Date.now() / 1000));
const signature = createHmac("sha256", agentSecret)
.update(`maf-callback-v1:${runId}:${timestamp}.${body}`)
.digest("hex");
const response = await fetch(
`https://makeagent.fast/api/agent/actions/${encodeURIComponent(runId)}/callback`,
{
method: "POST",
headers: {
"content-type": "application/json",
"x-maf-timestamp": timestamp,
"x-maf-signature": `v1=${signature}`,
},
body,
},
);
```
Utilisez le secret de votre agent conservé côté serveur et l'identifiant d'exécution reçu dans la requête d'origine. Le rappel utilise **`maf-callback-v1:`**, et non l'espace de noms de la requête sortante. Le décalage d'horodatage doit rester inférieur à cinq minutes. Les signatures invalides renvoient 403 ; les corps invalides renvoient 400 ; une exécution déjà terminée ou incompatible renvoie 409. Un rappel répété n'écrase pas le résultat final. Effectuez la rotation de ce secret en même temps que votre configuration d'identité et de signature du point de terminaison.
## Confirmation du client et accusés [#confirmation-du-client-et-accusés]
Le client examine les entrées exactes et appuie sur **Confirmer** ou **Annuler** dans la proposition. Une proposition expire après 15 minutes ; une nouvelle proposition pour la même action et la même conversation remplace l'ancienne. La confirmation utilise un jeton lié à cette exécution, à ce site et à ce visiteur. Saisir « oui » ou cliquer sur une carte de confirmation générique n'autorise pas la modification. Les boutons de répétition sont inactifs et n'appellent pas votre point de terminaison.
Sur le web, le widget ouvert interroge régulièrement les accusés non terminaux, d'abord toutes les cinq secondes, puis toutes les 30 secondes, pendant 24 heures au maximum. Un accusé peut indiquer : demandé, en attente du propriétaire, en cours, en attente (pending), vérification d'un résultat inconnu, terminé, échoué, refusé, annulé ou expiré. Seul `done` confirme l'achèvement.
Les propositions sur les canaux fonctionnent **uniquement dans les chats privés**, jamais dans les groupes ou les canaux publics. Les accusés différés utilisent la file d'envoi durable : les messages privés ordinaires de bot Telegram sont pris en charge ; WhatsApp, Messenger, Instagram et Telegram Business exigent un message entrant enregistré dans les dernières 24 heures, vérifié à nouveau au moment de l'envoi. L'envoi différé n'est pas disponible pour les requêtes invité Telegram, Discord et KakaoTalk. Les fenêtres fermées et les connexions désactivées peuvent empêcher la livraison ; l'historique des exécutions enregistre néanmoins le résultat.
## Limites et tests [#limites-et-tests]
| Élément | Limite |
| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Actions de modification | 5 par agent ; noms uniques parmi les modifications et les consultations |
| Noms | Action : `^[a-z][a-z0-9_]{2,39}$` ; entrée : `^[a-z][a-z0-9_]{1,31}$` ; noms d'action réservés indisponibles |
| Descriptions | 300 caractères |
| Entrées | 3 chaînes déclarées, chacune de 200 caractères maximum |
| Point de terminaison | HTTPS public, 500 caractères maximum, sans identifiants dans l'URL, sans adresses privées ni redirections |
| Délai d'exécution / réponse / corps du rappel | 8 secondes / 32 Kio / 32 Kio |
| Titre de la carte de statut / libellé du champ / valeur / champs | 80 / 40 / 200 caractères / 8 champs |
| Expiration de la proposition / de l'approbation | 15 minutes / 24 heures après la confirmation |
Utilisez un point de terminaison contrôlé pour vérifier la confirmation, l'annulation, l'approbation, le délai d'attente dépassé, la gestion des clés en double et les rappels finaux. Vérifiez ses enregistrements, et pas seulement le texte de l'accusé. La répétition prouve qu'aucune écriture externe n'a lieu ; ce n'est pas un test d'exécution du point de terminaison. Testez chaque canal privé prévu avant de vous fier aux accusés.
---
# Créer un agent
Source: /fr/docs/build/create-agent.md
{/* docs-visuals */}
Le premier agent part d'une **URL de site web**. Nous explorons les pages publiques accessibles, rédigeons un brouillon d'agent (y compris le style du widget à partir de ces informations) et le gardons hors de votre site web jusqu'à la dernière étape de l'onboarding. La création par chat est désactivée. Il n'existe aucune fonctionnalité de génération de site ni de création par sections.
## Collez une URL [#collez-une-url]
Sur la page d'accueil, collez l'URL et continuez. L'inscription et la connexion conservent `next=/onboarding/launch?url=…`, vous n'avez donc pas à la coller une seconde fois. `/try` permet aux visiteurs de coller une URL et de discuter avec un brouillon filigrané (texte uniquement, avec limite d'usage) avant de le revendiquer lors de l'inscription.
Si vous avez déjà des sites, une URL collée crée tout de même un **nouveau** brouillon non publié. Si la même URL est déjà en cours de traitement, celle-ci est reprise au lieu d'être dupliquée. Un site de première utilisation déjà terminé n'est pas réutilisé.
Ne collez pas de mots de passe, de données privées de customers ni de jetons de connecteur dans le champ d'URL.
## Patientez sur l'écran de génération [#patientez-sur-lécran-de-génération]
Pendant la création du brouillon, l'écran de génération affiche la progression réelle de l'ingestion, de la composition et de l'examen — et non un faux indicateur de chargement :
| Étape | Ce qu'elle fait |
| ----------------------- | ------------------------------------------------------------------------- |
| **Lecture du site** | Récupère les pages publiques à partir de l'URL |
| **Création de l'agent** | Compose l'agent et le style du widget à partir des informations explorées |
| **Test des réponses** | Lance un autotest à partir de ces connaissances |
L'attente typique est de quelques secondes ; un site plus volumineux peut prendre jusqu'à environ une minute. Si l'exploration donne peu de résultats, le brouillon utilise tout de même ce qui a été trouvé. Vous pouvez ajouter des sources après la relecture.
Le brouillon n'est jamais publié automatiquement. Les nouveaux agents ne disposent pas d'une page marketing hébergée.
## Découvrez l'agent et mettez-le en ligne [#découvrez-lagent-et-mettez-le-en-ligne]
Une fois le brouillon créé, l'onboarding affiche deux écrans supplémentaires :
* **Découvrez votre agent** — le vrai chat à côté de trois vérifications rapides. Posez une question, lisez la réponse, puis acceptez-la ou corrigez-la. Les essais en texte consomment des credits ; les demandes de contact et les actions sont simulées.
* **Placez-le là où sont vos customers** — la dernière étape. Elle active le widget pour le site web que vous avez collé et active l'**Agent link** (une page de chat publique à l'adresse propre de votre agent) afin que vous puissiez le tester sur votre téléphone sous **Tester sur votre téléphone**. Ajoutez le code d'installation à votre site, puis cliquez sur **Vérifier mon site**.
Ensuite, l'agent s'ouvre sur sa page **Agent**, le premier élément de la barre latérale de l'agent : les onglets **Vue d'ensemble**, **Affichage**, **Voix** et **Actions** à côté d'un canevas en direct qui montre le vrai widget dans le coin que vous avez choisi. Posez-lui la question qu'un customer poserait à cet endroit. Dans **Vue d'ensemble**, **Vérification des réponses** → **Lancer une vérification** évalue les réponses par rapport à vos connaissances.
Discuter avec l'agent dans le tableau de bord est un test de l'owner. Cela ne met pas l'agent en ligne et ne compte pas pour l'activation.
Pour placer le widget sur votre site web plus tard, ouvrez **Mettre en ligne** → **Widget de site web** sur la page Agent. Si le widget n'est pas encore activé, choisissez **Activer l'intégration**. Une fois activé, la même fenêtre affiche le code d'installation, l'interrupteur **L'afficher sur mon site web** et **Adresses de sites web autorisées**. Vous pouvez masquer le widget à tout moment avec cet interrupteur ou avec la carte **Sur votre site web** de l'onglet **Vue d'ensemble**.
## Activation [#activation]
Une fois en ligne, ajoutez l'intégration ou connectez un channel. Le site est **activé** par la première conversation d'un visiteur ou par le premier lead capturé. Les échanges de test dans le tableau de bord ne comptent jamais.
## Modifier après le premier brouillon [#modifier-après-le-premier-brouillon]
Il n'y a pas de création par chat. Après la relecture, mettez à jour :
* Les instructions dans l'onglet **Vue d'ensemble** de la page Agent, ainsi que **Voix** et **Affichage** dans leurs onglets voisins.
* Les **Connaissances** sur leur propre page dans la barre latérale de l'agent.
* Les modifications d'**Affichage** sont enregistrées automatiquement et mettent à jour l'intégration en ligne sans nouvelle publication.
## Commencer sans URL de site web [#commencer-sans-url-de-site-web]
Si vous envoyez le formulaire de la page d'accueil vide, **Try** s'ouvre quand même. Les visiteurs anonymes peuvent y coller une URL et discuter avec un brouillon ; revendiquez-le lors de l'inscription pour poursuivre l'onboarding. Une URL collée suit toujours le parcours de l'écran de génération décrit ci-dessus.
---
# FAQ et produits
Source: /fr/docs/build/faqs-products.md
{/* docs-visuals */}
## Utiliser les FAQ pour les réponses de référence [#utiliser-les-faq-pour-les-réponses-de-référence]
Créez une FAQ par intention de visiteur. Rédigez la question avec les mots employés par vos customers et veillez à ce que la réponse soit complète, sans dépendre d'une autre FAQ.
## Utiliser les produits pour les informations de catalogue [#utiliser-les-produits-pour-les-informations-de-catalogue]
Les produits conviennent à une offre nommée comportant des champs tels que la description, le prix, la disponibilité ou un lien. Maintenez à jour les informations transactionnelles et évitez de promettre des stocks ou des délais de livraison, sauf si votre source est mise à jour de façon fiable.
## Éviter les doublons [#éviter-les-doublons]
Ne gérez pas le même prix dans une note, une FAQ, une section de page et une fiche produit. Choisissez une seule source de référence et renvoyez-y depuis les autres emplacements.
## Vérifier le comportement côté customer [#vérifier-le-comportement-côté-customer]
Après une modification, posez à l'agent la question de la FAQ avec plusieurs formulations et vérifiez que le lien et le prix du produit sont corrects.
---
# Relances et rappels
Source: /fr/docs/build/follow-ups.md
{/* docs-visuals */}
## Proposer de l'aide au bon moment [#proposer-de-laide-au-bon-moment]
Ouvrez **Agent → Actions → Relances**. Ajoutez jusqu'à cinq règles pour une vue de page, un visiteur inactif, une intention de départ, une erreur de formulaire ou un événement personnalisé. Choisissez un motif de chemin, un délai facultatif, un message de 200 caractères maximum et jusqu'à trois réponses rapides. Les paramètres s'enregistrent automatiquement. L'aperçu affiche le message sans contacter de client ni ajouter de données d'expérimentation.
Utilisez `/pricing` pour un seul chemin, `/products/*` pour un segment ou `/products/**` pour des chemins imbriqués. Les paramètres de requête et les fragments sont exclus. Le délai d'inactivité par défaut est de 30 secondes et le délai de réactivation par défaut est de sept jours. Un déclencheur n'interrompt pas une prise en charge par un humain ni une conversation active en cours, ne se répète pas au sein d'une même session et ne réapparaît pas après avoir été fermé durant cette session.
L'intégration (embed) signale les vues de page, l'inactivité et l'intention de départ. Votre développeur peut signaler des événements personnalisés avec `MakeAgentFast.track` ; consultez [Actions de page](/fr/docs/build/page-actions). Le signalement automatique des erreurs de formulaire est désactivé, sauf si l'intégration utilise `data-auto-form-error="true"` ou `MakeAgentFastSettings.autoFormError = true`. Il transmet l'identifiant du formulaire, jamais les valeurs des champs.
## Lire les résultats du groupe de contrôle [#lire-les-résultats-du-groupe-de-contrôle]
Par défaut, 10 % des visiteurs éligibles sont affectés à un groupe de contrôle stable et ne voient aucun message. L'affectation est liée au visiteur et à la règle ; les visites répétées ne gonflent donc pas l'échantillon. Le tableau de bord compare les taux de conversion des visiteurs éligibles entre le groupe qui reçoit le message et le groupe de contrôle, puis affiche l'écart absolu en points de pourcentage.
Une conversion correspond à un lead enregistré, une réservation, une action terminée ou une recherche réussie dans les 24 heures suivant une exposition éligible. L'ouverture ou la réponse sont affichées séparément. Les événements signalés par le navigateur ne peuvent pas déclarer de conversions. En dessous de 50 visiteurs par groupe, le tableau de bord indique qu'il n'y a pas assez de données ; à partir de ce seuil, il affiche un intervalle simple à 95 %. De faibles écarts ne prouvent pas que le message a généré davantage de ventes.
## Prévenir un client lorsque quelque chose change [#prévenir-un-client-lorsque-quelque-chose-change]
Les clients peuvent demander « Prévenez-moi quand un créneau se libère » ou « Informez-moi quand le statut de ma commande change ». Une surveillance suit les disponibilités d'un calendrier connecté ou un champ/statut dans une [recherche](/fr/docs/build/lookups) configurée. Les surveillances de recherche nécessitent un client connecté et vérifié. Elles ne surveillent pas des pages arbitraires et ne planifient pas de rappels récurrents.
L'agent propose une surveillance en indiquant sa destination et sa date de fin. Le client doit appuyer sur le bouton de confirmation dans un délai de 15 minutes. Les visiteurs du site web et des appels en direct saisissent également une adresse e-mail et cochent à l'écran la case de consentement à l'e-mail ; un « oui » saisi ou prononcé ne suffit pas. L'e-mail contient un avis générique et un lien de retour à durée de vie limitée. Ce lien ne connecte pas le destinataire et ne donne pas accès aux dossiers clients.
Chaque visiteur peut avoir trois surveillances actives ou en attente, avec un maximum de 50 par agent et une durée maximale de 14 jours. Les vérifications commencent après 15 minutes, puis s'espacent à une heure et à six heures. Chaque surveillance envoie une seule tentative de notification, puis s'arrête. Annulez-la via les commandes de la surveillance ou la liste Relances du propriétaire. Modifier la configuration de la recherche ou du calendrier sous-jacent peut arrêter une surveillance. Un envoi dont le résultat est incertain n'est pas renvoyé automatiquement.
## Relancer dans les chats et vous solliciter en cas de blocage [#relancer-dans-les-chats-et-vous-solliciter-en-cas-de-blocage]
Ouvrez **Agent → Actions → Relances → Relances de chat**. Ces deux interrupteurs s'appliquent aux chats Telegram, WhatsApp, Messenger et Instagram.
**Relancer lorsqu'un client ne répond plus** est activé par défaut pour les agents commerciaux et désactivé pour les autres types d'agents. Lorsqu'un client cesse de répondre après une réponse, l'agent relit le chat puis envoie un court message, attend un peu plus longtemps ou laisse le client tranquille. Un agent commercial oriente vers l'achat, un agent de service vérifie que le problème est résolu et un agent de réservation propose un créneau. Il s'appuie uniquement sur vos connaissances approuvées et sur la conversation, et s'arrête lorsque le client répond, refuse ou demande à ne pas être contacté. Les canaux Meta n'acceptent les messages automatisés que dans les 24 heures suivant le dernier message du client ; la relance y arrive donc dans la journée, tandis qu'un chat avec un bot Telegram peut recevoir jusqu'à deux relances sur quelques jours. Chaque relance est facturée comme une réponse.
**Me demander quand l'agent ne peut pas répondre** est activé par défaut. Au lieu de demander une adresse e-mail, l'agent indique au client qu'il vérifie auprès de l'équipe et vous alerte avec un lien vers la conversation. Répondez-y, ou enregistrez la réponse dans les connaissances, et l'agent l'envoie au client dans sa langue. Instagram et Messenger acceptent votre réponse pendant 24 heures après le dernier message du client, ou jusqu'à 7 jours une fois que votre application Meta dispose de l'autorisation Human Agent.
## Livraison et disponibilité [#livraison-et-disponibilité]
| Destination | Limite actuelle |
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| Site web / appel en direct | E-mail avec consentement explicite ; pas de notification push en arrière-plan via le widget |
| Telegram | Chat privé existant avec le bot ; un chat Business privé nécessite également une fenêtre de 24 heures ouverte |
| WhatsApp | Message libre dans les 24 heures suivant un message entrant du client ; en dehors, un modèle utilitaire approuvé est requis |
| Messenger / Instagram | Uniquement dans les 24 heures suivant un message entrant du client |
| Discord / KakaoTalk | Transport de surveillance indisponible ; la politique de Kakao exige en outre un modèle AlimTalk et exclut la plage 20:50–08:00 KST |
Les restrictions des canaux sont vérifiées de nouveau au moment de l'envoi. Une surveillance consentie ne les contourne pas et ne garantit pas la livraison d'un message.
---
# Google Calendar
Source: /fr/docs/build/google-calendar.md
{/* docs-visuals */}
## Disponibilité de la fonctionnalité [#disponibilité-de-la-fonctionnalité]
**Google Calendar n'est pas encore disponible pour tous.** Tant qu'il n'est pas activé, **Agent → Actions → Google Calendar** affiche « bientôt disponible » et la connexion est impossible ; aucun paramètre de l'agent ne permet de l'activer. [Cal.com](/fr/docs/build/cal-com) reste une option distincte.
## Connecter un agenda [#connecter-un-agenda]
Lorsque l'intégration est activée, ouvrez le panneau Google Calendar et choisissez **Connecter**. Connectez-vous à Google et vérifiez les autorisations demandées pour les événements de l'agenda et les disponibilités (libre/occupé). Cette connexion est distincte de la connexion à Make Agent Fast. Le serveur stocke le jeton d'actualisation de manière chiffrée ; ni le tableau de bord ni l'agent ne le reçoivent.
Les scopes demandés sont `calendar.events`, `calendar.freebusy`, ainsi que les scopes non sensibles `openid` et `email`. Le callback exige une adresse e-mail vérifiée et la stocke chiffrée afin de faire correspondre `primary` au même ID d'agenda que son écriture explicite par adresse e-mail. Aucun scope de profil n'est demandé. Les connexions plus anciennes, sans adresse e-mail vérifiée, doivent être déconnectées puis reconnectées avant toute réservation.
Un agent utilise un seul fournisseur d'agenda à la fois. Déconnectez le fournisseur existant avant d'en changer. Choisissez l'ID de l'agenda (`primary` pour l'agenda principal du compte connecté) et son fuseau horaire IANA, par exemple `Asia/Seoul`. Un agenda partagé doit être accessible avec les autorisations du compte connecté. La déconnexion révoque l'accès accordé à Google et supprime la connexion ; elle n'annule pas les événements existants.
## Définir les horaires de travail [#définir-les-horaires-de-travail]
Les nouvelles connexions n'ont aucun horaire de travail : aucun créneau n'est proposé tant que vous n'en avez pas ajouté. Ajoutez des plages d'ouverture et de fermeture pour chaque jour de travail. Un jour vide est considéré comme fermé ; plusieurs plages sans chevauchement permettent de prévoir une pause déjeuner. Les horaires sont interprétés dans le fuseau horaire sélectionné. Les paramètres sont enregistrés automatiquement.
| Paramètre | Plage acceptée |
| ----------------------------------- | --------------------------------------------------- |
| Durée du créneau | 5 à 240 minutes |
| Marge autour des événements occupés | 0 à 120 minutes |
| Préavis minimum | 0 à 43 200 minutes |
| Horizon de réservation | 1 à 90 jours |
| Plages de travail | Jusqu'à 28 plages sans chevauchement sur la semaine |
La disponibilité correspond aux horaires de travail, moins les plages occupées de l'agenda sélectionné, la marge, le préavis minimum et l'horizon. Définissez les horaires dans le fuseau horaire prévu pour l'agenda et vérifiez les changements d'heure été/hiver le cas échéant. L'absence de créneaux peut signifier des horaires de fermeture ou des plages occupées, plutôt qu'une erreur de connexion.
## De la disponibilité à la réservation [#de-la-disponibilité-à-la-réservation]
L'agent utilise le même flux `find_slots` et `book_slot` que Cal.com : il propose jusqu'à huit créneaux disponibles, recueille le nom et l'adresse e-mail ainsi qu'une note facultative, revérifie le créneau choisi, puis affiche une carte de confirmation. Les propositions et les offres expirent au bout de 15 minutes ; aucune des deux ne bloque le créneau. Seul l'appui du client sur le bouton autorise la réservation. Un « oui » prononcé pendant un appel en direct ne peut pas la déclencher.
Après confirmation, Google reçoit un événement dont l'ID déterministe est lié à l'exécution de l'action, et envoie les invitations aux participants. Un événement confirmé et validé produit un reçu finalisé ; les événements provisoires restent en attente. Si un créneau est déjà pris, demandez de nouveaux horaires et faites confirmer à nouveau. En cas de résultat réseau incertain, la vérification s'effectue avec le même ID d'événement ; ne considérez pas un délai d'attente dépassé comme une réussite et ne créez pas aveuglément une autre réservation. Toute modification de la configuration invalide les offres et propositions précédentes.
Pour être averti lorsqu'un créneau se libère, utilisez une [surveillance](/fr/docs/build/follow-ups) avec consentement. Avant toute utilisation par des clients, vérifiez une vraie réservation et son invitation dans Google, testez un créneau déjà pris, puis contrôlez la déconnexion et la reconnexion ainsi que le canal de messagerie prévu.
---
# Sources de connaissances
Source: /fr/docs/build/knowledge.md
{/* docs-visuals */}
Les connaissances fournissent à l'agent du matériel source exploitable par recherche. Lorsque vous ajoutez une source, le texte brut est extrait, découpé en passages, converti en embeddings, puis associé au site actuel. Au moment de répondre, l'agent récupère les passages pertinents au lieu de recevoir toutes les sources dans chaque prompt.
## Choisir le bon type de source [#choisir-le-bon-type-de-source]
| Source | Idéal pour | Comportement important |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Coller du texte** | Politiques, coordonnées, courtes notes internes | 5 à 200 000 caractères ; pas d'actualisation automatique |
| **Depuis une URL** | Pages publiques maintenues ailleurs | Une seule page par défaut ; possibilité d'explorer 5, 10, 20 ou 40 pages du même site |
| **Importer un fichier** | PDF, Word (`.docx`, `.doc`), Excel (`.xlsx`, `.xls`), PowerPoint (`.pptx`), Hancom `.hwp` et `.hwpx`, OpenDocument (`.odt`, `.ods`, `.odp`), `.rtf`, `.txt`, `.md`, `.csv`, `.tsv`, `.json`, `.html` | 20 Mo maximum ; les fichiers protégés par mot de passe et ceux contenant des macros sont refusés ; les PDF scannés composés uniquement d'images n'ont pas de texte sélectionnable |
| **YouTube** | Vidéos publiques au contenu parlé utile | Offres Operate ou Scale. Essaie d'abord les sous-titres, puis la transcription disponible ; au mieux |
| **Podcast** | L'URL audio publique d'un épisode ou un flux pris en charge | Offres Operate ou Scale. Nécessite un audio accessible et un fournisseur de transcription disponible |
| **Blog / RSS** | Mises à jour publiques d'un blog ou d'un podcast en RSS/Atom | Offres Operate ou Scale. Extrait en texte les éléments de flux disponibles ; au mieux |
Utilisez **FAQ et produits** pour des champs de questions/réponses ou de catalogue prévisibles, plutôt que de les noyer dans un long document. Consultez [FAQ et produits](/fr/docs/build/faqs-products).
## Ajouter une source [#ajouter-une-source]
1. Ouvrez la page **Connaissances** de l'agent depuis la barre latérale de l'agent, puis sélectionnez **Ajouter une source**.
2. Sélectionnez **Coller du texte**, **Depuis une URL** ou **Importer un fichier**. **YouTube**, **Podcast** et **Blog / RSS** se trouvent sous **Autres types de sources** et nécessitent l'offre Operate ou Scale ; avec Launch, un cadenas s'affiche.
3. Saisissez le contenu ou choisissez un fichier.
4. Pour **Depuis une URL**, choisissez **Pages à explorer** (1, 5, 10, 20 ou 40). Pour les sources récupérées, vous pouvez définir **Actualisation automatique** sur **Quotidienne**, **Hebdomadaire** ou **Jamais**.
5. Sélectionnez **Ajouter aux connaissances** et attendez le résultat indiquant le nombre de segments indexés.
6. Posez une question dont la réponse figure uniquement dans la nouvelle source.
L'ingestion de connaissances consomme des crédits, car les passages de la source sont convertis en embeddings. Elle est rejetée si l'espace de travail n'a pas d'accès actif ou de solde de crédits utilisable.
## Explorer des pages publiques en toute sécurité [#explorer-des-pages-publiques-en-toute-sécurité]
Le robot d'exploration accepte le contenu public en HTTP/HTTPS et bloque les destinations non sécurisées situées sur des réseaux privés. Commencez par une seule page canonique. N'augmentez le nombre de pages que si les pages liées font partie du même ensemble d'informations utiles : une exploration plus large peut ajouter de la navigation, des mentions légales génériques, du texte dupliqué ou des archives obsolètes qui dégradent la recherche.
Le nombre sélectionné est un maximum, pas une garantie. Le comportement vis-à-vis des fichiers robots, l'authentification, le rendu uniquement côté client, les redirections, le type de contenu, la taille de la réponse et la structure des liens peuvent réduire le nombre de pages récupérées. La réponse d'une page est limitée à 5 Mo et doit contenir suffisamment de texte extractible.
Pour les informations importantes situées derrière une connexion, collez un résumé approuvé ou importez un export nettoyé plutôt que d'essayer d'explorer une page authentifiée.
## Utiliser des fichiers et des médias [#utiliser-des-fichiers-et-des-médias]
Les fichiers importés doivent contenir du texte extractible. Aucune reconnaissance optique de caractères (OCR) n'est effectuée sur un PDF scanné composé uniquement d'images ; convertissez-le en texte recherchable avant l'import. Les feuilles de calcul sont lues feuille par feuille, et les lignes de tableau conservent leurs cellules ensemble (`Coffee | 3000`) ; les autres mises en page sont aplaties dans l'ordre de lecture, donc gardez des tableaux simples. Supprimez le mot de passe d'un document avant de l'importer, et enregistrez d'abord les fichiers Office avec macros (`.docm`, `.xlsm`, `.pptm`) en fichiers ordinaires `.docx`, `.xlsx` ou `.pptx`. Un fichier dont le contenu ne correspond pas à son extension est refusé.
L'ingestion YouTube privilégie une piste de sous-titres disponible. Si les sous-titres ne sont pas disponibles, la transcription dépend du fournisseur et du réseau. L'audio d'un podcast doit être accessible publiquement. Les résultats d'un flux dépendent de la quantité de texte d'article ou d'épisode que le flux expose. Après toute importation de média, vérifiez le titre de la source et le nombre de segments, puis testez un fait précis au lieu de supposer que l'enregistrement complet a été capturé.
## Planifier l'actualisation et le remplacement [#planifier-lactualisation-et-le-remplacement]
Les planifications quotidienne et hebdomadaire sont disponibles pour les sources URL, YouTube, podcast et flux. Le système récupère à nouveau l'origine enregistrée de la source et remplace ses passages exploitables lorsqu'une exploration planifiée réussit. La liste des sources indique la fréquence d'actualisation et la date de dernière actualisation.
Les sources collées et importées sont des instantanés. Pour en corriger ou en remplacer une, supprimez-la et ajoutez le contenu mis à jour. La suppression d'une source retire ses passages des recherches futures ; elle ne modifie pas les messages passés qui ont déjà cité ou résumé l'ancienne version.
Désignez une seule source de référence claire pour les tarifs, les politiques et les horaires. Si deux sources actives se contredisent, la recherche peut faire remonter l'une ou l'autre affirmation. Supprimez les versions obsolètes plutôt que d'ajouter des copies « nouvelles » à côté.
## Rédiger un contenu que l'agent peut retrouver [#rédiger-un-contenu-que-lagent-peut-retrouver]
* Indiquez le sujet dans chaque section : « Politique d'annulation du forfait Pro » est plus facile à retrouver que « Plus de détails ».
* Placez la réponse en langage clair près du titre concerné.
* Précisez les unités, la devise, le fuseau horaire, la date d'entrée en vigueur et les exceptions lorsqu'elles comptent.
* Utilisez des URL canoniques stables et des noms de fichiers descriptifs.
* Séparez les informations publiques des instructions internes ou des données privées.
* Gardez le comportement du persona dans [Persona et instructions](/fr/docs/build/persona), et non dans le matériel source factuel.
## Tester les réponses fondées sur les sources [#tester-les-réponses-fondées-sur-les-sources]
Créez un petit jeu de tests d'acceptation avant la publication :
1. Une question directe dont la réponse figure explicitement dans la source.
2. Une reformulation utilisant des mots différents.
3. Une question limite à laquelle la source ne répond pas.
4. Un fait récemment modifié.
5. Une variante linguistique pour chaque langue configurée de l'agent.
Le bon résultat n'est pas toujours une réponse assurée. Lorsque la source ne contient pas le fait, l'agent doit suivre ses instructions de repli ou d'escalade plutôt que d'en inventer un. Après le lancement, consultez **Conversations** pour repérer les questions sans réponse récurrentes et transformez les réponses validées en source ou en FAQ structurée.
## Dépannage [#dépannage]
| Symptôme | À vérifier |
| ------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| L'URL signale l'absence de texte utilisable | Accès public, type de contenu pris en charge, texte rendu côté serveur, cible de redirection et taille de la page |
| Le PDF signale l'absence de texte sélectionnable | S'il s'agit d'un scan ; appliquez-lui l'OCR ou exportez-le en PDF recherchable ou en fichier texte |
| Fichier refusé car protégé par mot de passe ou ne correspondant pas à son type | Supprimez le mot de passe, puis enregistrez de nouveau le fichier dans son format réel au lieu de le renommer ; enregistrez les fichiers Office avec macros sans macros |
| L'importation YouTube/podcast échoue | URL publique, disponibilité des sous-titres/de l'audio, clé du fournisseur de transcription et restrictions de récupération |
| Un fait correct est ignoré | Résultat du traitement, formulation, sources contradictoires, ancienneté de la source et question de test exacte |
| L'agent en révèle trop | Supprimez immédiatement la source privée, puis renforcez les limites du persona et les accès au compte |
| Une ancienne réponse persiste | Supprimez ou remplacez la source obsolète, attendez la réindexation et démarrez une nouvelle conversation de test |
N'importez jamais d'identifiants, de clés privées, d'exports clients non restreints, de dossiers médicaux ni aucun contenu que l'agent public ne doit jamais révéler.
---
# Consultations
Source: /fr/docs/build/lookups.md
{/* docs-visuals */}
## Quand utiliser une consultation [#quand-utiliser-une-consultation]
Utilisez une consultation pour obtenir l'état actuel d'une commande, une réservation existante ou la fiche de compte d'un client. Conservez les politiques stables et les informations produit dans les [Sources](/fr/docs/build/knowledge). Une consultation lit votre système ; elle ne doit pas facturer, annuler, réserver ni modifier un enregistrement de quelque manière que ce soit. Les cartes génériques de choix et de confirmation envoient uniquement un message du visiteur. Pour les écritures confirmées, utilisez les [Actions de modification](/fr/docs/build/change-actions) ; pour les réservations de calendrier, utilisez la [réservation avec Cal.com](/fr/docs/build/cal-com). Seules les cartes de confirmation adossées à une exécution autorisent ces opérations.
## Configurer l'action [#configurer-laction]
Ouvrez **Agent → Actions**. Créez le secret dans **Clients connectés**, stockez-le sur votre serveur et mettez en œuvre l'[identification des clients](/fr/docs/embed/security#identify-signed-in-customers). Dans **Consultations**, ajoutez un nom tel que `order_status`, expliquez quand l'agent doit l'utiliser et saisissez votre endpoint HTTPS public. Ne déclarez que les entrées dont vous avez besoin, par exemple une chaîne `order_id`. L'agent voit cet outil sous le nom `lookup_order_status`.
Laissez activée l'option **Client connecté requis** pour les fiches privées (valeur par défaut). Si elle est désactivée, les requêtes peuvent contenir `customer: null` ; ne renvoyez alors que des informations adaptées à un visiteur anonyme. Un identifiant mentionné dans le chat ou extrait d'une photo est une entrée, et non une identité authentifiée.
Les champs existants sont enregistrés automatiquement ; attendez l'indicateur d'enregistrement avant de tester. Vous pouvez activer/désactiver, modifier ou supprimer une consultation. Le panneau nécessite qu'un secret soit configuré. Ces actions se configurent dans le tableau de bord ; la vague 1 n'expose pas la gestion des consultations via l'API publique.
## La requête que vous recevez [#la-requête-que-vous-recevez]
Make Agent Fast envoie une requête POST JSON à l'URL que vous avez configurée. Les exemples ci-dessous utilisent des valeurs de signature fictives :
```http
POST /agent/order-status HTTP/1.1
Content-Type: application/json
x-maf-timestamp:
x-maf-signature: v1=<64-lowercase-hex-characters>
```
```json
{
"version": 1,
"action": "order_status",
"requestId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"siteId": "YOUR_SITE_ID",
"input": { "order_id": "A128" },
"customer": { "id": "customer_123", "email": "customer@example.com" }
}
```
`action` correspond au nom configuré, sans le préfixe `lookup_`. `requestId` identifie cette tentative ; `siteId` identifie votre site. `input` ne contient que les paramètres de type chaîne déclarés. `customer` vaut soit null, soit l'objet `{ id, email?, name? }` vérifié côté serveur ; les entrées du visiteur ou du modèle ne peuvent pas le remplacer. Le bouton **Tester** du tableau de bord utilise volontairement le client fictif saisi par un propriétaire autorisé.
## Vérifier la signature [#vérifier-la-signature]
La signature est un HMAC-SHA256 en hexadécimal minuscule, calculé avec votre **secret d'agent** et préfixé par `v1=`. Signez exactement `"maf-webhook-v1:" + timestamp + "." + rawBody`. Conservez les octets reçus : analyser puis resérialiser le JSON avant de vérifier la signature peut les modifier. Cette fonction utilitaire accepte une `Request` serveur standard, applique une fenêtre de validité de cinq minutes et verrouille le site :
```js
import { createHmac, timingSafeEqual } from "node:crypto";
export async function verifyLookupRequest(request, expectedSiteId) {
const secret = process.env.MAF_SECRET_KEY;
if (!secret) throw new Error("MAF_SECRET_KEY is required");
const timestamp = request.headers.get("x-maf-timestamp");
const signature = request.headers.get("x-maf-signature");
const now = Math.floor(Date.now() / 1000);
if (!timestamp || !/^\d+$/.test(timestamp) ||
!Number.isSafeInteger(Number(timestamp)) ||
Math.abs(now - Number(timestamp)) > 300) {
throw new Error("Invalid timestamp");
}
if (!signature || !/^v1=[a-f0-9]{64}$/.test(signature)) {
throw new Error("Invalid signature");
}
const rawBody = Buffer.from(await request.arrayBuffer());
const expected = createHmac("sha256", secret)
.update(`maf-webhook-v1:${timestamp}.`)
.update(rawBody)
.digest();
const actual = Buffer.from(signature.slice(3), "hex");
if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) {
throw new Error("Invalid signature");
}
const body = JSON.parse(rawBody.toString("utf8"));
if (body?.version !== 1 || body.siteId !== expectedSiteId) {
throw new Error("Invalid lookup scope");
}
return body;
}
```
Appelez-la avant que votre analyseur de corps (body parser) ne consomme la requête. Votre gestionnaire doit rejeter les erreurs de vérification, valider l'action attendue et la forme des entrées, puis contrôler l'appartenance de l'enregistrement à `body.customer.id` avant de renvoyer des données privées. Par exemple, sélectionnez la commande A128 **parmi les commandes de ce client**, et non à partir de son seul identifiant de commande. N'utilisez jamais `input.customer_id`, un e-mail fourni dans le chat ou une photo comme autorisation. Exigez un client non null pour les endpoints privés. Limitez la taille du corps des requêtes entrantes sur votre serveur et suivez les `requestId` pendant la fenêtre de validité si vous souhaitez rejeter les rejeux ; la vérification de l'horodatage seule ne rejette pas un rejeu intervenant dans cette fenêtre.
Utilisez HTTPS et gardez cet endpoint en lecture seule, même si le transport se fait en POST. Après une rotation du secret d'agent, mettez à jour à la fois votre serveur de signature d'identité et votre vérificateur de consultations.
## Renvoyer une réponse [#renvoyer-une-réponse]
Répondez avec un statut 2xx et un JSON conforme à ce contrat. Le premier exemple correspond à un enregistrement trouvé ; le second à un résultat normal sans correspondance :
```json
{
"found": true,
"card": {
"title": "Order #A128",
"status": { "label": "Shipped", "tone": "success" },
"fields": [{ "label": "Carrier", "value": "DHL" }],
"reference": "A128",
"asOf": "2026-10-12T09:00:00Z",
"link": { "label": "Track", "url": "https://shop.example.com/orders/A128" }
},
"facts": { "order_id": "A128", "status": "shipped", "carrier": "DHL" }
}
```
```json
{ "found": false }
```
`found` est obligatoire. Pour `found: true`, incluez `card`, `facts` ou les deux. Une carte requiert `title` et `fields` (un tableau vide est autorisé). Les champs facultatifs sont `status`, `reference`, `asOf` et `link`. N'ajoutez pas `kind` à la carte de la réponse. Les tons de statut sont `neutral`, `success`, `warning` et `danger`. Utilisez un horodatage ISO pour `asOf` et un lien HTTPS sans identifiants intégrés. Les liens facultatifs invalides sont omis.
`facts` est un objet plat dont les valeurs sont des chaînes, des nombres finis, des booléens ou null ; les objets imbriqués et les tableaux sont rejetés. Les champs inconnus dans le schéma de réponse ou de carte sont rejetés. Ne renvoyez que les informations nécessaires pour répondre : le modèle reçoit des données échappées et bornées, signalées comme non fiables, et non des instructions. Le contenu de la carte est du texte brut, pas du HTML.
## Limites et comportement en cas d'échec [#limites-et-comportement-en-cas-déchec]
| Élément | Limite |
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Consultations par agent | 5 ; noms et identifiants uniques |
| Nom | `^[a-z][a-z0-9_]{2,39}$` ; les noms d'action réservés ne sont pas disponibles |
| Description | 300 caractères |
| Entrées déclarées | 3 ; noms uniques correspondant à `^[a-z][a-z0-9_]{1,31}$` |
| Descriptions / valeurs des entrées | 300 / 200 caractères ; les valeurs sont tronquées des espaces superflus |
| Endpoint | HTTPS public, jusqu'à 500 caractères, sans identifiants ; adresses privées/internes bloquées ; redirections non suivies |
| Délai d'attente / corps de la réponse | 8 secondes / 32 KiB (32 768 octets) |
| Données du modèle | 2 000 caractères, distinctes de la carte du visiteur |
| Titre / libellés / valeurs des champs de la carte | 80 / 40 / 200 caractères |
| Champs de la carte | 8 ; au maximum 3 cartes par tour de l'agent |
L'absence d'identité client produit un avertissement de connexion sans appeler votre endpoint. Si des entrées requises manquent, l'agent les demande au visiteur. `found: false` affiche une carte neutre indiquant l'absence de résultat. Les délais dépassés, les statuts non 2xx, les JSON ou schémas invalides et les réponses trop volumineuses affichent un statut d'échec et indiquent au modèle de ne pas deviner. Pour un enregistrement simplement absent, renvoyez `found: false` avec un statut 2xx plutôt qu'un HTTP 404. Gardez les faits importants concis : les chaînes de carte et les données du modèle en excès sont tronquées.
## Tester depuis le tableau de bord [#tester-depuis-le-tableau-de-bord]
1. Enregistrez la consultation et ouvrez **Tester**. Saisissez un identifiant client fictif, un e-mail facultatif et toutes les entrées requises. Utilisez un compte que vous contrôlez.
2. Lancez **Tester**. Cela envoie une véritable requête signée, même si la consultation est désactivée pour les visiteurs ; le chat de répétition ordinaire n'appelle jamais l'endpoint. Le tableau de bord limite le nombre de tentatives de test par propriétaire.
3. Examinez la carte/le résumé validé ou l'erreur, l'identifiant de requête, la durée et le statut HTTP lorsqu'ils sont disponibles. Consultez les journaux de votre endpoint sans y enregistrer de secrets ni de jetons client.
4. Testez les cas suivants : trouvé, non trouvé, mauvais compte, entrée manquante et délai dépassé. Testez ensuite l'intégration réelle avec deux clients authentifiés ; un client fictif du tableau de bord ne prouve ni l'isolation de l'identité dans le navigateur, ni la sélection réelle de l'outil par le modèle.
Le widget affiche des cartes de statut ; les appuis sur les choix et confirmations génériques envoient leurs libellés sous forme de messages. Les confirmations de modification et de réservation adossées à une exécution utilisent à la place le flux d'exécution protégé. Les connecteurs adaptent les cartes en texte/cartes natifs et en boutons, réponses rapides ou listes, avec un repli en texte, dans la limite des contraintes de chaque canal. Testez chaque canal visé avant de vous appuyer sur la livraison.
---
# Vos propres outils (MCP)
Source: /fr/docs/build/mcp-tools.md
{/* docs-visuals */}
## Connecter et découvrir [#connecter-et-découvrir]
Ouvrez **Agent → Actions → Vos outils (MCP)**. Connectez votre serveur distant à l'aide de son flux OAuth ou d'un identifiant bearer, ou utilisez une connexion MCP existante. Choisissez **Découvrir** pour lire le catalogue d'outils. Examinez la description, les paramètres et les annotations de chaque outil avant de l'activer. La découverte n'exécute aucun outil ; les outils nouvellement découverts sont désactivés.
Vous pouvez configurer trois serveurs d'outils et activer 20 outils au total. Les identifiants restent côté serveur. La suppression d'un mappage d'outil arrête ce mappage, mais ne révoque pas la connexion de connaissances partagée ni son autorisation OAuth ; gérez cette connexion séparément. Le serveur MCP de gestion propriétaire de Make Agent Fast ne peut pas être exposé comme serveur d'outils pour les clients. Pour gérer vos agents depuis Claude, consultez [Utiliser Claude et ChatGPT](/fr/docs/operate/ai-assistants).
## Choisir lecture ou écriture [#choisir-lecture-ou-écriture]
| Effet | Comportement |
| -------- | ----------------------------------------------------------------------------------------------------------------------- |
| Lecture | Appelle directement l'outil et traite le texte ou les données structurées renvoyés comme des données métier non fiables |
| Écriture | Crée une proposition ; le client doit confirmer les entrées exactes à l'aide des boutons de la carte avant l'exécution |
La lecture n'est disponible que si le serveur déclare `readOnlyHint: true` et ne déclare pas `destructiveHint: true`, et si vous conservez l'outil classé en lecture. Sinon, traitez-le comme une écriture. Vérifiez ce que le serveur fait réellement ; les annotations ne constituent pas un système d'autorisation.
Par défaut, les écritures exigent à chaque fois l'approbation du propriétaire. Vous pouvez choisir de n'exiger aucune approbation supplémentaire du propriétaire, ou une approbation au-delà d'une limite portant sur un paramètre numérique. La confirmation du client reste requise dans tous les modes. L'approbation du propriétaire utilise la liste des approbations et les reçus existants. Les paramètres sont enregistrés automatiquement. La répétition côté propriétaire n'appelle jamais le serveur distant.
## Associer le client connecté [#associer-le-client-connecté]
Par défaut, les outils exigent un client vérifié. Utilisez l'[identité client signée](/fr/docs/embed/security) sur votre site web ; un identifiant saisi dans le chat ne constitue pas une vérification. Pour les enregistrements propres à un client, choisissez le paramètre de type chaîne de l'outil qui identifie le client. Le serveur le renseigne à partir de l'identifiant client vérifié et le retire des entrées du modèle. Les paramètres de type enum ne peuvent pas être utilisés pour cette association.
Par exemple, associez `customer_id` sur un outil qui lit une commande. Le modèle peut fournir la référence de commande déclarée, mais ne peut pas substituer l'identifiant d'un autre client. Le serveur distant doit tout de même vérifier que la commande appartient bien à ce client. Exiger la connexion sans association de paramètre ne limite pas, à lui seul, tous les enregistrements auxquels l'outil distant peut accéder.
## Limites et résultats incertains [#limites-et-résultats-incertains]
Les schémas pris en charge sont des objets plats comportant jusqu'à dix paramètres de type chaîne, nombre, entier, booléen ou enum. Les objets imbriqués, les tableaux et les règles de schéma non prises en charge restent indisponibles. Les chaînes sont limitées à 200 caractères ; les appels distants ont un délai d'expiration de 10 secondes et les résultats visibles par le modèle sont plafonnés à 4 Ko. Le contenu d'un résultat est une donnée, jamais une instruction pour l'agent.
MCP n'offre aucune garantie générale d'idempotence. Une écriture n'est appelée qu'une seule fois après confirmation ou approbation. Si son résultat est inconnu, Make Agent Fast ne réessaie pas automatiquement et en informe le propriétaire. Vérifiez le système distant avant de créer une autre proposition. Modifier la configuration d'un outil déjà examiné invalide toute proposition plus ancienne.
Testez chaque lecture et chaque écriture prévues avec votre propre serveur avant que les clients ne les utilisent.
---
# Actions de page
Source: /fr/docs/build/page-actions.md
{/* docs-visuals */}
## Enregistrer une action côté site [#enregistrer-une-action-côté-site]
Les actions de page permettent au site web d'ouvrir sa propre interface ou de naviguer vers une page approuvée. Installez l'intégration (embed) dans sa version actuelle, puis lancez l'enregistrement une fois le script chargé. Conservez les gestionnaires dans votre application : l'agent reçoit uniquement leurs noms, leurs descriptions et la définition de leurs paramètres, jamais le code des gestionnaires.
```js
MakeAgentFast.registerAction("show_details", {
description: "Show the details section on this page",
params: { section: { type: "string", description: "Use delivery or returns" } },
confirm: true
}, async ({ section }) => {
const sections = {
delivery: document.getElementById("delivery-details"),
returns: document.getElementById("returns-details")
};
if (!Object.hasOwn(sections, section) || !sections[section]) {
throw new Error("Unknown section");
}
sections[section].scrollIntoView({ block: "start" });
return { shown: section };
});
// Run when the page component unmounts:
// MakeAgentFast.unregisterAction("show_details");
```
Les deux méthodes renvoient un booléen indiquant si l'enregistrement ou la suppression a été accepté. Les noms utilisent des lettres minuscules, des chiffres et des tirets bas (underscores), commencent par une lettre et comptent de 2 à 40 caractères. Il existe neuf emplacements d'enregistrement personnalisés, plus l'action intégrée `open_page`. Chaque définition autorise cinq paramètres de type chaîne ; tous les paramètres déclarés sont obligatoires, avec des valeurs allant jusqu'à 200 caractères. Les descriptions sont limitées à 200 caractères. Un gestionnaire peut renvoyer une chaîne ou une valeur sérialisable en JSON, jusqu'à 2 Ko, en moins de 10 secondes.
## Approuver les actions dans le tableau de bord [#approuver-les-actions-dans-le-tableau-de-bord]
Ouvrez le site web sur lequel l'intégration est installée afin qu'il signale les noms et descriptions de ses actions, puis ouvrez **Agent → Actions → Actions de page**. Activez la fonctionnalité et autorisez chacune des actions prévues. Les descriptions signalées sont des métadonnées du site web non fiables ; la détection n'approuve rien. Les paramètres sont enregistrés automatiquement.
L'agent ne peut proposer que les actions qui sont à la fois actuellement enregistrées et autorisées. Le customer voit une carte avant l'exécution. Une confirmation est requise, sauf si l'owner marque l'action comme sûre ; `confirm: true` dans le code de votre site exige toujours un appui de la part du customer. `confirm: false` seul ne contourne pas la politique de l'owner. Réservez le mode sûr aux modifications d'interface sans conséquence.
L'action intégrée `open_page` n'a besoin d'aucun gestionnaire. Autorisez-la dans le tableau de bord ; elle accepte un chemin relatif ou une URL HTTP(S) appartenant aux origines de site web autorisées de l'agent. Les chemins relatifs exigent également que l'origine du site web actuel soit autorisée. Elle ne peut pas rediriger vers une destination externe arbitraire.
## Signaler un événement avec track [#signaler-un-événement-avec-track]
```js
MakeAgentFast.track("form_error", { formId: "contact" });
MakeAgentFast.track("checkout_help", { step: "delivery" });
```
Appelez ces méthodes après le chargement de l'embed, et uniquement lorsque l'événement correspondant se produit réellement. Configurez un nom d'événement correspondant dans [Relances](/fr/docs/build/follow-ups). Les noms suivent le même format de 2 à 40 caractères ; les données facultatives doivent être un objet JSON d'au plus 1 Ko. N'envoyez pas de valeurs de champs, d'identifiants ni de données de paiement. Les règles s'appliquent selon l'événement, le chemin et le délai ; les métadonnées ne sont ni stockées, ni transmises au modèle, ni utilisées comme preuve de conversion. Un retour `true` signifie que le loader a accepté l'événement, et non qu'un message a été affiché.
## Sécurité et vérification [#sécurité-et-vérification]
Les actions de page fonctionnent dans le widget du site web en production, mais pas dans les channels de messagerie, ni dans les essais de l'owner, ni en voix en direct. Le loader et la frame vérifient l'origine, la source, le slug et les identifiants des requêtes en attente. Les résultats reviennent dans le chat en tant que données de navigateur non fiables, et non comme preuve qu'un enregistrement côté serveur a été modifié. Conservez l'authentification et l'autorisation dans vos propres gestionnaires et votre propre backend ; utilisez les [Actions de modification](/fr/docs/build/change-actions) pour les écritures métier ayant des conséquences.
Un délai dépassé n'annule pas le gestionnaire et ne prouve pas qu'il ne s'est rien passé. Ne relancez pas automatiquement une action dont le résultat est incertain. Désenregistrez les gestionnaires lorsque leur composant de page quitte l'écran. Les embeds déjà en cache nécessitent la version actuelle du loader, `20261014-page-actions`, pour cette API.
Cette API ne gère pas les paiements et ne fournit pas de connector Shopify.
---
# Persona et instructions
Source: /fr/docs/build/persona.md
{/* docs-visuals */}
## Séparer l'identité des connaissances [#séparer-lidentité-des-connaissances]
Il n'existe pas de page Persona distincte. Rédigez les instructions de l'agent dans l'onglet **Vue d'ensemble** de la page de l'agent, dans le champ **Instructions** ; elles sont enregistrées automatiquement.
La persona définit qui est l'agent et comment il se comporte. Les connaissances fournissent les faits. Indiquez « Parlez en tant qu'assistant du support Acme » dans la persona ; placez la durée de garantie en vigueur dans une source de connaissances.
## Ordre des instructions [#ordre-des-instructions]
Rédigez les instructions dans cet ordre :
1. Identité et rôle
2. Objectif principal du visiteur
3. Ton et longueur des réponses
4. Actions et questions obligatoires
5. Affirmations interdites et sujets sensibles
6. Conditions d'escalade et de capture de leads
## Limites [#limites]
Indiquez à l'agent quand il doit dire qu'il ne sait pas, quand citer ou nuancer une réponse, et quand proposer l'aide d'un humain. Ne lui demandez jamais de masquer son incertitude ni d'inventer des données manquantes.
## Tester les modifications [#tester-les-modifications]
Les modifications de la persona peuvent affecter tous les channels. Testez à nouveau les questions courantes, les refus, la capture de leads et les langues prises en charge avant de publier une modification importante.
---
# Voix et appels en direct
Source: /fr/docs/build/voice.md
{/* docs-visuals */}
## Comprendre les trois modes d'interaction [#comprendre-les-trois-modes-dinteraction]
| Mode | Expérience du visiteur | Droits et utilisation |
| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| **Chat texte** | Saisit un message et reçoit une réponse écrite | Toujours activé ; consomme des crédits d'IA normaux |
| **Messages vocaux** | Enregistre un message, attend la transcription, la réponse de l'agent et la synthèse vocale (TTS), puis reçoit une réponse | Inclus dans tous les forfaits ; la transcription, le modèle et le travail de synthèse vocale consomment des crédits |
| **Appel en direct en temps réel** | Tient une conversation orale à faible latence | Operate : 30 min/mois ; Scale : 90 min/mois ; Launch : indisponible ; débite également à l'avance des crédits pour la limite d'appel configurée |
Le texte ne peut pas être désactivé. Les options Messages vocaux et Temps réel déterminent quelles surfaces supplémentaires les visiteurs peuvent utiliser. Une option temps réel enregistrée ne remplace ni les droits du forfait de l'espace de travail, ni une configuration de fournisseur manquante.
## Configurer le comportement des interactions [#configurer-le-comportement-des-interactions]
1. Ouvrez la page **Agent** du site et repérez la section **Voix**.
2. Laissez **Chat texte** activé et choisissez **Messages vocaux** et/ou **Voix en direct en temps réel**.
3. Si l'agent gère plusieurs langues, activez éventuellement le mode miroir de langue en direct.
4. Définissez la limite automatique par appel.
5. Sélectionnez une voix prédéfinie.
6. Enregistrez, puis testez séparément chaque mode activé.
La limite d'appel accepte des valeurs de 30 secondes à 20 minutes, par paliers de 30 secondes ; la valeur par défaut est de 3 minutes. Elle met fin à un appel individuel et protège le quota mensuel, mais elle n'augmente pas les minutes en direct restantes du forfait.
## Choisir les langues et une voix [#choisir-les-langues-et-une-voix]
Les agents peuvent être configurés pour l'anglais, le coréen, l'ouzbek, le russe, le français, l'espagnol, l'allemand et l'arabe. La première langue est la langue principale. Un agent monolingue continue de répondre dans cette langue. Un agent texte multilingue s'adapte à la langue du visiteur lorsque celui-ci utilise l'une des langues configurées.
Pour les appels en direct, le mode miroir de langue est une option explicite, affichée uniquement lorsque deux langues ou plus sont configurées. Lorsqu'il est désactivé, les appels en direct utilisent la langue principale. La voix ouzbèke fonctionne actuellement au mieux (« best effort »), car la couverture vocale des fournisseurs est moins complète ; testez-la avec votre fournisseur et votre public exacts avant le lancement.
Les voix prédéfinies comprennent des options axées sur l'anglais, multilingues et natives coréennes. L'étiquette de langue décrit la diction sélectionnée, et non une garantie absolue. Écoutez un aperçu de la voix choisie lorsque la commande d'aperçu du tableau de bord est disponible, et testez toujours les noms, abréviations, devises, numéros de téléphone et termes spécialisés dans le parcours réel du visiteur.
## Clés de fournisseur et solution de repli [#clés-de-fournisseur-et-solution-de-repli]
La voix nécessite plus qu'une clé de modèle :
* La reconnaissance vocale (speech-to-text) utilise le fournisseur de transcription configuré par la plateforme.
* Les messages vocaux et les réponses audio des connecteurs nécessitent le fournisseur de synthèse vocale (TTS) configuré.
* Les appels en temps réel nécessitent le fournisseur temps réel configuré et un quota inclus dans le forfait.
La voix gérée par la plateforme utilise les fournisseurs configurés par la plateforme ; vous n'avez pas besoin de clé. Les propriétaires d'un forfait Scale peuvent éventuellement ajouter une clé Speko pour la transcription et la synthèse vocale dans **Paramètres → Clés de fournisseur d'IA** et suivre [Clés de fournisseur](/fr/docs/account/provider-keys). Les appels en direct sont toujours facturés au tarif de la plateforme. Un chat texte réussi prouve uniquement que le chemin du modèle fonctionne ; il ne prouve ni la transcription, ni la synthèse vocale, ni l'envoi de médias, ni la création de sessions en temps réel.
## Routage vocal et solution de repli [#routage-vocal-et-solution-de-repli]
Choisissez un modèle sous **Modèles vocaux** pour la transcription, la synthèse vocale et les appels en direct. Chaque choix indique le modèle et son créateur ; **Auto** nous laisse choisir. L'hébergement et le routage sont gérés par Make Agent Fast, il n'y a donc pas de choix de plateforme distinct. La voix prédéfinie exacte peut varier selon le modèle sélectionné.
Si un service vocal est indisponible, une solution de secours disponible peut être utilisée. Si la voix échoue, le texte reste disponible.
Les appels en direct diffusent un audio natif depuis le fournisseur en direct sélectionné, en utilisant sa voix intégrée. La récupération de connaissances, les règles de langue, l'interruption, les quotas de minutes en direct et les débits initiaux d'appel s'appliquent toujours. Les réponses en direct n'effectuent pas de requête TTS supplémentaire.
## Tester les messages vocaux [#tester-les-messages-vocaux]
Utilisez une vraie intégration ou l'Agent link, et pas seulement un aperçu propriétaire. Accordez l'accès au microphone, enregistrez une courte question et vérifiez le sens de la transcription ainsi que la réponse vocale/écrite. Testez ensuite :
* des environnements calmes et bruyants ;
* Safari mobile et Chrome, le cas échéant ;
* une longue question proche de la limite publique de 25 Mo pour l'audio ;
* un refus d'autorisation du microphone ;
* un audio non pris en charge ou de mauvaise qualité ;
* chaque langue configurée.
Pour les sites avec intégration, la CSP et la Permissions Policy du site parent doivent autoriser l'utilisation du microphone. Consultez [Sécurité et CSP](/fr/docs/embed/security).
## Conversation en direct sur la plateforme et sur le site publié [#conversation-en-direct-sur-la-plateforme-et-sur-le-site-publié]
La conversation en direct utilise les mêmes commandes d'appel à deux endroits :
| Surface | Emplacement | Apparence | Compte comme activation ? |
| ------------------------------ | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------------------------------------------------------ |
| **Canevas du studio d'agent** | Le widget en direct à côté des onglets de la page **Agent** | L'apparence du widget visiteur, affichée dans le tableau de bord | Non — les tests du propriétaire n'activent jamais |
| **Site publié et intégration** | L'iframe `embed.js`, le widget sur l'Agent link et toute page de démonstration hébergée restante | Apparence du locataire / du widget | Oui — l'appel d'un visiteur est une vraie conversation |
Le canevas à côté de l'onglet **Affichage** montre la même apparence que celle du visiteur. Testez une vraie intégration avant le lancement ; un test réussi dans le tableau de bord ne prouve ni l'autorisation du microphone dans l'intégration, ni la CSP de la page hôte, ni l'activation.
**Utiliser le site web** sous **Thème de l'agent** dans l'onglet **Affichage** suit le mode clair ou sombre du visiteur sur la page hôte et l'intégration. Un réglage fixe Clair ou Sombre s'applique à la fois au chat et à l'appel en direct. Consultez [Apparence](/fr/docs/build/appearance).
## Tester les appels en direct [#tester-les-appels-en-direct]
Vérifiez que le forfait dispose de minutes en direct non utilisées, que le site est accessible et que la clé du fournisseur temps réel est valide. Commencez par un appel court, interrompez l'agent, ne changez de langue que si le mode miroir est activé, et laissez la limite d'appel configurée mettre fin à une session de test. Répétez un appel sur une vraie intégration, et pas seulement sur le canevas de la page Agent.
Les minutes en direct constituent un droit mensuel distinct des crédits normaux. L'émission du jeton en direct débite des crédits pour la durée maximale autorisée par le serveur et réserve cette durée sur le quota mensuel de minutes en direct. Comme les médias circulent directement entre le navigateur et le fournisseur, un appel plus court déclaré par le client ne peut pas être vérifié et le temps inutilisé n'est pas remboursé partiellement après la remise du jeton. Les échecs de création de jeton côté serveur sont libérés ; les sessions abandonnées sont facturées à leur limite autorisée. Terminez proprement vos tests et utilisez la limite d'appel configurée pour vos prévisions. Consultez [Crédits et utilisation](/fr/docs/operate/usage).
## Actions en voix directe [#actions-en-voix-directe]
**Agent → Actions → Actions pendant les appels en direct** (**Autoriser l'agent à effectuer des actions pendant les appels en direct**) contrôle l'utilisation des outils pendant les appels en direct, qui s'exécutent sur Gemini 3.8 Live dans toutes les langues. Cette option est activée par défaut (`voice.liveActions`) ; la désactiver laisse l'ancrage dans les connaissances disponible. Les exigences de forfait, de fournisseur et d'accès à la voix en direct continuent de s'appliquer.
Les appels peuvent afficher des résultats de recherche, des choix, des propositions de modification, des créneaux/réservations de calendrier, des suivis programmés et un handoff vers un humain. Les modifications de l'entreprise, les réservations et les suivis nécessitent l'utilisation des boutons des cartes à l'écran ; un « oui » prononcé ou saisi ne confirme jamais une écriture. Un suivi nécessite aussi le consentement par e-mail à l'écran. Les cartes et les résultats d'outils restent dans l'historique de la conversation. Les actions de page et vos propres outils MCP ne font pas partie du sous-ensemble disponible en direct. La facturation des appels reste en mode réservation seule, sans remboursement du temps d'appel inutilisé après la remise du jeton.
Testez à la fois le résultat vocal et la confirmation à l'écran avant toute utilisation par des clients. Consultez [Suivis](/fr/docs/build/follow-ups) et [Actions de modification](/fr/docs/build/change-actions).
## Information et sécurité [#information-et-sécurité]
Informez les appelants qu'ils interagissent avec une IA et une voix synthétique. Définissez la manière dont les enregistrements, les transcriptions et les données des fournisseurs en aval sont conservés et supprimés.
## Dépannage [#dépannage]
| Symptôme | À vérifier |
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| Le texte fonctionne mais les commandes vocales échouent | Clés des fournisseurs de transcription/TTS/temps réel, activation de la fonctionnalité, forfait, solde de crédits et autorisation du navigateur |
| L'enregistrement ne peut pas démarrer | HTTPS, autorisation du microphone, entrée de l'appareil, Permissions Policy de l'intégration et prise en charge par le navigateur |
| La transcription est inexacte | Qualité audio, ensemble de langues choisi, accent/terminologie et couverture du fournisseur de transcription |
| La réponse vocale sonne mal | Voix sélectionnée, texte source, ponctuation, étiquette de langue et disponibilité du fournisseur |
| L'appel en direct se termine immédiatement | Minutes restantes, limite par appel, clé du fournisseur, réseau et état des sessions simultanées |
Traitez la voix comme une surface de lancement à part entière : les tests de recette du texte sont nécessaires, mais pas suffisants.
---
# Discord
Source: /fr/docs/connectors/discord.md
{/* docs-visuals */}
## Créer l'application Discord [#créer-lapplication-discord]
Suivez le [guide de démarrage d'application](https://docs.discord.com/developers/quick-start/getting-started) officiel de Discord ainsi que sa [présentation des interactions](https://docs.discord.com/developers/interactions/overview). Créez une application dans le Discord Developer Portal et récupérez les éléments suivants :
| Champ Make Agent Fast | Emplacement dans Discord | Rôle |
| --------------------- | ------------------------ | -------------------------------------------------------------------------------- |
| **Application ID** | General Information | Identifie l'application et la commande |
| **Public Key** | General Information | Vérifie les interactions signées Ed25519 ; exactement 64 caractères hexadécimaux |
| **Bot token** | Page Bot | Valide l'application et enregistre `/ask` ; à garder secret |
La réinitialisation d'un bot token invalide immédiatement le précédent. La Public Key n'est pas secrète, mais elle doit appartenir à la même application que le bot token.
## Connecter et enregistrer `/ask` [#connecter-et-enregistrer-ask]
Ouvrez la page **Canaux** de l'agent, choisissez **Discord**, saisissez les trois valeurs, puis sélectionnez **Connecter**.
Make Agent Fast valide le bot token auprès du point de terminaison d'application de Discord et rejette toute Public Key qui ne correspond pas à l'application. Il corrige un Application ID mal saisi en le remplaçant par l'ID réel de l'application authentifiée, puis crée ou met à jour la commande globale `/ask question` sans supprimer les autres commandes de l'application.
Après l'enregistrement, copiez l'**URL du point de terminaison des interactions** affichée dans **General Information → Interactions Endpoint URL** sur Discord, puis enregistrez. Discord envoie un `PING` signé ; Make Agent Fast valide la signature et renvoie le `PONG` requis.
## Installer et tester [#installer-et-tester]
Utilisez les paramètres d'installation de Discord pour autoriser l'application sur un serveur de test, avec les permissions requises pour les commandes d'application. La propagation des commandes globales peut prendre du temps.
Exécutez `/ask`, renseignez l'option obligatoire `question`, puis envoyez. Make Agent Fast accuse réception de l'interaction avant l'expiration du court délai imparti par Discord, exécute l'agent, puis modifie la réponse initiale différée. L'historique des conversations est limité à chaque utilisateur Discord, ce qui permet aux demandes `/ask` suivantes de conserver le contexte.
Le connecteur actuel ne prend en charge que le texte. Il ne lit ni les salons vocaux, ni les pièces jointes, ni les messages ordinaires des salons, ni les messages privés ; seule l'interaction `/ask` enregistrée parvient à l'agent.
## Renouveler ou déconnecter [#renouveler-ou-déconnecter]
Si le bot token a été exposé, réinitialisez-le dans Discord, mettez à jour le connecteur, puis vérifiez à nouveau `/ask`. Si l'application elle-même change, mettez à jour les trois valeurs ainsi que l'URL du point de terminaison des interactions pour cette application.
Désactiver ou supprimer le connecteur ne supprime ni l'application Discord ni la commande globale. Retirez l'application des serveurs et supprimez séparément les identifiants du fournisseur devenus inutiles lorsque vous la désactivez définitivement.
## Dépannage [#dépannage]
| Symptôme | Solution |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Le connecteur rejette les champs | Utilisez le bot token et la Public Key de 64 caractères provenant de la même application |
| Discord rejette le point de terminaison | Vérifiez que l'URL est en HTTPS public, collez le point de terminaison généré et enregistrez à nouveau les identifiants avant de réessayer |
| `/ask` est introuvable | Vérifiez l'installation et l'autorisation de la commande, attendez la propagation globale, puis reconnectez pour l'enregistrer de nouveau |
| L'interaction indique que l'application n'a pas répondu | Vérifiez que le connecteur est activé et examinez les erreurs de Make Agent Fast et de Discord ; la validation de la signature du point de terminaison doit réussir |
| Les autres messages de discussion sont ignorés | Comportement normal ; l'intégration ne traite que `/ask` |
| La réponse est tronquée | Les réponses de message Discord sont limitées à 2 000 caractères |
N'exposez jamais le bot token dans du code côté client, des dépôts, des journaux ou des captures d'écran.
---
# Instagram
Source: /fr/docs/connectors/instagram.md
{/* docs-visuals */}
## Ce que fait ce connecteur [#ce-que-fait-ce-connecteur]
Vos clients envoient un **message direct** à votre compte professionnel Instagram. Make Agent Fast répond avec le même agent fondé sur vos sources que celui de votre widget de site web, via l'[API Instagram avec connexion Instagram](https://developers.facebook.com/docs/instagram-platform/instagram-api-with-instagram-login) officielle de Meta.
Il peut aussi répondre aux **commentaires** de vos publications et de vos reels, publiquement ou par un DM privé (voir [Commentaires et réponses enregistrées](#commentaires-et-réponses-enregistrées)). Les réponses à vos stories sont également traitées (voir [Stories](#stories)). Hors périmètre : le scraping, ainsi que les « J'aime » sur les publications ou les commentaires. L'API officielle d'Instagram ne permet pas d'aimer un contenu, donc l'agent ne le fait jamais.
Chaque compte Instagram constitue son propre canal, ce qui permet de séparer la facturation, les fils de la boîte de réception et le routage des messages. Un agent peut gérer jusqu'à cinq comptes Instagram.
## Avant de commencer [#avant-de-commencer]
Vous avez besoin de :
1. Un compte Instagram **professionnel** (Business ou Créateur). Les comptes personnels ne peuvent pas être connectés ; passez en compte professionnel dans Instagram via **Paramètres → Type de compte et outils**.
2. Le nom d'utilisateur et le mot de passe Instagram du compte, ou une application Instagram déjà connectée à ce compte dans ce navigateur.
3. Le forfait Operate ou Scale pour ajouter un nouveau canal.
Vous n'avez **pas** besoin d'un compte Facebook, d'une Page Facebook, d'un portefeuille d'entreprise Meta ni d'une application développeur Meta.
## Connecter votre compte [#connecter-votre-compte]
### 1. Ouvrir la carte Instagram [#1-ouvrir-la-carte-instagram]
Dans le tableau de bord, ouvrez votre agent et allez dans **Canaux → Instagram**.
### 2. Se connecter et autoriser l'accès [#2-se-connecter-et-autoriser-laccès]
Sélectionnez **Se connecter avec Instagram**. Instagram ouvre sa propre page de connexion. Connectez-vous au compte professionnel pour lequel l'agent doit répondre, vérifiez que la fenêtre mentionne bien ce compte, puis sélectionnez **Autoriser**. Laissez activée l'option **Accéder aux messages et les gérer** ; sans elle, l'agent ne peut ni lire ni répondre aux DM. L'option **Accéder aux commentaires et les gérer** n'est utilisée que si vous activez ensuite les réponses aux commentaires.
Instagram vous redirige vers la carte Instagram, qui affiche désormais le compte comme connecté. Pour connecter un autre compte, sélectionnez à nouveau **Se connecter avec Instagram** et connectez-vous avec ce compte.
### 3. Envoyer un message de test [#3-envoyer-un-message-de-test]
Depuis un **autre** compte Instagram, envoyez un nouveau DM au compte connecté. Vérifiez que :
1. Le message apparaît dans votre boîte de réception Instagram.
2. La carte Instagram affiche un nouvel événement et que **Conversations** contient un nouveau fil.
3. L'étape de vérification de la carte est validée.
### 4. Activer les réponses de l'IA [#4-activer-les-réponses-de-lia]
Une fois le test réussi, activez les réponses de l'IA sur la carte. À partir de là, l'agent répond aux nouveaux DM. Les messages texte et les messages vocaux pris en charge reçoivent une réponse en texte. Vos propres messages, les images et les autres pièces jointes non prises en charge sont ignorés. Lorsque vous répondez vous-même depuis la boîte de réception **Conversations**, l'agent se met en pause pour cette conversation.
## Commentaires et réponses enregistrées [#commentaires-et-réponses-enregistrées]
Activez **Répondre aux commentaires** dans la section **Commentaires** de la carte Instagram. Les nouveaux commentaires de premier niveau sur vos publications et vos reels sont alors traités dans l'ordre suivant :
1. **Vos réponses enregistrées.** Rédigez une réponse pour une publication, ou pour **Toutes les publications**, et choisissez les mots-clés qui la déclenchent (par exemple `prix, combien`). Laissez les mots-clés vides pour répondre à tous les commentaires de cette publication. Chaque réponse enregistrée peut publier une réponse publique sous le commentaire, envoyer un DM privé, ou les deux. `{name}` est remplacé par le @pseudo de l'auteur du commentaire. Les réponses propres à une publication l'emportent sur celles de **Toutes les publications**, et les réponses à mots-clés l'emportent sur les réponses génériques. Les réponses enregistrées n'utilisent ni IA ni crédits.
2. **L'IA, si vous l'autorisez.** Sous **Si aucune réponse enregistrée ne convient**, choisissez **Rester silencieux**, **L'IA répond** (une ou deux phrases courtes, publiées publiquement) ou **L'IA envoie un DM** (la réponse est envoyée en DM à l'auteur du commentaire, avec, si vous le souhaitez, une phrase publique sous le commentaire). La légende de la publication est transmise à l'agent comme contexte. Les réponses de l'IA consomment des crédits, comme une réponse à un DM.
L'agent ne répond jamais à ses propres commentaires, ni à l'intérieur d'un fil de commentaires, ni aux commentaires qui se limitent à identifier des amis ou ne contiennent que des emojis, ni aux questions pour lesquelles il n'a aucune réponse approuvée. Les conversations issues des commentaires apparaissent dans **Conversations**, en lecture seule ; répondez-y directement sur Instagram. Instagram autorise un seul DM privé par commentaire, dans un délai de 7 jours.
## Stories [#stories]
Les stories parviennent à l'agent sous forme de DM :
* **Une réponse écrite à votre story** reçoit une réponse de l'IA comme n'importe quel DM. Lorsque la story est une photo, l'agent la voit : ainsi, « combien coûte ceci ? » obtient une réponse portant sur ce que montre la story. Les stories vidéo reçoivent une réponse basée uniquement sur le texte.
* **Une mention dans la story de quelqu'un** et **une réaction composée uniquement d'un emoji à votre story** ne contiennent aucune question, donc l'IA n'y répond jamais. Dans la section **Stories** de la carte Instagram, rédigez une courte réponse pour chacune, ou laissez le champ vide pour rester silencieux. Ces réponses n'utilisent ni IA ni crédits, et une même personne reçoit au maximum une réponse de réaction par jour.
Les trois cas apparaissent dans **Conversations**. Instagram n'informe pas les applications lorsqu'une personne aime une story, et aucune application ne peut aimer des stories ni les commenter.
## Disponibilité [#disponibilité]
**Se connecter avec Instagram** apparaît sur la carte une fois que Meta a approuvé l'accès de Make Agent Fast à la messagerie Instagram. D'ici là, la carte peut ne pas proposer ce bouton, et Instagram ne transmet que les messages des comptes que Meta autorise l'application à tester. Si le bouton n'apparaît pas encore sur votre carte, utilisez la méthode avancée ci-dessous ou revenez plus tard.
## Déconnecter ou reconnecter [#déconnecter-ou-reconnecter]
Make Agent Fast renouvelle automatiquement la connexion. Si les réponses s'arrêtent et que la carte affiche une erreur de connexion, par exemple après un changement de mot de passe, sélectionnez **Se reconnecter avec Instagram** et connectez-vous à nouveau. Pour déconnecter, supprimez la connexion sur la carte. Vous pouvez aussi retirer Make Agent Fast dans Instagram via **Paramètres → Applications et sites web** ; l'agent cesse alors immédiatement de répondre sur ce compte.
## Avancé : votre propre application Meta [#avancé--votre-propre-application-meta]
Les développeurs qui gèrent leur propre application Meta peuvent toujours se connecter avec un jeton d'accès de Page Facebook à la place. Cela nécessite un compte professionnel Instagram lié à une Page Facebook, une application développeur Meta disposant de `instagram_basic`, `instagram_manage_messages`, `pages_manage_metadata`, `pages_messaging` et `pages_show_list`, ainsi que la [configuration des webhooks](https://developers.facebook.com/docs/instagram-platform/instagram-api-with-facebook-login/webhooks/) de Meta.
Collez le **jeton d'accès de la Page** et la **clé secrète de l'application** dans le formulaire avancé de la carte, puis utilisez l'**URL du webhook** et le **jeton de vérification** affichés pour le webhook Instagram (champ `messages`). Abonnez la Page elle-même avec le jeton de la Page :
```text
POST /me/subscribed_apps?subscribed_fields=messages
```
Votre propre application ne peut répondre au public qu'après avoir passé l'App Review de Meta avec l'accès avancé (Advanced Access).
## Dépannage [#dépannage]
| Symptôme | Solution |
| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| Aucun bouton **Se connecter avec Instagram** | L'approbation de Meta est toujours en attente ; voir [Disponibilité](#disponibilité) |
| Instagram indique que le compte ne peut pas être utilisé | Passez-le en compte professionnel (Business ou Créateur) et réessayez |
| « Déjà connecté à un autre agent » | Déconnectez-le d'abord de cet agent, puis connectez-le ici |
| Connecté, mais aucun nouvel événement après un DM de test | Envoyez un nouveau DM depuis un autre compte ; les messages envoyés avant la connexion ne sont pas rejoués |
| Un DM arrive mais sans réponse | Activez les réponses de l'IA après l'étape de vérification et vérifiez si la carte affiche une erreur |
| Les commentaires ne reçoivent pas de réponse | Activez **Répondre aux commentaires** et ajoutez une réponse enregistrée ou autorisez les réponses de l'IA |
| Un message vocal reçoit une réponse en texte | Comportement normal ; les réponses vocales Instagram ne sont pas prises en charge |
| La carte affiche une erreur de connexion | Sélectionnez **Se reconnecter avec Instagram** et connectez-vous à nouveau |
Ne communiquez jamais votre mot de passe Instagram à qui que ce soit, y compris au support ; la connexion utilise le système de connexion propre à Instagram.
---
# KakaoTalk
Source: /fr/docs/connectors/kakao.md
{/* docs-visuals */}
## Liste de contrôle de la configuration [#liste-de-contrôle-de-la-configuration]
La carte KakaoTalk de Make Agent Fast affiche cette liste avec vos propres valeurs déjà renseignées ; la plupart des propriétaires la suivent donc directement depuis cette carte. Toutes les étapes se déroulent dans la console de Kakao, à l'exception des deux champs indiqués ci-dessous.
1. **Créez un bot** dans Kakao i Open Builder. Un bot regroupe tous les blocs de scénario avec lesquels la chaîne répond ; ignorez cette étape si la chaîne dispose déjà d'un bot que vous pouvez modifier.
2. **Ajoutez une skill** et définissez son URL sur l'**URL de la skill** du connecteur, puis ajoutez un en-tête de requête personnalisé `X-Kakao-Bot-Secret` contenant votre **Secret du bot**. Kakao ne signe pas les requêtes de skill : cet en-tête est donc la seule preuve qu'un appel provient bien de votre bot.
3. **Faites pointer le bloc de repli vers la skill** afin que chaque question non gérée par vos scénarios parvienne à l'agent. Reliez un bloc de scénario nommé à la même skill si l'agent doit aussi y répondre.
4. **Activez l'option de rappel (callback)** pour ce bloc. Kakao abandonne une réponse de skill qui met plus de cinq secondes à arriver ; avec le callback activé, Make Agent Fast renvoie immédiatement une bulle d'attente, puis publie la réponse finale sur `userRequest.callbackUrl` dans la minute pendant laquelle cette URL à usage unique reste valide.
5. **Connectez la chaîne KakaoTalk** au bot, puis collez ce même identifiant de chaîne dans le champ **ID de la chaîne** du connecteur dans Make Agent Fast.
6. **Déployez le bot.** Les modifications d'Open Builder n'atteignent les visiteurs qu'après un déploiement, et chaque modification ultérieure d'une skill ou d'un bloc nécessite un nouveau déploiement.
Le reste de cette page détaille ces mêmes six étapes.
## Préparer les éléments Kakao [#préparer-les-éléments-kakao]
Créez ou sélectionnez l'application Kakao Developers, la chaîne KakaoTalk et le bot Kakao i Open Builder qui hébergeront l'intégration. Consultez la [documentation officielle d'Open Builder](https://i.kakao.com/docs/key-concepts-block#skill) de Kakao pour les skills et les blocs.
Rassemblez ou créez ces valeurs :
| Champ Make Agent Fast | Source | Utilité |
| --------------------- | --------------------------------------------- | -------------------------------------------------------------------- |
| **ID de la chaîne** | ID public/de recherche de la chaîne KakaoTalk | Associe le connecteur à la chaîne visée |
| **Clé d'API REST** | Clés de l'application Kakao Developers | Valide l'application Kakao |
| **Secret du bot** | Un secret aléatoire long que vous générez | Authentifie les requêtes de skill entrantes via `X-Kakao-Bot-Secret` |
Le Secret du bot est obligatoire sur les environnements Make Agent Fast déployés, car les appels de skill Kakao ne fournissent aucune signature de plateforme. Générez une valeur unique à forte entropie et ne réutilisez pas la clé d'API REST comme secret.
## Enregistrer le connecteur [#enregistrer-le-connecteur]
Ouvrez la page **Canaux** de l'agent, choisissez **Chaîne KakaoTalk**, saisissez les trois valeurs, puis sélectionnez **Connecter**. Make Agent Fast valide la clé d'API REST lorsque les autorisations de Kakao le permettent et affiche l'**URL du webhook** propre au connecteur après l'enregistrement.
Make Agent Fast ne peut pas créer la skill Open Builder ni la rattacher à un bloc à votre place ; le reste du travail s'effectue dans la console de Kakao.
## Configurer la skill Open Builder [#configurer-la-skill-open-builder]
1. Dans Kakao i Open Builder, créez une skill pour le bot concerné.
2. Définissez l'URL de la skill sur l'**URL du webhook** copiée depuis le connecteur.
3. Ajoutez un en-tête de requête personnalisé nommé `X-Kakao-Bot-Secret` dont la valeur correspond exactement au **Secret du bot**.
4. Reliez la skill au bloc de repli ou au bloc de scénario qui doit invoquer l'agent.
5. Activez l'option de rappel (callback) de ce bloc afin que les réponses lentes respectent le délai de cinq secondes imposé par Kakao aux skills.
6. Enregistrez, puis déployez/publiez la configuration du bot en suivant le processus de Kakao.
L'en-tête n'est pas sensible à la casse selon les règles HTTP, mais la valeur du secret doit être exacte. Toute personne qui connaît l'URL du webhook sans connaître ce secret doit recevoir une réponse « non autorisé ».
## Tester les fonctionnalités [#tester-les-fonctionnalités]
Utilisez d'abord l'outil de test d'Open Builder, puis la chaîne KakaoTalk connectée. Envoyez une question textuelle réaliste en coréen ou dans une langue prise en charge, puis vérifiez la réponse en ligne, le **Dernier message** et le fil dans **Conversations**.
La carte du connecteur copie le corps de requête ci-dessous ; ce même corps fonctionne avec `curl` sur l'URL de la skill. Il ne contient aucun `callbackUrl`, la réponse revient donc en ligne — c'est le plus simple à vérifier en premier.
```json
{
"intent": {
"id": "5a56ec0cf65e53002d34e0f4",
"name": "Fallback block"
},
"userRequest": {
"timezone": "Asia/Seoul",
"utterance": "What are your opening hours?",
"lang": "kr",
"user": {
"id": "kakao-test-user",
"type": "botUserKey",
"properties": {
"plusfriendUserKey": "kakao-test-user"
}
},
"block": {
"id": "5a56ec0cf65e53002d34e0f4",
"name": "Fallback block"
}
},
"bot": {
"id": "5a56ec0cf65e53002d34e0f2",
"name": "Your bot"
},
"action": {
"id": "5a56ec0cf65e53002d34e0f6",
"name": "Make Agent Fast skill",
"params": {},
"detailParams": {},
"clientExtra": {}
}
}
```
Une skill en bon état répond dans le délai de cinq secondes avec une seule sortie `simpleText` :
```json
{
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "We are open 9:00–18:00 on weekdays."
}
}
]
}
}
```
Une fois l'option de rappel du bloc activée, Open Builder ajoute `userRequest.callbackUrl` à la requête. Make Agent Fast répond alors d'abord avec une bulle d'attente, puis envoie en POST la réponse finale à cette URL à usage unique :
```json
{
"version": "2.0",
"useCallback": true,
"data": {
"text": "One moment — I am looking that up."
}
}
```
Le contrat actuel de la skill est limité au texte. La réponse de l'agent est un seul `skillResponse` Kakao en version `2.0` avec une sortie `simpleText`, plafonnée sous la limite de texte de Kakao, renvoyée en ligne ou sur l'URL de rappel. La voix, les fichiers, les images et l'audio sortant distinct ne sont pas pris en charge.
## Renouveler ou déconnecter [#renouveler-ou-déconnecter]
Pour renouveler le Secret du bot, mettez à jour le connecteur et l'en-tête personnalisé d'Open Builder en une seule opération coordonnée, puis testez immédiatement. Toute divergence bloque l'ensemble des requêtes entrantes. Renouvelez la clé d'API REST dans Kakao Developers et dans Make Agent Fast avant de révoquer l'ancienne clé.
Désactiver ou supprimer le connecteur ne supprime ni la skill ni le bloc Open Builder. Supprimez ou détachez ces objets côté fournisseur lorsque vous désactivez définitivement l'intégration.
## Dépannage [#dépannage]
| Symptôme | Solution |
| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- |
| Le connecteur exige un Secret du bot | Générez-en un ; les environnements déployés refusent un webhook Kakao non authentifié |
| Clé d'API REST rejetée | Utilisez la clé d'API REST de l'application Kakao concernée et vérifiez les autorisations de sa chaîne |
| Open Builder reçoit « non autorisé » | Ajoutez ou mettez à jour `X-Kakao-Bot-Secret` pour qu'il corresponde exactement à la valeur du connecteur |
| L'outil de test affiche un repli au lieu d'une réponse | Vérifiez que le bloc invoque bien l'URL de skill enregistrée et consultez les journaux de requêtes/réponses de Kakao |
| Les requêtes expirent | Activez l'option de rappel du bloc ; sans elle, Kakao accorde cinq secondes à la skill |
| La voix ou les images sont ignorées | C'est normal ; le connecteur actuel n'accepte que le texte |
N'exposez jamais la clé d'API REST ni le Secret du bot dans du code côté client ou dans une documentation publique.
---
# Messenger
Source: /fr/docs/connectors/messenger.md
{/* docs-visuals */}
## Préparer l'application Meta et la Page [#préparer-lapplication-meta-et-la-page]
Suivez le [guide de démarrage officiel de la plateforme Messenger](https://developers.facebook.com/docs/messenger-platform/get-started) de Meta. Ajoutez Messenger à une application Meta, connectez la Page Facebook qui doit recevoir les messages et assurez-vous que votre compte peut administrer ces deux éléments.
Récupérez les valeurs depuis la même application et la même Page :
| Champ Make Agent Fast | Valeur du fournisseur | Utilité |
| ---------------------------- | --------------------------------------------------------- | ------------------------------------------------ |
| **Jeton d'accès de la Page** | Jeton émis pour la Page sélectionnée | Lit l'identité de la Page et envoie les réponses |
| **Secret de l'application** | Secret hexadécimal de 32 caractères de l'application Meta | Vérifie les requêtes webhook entrantes signées |
N'utilisez pas de jeton d'accès utilisateur ni de jeton appartenant à une autre Page. Le mode de développement et l'état de la validation (review) de l'application Meta déterminent quelles personnes peuvent utiliser l'intégration.
## Enregistrer et valider les identifiants [#enregistrer-et-valider-les-identifiants]
Ouvrez la page **Canaux** de l'agent, sélectionnez **Messenger**, saisissez le jeton d'accès de la Page et le secret de l'application, puis sélectionnez **Connecter**.
Make Agent Fast appelle la Graph API avec `appsecret_proof`, récupère l'ID et le nom de la Page, puis lie les événements entrants à cette Page précise. La carte du connecteur affiche ensuite son **URL du webhook** et son **Jeton de vérification**.
## Configurer le webhook de la Page [#configurer-le-webhook-de-la-page]
Dans la même application Meta :
1. Ouvrez les paramètres du webhook Messenger.
2. Collez l'**URL du webhook** et le **Jeton de vérification** du connecteur.
3. Terminez le défi de vérification.
4. Sélectionnez l'abonnement aux événements de message requis par votre workflow Messenger.
5. Abonnez la Page Facebook visée à l'application.
6. Vérifiez que l'abonnement de la Page et le mode de l'application autorisent votre utilisateur de test.
Le jeton de vérification ne sert que pour le défi initial. Les événements en production doivent porter une signature correspondant au secret de l'application. Make Agent Fast rejette également les événements adressés à une autre Page, même s'ils proviennent de la même application Meta.
## Tester les fonctionnalités [#tester-les-fonctionnalités]
Envoyez un message normal à la Page depuis un compte de test autorisé et non administrateur, puis vérifiez la réponse ainsi que le fil dans **Conversations**. Testez ensuite une pièce jointe audio si les messages vocaux entrants comptent pour votre workflow.
Le texte et les fichiers audio entrants pris en charge sont traités. Dans le connecteur Messenger actuel, les réponses sont uniquement textuelles, même lorsque le message d'origine était vocal. Les accusés de livraison et de lecture, les échos des propres messages de la Page, les images et les autres pièces jointes non prises en charge sont ignorés.
## Prêt pour la production [#prêt-pour-la-production]
Réalisez les étapes exigées par Meta pour votre audience : autorisations, validation de l'application (app review), vérification de l'entreprise, URL de politique de confidentialité et publication de la Page. Un test réussi en mode développement avec un compte ayant un rôle sur l'application ne prouve pas que le public peut écrire à l'intégration de la Page.
Documentez l'application Meta propriétaire et l'ID de la Page pour les opérateurs. Un jeton de Page peut cesser de fonctionner lorsque son propriétaire, ses autorisations, son association à une entreprise ou la politique du fournisseur changent.
## Effectuer une rotation ou déconnecter [#effectuer-une-rotation-ou-déconnecter]
Générez le nouveau jeton de Page, mettez à jour le connecteur, testez avec un utilisateur autorisé, puis invalidez l'ancien jeton. Mettez à jour Make Agent Fast immédiatement après la rotation du secret de l'application.
Désactiver ou supprimer le connecteur ne désabonne pas la Page dans Meta. Lorsque vous mettez définitivement l'intégration hors service, supprimez l'abonnement de la Page ainsi que les identifiants du fournisseur devenus inutiles.
## Dépannage [#dépannage]
| Symptôme | Solution |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| Jeton rejeté | Vérifiez qu'il s'agit d'un jeton de Page pour la bonne Page et que le secret de l'application appartient à la même application |
| La vérification du webhook échoue | Copiez exactement l'URL et le jeton de vérification actuels ; utilisez un HTTPS public |
| La vérification fonctionne mais les messages n'arrivent pas | Abonnez la Page et l'événement de message, puis vérifiez le mode de l'application, le rôle de l'utilisateur et les journaux de livraison de Meta |
| Les requêtes sont non autorisées | Corrigez le secret de l'application ; les requêtes POST signées n'utilisent pas le jeton de vérification |
| Un message entrant apparaît mais aucune réponse n'est envoyée | Vérifiez la validité du jeton de Page, les autorisations de messagerie, l'erreur d'envoi du fournisseur et l'état du connecteur |
| Un message vocal reçoit une réponse textuelle | Comportement attendu ; les réponses vocales sortantes ne sont pas prises en charge actuellement sur Messenger |
Les identifiants du fournisseur doivent uniquement être saisis dans le formulaire du connecteur authentifié ou transmis via un appel d'API côté serveur de confiance.
---
# Présentation des connecteurs
Source: /fr/docs/connectors/overview.md
{/* docs-visuals */}
Les connecteurs reçoivent les événements d'une plateforme de messagerie externe, normalisent le texte ou l'audio pris en charge, exécutent le même agent de site et renvoient une réponse adaptée au canal. Chaque utilisateur externe dispose d'un historique de conversation propre au canal, visible dans **Conversations**.
La connexion d'un **nouveau** canal nécessite l'offre Operate ou Scale. Les connexions existantes continuent de fonctionner avec l'offre Launch.
## Matrice des fonctionnalités [#matrice-des-fonctionnalités]
| Canal | Texte entrant | Voix entrante | Texte sortant | Voix sortante | Configuration chez le fournisseur après l'enregistrement |
| --------- | --------------- | ------------- | ------------------------- | ------------- | ------------------------------------------------------------------------------------------------- |
| Telegram | Oui | Oui | Oui | Facultatif | Webhook enregistré automatiquement |
| WhatsApp | Oui | Oui | Oui | Facultatif | Ajoutez le webhook Meta et l'abonnement `messages` |
| Messenger | Oui | Oui | Oui | Non | Ajoutez le webhook Meta et abonnez la Page |
| Instagram | Oui | Oui | Oui | Non | Ajoutez le webhook Meta Instagram et abonnez `messages` |
| Discord | Question `/ask` | Non | Réponse `/ask` | Non | Collez le point de terminaison des interactions ; l'enregistrement de la commande est automatique |
| KakaoTalk | Oui | Non | Réponse de skill en ligne | Non | Ajoutez l'URL du skill, l'en-tête et le bloc dans Open Builder |
« Voix entrante » signifie qu'un message vocal ou audio pris en charge est téléchargé puis transcrit. « Voix sortante » nécessite un fournisseur de synthèse vocale opérationnel et l'option **Répondre par message vocal** du connecteur. Les pièces jointes non prises en charge, telles que les images et les localisations, sont ignorées et ne sont pas interprétées comme des instructions pour l'agent.
## Avant de connecter [#avant-de-connecter]
1. Testez l'agent concerné dans le tableau de bord. Un connecteur en brouillon peut déjà répondre.
2. Vous n'avez pas besoin de clé de modèle : la plateforme fournit les modèles. Les clés de fournisseur sont facultatives et réservées à l'offre Scale ; consultez [Clés de fournisseur](/fr/docs/account/provider-keys).
3. Créez une application, un bot, un numéro ou un canal dédié chez le fournisseur externe. Ne réutilisez pas un identifiant appartenant à une intégration de production sans rapport.
4. Vérifiez que votre déploiement dispose d'une URL de base de connecteur publique en HTTPS. Les webhooks des fournisseurs ne peuvent pas être livrés à `localhost` sans tunnel de développement sécurisé.
5. Ouvrez la page **Canaux** de l'agent et choisissez le canal.
Lors de l'enregistrement, Make Agent Fast appelle le fournisseur pour valider l'identifiant soumis. Le libellé « connecté » signifie que la validation de l'identifiant et tout provisionnement automatique ont abouti ; il ne prouve pas qu'une étape manuelle dans la console Meta, Discord ou Kakao a été réalisée.
## Gestion des identifiants [#gestion-des-identifiants]
Les formulaires de connecteur n'acceptent les identifiants du fournisseur que depuis le tableau de bord authentifié ou l'API publique côté serveur. Les secrets sont chiffrés au repos et ne sont jamais renvoyés dans les réponses de liste des connecteurs. Traitez les valeurs suivantes comme des mots de passe :
* Jeton de bot Telegram
* Jetons d'accès Meta et secret de l'application
* Jeton de bot Discord
* Clé d'API REST Kakao et secret du bot
Ne les placez pas dans du JavaScript côté navigateur, des captures d'écran, des tickets de support ou un dépôt de code source. L'URL du webhook et le jeton de vérification Meta sont des valeurs de configuration destinées à être copiées dans la console du fournisseur correspondant ; elles ne remplacent pas les identifiants du fournisseur.
## Se connecter via l'API [#se-connecter-via-lapi]
Utilisez une clé d'API MAF conservée côté serveur avec le scope `connectors:write`. L'objet `credentials` propre à chaque canal est en écriture seule. La réponse omet les secrets en clair et inclut l'URL du webhook nécessaire à la configuration manuelle chez le fournisseur.
```bash
curl -X POST "https://makeagent.fast/api/v1/sites/$SITE_ID/connectors" \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: connector-telegram-v1" \
-d '{
"channel": "telegram",
"credentials": { "bot_token": "'$TELEGRAM_BOT_TOKEN'" },
"reply_with_voice": false
}'
```
`reply_with_voice` et le champ facultatif `display_label` sont des champs de premier niveau, et non des éléments d'un objet `config`. Enregistrer à nouveau le même bot ou le même compte met à jour son identifiant et ses paramètres tout en conservant son jeton de routage. Pour Telegram et Instagram, un bot ou un compte différent ajoute une nouvelle connexion (jusqu'à cinq par agent) ; sur les autres canaux, l'enregistrement remplace la connexion existante. Consultez [Authentification de l'API](/fr/docs/api/authentication), [Scopes et erreurs](/fr/docs/api/scopes-errors) et la [référence de l'API](/fr/docs/api/reference) pour les règles d'intégration en production.
## Tester et surveiller [#tester-et-surveiller]
Utilisez un utilisateur de test du fournisseur et une question réaliste qui dépend des connaissances de l'agent. Vérifiez chacun des points suivants :
* Le fournisseur accepte ou vérifie le point de terminaison du webhook.
* Un message parvient à l'agent et reçoit la réponse attendue.
* **Dernier message** change sur la carte du connecteur.
* Le fil apparaît dans **Conversations** avec le bon canal.
* Toute restriction du fournisseur liée à la validation ou au mode développement est bien comprise avant le lancement public.
* La voix est testée séparément du texte lorsque le canal la prend en charge.
La carte du connecteur affiche la dernière erreur du fournisseur ou de livraison. Les tableaux de bord des fournisseurs conservent également des journaux de livraison ; comparez les horodatages et les identifiants d'événements lorsqu'un seul côté signale la requête.
## Désactiver, renouveler ou supprimer [#désactiver-renouveler-ou-supprimer]
**Désactiver** interrompt le traitement tout en conservant l'enregistrement du connecteur. Le webhook Telegram reste enregistré tant que la connexion est désactivée (Make Agent Fast n'appelle pas `deleteWebhook`) et les messages entrants sont ignorés ; la réactivation enregistre à nouveau le webhook. Les abonnements du fournisseur configurés dans la console restent en place et doivent aussi être suspendus côté fournisseur si nécessaire. **Supprimer** supprime le connecteur Make Agent Fast et tente, dans la mesure du possible, de démanteler la configuration chez le fournisseur, mais ne supprime pas l'application externe, ne révoque pas son identifiant et n'efface pas l'historique de conversation existant.
Pour un renouvellement, créez le nouveau jeton chez le fournisseur, mettez à jour le connecteur, testez-le, puis révoquez l'ancien jeton. Si un identifiant a été exposé, révoquez-le d'abord chez le fournisseur et traitez la période concernée comme un incident de sécurité.
## Problèmes courants [#problèmes-courants]
| Symptôme | À vérifier |
| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Les identifiants ne sont pas validés | Application/bot corrects, type de jeton, expiration, permission requise du fournisseur et caractères copiés |
| La vérification du webhook échoue | URL HTTPS publique, jeton de vérification exact, bon produit du fournisseur et secret de signature des requêtes |
| La vérification réussit mais aucun message n'arrive | Abonnement aux événements, association de la Page/du numéro/du canal, mode de l'application du fournisseur et état d'activation du connecteur |
| Le texte fonctionne mais pas la voix | Prise en charge par le canal, clé de synthèse/transcription vocale, audio pris en charge, autorisation d'accès aux médias et expiration du téléchargement chez le fournisseur |
| Les réponses s'arrêtent après le renouvellement | Nouvel identifiant enregistré, ancien identifiant révoqué uniquement après les tests et abonnement manuel du fournisseur pointant toujours vers ce webhook |
Poursuivez avec le guide du canal concerné pour connaître les champs exacts du fournisseur et la séquence à suivre dans sa console.
---
# Telegram
Source: /fr/docs/connectors/telegram.md
{/* docs-visuals */}
## Configuration rapide [#configuration-rapide]
Si l'option **Créer avec un QR code** est disponible sur le connecteur Telegram, sélectionnez-la, scannez le QR code ou choisissez **Ouvrir Telegram**, puis appuyez sur **Créer le bot** dans le bot de configuration. Revenez dans Make Agent Fast, vérifiez le nom d'utilisateur du bot, puis sélectionnez **Connecter ce bot**. Aucune copie de token n'est nécessaire. La configuration expire au bout de 15 minutes ; vous pouvez l'annuler et la relancer.
Si la configuration rapide n'est pas disponible, utilisez **Se connecter avec un token de bot** ci-dessous. Les deux méthodes appliquent les mêmes vérifications de connexion et la même confirmation de remplacement.
Le formulaire de création suggère le nom d'affichage de votre agent et un nom d'utilisateur au format `maf___bot`. Les deux sont modifiables ; la partie aléatoire réduit les collisions de noms, mais c'est Telegram qui effectue la vérification finale de disponibilité. Les bots existants ne sont pas renommés.
Une fois le bot créé, le bot de configuration envoie un bouton **Connecter ce bot** qui ouvre l'écran d'examen de connexion authentifié de votre agent. La création du bot ne suffit pas à le connecter. Une fois la confirmation réussie, **Ouvrir le bot** vous mène à la conversation pour effectuer vos tests. `/start` ou `/help` rétablit une configuration active ou affiche les boutons du tableau de bord et du guide.
## Créer et préparer un bot manuellement [#créer-et-préparer-un-bot-manuellement]
Suivez l'[Introduction to Bots](https://core.telegram.org/bots) officielle de Telegram et le [guide BotFather](https://core.telegram.org/bots/features#botfather) :
1. Ouvrez le compte vérifié **@BotFather** dans Telegram.
2. Lancez `/newbot`, choisissez un nom d'affichage, puis un nom d'utilisateur unique se terminant par `bot`.
3. Copiez le token du bot. Toute personne possédant ce token contrôle le bot.
4. Si vous le souhaitez, configurez la photo, la description, le texte « À propos » et l'aide localisée des commandes dans BotFather avant le lancement.
Le token sert à l'API Telegram Bot ; ce n'est ni un code de connexion Telegram, ni un API ID, ni un API hash.
## Se connecter dans Make Agent Fast [#se-connecter-dans-make-agent-fast]
Ouvrez la page **Canaux** de l'agent, choisissez **Telegram**, collez le **Token du bot**, indiquez si les réponses compatibles doivent aussi être énoncées à voix haute, puis sélectionnez **Connecter**.
Make Agent Fast appelle `getMe` de Telegram pour valider le token et afficher le nom d'utilisateur du bot. Il appelle ensuite `setWebhook` avec l'URL HTTPS publique du connecteur, un token de vérification secret, et `message`, `callback_query` et `my_chat_member` comme types de mises à jour acceptés. Les mises à jour en attente existantes ne sont pas supprimées.
Aucune étape manuelle de webhook n'est normalement requise. Arrêtez tout service de polling avant de vous connecter. Si le bot dispose d'un autre récepteur de webhook, examinez et confirmez son remplacement ; Make Agent Fast ne le reprend jamais silencieusement. Un agent peut répondre sur jusqu'à cinq bots Telegram simultanément ; chaque bot constitue sa propre connexion. Enregistrer un autre bot ajoute une nouvelle connexion au lieu de remplacer la connexion actuelle. Un bot déjà rattaché à un autre agent doit d'abord y être déconnecté.
## Tester la conversation [#tester-la-conversation]
1. Ouvrez le lien `t.me` du bot depuis un compte Telegram qui n'est pas celui du propriétaire.
2. Sélectionnez **Démarrer** ; les bots ne peuvent pas initier une conversation avec un utilisateur.
3. Envoyez une question textuelle dont la réponse figure dans vos sources.
4. Envoyez un message vocal si la voix est activée.
5. Vérifiez que les réponses arrivent, que **Dernier message** change et que le fil apparaît dans **Conversations**.
Les messages privés sont publics par défaut : les visiteurs n'ont pas besoin de l'approbation du propriétaire. Les réponses dans les groupes sont désactivées tant que le propriétaire n'active pas **Répondre dans les groupes lorsque le bot est mentionné ou qu'on lui répond**. Le mode confidentialité de Telegram (Privacy Mode) et les autorisations du groupe continuent de s'appliquer. Testez d'abord les messages directs.
## Fonctionnement de la voix [#fonctionnement-de-la-voix]
Telegram prend en charge la voix entrante et la voix sortante dans ce connecteur. La voix entrante est téléchargée puis transcrite avant le tour de l'agent. Lorsque **Répondre par la voix** est activé et qu'un fournisseur de synthèse vocale est disponible, Make Agent Fast envoie une réponse vocale/audio en plus du texte. Si la transcription ou la synthèse vocale échoue, demandez à l'utilisateur de réessayer par écrit et consultez l'erreur du connecteur.
## Renouveler, désactiver ou supprimer [#renouveler-désactiver-ou-supprimer]
Si le token est exposé, générez-en un nouveau ou révoquez-le immédiatement dans BotFather, mettez à jour le connecteur avec le nouveau token, puis testez à nouveau. La mise à jour des identifiants d'un même bot conserve ses paramètres et son statut de pause. Le remplacer par un autre bot nécessite une confirmation et conserve l'historique du bot précédent séparé.
Désactiver un bot arrête les réponses en local ; le supprimer archive la connexion et conserve son historique. Aucune de ces actions ne supprime le bot Telegram ni n'appelle `deleteWebhook`, ce qui pourrait perturber un récepteur plus récent. Les connexions archivées ignorent les messages entrants. Les bots créés via la configuration rapide peuvent actualiser leurs identifiants après des événements du cycle de vie côté gestionnaire, mais un bot en pause reste en pause et un changement de propriétaire désactive la connexion en vue d'un examen.
## Dépannage [#dépannage]
| Symptôme | Solution |
| ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Token rejeté à l'enregistrement | Copiez le token actuel depuis BotFather ; supprimez les espaces et assurez-vous qu'il appartient bien à ce bot |
| Les messages arrivent sur un ancien service | Arrêtez le polling sur ce service, reconnectez-vous ici et confirmez explicitement tout remplacement de récepteur |
| Les messages directs fonctionnent mais pas ceux des groupes | Activez les réponses dans les groupes, mentionnez le bot ou répondez-lui, et vérifiez le mode confidentialité de Telegram (Privacy Mode) et les autorisations du groupe |
| Le bot n'écrit pas en premier à un nouvel utilisateur | Comportement normal de Telegram ; demandez à l'utilisateur d'ouvrir le bot et de sélectionner **Démarrer** |
| Le texte fonctionne mais pas la voix | Vérifiez les clés du modèle, de transcription et de synthèse vocale, puis réessayez avec un message vocal Telegram pris en charge |
Ne collez jamais un token actif dans de la documentation, du code source, des outils d'analyse ou une capture d'écran destinée au support.
---
# WhatsApp
Source: /fr/docs/connectors/whatsapp.md
{/* docs-visuals */}
## Préparer l'application Meta et le numéro [#préparer-lapplication-meta-et-le-numéro]
Suivez le [guide de démarrage de l'API WhatsApp Cloud](https://developers.facebook.com/docs/whatsapp/cloud-api/get-started) officiel de Meta pour créer ou sélectionner une application Meta, ajouter le produit WhatsApp, puis associer un compte WhatsApp Business et un numéro de téléphone.
Récupérez ces trois valeurs à partir de la même application et du même numéro :
| Champ Make Agent Fast | Valeur du fournisseur | Remarques |
| --------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| **Phone number ID** | Identifiant numérique du numéro de téléphone (Phone Number ID) | Il ne s'agit ni du numéro de téléphone visible commençant par `+`, ni de l'identifiant WABA |
| **Access token** | Jeton d'accès de l'API Cloud | Les jetons temporaires du tableau de bord expirent ; utilisez un jeton d'utilisateur système de longue durée adapté à la production |
| **App secret** | Clé secrète de l'application Meta | Une clé secrète hexadécimale de 32 caractères, utilisée pour vérifier la signature des webhooks |
N'accordez que les autorisations nécessaires au numéro et au flux de messagerie. Séparez les ressources de développement/test du numéro de production.
## Enregistrer et valider les identifiants [#enregistrer-et-valider-les-identifiants]
Ouvrez la page **Canaux** de l'agent, sélectionnez **WhatsApp**, saisissez les trois valeurs, choisissez **Répondre par la voix** si nécessaire, puis sélectionnez **Connecter**.
Make Agent Fast valide le numéro via l'API Graph à l'aide du jeton d'accès et de `appsecret_proof` ; cela permet de détecter un numéro, un jeton ou une clé secrète d'application incorrects avant le début du trafic webhook. La carte du connecteur affiche alors une **URL du webhook** et un **Jeton de vérification** uniques.
## Configurer le webhook Meta [#configurer-le-webhook-meta]
Dans la même application Meta :
1. Ouvrez la configuration du webhook WhatsApp.
2. Collez l'**URL du webhook** du connecteur comme URL de rappel.
3. Collez le **Jeton de vérification** du connecteur à l'identique ; il est sensible à la casse.
4. Terminez la vérification.
5. Abonnez le compte WhatsApp Business ou le numéro au champ de webhook `messages`.
6. Vérifiez que l'application et les ressources de l'entreprise sont accessibles aux utilisateurs de test ou de production concernés.
Le jeton de vérification prouve que vous êtes propriétaire lors de la requête GET de vérification. Les requêtes POST en cours d'exécution sont authentifiées séparément par la signature de la clé secrète de l'application Meta ; ne substituez pas l'un à l'autre.
## Tester le texte et la voix [#tester-le-texte-et-la-voix]
Envoyez d'abord un message depuis un numéro de test autorisé. En mode développement Meta, les utilisateurs non enregistrés peuvent ne pas pouvoir joindre l'application. Vérifiez le fil et le canal dans **Conversations** et surveillez **Dernier message** sur la carte du connecteur.
Les messages entrants texte et vocaux sont pris en charge. Lorsque **Répondre par la voix** est activé et que la synthèse vocale est configurée, Make Agent Fast téléverse l'audio généré via l'API Cloud et l'envoie en complément de la réponse textuelle. Les images, les localisations, les contacts et les autres types de messages non pris en charge sont ignorés.
## Prêt pour la production [#prêt-pour-la-production]
Avant de communiquer le numéro, effectuez la vérification de l'entreprise auprès de Meta, la révision de l'application, la validation du nom d'affichage, les modèles de messages et les étapes liées à la politique de messagerie requises pour votre cas d'usage. Ces exigences sont contrôlées par Meta et peuvent évoluer indépendamment de Make Agent Fast.
Utilisez un identifiant de production avec un responsable clairement désigné et une procédure d'expiration/rotation. Notez quelle application Meta, quel utilisateur système, quel WABA et quel Phone Number ID correspondent à ce connecteur afin qu'un opérateur puisse effectuer la rotation sans tâtonner.
## Effectuer la rotation ou déconnecter [#effectuer-la-rotation-ou-déconnecter]
Créez un jeton de remplacement avec les mêmes accès aux ressources, mettez à jour le connecteur, envoyez un message de test, et ne révoquez l'ancien jeton qu'ensuite. Si la clé secrète de l'application change, mettez-la à jour immédiatement dans Make Agent Fast, sinon tous les webhooks entrants signés échoueront.
Désactiver ou supprimer le connecteur ne désabonne pas et ne supprime pas la configuration du webhook Meta. Supprimez également l'abonnement côté fournisseur lorsque vous mettez définitivement le numéro hors service.
## Dépannage [#dépannage]
| Symptôme | Solution |
| --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Identifiants rejetés | Vérifiez que le jeton peut lire le Phone Number ID exact et que la clé secrète provient de la même application |
| Meta ne parvient pas à vérifier l'URL de rappel | Utilisez l'URL HTTPS copiée et le jeton de vérification exact ; assurez-vous que le connecteur existe toujours |
| La vérification réussit mais aucun message n'arrive | Abonnez-vous à `messages`, vérifiez l'association WABA/numéro, le mode de l'application, l'accès des utilisateurs de test et les journaux de livraison du fournisseur |
| Les webhooks renvoient une erreur d'autorisation | Saisissez à nouveau la bonne clé secrète de l'application ; les signatures POST de Meta n'utilisent pas le jeton de vérification |
| Les réponses sortantes échouent | Vérifiez l'expiration du jeton, les autorisations du numéro, la politique/la fenêtre de messagerie du destinataire et les erreurs de l'API Graph |
| Le texte fonctionne mais pas l'audio | Vérifiez les clés des fournisseurs de transcription/synthèse vocale et l'accès du jeton au téléversement/téléchargement de médias |
N'exposez jamais le jeton d'accès ni la clé secrète de l'application dans du code côté navigateur. Utilisez l'API publique uniquement depuis un serveur de confiance lorsque vous automatisez la création de connecteurs.
---
# Astro
Source: /fr/docs/embed/astro.md
{/* docs-visuals */}
## Préparer l'origine de déploiement [#préparer-lorigine-de-déploiement]
Activez **Afficher sur mon site web** pour l'agent Make Agent Fast (page de l'agent → **Mettre en ligne** → **Widget du site web**), puis ajoutez les origines exactes de développement, de prévisualisation et de production Astro sous **Adresses de site web autorisées**. Ce qui compte, c'est le schéma, le nom d'hôte et le port finaux affichés dans le navigateur, et non l'hôte de build ni l'URL du dépôt.
## Ajouter à un layout partagé [#ajouter-à-un-layout-partagé]
Placez le loader externe standard juste avant `