Na tej stronie
Pierwsze kroki
Przegląd
Wersja API jest częścią ścieżki: /api/v1. Każdy punkt końcowy przyjmuje POST z treścią JSON i odpowiada w JSON, także przy błędach.
Bazowy URL https://blurwrite.com
- POST /api/v1/detectSprawdź jeden tekst
- POST /api/v1/detect/batchSprawdź kilka tekstów
- POST /api/v1/humanizeNadaj tekstowi naturalne brzmienie
- POST /api/v1/paraphraseSparafrazuj tekst
- POST /api/v1/summarizePodsumuj tekst
- POST /api/v1/grammarSprawdź gramatykę
Tylko na stronie, nie w API: licznik słów, licznik znaków, wykrywacz plagiatu i opcja „Poświęć więcej czasu” w humanizerze.
Wygenerowana z dokumentu OpenAPI, więc zawiera dokładnie te punkty końcowe i pola, które akceptuje API. Dokument OpenAPI
Twoje pierwsze wywołanie
Tekst musi mieć co najmniej 50 słów.
Najpierw sprawdź "calibrated": gdy ma wartość false, język nie ma jeszcze dopasowanej krzywej, więc podanej wartości nie wolno używać jako wyniku.
Każda wartość jest przedstawiona jako jej typ. Rzeczywista odpowiedź zawiera wynik dla twojego tekstu.
curl -X POST https://blurwrite.com/api/v1/detect \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."}'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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."
}),
})
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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"figure": "number, od 0 do 100",
"low": "number, od 0 do 100",
"high": "number, od 0 do 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, od 0 do 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"
}
}Uwierzytelnianie
Wyślij klucz w nagłówku Authorization jako token typu bearer. Klucz w adresie URL zostanie odrzucony.
Klucz ma zakresy uprawnień: detect, rewrite, summarize i grammar. Punkt końcowy zwraca 403 out_of_scope, gdy klucz nie ma wymaganego zakresu.
Authorization: Bearer YOUR_API_KEYPunkty końcowe
POST /api/v1/detect
Sprawdź jeden tekst. Wynik detektora dla jednego tekstu: wartość od 0 do 100, przedział wokół niej, wynik dla każdego zdania i informacja o kalibracji języka.
Zakres uprawnień klucza: detect
Treść żądania
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
| text | string | tak | Tekst do sprawdzenia lub przeredagowania. |
| language | string | nie | Kod języka, np. "en" lub "de". Jeśli go pominiesz, język zostanie rozpoznany na podstawie tekstu. |
| contentType | string | nie | Rodzaj tekstu, np. "essay" lub "email", gdy analiza ma korzystać z krzywej dla tego rodzaju tekstu. |
Odpowiedź
| Pole | Typ | Opis |
|---|---|---|
| figure | number | Wynik od 0 do 100: prawdopodobieństwo, że tekst został napisany maszynowo. |
| low | number | Dolna granica przedziału wokół wyniku. |
| high | number | Górna granica przedziału wokół wyniku. |
| uncertainty | number | Połowa szerokości przedziału, w punktach. |
| verdict | string | Przedział, w którym mieści się wynik; to przedział, nigdy ustalenie autorstwa tekstu. Jedna z wartości: human, uncertain, ai. |
| confidence | string | Na ile można polegać na wyniku. Jedna z wartości: low, medium, high. |
| sentences | tablica elementów SentenceScore | Wynik dla każdego zdania. |
| words | integer | Sprawdzone słowa. |
| language | string | Język, w którym analizowano tekst. |
| model | string | Model, który wygenerował wynik. |
| calibrated | boolean | Czy język ma dopasowaną krzywą. Gdy wartość to false, podanej wartości nie wolno używać jako wyniku. |
| bandHumanFlagRate | number | null | Jak często w naszych pomiarach tekst człowieka w tym przedziale uznawano za maszynowy lub null. |
| usage | Usage | Co zostało naliczone w tym wywołaniu. |
Błędy specyficzne dla tego punktu końcowego
| Status | Kod | Znaczenie |
|---|---|---|
| 400 | no_text | W treści żądania brakuje pola "text". |
| 422 | too_short | Tekst jest krótszy niż wymagana minimalna długość. |
| 413 | text_too_long | Tekst jest dłuższy, niż silnik może sprawdzić w jednym wywołaniu. Podziel go. Nic nie naliczono. |
| 422 | not_calibrated | Tego języka nie można jeszcze analizować. |
| 503 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
| 502 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
| 503 | engine_starting | Silnik się uruchamia i nie był gotowy na czas. Nic nie naliczono. Spróbuj ponownie za minutę. |
| 503 | engine_busy | Silnik był zajęty i analiza nie mogła rozpocząć się na czas; analizy użytkowników Pro na stronie mają pierwszeństwo przed wywołaniami API. Nic nie naliczono. Spróbuj ponownie za chwilę. |
| 504 | engine_timeout | Silnik nie ukończył analizy tekstu na czas. Nic nie naliczono. Spróbuj ponownie lub wyślij krótszy tekst. |
| 429 | concurrency_limited | Ten klucz ma już maksymalną dozwoloną liczbę trwających wywołań tego typu. Poczekaj na zakończenie jednego z nich lub odczekaj czas podany w Retry-After. |
curl -X POST https://blurwrite.com/api/v1/detect \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."}'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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."
}),
})
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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"figure": "number, od 0 do 100",
"low": "number, od 0 do 100",
"high": "number, od 0 do 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, od 0 do 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
Sprawdź kilka tekstów. Jedno wywołanie może zawierać tyle tekstów, ile wynosi limit partii. Przed wywołaniem musisz mieć dostępne słowa dla każdego tekstu, który może zostać sprawdzony (50 słów lub więcej); słowa tekstów, dla których nie uzyskano wyniku, są później zwracane. Błąd jednego tekstu nie powoduje błędu całej partii.
Zakres uprawnień klucza: detect
Treść żądania
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
| items | tablica elementów object | tak | Teksty, każdy z własnym polem "text" i opcjonalnymi polami "id", "language" i "contentType". |
| items[].id | string | nie | Twój identyfikator elementu, zwracany wraz z wynikiem. Jeśli go pominiesz, zostanie użyta pozycja elementu. |
| items[].text | string | tak | Tekst do sprawdzenia lub przeredagowania. |
| items[].language | string | nie | Kod języka, np. "en" lub "de". Jeśli go pominiesz, język zostanie rozpoznany na podstawie tekstu. |
| items[].contentType | string | nie | Rodzaj tekstu, np. "essay" lub "email", gdy analiza ma korzystać z krzywej dla tego rodzaju tekstu. |
Odpowiedź
| Pole | Typ | Opis |
|---|---|---|
| results | tablica elementów BatchResult | Jeden wynik na element, w kolejności wysłania. |
| usage | Usage | Co zostało naliczone w tym wywołaniu. |
Błędy specyficzne dla tego punktu końcowego
| Status | Kod | Znaczenie |
|---|---|---|
| 400 | batch_empty | W treści żądania brakuje pola "items" lub lista jest pusta. |
| 413 | batch_too_large | Partia zawiera więcej elementów, niż pozwala limit. |
| 429 | concurrency_limited | Ten klucz ma już maksymalną dozwoloną liczbę trwających wywołań tego typu. Poczekaj na zakończenie jednego z nich lub odczekaj czas podany w Retry-After. |
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":"Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."},{"id":"2","text":"Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."}]}'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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."
},
{
"id": "2",
"text": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."
}
]
}),
})
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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku.",
},
{
"id": "2",
"text": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku.",
},
],
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"results": [
{
"id": "string",
"detection": {
"figure": "number, od 0 do 100",
"low": "number, od 0 do 100",
"high": "number, od 0 do 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, od 0 do 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
Nadaj tekstowi naturalne brzmienie. Humanizer z weryfikacją faktów: liczby, nazwy i cytaty pozostają bez zmian, a przeredagowany tekst ze zmienionym faktem jest poprawiany lub zgłaszany. Tryb "custom" (Pro) pisze w twoim stylu, rozpoznanym na podstawie próbki twojego tekstu.
Przez API humanizer wykonuje standardowe przepisanie. „Poświęć więcej czasu” jest dostępne tylko na stronie.
Zakres uprawnień klucza: rewrite
Treść żądania
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
| text | string | tak | Tekst do sprawdzenia lub przeredagowania. |
| mode | string | nie | Tryb przeredagowania. Jedna z wartości: natural, formal, simple, academic, creative, shorten, expand, custom. Domyślnie: natural. |
| style_sample | string | nie | W trybie "custom": próbka twojego tekstu, od 150 do 2000 słów, analizowana na serwerze. Jeśli ją pominiesz, zostanie użyta próbka zapisana na twoim koncie. |
| tab | string | nie | Zakładka narzędzia do humanizacji: określa styl przeredagowanego tekstu. Opcja Standard zachowuje styl tekstu wejściowego. Jedna z wartości: standard, academic, professional, casual. Domyślnie: standard. |
| strength | string | nie | Poziom zwykły zachowuje treść i styl. Poziom agresywny może zmienić kolejność treści i pominąć rozwinięcia, ale zachowuje wszystkie główne myśli. Niektóre fragmenty mogą brzmieć nietypowo. Jedna z wartości: regular, aggressive. Domyślnie: regular. |
| ownTouch | string | nie | Szczegół, przykład lub opinia wyrażone twoimi słowami, do 400 znaków, które zostaną wplecione w przeredagowany tekst. |
| language | string | nie | Kod języka, np. "en" lub "de". Jeśli go pominiesz, język zostanie rozpoznany na podstawie tekstu. |
Odpowiedź
| Pole | Typ | Opis |
|---|---|---|
| text | string | Przeredagowany tekst. |
| before | Detection | Wynik detektora dla twojego tekstu lub null, gdy go nie ma. |
| after | Detection | Wynik detektora dla przeredagowanego tekstu lub null. |
| passes | integer | Liczba wersji tekstu utworzonych przed wybraniem tej wersji. |
| facts | object | Co wykazała weryfikacja faktów i dlaczego przeredagowany tekst nie przeszedł jej pomyślnie, jeśli tak się stało. |
| late | boolean | True, gdy przeredagowany tekst zwrócono po osiągnięciu limitu czasu, bez ukończonej weryfikacji. |
| usage | Usage | Co zostało naliczone w tym wywołaniu. |
Błędy specyficzne dla tego punktu końcowego
| Status | Kod | Znaczenie |
|---|---|---|
| 400 | no_text | W treści żądania brakuje pola "text". |
| 422 | too_short | Tekst jest krótszy niż wymagana minimalna długość. |
| 400 | unknown_mode | Ten punkt końcowy nie oferuje wybranego trybu. |
| 400 | unknown_option | Ten punkt końcowy nie obsługuje wybranej zakładki lub poziomu zmian. |
| 402 | plan_required | Tryb, karta, siła zmian lub własne wskazówki wymagają planu, którego konto nie ma; tryb "custom" wymaga Pro. Nic nie naliczono. |
| 400 | no_sample | Tryb "custom" wymaga próbki tekstu, wysłanej lub zapisanej na koncie. |
| 400 | sample_too_short | Próbka tekstu jest krótsza niż wymagana minimalna długość. |
| 400 | sample_too_long | Próbka tekstu przekracza maksymalną długość. |
| 429 | concurrency_limited | Ten klucz ma już maksymalną dozwoloną liczbę trwających wywołań tego typu. Poczekaj na zakończenie jednego z nich lub odczekaj czas podany w Retry-After. |
| 422 | no_rewrite | Silnik odpowiedział, ale żaden szkic nie przeszedł kontroli (pusty, odmowa lub kopia tekstu). Nic nie naliczono. |
| 503 | timeout | Przeredagowanie trwało zbyt długo i zostało zatrzymane. Nic nie naliczono. |
| 503 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
| 502 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
curl -X POST https://blurwrite.com/api/v1/humanize \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."}'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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."
}),
})
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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"before": {
"figure": "number, od 0 do 100",
"low": "number, od 0 do 100",
"high": "number, od 0 do 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, od 0 do 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"after": {
"figure": "number, od 0 do 100",
"low": "number, od 0 do 100",
"high": "number, od 0 do 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, od 0 do 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
Sparafrazuj tekst. Parafraza z taką samą listą trybów jak w narzędziu do parafrazowania.
Zakres uprawnień klucza: rewrite
Treść żądania
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
| text | string | tak | Tekst do sprawdzenia lub przeredagowania. |
| mode | string | nie | Tryb przeredagowania. Jedna z wartości: standard, fluency, formal, academic, simple, creative, expand, shorten. Domyślnie: standard. |
| strength | string | nie | Jak bardzo przeredagowany tekst może odbiegać od oryginału. Jedna z wartości: readable, balanced, strong. Domyślnie: balanced. |
| readability | string | nie | Rejestr językowy tekstu. Jedna z wartości: casual, professional, academic, creative. Domyślnie: professional. |
| purpose | string | nie | Przeznaczenie tekstu. Jedna z wartości: general, essay, article, email, marketing, report, story. Domyślnie: general. |
| synonyms | string | nie | Jak swobodnie można zastępować słowa. Jedna z wartości: few, some, many. Domyślnie: some. |
| freezeWords | tablica elementów string | nie | Słowa i frazy, które muszą pozostać dokładnie w podanej formie: maksymalnie 25, każda do 60 znaków. Ich słowa wliczają się do słów wywołania. |
| customInstruction | string | nie | Twoja krótka instrukcja przeredagowania, do 500 znaków. Jej słowa wliczają się do słów wywołania. |
| language | string | nie | Kod języka, np. "en" lub "de". Jeśli go pominiesz, język zostanie rozpoznany na podstawie tekstu. |
| closedLoop | boolean | nie | Ustaw false, aby pominąć zamkniętą pętlę. Domyślnie: true. |
Odpowiedź
| Pole | Typ | Opis |
|---|---|---|
| text | string | Przeredagowany tekst. |
| before | Detection | Wynik detektora dla twojego tekstu lub null, gdy go nie ma. |
| after | Detection | Wynik detektora dla przeredagowanego tekstu lub null. |
| passes | integer | Liczba wersji tekstu utworzonych przed wybraniem tej wersji. |
| facts | object | Co wykazała weryfikacja faktów i dlaczego przeredagowany tekst nie przeszedł jej pomyślnie, jeśli tak się stało. |
| late | boolean | True, gdy przeredagowany tekst zwrócono po osiągnięciu limitu czasu, bez ukończonej weryfikacji. |
| usage | Usage | Co zostało naliczone w tym wywołaniu. |
Błędy specyficzne dla tego punktu końcowego
| Status | Kod | Znaczenie |
|---|---|---|
| 400 | no_text | W treści żądania brakuje pola "text". |
| 422 | too_short | Tekst jest krótszy niż wymagana minimalna długość. |
| 400 | unknown_mode | Ten punkt końcowy nie oferuje wybranego trybu. |
| 400 | option_invalid | freezeWords nie jest listą słów ani wyrażeń. Nic nie zostało naliczone. |
| 400 | option_too_long | freezeWords lub customInstruction przekracza swój limit. Nic nie zostało naliczone. |
| 429 | concurrency_limited | Ten klucz ma już maksymalną dozwoloną liczbę trwających wywołań tego typu. Poczekaj na zakończenie jednego z nich lub odczekaj czas podany w Retry-After. |
| 422 | no_rewrite | Silnik odpowiedział, ale żaden szkic nie przeszedł kontroli (pusty, odmowa lub kopia tekstu). Nic nie naliczono. |
| 503 | timeout | Przeredagowanie trwało zbyt długo i zostało zatrzymane. Nic nie naliczono. |
| 503 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
| 502 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
curl -X POST https://blurwrite.com/api/v1/paraphrase \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."}'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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."
}),
})
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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"before": {
"figure": "number, od 0 do 100",
"low": "number, od 0 do 100",
"high": "number, od 0 do 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, od 0 do 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"after": {
"figure": "number, od 0 do 100",
"low": "number, od 0 do 100",
"high": "number, od 0 do 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, od 0 do 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
Podsumuj tekst. Podsumowanie w formie kluczowych zdań, akapitu lub listy punktów.
Zakres uprawnień klucza: summarize
Treść żądania
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
| text | string | tak | Tekst do sprawdzenia lub przeredagowania. |
| mode | string | nie | Forma podsumowania. Jedna z wartości: key-sentences, paragraph, bullets. Domyślnie: key-sentences. |
| length | string | nie | Długość podsumowania. Jedna z wartości: short, medium, long. Domyślnie: medium. |
Odpowiedź
| Pole | Typ | Opis |
|---|---|---|
| text | string | Podsumowanie. |
| usage | Usage | Co zostało naliczone w tym wywołaniu. |
Błędy specyficzne dla tego punktu końcowego
| Status | Kod | Znaczenie |
|---|---|---|
| 400 | no_text | W treści żądania brakuje pola "text". |
| 422 | too_short | Tekst jest krótszy niż wymagana minimalna długość. |
| 429 | concurrency_limited | Ten klucz ma już maksymalną dozwoloną liczbę trwających wywołań tego typu. Poczekaj na zakończenie jednego z nich lub odczekaj czas podany w Retry-After. |
| 503 | timeout | Przeredagowanie trwało zbyt długo i zostało zatrzymane. Nic nie naliczono. |
| 503 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
| 502 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
curl -X POST https://blurwrite.com/api/v1/summarize \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."}'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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."
}),
})
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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku.",
},
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
Sprawdź gramatykę. Problemy z gramatyką, pisownią, interpunkcją i stylem, każdy z położeniem w tekście i propozycjami poprawek.
Zakres uprawnień klucza: grammar
Treść żądania
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
| text | string | tak | Tekst do sprawdzenia lub przeredagowania. |
| language | string | nie | Kod języka do sprawdzenia, np. "en-US" lub "de-DE". Domyślnie: en-US. |
Odpowiedź
| Pole | Typ | Opis |
|---|---|---|
| issues | tablica elementów GrammarIssue | Znalezione problemy w kolejności występowania. |
| usage | Usage | Co zostało naliczone w tym wywołaniu. |
Błędy specyficzne dla tego punktu końcowego
| Status | Kod | Znaczenie |
|---|---|---|
| 400 | no_text | W treści żądania brakuje pola "text". |
| 503 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
| 502 | engine_unavailable | Silnik nie odpowiedział. Nic nie naliczono. |
| 503 | engine_starting | Silnik się uruchamia i nie był gotowy na czas. Nic nie naliczono. Spróbuj ponownie za minutę. |
| 504 | engine_timeout | Silnik nie ukończył analizy tekstu na czas. Nic nie naliczono. Spróbuj ponownie lub wyślij krótszy tekst. |
curl -X POST https://blurwrite.com/api/v1/grammar \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."}'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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku."
}),
})
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": "Komitet zebrał się we wtorek, aby omówić plan nowej biblioteki. Członkowie zgodzili się, że czytelnia powinna być otwarta dłużej w dni powszednie, i poprosili pracowników o przygotowanie budżetu na dodatkowe godziny. Na kolejnym spotkaniu omówione zostaną koszty, przewidywana liczba odwiedzających i wpływ na pozostałą część budynku.",
},
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"
}
}Dokumentacja
Błędy
Błąd odpowiada swoim statusem HTTP i treścią w tej postaci. Kieruj się kodem; komunikat mówi, co poszło nie tak i co zrobić dalej.
Błędy wspólne dla wszystkich punktów końcowych
| Status | Kod | Znaczenie |
|---|---|---|
| 401 | key_in_url | Klucz wysłano w adresie URL. Wyślij go w nagłówku Authorization. |
| 401 | no_key | Nie wysłano klucza. |
| 401 | bad_key | Klucz jest nieprawidłowy lub został unieważniony. |
| 403 | out_of_scope | Klucz nie ma zakresu uprawnień wymaganego przez ten punkt końcowy. |
| 429 | rate_limited | Zbyt wiele żądań dla tego klucza. Odczekaj czas podany w Retry-After. |
| 403 | plan_lapsed | Plan konta nie obejmuje już API. |
| 413 | too_large | Żądanie jest zbyt duże. |
| 400 | bad_body | Treść żądania nie jest obiektem JSON. |
| 413 | too_many_words | Wywołanie zawiera więcej słów, niż pozwala limit. Podziel tekst. Nic nie zostało naliczone. |
| 402 | quota_exhausted | Pula słów API w planie na ten okres rozliczeniowy została wyczerpana, a saldo doładowania jest puste. Nic nie naliczono. |
| 402 | quota_short | Wywołanie wymaga więcej słów niż łącznie pozostało w puli słów API w planie i w saldzie doładowania. Nic nie naliczono. |
| 402 | monthly_ceiling | Konto osiągnęło limit API na ten okres rozliczeniowy, który obowiązuje niezależnie od salda. Nic nie naliczono. |
| 503 | store_unavailable | Nie udało się teraz odczytać klucza, liczby słów na koncie lub zapisanej próbki tekstu albo to wdrożenie nie ma magazynu danych kont. Nic nie uruchomiono ani nie naliczono. |
Wywołanie rezerwuje słowa przed rozpoczęciem i zwraca je w razie niepowodzenia. Jeśli w tym momencie nie da się zapisać liczby słów, pozostają one naliczone: nieudane wywołanie informuje o tym i zawiera "recorded": false w danych użycia, odpowiedź wsadowa również zawiera "recorded": false w danych użycia. Liczba słów nie jest szacowana.
{
"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"
}
}Limity
Każda podana tu wartość jest egzekwowana przez API.
- Każdy klucz pozwala wysłać maksymalnie 60 żądań co 60 sekund.
- Każdy klucz pozwala na maksymalnie 4 jednoczesnych wywołań wykrywania (pakiet liczy się jako jedno) oraz 2 wywołań humanizacji, parafrazowania lub streszczania; kolejne wywołanie otrzymuje odpowiedź 429 concurrency_limited z nagłówkiem Retry-After.
- Gdy silniki są zajęte, analizy z kont Pro na stronie mają pierwszeństwo przed wywołaniami API, więc wywołanie API może czekać na swoją kolej.
- Pakiet może zawierać maksymalnie 50 tekstów.
- Jedno wywołanie może zawierać maksymalnie 20 000 słów, w jednym tekście lub w całej partii.
- Detektor analizuje pojedynczy tekst o długości do 90 000 znaków, czyli około 10 000 słów, w każdym planie. Dłuższy tekst zwraca odpowiedź 413 text_too_long, nawet jeśli mieści się w limicie słów wywołania.
- Konto może mieć do 5 aktywnych kluczy, co pozwala wymienić klucz bez przerwy w działaniu.
Obiekty odpowiedzi
Obiekty zwracane przez punkty końcowe, pole po polu.
Detection
| Pole | Typ | Opis |
|---|---|---|
| figure | number | Wynik od 0 do 100: prawdopodobieństwo, że tekst został napisany maszynowo. |
| low | number | Dolna granica przedziału wokół wyniku. |
| high | number | Górna granica przedziału wokół wyniku. |
| uncertainty | number | Połowa szerokości przedziału, w punktach. |
| verdict | string | Przedział, w którym mieści się wynik; to przedział, nigdy ustalenie autorstwa tekstu. Jedna z wartości: human, uncertain, ai. |
| confidence | string | Na ile można polegać na wyniku. Jedna z wartości: low, medium, high. |
| sentences | tablica elementów SentenceScore | Wynik dla każdego zdania. |
| words | integer | Sprawdzone słowa. |
| language | string | Język, w którym analizowano tekst. |
| model | string | Model, który wygenerował wynik. |
| calibrated | boolean | Czy język ma dopasowaną krzywą. Gdy wartość to false, podanej wartości nie wolno używać jako wyniku. |
| bandHumanFlagRate | number | null | Jak często w naszych pomiarach tekst człowieka w tym przedziale uznawano za maszynowy lub null. |
SentenceScore
| Pole | Typ | Opis |
|---|---|---|
| text | string | Zdanie. |
| score | number | Prawdopodobieństwo od 0 do 1, że zdanie zostało napisane maszynowo. |
| verdict | string | Przedział, w którym mieści się zdanie. Jedna z wartości: human, uncertain, ai. |
Usage
| Pole | Typ | Opis |
|---|---|---|
| recorded | boolean | True, gdy zapisano naliczenie. False tylko wtedy, gdy nie udało się zwrócić słów niesprawdzonych tekstów z partii; wtedy obecne jest tylko pole "words". |
| words | integer | Słowa naliczone w tym wywołaniu. |
| source | string | Skąd pochodziły: z puli słów API w planie, z doładowania lub z obu źródeł. Jedna z wartości: plan, balance, plan_and_balance. |
| fromPlan | integer | Słowa pobrane z puli słów API w planie. Obecne, gdy recorded ma wartość true. |
| fromBalance | integer | Słowa pobrane z doładowania. Obecne, gdy recorded ma wartość true. |
| allowanceLeft | integer | null | Słowa z planu pozostałe dla tego narzędzia po wywołaniu w bieżącym okresie rozliczeniowym. Null dla narzędzia bez puli w tym planie. Obecne, gdy recorded ma wartość true. |
| balance | integer | Saldo doładowania po wywołaniu. Obecne, gdy recorded ma wartość true. |
RewriteResult
| Pole | Typ | Opis |
|---|---|---|
| text | string | Przeredagowany tekst. |
| before | Detection | Wynik detektora dla twojego tekstu lub null, gdy go nie ma. |
| after | Detection | Wynik detektora dla przeredagowanego tekstu lub null. |
| passes | integer | Liczba wersji tekstu utworzonych przed wybraniem tej wersji. |
| facts | object | Co wykazała weryfikacja faktów i dlaczego przeredagowany tekst nie przeszedł jej pomyślnie, jeśli tak się stało. |
| late | boolean | True, gdy przeredagowany tekst zwrócono po osiągnięciu limitu czasu, bez ukończonej weryfikacji. |
GrammarIssue
| Pole | Typ | Opis |
|---|---|---|
| offset | integer | Początek problemu w wysłanym tekście, w jednostkach kodowych UTF-16 (indeks ciągu w JavaScript). |
| length | integer | Liczba jednostek kodowych UTF-16 wysłanego tekstu objętych problemem. |
| message | string | Opis błędu. |
| shortMessage | string | Ten sam opis w kilku słowach. |
| category | string | Rodzaj problemu. Jedna z wartości: grammar, spelling, punctuation, style, typography. |
| replacements | tablica elementów string | Proponowane poprawki, od najlepszej. |
| context | string | Tekst wokół problemu. |
BatchResult
| Pole | Typ | Opis |
|---|---|---|
| id | string | Identyfikator elementu. |
| detection | Detection | Wynik, jeśli uzyskano go dla elementu. |
| error | object | Powód braku wyniku dla elementu. |
Error
| Pole | Typ | Opis |
|---|---|---|
| error | object | |
| usage | Usage | Co zostało naliczone w tym wywołaniu. |
Serwer MCP
Agent może korzystać z tych samych narzędzi przez Model Context Protocol. Serwer jest wyłącznie klientem tego API, więc agent otrzymuje dokładnie taki sam wynik jak na stronie.
- detect_textAnalizuje jeden tekst.
- detect_batchAnalizuje kilka tekstów.
- humanize_textNadaje tekstowi naturalne brzmienie i weryfikuje fakty.
- paraphrase_textParafrazuje tekst.
- summarize_textStreszcza tekst.
- check_grammarSprawdza gramatykę i pisownię.
Claude Code Łączy się online
Przechowuj klucz API w zmiennej środowiskowej o nazwie BLURWRITE_API_KEY, tam gdzie działa klient:
Uruchom to w terminalu:
Możesz też umieścić to w .mcp.json:
.mcp.json{ "mcpServers": { "blurwrite": { "type": "http", "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${BLURWRITE_API_KEY}" } } } }Sprawdź, czy działa: poproś asystenta „Sprawdź ten akapit w Blurwrite i podaj mi zakres oraz ocenę pewności.”
Twój klucz API znajdziesz w panelu, w sekcji API. Nigdy nie umieszczaj klucza we współdzielonym pliku ani w repozytorium.
Claude Desktop Używa pliku serwera
Pobierz plik serwera i zapamiętaj, gdzie go zapisano. Wymaga Node.js.
Pobierz plik serweraW aplikacji: Settings > Developer > Edit Config.
Dodaj to do claude_desktop_config.json:
claude_desktop_config.json{ "mcpServers": { "blurwrite": { "command": "node", "args": [ "/path/to/server.mjs" ], "env": { "BLURWRITE_API_KEY": "YOUR_API_KEY" } } } }Zamknij i ponownie uruchom Claude Desktop, aby wczytał serwer.
Sprawdź, czy działa: poproś asystenta „Sprawdź ten akapit w Blurwrite i podaj mi zakres oraz ocenę pewności.”
Twój klucz API znajdziesz w panelu, w sekcji API. Nigdy nie umieszczaj klucza we współdzielonym pliku ani w repozytorium.
Claude (claude.ai) Wkrótce
Wkrótce będzie można połączyć claude.ai, logując się na swoje konto Blurwrite. Do tego czasu te same narzędzia działają już w Claude Desktop z plikiem serwera lub w Claude Code, a konfigurację znajdziesz w ich kartach.
Tylko jeśli twoja organizacja ma opcję nagłówków żądań dla niestandardowych konektorów: dodaj adres z tym nagłówkiem.
ChatGPT Wkrótce
Wkrótce będzie można połączyć ChatGPT, logując się na swoje konto Blurwrite. Do tego czasu te same narzędzia działają już w Codex i Claude Code, a konfigurację znajdziesz w ich kartach.
Codex Łączy się online
Przechowuj klucz API w zmiennej środowiskowej o nazwie BLURWRITE_API_KEY, tam gdzie działa klient:
Uruchom to w terminalu:
Możesz też umieścić to w ~/.codex/config.toml:
~/.codex/config.toml[mcp_servers.blurwrite] url = "https://blurwrite.com/api/mcp" bearer_token_env_var = "BLURWRITE_API_KEY"W aplikacji: MCP servers > Add server > Streamable HTTP.
Sprawdź, czy działa: poproś asystenta „Sprawdź ten akapit w Blurwrite i podaj mi zakres oraz ocenę pewności.”
Twój klucz API znajdziesz w panelu, w sekcji API. Nigdy nie umieszczaj klucza we współdzielonym pliku ani w repozytorium.
Cursor Łączy się online
Przechowuj klucz API w zmiennej środowiskowej o nazwie BLURWRITE_API_KEY, tam gdzie działa klient:
Dodaj to do ~/.cursor/mcp.json:
~/.cursor/mcp.json{ "mcpServers": { "blurwrite": { "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Sprawdź, czy działa: poproś asystenta „Sprawdź ten akapit w Blurwrite i podaj mi zakres oraz ocenę pewności.”
Twój klucz API znajdziesz w panelu, w sekcji API. Nigdy nie umieszczaj klucza we współdzielonym pliku ani w repozytorium.
VS Code (Copilot) Łączy się online
Dodaj to do .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}" } } } }Przy uruchomieniu serwera VS Code raz poprosi o klucz i go zapamięta.
Sprawdź, czy działa: poproś asystenta „Sprawdź ten akapit w Blurwrite i podaj mi zakres oraz ocenę pewności.”
Twój klucz API znajdziesz w panelu, w sekcji API. Nigdy nie umieszczaj klucza we współdzielonym pliku ani w repozytorium.
Windsurf Łączy się online
Przechowuj klucz API w zmiennej środowiskowej o nazwie BLURWRITE_API_KEY, tam gdzie działa klient:
W aplikacji: Cascade > ... > Open MCP config file.
Dodaj to do mcp_config.json:
mcp_config.json{ "mcpServers": { "blurwrite": { "serverUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Zamknij i ponownie uruchom Windsurf, aby wczytał serwer.
Sprawdź, czy działa: poproś asystenta „Sprawdź ten akapit w Blurwrite i podaj mi zakres oraz ocenę pewności.”
Twój klucz API znajdziesz w panelu, w sekcji API. Nigdy nie umieszczaj klucza we współdzielonym pliku ani w repozytorium.
Gemini CLI Łączy się online
Przechowuj klucz API w zmiennej środowiskowej o nazwie BLURWRITE_API_KEY, tam gdzie działa klient:
Uruchom to w terminalu:
Możesz też umieścić to w ~/.gemini/settings.json:
~/.gemini/settings.json{ "mcpServers": { "blurwrite": { "httpUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }Sprawdź, czy działa: poproś asystenta „Sprawdź ten akapit w Blurwrite i podaj mi zakres oraz ocenę pewności.”
Twój klucz API znajdziesz w panelu, w sekcji API. Nigdy nie umieszczaj klucza we współdzielonym pliku ani w repozytorium.
Other clients Online, przez most lub plik
Klient, który łączy się ze zdalnymi serwerami MCP przez HTTP, potrzebuje tylko tych dwóch wartości:
Klient, który uruchamia tylko serwery lokalne, może połączyć się z adresem przez otwartoźródłowy most mcp-remote (wymaga Node.js):
Możesz też samodzielnie uruchomić nasz plik serwera:
Pobierz plik serwera
Twój klucz API znajdziesz w panelu, w sekcji API. Nigdy nie umieszczaj klucza we współdzielonym pliku ani w repozytorium.
Każdy wynik otrzymany przez agenta zawiera wartość liczbową, zakres niepewności i stan kalibracji. Dzięki temu agent może wyjaśnić, co oznacza wynik i kiedy nie należy go używać.
Twój klucz
Zaloguj się, a następnie utwórz klucz w swoim panelu.
Na tej stronie nie można tworzyć kluczy.
Co robią API i serwer MCP