Documentació de l’API

Paràfrasi, correcció gramatical, resums, traducció i detecció de plagi en 56 llengües. Una API REST senzilla, servida des de la xarxa perifèrica de Cloudflare.

Mateix origen
Ara mateix l’API només atén peticions de la mateixa adeptwrite.com (sense capçaleres CORS). L’accés extern amb claus d’API està previst juntament amb el pla Pro. Publiquem aquesta documentació amb antelació perquè el contracte sigui obert i us hi pugueu preparar.
Resum

L’API v1 d’AdeptWrite té tres punts finals actius. POST /api/v1/run rep un JSON amb task, mode, lang i text (fins a 6.000 caràcters) i retorna text pla generat per un model de Cloudflare Workers AI triat segons la llengua; POST /api/v1/plagiarism compara un text amb fonts obertes i en llista totes les consultades; GET /api/v1/health retorna l’estat del servei. El text no es desa ni queda als registres, i les peticions d’IA tenen un límit de 30 per minut i per IP.

Conceptes bàsics

  • URL base: https://adeptwrite.com/api/v1
  • Format: les peticions i les respostes són JSON (Content-Type: application/json, UTF-8).
  • Autenticació: encara no n’hi ha; les peticions han de venir de pàgines d’adeptwrite.com (mateix origen). Les claus d’API arribaran amb el pla Pro.
  • Privadesa: el camp text no es desa ni queda mai als registres; les respostes duen Cache-Control: no-store.
  • Versions: la ruta /v1/ no canviarà de manera incompatible; els canvis que trenquin la compatibilitat faran servir /v2/.

POST/api/v1/run

Executa una tasca d’IA sobre un text i retorna el resultat com a text pla (sense preàmbul ni blocs de codi Markdown).

Sol·licitud

FieldTypeRequiredNotes
taskstring✓Nom de la tasca; vegeu la llista de tasques més avall.
textstring✓Text d’entrada, d’1 a 6.000 caràcters.
langstring✓Llengua del resultat: un dels 56 codis de llengua del lloc (ca, en, es, pt-pt, zh-hant…; les etiquetes BCP 47 com pt-BR s’hi assignen) o auto per a «la mateixa llengua que l’entrada».
modestring—Un mode disponible per a l’eina, com ara Formal, Akademik (acadèmic), Ringkas (escurçar) o Poin-poin (punts); els noms de mode són les etiquetes del registre en indonesi. S’ignora en les tasques sense modes.
optionsobject—Opcions pròpies de la tasca: from / to per a translate (qualsevol llengua admesa cap a qualsevol altra; from pot ser auto; sr-Cyrl demana serbi en ciríl·lic), platform (instagram / tiktok / linkedin) per a caption i fields etiquetats opcionals per a bio, coverletter i meta. Les altres claus s’ignoren.
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "ca",
  "text": "Escriure bé és molt important per als estudiants.",
  "options": {}
}

Resposta

Estat 200 amb ok: true, el resultat a output, el model que ha respost de debò a model (és diferent quan n’ha intervingut un de reserva) i el temps de processament en mil·lisegons. S’hi afegeix truncated: true quan la resposta ha arribat al límit de longitud o de temps i s’ha tallat.

{
  "ok": true,
  "output": "Redactar amb correcció és essencial per als estudiants.",
  "model": "@cf/qwen/qwen3-30b-a3b-fp8",
  "ms": 812
}

Exemple: curl

curl -X POST https://adeptwrite.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{"task":"grammar","lang":"ca","text":"Tinc que anar a la biblioteca demà."}'

Exemple: 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: 'ca', 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

Tria de 4 a 8 frases distintives del text, les cerca en fonts obertes en la llengua del text (Viquipèdia, Wikisource, text complet d’Internet Archive, Europe PMC, DOAJ, arXiv; un proveïdor de cerca web només si està configurat i es demana) i en puntua la coincidència. Només aquestes frases curtes surten del servidor.

Sol·licitud

FieldTypeRequiredNotes
textstring✓Almenys 30 paraules i com a màxim 6.000 caràcters.
langstring✓Un codi de llengua del lloc o auto.
optionsobject—web: true consulta també el proveïdor de cerca web quan l’operador n’ha configurat un; webSearched a la resposta indica si ha respost de debò.
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

{ "text": "…almenys 30 paraules…", "lang": "ca", "options": { "web": false } }

Resposta

Estat 200 amb score (paraules coincidents ÷ paraules, de 0 a 1), matches per font amb passages destacats (desplaçaments de caràcters dins del vostre text), sourcesSearched (exactament les fonts les respostes de les quals són al resultat), sourcesSkipped amb el motiu, i webSearched.

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

Exemple: curl

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

GET/api/v1/health

Indica quins serveis són actius. No té cos i no compta per a la quota.

Resposta

Estat 200. ai és fals mentre l’interruptor d’emergència de la IA és activat; plagiarism llista les fonts que el detector pot consultar; aidetect descriu l’anàlisi profunda al servidor del detector d’IA, que encara no està desplegada (POST /api/v1/aidetect respon 503 disabled; el detector del lloc s’executa al vostre navegador).

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

Exemple: curl

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

Task list

taskWhat it does
paraphraseParàfrasi; modes: Standar (estàndard), Formal, Santai (informal), Akademik (acadèmic), Kreatif (creatiu), Ringkas (escurçar), Panjangkan (allargar).
grammarCorrecció gramatical i ortogràfica (per al català, segons l’Ortografia catalana de l’IEC del 2016).
toneCanvi de to; modes: Formal, Kantor (professional), Santai (informal).
rewriteReescriu frases encarcarades o confuses; modes: Standar (estàndard), Formal.
resizeEscurça o allarga frases; modes: Ringkas (escurçar), Panjangkan (allargar).
essayDesenvolupa uns quants punts en paràgrafs o en una redacció; modes: Akademik (acadèmic), Kreatif (creatiu), Panjangkan (allargar).
summarizeResum; modes: Poin-poin (punts), Paragraf (paràgraf), Satu kalimat (una frase).
translateTraducció entre dues llengües admeses qualssevol; options.from (o auto) i options.to; modes: Alami (natural, per defecte), Formal, Santai (informal).
thesisIdees de títol i esquema de capítols per a un TFG.
abstractAbstract estructurat a partir d’un resum de la recerca.
captionTextos per a xarxes socials; options.platform: instagram, tiktok, linkedin.
emailCorreus i cartes; modes: Lamaran kerja (sol·licitud de feina), Surat resmi (carta formal), Follow-up (seguiment).
headlineTítols d’articles i titulars; modes: Kreatif (creatiu), Ringkas (concís).
productDescripcions de producte; modes: Marketplace (mercat en línia), Toko online (botiga en línia).
synonymLlista de sinònims d’una paraula o d’una expressió.
humanizeFa que un text encarcarat o genèric soni més natural; modes: Alami (natural), Pribadi (personal), Profesional (professional).
metaTres parelles de títol i metadescripció; modes: Artikel (article), Produk (producte), Halaman (qualsevol pàgina web).
hashtagUna línia de hashtags; modes: Instagram, TikTok, LinkedIn, X.
bioTres bios de perfil; modes: Instagram, LinkedIn, X, TikTok.
outlineEsquema numerat amb subpunts; modes: Artikel (article), Esai (assaig), Skripsi (TFG), Presentasi (presentació).
sloganDeu idees d’eslògan; modes: Merek (marca), Kampanye (campanya), Produk (producte).
paragraphUn paràgraf a partir d’un tema; modes: Pembuka (obertura), Isi (cos), Penutup (tancament).
coverletterEsborrany de carta de presentació; modes: Fresh graduate (recent titulat), Berpengalaman (amb experiència), Magang (pràctiques).
poemPoemes breus; modes: Bebas (vers lliure), Berima (rimat), Akrostik (acròstic), Haiku.

Límits

Longitud del text
Com a màxim 6.000 caràcters per petició (413 too_long per sobre d’aquesta xifra).
Per adreça IP
30 peticions per minut.
Global
100 peticions per minut en tot el servei, a més d’un topall diari per a les funcions d’IA.
Plagi
5 comprovacions per minut i per IP i 60 per minut en tot el servei; mínim de 30 paraules.
Sortida
Un pressupost de longitud per tasca, mai de més de 2.048 tokens; una resposta tallada duu truncated: true.
Model
Es tria segons la llengua: l’anglès i l’indonesi funcionen amb @cf/aisingapore/gemma-sea-lion-v4-27b-it i totes les altres llengües, català inclòs, amb @cf/qwen/qwen3-30b-a3b-fp8. Quan un model està ocupat, limitat, lent o falla, la petició passa al següent model de la cadena (Qwen3-30B, després @cf/google/gemma-4-26b-a4b-it i després @cf/meta/llama-3.3-70b-instruct-fp8-fast). El camp model sempre indica el model que ha respost.

Codis d'error

EstatCodiQuan passa
400invalid_requestJSON no vàlid, falta un camp obligatori, o task o lang desconeguts.
413too_longtext supera els 6.000 caràcters.
403forbiddenLa petició no venia d’una pàgina d’adeptwrite.com.
429rate_limitedS’ha superat el límit per minut per IP o el global. Espereu el nombre de segons de Retry-After.
429quota_exceededS’ha esgotat el topall diari de les funcions d’IA. Torneu-ho a provar l’endemà (UTC).
502upstreamCap model de la cadena no ha respost a temps.
502empty_outputEls models han respost, però amb un resultat buit.
503disabledL’operador ha desactivat el servei temporalment o (per a /api/v1/aidetect) encara no està desplegat.

Format dels errors

Tots els errors es retornen com a JSON, amb el codi d’estat HTTP corresponent i la mateixa forma:

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

Comproveu primer ok i després llegiu error.code per al tractament programàtic; error.message es pot mostrar sense risc als usuaris.

Bones pràctiques

  • Envieu el text per parts (per exemple, per paràgrafs) en lloc d’un document llarg; els resultats arriben abans i són més fàcils de revisar.
  • Davant d’un 429, espereu amb un retard creixent (exponential back-off) en lloc de reintentar de seguida.
  • No envieu dades personals ni confidencials que no calguin; tot i que no les desem, el principi de minimització de dades continua valent.
  • El text d’IA pot ser erroni; presenteu-lo com un suggeriment que cal revisar, no com una veritat definitiva.

Preguntes freqüents

Puc cridar l’API des de la meva aplicació o el meu domini?

Encara no. Ara mateix el Worker no envia capçaleres CORS i només atén les pàgines d’adeptwrite.com. L’accés extern amb claus d’API està previst juntament amb el pla Pro; aquesta documentació s’actualitzarà quan estigui disponible.

El text que s’envia a l’API es desa?

No. El text es passa al model per generar la resposta i després es descarta. Els registres només contenen metadades (codi d’estat, tasca, durada). Els detalls són a la política de privadesa.

Per què la sortida és text pla i no JSON estructurat?

Cada tasca produeix un sol text llest per usar, sense preàmbul ni blocs Markdown, perquè es pugui mostrar directament a l’editor. Està previst afegir més estructura (per exemple, una llista de canvis) en una versió posterior sense modificar la v1.

Quant costa l’API?

Des d’adeptwrite.com és gratuïta, amb un límit de 30 peticions d’IA per minut i per IP. El preu de l’accés extern s’anunciarà juntament amb el pla Pro; abans no es cobra res.

Quin model respon la meva petició?

Depèn de la llengua: l’anglès i l’indonesi van a SEA-LION i les altres llengües, català inclòs, a Qwen3-30B. Si aquest model està ocupat o falla, respon el següent de la cadena de reserva, i el camp model de la resposta indica quin ho ha fet.