BECLEVERStudio ↗

API PUBLIQUE · ORGANISATIONS ISOLÉES

Vos outils.
Vos conversations.

Utilisez une clé dédiée pour intégrer BECLEVER à votre serveur. La disponibilité de chaque opération dépend des permissions de la clé, du compte WhatsApp et des fonctions activées.

Consulter le contrat OpenAPI ↗
01 / CRÉER UN ACCÈS

Une clé par intégration.

Dans le Studio, un propriétaire ou administrateur ouvre Développeurs, nomme l’intégration, sélectionne ses permissions et fixe une expiration. Une clé expire au plus tard après 365 jours ; 90 jours sont proposés.

Le secret est révélé uniquement après sa création. Copiez-le dans un coffre de secrets côté serveur. Il ne doit apparaître ni dans une URL, ni dans une application web publique, ni dans vos journaux. L’interface efface son encart après cinq minutes ou lorsque vous quittez la vue.

02 / LIMITER LES PERMISSIONS

Le strict nécessaire.

Les permissions disponibles sont proposées par le serveur : consultation des comptes et conversations, lecture de l’historique global avec messages:read, envoi de messages, lecture ou ajout de médias privés. Une clé ne donne pas accès aux paiements, aux membres ou à la création d’autres clés.

La clé reste rattachée à son organisation. Le serveur contrôle son expiration, sa révocation et les droits du compte avant les opérations.

03 / RECEVOIR DES ÉVÉNEMENTS

Une destination vérifiée.

Ajoutez votre URL HTTPS et choisissez message.received, message.sent ou message.status. Vous pouvez choisir uniquement webhook.test pour préparer un récepteur sans événements de messages. Les événements sélectionnés contiennent des données de votre organisation : utilisez un serveur que vous êtes autorisé à alimenter.

Conservez le secret de signature à la création du webhook. Vérifiez la signature sur le corps brut de la requête selon le contrat OpenAPI. Dédupliquez les événements grâce à leur identifiant avant d’appliquer vos traitements.

04 / OBSERVER ET RÉVOQUER

Un accès reste sous contrôle.

Le Studio affiche les expirations, les dernières utilisations des clés et les livraisons des webhooks. Le bouton « Envoyer un test » déclenche un vrai POST fictif vers votre récepteur, sans message WhatsApp. Un nouveau test par minute et par destination est autorisé ; une reprise après erreur utilise la même référence. Le statut « Pris en charge » ne confirme pas la réception : consultez les livraisons. Un accusé HTTP confirme la réception par votre serveur, pas le succès de votre traitement métier.

Révoquez les accès devenus inutiles. Si une création reste incertaine, consultez la liste avant de recommencer. Un secret perdu ne se récupère pas : révoquez l’accès concerné et créez-en un nouveau.

PREMIÈRE REQUÊTE · LECTURE SEULE

Consulter les capacités.

Définissez BECLEVER_API_KEY depuis votre coffre de secrets côté serveur, puis appelez :

curl --fail-with-body https://beclever.fr/api/v1/capabilities \
  --header "Authorization: Bearer $BECLEVER_API_KEY" \
  --header "Accept: application/json"

Cet exemple ne transmet aucun message. Consultez le contrat OpenAPI pour les champs, les erreurs et les règles de reprise de chaque route. Ne répétez pas automatiquement une écriture dont le résultat est inconnu.

Les limites annoncées sont de 60 requêtes par minute par clé et 300 par organisation. Le serveur peut refuser une demande lorsque la limite est atteinte ; respectez les indications de reprise retournées.

CONVERSATIONS · LECTURE SEULE

Retrouver un échange conservé.

Avec la permission conversations:read, consultez les conversations déjà conservées par BECLEVER. Aucun appel au moteur ni import du passé WhatsApp n’est déclenché ; le compte peut être déconnecté. Cette permission reste distincte de messages:read et de l’envoi.

GET /api/v1/conversations sans paramètre conserve sa réponse {conversations} : 100 résultats maximum, classés par dernière mise à jour décroissante. Pour parcourir la liste, ajoutez limit, channelId ou cursor. Le mode paginé renvoie {conversations, hasMore, nextCursor}, avec 50 résultats par défaut et de 1 à 100 par page. Les paramètres inconnus, répétés ou vides sont refusés.

curl --fail-with-body --get 'https://beclever.fr/api/v1/conversations' \
  --header "Authorization: Bearer ${BECLEVER_API_KEY}" \
  --data-urlencode 'channelId=clever_00000000000000000000000000000000' \
  --data-urlencode 'limit=50'

Les pages suivent un ordre d’indexation interne immuable, du plus récent au plus ancien. Ce n’est ni l’ordre de updatedAt, ni une date de création historique WhatsApp. La première page fixe une borne haute : les conversations ajoutées ensuite restent hors du relevé. Le statut et updatedAt sont ceux conservés au moment de chaque lecture.

Reprenez avec le nextCursor reçu et le même filtre channelId ; limit peut changer. Le curseur opaque est lié à votre organisation et au filtre, et expire 15 minutes après la première page, sans prolongation. Il ne remplace pas la clé ni ses droits. À la dernière page, hasMore vaut false et nextCursor vaut null. Pour changer de filtre ou voir les nouveaux échanges, recommencez sans curseur et dédupliquez par conversations[].id.

curl --fail-with-body --get 'https://beclever.fr/api/v1/conversations' \
  --header "Authorization: Bearer ${BECLEVER_API_KEY}" \
  --data-urlencode 'channelId=clever_00000000000000000000000000000000' \
  --data-urlencode 'limit=100' \
  --data-urlencode "cursor=${BECLEVER_CONVERSATIONS_CURSOR}"

Pour un échange précis, utilisez son identifiant interne. Exemple fictif :

curl --fail-with-body \
  'https://beclever.fr/api/v1/conversations/22222222-2222-4222-8222-222222222222' \
  --header "Authorization: Bearer ${BECLEVER_API_KEY}"

La réponse {conversation} fournit les identifiants de l’échange et du compte, chatId, l’état courant, le motif et updatedAt, ainsi que les références de publication et de bloc éventuelles. Elle ne contient ni messages ni variables internes. Un échange inconnu ou inaccessible renvoie 404 sans révéler une autre organisation. La route /conversations/{id}/messages reste inchangée ; la pagination décrite ici porte sur la liste des conversations.

Paramètre invalide : 400 runtime-conversations-invalid-query ; curseur invalide ou expiré : 400 runtime-conversations-cursor-invalid ; conversation ou filtre inaccessible : 404 runtime-conversation-not-found. Aucun paramètre de requête n’est accepté sur le détail. La chaîne de requête est limitée à 4 096 caractères et le curseur à 2 048.

Champs, erreurs et contrat complet ↗

Filtrer votre boîte commune.

La liste paginée des conversations accepte les filtres combinables channelId, provider=whatsapp|telegram, tag et q. Les filtres sont appliqués à tout le journal avant pagination. q recherche un titre de conversation, un identifiant ou un numéro (100 caractères maximum), jamais le contenu des messages. tag sélectionne une étiquette exacte, normalisée en minuscules et limitée à 40 caractères.

Le DTO peut fournir title, le titre conservé d’une conversation Telegram (200 caractères maximum), ainsi que chatType, canSend et manualOnly pour un compte personnel. Une conversation synchronisée peut ne contenir aucun message : ces lectures n’ouvrent pas l’historique Telegram et ne le marquent pas comme lu. Dans le Studio, le propriétaire ou un administrateur autorisé peut charger cet historique depuis le détail de la conversation : la confirmation signale le marquage comme lu dans Telegram. La pagination des messages déjà conservés reste une lecture locale sans cet effet. Ce parcours utilise la session du Studio ; il n’ajoute pas de droit à une clé API. Le DTO fournit conversationTags, contactTags, leur union tags et tagRevisions. Une étiquette contact suit le même identifiant exact sur les comptes d’un même fournisseur et d’une même organisation. Aucun rapprochement automatique PN/LID ni WhatsApp/Telegram. Les marquages se modifient dans le Studio ; aucune écriture de marquage n’est exposée par l’API publique.

Conservez tous les filtres avec le curseur. Les étiquettes restent courantes : si elles changent pendant la pagination, actualisez sans curseur pour une vue complète à jour. Les conversations déconnectées restent consultables. Ces lectures n’importent pas l’historique antérieur à BECLEVER.

GET /api/v1/conversations?provider=whatsapp&tag=vip&q=336&limit=50

HISTORIQUE · LECTURE SEULE

Relire les messages conservés.

GET /api/v1/messages consulte uniquement le journal reçu et conservé par BECLEVER dans votre organisation. Il ne synchronise pas tout le passé WhatsApp, ne contacte pas le moteur et ne télécharge aucune pièce jointe. Un compte déconnecté peut conserver un historique consultable.

Créez une clé avec la permission distincte messages:read. Les clés existantes ne reçoivent pas automatiquement ce droit ; messages:send et conversations:read ne le remplacent pas. Les droits du créateur restent vérifiés à chaque page.

Filtrez facultativement par channelId et/ou conversationId. Si les deux sont présents, ils doivent correspondre au même compte. limit vaut 50 par défaut, de 1 à 100. Les paramètres inconnus ou répétés sont refusés. Exemple fictif, sans effet WhatsApp :

curl --fail-with-body --get 'https://beclever.fr/api/v1/messages' \
  --header "Authorization: Bearer ${BECLEVER_API_KEY}" \
  --data-urlencode 'channelId=clever_00000000000000000000000000000000' \
  --data-urlencode 'limit=50'

La réponse contient messages, nextCursor et hasMore. Chaque message fournit ses identifiants de conversation et de compte, chatId, createdAt ISO et le contenu conservé. Les médias restent des métadonnées privées. Dédupliquez avec messages[].id.

L’ordre va du plus récent au plus ancien, puis suit une séquence stable pour les dates identiques. Le premier appel fixe une borne haute : les messages insérés ensuite restent hors de ce relevé, même avec une date ancienne. Les statuts de livraison peuvent évoluer entre deux lectures.

Reprenez avec cursor égal au nextCursor reçu, sans le modifier et en conservant les mêmes filtres ; limit peut changer. Le curseur opaque chiffré expire 15 minutes après la première page, sans prolongation, et reste lié à l’organisation, aux filtres et au relevé. Exemple de page suivante :

curl --fail-with-body --get 'https://beclever.fr/api/v1/messages' \
  --header "Authorization: Bearer ${BECLEVER_API_KEY}" \
  --data-urlencode 'channelId=clever_00000000000000000000000000000000' \
  --data-urlencode 'limit=100' \
  --data-urlencode "cursor=${BECLEVER_NEXT_CURSOR}"

À la fin, hasMore vaut false et nextCursor vaut null. Pour voir les nouveaux messages, changer de filtre ou reprendre après expiration, recommencez sans curseur et dédupliquez les résultats.

Un paramètre invalide renvoie 400 runtime-history-invalid-query ; un curseur altéré, expiré ou réutilisé hors de son contexte renvoie 400 runtime-history-cursor-invalid. Un filtre inaccessible ou incohérent renvoie 404 runtime-history-filter-not-found. L’historique par conversation garde sa route et sa permission conversations:read.

Schéma de réponse et contrat complet ↗

ROUTES PRINCIPALES

Lire, puis agir explicitement.

Les envois demandent une référence requestId stable, composée de lettres, chiffres, tirets ou traits de soulignement (80 caractères maximum). Conservez la même référence lors de la reprise d’une demande incertaine. Une nouvelle intention d’envoi reçoit une nouvelle référence.

L’exemple suivant transmet une réponse au contact de la conversation choisie. Remplacez CONVERSATION_ID et la référence uniquement après avoir vérifié le destinataire et votre autorisation d’envoi :

curl --fail-with-body --request POST \
  https://beclever.fr/api/v1/conversations/CONVERSATION_ID/reply \
  --header "Authorization: Bearer $BECLEVER_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{"text":"Votre réponse","requestId":"REFERENCE_UNIQUE_DEMANDE"}'

Une réponse HTTP 202 signifie que l’opération est prise en charge, pas que le contact a reçu ou lu le message. Une pièce jointe utilise mediaId avec une caption facultative ; elle ne doit pas être combinée avec text. Un sticker utilise un WebP statique de 512 × 512 pixels exactement, limité à 100 Kio ; il est envoyé sans légende. Les vocaux privés utilisent Ogg/Opus (8 Mio, 20 minutes, mono ou stéréo) et sont transmis sans légende ; MP3 et M4A ne sont pas acceptés. Les schémas complets et les permissions de chaque route restent définis par OpenAPI.

UNE COUVERTURE EXPLICITE

La disponibilité se vérifie.

Les fiches précisent la voie d’accès : les envois texte et médias passent par les routes dédiées de messages ; les autres opérations exposées utilisent leurs routes génériques. Consultez la disponibilité de la route indiquée avant tout appel. Le catalogue Fonctions WhatsApp distingue les opérations disponibles, limitées et non prises en charge. L’implémentation d’un transport ne prouve ni son activation, ni sa livraison réelle. BECLEVER ne promet pas de parité intégrale avec Whapi ou un autre fournisseur.

Consulter les capacités ↗

Rapprocher des contacts PN / LID

POST /api/v1/channels/{channelId}/contacts/resolve utilise le droit whatsapp:read. Envoyez explicitement 1 à 25 identifiants canoniques @c.us ou @lid. Le résultat conserve l’ordre et les doublons : chaque élément contient input, status (resolved ou unknown), phoneChatId et lidChatId, éventuellement nuls.

curl -X POST 'https://beclever.fr/api/v1/channels/channel_exemple/contacts/resolve' \
  -H "Authorization: Bearer $BECLEVER_API_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"contacts":["33600000000@c.us","123456789@lid"]}'

Cette lecture consulte réellement le moteur pour ces contacts. Elle ne synchronise pas le carnet, ne modifie pas les alias enregistrés et ne lève aucun STOP. Les deux opérations phoneByLid et lidByPhone doivent être approuvées ; le compte doit être connecté. Limites : 15 secondes pour le lot, deux lots simultanés sur le service et un par organisation. Une incohérence fournisseur fait échouer le lot.

Entrée invalide : HTTP 400 ; compte inaccessible : 404 ; approbation ou session indisponible : 409 ; limite simultanée : 429 ; échec de résolution : 502. Un contact inconnu peut simplement produire status: unknown. Cette route ne donne pas l’autorisation d’envoyer un message.

ENVOI DÉDIÉ · VIDÉO PRIVÉE

Envoyer une note vidéo ronde.

Après téléversement d’un MP4 privé par POST /api/v1/media (media:write), utilisez POST /api/v1/messages ou POST /api/v1/conversations/{id}/reply avec messages:send. Le fichier conserve kind: video. Ajoutez explicitement mediaType: videoNote : aucun texte, aperçu de lien ni légende non vide ne peut accompagner cette demande.

curl --fail-with-body -X POST 'https://beclever.fr/api/v1/conversations/conversation_exemple/reply' \
  -H "Authorization: Bearer $BECLEVER_API_KEY" \
  -H 'Content-Type: application/json' \
  --data '{"mediaId":"media_prive_exemple","mediaType":"videoNote","requestId":"note-video-exemple-001"}'

Conditions : MP4 H.264 carré, une piste vidéo, 8 Mio et 60 secondes maximum, audio AAC-LC facultatif (mp4a.40.2, mono/stéréo, 8–48 kHz) et aucune autre piste. Le serveur renvoie les métadonnées width, height et videoNoteCompatible ; elles ne sont jamais acceptées comme preuve fournie par le client. Réimportez un ancien fichier non mesuré. Aucune conversion automatique ni URL de fichier externe.

Vérifiez sendVideoNote.available dans les capacités du compte. Ce transport dédié exige sa propre autorisation ; la disponibilité de sendVideo ne suffit pas et aucune route générique ne remplace cet envoi. Sans mediaType, l’envoi du MP4 reste une vidéo classique. Le message sortant conserve kind: sendVideoNote et mediaType: videoNote, tandis que son média reste kind: video.

Après une erreur réseau, conservez exactement le même contenu et requestId. HTTP 202 signifie pris en charge, pas livré. Erreurs : media-video-note-incompatible, runtime-video-note-caption-unsupported et runtime-operation-unavailable. Aucun repli automatique vers un envoi classique.

TELEGRAM · CONVERSATIONS PRIVÉES

Un bot associé, les routes de messages communes.

Le bot est associé par un propriétaire ou administrateur dans le Studio, avec le token BotFather saisi dans un formulaire masqué. Ce secret ne fait pas partie de l’API publique et n’est jamais retourné dans les canaux. Utilisez votre clé BECLEVER pour l’intégration serveur. GET /api/v1/channels retourne les canaux autorisés avec provider: telegram, username, botUsername, status et les capacités réelles text, mediaTypes, incomingMediaDownload et incomingMediaTypes (groupes exclus). Les identifiants commencent par telegram_.

Le correspondant doit déjà avoir envoyé un message privé au bot et être connu du journal BECLEVER. Avec messages:send, utilisez la réponse par conversation ou POST /api/v1/messages avec le canal Telegram, to: tg:123456789, text et une référence requestId stable. Exemple fictif d’une intention d’envoi :

curl --fail-with-body -X POST 'https://beclever.fr/api/v1/messages' \
  -H "Authorization: Bearer $BECLEVER_API_KEY" \
  -H 'Content-Type: application/json' \
  --data '{"channelId":"telegram_00000000000000000000000000000000","to":"tg:123456789","text":"Réponse à votre demande","requestId":"telegram-reponse-exemple-001"}'

Pour les bots Telegram : texte privé de 4 096 caractères maximum et fichiers privés selon les types annoncés. Utilisez mediaId et une légende facultative de 1 024 unités UTF-16 maximum, sauf pour les vocaux sans légende. Aucun groupe ni linkPreview. Aucun aperçu automatique de lien. Les opérations WAHA, le rapprochement PN/LID et les statuts WhatsApp ne s’appliquent pas aux bots. Le catalogue WhatsApp ne prouve aucune capacité Telegram.

Les routes de conversations et d’historique gardent leurs scopes et leurs curseurs : conversations:read ou messages:read selon la route. La conversation et l’historique global indiquent provider. Les messages du détail héritent du contexte de leur conversation. Seuls les événements reçus et conservés par BECLEVER sont disponibles ; aucun import de tout le passé Telegram. HTTP 202 signifie pris en charge, sans preuve de lecture. Après une réponse incertaine, conservez le contenu et la même référence ; ne créez pas un second envoi.

Un destinataire non connu est refusé avec runtime-telegram-recipient-unknown. Un message trop long produit runtime-telegram-text-too-long. La publication d’un parcours avec média non compatible, URL externe ou aperçu de lien produit runtime-telegram-flow-unsupported. Les contrôles tenant, rôles, bot connecté, suspension, STOP et révocation restent appliqués. Tutoriel d’association du bot ↗

Réactions du bot sur un message privé

Un message connu, reçu ou envoyé par un bot privé, peut exposer reactionAllowed, reactionRevision (révision opaque), reactionState: "idle" | "sending" | "sent" | "unknown", reactionEmoji et reactedAt. Vérifiez reactionAllowed: true et les capacités du canal reactions: true / reactionEmojis. Les emojis autorisés sont exactement 👍, ❤, 🔥, 👏, 😁 et 🎉 ; aucune variante ni réaction personnalisée.

POST /api/v1/conversations/{conversationId}/messages/{messageId}/reaction exige les scopes cumulés conversations:read et messages:send. Corps : {"emoji":"👍","expectedRevision":"revision-opaque-du-dto","requestId":"reaction-exemple-001"}. Une chaîne vide emoji: "" retire la réaction du bot. Une seule réaction du bot est conservée par message ; les albums sont exclus entièrement, y compris le premier message. Comptes personnels, WhatsApp, messages inconnus, protégés, éphémères ou supprimés restent exclus.

Réponse : {reaction:{id,state,reused},message}. reactionEmoji vaut null avant la première confirmation, un emoji après application confirmée et "" après retrait confirmé ; il représente seulement la dernière réaction confirmée de ce bot, pas les réactions ou leur nombre chez les autres participants. sent confirme l’acceptation fournisseur, sans preuve de lecture. En cas de perte de réponse, relisez le message par GET ; ne créez pas une nouvelle intention pour contourner l’incertitude. Réactions et éditions sont mutuellement bloquées sur un message en état sending ou unknown. Aucune reprise automatique ni relecture fournisseur implicite ; les changements réalisés hors de BECLEVER peuvent ne pas être connus.

Modifier le texte ou la légende envoyés par un bot

Pour un message sortant confirmé, envoyé via BECLEVER par un bot privé, les DTO peuvent fournir editKind: "text" | "caption" | null, editRevision (révision opaque), editState: "idle" | "sending" | "sent" | "unknown" et editedAt. Vérifiez aussi les capacités du canal editText et editCaption. Une capacité du canal seule ne rend pas tous les messages modifiables.

Utilisez POST /api/v1/conversations/{conversationId}/messages/{messageId}/edit avec les scopes cumulés conversations:read et messages:send. Le corps contient soit text (non vide, 4 096 unités UTF-16 maximum), soit caption (1 024 maximum, chaîne vide pour supprimer), ainsi que expectedRevision copié du DTO courant et requestId stable. Exemple fictif : {"text":"Texte corrigé","expectedRevision":"revision-opaque-du-dto","requestId":"correction-exemple-001"}. Les fichiers eux-mêmes, vocaux, comptes personnels, WhatsApp et messages reçus ne sont pas modifiables.

La réponse contient {edit:{id,state,reused},message}. L’état sent confirme l’édition acceptée par Telegram, sans preuve de lecture. Après une réponse réseau perdue, relisez le message puis reprenez uniquement la même demande et le même contenu si nécessaire. Aucun renvoi automatique ; unknown bloque les modifications suivantes et exige une vérification humaine dans Telegram. Une révision périmée provoque un conflit ; ne remplacez pas aveuglément le contenu. Le journal BECLEVER ne garantit pas la connaissance de toutes les modifications ou suppressions réalisées hors de la plateforme.

Fichiers des comptes Telegram personnels et bots privés. Le Studio et les routes communes POST /api/v1/messages ou POST /api/v1/conversations/{id}/reply permettent une réponse manuelle avec une image JPEG/PNG, un PDF, un vocal Ogg/Opus mono ou une vidéo MP4 H.264 privés lorsque le compte connecté annonce ces formats dans capabilities.mediaTypes. Le droit messages:send reste requis. Fournissez mediaId, une caption facultative et votre référence d’idempotence selon le contrat de la route ; ce fichier doit déjà appartenir à votre bibliothèque privée. Limites : 8 Mio par fichier ; photos envoyées par un bot : somme largeur + hauteur de 10 000 pixels maximum et rapport entre les côtés de 20 maximum ; vocal Ogg/Opus mono de 20 minutes maximum sans légende ; vidéo MP4 H.264 de 60 minutes maximum avec une seule piste vidéo et, facultativement, une seule piste audio AAC-LC, sans autre type de piste. Les images, PDF et vidéos acceptent une légende de 1 024 unités UTF-16 maximum. Musique, animations et notes vidéo rondes ne sont pas prises en charge. Le fichier est référencé par son mediaId dans votre organisation ; aucune URL de média externe n’est acceptée par ce parcours. Les bots compatibles acceptent aussi les fichiers privés dans leurs blocs Média. Les comptes personnels restent manuels, sans IA ni scénario. Une capacité absente ou une conversation en lecture seule bloque l’envoi. La récupération de fichiers reçus suit une capacité distincte, décrite ci-dessous.

Pièces jointes reçues sur un compte personnel ou un bot privé. Vérifiez capabilities.incomingMediaDownload et les types image, document, audio et video annoncés dans capabilities.incomingMediaTypes. Le message annonce séparément media.downloadAvailable ; une capacité du compte ne suffit pas à rendre tous les fichiers téléchargeables. Seuls JPEG/PNG, PDF, vocaux Ogg/Opus mono (20 minutes maximum) et vidéos MP4 H.264 (60 minutes maximum, audio AAC-LC facultatif), de taille connue et vérifiée de 8 Mio maximum, sont proposés. Le décodeur vérifie ces contraintes au moment de l’import explicite ; aucun fichier n’est téléchargé automatiquement. Aucun identifiant de fichier du fournisseur ni URL de téléchargement externe n’est exposé.

L’import explicite utilise POST /api/v1/conversations/{conversationId}/messages/{messageId}/media avec les identifiants internes BECLEVER et un corps vide {}. Les droits media:write et conversations:read restent requis. Il retourne {media} après validation dans le stockage privé de l’organisation ; le message expose ensuite le média privé associé. Une lecture seule du compte n’autorise pas l’envoi, mais peut permettre cet import contrôlé. La lecture du journal et la réception des métadonnées ne déclenchent pas ce téléchargement. Un média entrant dans un bot passe en reprise humaine, même avec une légende, sans IA ni progression du parcours ; les messages texte gardent leur fonctionnement. Aucun envoi, IA ou scénario n’est lancé. Groupes de bots, messages protégés ou éphémères, musique, animations, notes vidéo rondes et autres formats restent exclus ; les contrôles de droits, révocation, intégrité, taille et quotas s’appliquent avant la conservation du fichier.