Aller au contenu
Documentation développeur

L’API v1 et le serveur MCP

Tout ce dont vous avez besoin pour appeler l’API : l’authentification, chaque endpoint avec sa requête et sa réponse, les erreurs et les limites, ainsi que des exemples en curl, JavaScript et Python.

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

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.

Exemple de requête
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."}'
Exemple de réponse
{
  "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.

Authentification
Authorization: Bearer YOUR_API_KEY

Endpoints

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

ChampTypeObligatoireDescription
textstringouiLe texte à analyser ou à réécrire.
languagestringnonLe code de langue, par exemple "en" ou "de". S’il est omis, la langue est détectée à partir du texte.
contentTypestringnonLe type de texte, par exemple "essay" ou "email", lorsque l’analyse doit utiliser la courbe de ce type de texte.

Réponse

ChampTypeDescription
figurenumberLe score de 0 à 100 : la probabilité que le texte ait été écrit par une IA.
lownumberLa borne inférieure de l’intervalle autour du score.
highnumberLa borne supérieure de l’intervalle autour du score.
uncertaintynumberLa moitié de la largeur de l’intervalle, en points.
verdictstringLa tranche dans laquelle se situe le score ; une tranche, jamais une conclusion sur l’auteur du texte. Une valeur parmi : human, uncertain, ai.
confidencestringLe degré de fiabilité de l’analyse. Une valeur parmi : low, medium, high.
sentencestableau de SentenceScoreUne analyse par phrase.
wordsintegerLes mots analysés.
languagestringLa langue retenue pour l’analyse du texte.
modelstringLe modèle ayant produit l’analyse.
calibratedbooleanIndique si la langue dispose d’une courbe ajustée. Si la valeur est false, le score ne doit pas être utilisé comme résultat.
bandHumanFlagRatenumber | nullLa 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.
usageUsageCe que cet appel a comptabilisé.

Erreurs propres à cette route

StatutCodeSignification
400no_textLe corps ne contient pas de "text".
422too_shortLe texte est plus court que la longueur minimale.
413text_too_longLe texte dépasse la longueur que le moteur peut analyser en un appel. Divisez-le. Aucun mot n’a été comptabilisé.
422not_calibratedCette langue ne peut pas encore être analysée.
503engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
502engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
503engine_startingLe moteur démarre et n’était pas prêt à temps. Aucun mot n’a été comptabilisé. Réessayez dans une minute.
503engine_busyLe 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.
504engine_timeoutLe moteur n’a pas terminé l’analyse du texte à temps. Aucun mot n’a été comptabilisé. Réessayez ou envoyez un texte plus court.
429concurrency_limitedCette 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é.
Exemple de requête
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."}'
Exemple de réponse
{
  "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

ChampTypeObligatoireDescription
itemstableau de objectouiLes textes, chacun avec son propre "text" et, facultativement, "id", "language" et "contentType".
items[].idstringnonVotre identifiant pour l’élément, renvoyé avec son résultat. S’il est omis, la position de l’élément est utilisée.
items[].textstringouiLe texte à analyser ou à réécrire.
items[].languagestringnonLe code de langue, par exemple "en" ou "de". S’il est omis, la langue est détectée à partir du texte.
items[].contentTypestringnonLe type de texte, par exemple "essay" ou "email", lorsque l’analyse doit utiliser la courbe de ce type de texte.

Réponse

ChampTypeDescription
resultstableau de BatchResultUn résultat par élément, dans l’ordre d’envoi.
usageUsageCe que cet appel a comptabilisé.

Erreurs propres à cette route

StatutCodeSignification
400batch_emptyLe corps ne contient pas de "items", ou la liste est vide.
413batch_too_largeLe lot contient plus d’éléments que la limite autorisée.
429concurrency_limitedCette 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é.
Exemple de requête
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."}]}'
Exemple de réponse
{
  "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

ChampTypeObligatoireDescription
textstringouiLe texte à analyser ou à réécrire.
modestringnonLe mode de réécriture. Une valeur parmi : natural, formal, simple, academic, creative, shorten, expand, custom. Par défaut : natural.
style_samplestringnonAvec 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é.
tabstringnonL’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.
strengthstringnonRegular 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.
ownTouchstringnonUn détail, un exemple ou une opinion dans vos propres mots, jusqu’à 400 caractères, intégré à la reformulation.
languagestringnonLe code de langue, par exemple "en" ou "de". S’il est omis, la langue est détectée à partir du texte.

Réponse

ChampTypeDescription
textstringLe texte réécrit.
beforeDetectionL’analyse de votre texte par le détecteur, ou null si elle est absente.
afterDetectionL’analyse de la réécriture par le détecteur, ou null.
passesintegerLe nombre de réécritures produites avant que celle-ci soit choisie.
factsobjectLes résultats des vérifications des faits et, le cas échéant, les raisons pour lesquelles une réécriture n’est pas conforme.
latebooleanTrue lorsque la réécriture a été renvoyée à l’expiration du délai, sans que ses vérifications soient terminées.
usageUsageCe que cet appel a comptabilisé.

Erreurs propres à cette route

StatutCodeSignification
400no_textLe corps ne contient pas de "text".
422too_shortLe texte est plus court que la longueur minimale.
400unknown_modeCe mode n’est pas proposé par cette route.
400unknown_optionCet onglet ou ce niveau d’intensité n’est pas proposé par cette route.
402plan_requiredLe 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é.
400no_sampleLe mode "custom" nécessite un échantillon d’écriture, envoyé ou enregistré dans le compte.
400sample_too_shortL’échantillon d’écriture est plus court que la longueur minimale.
400sample_too_longL’échantillon d’écriture dépasse la longueur maximale.
429concurrency_limitedCette 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é.
422no_rewriteLe 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é.
503timeoutLa réécriture a pris trop de temps et a été interrompue. Aucun mot n’a été comptabilisé.
503engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
502engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
Exemple de requête
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."}'
Exemple de réponse
{
  "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

ChampTypeObligatoireDescription
textstringouiLe texte à analyser ou à réécrire.
modestringnonLe mode de réécriture. Une valeur parmi : standard, fluency, formal, academic, simple, creative, expand, shorten. Par défaut : standard.
strengthstringnonLe degré de liberté de la réécriture par rapport à l’original. Une valeur parmi : readable, balanced, strong. Par défaut : balanced.
readabilitystringnonLe registre de langue à utiliser. Une valeur parmi : casual, professional, academic, creative. Par défaut : professional.
purposestringnonL’objectif du texte. Une valeur parmi : general, essay, article, email, marketing, report, story. Par défaut : general.
synonymsstringnonLe degré de liberté pour remplacer les mots. Une valeur parmi : few, some, many. Par défaut : some.
freezeWordstableau de stringnonLes mots et expressions à conserver à l’identique : au maximum 25, chacun limité à 60 caractères. Leurs mots sont comptabilisés dans ceux de l’appel.
customInstructionstringnonVotre consigne personnalisée pour la réécriture, limitée à 500 caractères. Ses mots sont comptabilisés dans ceux de l’appel.
languagestringnonLe code de langue, par exemple "en" ou "de". S’il est omis, la langue est détectée à partir du texte.
closedLoopbooleannonDéfinissez la valeur sur false pour ignorer la boucle de vérification. Par défaut : true.

Réponse

ChampTypeDescription
textstringLe texte réécrit.
beforeDetectionL’analyse de votre texte par le détecteur, ou null si elle est absente.
afterDetectionL’analyse de la réécriture par le détecteur, ou null.
passesintegerLe nombre de réécritures produites avant que celle-ci soit choisie.
factsobjectLes résultats des vérifications des faits et, le cas échéant, les raisons pour lesquelles une réécriture n’est pas conforme.
latebooleanTrue lorsque la réécriture a été renvoyée à l’expiration du délai, sans que ses vérifications soient terminées.
usageUsageCe que cet appel a comptabilisé.

Erreurs propres à cette route

StatutCodeSignification
400no_textLe corps ne contient pas de "text".
422too_shortLe texte est plus court que la longueur minimale.
400unknown_modeCe mode n’est pas proposé par cette route.
400option_invalidfreezeWords n’est pas une liste de mots ou d’expressions. Rien n’a été décompté.
400option_too_longfreezeWords ou customInstruction dépasse sa limite. Rien n’a été décompté.
429concurrency_limitedCette 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é.
422no_rewriteLe 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é.
503timeoutLa réécriture a pris trop de temps et a été interrompue. Aucun mot n’a été comptabilisé.
503engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
502engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
Exemple de requête
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."}'
Exemple de réponse
{
  "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

ChampTypeObligatoireDescription
textstringouiLe texte à analyser ou à réécrire.
modestringnonLa forme du résumé. Une valeur parmi : key-sentences, paragraph, bullets. Par défaut : key-sentences.
lengthstringnonLa longueur du résumé. Une valeur parmi : short, medium, long. Par défaut : medium.

Réponse

ChampTypeDescription
textstringLe résumé.
usageUsageCe que cet appel a comptabilisé.

Erreurs propres à cette route

StatutCodeSignification
400no_textLe corps ne contient pas de "text".
422too_shortLe texte est plus court que la longueur minimale.
429concurrency_limitedCette 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é.
503timeoutLa réécriture a pris trop de temps et a été interrompue. Aucun mot n’a été comptabilisé.
503engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
502engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
Exemple de requête
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."}'
Exemple de réponse
{
  "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

ChampTypeObligatoireDescription
textstringouiLe texte à analyser ou à réécrire.
languagestringnonLe code de langue pour la vérification, par exemple "en-US" ou "de-DE". Par défaut : en-US.

Réponse

ChampTypeDescription
issuestableau de GrammarIssueLes problèmes détectés, dans leur ordre d’apparition.
usageUsageCe que cet appel a comptabilisé.

Erreurs propres à cette route

StatutCodeSignification
400no_textLe corps ne contient pas de "text".
503engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
502engine_unavailableLe moteur n’a pas répondu. Aucun mot n’a été comptabilisé.
503engine_startingLe moteur démarre et n’était pas prêt à temps. Aucun mot n’a été comptabilisé. Réessayez dans une minute.
504engine_timeoutLe moteur n’a pas terminé l’analyse du texte à temps. Aucun mot n’a été comptabilisé. Réessayez ou envoyez un texte plus court.
Exemple de requête
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."}'
Exemple de réponse
{
  "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

StatutCodeSignification
401key_in_urlLa clé a été envoyée dans l’URL. Envoyez-la dans l’en-tête Authorization.
401no_keyAucune clé n’a été envoyée.
401bad_keyLa clé est invalide ou a été révoquée.
403out_of_scopeLa clé ne possède pas l’autorisation requise pour cette route.
429rate_limitedTrop de requêtes pour cette clé. Attendez le délai indiqué dans Retry-After.
403plan_lapsedLa formule du compte n’inclut plus l’API.
413too_largeLa requête est trop volumineuse.
400bad_bodyLe corps n’est pas un objet JSON.
413too_many_wordsCet appel dépasse la limite de mots par appel. Répartissez-le en plusieurs appels. Rien n’a été décompté.
402quota_exhaustedLe 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é.
402quota_shortL’appel nécessite plus de mots que le quota de mots API restant et le solde réunis. Aucun mot n’a été comptabilisé.
402monthly_ceilingLe 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é.
503store_unavailableLa 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é.

Corps de l’erreur
{
  "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

ChampTypeDescription
figurenumberLe score de 0 à 100 : la probabilité que le texte ait été écrit par une IA.
lownumberLa borne inférieure de l’intervalle autour du score.
highnumberLa borne supérieure de l’intervalle autour du score.
uncertaintynumberLa moitié de la largeur de l’intervalle, en points.
verdictstringLa tranche dans laquelle se situe le score ; une tranche, jamais une conclusion sur l’auteur du texte. Une valeur parmi : human, uncertain, ai.
confidencestringLe degré de fiabilité de l’analyse. Une valeur parmi : low, medium, high.
sentencestableau de SentenceScoreUne analyse par phrase.
wordsintegerLes mots analysés.
languagestringLa langue retenue pour l’analyse du texte.
modelstringLe modèle ayant produit l’analyse.
calibratedbooleanIndique si la langue dispose d’une courbe ajustée. Si la valeur est false, le score ne doit pas être utilisé comme résultat.
bandHumanFlagRatenumber | nullLa 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

ChampTypeDescription
textstringLa phrase.
scorenumberDe 0 à 1, la probabilité que la phrase ait été écrite par une IA.
verdictstringLa tranche dans laquelle se situe la phrase. Une valeur parmi : human, uncertain, ai.

Usage

ChampTypeDescription
recordedbooleanTrue 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.
wordsintegerLes mots comptabilisés par cet appel.
sourcestringLeur provenance : le quota de mots API de la formule, le solde de recharge, ou les deux. Une valeur parmi : plan, balance, plan_and_balance.
fromPlanintegerLes mots déduits du quota de mots API de la formule. Présent lorsque recorded vaut true.
fromBalanceintegerLes mots déduits du solde de recharge. Présent lorsque recorded vaut true.
allowanceLeftinteger | nullLes 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.
balanceintegerLe solde de recharge restant après cet appel. Présent lorsque recorded vaut true.

RewriteResult

ChampTypeDescription
textstringLe texte réécrit.
beforeDetectionL’analyse de votre texte par le détecteur, ou null si elle est absente.
afterDetectionL’analyse de la réécriture par le détecteur, ou null.
passesintegerLe nombre de réécritures produites avant que celle-ci soit choisie.
factsobjectLes résultats des vérifications des faits et, le cas échéant, les raisons pour lesquelles une réécriture n’est pas conforme.
latebooleanTrue lorsque la réécriture a été renvoyée à l’expiration du délai, sans que ses vérifications soient terminées.

GrammarIssue

ChampTypeDescription
offsetintegerLa position de début du problème dans le texte envoyé, en unités de code UTF-16 (un indice de chaîne JavaScript).
lengthintegerLe nombre d’unités de code UTF-16 couvertes dans le texte envoyé.
messagestringL’explication du problème.
shortMessagestringLa même explication, en quelques mots.
categorystringLe type de problème. Une valeur parmi : grammar, spelling, punctuation, style, typography.
replacementstableau de stringLes corrections proposées, les meilleures en premier.
contextstringLe texte autour du problème.

BatchResult

ChampTypeDescription
idstringL’identifiant de l’élément.
detectionDetectionL’analyse, si l’élément en a renvoyé une.
errorobjectLa raison pour laquelle l’élément n’a pas renvoyé d’analyse.

Error

ChampTypeDescription
errorobject
usageUsageCe que cet appel a comptabilisé.
Serveur MCP

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

  1. Conservez votre clé API dans une variable d’environnement nommée BLURWRITE_API_KEY, là où le client s’exécute :

    export BLURWRITE_API_KEY="YOUR_API_KEY"
  2. Exécutez ceci dans un terminal :

    claude mcp add --transport http blurwrite https://blurwrite.com/api/mcp --header "Authorization: Bearer $BLURWRITE_API_KEY"
  3. 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}"
          }
        }
      }
    }
  4. 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.

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.

Obtenir votre clé API

Aucune clé n’est créée sur cette page.

Ce que font l’API et le serveur MCP