Auf dieser Seite
Erste Schritte
Überblick
Die API ist im Pfad versioniert: /api/v1. Jeder Endpunkt nimmt einen POST mit JSON-Body an und antwortet mit JSON, auch bei Fehlern.
Basis-URL https://blurwrite.com
- POST /api/v1/detectEinen Text analysieren
- POST /api/v1/detect/batchMehrere Texte analysieren
- POST /api/v1/humanizeEinen Text natürlicher formulieren
- POST /api/v1/paraphraseEinen Text umschreiben
- POST /api/v1/summarizeEinen Text zusammenfassen
- POST /api/v1/grammarGrammatik prüfen
Nur auf der Website, nicht in der API: der Wörterzähler, der Zeichenzähler, die Plagiatsprüfung und der Durchlauf „Mehr Zeit nehmen“ des Humanizers.
Aus dem OpenAPI-Dokument generiert. Hier stehen genau die Routen und Felder, die die API akzeptiert. Das OpenAPI-Dokument
Dein erster Aufruf
Ein Text braucht mindestens 50 Wörter.
Prüfe zuerst "calibrated": Ist der Wert false, gibt es für die Sprache noch keine angepasste Kalibrierungskurve. Der Zahlenwert darf dann nicht als Ergebnis verwendet werden.
Für jeden Wert wird der Datentyp angezeigt. Eine echte Antwort enthält die Analyse deines Textes.
curl -X POST https://blurwrite.com/api/v1/detect \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."}'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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."
}),
})
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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"figure": "number, 0 bis 100",
"low": "number, 0 bis 100",
"high": "number, 0 bis 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, 0 bis 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"
}
}Authentifizierung
Sende deinen Schlüssel im Authorization-Header als Bearer-Token. Ein Schlüssel in der URL wird abgelehnt.
Ein Schlüssel hat Berechtigungen (Scopes): detect, rewrite, summarize und grammar. Eine Route antwortet mit 403 out_of_scope, wenn dem Schlüssel die passende Berechtigung fehlt.
Authorization: Bearer YOUR_API_KEYEndpunkte
POST /api/v1/detect
Einen Text analysieren. Die Analyse eines Textes: ein Wert von 0 bis 100, der zugehörige Wertebereich, eine Analyse pro Satz und die Angabe, ob die Sprache kalibriert ist.
Berechtigung des Schlüssels: detect
Anfragetext
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| text | string | ja | Der Text, der analysiert oder umgeschrieben werden soll. |
| language | string | nein | Der Sprachcode, etwa "en" oder "de". Ohne Angabe wird die Sprache aus dem Text erkannt. |
| contentType | string | nein | Die Textart, etwa "essay" oder "email", wenn für die Analyse die entsprechende Kalibrierungskurve verwendet werden soll. |
Antwort
| Feld | Typ | Beschreibung |
|---|---|---|
| figure | number | Der Wert von 0 bis 100: wie wahrscheinlich der Text maschinell verfasst wurde. |
| low | number | Die untere Grenze des Wertebereichs. |
| high | number | Die obere Grenze des Wertebereichs. |
| uncertainty | number | Die halbe Breite des Wertebereichs, in Punkten. |
| verdict | string | Der Bereich, in den der Wert fällt. Eine Einstufung, niemals eine Feststellung darüber, wer den Text geschrieben hat. Einer von: human, uncertain, ai. |
| confidence | string | Wie verlässlich die Analyse ist. Einer von: low, medium, high. |
| sentences | Array aus SentenceScore | Eine Analyse pro Satz. |
| words | integer | Die analysierten Wörter. |
| language | string | Die Sprache, als die der Text analysiert wurde. |
| model | string | Das Modell, das die Analyse erstellt hat. |
| calibrated | boolean | Ob es für die Sprache eine angepasste Kalibrierungskurve gibt. Bei false darf der Wert nicht als Ergebnis verwendet werden. |
| bandHumanFlagRate | number | null | Wie oft menschliche Texte in diesem Bereich bei unseren Messungen als maschinell eingestuft wurden, oder null. |
| usage | Usage | Der Verbrauch dieses Aufrufs. |
Zusätzliche Fehler dieser Route
| Status | Code | Bedeutung |
|---|---|---|
| 400 | no_text | Im Anfragetext fehlt "text". |
| 422 | too_short | Der Text unterschreitet die Mindestlänge. |
| 413 | text_too_long | Der Text ist länger, als die Engine in einem Aufruf verarbeiten kann. Teile ihn auf. Es wurden keine Wörter abgezogen. |
| 422 | not_calibrated | Diese Sprache kann noch nicht analysiert werden. |
| 503 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
| 502 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
| 503 | engine_starting | Die Engine startet gerade und war nicht rechtzeitig bereit. Es wurden keine Wörter abgezogen. Versuche es in einer Minute erneut. |
| 503 | engine_busy | Die Engine war ausgelastet und die Analyse konnte nicht rechtzeitig starten. Analysen für Pro-Nutzer auf der Website haben Vorrang vor API-Aufrufen. Es wurden keine Wörter abgezogen. Versuche es gleich noch einmal. |
| 504 | engine_timeout | Die Engine konnte den Text nicht rechtzeitig fertig verarbeiten. Es wurden keine Wörter abgezogen. Versuche es erneut oder sende einen kürzeren Text. |
| 429 | concurrency_limited | Für diesen Schlüssel laufen bereits so viele Aufrufe dieser Art wie erlaubt. Warte, bis einer abgeschlossen ist, oder warte die in Retry-After angegebene Zeit ab. |
curl -X POST https://blurwrite.com/api/v1/detect \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."}'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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."
}),
})
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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"figure": "number, 0 bis 100",
"low": "number, 0 bis 100",
"high": "number, 0 bis 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, 0 bis 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
Mehrere Texte analysieren. Mehrere Texte in einem Aufruf, bis zum Batch-Limit. Vor dem Aufruf muss genug Wortkontingent für alle analysierbaren Texte vorhanden sein (50 Wörter oder mehr). Wörter von Texten ohne Analyseergebnis werden anschließend zurückerstattet. Ein Fehler bei einem Text lässt nie den gesamten Batch fehlschlagen.
Berechtigung des Schlüssels: detect
Anfragetext
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| items | Array aus object | ja | Die Texte, jeweils mit eigenem "text" und optionalem "id", "language" und "contentType". |
| items[].id | string | nein | Deine eigene ID für den Eintrag, die mit dem Ergebnis zurückgegeben wird. Ohne Angabe wird die Position des Eintrags verwendet. |
| items[].text | string | ja | Der Text, der analysiert oder umgeschrieben werden soll. |
| items[].language | string | nein | Der Sprachcode, etwa "en" oder "de". Ohne Angabe wird die Sprache aus dem Text erkannt. |
| items[].contentType | string | nein | Die Textart, etwa "essay" oder "email", wenn für die Analyse die entsprechende Kalibrierungskurve verwendet werden soll. |
Antwort
| Feld | Typ | Beschreibung |
|---|---|---|
| results | Array aus BatchResult | Ein Ergebnis pro Eintrag, in der gesendeten Reihenfolge. |
| usage | Usage | Der Verbrauch dieses Aufrufs. |
Zusätzliche Fehler dieser Route
| Status | Code | Bedeutung |
|---|---|---|
| 400 | batch_empty | Im Anfragetext fehlt "items", oder die Liste ist leer. |
| 413 | batch_too_large | Der Batch enthält mehr Einträge als erlaubt. |
| 429 | concurrency_limited | Für diesen Schlüssel laufen bereits so viele Aufrufe dieser Art wie erlaubt. Warte, bis einer abgeschlossen ist, oder warte die in Retry-After angegebene Zeit ab. |
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":"Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."},{"id":"2","text":"Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."}]}'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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."
},
{
"id": "2",
"text": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."
}
]
}),
})
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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes.",
},
{
"id": "2",
"text": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes.",
},
],
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"results": [
{
"id": "string",
"detection": {
"figure": "number, 0 bis 100",
"low": "number, 0 bis 100",
"high": "number, 0 bis 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, 0 bis 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
Einen Text natürlicher formulieren. Der Humanizer mit Faktenprüfung: Zahlen, Namen und Zitate bleiben erhalten. Überarbeitungen, die einen Fakt verändern, werden korrigiert oder gemeldet. Der Modus "custom" (Pro) schreibt in deinem eigenen Stil, der anhand einer Schreibprobe ermittelt wird.
Über die API führt der Humanizer seine Standard-Umschreibung aus. „Mehr Zeit nehmen“ gibt es nur auf der Website.
Berechtigung des Schlüssels: rewrite
Anfragetext
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| text | string | ja | Der Text, der analysiert oder umgeschrieben werden soll. |
| mode | string | nein | Der Modus zum Umschreiben. Einer von: natural, formal, simple, academic, creative, shorten, expand, custom. Standard: natural. |
| style_sample | string | nein | Im Modus "custom": eine Probe deines eigenen Schreibstils mit 150 bis 2.000 Wörtern, die auf dem Server analysiert wird. Ohne Angabe wird die in deinem Konto gespeicherte Probe verwendet. |
| tab | string | nein | Der Tab im Humanizer bestimmt die Sprachebene der umgeschriebenen Fassung. Standard behält die Sprachebene des Ausgangstextes bei. Einer von: standard, academic, professional, casual. Standard: standard. |
| strength | string | nein | Regulär behält Inhalt und Sprachebene bei. Aggressiv kann den Text umstrukturieren und Ausführungen weglassen, behält aber alle Kernaussagen bei. Manche Passagen können ungewohnt klingen. Einer von: regular, aggressive. Standard: regular. |
| ownTouch | string | nein | Ein Detail, Beispiel oder eine Meinung in deinen eigenen Worten, bis zu 400 Zeichen, das in die umgeschriebene Fassung eingearbeitet wird. |
| language | string | nein | Der Sprachcode, etwa "en" oder "de". Ohne Angabe wird die Sprache aus dem Text erkannt. |
Antwort
| Feld | Typ | Beschreibung |
|---|---|---|
| text | string | Der umgeschriebene Text. |
| before | Detection | Die Analyse deines Textes, oder null, wenn keine vorliegt. |
| after | Detection | Die Analyse der Überarbeitung, oder null. |
| passes | integer | Wie viele Überarbeitungen erstellt wurden, bevor diese ausgewählt wurde. |
| facts | object | Was die Faktenprüfungen ergeben haben und warum eine Überarbeitung gegebenenfalls nicht einwandfrei ist. |
| late | boolean | true, wenn die Überarbeitung beim Erreichen des Zeitlimits mit unvollständigen Prüfungen zurückgegeben wurde. |
| usage | Usage | Der Verbrauch dieses Aufrufs. |
Zusätzliche Fehler dieser Route
| Status | Code | Bedeutung |
|---|---|---|
| 400 | no_text | Im Anfragetext fehlt "text". |
| 422 | too_short | Der Text unterschreitet die Mindestlänge. |
| 400 | unknown_mode | Dieser Modus wird von der Route nicht angeboten. |
| 400 | unknown_option | Diesen Tab oder diese Stärke bietet diese Route nicht an. |
| 402 | plan_required | Der Modus, der Tab, die Stärke oder die persönliche Anpassung erfordert einen Tarif, den das Konto nicht hat. Der Modus "custom" erfordert Pro. Es wurden keine Wörter abgezogen. |
| 400 | no_sample | Der Modus "custom" braucht eine Schreibprobe, die mitgesendet oder im Konto gespeichert wird. |
| 400 | sample_too_short | Die Schreibprobe unterschreitet die Mindestlänge. |
| 400 | sample_too_long | Die Schreibprobe überschreitet die maximale Länge. |
| 429 | concurrency_limited | Für diesen Schlüssel laufen bereits so viele Aufrufe dieser Art wie erlaubt. Warte, bis einer abgeschlossen ist, oder warte die in Retry-After angegebene Zeit ab. |
| 422 | no_rewrite | Die Engine hat geantwortet, aber kein Entwurf hat die Prüfungen bestanden (leer, eine Ablehnung oder eine Kopie des Textes). Es wurden keine Wörter abgezogen. |
| 503 | timeout | Die Überarbeitung hat zu lange gedauert und wurde abgebrochen. Es wurden keine Wörter abgezogen. |
| 503 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
| 502 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
curl -X POST https://blurwrite.com/api/v1/humanize \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."}'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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."
}),
})
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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"before": {
"figure": "number, 0 bis 100",
"low": "number, 0 bis 100",
"high": "number, 0 bis 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, 0 bis 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"after": {
"figure": "number, 0 bis 100",
"low": "number, 0 bis 100",
"high": "number, 0 bis 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, 0 bis 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
Einen Text umschreiben. Der Paraphrasierer mit denselben Modi wie das Tool zum Umschreiben.
Berechtigung des Schlüssels: rewrite
Anfragetext
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| text | string | ja | Der Text, der analysiert oder umgeschrieben werden soll. |
| mode | string | nein | Der Modus zum Umschreiben. Einer von: standard, fluency, formal, academic, simple, creative, expand, shorten. Standard: standard. |
| strength | string | nein | Wie stark die Überarbeitung vom Original abweichen darf. Einer von: readable, balanced, strong. Standard: balanced. |
| readability | string | nein | Das sprachliche Register für den Text. Einer von: casual, professional, academic, creative. Standard: professional. |
| purpose | string | nein | Der Zweck des Textes. Einer von: general, essay, article, email, marketing, report, story. Standard: general. |
| synonyms | string | nein | Wie frei Wörter ersetzt werden dürfen. Einer von: few, some, many. Standard: some. |
| freezeWords | Array aus string | nein | Wörter und Formulierungen, die exakt erhalten bleiben müssen: höchstens 25, jeweils bis zu 60 Zeichen. Ihre Wörter zählen zum Wortverbrauch des Aufrufs. |
| customInstruction | string | nein | Eine kurze eigene Anweisung für die Überarbeitung, mit bis zu 500 Zeichen. Ihre Wörter zählen zum Wortverbrauch des Aufrufs. |
| language | string | nein | Der Sprachcode, etwa "en" oder "de". Ohne Angabe wird die Sprache aus dem Text erkannt. |
| closedLoop | boolean | nein | Setze den Wert auf false, um die Prüfschleife zu überspringen. Standard: true. |
Antwort
| Feld | Typ | Beschreibung |
|---|---|---|
| text | string | Der umgeschriebene Text. |
| before | Detection | Die Analyse deines Textes, oder null, wenn keine vorliegt. |
| after | Detection | Die Analyse der Überarbeitung, oder null. |
| passes | integer | Wie viele Überarbeitungen erstellt wurden, bevor diese ausgewählt wurde. |
| facts | object | Was die Faktenprüfungen ergeben haben und warum eine Überarbeitung gegebenenfalls nicht einwandfrei ist. |
| late | boolean | true, wenn die Überarbeitung beim Erreichen des Zeitlimits mit unvollständigen Prüfungen zurückgegeben wurde. |
| usage | Usage | Der Verbrauch dieses Aufrufs. |
Zusätzliche Fehler dieser Route
| Status | Code | Bedeutung |
|---|---|---|
| 400 | no_text | Im Anfragetext fehlt "text". |
| 422 | too_short | Der Text unterschreitet die Mindestlänge. |
| 400 | unknown_mode | Dieser Modus wird von der Route nicht angeboten. |
| 400 | option_invalid | freezeWords ist keine Liste von Wörtern oder Formulierungen. Es wurde nichts angerechnet. |
| 400 | option_too_long | freezeWords oder customInstruction überschreitet das jeweilige Limit. Es wurde nichts angerechnet. |
| 429 | concurrency_limited | Für diesen Schlüssel laufen bereits so viele Aufrufe dieser Art wie erlaubt. Warte, bis einer abgeschlossen ist, oder warte die in Retry-After angegebene Zeit ab. |
| 422 | no_rewrite | Die Engine hat geantwortet, aber kein Entwurf hat die Prüfungen bestanden (leer, eine Ablehnung oder eine Kopie des Textes). Es wurden keine Wörter abgezogen. |
| 503 | timeout | Die Überarbeitung hat zu lange gedauert und wurde abgebrochen. Es wurden keine Wörter abgezogen. |
| 503 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
| 502 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
curl -X POST https://blurwrite.com/api/v1/paraphrase \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."}'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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."
}),
})
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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"before": {
"figure": "number, 0 bis 100",
"low": "number, 0 bis 100",
"high": "number, 0 bis 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, 0 bis 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"after": {
"figure": "number, 0 bis 100",
"low": "number, 0 bis 100",
"high": "number, 0 bis 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, 0 bis 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
Einen Text zusammenfassen. Der Zusammenfasser liefert Kernsätze, einen Absatz oder Stichpunkte.
Berechtigung des Schlüssels: summarize
Anfragetext
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| text | string | ja | Der Text, der analysiert oder umgeschrieben werden soll. |
| mode | string | nein | Die Form der Zusammenfassung. Einer von: key-sentences, paragraph, bullets. Standard: key-sentences. |
| length | string | nein | Die Länge der Zusammenfassung. Einer von: short, medium, long. Standard: medium. |
Antwort
| Feld | Typ | Beschreibung |
|---|---|---|
| text | string | Die Zusammenfassung. |
| usage | Usage | Der Verbrauch dieses Aufrufs. |
Zusätzliche Fehler dieser Route
| Status | Code | Bedeutung |
|---|---|---|
| 400 | no_text | Im Anfragetext fehlt "text". |
| 422 | too_short | Der Text unterschreitet die Mindestlänge. |
| 429 | concurrency_limited | Für diesen Schlüssel laufen bereits so viele Aufrufe dieser Art wie erlaubt. Warte, bis einer abgeschlossen ist, oder warte die in Retry-After angegebene Zeit ab. |
| 503 | timeout | Die Überarbeitung hat zu lange gedauert und wurde abgebrochen. Es wurden keine Wörter abgezogen. |
| 503 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
| 502 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
curl -X POST https://blurwrite.com/api/v1/summarize \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."}'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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."
}),
})
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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes.",
},
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
Grammatik prüfen. Probleme mit Grammatik, Rechtschreibung, Zeichensetzung und Stil, jeweils mit ihrer Position im Text und Korrekturvorschlägen.
Berechtigung des Schlüssels: grammar
Anfragetext
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| text | string | ja | Der Text, der analysiert oder umgeschrieben werden soll. |
| language | string | nein | Der Sprachcode für die Prüfung, etwa "en-US" oder "de-DE". Standard: en-US. |
Antwort
| Feld | Typ | Beschreibung |
|---|---|---|
| issues | Array aus GrammarIssue | Die gefundenen Probleme in der Reihenfolge ihres Auftretens. |
| usage | Usage | Der Verbrauch dieses Aufrufs. |
Zusätzliche Fehler dieser Route
| Status | Code | Bedeutung |
|---|---|---|
| 400 | no_text | Im Anfragetext fehlt "text". |
| 503 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
| 502 | engine_unavailable | Die Engine hat nicht geantwortet. Es wurden keine Wörter abgezogen. |
| 503 | engine_starting | Die Engine startet gerade und war nicht rechtzeitig bereit. Es wurden keine Wörter abgezogen. Versuche es in einer Minute erneut. |
| 504 | engine_timeout | Die Engine konnte den Text nicht rechtzeitig fertig verarbeiten. Es wurden keine Wörter abgezogen. Versuche es erneut oder sende einen kürzeren Text. |
curl -X POST https://blurwrite.com/api/v1/grammar \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."}'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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes."
}),
})
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": "Der Ausschuss traf sich am Dienstag, um den Plan für die neue Bibliothek zu besprechen. Die Mitglieder waren sich einig, dass der Lesesaal an Werktagen länger geöffnet bleiben sollte, und baten das Personal, ein Budget für die zusätzlichen Stunden zu erstellen. Bei der nächsten Sitzung geht es um die Kosten, die voraussichtliche Besucherzahl und die Auswirkungen auf den Rest des Gebäudes.",
},
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"
}
}Referenz
Fehler
Ein Fehler antwortet mit seinem HTTP-Status und einem Body in dieser Form. Richte dich nach dem Code; die Nachricht sagt, was schiefging und was als Nächstes zu tun ist.
Fehler, die jede Route zurückgeben kann
| Status | Code | Bedeutung |
|---|---|---|
| 401 | key_in_url | Der Schlüssel wurde in der URL gesendet. Sende ihn im Authorization-Header. |
| 401 | no_key | Es wurde kein Schlüssel gesendet. |
| 401 | bad_key | Der Schlüssel ist ungültig oder wurde widerrufen. |
| 403 | out_of_scope | Dem Schlüssel fehlt die Berechtigung für diese Route. |
| 429 | rate_limited | Zu viele Anfragen für diesen Schlüssel. Warte die in Retry-After angegebene Zeit ab. |
| 403 | plan_lapsed | Der Tarif des Kontos enthält die API nicht mehr. |
| 413 | too_large | Die Anfrage ist zu groß. |
| 400 | bad_body | Der Anfragetext ist kein JSON-Objekt. |
| 413 | too_many_words | Die Anfrage enthält mehr Wörter als pro Anfrage erlaubt. Teile sie auf. Es wurde nichts angerechnet. |
| 402 | quota_exhausted | Das API-Wortkontingent des Tarifs für diesen Abrechnungszeitraum ist aufgebraucht und das Zusatzguthaben ist leer. Es wurden keine Wörter abgezogen. |
| 402 | quota_short | Der Aufruf braucht mehr Wörter, als im API-Wortkontingent des Tarifs und im Guthaben zusammen übrig sind. Es wurden keine Wörter abgezogen. |
| 402 | monthly_ceiling | Das Konto hat sein API-Limit für diesen Abrechnungszeitraum erreicht. Dieses gilt unabhängig vom Guthaben. Es wurden keine Wörter abgezogen. |
| 503 | store_unavailable | Der Schlüssel, der Wortverbrauch des Kontos oder die gespeicherte Schreibprobe konnte gerade nicht gelesen werden, oder diese Bereitstellung hat keinen Kontospeicher. Es wurde nichts ausgeführt und keine Wörter wurden abgezogen. |
Eine Anfrage reserviert ihre Wörter vor der Ausführung und gibt sie bei einem Fehler wieder frei. Wenn der Wortverbrauch in diesem Moment nicht gespeichert werden kann, bleiben die Wörter angerechnet: Eine fehlgeschlagene Anfrage weist dann darauf hin und enthält "recorded": false in ihren Verbrauchsdaten. Auch eine Batch-Antwort enthält dann "recorded": false in ihren Verbrauchsdaten. Die Wortzahlen werden nicht geschätzt.
{
"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"
}
}Limits
Alle hier angegebenen Werte entsprechen den Limits, die die API durchsetzt.
- Jeder Schlüssel erlaubt höchstens 60 Anfragen pro 60 Sekunden.
- Pro Schlüssel können höchstens 4 Aufrufe zur Erkennung (ein Batch zählt als ein Aufruf) und 2 Aufrufe zum natürlicheren Umschreiben, Umformulieren oder Zusammenfassen gleichzeitig laufen. Jeder weitere Aufruf wird mit 429 concurrency_limited und einem Retry-After beantwortet.
- Wenn die Systeme ausgelastet sind, werden Analysen von Pro-Konten auf der Website vor API-Aufrufen verarbeitet. Ein API-Aufruf muss dann möglicherweise warten.
- Ein Batch enthält höchstens 50 Texte.
- Pro Anfrage sind höchstens 20.000 Wörter erlaubt, ob als einzelner Text oder als Batch-Anfrage.
- Der Detektor prüft in jedem Tarif einzelne Texte mit bis zu 90.000 Zeichen, also etwa 10.000 Wörtern. Bei längeren Texten wird 413 text_too_long zurückgegeben, auch wenn die Anfrage innerhalb des Wortlimits liegt.
- Ein Konto kann bis zu 5 aktive Schlüssel haben. So lässt sich ein Schlüssel ohne Ausfallzeit austauschen.
Antwortobjekte
Die Objekte, die die Endpunkte zurückgeben, Feld für Feld.
Detection
| Feld | Typ | Beschreibung |
|---|---|---|
| figure | number | Der Wert von 0 bis 100: wie wahrscheinlich der Text maschinell verfasst wurde. |
| low | number | Die untere Grenze des Wertebereichs. |
| high | number | Die obere Grenze des Wertebereichs. |
| uncertainty | number | Die halbe Breite des Wertebereichs, in Punkten. |
| verdict | string | Der Bereich, in den der Wert fällt. Eine Einstufung, niemals eine Feststellung darüber, wer den Text geschrieben hat. Einer von: human, uncertain, ai. |
| confidence | string | Wie verlässlich die Analyse ist. Einer von: low, medium, high. |
| sentences | Array aus SentenceScore | Eine Analyse pro Satz. |
| words | integer | Die analysierten Wörter. |
| language | string | Die Sprache, als die der Text analysiert wurde. |
| model | string | Das Modell, das die Analyse erstellt hat. |
| calibrated | boolean | Ob es für die Sprache eine angepasste Kalibrierungskurve gibt. Bei false darf der Wert nicht als Ergebnis verwendet werden. |
| bandHumanFlagRate | number | null | Wie oft menschliche Texte in diesem Bereich bei unseren Messungen als maschinell eingestuft wurden, oder null. |
SentenceScore
| Feld | Typ | Beschreibung |
|---|---|---|
| text | string | Der Satz. |
| score | number | Von 0 bis 1: wie wahrscheinlich der Satz maschinell verfasst wurde. |
| verdict | string | Der Bereich, in den der Satz fällt. Einer von: human, uncertain, ai. |
Usage
| Feld | Typ | Beschreibung |
|---|---|---|
| recorded | boolean | true, wenn der Verbrauch gespeichert wurde. false nur dann, wenn ein Batch seine nicht analysierten Wörter nicht zurückerstatten konnte. Dann ist nur "words" vorhanden. |
| words | integer | Die Wörter, die dieser Aufruf verbraucht hat. |
| source | string | Woher sie stammen: aus dem API-Wortkontingent des Tarifs, dem Zusatzguthaben oder beidem. Einer von: plan, balance, plan_and_balance. |
| fromPlan | integer | Die vom API-Wortkontingent des Tarifs abgezogenen Wörter. Vorhanden, wenn recorded true ist. |
| fromBalance | integer | Die vom Zusatzguthaben abgezogenen Wörter. Vorhanden, wenn recorded true ist. |
| allowanceLeft | integer | null | Die nach diesem Aufruf verbleibenden Wörter des Tarifs für dieses Tool im aktuellen Abrechnungszeitraum. null bei einem Tool ohne eigenes Kontingent in diesem Tarif. Vorhanden, wenn recorded true ist. |
| balance | integer | Das nach diesem Aufruf verbleibende Zusatzguthaben. Vorhanden, wenn recorded true ist. |
RewriteResult
| Feld | Typ | Beschreibung |
|---|---|---|
| text | string | Der umgeschriebene Text. |
| before | Detection | Die Analyse deines Textes, oder null, wenn keine vorliegt. |
| after | Detection | Die Analyse der Überarbeitung, oder null. |
| passes | integer | Wie viele Überarbeitungen erstellt wurden, bevor diese ausgewählt wurde. |
| facts | object | Was die Faktenprüfungen ergeben haben und warum eine Überarbeitung gegebenenfalls nicht einwandfrei ist. |
| late | boolean | true, wenn die Überarbeitung beim Erreichen des Zeitlimits mit unvollständigen Prüfungen zurückgegeben wurde. |
GrammarIssue
| Feld | Typ | Beschreibung |
|---|---|---|
| offset | integer | Die Startposition des Problems im gesendeten Text, in UTF-16-Codeeinheiten (ein JavaScript-Stringindex). |
| length | integer | Wie viele UTF-16-Codeeinheiten des gesendeten Textes das Problem umfasst. |
| message | string | Was nicht stimmt. |
| shortMessage | string | Dasselbe in wenigen Worten. |
| category | string | Die Art des Problems. Einer von: grammar, spelling, punctuation, style, typography. |
| replacements | Array aus string | Korrekturvorschläge, die besten zuerst. |
| context | string | Der Text rund um das Problem. |
BatchResult
| Feld | Typ | Beschreibung |
|---|---|---|
| id | string | Die ID des Eintrags. |
| detection | Detection | Die Analyse, sofern der Eintrag eine zurückgegeben hat. |
| error | object | Warum der Eintrag keine Analyse zurückgegeben hat. |
Error
| Feld | Typ | Beschreibung |
|---|---|---|
| error | object | |
| usage | Usage | Der Verbrauch dieses Aufrufs. |
Der MCP-Server
Ein Agent kann dieselben Tools über das Model Context Protocol aufrufen. Der Server ist ausschließlich ein Client dieser API. Ein Agent erhält also genau dasselbe Analyseergebnis wie auf der Website.
- detect_textAnalysiert einen Text.
- detect_batchAnalysiert mehrere Texte.
- humanize_textSchreibt einen Text natürlicher um und prüft dabei die Fakten.
- paraphrase_textFormuliert einen Text um.
- summarize_textFasst einen Text zusammen.
- check_grammarPrüft Grammatik und Rechtschreibung.
Claude Code Verbindet sich online
Speichere deinen API-Schlüssel dort, wo der Client läuft, in einer Umgebungsvariablen namens BLURWRITE_API_KEY:
Führe das in einem Terminal aus:
Oder trage stattdessen das in .mcp.json ein:
.mcp.json{ "mcpServers": { "blurwrite": { "type": "http", "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${BLURWRITE_API_KEY}" } } } }Prüfe, ob es funktioniert: Frag deinen Assistenten „Prüfe diesen Absatz mit Blurwrite und nenne mir den Wertebereich und die Vertrauensbewertung.“
Deinen API-Schlüssel findest du in deinem Dashboard unter API. Lege einen Schlüssel nie in einer geteilten Datei oder einem Repository ab.
Claude Desktop Startet die Serverdatei
Lade die Serverdatei herunter und merke dir, wo du sie gespeichert hast. Sie braucht Node.js.
Serverdatei herunterladenIn der App: Settings > Developer > Edit Config.
Füge das in claude_desktop_config.json ein:
claude_desktop_config.json{ "mcpServers": { "blurwrite": { "command": "node", "args": [ "/path/to/server.mjs" ], "env": { "BLURWRITE_API_KEY": "YOUR_API_KEY" } } } }Beende Claude Desktop und starte es neu, damit der Server geladen wird.
Prüfe, ob es funktioniert: Frag deinen Assistenten „Prüfe diesen Absatz mit Blurwrite und nenne mir den Wertebereich und die Vertrauensbewertung.“
Deinen API-Schlüssel findest du in deinem Dashboard unter API. Lege einen Schlüssel nie in einer geteilten Datei oder einem Repository ab.
Claude (claude.ai) Demnächst verfügbar
Die Verbindung von claude.ai über eine Anmeldung bei deinem Blurwrite-Konto ist bald verfügbar. Bis dahin funktionieren dieselben Tools schon heute in Claude Desktop mit der Serverdatei oder in Claude Code, die Einrichtung findest du in ihren Tabs.
Nur wenn deine Organisation bei benutzerdefinierten Connectors die Option für Anfrage-Header hat: Füge die Adresse mit diesem Header hinzu.
ChatGPT Demnächst verfügbar
Die Verbindung von ChatGPT über eine Anmeldung bei deinem Blurwrite-Konto ist bald verfügbar. Bis dahin funktionieren dieselben Tools schon heute in Codex und Claude Code, die Einrichtung findest du in ihren Tabs.
Codex Verbindet sich online
Speichere deinen API-Schlüssel dort, wo der Client läuft, in einer Umgebungsvariablen namens BLURWRITE_API_KEY:
Führe das in einem Terminal aus:
Oder trage stattdessen das in ~/.codex/config.toml ein:
~/.codex/config.toml[mcp_servers.blurwrite] url = "https://blurwrite.com/api/mcp" bearer_token_env_var = "BLURWRITE_API_KEY"In der App: MCP servers > Add server > Streamable HTTP.
Prüfe, ob es funktioniert: Frag deinen Assistenten „Prüfe diesen Absatz mit Blurwrite und nenne mir den Wertebereich und die Vertrauensbewertung.“
Deinen API-Schlüssel findest du in deinem Dashboard unter API. Lege einen Schlüssel nie in einer geteilten Datei oder einem Repository ab.
Cursor Verbindet sich online
Speichere deinen API-Schlüssel dort, wo der Client läuft, in einer Umgebungsvariablen namens BLURWRITE_API_KEY:
Füge das in ~/.cursor/mcp.json ein:
~/.cursor/mcp.json{ "mcpServers": { "blurwrite": { "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Prüfe, ob es funktioniert: Frag deinen Assistenten „Prüfe diesen Absatz mit Blurwrite und nenne mir den Wertebereich und die Vertrauensbewertung.“
Deinen API-Schlüssel findest du in deinem Dashboard unter API. Lege einen Schlüssel nie in einer geteilten Datei oder einem Repository ab.
VS Code (Copilot) Verbindet sich online
Füge das in .vscode/mcp.json ein:
.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}" } } } }Wenn der Server startet, fragt VS Code einmal nach deinem Schlüssel und speichert ihn.
Prüfe, ob es funktioniert: Frag deinen Assistenten „Prüfe diesen Absatz mit Blurwrite und nenne mir den Wertebereich und die Vertrauensbewertung.“
Deinen API-Schlüssel findest du in deinem Dashboard unter API. Lege einen Schlüssel nie in einer geteilten Datei oder einem Repository ab.
Windsurf Verbindet sich online
Speichere deinen API-Schlüssel dort, wo der Client läuft, in einer Umgebungsvariablen namens BLURWRITE_API_KEY:
In der App: Cascade > ... > Open MCP config file.
Füge das in mcp_config.json ein:
mcp_config.json{ "mcpServers": { "blurwrite": { "serverUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Beende Windsurf und starte es neu, damit der Server geladen wird.
Prüfe, ob es funktioniert: Frag deinen Assistenten „Prüfe diesen Absatz mit Blurwrite und nenne mir den Wertebereich und die Vertrauensbewertung.“
Deinen API-Schlüssel findest du in deinem Dashboard unter API. Lege einen Schlüssel nie in einer geteilten Datei oder einem Repository ab.
Gemini CLI Verbindet sich online
Speichere deinen API-Schlüssel dort, wo der Client läuft, in einer Umgebungsvariablen namens BLURWRITE_API_KEY:
Führe das in einem Terminal aus:
Oder trage stattdessen das in ~/.gemini/settings.json ein:
~/.gemini/settings.json{ "mcpServers": { "blurwrite": { "httpUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }Prüfe, ob es funktioniert: Frag deinen Assistenten „Prüfe diesen Absatz mit Blurwrite und nenne mir den Wertebereich und die Vertrauensbewertung.“
Deinen API-Schlüssel findest du in deinem Dashboard unter API. Lege einen Schlüssel nie in einer geteilten Datei oder einem Repository ab.
Other clients Online, per Bridge oder Datei
Ein Client, der sich über HTTP mit entfernten MCP-Servern verbindet, braucht nur diese zwei Werte:
Ein Client, der nur lokale Server startet, erreicht die Adresse über die Open-Source-Bridge mcp-remote (sie braucht Node.js):
Oder starte unsere Serverdatei selbst:
Serverdatei herunterladen
Deinen API-Schlüssel findest du in deinem Dashboard unter API. Lege einen Schlüssel nie in einer geteilten Datei oder einem Repository ab.
Jedes Analyseergebnis, das ein Agent erhält, enthält den Messwert, die zugehörige Unsicherheit und den Kalibrierungsstatus. So kann der Agent erklären, was das Ergebnis bedeutet und wann es nicht verwendet werden darf.
Dein Schlüssel
Melde dich an und erstelle dann einen Schlüssel in deinem Dashboard.
Hol dir deinen Schlüssel im Dashboard
Auf dieser Seite werden niemals Schlüssel erstellt.
Was die API und der MCP-Server machen