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
Field
Type
Required
Notes
task
string
✓
Nome del compito; vedi l’elenco dei compiti più sotto.
text
string
✓
Testo di partenza, da 1 a 6.000 caratteri.
lang
string
✓
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”.
mode
string
—
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à.
options
object
—
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
Field
Type
Required
Notes
text
string
✓
Almeno 30 parole, al massimo 6.000 caratteri.
lang
string
✓
Un codice di lingua del sito oppure auto.
options
object
—
web: true interroga anche il motore di ricerca web, se il gestore ne ha configurato uno; webSearched nella risposta indica se ha davvero risposto.
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.
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).
Traduzione tra due lingue supportate qualsiasi; options.from (o auto) e options.to; modalità: Alami (naturale, predefinita), Formal, Santai (informale).
thesis
Idee per il titolo della tesi e indice dei capitoli.
abstract
Abstract strutturato a partire dal riepilogo di una ricerca.
caption
Caption per i social; options.platform: instagram, tiktok, linkedin.
email
Email e lettere; modalità: Lamaran kerja (candidatura), Surat resmi (lettera formale), Follow-up (sollecito).
Dieci idee di slogan; modalità: Merek (marchio), Kampanye (campagna), Produk (prodotto).
paragraph
Un paragrafo a partire da un argomento; modalità: Pembuka (apertura), Isi (corpo), Penutup (chiusura).
coverletter
Bozza di lettera di presentazione; modalità: Fresh graduate (neolaureato), Berpengalaman (con esperienza), Magang (tirocinio).
poem
Brevi 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
Stato
Codice
Quando si verifica
400
invalid_request
JSON non valido, campo obbligatorio mancante oppure task o lang sconosciuti.
413
too_long
text supera i 6.000 caratteri.
403
forbidden
La richiesta non arriva da una pagina di adeptwrite.com.
429
rate_limited
Superato il limite al minuto per IP o globale. Attendi il numero di secondi indicato in Retry-After.
429
quota_exceeded
Il tetto giornaliero per le funzioni AI è esaurito. Riprova il giorno dopo (UTC).
502
upstream
Nessun modello della catena ha risposto in tempo.
502
empty_output
I modelli hanno risposto, ma con un risultato vuoto.
503
disabled
Il 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.