Documentação da API

Reformulação, correção gramatical, resumos, tradução e verificação de plágio em 56 línguas, incluindo o português europeu. REST simples, servida a partir da rede de periferia da Cloudflare.

Mesma origem
Atualmente a API serve apenas pedidos do próprio adeptwrite.com (sem cabeçalhos CORS). O acesso externo com chaves API está previsto a par do plano Pro. Esta documentação é publicada antecipadamente para que o contrato seja aberto e possa preparar-se.
Resumo

A API v1 da AdeptWrite tem três endpoints ativos. POST /api/v1/run recebe JSON com task, mode, lang e text (até 6000 caracteres) e devolve texto simples de um modelo do Cloudflare Workers AI escolhido consoante a língua; POST /api/v1/plagiarism compara um texto com fontes abertas e lista todas as fontes pesquisadas; GET /api/v1/health devolve o estado do serviço. O texto nunca é guardado nem registado, e os pedidos de IA estão limitados a 30 por minuto por IP.

Noções básicas

  • URL base: https://adeptwrite.com/api/v1
  • Formato: pedidos e respostas em JSON (Content-Type: application/json, UTF-8).
  • Autenticação: ainda não existe; os pedidos têm de vir de páginas de adeptwrite.com (mesma origem). As chaves API chegam com o plano Pro.
  • Privacidade: o campo text nunca é guardado nem registado; as respostas levam Cache-Control: no-store.
  • Versões: o caminho /v1/ não mudará de forma incompatível; alterações que quebrem a compatibilidade usarão /v2/.

POST/api/v1/run

Executa uma tarefa de IA sobre um texto e devolve o resultado em texto simples (sem preâmbulo e sem blocos de código Markdown).

Pedido

FieldTypeRequiredNotes
taskstring✓Nome da tarefa; veja a lista de tarefas mais abaixo.
textstring✓Texto de entrada, de 1 a 6000 caracteres.
langstring✓Língua do resultado: um dos 56 códigos de língua do sítio (pt-pt, en, id, ja, zh-hant…; as etiquetas BCP 47 como pt-BR são mapeadas) ou auto para «a mesma língua do texto de entrada».
modestring—Um modo disponível para essa ferramenta, por exemplo Formal, Akademik, Ringkas, Poin-poin (os nomes dos modos são as etiquetas indonésias do registo). Ignorado nas tarefas sem modos.
optionsobject—Opções específicas da tarefa: from / to para translate (qualquer língua suportada para qualquer outra; from pode ser auto; sr-Cyrl pede sérvio em cirílico), platform (instagram / tiktok / linkedin) para caption, e fields opcionais com rótulos para bio, coverletter e meta. As restantes chaves são ignoradas.
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "pt-pt",
  "text": "Escrever bem é muito importante para os estudantes.",
  "options": {}
}

Resposta

Estado 200 com ok: true, o resultado em output, o modelo que realmente respondeu em model (difere quando um modelo de recurso entrou em ação) e o tempo de processamento em milissegundos. Acrescenta-se truncated: true quando a resposta atingiu o limite de tamanho ou de tempo e foi cortada.

{
  "ok": true,
  "output": "A qualidade da escrita é essencial para os estudantes.",
  "model": "@cf/qwen/qwen3-30b-a3b-fp8",
  "ms": 812
}

Exemplo: curl

curl -X POST https://adeptwrite.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{"task":"grammar","lang":"pt-pt","text":"Eles foram ao mercado e comprarão fruta."}'

Exemplo: 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: 'pt-pt', 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

Escolhe 4 a 8 expressões distintivas do texto, pesquisa fontes abertas na língua do texto (Wikipédia, Wikisource, texto integral do Internet Archive, Europe PMC, DOAJ, arXiv; um fornecedor de pesquisa na web só quando configurado e pedido) e calcula a sobreposição. Só essas expressões curtas saem do servidor.

Pedido

FieldTypeRequiredNotes
textstring✓No mínimo 30 palavras, no máximo 6000 caracteres.
langstring✓Um código de língua do sítio ou auto.
optionsobject—web: true consulta também o fornecedor de pesquisa na web, quando o operador tiver configurado um; webSearched na resposta indica se ele realmente respondeu.
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

{ "text": "…pelo menos 30 palavras…", "lang": "pt-pt", "options": { "web": false } }

Resposta

Estado 200 com score (palavras coincidentes ÷ palavras, de 0 a 1), matches por fonte com passages destacadas (deslocamentos de caracteres no seu texto), sourcesSearched (exatamente as fontes cujas respostas constam do resultado), sourcesSkipped com o motivo, e webSearched.

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

Exemplo: curl

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

GET/api/v1/health

Indica que serviços estão ligados. Não leva corpo e não conta para a quota.

Resposta

Estado 200. ai é falso enquanto o interruptor de emergência da IA estiver ligado; plagiarism lista as fontes que o verificador pode consultar; aidetect descreve a análise profunda do detetor de IA no servidor, que ainda não está em produção (POST /api/v1/aidetect responde 503 disabled; o detetor do sítio corre no seu navegador).

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

Exemplo: curl

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

Task list

taskWhat it does
paraphraseReformulação; modos: Standar (padrão), Formal, Santai (informal), Akademik (académico), Kreatif (criativo), Ringkas (encurtar), Panjangkan (expandir).
grammarCorreção gramatical e ortográfica (AO90 para o português europeu).
toneMudar o tom; modos: Formal, Kantor (profissional), Santai (informal).
rewriteCorrigir frases rígidas ou confusas; modos: Standar, Formal.
resizeEncurtar ou expandir frases; modos: Ringkas, Panjangkan.
essayConstruir parágrafos ou um ensaio a partir de tópicos; modos: Akademik, Kreatif, Panjangkan.
summarizeResumo; modos: Poin-poin (tópicos), Paragraf (parágrafo), Satu kalimat (uma frase).
translateTradução entre quaisquer duas línguas suportadas; options.from (ou auto) e options.to; modos: Alami (natural, por defeito), Formal, Santai (informal).
thesisIdeias de título para dissertação e estrutura de capítulos.
abstractResumo académico (abstract) estruturado a partir de uma síntese da investigação.
captionLegendas para redes sociais; options.platform: instagram, tiktok, linkedin.
emailE-mails e cartas; modos: Lamaran kerja (candidatura a emprego), Surat resmi (carta formal), Follow-up (seguimento).
headlineTítulos de artigos e manchetes; modos: Kreatif, Ringkas.
productDescrições de produtos; modos: Marketplace, Toko online (loja online).
synonymLista de sinónimos para uma palavra ou expressão.
humanizeTornar mais natural um texto rígido ou genérico; modos: Alami (natural), Pribadi (pessoal), Profesional (profissional).
metaTrês pares de título e descrição meta; modos: Artikel (artigo), Produk (produto), Halaman (qualquer página web).
hashtagUma linha de hashtags; modos: Instagram, TikTok, LinkedIn, X.
bioTrês bios de perfil; modos: Instagram, LinkedIn, X, TikTok.
outlineEstrutura numerada com subpontos; modos: Artikel (artigo), Esai (ensaio), Skripsi (dissertação), Presentasi (apresentação).
sloganDez ideias de slogan; modos: Merek (marca), Kampanye (campanha), Produk (produto).
paragraphUm parágrafo a partir de um tema; modos: Pembuka (introdução), Isi (desenvolvimento), Penutup (conclusão).
coverletterRascunho de carta de motivação; modos: Fresh graduate (recém-licenciado), Berpengalaman (com experiência), Magang (estágio).
poemPoemas curtos; modos: Bebas (verso livre), Berima (com rima), Akrostik (acróstico), Haiku.

Limites

Tamanho do texto
No máximo 6000 caracteres por pedido (413 too_long acima disso).
Por endereço IP
30 pedidos por minuto.
Global
100 pedidos por minuto em todo o serviço, além de um limite diário para as funcionalidades de IA.
Plágio
5 verificações por minuto por IP e 60 por minuto em todo o serviço; mínimo de 30 palavras.
Resultado
Um limite de tamanho por tarefa, nunca superior a 2048 tokens; uma resposta cortada leva truncated: true.
Modelo
Escolhido por língua: o inglês e o indonésio correm em @cf/aisingapore/gemma-sea-lion-v4-27b-it, todas as outras línguas em @cf/qwen/qwen3-30b-a3b-fp8. Quando um modelo está ocupado, limitado, lento ou falha, o pedido passa ao modelo seguinte da cadeia (Qwen3-30B, depois @cf/google/gemma-4-26b-a4b-it, depois @cf/meta/llama-3.3-70b-instruct-fp8-fast). O campo model indica sempre o modelo que respondeu.

Códigos de erro

EstadoCódigoQuando acontece
400invalid_requestJSON inválido, campo obrigatório em falta, ou task ou lang desconhecidos.
413too_longtext excede os 6000 caracteres.
403forbiddenO pedido não veio de uma página de adeptwrite.com.
429rate_limitedFoi excedido o limite por IP ou o limite global por minuto. Aguarde o número de segundos indicado em Retry-After.
429quota_exceededO limite diário das funcionalidades de IA esgotou-se. Tente de novo no dia seguinte (UTC).
502upstreamNenhum modelo da cadeia respondeu a tempo.
502empty_outputOs modelos responderam, mas com um resultado vazio.
503disabledO serviço foi desligado temporariamente pelo operador ou (no caso de /api/v1/aidetect) ainda não está em produção.

Formato dos erros

Todos os erros são devolvidos em JSON, com o código de estado HTTP correspondente e sempre com a mesma forma:

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

Verifique primeiro ok e depois leia error.code para o tratamento programático; error.message pode ser mostrado com segurança aos utilizadores.

Boas práticas

  • Envie o texto por partes (por exemplo, por parágrafo) em vez de um documento longo; os resultados chegam mais depressa e são mais fáceis de rever.
  • Trate o erro 429 com recuo exponencial, não com novas tentativas imediatas.
  • Não envie dados pessoais ou confidenciais de que não precise: mesmo não os guardando, o princípio da minimização de dados continua a aplicar-se.
  • O resultado da IA pode estar errado; apresente-o como uma sugestão a rever, não como verdade final.

Perguntas frequentes

Posso chamar a API a partir da minha aplicação ou do meu domínio?

Ainda não. O Worker não envia atualmente cabeçalhos CORS e só serve páginas de adeptwrite.com. O acesso externo com chaves API está previsto a par do plano Pro; esta documentação será atualizada quando estiver disponível.

O texto enviado para a API é guardado?

Não. O texto é reencaminhado para o modelo para produzir a resposta e depois descartado. Os registos contêm apenas metadados (código de estado, tarefa, duração). Consulte a política de privacidade para todos os pormenores.

Porque é que o resultado é texto simples e não JSON estruturado?

Cada tarefa produz um único texto pronto a usar, sem preâmbulo nem blocos Markdown, para poder ser mostrado diretamente no editor. Está prevista para uma versão posterior uma estrutura adicional (por exemplo, uma lista de alterações), sem alterar a v1.

Quanto custa a API?

A partir de adeptwrite.com é gratuita, limitada a 30 pedidos de IA por minuto por IP. Os preços do acesso externo serão anunciados com o plano Pro; até lá, não se cobra nada.

Que modelo responde ao meu pedido?

Depende da língua: o inglês e o indonésio vão para o SEA-LION, as outras línguas para o Qwen3-30B. Se esse modelo estiver ocupado ou falhar, responde o modelo seguinte da cadeia de recurso, e o campo model da resposta indica qual foi.