Documentazione API

Parafrasi, correzione grammaticale, riassunti, traduzione e controllo antiplagio in 56 lingue. Un’API REST semplice, servita dall’edge di Cloudflare.

Stessa origine
Per ora l’API risponde solo alle richieste che arrivano da adeptwrite.com (nessuna intestazione CORS). L’accesso esterno con chiavi API è previsto insieme al piano Pro. Pubblichiamo la documentazione in anticipo perché il contratto sia aperto e tu possa prepararti.
In sintesi

L’API v1 di AdeptWrite ha tre endpoint attivi. POST /api/v1/run riceve un JSON con task, mode, lang e text (fino a 6.000 caratteri) e restituisce testo semplice prodotto da un modello Cloudflare Workers AI scelto in base alla lingua; POST /api/v1/plagiarism confronta un testo con fonti aperte ed elenca tutte le fonti consultate; GET /api/v1/health indica lo stato del servizio. Il testo non è mai salvato né registrato, e le richieste AI sono limitate a 30 al minuto per IP.

Le basi

  • URL di base: https://adeptwrite.com/api/v1
  • Formato: richieste e risposte sono in JSON (Content-Type: application/json, UTF-8).
  • Autenticazione: per ora nessuna; le richieste devono arrivare dalle pagine di adeptwrite.com (stessa origine). Le chiavi API arriveranno con il piano Pro.
  • Privacy: il campo text non è mai salvato né registrato; le risposte hanno l’intestazione Cache-Control: no-store.
  • Versioni: il percorso /v1/ non cambierà in modo incompatibile; eventuali modifiche che rompono la compatibilità useranno /v2/.

POST/api/v1/run

Esegue un compito AI su un testo e restituisce il risultato come testo semplice (senza preamboli e senza blocchi di codice Markdown).

Richiesta

FieldTypeRequiredNotes
taskstring✓Nome del compito; vedi l’elenco dei compiti più sotto.
textstring✓Testo di partenza, da 1 a 6.000 caratteri.
langstring✓Lingua del risultato: uno dei 56 codici di lingua del sito (en, it, id, ja, pt-pt, zh-hant…; i tag BCP 47 come pt-BR vengono ricondotti ai codici del sito) oppure auto per “la stessa lingua del testo”.
modestring—Una modalità disponibile per quello strumento, per esempio Formal, Akademik, Ringkas, Poin-poin (i nomi delle modalità sono le etichette indonesiane del registro). Ignorata dai compiti senza modalità.
optionsobject—Opzioni specifiche del compito: from / to per translate (da qualsiasi lingua supportata a qualsiasi altra; from può essere auto; sr-Cyrl chiede il serbo in cirillico), platform (instagram / tiktok / linkedin) per caption e, facoltativi, i fields con etichetta per bio, coverletter e meta. Le altre chiavi sono ignorate.
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "it",
  "text": "Scrivere bene è importante per gli studenti.",
  "options": {}
}

Risposta

Stato 200 con ok: true, il risultato in output, il modello che ha effettivamente risposto in model (cambia se è intervenuto un modello di riserva) e il tempo di elaborazione in millisecondi. Se la risposta ha raggiunto il limite di lunghezza o di tempo ed è stata tagliata, viene aggiunto truncated: true.

{
  "ok": true,
  "output": "Saper scrivere bene è fondamentale per chi studia.",
  "model": "@cf/qwen/qwen3-30b-a3b-fp8",
  "ms": 812
}

Esempio: curl

curl -X POST https://adeptwrite.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{"task":"grammar","lang":"it","text":"Il libro che ho letto era un pò noioso ma l’ho finito."}'

Esempio: 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: 'it', 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

Sceglie da 4 a 8 frasi distintive del testo, le cerca in fonti aperte nella lingua del testo (Wikipedia, Wikisource, testo integrale di Internet Archive, Europe PMC, DOAJ, arXiv; un motore di ricerca web solo se configurato e richiesto) e calcola la sovrapposizione. Dal server escono soltanto quelle frasi brevi.

Richiesta

FieldTypeRequiredNotes
textstring✓Almeno 30 parole, al massimo 6.000 caratteri.
langstring✓Un codice di lingua del sito oppure auto.
optionsobject—web: true interroga anche il motore di ricerca web, se il gestore ne ha configurato uno; webSearched nella risposta indica se ha davvero risposto.
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

{ "text": "…almeno 30 parole…", "lang": "it", "options": { "web": false } }

Risposta

Stato 200 con score (parole corrispondenti ÷ parole, da 0 a 1), matches per fonte con i passages evidenziati (posizioni in caratteri nel tuo testo), sourcesSearched (esattamente le fonti le cui risposte sono nel risultato), sourcesSkipped con il motivo e webSearched.

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

Esempio: curl

curl -X POST https://adeptwrite.com/api/v1/plagiarism \
  -H "Content-Type: application/json" \
  -d '{"lang":"it","text":"…almeno 30 parole…"}'

GET/api/v1/health

Indica quali servizi sono attivi. Non ha corpo e non conta nella quota.

Risposta

Stato 200. ai è false mentre l’interruttore di emergenza dell’AI è attivo; plagiarism elenca le fonti che il controllo può interrogare; aidetect descrive l’analisi approfondita lato server del rilevatore AI, non ancora attiva (POST /api/v1/aidetect risponde 503 disabled; il rilevatore del sito funziona nel tuo browser).

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

Esempio: curl

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

Task list

taskWhat it does
paraphraseParafrasi; modalità: Standar, Formal, Santai, Akademik, Kreatif, Ringkas, Panjangkan.
grammarCorrezione di grammatica e ortografia, secondo le regole della lingua indicata in lang.
toneCambio di tono; modalità: Formal, Kantor (aziendale), Santai (informale).
rewriteRiscrittura di frasi rigide o contorte; modalità: Standar, Formal.
resizeAccorcia o allunga le frasi; modalità: Ringkas (accorcia), Panjangkan (allunga).
essayParagrafi o testo completo a partire da una scaletta di appunti; modalità: Akademik, Kreatif, Panjangkan.
summarizeRiassunto; modalità: Poin-poin (elenco puntato), Paragraf (paragrafo), Satu kalimat (una frase).
translateTraduzione tra due lingue supportate qualsiasi; options.from (o auto) e options.to; modalità: Alami (naturale, predefinita), Formal, Santai (informale).
thesisIdee per il titolo della tesi e indice dei capitoli.
abstractAbstract strutturato a partire dal riepilogo di una ricerca.
captionCaption per i social; options.platform: instagram, tiktok, linkedin.
emailEmail e lettere; modalità: Lamaran kerja (candidatura), Surat resmi (lettera formale), Follow-up (sollecito).
headlineTitoli di articoli; modalità: Kreatif, Ringkas.
productDescrizioni prodotto; modalità: Marketplace, Toko online (negozio online).
synonymElenco di sinonimi per una parola o un’espressione.
humanizeRende più naturale un testo rigido o generico; modalità: Alami (naturale), Pribadi (personale), Profesional (professionale).
metaTre coppie di meta title e description; modalità: Artikel (articolo), Produk (prodotto), Halaman (qualsiasi pagina web).
hashtagUna riga di hashtag; modalità: Instagram, TikTok, LinkedIn, X.
bioTre bio per il profilo; modalità: Instagram, LinkedIn, X, TikTok.
outlineScaletta numerata con sottopunti; modalità: Artikel (articolo), Esai (saggio), Skripsi (tesi), Presentasi (presentazione).
sloganDieci idee di slogan; modalità: Merek (marchio), Kampanye (campagna), Produk (prodotto).
paragraphUn paragrafo a partire da un argomento; modalità: Pembuka (apertura), Isi (corpo), Penutup (chiusura).
coverletterBozza di lettera di presentazione; modalità: Fresh graduate (neolaureato), Berpengalaman (con esperienza), Magang (tirocinio).
poemBrevi poesie; modalità: Bebas (verso libero), Berima (in rima), Akrostik (acrostico), Haiku.

Limiti

Lunghezza del testo
Al massimo 6.000 caratteri per richiesta (oltre questo valore: 413 too_long).
Per indirizzo IP
30 richieste al minuto.
Globale
100 richieste al minuto su tutto il servizio, più un tetto giornaliero per le funzioni AI.
Antiplagio
5 controlli al minuto per IP e 60 al minuto su tutto il servizio; minimo 30 parole.
Risposta
Un budget di lunghezza per compito, mai oltre 2.048 token; una risposta tagliata ha truncated: true.
Modello
Scelto in base alla lingua: inglese e indonesiano usano @cf/aisingapore/gemma-sea-lion-v4-27b-it, tutte le altre lingue, italiano compreso, @cf/qwen/qwen3-30b-a3b-fp8. Quando un modello è occupato, limitato, lento o in errore, la richiesta passa al successivo della catena (Qwen3-30B, poi @cf/google/gemma-4-26b-a4b-it, poi @cf/meta/llama-3.3-70b-instruct-fp8-fast). Il campo model indica sempre il modello che ha risposto.

Codici di errore

StatoCodiceQuando si verifica
400invalid_requestJSON non valido, campo obbligatorio mancante oppure task o lang sconosciuti.
413too_longtext supera i 6.000 caratteri.
403forbiddenLa richiesta non arriva da una pagina di adeptwrite.com.
429rate_limitedSuperato il limite al minuto per IP o globale. Attendi il numero di secondi indicato in Retry-After.
429quota_exceededIl tetto giornaliero per le funzioni AI è esaurito. Riprova il giorno dopo (UTC).
502upstreamNessun modello della catena ha risposto in tempo.
502empty_outputI modelli hanno risposto, ma con un risultato vuoto.
503disabledIl gestore ha disattivato temporaneamente il servizio oppure (per /api/v1/aidetect) non è ancora attivo.

Formato degli errori

Ogni errore è restituito in JSON, con il codice di stato HTTP corrispondente e sempre la stessa struttura:

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

Controlla prima ok, poi leggi error.code per gestire gli errori nel codice; error.message si può mostrare agli utenti senza problemi.

Buone pratiche

  • Invia il testo a pezzi (per esempio un paragrafo alla volta) invece di un documento lungo: i risultati arrivano prima e sono più facili da rivedere.
  • Gestisci il 429 con un’attesa crescente (exponential back-off), non con tentativi immediati.
  • Non inviare dati personali o riservati che non servono: anche se non li conserviamo, vale comunque il principio di minimizzazione dei dati.
  • L’output dell’AI può essere sbagliato; presentalo come un suggerimento da rivedere, non come una verità definitiva.

Domande frequenti

Posso chiamare l’API dalla mia app o dal mio dominio?

Non ancora. Il Worker per ora non invia intestazioni CORS e serve solo le pagine di adeptwrite.com. L’accesso esterno con chiavi API è previsto insieme al piano Pro; questa documentazione sarà aggiornata quando sarà disponibile.

Il testo inviato all’API viene salvato?

No. Il testo è inoltrato al modello per produrre la risposta e poi scartato. I log contengono solo metadati (codice di stato, compito, durata). Tutti i dettagli sono nell’informativa sulla privacy.

Perché il risultato è testo semplice e non JSON strutturato?

Ogni compito produce un testo pronto all’uso, senza preamboli né blocchi Markdown, così si può mostrare subito nell’editor. Strutture aggiuntive (per esempio l’elenco delle modifiche) sono previste per una versione successiva, senza cambiare la v1.

Quanto costa l’API?

Da adeptwrite.com è gratuita, con il limite di 30 richieste AI al minuto per IP. I prezzi dell’accesso esterno saranno annunciati con il piano Pro; fino ad allora non viene addebitato nulla.

Quale modello risponde alla mia richiesta?

Dipende dalla lingua: inglese e indonesiano vanno a SEA-LION, le altre lingue, italiano compreso, a Qwen3-30B. Se quel modello è occupato o in errore, risponde il successivo della catena, e il campo model della risposta indica quale.