Dokumentacja API

Parafraza, sprawdzanie gramatyki, streszczenia, tłumaczenia i sprawdzanie plagiatu w 56 językach. Proste REST, serwowane z brzegu sieci Cloudflare.

To samo źródło
API obsługuje obecnie tylko żądania z samego adeptwrite.com (bez nagłówków CORS). Dostęp zewnętrzny z kluczami API jest planowany razem z planem Pro. Dokumentację publikujemy wcześniej, by kontrakt był otwarty i żebyś mógł się przygotować.
W skrócie

API AdeptWrite v1 ma trzy działające endpointy. POST /api/v1/run przyjmuje JSON z polami task, mode, lang i text (do 6000 znaków) i zwraca wynik jako zwykły tekst z modelu Cloudflare Workers AI dobranego do języka; POST /api/v1/plagiarism porównuje tekst z otwartymi źródłami i wymienia każde przeszukane źródło; GET /api/v1/health zwraca stan usługi. Tekst nie jest zapisywany ani logowany, a żądania AI są ograniczone do 30 na minutę z jednego adresu IP.

Podstawy

  • Adres bazowy: https://adeptwrite.com/api/v1
  • Format: żądania i odpowiedzi to JSON (Content-Type: application/json, UTF-8).
  • Uwierzytelnianie: na razie brak; żądania muszą pochodzić ze stron adeptwrite.com (to samo źródło). Klucze API pojawią się z planem Pro.
  • Prywatność: pole text nigdy nie jest zapisywane ani logowane; odpowiedzi mają nagłówek Cache-Control: no-store.
  • Wersjonowanie: ścieżka /v1/ nie zmieni się w sposób niezgodny wstecz; zmiany łamiące zgodność dostaną ścieżkę /v2/.

POST/api/v1/run

Wykonuje jedno zadanie AI na tekście i zwraca wynik jako zwykły tekst (bez wstępu i bez ogrodzeń Markdown).

Żądanie

FieldTypeRequiredNotes
taskstring✓Nazwa zadania; zob. lista zadań poniżej.
textstring✓Tekst wejściowy, od 1 do 6000 znaków.
langstring✓Język wyniku: jeden z 56 kodów lokalizacji serwisu (en, id, pl, pt-pt, zh-hant…; tagi BCP 47, takie jak pt-BR, są mapowane) albo auto dla „tego samego języka co wejście”.
modestring—Tryb dostępny dla danego narzędzia, np. Formal, Akademik, Ringkas, Poin-poin (nazwy trybów to indonezyjskie etykiety rejestru). Ignorowany dla zadań bez trybów.
optionsobject—Opcje zadania: from / to dla translate (dowolny obsługiwany język na dowolny inny; from może mieć wartość auto; sr-Cyrl prosi o serbski cyrylicą), platform (instagram / tiktok / linkedin) dla caption oraz opcjonalne opisane pola fields dla bio, coverletter i meta. Pozostałe klucze są ignorowane.
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "pl",
  "text": "Dobre pisanie naprawdę ma znaczenie dla studentów.",
  "options": {}
}

Odpowiedź

Status 200 z ok: true, wynikiem w output, modelem, który faktycznie odpowiedział, w model (inny, gdy zadziałał model zapasowy) i czasem przetwarzania w milisekundach. Pole truncated: true dodajemy, gdy odpowiedź osiągnęła limit długości lub czasu i została ucięta.

{
  "ok": true,
  "output": "Jakość pisania ma zasadnicze znaczenie dla studentów.",
  "model": "@cf/qwen/qwen3-30b-a3b-fp8",
  "ms": 812
}

Przykład: curl

curl -X POST https://adeptwrite.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{"task":"grammar","lang":"pl","text":"Jutro idziemy do biblioteki i kupujemy ksiązki."}'

Przykład: JavaScript (fetch)

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

POST/api/v1/plagiarism

Wybiera 4–8 charakterystycznych fraz z tekstu, przeszukuje otwarte źródła w języku tekstu (Wikipedia, Wikisource, pełne teksty Internet Archive, Europe PMC, DOAJ, arXiv; dostawcę wyszukiwania w sieci tylko wtedy, gdy jest skonfigurowany i zażądano go) i ocenia zbieżność. Z serwera wychodzą tylko te krótkie frazy.

Żądanie

FieldTypeRequiredNotes
textstring✓Co najmniej 30 słów, najwyżej 6000 znaków.
langstring✓Kod lokalizacji serwisu lub auto.
optionsobject—web: true odpytuje także dostawcę wyszukiwania w sieci, jeśli operator go skonfigurował; webSearched w odpowiedzi mówi, czy faktycznie odpowiedział.
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

{ "text": "…co najmniej 30 słów…", "lang": "pl", "options": { "web": false } }

Odpowiedź

Status 200 z polami score (dopasowane słowa ÷ słowa, 0–1), matches dla każdego źródła z podświetlonymi passages (przesunięcia znaków w Twoim tekście), sourcesSearched (dokładnie te źródła, których odpowiedzi są w wyniku), sourcesSkipped z powodem oraz webSearched.

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

Przykład: curl

curl -X POST https://adeptwrite.com/api/v1/plagiarism \
  -H "Content-Type: application/json" \
  -d '{"lang":"pl","text":"…co najmniej 30 słów…"}'

GET/api/v1/health

Podaje, które usługi są włączone. Nie przyjmuje treści i nie wlicza się do limitu.

Odpowiedź

Status 200. Pole ai ma wartość false, gdy włączony jest wyłącznik awaryjny AI; plagiarism wymienia źródła, które checker może odpytać; aidetect opisuje analizę głęboką detektora AI po stronie serwera, która nie jest jeszcze wdrożona (POST /api/v1/aidetect odpowiada 503 disabled; detektor w serwisie działa w Twojej przeglądarce).

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

Przykład: curl

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

Task list

taskWhat it does
paraphraseParafraza; tryby: Standar, Formal, Santai (swobodny), Akademik, Kreatif, Ringkas (krótszy), Panjangkan (dłuższy).
grammarPoprawa gramatyki, interpunkcji i pisowni w języku tekstu.
toneZmiana stylu; tryby: Formal, Kantor (służbowy), Santai (swobodny).
rewritePoprawa sztywnych lub niezgrabnych zdań; tryby: Standar, Formal.
resizeSkracanie lub rozwijanie zdań; tryby: Ringkas (skróć), Panjangkan (rozwiń).
essayAkapity lub wypracowanie z punktów; tryby: Akademik, Kreatif, Panjangkan (rozbudowany).
summarizeStreszczenie; tryby: Poin-poin (punkty), Paragraf (akapit), Satu kalimat (jedno zdanie).
translateTłumaczenie między dowolnymi dwoma obsługiwanymi językami; options.from (lub auto) i options.to; tryby: Alami (naturalny, domyślny), Formal, Santai (swobodny).
thesisPomysły na tematy prac dyplomowych i plan rozdziałów.
abstractUporządkowany abstrakt z opisu badań.
captionOpisy do postów w mediach społecznościowych; options.platform: instagram, tiktok, linkedin.
emailMaile i pisma; tryby: Lamaran kerja (aplikacja o pracę), Surat resmi (pismo formalne), Follow-up (przypomnienie).
headlineTytuły artykułów i nagłówki; tryby: Kreatif (kreatywne), Ringkas (krótkie).
productOpisy produktów; tryby: Marketplace, Toko online (sklep internetowy).
synonymLista synonimów dla jednego słowa lub wyrażenia.
humanizeSprawia, że sztywny, ogólnikowy tekst brzmi naturalniej; tryby: Alami (naturalny), Pribadi (osobisty), Profesional (profesjonalny).
metaTrzy pary tytułu i opisu meta; tryby: Artikel (artykuł), Produk (produkt), Halaman (dowolna strona).
hashtagJeden wiersz hashtagów; tryby: Instagram, TikTok, LinkedIn, X.
bioTrzy propozycje bio profilu; tryby: Instagram, LinkedIn, X, TikTok.
outlineNumerowany plan z podpunktami; tryby: Artikel (artykuł), Esai (wypracowanie), Skripsi (praca dyplomowa), Presentasi (prezentacja).
sloganDziesięć pomysłów na slogan; tryby: Merek (marka), Kampanye (kampania), Produk (produkt).
paragraphJeden akapit z tematu; tryby: Pembuka (wstęp), Isi (rozwinięcie), Penutup (zakończenie).
coverletterSzkic listu motywacyjnego; tryby: Fresh graduate (absolwent), Berpengalaman (z doświadczeniem), Magang (staż).
poemKrótkie wiersze; tryby: Bebas (wiersz wolny), Berima (rymowany), Akrostik (akrostych), Haiku.

Limity

Długość tekstu
Najwyżej 6000 znaków na żądanie (powyżej: 413 too_long).
Na adres IP
30 żądań na minutę.
Globalnie
100 żądań na minutę w całej usłudze oraz dzienny limit funkcji AI.
Plagiat
5 sprawdzeń na minutę na adres IP i 60 na minutę w całej usłudze; minimum 30 słów.
Wynik
Budżet długości na zadanie, nigdy więcej niż 2048 tokenów; ucięta odpowiedź ma truncated: true.
Model
Dobierany do języka: angielski i indonezyjski działają na @cf/aisingapore/gemma-sea-lion-v4-27b-it, każdy inny język, w tym polski, na @cf/qwen/qwen3-30b-a3b-fp8. Gdy model jest zajęty, ma limit, działa wolno lub zawiedzie, żądanie przechodzi do następnego modelu w łańcuchu (Qwen3-30B, potem @cf/google/gemma-4-26b-a4b-it, potem @cf/meta/llama-3.3-70b-instruct-fp8-fast). Pole model zawsze podaje model, który odpowiedział.

Kody błędów

StatusKodKiedy występuje
400invalid_requestNiepoprawny JSON, brak wymaganego pola albo nieznane task lub lang.
413too_longtext przekracza 6000 znaków.
403forbiddenŻądanie nie pochodziło ze strony adeptwrite.com.
429rate_limitedPrzekroczono limit na minutę dla adresu IP lub globalny. Poczekaj tyle sekund, ile podaje Retry-After.
429quota_exceededDzienny limit funkcji AI został wyczerpany. Spróbuj następnego dnia (UTC).
502upstreamŻaden model z łańcucha nie odpowiedział w czasie.
502empty_outputModele odpowiedziały, ale wynik jest pusty.
503disabledOperator tymczasowo wyłączył usługę albo (dla /api/v1/aidetect) nie jest jeszcze wdrożona.

Format błędów

Każdy błąd wraca jako JSON z odpowiednim kodem statusu HTTP i zawsze w tym samym kształcie:

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

Najpierw sprawdź ok, potem odczytaj error.code do obsługi w kodzie; error.message można bezpiecznie pokazać użytkownikom.

Zalecane praktyki

  • Wysyłaj tekst we fragmentach (na przykład akapit po akapicie), zamiast jednego długiego dokumentu; wyniki wracają szybciej i łatwiej je sprawdzić.
  • Na odpowiedź 429 reaguj wykładniczym wydłużaniem przerw, a nie natychmiastowym ponawianiem.
  • Nie wysyłaj danych osobowych ani poufnych, których nie musisz wysyłać: choć ich nie zapisujemy, obowiązuje zasada minimalizacji danych.
  • Wynik AI może być błędny; traktuj go jako propozycję do sprawdzenia, a nie ostateczną prawdę.

Najczęstsze pytania

Czy mogę wywoływać API z własnej aplikacji lub domeny?

Jeszcze nie. Worker nie wysyła obecnie nagłówków CORS i obsługuje tylko strony adeptwrite.com. Dostęp zewnętrzny z kluczami API jest planowany razem z planem Pro; dokumentacja zostanie zaktualizowana, gdy będzie dostępny.

Czy tekst wysłany do API jest zapisywany?

Nie. Tekst jest przekazywany do modelu, by wytworzyć odpowiedź, a potem odrzucany. Logi zawierają tylko metadane (kod statusu, zadanie, czas). Wszystkie szczegóły są w polityce prywatności.

Dlaczego wynik to zwykły tekst, a nie ustrukturyzowany JSON?

Każde zadanie daje jeden gotowy do użycia tekst bez wstępu i ogrodzeń Markdown, który można od razu pokazać w edytorze. Dodatkowa struktura (na przykład lista zmian) jest planowana w późniejszej wersji bez zmiany v1.

Ile kosztuje API?

Z adeptwrite.com jest darmowe, z limitem 30 żądań AI na minutę z jednego adresu IP. Ceny dostępu zewnętrznego ogłosimy razem z planem Pro; wcześniej nic nie jest pobierane.

Który model odpowiada na moje żądanie?

Zależy od języka: angielski i indonezyjski trafiają do SEA-LION, pozostałe języki, w tym polski, do Qwen3-30B. Jeśli ten model jest zajęty lub zawiedzie, odpowiada następny w łańcuchu zapasowym, a pole model w odpowiedzi podaje ten, który odpowiedział.