L'API de WisyLink crée et modifie des sites web hébergés depuis votre code. Téléversez des fichiers de référence, envoyez un message en langage courant à POST /chat : l'agent construit et héberge un site à sa propre adresse wisylink.com. Un nouveau message avec le même identifiant le modifie. L'API puise dans le quota de 5 heures et hebdomadaire de votre forfait.
- Une poignée de points de terminaison REST couvre tout le cycle de vie : téléverser des fichiers, créer ou poursuivre un site avec
POST /chat, suivre son statut, lister et supprimer des sites. POST /chats'adresse à Wisy, le même assistant que dans l'application : la réponse peut donc être une question au lieu d'une génération. Vérifiezstatusavant de lancer le polling.- Les clés API se créent sur le web, et chacune porte son propre plafond de dépenses, jusqu'à 10 $ par jour, par semaine ou par mois, en plus des fenêtres de votre forfait.
- Le paquet npm
@wisylink/cliregroupe les mêmes points de terminaison dans un outil en ligne de commande et un client Node. - Les domaines personnalisés et les clés de services (Stripe, e-mail) se configurent dans l'application web ou mobile ; l'API publique ne les couvre pas.
Ce que vous pouvez automatiser
L'API, c'est le chat sans la fenêtre de chat. Chaque POST /chat est un message adressé à Wisy ; quand la demande est claire, un agent IA écrit une application web rendue côté serveur et la déploie sur https://<id>.wisylink.com, avec données enregistrées, comptes ou téléversement de fichiers quand le brief le demande. Il n'existe aucun paramètre de modèle, de thème ou de type de page. Tout ce qui concerne le site, des sections aux textes en passant par les fonctionnalités et le style, se trouve dans le message, exactement comme une personne le décrirait. (Pour les notions de base, lisez ce qu'est un créateur d'applications IA.)
L'URL de base est https://api.wisylink.com. Authentifiez-vous avec un en-tête x-api-key: <key> ou Authorization: Bearer <key>. Les points de terminaison JSON attendent Content-Type: application/json, et les horodatages sont exprimés en millisecondes depuis l'époque Unix.
| Point de terminaison | Méthode | Rôle | Champs clés |
|---|---|---|---|
/files | POST | Démarrer le téléversement d'un fichier | name en entrée, id en sortie |
/files/chunks | POST | Envoyer les octets du fichier, 4 Mo maximum par requête | id, et last=true sur le dernier morceau ; corps binaire brut |
/files/:id | GET | Lire les métadonnées d'un fichier | content_type, name, size |
/files/:id | DELETE | Supprimer un fichier | Retiré aussi des file_ids de tous les liens |
/chat | POST | Créer un site (sans id) ou en poursuivre un (avec id) | message, jusqu'à 10 file_ids ; renvoie id, url, status, answer |
/links | GET | Lister vos sites, du plus récent au plus ancien | page, limit (de 1 à 100) ; items, total_pages, has_next |
/links/:id | GET | Lire un site | status, url, file_ids |
/links/:id | DELETE | Supprimer un site et ses fichiers de référence | Renvoie {"ok": true} |
Ce que l'API publique ne fait pas : renseigner les clés dont un site a besoin pour les paiements ou l'e-mail (le propriétaire les colle dans Intégrations), associer un domaine personnalisé, lire ou écrire les données enregistrées d'un site, ou exporter le code source.
Créer une clé API et plafonner ses dépenses
- Connectez-vous sur wisylink.com. Les clés se créent uniquement sur le web, pas dans les applications mobiles.
- Ouvrez Clés API dans les paramètres de votre compte et choisissez Générer une clé.
- Nommez-la d'après l'endroit où elle servira, par exemple « acme-landing-pages-ci », pour savoir ce qui cessera de fonctionner le jour où vous la révoquerez.
- Choisissez la fenêtre et le plafond. Optez pour une fenêtre quotidienne, hebdomadaire ou mensuelle et une limite de dépenses en dollars US, jusqu'à 10 $ par fenêtre. Les fenêtres suivent une journée UTC, une semaine commençant le lundi ou un mois.
- Copiez la clé immédiatement. Elle ne s'affiche qu'une fois. Rangez-la dans votre gestionnaire de secrets ou dans les secrets de votre CI, par exemple sous le nom
WISYLINK_API_KEY.
Ce plafond est un garde-fou, pas votre forfait. Chaque requête puise aussi dans les fenêtres glissantes de 5 heures et hebdomadaire de votre compte, les mêmes que pour le chat sur le web et sur mobile, au prorata du travail d'IA qu'elle déclenche, lecture de vos fichiers de référence comprise. Le plafond est contrôlé avant chaque requête et la dépense enregistrée après : la dernière requête d'une fenêtre peut donc le dépasser légèrement. Révoquer une clé la supprime aussitôt, et tout ce qui l'utilise encore reçoit une erreur 401.
Peut-on utiliser l'API avec le forfait gratuit ? Oui. Avec Community, les règles sont les mêmes que dans l'application : une génération par fenêtre de 5 heures, et des sites qui restent en ligne 30 jours, plus une semaine pendant laquelle ils sont marqués pour suppression. C'est suffisant pour prototyper une intégration ; pour des projets clients ou des traitements par lots, un forfait payant vous donne plus de quota, des générations en parallèle et des liens qui restent en ligne tant que vous êtes abonné.
Téléverser des fichiers de référence (envoi fractionné)
Un fichier de référence, c'est tout ce que l'agent doit lire ou placer sur le site : une charte graphique, un logo, des photos de produits, une grille tarifaire. Les formats acceptés sont JPEG, PNG, WebP, GIF, HEIC, SVG, MP3, MP4, PDF, XLSX, DOCX, CSV, TXT, JSON et HTML, jusqu'à 25 Mo chacun. Le type réel est détecté à partir des octets, et les fichiers vides sont refusés.
Le téléversement se fait en deux appels. Créez d'abord le fichier et conservez l'id renvoyé :
curl -s -X POST https://api.wisylink.com/files -H "x-api-key: $WISYLINK_API_KEY" -H "Content-Type: application/json" -d '{"name":"charte-graphique.pdf"}'
Envoyez ensuite les octets. Un fichier de 4 Mo ou moins part en une seule requête avec last=true :
curl -s -X POST "https://api.wisylink.com/files/chunks?id=$FILE_ID&last=true" -H "x-api-key: $WISYLINK_API_KEY" -H "Content-Type: application/octet-stream" --data-binary @charte-graphique.pdf
Pour les fichiers plus lourds, découpez-les (split -b 4m charte-graphique.pdf part_), envoyez les morceaux dans l'ordre vers le même id, et n'ajoutez last=true qu'au dernier ; c'est cet appel qui finalise et traite le fichier. Un téléversement doit se terminer en 15 minutes, faute de quoi la session expire. En Node, le client présenté plus bas fait le découpage pour vous.
Créer un site avec POST /chat et attendre l'URL en ligne
Envoyer le brief
Omettez id pour démarrer un nouveau site. Le message peut compter jusqu'à 5 000 caractères, de quoi rédiger un vrai brief : objectif, public, sections, vrais textes, fonctionnalités, style et langue. Terminez-le par « pour le reste, choisissez des valeurs par défaut raisonnables » : une génération dès le premier appel devient alors plus probable. Remplacez FILE_ID par l'identifiant obtenu lors du téléversement.
curl -s -X POST https://api.wisylink.com/chat -H "x-api-key: $WISYLINK_API_KEY" -H "Content-Type: application/json" -d '{"message":"Créez un site vitrine d’une page pour Braise, torréfacteur de cafés de spécialité à Lyon. Sections : accroche, trois cafés d’origine avec leurs prix, formulaire de demande pour les professionnels enregistré dans un espace d’administration, horaires, lien vers le plan. Utilisez la charte graphique jointe pour les couleurs et les polices. Pour le reste, choisissez des valeurs par défaut raisonnables.","file_ids":["FILE_ID"]}'
Le même appel depuis Node avec fetch :
const res = await fetch("https://api.wisylink.com/chat", { method: "POST", headers: { "x-api-key": process.env.WISYLINK_API_KEY, "Content-Type": "application/json" }, body: JSON.stringify({ message: brief, file_ids: [fileId] }) }); let link = await res.json();
Un nouveau site renvoie 201 avec id, url, status, answer, created_at et updated_at. Conservez l'id : c'est lui qui vous permettra de modifier, lire ou supprimer le site plus tard. Traitez-le comme une chaîne opaque, sans chercher à valider son format.
Lire le statut avant d'interroger l'API
Le status de la réponse à POST /chat indique si une génération a réellement démarré :
buildingouqueued- Une génération est en cours ou attend un créneau libre (
queuedne figure pas encore dans la liste de la référence, mais vous pouvez le rencontrer). Lancez le polling. Pour un nouveau site, l'urlaffiche une page « en construction » jusqu'à la fin de la première génération. idlesur un nouveau site- Aucune génération n'a démarré. Wisy a répondu à la place, et
answercontient en général une question courte, par exemple le prestataire de paiement à utiliser. Répondez par un autrePOST /chatportant le mêmeid. completedouabortedjuste après un message de suivi- Sur un site existant, le statut indique le résultat de la dernière génération. S'il n'est pas passé à
building, votre message a reçu une réponse, pas une génération ; lisezanswer.
Interroger l'API jusqu'à la fin de la génération
Il n'y a pas de webhooks : interrogez donc GET /links/:id. Une génération dure des minutes, pas des secondes, si bien qu'un appel toutes les 15 à 30 secondes suffit largement. Considérez tout statut autre que completed, aborted ou idle comme « encore en cours » : votre boucle restera fiable si un nouveau statut intermédiaire apparaît.
const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); while (!["completed", "aborted", "idle"].includes(link.status)) { await sleep(20000); link = await (await fetch(`https://api.wisylink.com/links/${link.id}`, { headers: { "x-api-key": process.env.WISYLINK_API_KEY } })).json(); }
Quand status vaut completed, url est votre site en ligne. aborted signifie que la génération s'est arrêtée avant la fin ; un site déjà en ligne garde sa version précédente, et un nouveau message relance la tentative. Si le site reçoit plus tard un domaine personnalisé, url renvoie ce domaine. Le compte rendu complet de la génération, y compris une éventuelle note indiquant que le site attend des clés Stripe ou e-mail, se trouve dans le chat de ce lien, dans l'application web.
Continuer, lister et supprimer des liens
Pour modifier un site, envoyez uniquement la nouvelle consigne avec son id à la place de LINK_ID ; le serveur conserve l'historique de la conversation, et un site poursuivi répond 200 :
curl -s -X POST https://api.wisylink.com/chat -H "x-api-key: $WISYLINK_API_KEY" -H "Content-Type: application/json" -d '{"id":"LINK_ID","message":"Ajoutez une deuxième adresse : 12 rue Mercière, ouverte tous les jours de 7 h à 15 h."}'
Interrogez l'API de la même façon. Chaque modification est une nouvelle génération ; une génération qui échoue laisse en ligne la dernière version valide, tandis qu'une génération réussie est en ligne dès qu'elle se termine : refaites donc vos vérifications après chaque modification. Attendez qu'une génération soit terminée avant d'envoyer la modification suivante, sauf si le nouveau message corrige la génération en cours.
Pour lister vos sites, parcourez GET /links?page=1&limit=100 page par page jusqu'à ce que has_next vaille false. Pour en retirer un, DELETE /links/:id supprime le site et les fichiers de référence qui lui sont rattachés. Le domaine personnalisé qu'il utilisait reste sur votre compte, prêt pour un autre site.
La CLI et le client Node
Le paquet @wisylink/cli (licence MIT, Node 18.17 ou plus récent) fait correspondre chaque commande à l'un des points de terminaison ci-dessus : c'est le moyen le plus rapide de piloter WisyLink depuis un terminal ou un job de CI.
npm i -g @wisylink/cli, puisexport WISYLINK_API_KEY=..., ou passez--api-keyà chaque commande.wisylink files upload ./charte-graphique.pdftéléverse automatiquement par morceaux de 4 Mo.wisylink chat --message "Créez une landing page pour Braise Café." --file-id FILE_IDcrée un site.wisylink links list --page 1 --limit 50liste vos sites.
Les commandes affichent du JSON : jq permet donc d'en extraire l'id ou l'url. --timeout accepte de 1 000 à 120 000 millisecondes ; augmentez-le pour chat, qui attend la réponse de Wisy.
Le même paquet exporte un client Node : import { CreateWisyLinkClient } from "@wisylink/cli"; const client = CreateWisyLinkClient({ apiKey: process.env.WISYLINK_API_KEY }); const file = await client.uploadFile("./charte-graphique.pdf"); const link = await client.chat({ message: brief, fileIds: [file.id] });
Deux remarques de version, valables pour la version npm 0.2.1. D'abord, les commandes et méthodes du client qui prennent un identifiant de lien (chat --link-id, links get, links delete, ainsi que linkId, getLink et deleteLink en Node) valident les identifiants selon un ancien format et refusent les identifiants actuels : poursuivez, lisez et supprimez donc vos sites en HTTP, comme montré plus haut. Ensuite, la documentation de la CLI (en anglais) décrit déjà une version plus récente, avec connexion par le navigateur (wisylink login), un chat interactif qui affiche la progression de la génération et une option --json ; lancez wisylink --version pour savoir laquelle vous avez.
Limites, erreurs et bonnes pratiques
Les erreurs sont renvoyées en JSON avec un code error. Celles qui méritent un traitement explicite :
429 limit_reached- La fenêtre de 5 heures ou la fenêtre hebdomadaire de votre forfait est épuisée (
reasonvaut5h_limitouweekly_limit). Programmez la nouvelle tentative pourreset_at, en millisecondes depuis l'époque Unix, au lieu de réessayer en boucle. 429 credit_limit_exceeded- Cette clé a atteint son propre plafond de dépenses. Cela peut arriver sur n'importe quel point de terminaison ; attendez
resets_atou relevez le plafond (jusqu'à 10 $) sur le web. 429 build_concurrency_limit- Trop de générations tournent en même temps pour votre forfait. Attendez qu'une génération se termine avant d'envoyer la suivante.
429 rate_limited- Trop de requêtes en peu de temps. Espacez vos appels, puis réessayez.
400 bad_request- JSON invalide, message vide ou de plus de 5 000 caractères, ou identifiants de fichiers inexistants (listés dans
missing_file_ids). Attention : seuls les 10 premiersfile_idssont utilisés, et les suivants sont ignorés sans erreur. 401,404,500 chat_unavailable- Clé absente ou révoquée ; lien ou fichier qui ne vous appartient pas ; Wisy momentanément indisponible, ce qui justifie une nouvelle tentative après une pause.
Quelques habitudes qui évitent dépenses inutiles et confusion :
- Gardez les clés côté serveur. Ne livrez jamais une clé dans du code exécuté par un navigateur ou une application. Utilisez une clé par client ou par pipeline : chacune a son propre plafond et peut être révoquée seule.
- Ne relancez pas
POST /chatà l'aveugle. L'appel n'est pas idempotent : une requête qui a expiré de votre côté peut tout de même avoir créé un site ou lancé une génération. ConsultezGET /links(les plus récents en premier) avant de renvoyer, et donnez à l'appel un délai d'expiration côté client d'au moins une minute. - Mettez les traitements par lots en file d'attente. Lancez autant de générations simultanées que votre forfait le permet et traitez
build_concurrency_limitcomme un signal d'attente. - Relisez avant de livrer. Le travail de l'IA peut contenir des erreurs. Ouvrez chaque site, testez ses formulaires et relisez ses textes avant qu'un client ou le public ne les voie ; les conditions d'utilisation de WisyLink font de la relecture et des tests votre responsabilité.
Cas d'usage : agences, mini-sites d'événement, outils internes
Landing pages d'agence. Gardez un modèle de brief avec des emplacements pour le nom du client, son offre, les sections et le ton, remplissez-le depuis votre CRM, et joignez le logo et la charte graphique du client en fichiers. Chaque campagne devient son propre site, les retours du client deviennent des messages de suivi, et une clé par client permet de séparer les dépenses. Une fois la page validée, connectez le domaine du client dans Domaines, sur n'importe quel forfait ; un forfait payant garde le site en ligne au-delà des 30 jours gratuits. Un exemple détaillé de ce type de page se trouve dans notre guide pour créer une landing page de liste d'attente avec l'IA.
Mini-sites par événement. Une ligne par événement dans un tableur (nom, date, lieu, jauge) devient un site d'inscription par événement, créé par un script qui enregistre chaque id renvoyé à côté de sa ligne. Le guide pour créer une page d'inscription à un événement avec l'IA indique quoi mettre dans chaque brief. Après l'événement, supprimez le site ou gardez-le en archive avec un forfait payant.
Automatisations internes. Un script peut créer la première version d'un outil interne, comme un suivi de stock ou un tableau de validations. Pour mettre à jour les données, en revanche, ne relancez pas de génération : demandez à Wisy d'ajouter un point de terminaison auquel vos systèmes envoient des fiches, protégé par un secret que vous définissez dans Intégrations. Les fiches écrites ainsi sont visibles par les visiteurs en une minute environ, sans consommer de génération. Ce schéma est détaillé dans notre article sur la création d'outils internes avec l'IA.
Créez votre clé et votre premier site par le code
Créez un compte gratuit, générez une clé API avec un petit plafond et envoyez votre premier brief avec l'appel curl ci-dessus. Gardez la référence de l'API (en anglais) ouverte pour le détail des champs, et quand l'intégration passe du prototype à la production, choisissez dans la section des forfaits celui dont le quota et les générations en parallèle correspondent à votre volume.
FAQ
