Sur cette page
Premiers pas
Vue d’ensemble
L’API est versionnée dans son chemin, /api/v1. Chaque endpoint accepte un POST avec un corps JSON et répond en JSON, erreurs comprises.
URL de base https://blurwrite.com
- POST /api/v1/detectAnalyser un texte
- POST /api/v1/detect/batchAnalyser plusieurs textes
- POST /api/v1/humanizeHumaniser un texte
- POST /api/v1/paraphraseReformuler un texte
- POST /api/v1/summarizeRésumer un texte
- POST /api/v1/grammarVérifier la grammaire
Uniquement sur le site, pas dans l’API : le compteur de mots, le compteur de caractères, le détecteur de plagiat et l’option « Prendre plus de temps » de l’humaniseur.
Générée à partir du document OpenAPI, cette référence répertorie exactement les routes et les champs acceptés par l’API. Le document OpenAPI
Votre premier appel
Un texte doit contenir au moins 50 mots.
Consultez "calibrated" avant toute chose : si sa valeur est false, la langue ne dispose pas encore d’une courbe ajustée et le score ne doit donc pas être utilisé comme résultat.
Chaque valeur est représentée par son type. Une réponse réelle contient l’analyse de votre texte.
curl -X POST https://blurwrite.com/api/v1/detect \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."}'const res = await fetch('https://blurwrite.com/api/v1/detect', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"figure": "number, de 0 à 100",
"low": "number, de 0 à 100",
"high": "number, de 0 à 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, de 0 à 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}Authentification
Envoyez votre clé dans l’en-tête Authorization comme jeton Bearer. Les clés dans l’URL sont refusées.
Une clé possède des autorisations : detect, rewrite, summarize et grammar. Une route renvoie 403 out_of_scope lorsque la clé ne possède pas l’autorisation requise.
Authorization: Bearer YOUR_API_KEYEndpoints
POST /api/v1/detect
Analyser un texte. L’analyse du détecteur pour un texte : un score de 0 à 100, l’intervalle qui l’entoure, une analyse par phrase et une indication de calibration de la langue.
Autorisation de la clé : detect
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| text | string | oui | Le texte à analyser ou à réécrire. |
| language | string | non | Le code de langue, par exemple "en" ou "de". S’il est omis, la langue est détectée à partir du texte. |
| contentType | string | non | Le type de texte, par exemple "essay" ou "email", lorsque l’analyse doit utiliser la courbe de ce type de texte. |
Réponse
| Champ | Type | Description |
|---|---|---|
| figure | number | Le score de 0 à 100 : la probabilité que le texte ait été écrit par une IA. |
| low | number | La borne inférieure de l’intervalle autour du score. |
| high | number | La borne supérieure de l’intervalle autour du score. |
| uncertainty | number | La moitié de la largeur de l’intervalle, en points. |
| verdict | string | La tranche dans laquelle se situe le score ; une tranche, jamais une conclusion sur l’auteur du texte. Une valeur parmi : human, uncertain, ai. |
| confidence | string | Le degré de fiabilité de l’analyse. Une valeur parmi : low, medium, high. |
| sentences | tableau de SentenceScore | Une analyse par phrase. |
| words | integer | Les mots analysés. |
| language | string | La langue retenue pour l’analyse du texte. |
| model | string | Le modèle ayant produit l’analyse. |
| calibrated | boolean | Indique si la langue dispose d’une courbe ajustée. Si la valeur est false, le score ne doit pas être utilisé comme résultat. |
| bandHumanFlagRate | number | null | La fréquence à laquelle les textes humains de cette tranche ont été classés comme générés par une IA dans nos mesures, ou null. |
| usage | Usage | Ce que cet appel a comptabilisé. |
Erreurs propres à cette route
| Statut | Code | Signification |
|---|---|---|
| 400 | no_text | Le corps ne contient pas de "text". |
| 422 | too_short | Le texte est plus court que la longueur minimale. |
| 413 | text_too_long | Le texte dépasse la longueur que le moteur peut analyser en un appel. Divisez-le. Aucun mot n’a été comptabilisé. |
| 422 | not_calibrated | Cette langue ne peut pas encore être analysée. |
| 503 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
| 502 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
| 503 | engine_starting | Le moteur démarre et n’était pas prêt à temps. Aucun mot n’a été comptabilisé. Réessayez dans une minute. |
| 503 | engine_busy | Le moteur était occupé et l’analyse n’a pas pu démarrer à temps ; les analyses Pro du site sont prioritaires sur les appels API. Aucun mot n’a été comptabilisé. Réessayez dans un instant. |
| 504 | engine_timeout | Le moteur n’a pas terminé l’analyse du texte à temps. Aucun mot n’a été comptabilisé. Réessayez ou envoyez un texte plus court. |
| 429 | concurrency_limited | Cette clé a déjà atteint le nombre maximal d’appels simultanés de ce type. Attendez qu’un appel se termine ou que le délai indiqué dans Retry-After soit écoulé. |
curl -X POST https://blurwrite.com/api/v1/detect \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."}'const res = await fetch('https://blurwrite.com/api/v1/detect', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"figure": "number, de 0 à 100",
"low": "number, de 0 à 100",
"high": "number, de 0 à 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, de 0 à 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/detect/batch
Analyser plusieurs textes. Envoyez plusieurs textes en un appel, dans la limite autorisée par lot. L’appel nécessite au préalable un quota suffisant pour les mots de chaque texte analysable (50 mots ou plus) ; les mots des textes sans résultat sont restitués ensuite. L’échec d’un texte ne fait jamais échouer le lot.
Autorisation de la clé : detect
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| items | tableau de object | oui | Les textes, chacun avec son propre "text" et, facultativement, "id", "language" et "contentType". |
| items[].id | string | non | Votre identifiant pour l’élément, renvoyé avec son résultat. S’il est omis, la position de l’élément est utilisée. |
| items[].text | string | oui | Le texte à analyser ou à réécrire. |
| items[].language | string | non | Le code de langue, par exemple "en" ou "de". S’il est omis, la langue est détectée à partir du texte. |
| items[].contentType | string | non | Le type de texte, par exemple "essay" ou "email", lorsque l’analyse doit utiliser la courbe de ce type de texte. |
Réponse
| Champ | Type | Description |
|---|---|---|
| results | tableau de BatchResult | Un résultat par élément, dans l’ordre d’envoi. |
| usage | Usage | Ce que cet appel a comptabilisé. |
Erreurs propres à cette route
| Statut | Code | Signification |
|---|---|---|
| 400 | batch_empty | Le corps ne contient pas de "items", ou la liste est vide. |
| 413 | batch_too_large | Le lot contient plus d’éléments que la limite autorisée. |
| 429 | concurrency_limited | Cette clé a déjà atteint le nombre maximal d’appels simultanés de ce type. Attendez qu’un appel se termine ou que le délai indiqué dans Retry-After soit écoulé. |
curl -X POST https://blurwrite.com/api/v1/detect/batch \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"items":[{"id":"1","text":"Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."},{"id":"2","text":"Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."}]}'const res = await fetch('https://blurwrite.com/api/v1/detect/batch', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"items": [
{
"id": "1",
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."
},
{
"id": "2",
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."
}
]
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect/batch",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"items": [
{
"id": "1",
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment.",
},
{
"id": "2",
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment.",
},
],
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"results": [
{
"id": "string",
"detection": {
"figure": "number, de 0 à 100",
"low": "number, de 0 à 100",
"high": "number, de 0 à 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, de 0 à 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"error": {
"code": "string",
"message": "string"
}
}
],
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/humanize
Humaniser un texte. L’humaniseur avec vérification des faits : chiffres, noms et citations sont conservés, et toute réécriture ayant modifié un fait est corrigée ou signalée. Le mode "custom" (Pro) écrit dans votre propre style, analysé à partir d’un échantillon de votre écriture.
Via l’API, l’humaniseur effectue sa réécriture standard. « Prendre plus de temps » n’existe que sur le site.
Autorisation de la clé : rewrite
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| text | string | oui | Le texte à analyser ou à réécrire. |
| mode | string | non | Le mode de réécriture. Une valeur parmi : natural, formal, simple, academic, creative, shorten, expand, custom. Par défaut : natural. |
| style_sample | string | non | Avec le mode "custom" : un échantillon de votre écriture, de 150 à 2 000 mots, analysé sur le serveur. S’il est omis, l’échantillon enregistré dans votre compte est utilisé. |
| tab | string | non | L’onglet de l’humaniseur : le registre utilisé pour la reformulation. Standard conserve le registre du texte d’origine. Une valeur parmi : standard, academic, professional, casual. Par défaut : standard. |
| strength | string | non | Regular conserve le contenu et le registre. Aggressive peut réorganiser le texte et supprimer des développements, tout en conservant chaque idée principale. Certains passages peuvent sembler inhabituels. Une valeur parmi : regular, aggressive. Par défaut : regular. |
| ownTouch | string | non | Un détail, un exemple ou une opinion dans vos propres mots, jusqu’à 400 caractères, intégré à la reformulation. |
| language | string | non | Le code de langue, par exemple "en" ou "de". S’il est omis, la langue est détectée à partir du texte. |
Réponse
| Champ | Type | Description |
|---|---|---|
| text | string | Le texte réécrit. |
| before | Detection | L’analyse de votre texte par le détecteur, ou null si elle est absente. |
| after | Detection | L’analyse de la réécriture par le détecteur, ou null. |
| passes | integer | Le nombre de réécritures produites avant que celle-ci soit choisie. |
| facts | object | Les résultats des vérifications des faits et, le cas échéant, les raisons pour lesquelles une réécriture n’est pas conforme. |
| late | boolean | True lorsque la réécriture a été renvoyée à l’expiration du délai, sans que ses vérifications soient terminées. |
| usage | Usage | Ce que cet appel a comptabilisé. |
Erreurs propres à cette route
| Statut | Code | Signification |
|---|---|---|
| 400 | no_text | Le corps ne contient pas de "text". |
| 422 | too_short | Le texte est plus court que la longueur minimale. |
| 400 | unknown_mode | Ce mode n’est pas proposé par cette route. |
| 400 | unknown_option | Cet onglet ou ce niveau d’intensité n’est pas proposé par cette route. |
| 402 | plan_required | Le mode, l’onglet, l’intensité ou la touche personnelle nécessite une formule dont le compte ne dispose pas ; le mode "custom" nécessite Pro. Aucun mot n’a été comptabilisé. |
| 400 | no_sample | Le mode "custom" nécessite un échantillon d’écriture, envoyé ou enregistré dans le compte. |
| 400 | sample_too_short | L’échantillon d’écriture est plus court que la longueur minimale. |
| 400 | sample_too_long | L’échantillon d’écriture dépasse la longueur maximale. |
| 429 | concurrency_limited | Cette clé a déjà atteint le nombre maximal d’appels simultanés de ce type. Attendez qu’un appel se termine ou que le délai indiqué dans Retry-After soit écoulé. |
| 422 | no_rewrite | Le moteur a répondu, mais aucun brouillon n’a passé les contrôles (vide, refus ou copie du texte). Aucun mot n’a été comptabilisé. |
| 503 | timeout | La réécriture a pris trop de temps et a été interrompue. Aucun mot n’a été comptabilisé. |
| 503 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
| 502 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
curl -X POST https://blurwrite.com/api/v1/humanize \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."}'const res = await fetch('https://blurwrite.com/api/v1/humanize', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/humanize",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"before": {
"figure": "number, de 0 à 100",
"low": "number, de 0 à 100",
"high": "number, de 0 à 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, de 0 à 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"after": {
"figure": "number, de 0 à 100",
"low": "number, de 0 à 100",
"high": "number, de 0 à 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, de 0 à 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"passes": "integer",
"facts": "object",
"late": "boolean",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/paraphrase
Reformuler un texte. Le reformulateur, avec les mêmes modes que l’outil de reformulation.
Autorisation de la clé : rewrite
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| text | string | oui | Le texte à analyser ou à réécrire. |
| mode | string | non | Le mode de réécriture. Une valeur parmi : standard, fluency, formal, academic, simple, creative, expand, shorten. Par défaut : standard. |
| strength | string | non | Le degré de liberté de la réécriture par rapport à l’original. Une valeur parmi : readable, balanced, strong. Par défaut : balanced. |
| readability | string | non | Le registre de langue à utiliser. Une valeur parmi : casual, professional, academic, creative. Par défaut : professional. |
| purpose | string | non | L’objectif du texte. Une valeur parmi : general, essay, article, email, marketing, report, story. Par défaut : general. |
| synonyms | string | non | Le degré de liberté pour remplacer les mots. Une valeur parmi : few, some, many. Par défaut : some. |
| freezeWords | tableau de string | non | Les mots et expressions à conserver à l’identique : au maximum 25, chacun limité à 60 caractères. Leurs mots sont comptabilisés dans ceux de l’appel. |
| customInstruction | string | non | Votre consigne personnalisée pour la réécriture, limitée à 500 caractères. Ses mots sont comptabilisés dans ceux de l’appel. |
| language | string | non | Le code de langue, par exemple "en" ou "de". S’il est omis, la langue est détectée à partir du texte. |
| closedLoop | boolean | non | Définissez la valeur sur false pour ignorer la boucle de vérification. Par défaut : true. |
Réponse
| Champ | Type | Description |
|---|---|---|
| text | string | Le texte réécrit. |
| before | Detection | L’analyse de votre texte par le détecteur, ou null si elle est absente. |
| after | Detection | L’analyse de la réécriture par le détecteur, ou null. |
| passes | integer | Le nombre de réécritures produites avant que celle-ci soit choisie. |
| facts | object | Les résultats des vérifications des faits et, le cas échéant, les raisons pour lesquelles une réécriture n’est pas conforme. |
| late | boolean | True lorsque la réécriture a été renvoyée à l’expiration du délai, sans que ses vérifications soient terminées. |
| usage | Usage | Ce que cet appel a comptabilisé. |
Erreurs propres à cette route
| Statut | Code | Signification |
|---|---|---|
| 400 | no_text | Le corps ne contient pas de "text". |
| 422 | too_short | Le texte est plus court que la longueur minimale. |
| 400 | unknown_mode | Ce mode n’est pas proposé par cette route. |
| 400 | option_invalid | freezeWords n’est pas une liste de mots ou d’expressions. Rien n’a été décompté. |
| 400 | option_too_long | freezeWords ou customInstruction dépasse sa limite. Rien n’a été décompté. |
| 429 | concurrency_limited | Cette clé a déjà atteint le nombre maximal d’appels simultanés de ce type. Attendez qu’un appel se termine ou que le délai indiqué dans Retry-After soit écoulé. |
| 422 | no_rewrite | Le moteur a répondu, mais aucun brouillon n’a passé les contrôles (vide, refus ou copie du texte). Aucun mot n’a été comptabilisé. |
| 503 | timeout | La réécriture a pris trop de temps et a été interrompue. Aucun mot n’a été comptabilisé. |
| 503 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
| 502 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
curl -X POST https://blurwrite.com/api/v1/paraphrase \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."}'const res = await fetch('https://blurwrite.com/api/v1/paraphrase', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/paraphrase",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"before": {
"figure": "number, de 0 à 100",
"low": "number, de 0 à 100",
"high": "number, de 0 à 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, de 0 à 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"after": {
"figure": "number, de 0 à 100",
"low": "number, de 0 à 100",
"high": "number, de 0 à 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, de 0 à 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"passes": "integer",
"facts": "object",
"late": "boolean",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/summarize
Résumer un texte. L’outil de résumé, sous forme de phrases clés, de paragraphe ou de liste à puces.
Autorisation de la clé : summarize
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| text | string | oui | Le texte à analyser ou à réécrire. |
| mode | string | non | La forme du résumé. Une valeur parmi : key-sentences, paragraph, bullets. Par défaut : key-sentences. |
| length | string | non | La longueur du résumé. Une valeur parmi : short, medium, long. Par défaut : medium. |
Réponse
| Champ | Type | Description |
|---|---|---|
| text | string | Le résumé. |
| usage | Usage | Ce que cet appel a comptabilisé. |
Erreurs propres à cette route
| Statut | Code | Signification |
|---|---|---|
| 400 | no_text | Le corps ne contient pas de "text". |
| 422 | too_short | Le texte est plus court que la longueur minimale. |
| 429 | concurrency_limited | Cette clé a déjà atteint le nombre maximal d’appels simultanés de ce type. Attendez qu’un appel se termine ou que le délai indiqué dans Retry-After soit écoulé. |
| 503 | timeout | La réécriture a pris trop de temps et a été interrompue. Aucun mot n’a été comptabilisé. |
| 503 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
| 502 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
curl -X POST https://blurwrite.com/api/v1/summarize \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."}'const res = await fetch('https://blurwrite.com/api/v1/summarize', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/summarize",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/grammar
Vérifier la grammaire. Les problèmes de grammaire, d’orthographe, de ponctuation et de style, chacun avec sa position dans le texte et les corrections proposées.
Autorisation de la clé : grammar
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| text | string | oui | Le texte à analyser ou à réécrire. |
| language | string | non | Le code de langue pour la vérification, par exemple "en-US" ou "de-DE". Par défaut : en-US. |
Réponse
| Champ | Type | Description |
|---|---|---|
| issues | tableau de GrammarIssue | Les problèmes détectés, dans leur ordre d’apparition. |
| usage | Usage | Ce que cet appel a comptabilisé. |
Erreurs propres à cette route
| Statut | Code | Signification |
|---|---|---|
| 400 | no_text | Le corps ne contient pas de "text". |
| 503 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
| 502 | engine_unavailable | Le moteur n’a pas répondu. Aucun mot n’a été comptabilisé. |
| 503 | engine_starting | Le moteur démarre et n’était pas prêt à temps. Aucun mot n’a été comptabilisé. Réessayez dans une minute. |
| 504 | engine_timeout | Le moteur n’a pas terminé l’analyse du texte à temps. Aucun mot n’a été comptabilisé. Réessayez ou envoyez un texte plus court. |
curl -X POST https://blurwrite.com/api/v1/grammar \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."}'const res = await fetch('https://blurwrite.com/api/v1/grammar', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/grammar",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Le comité s’est réuni mardi pour examiner le projet de la nouvelle bibliothèque. Les membres ont convenu que la salle de lecture devait rester ouverte plus tard en semaine et ont demandé au personnel de préparer un budget pour ces heures supplémentaires. La prochaine réunion portera sur les coûts, le nombre probable de visiteurs et les effets sur le reste du bâtiment.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"issues": [
{
"offset": "integer",
"length": "integer",
"message": "string",
"shortMessage": "string",
"category": "grammar | spelling | punctuation | style | typography",
"replacements": [
"string"
],
"context": "string"
}
],
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}Référence
Erreurs
Une erreur répond avec son statut HTTP et un corps de cette forme. Fiez-vous au code ; le message indique ce qui n’a pas fonctionné et quoi faire ensuite.
Erreurs possibles pour toutes les routes
| Statut | Code | Signification |
|---|---|---|
| 401 | key_in_url | La clé a été envoyée dans l’URL. Envoyez-la dans l’en-tête Authorization. |
| 401 | no_key | Aucune clé n’a été envoyée. |
| 401 | bad_key | La clé est invalide ou a été révoquée. |
| 403 | out_of_scope | La clé ne possède pas l’autorisation requise pour cette route. |
| 429 | rate_limited | Trop de requêtes pour cette clé. Attendez le délai indiqué dans Retry-After. |
| 403 | plan_lapsed | La formule du compte n’inclut plus l’API. |
| 413 | too_large | La requête est trop volumineuse. |
| 400 | bad_body | Le corps n’est pas un objet JSON. |
| 413 | too_many_words | Cet appel dépasse la limite de mots par appel. Répartissez-le en plusieurs appels. Rien n’a été décompté. |
| 402 | quota_exhausted | Le quota de mots API de la formule pour cette période de facturation est épuisé et le solde de recharge est vide. Aucun mot n’a été comptabilisé. |
| 402 | quota_short | L’appel nécessite plus de mots que le quota de mots API restant et le solde réunis. Aucun mot n’a été comptabilisé. |
| 402 | monthly_ceiling | Le compte a atteint son plafond d’API pour cette période de facturation, qui s’applique quel que soit le solde. Aucun mot n’a été comptabilisé. |
| 503 | store_unavailable | La clé, le décompte de mots du compte ou son échantillon d’écriture enregistré n’a pas pu être lu pour le moment, ou ce déploiement ne dispose pas de stockage des comptes. Aucun traitement n’a été exécuté et aucun mot n’a été comptabilisé. |
Un appel réserve ses mots avant de s'exécuter et les restitue en cas d'échec. Si le décompte des mots ne peut pas être enregistré à ce moment-là, les mots restent décomptés : un appel échoué le signale alors et indique "recorded": false dans ses données d'utilisation, un lot renvoie "recorded": false dans ses données d'utilisation, et aucun nombre de mots n'est estimé.
{
"error": {
"code": "string",
"message": "string",
"docs": "string",
"available": "integer"
},
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}Limites
Tous les chiffres indiqués ici correspondent aux limites appliquées par l’API.
- Chaque clé permet au maximum 60 requêtes toutes les 60 secondes.
- Chaque clé permet au maximum 4 appels de détection (un lot compte comme un seul appel) et 2 appels d’humanisation, de reformulation ou de résumé simultanés ; tout appel supplémentaire reçoit une réponse 429 concurrency_limited avec un en-tête Retry-After.
- Lorsque les moteurs sont occupés, les analyses des comptes Pro du site sont traitées avant les appels API. Un appel API peut donc devoir attendre son tour.
- Un lot contient au maximum 50 textes.
- Chaque appel accepte au maximum 20 000 mots, pour un seul texte ou un lot entier.
- Le détecteur analyse un texte de 90 000 caractères maximum, soit environ 10 000 mots, quelle que soit la formule. Un texte plus long renvoie la réponse 413 text_too_long, même si la limite de mots par appel est respectée.
- Un compte peut avoir jusqu’à 5 clés actives, ce qui permet de remplacer une clé sans interruption de service.
Objets de réponse
Les objets renvoyés par les endpoints, champ par champ.
Detection
| Champ | Type | Description |
|---|---|---|
| figure | number | Le score de 0 à 100 : la probabilité que le texte ait été écrit par une IA. |
| low | number | La borne inférieure de l’intervalle autour du score. |
| high | number | La borne supérieure de l’intervalle autour du score. |
| uncertainty | number | La moitié de la largeur de l’intervalle, en points. |
| verdict | string | La tranche dans laquelle se situe le score ; une tranche, jamais une conclusion sur l’auteur du texte. Une valeur parmi : human, uncertain, ai. |
| confidence | string | Le degré de fiabilité de l’analyse. Une valeur parmi : low, medium, high. |
| sentences | tableau de SentenceScore | Une analyse par phrase. |
| words | integer | Les mots analysés. |
| language | string | La langue retenue pour l’analyse du texte. |
| model | string | Le modèle ayant produit l’analyse. |
| calibrated | boolean | Indique si la langue dispose d’une courbe ajustée. Si la valeur est false, le score ne doit pas être utilisé comme résultat. |
| bandHumanFlagRate | number | null | La fréquence à laquelle les textes humains de cette tranche ont été classés comme générés par une IA dans nos mesures, ou null. |
SentenceScore
| Champ | Type | Description |
|---|---|---|
| text | string | La phrase. |
| score | number | De 0 à 1, la probabilité que la phrase ait été écrite par une IA. |
| verdict | string | La tranche dans laquelle se situe la phrase. Une valeur parmi : human, uncertain, ai. |
Usage
| Champ | Type | Description |
|---|---|---|
| recorded | boolean | True lorsque le décompte a été enregistré. False uniquement lorsqu’un lot n’a pas pu restituer ses mots non analysés ; seul "words" est alors présent. |
| words | integer | Les mots comptabilisés par cet appel. |
| source | string | Leur provenance : le quota de mots API de la formule, le solde de recharge, ou les deux. Une valeur parmi : plan, balance, plan_and_balance. |
| fromPlan | integer | Les mots déduits du quota de mots API de la formule. Présent lorsque recorded vaut true. |
| fromBalance | integer | Les mots déduits du solde de recharge. Présent lorsque recorded vaut true. |
| allowanceLeft | integer | null | Les mots de la formule restants pour cet outil après cet appel, sur la période de facturation en cours. Null pour un outil sans quota dans cette formule. Présent lorsque recorded vaut true. |
| balance | integer | Le solde de recharge restant après cet appel. Présent lorsque recorded vaut true. |
RewriteResult
| Champ | Type | Description |
|---|---|---|
| text | string | Le texte réécrit. |
| before | Detection | L’analyse de votre texte par le détecteur, ou null si elle est absente. |
| after | Detection | L’analyse de la réécriture par le détecteur, ou null. |
| passes | integer | Le nombre de réécritures produites avant que celle-ci soit choisie. |
| facts | object | Les résultats des vérifications des faits et, le cas échéant, les raisons pour lesquelles une réécriture n’est pas conforme. |
| late | boolean | True lorsque la réécriture a été renvoyée à l’expiration du délai, sans que ses vérifications soient terminées. |
GrammarIssue
| Champ | Type | Description |
|---|---|---|
| offset | integer | La position de début du problème dans le texte envoyé, en unités de code UTF-16 (un indice de chaîne JavaScript). |
| length | integer | Le nombre d’unités de code UTF-16 couvertes dans le texte envoyé. |
| message | string | L’explication du problème. |
| shortMessage | string | La même explication, en quelques mots. |
| category | string | Le type de problème. Une valeur parmi : grammar, spelling, punctuation, style, typography. |
| replacements | tableau de string | Les corrections proposées, les meilleures en premier. |
| context | string | Le texte autour du problème. |
BatchResult
| Champ | Type | Description |
|---|---|---|
| id | string | L’identifiant de l’élément. |
| detection | Detection | L’analyse, si l’élément en a renvoyé une. |
| error | object | La raison pour laquelle l’élément n’a pas renvoyé d’analyse. |
Error
| Champ | Type | Description |
|---|---|---|
| error | object | |
| usage | Usage | Ce que cet appel a comptabilisé. |
Le serveur MCP
Un agent peut utiliser les mêmes outils via le Model Context Protocol. Le serveur est uniquement un client de cette API : un agent obtient donc exactement la même analyse que sur le site.
- detect_textAnalyse un texte.
- detect_batchAnalyse plusieurs textes.
- humanize_textHumanise un texte avec vérification des faits.
- paraphrase_textReformule un texte.
- summarize_textRésume un texte.
- check_grammarVérifie la grammaire et l’orthographe.
Claude Code Connexion en ligne
Conservez votre clé API dans une variable d’environnement nommée BLURWRITE_API_KEY, là où le client s’exécute :
Exécutez ceci dans un terminal :
Ou placez plutôt ceci dans .mcp.json :
.mcp.json{ "mcpServers": { "blurwrite": { "type": "http", "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${BLURWRITE_API_KEY}" } } } }Vérifiez que tout fonctionne : demandez à votre assistant « Analyse ce paragraphe avec Blurwrite et donne-moi l’intervalle et le niveau de confiance. »
Votre clé API se trouve dans votre tableau de bord, sous API. Ne placez jamais une clé dans un fichier partagé ou un dépôt.
Claude Desktop Exécute le fichier serveur
Téléchargez le fichier serveur et notez où vous l’avez enregistré. Il nécessite Node.js.
Télécharger le fichier serveurDans l’application : Settings > Developer > Edit Config.
Ajoutez ceci à claude_desktop_config.json :
claude_desktop_config.json{ "mcpServers": { "blurwrite": { "command": "node", "args": [ "/path/to/server.mjs" ], "env": { "BLURWRITE_API_KEY": "YOUR_API_KEY" } } } }Quittez puis relancez Claude Desktop pour qu’il charge le serveur.
Vérifiez que tout fonctionne : demandez à votre assistant « Analyse ce paragraphe avec Blurwrite et donne-moi l’intervalle et le niveau de confiance. »
Votre clé API se trouve dans votre tableau de bord, sous API. Ne placez jamais une clé dans un fichier partagé ou un dépôt.
Claude (claude.ai) Bientôt disponible
Vous pourrez bientôt relier claude.ai en vous identifiant sur votre compte Blurwrite. En attendant, les mêmes outils fonctionnent dès aujourd’hui dans Claude Desktop avec le fichier serveur, ou dans Claude Code, avec la configuration dans leurs onglets.
Uniquement si votre organisation dispose de l’option d’en-têtes de requête pour les connecteurs personnalisés : ajoutez l’adresse avec cet en-tête.
ChatGPT Bientôt disponible
Vous pourrez bientôt relier ChatGPT en vous identifiant sur votre compte Blurwrite. En attendant, les mêmes outils fonctionnent dès aujourd’hui dans Codex et Claude Code, avec la configuration dans leurs onglets.
Codex Connexion en ligne
Conservez votre clé API dans une variable d’environnement nommée BLURWRITE_API_KEY, là où le client s’exécute :
Exécutez ceci dans un terminal :
Ou placez plutôt ceci dans ~/.codex/config.toml :
~/.codex/config.toml[mcp_servers.blurwrite] url = "https://blurwrite.com/api/mcp" bearer_token_env_var = "BLURWRITE_API_KEY"Dans l’application : MCP servers > Add server > Streamable HTTP.
Vérifiez que tout fonctionne : demandez à votre assistant « Analyse ce paragraphe avec Blurwrite et donne-moi l’intervalle et le niveau de confiance. »
Votre clé API se trouve dans votre tableau de bord, sous API. Ne placez jamais une clé dans un fichier partagé ou un dépôt.
Cursor Connexion en ligne
Conservez votre clé API dans une variable d’environnement nommée BLURWRITE_API_KEY, là où le client s’exécute :
Ajoutez ceci à ~/.cursor/mcp.json :
~/.cursor/mcp.json{ "mcpServers": { "blurwrite": { "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Vérifiez que tout fonctionne : demandez à votre assistant « Analyse ce paragraphe avec Blurwrite et donne-moi l’intervalle et le niveau de confiance. »
Votre clé API se trouve dans votre tableau de bord, sous API. Ne placez jamais une clé dans un fichier partagé ou un dépôt.
VS Code (Copilot) Connexion en ligne
Ajoutez ceci à .vscode/mcp.json :
.vscode/mcp.json{ "inputs": [ { "type": "promptString", "id": "blurwrite-key", "description": "Blurwrite API key", "password": true } ], "servers": { "blurwrite": { "type": "http", "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${input:blurwrite-key}" } } } }Au démarrage du serveur, VS Code vous demande votre clé une seule fois et la conserve.
Vérifiez que tout fonctionne : demandez à votre assistant « Analyse ce paragraphe avec Blurwrite et donne-moi l’intervalle et le niveau de confiance. »
Votre clé API se trouve dans votre tableau de bord, sous API. Ne placez jamais une clé dans un fichier partagé ou un dépôt.
Windsurf Connexion en ligne
Conservez votre clé API dans une variable d’environnement nommée BLURWRITE_API_KEY, là où le client s’exécute :
Dans l’application : Cascade > ... > Open MCP config file.
Ajoutez ceci à mcp_config.json :
mcp_config.json{ "mcpServers": { "blurwrite": { "serverUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Quittez puis relancez Windsurf pour qu’il charge le serveur.
Vérifiez que tout fonctionne : demandez à votre assistant « Analyse ce paragraphe avec Blurwrite et donne-moi l’intervalle et le niveau de confiance. »
Votre clé API se trouve dans votre tableau de bord, sous API. Ne placez jamais une clé dans un fichier partagé ou un dépôt.
Gemini CLI Connexion en ligne
Conservez votre clé API dans une variable d’environnement nommée BLURWRITE_API_KEY, là où le client s’exécute :
Exécutez ceci dans un terminal :
Ou placez plutôt ceci dans ~/.gemini/settings.json :
~/.gemini/settings.json{ "mcpServers": { "blurwrite": { "httpUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }Vérifiez que tout fonctionne : demandez à votre assistant « Analyse ce paragraphe avec Blurwrite et donne-moi l’intervalle et le niveau de confiance. »
Votre clé API se trouve dans votre tableau de bord, sous API. Ne placez jamais une clé dans un fichier partagé ou un dépôt.
Other clients En ligne, passerelle ou fichier
Un client qui se connecte à des serveurs MCP distants via HTTP n’a besoin que de ces deux valeurs :
Un client qui ne lance que des serveurs locaux peut joindre l’adresse grâce à la passerelle open source mcp-remote (elle nécessite Node.js) :
Ou exécutez vous-même notre fichier serveur :
Télécharger le fichier serveur
Votre clé API se trouve dans votre tableau de bord, sous API. Ne placez jamais une clé dans un fichier partagé ou un dépôt.
Chaque analyse reçue par un agent comprend le score, l’incertitude associée et l’état de calibration, afin que l’agent puisse expliquer ce que signifie le résultat et quand il ne doit pas être utilisé.
Votre clé
Connectez-vous, puis créez une clé depuis votre tableau de bord.
Aucune clé n’est créée sur cette page.
Ce que font l’API et le serveur MCP