Documentation de l’API

Reformulation, correction grammaticale, résumés, traduction et détection de plagiat en 56 langues. Une API REST simple, servie depuis le réseau périphérique de Cloudflare.

Même origine
L’API ne répond pour l’instant qu’aux requêtes émises par adeptwrite.com lui-même (aucun en-tête CORS). Un accès externe par clés d’API est prévu avec le forfait Pro. Cette documentation est publiée en avance pour que le contrat soit ouvert et que vous puissiez vous y préparer.
En bref

L’API v1 d’AdeptWrite comporte trois points d’accès actifs. POST /api/v1/run prend un JSON avec task, mode, lang et text (6 000 caractères au maximum) et renvoie un texte brut produit par un modèle Cloudflare Workers AI choisi selon la langue ; POST /api/v1/plagiarism compare un texte à des sources ouvertes et liste chaque source interrogée ; GET /api/v1/health renvoie l’état du service. Les textes ne sont ni enregistrés ni journalisés, et les requêtes d’IA sont limitées à 30 par minute et par adresse IP.

L’essentiel

  • URL de base : https://adeptwrite.com/api/v1
  • Format : requêtes et réponses en JSON (Content-Type: application/json, UTF-8).
  • Authentification : aucune pour l’instant ; les requêtes doivent provenir de pages d’adeptwrite.com (même origine). Les clés d’API arriveront avec le forfait Pro.
  • Confidentialité : le champ text n’est jamais enregistré ni journalisé ; les réponses portent l’en-tête Cache-Control: no-store.
  • Versions : le chemin /v1/ ne changera pas de façon incompatible ; les changements majeurs passeront par /v2/.

POST/api/v1/run

Exécute une tâche d’IA sur un texte et renvoie le résultat en texte brut (sans préambule, sans bloc de code Markdown).

Requête

FieldTypeRequiredNotes
taskstring✓Nom de la tâche ; voir la liste des tâches ci-dessous.
textstring✓Texte à traiter, de 1 à 6 000 caractères.
langstring✓Langue du résultat : l’un des 56 codes de langue du site (fr, en, id, ja, pt-pt, zh-hant… ; les étiquettes BCP 47 comme pt-BR sont converties) ou auto pour « la même langue que le texte saisi ».
modestring—Un mode disponible pour cet outil, par exemple Formal, Akademik, Ringkas, Poin-poin (les noms de modes sont les libellés indonésiens du registre). Ignoré pour les tâches sans mode.
optionsobject—Options propres à la tâche : from / to pour translate (n’importe quelle langue prise en charge vers n’importe quelle autre ; from peut valoir auto ; sr-Cyrl demande du serbe en cyrillique), platform (instagram / tiktok / linkedin) pour caption, et des fields étiquetés facultatifs pour bio, coverletter et meta. Les autres clés sont ignorées.
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "fr",
  "text": "Bien écrire compte beaucoup pour les étudiants.",
  "options": {}
}

Réponse

Statut 200 avec ok: true, le résultat dans output, le modèle qui a réellement répondu dans model (il diffère quand un modèle de secours a pris le relais) et la durée de traitement en millisecondes. truncated: true s’ajoute lorsque la réponse a atteint sa limite de longueur ou le délai maximal et a été coupée.

{
  "ok": true,
  "output": "La qualité de l’écriture est essentielle pour les étudiants.",
  "model": "@cf/qwen/qwen3-30b-a3b-fp8",
  "ms": 812
}

Exemple: curl

curl -X POST https://adeptwrite.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{"task":"grammar","lang":"fr","text":"Ils sont aller a la bibliotèque demain."}'

Exemple: JavaScript (fetch)

const res = await fetch('/api/v1/run', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ task: 'summarize', mode: 'Poin-poin', lang: 'fr', text }),
});
const data = await res.json();
if (!data.ok) throw new Error(data.error.code + ': ' + data.error.message);
console.log(data.output);

POST/api/v1/plagiarism

Choisit 4 à 8 expressions caractéristiques du texte, les recherche dans des sources ouvertes dans la langue du texte (Wikipédia, Wikisource, texte intégral d’Internet Archive, Europe PMC, DOAJ, arXiv ; un moteur de recherche web seulement s’il est configuré et demandé) et note le recouvrement. Seules ces courtes expressions quittent le serveur.

Requête

FieldTypeRequiredNotes
textstring✓Au moins 30 mots, au plus 6 000 caractères.
langstring✓Un code de langue du site ou auto.
optionsobject—web: true interroge aussi le moteur de recherche web lorsque l’exploitant en a configuré un ; webSearched dans la réponse indique s’il a réellement répondu.
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

{ "text": "…au moins 30 mots…", "lang": "fr", "options": { "web": false } }

Réponse

Statut 200 avec score (mots concordants ÷ mots, de 0 à 1), matches par source avec des passages surlignés (positions en caractères dans votre texte), sourcesSearched (exactement les sources dont les réponses figurent dans le résultat), sourcesSkipped avec un motif, et webSearched.

{
  "ok": true,
  "score": 0.42,
  "words": 52,
  "matchedWords": 22,
  "matches": [{ "source": "wikipedia", "title": "…", "url": "https://fr.wikipedia.org/wiki/…",
                "matchedWords": 22, "passages": [{ "start": 0, "end": 131, "text": "…" }] }],
  "sourcesSearched": ["wikipedia", "wikisource", "internet-archive-fts", "europepmc", "doaj"],
  "sourcesSkipped": [],
  "webSearched": false,
  "ms": 2310
}

Exemple: curl

curl -X POST https://adeptwrite.com/api/v1/plagiarism \
  -H "Content-Type: application/json" \
  -d '{"lang":"fr","text":"…au moins 30 mots…"}'

GET/api/v1/health

Indique quels services sont activés. Ne prend aucun corps de requête et ne compte pas dans le quota.

Réponse

Statut 200. ai vaut false tant que l’interrupteur d’arrêt de l’IA est actif ; plagiarism liste les sources que le détecteur peut interroger ; aidetect décrit l’analyse approfondie côté serveur du détecteur IA, qui n’est pas encore déployée (POST /api/v1/aidetect répond 503 disabled ; le détecteur du site s’exécute dans votre navigateur).

{
  "ok": true,
  "ai": true,
  "plagiarism": { "enabled": true, "sources": ["wikipedia", "wikisource", "internet-archive-fts", "europepmc", "doaj", "arxiv"], "web": false },
  "aidetect": { "enabled": false, "judge": false }
}

Exemple: curl

curl https://adeptwrite.com/api/v1/health

Task list

taskWhat it does
paraphraseReformulation ; modes : Standar, Formal, Santai (décontracté), Akademik, Kreatif, Ringkas (concis), Panjangkan (développé).
grammarCorrection de l’orthographe et de la grammaire (orthographe traditionnelle ou rectifiée de 1990 admise en français).
toneChangement de ton ; modes : Formal, Kantor (professionnel), Santai (décontracté).
rewriteCorrection des phrases lourdes ou maladroites ; modes : Standar, Formal.
resizeRaccourcir ou allonger des phrases ; modes : Ringkas (raccourcir), Panjangkan (allonger).
essayConstruction de paragraphes ou d’une dissertation à partir de notes ; modes : Akademik, Kreatif, Panjangkan.
summarizeRésumé ; modes : Poin-poin (liste à puces), Paragraf (paragraphe), Satu kalimat (une phrase).
translateTraduction entre deux langues prises en charge ; options.from (ou auto) et options.to ; modes : Alami (naturel, par défaut), Formal, Santai (décontracté).
thesisIdées de titres de mémoire et plan par chapitres.
abstractAbstract structuré à partir d’un résumé de recherche.
captionLégendes pour les réseaux sociaux ; options.platform : instagram, tiktok, linkedin.
emailMails et lettres ; modes : Lamaran kerja (candidature), Surat resmi (lettre formelle), Follow-up (relance).
headlineTitres d’articles et accroches ; modes : Kreatif, Ringkas.
productDescriptions de produits ; modes : Marketplace, Toko online (boutique en ligne).
synonymListe de synonymes pour un mot ou une expression.
humanizeRendre plus naturel un texte raide ou générique ; modes : Alami (naturel), Pribadi (personnel), Profesional.
metaTrois couples titre et meta description ; modes : Artikel, Produk, Halaman (toute page web).
hashtagUne ligne de hashtags ; modes : Instagram, TikTok, LinkedIn, X.
bioTrois bios de profil ; modes : Instagram, LinkedIn, X, TikTok.
outlinePlan numéroté avec sous-points ; modes : Artikel (article), Esai (dissertation), Skripsi (mémoire), Presentasi (exposé).
sloganDix idées de slogans ; modes : Merek (marque), Kampanye (campagne), Produk (produit).
paragraphUn paragraphe à partir d’un sujet ; modes : Pembuka (introduction), Isi (développement), Penutup (conclusion).
coverletterBrouillon de lettre de motivation ; modes : Fresh graduate (jeune diplômé), Berpengalaman (expérimenté), Magang (stage).
poemCourts poèmes ; modes : Bebas (vers libres), Berima (rimé), Akrostik (acrostiche), Haiku (haïku).

Limites

Longueur du texte
6 000 caractères au maximum par requête (413 too_long au-delà).
Par adresse IP
30 requêtes par minute.
Global
100 requêtes par minute pour l’ensemble du service, plus un plafond quotidien pour les fonctions d’IA.
Plagiat
5 analyses par minute et par adresse IP et 60 par minute pour l’ensemble du service ; 30 mots au minimum.
Sortie
Un budget de longueur par tâche, jamais plus de 2 048 jetons ; une réponse coupée porte truncated: true.
Modèle
Choisi selon la langue : l’anglais et l’indonésien passent par @cf/aisingapore/gemma-sea-lion-v4-27b-it, toutes les autres langues, dont le français, par @cf/qwen/qwen3-30b-a3b-fp8. Lorsqu’un modèle est occupé, limité, lent ou en échec, la requête passe au modèle suivant de la chaîne (Qwen3-30B, puis @cf/google/gemma-4-26b-a4b-it, puis @cf/meta/llama-3.3-70b-instruct-fp8-fast). Le champ model nomme toujours le modèle qui a répondu.

Codes d’erreur

StatutCodeQuand cela se produit
400invalid_requestJSON invalide, champ obligatoire manquant, ou task ou lang inconnu.
413too_longtext dépasse 6 000 caractères.
403forbiddenLa requête ne provient pas d’une page d’adeptwrite.com.
429rate_limitedLa limite par minute, par adresse IP ou globale, a été dépassée. Attendez le nombre de secondes indiqué dans Retry-After.
429quota_exceededLe plafond quotidien des fonctions d’IA est atteint. Réessayez le lendemain (UTC).
502upstreamAucun modèle de la chaîne n’a répondu à temps.
502empty_outputLes modèles ont répondu, mais avec un résultat vide.
503disabledLe service a été coupé temporairement par l’exploitant, ou (pour /api/v1/aidetect) n’est pas encore déployé.

Format des erreurs

Chaque erreur est renvoyée en JSON avec le code de statut HTTP correspondant et la même structure :

{ "ok": false, "error": { "code": "rate_limited", "message": "Too many requests. Please try again shortly." } }

Vérifiez d’abord ok, puis lisez error.code pour le traitement automatique ; error.message peut être affiché sans risque aux utilisateurs.

Bonnes pratiques

  • Envoyez le texte par morceaux (par exemple par paragraphe) plutôt qu’en un seul long document : les résultats reviennent plus vite et se relisent plus facilement.
  • Traitez les réponses 429 par un délai exponentiel, non par des nouvelles tentatives immédiates.
  • N’envoyez pas de données personnelles ou confidentielles dont vous n’avez pas besoin : même si nous ne les enregistrons pas, la minimisation des données reste de mise.
  • Les résultats de l’IA peuvent être faux : présentez-les comme une suggestion à relire, jamais comme une vérité définitive.

Questions fréquentes

Puis-je appeler l’API depuis ma propre application ou mon propre domaine ?

Pas encore. Le Worker n’envoie aucun en-tête CORS et ne répond qu’aux pages d’adeptwrite.com. Un accès externe par clés d’API est prévu avec le forfait Pro ; cette documentation sera mise à jour dès qu’il sera disponible.

Le texte envoyé à l’API est-il enregistré ?

Non. Le texte est transmis au modèle pour produire la réponse, puis jeté. Les journaux ne contiennent que des métadonnées (code de statut, tâche, durée). Les détails figurent dans la politique de confidentialité.

Pourquoi la sortie est-elle du texte brut et non du JSON structuré ?

Chaque tâche produit un texte prêt à l’emploi, sans préambule ni bloc de code Markdown, afin de pouvoir l’afficher directement dans l’éditeur. Une structure supplémentaire (par exemple une liste des modifications) est prévue dans une version ultérieure, sans changer la v1.

Combien coûte l’API ?

Depuis adeptwrite.com, elle est gratuite, limitée à 30 requêtes d’IA par minute et par adresse IP. Les tarifs de l’accès externe seront annoncés avec le forfait Pro ; rien n’est facturé d’ici là.

Quel modèle répond à ma requête ?

Cela dépend de la langue : l’anglais et l’indonésien vont vers SEA-LION, les autres langues, dont le français, vers Qwen3-30B. Si ce modèle est occupé ou échoue, le modèle suivant de la chaîne de secours répond à sa place, et le champ model de la réponse nomme celui qui l’a fait.