Documentação da API

Paráfrase, correção de gramática, resumos, tradução e verificação de plágio em 56 idiomas. REST simples, servida na borda da Cloudflare.

Mesma origem
No momento a API atende apenas solicitações do próprio adeptwrite.com (sem cabeçalhos CORS). O acesso externo com chaves de API está previsto junto com o plano Pro. Publicamos esta documentação com antecedência para que o contrato fique aberto e você possa se preparar.
Resumo

A API v1 do AdeptWrite tem três endpoints ativos. POST /api/v1/run recebe um JSON com task, mode, lang e text (até 6.000 caracteres) e devolve o resultado em texto simples, gerado por um modelo do Cloudflare Workers AI escolhido conforme o idioma; POST /api/v1/plagiarism compara um texto com fontes abertas e lista todas as fontes consultadas; GET /api/v1/health informa o estado do serviço. O texto nunca é armazenado nem registrado, e as solicitações de IA são limitadas a 30 por minuto por IP.

Informações básicas

  • URL base: https://adeptwrite.com/api/v1
  • Formato: solicitações e respostas em JSON (Content-Type: application/json, UTF-8).
  • Autenticação: ainda não há; as solicitações precisam vir de páginas do adeptwrite.com (mesma origem). As chaves de API chegam com o plano Pro.
  • Privacidade: o campo text nunca é armazenado nem registrado; as respostas levam Cache-Control: no-store.
  • Versionamento: o caminho /v1/ não mudará de forma incompatível; mudanças 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 em Markdown).

Requisição

FieldTypeRequiredNotes
taskstring✓Nome da tarefa; veja a lista de tarefas abaixo.
textstring✓Texto de entrada, de 1 a 6.000 caracteres.
langstring✓Idioma do resultado: um dos 56 códigos de locale do site (en, id, pt para o português do Brasil, pt-pt, zh-hant…; tags BCP 47 como pt-BR são convertidas) ou auto para "o mesmo idioma do texto de entrada".
modestring—Um modo disponível para a ferramenta, como Formal, Akademik, Ringkas ou Poin-poin (os nomes de modo são os rótulos do registro, em indonésio). Ignorado nas tarefas sem modos.
optionsobject—Opções específicas da tarefa: from / to em translate (qualquer idioma compatível para qualquer outro; from pode ser auto; sr-Cyrl pede sérvio em cirílico), platform (instagram / tiktok / linkedin) em caption e fields opcionais, com rótulos, em bio, coverletter e meta. As demais chaves são ignoradas.
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "pt",
  "text": "Escrever bem faz muita diferença para os estudantes.",
  "options": {}
}

Resposta

Status 200 com ok: true, o resultado em output, o modelo que de fato respondeu em model (ele muda quando um modelo de reserva assume) e o tempo de processamento em milissegundos. truncated: true é acrescentado 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","text":"Nós vai na biblioteca amanha."}'

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', 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 de 4 a 8 trechos característicos do texto, busca em fontes abertas no idioma do texto (Wikipédia, Wikisource, texto completo do Internet Archive, Europe PMC, DOAJ, arXiv; um provedor de busca na web só quando configurado e solicitado) e pontua a sobreposição. Somente esses trechos curtos saem do servidor.

Requisição

FieldTypeRequiredNotes
textstring✓No mínimo 30 palavras e no máximo 6.000 caracteres.
langstring✓Um código de locale do site ou auto.
optionsobject—web: true também consulta o provedor de busca na web, se o operador tiver configurado um; webSearched na resposta informa se ele realmente respondeu.
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

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

Resposta

Status 200 com score (palavras coincidentes ÷ palavras, de 0 a 1), matches por fonte com passages destacados (posições de caracteres no seu texto), sourcesSearched (exatamente as fontes cujas respostas estão no 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","text":"…pelo menos 30 palavras…"}'

GET/api/v1/health

Informa quais serviços estão ligados. Não leva corpo e não conta para a cota.

Resposta

Status 200. ai fica falso enquanto a chave geral de desligamento da IA estiver ativa; plagiarism lista as fontes que o verificador pode consultar; aidetect descreve a análise profunda do detector de IA no servidor, que ainda não foi implantada (POST /api/v1/aidetect responde 503 disabled; o detector do site roda 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
paraphraseParáfrase; modos: Standar (padrão), Formal, Santai (informal), Akademik (acadêmico), Kreatif (criativo), Ringkas (encurtar), Panjangkan (expandir).
grammarCorreção de gramática e ortografia no idioma do texto.
toneMudança de tom; modos: Formal, Kantor (corporativo), Santai (informal).
rewriteConserta frases truncadas ou confusas; modos: Standar (padrão), Formal.
resizeEncurta ou expande frases; modos: Ringkas (encurtar), Panjangkan (expandir).
essayMonta parágrafos ou uma redação a partir de tópicos; modos: Akademik (acadêmico), Kreatif (criativo), Panjangkan (expandir).
summarizeResumo; modos: Poin-poin (tópicos), Paragraf (parágrafo), Satu kalimat (uma frase).
translateTradução entre quaisquer dois idiomas compatíveis; options.from (ou auto) e options.to; modos: Alami (natural, padrão), Formal, Santai (informal).
thesisIdeias de tema e título de TCC e esboço de capítulos.
abstractResumo acadêmico (abstract) estruturado a partir de um resumo da pesquisa.
captionLegendas para redes sociais; options.platform: instagram, tiktok, linkedin.
emailE-mails e cartas; modos: Lamaran kerja (candidatura a vaga), Surat resmi (carta formal), Follow-up (retomada de contato).
headlineTítulos de artigo e headlines; modos: Kreatif (criativo), Ringkas (curto).
productDescrições de produto; modos: Marketplace, Toko online (loja virtual).
synonymLista de sinônimos para uma palavra ou expressão.
humanizeFaz um texto rígido ou genérico soar mais natural; modos: Alami (natural), Pribadi (pessoal), Profesional (profissional).
metaTrês pares de título e descrição para metadados; modos: Artikel (artigo), Produk (produto), Halaman (qualquer página).
hashtagUma linha de hashtags; modos: Instagram, TikTok, LinkedIn, X.
bioTrês biografias de perfil; modos: Instagram, LinkedIn, X, TikTok.
outlineEsboço numerado com subtópicos; modos: Artikel (artigo), Esai (redação), Skripsi (TCC), 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 apresentação; modos: Fresh graduate (recém-formado), Berpengalaman (com experiência), Magang (estágio).
poemPoemas curtos; modos: Bebas (verso livre), Berima (rimado), Akrostik (acróstico), Haiku (haicai).

Limites

Tamanho do texto
No máximo 6.000 caracteres por solicitação (413 too_long acima disso).
Por endereço IP
30 solicitações por minuto.
Global
100 solicitações por minuto em todo o serviço, mais um limite diário para os recursos 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.
Saída
Um limite de tamanho por tarefa, nunca acima de 2.048 tokens; uma resposta cortada leva truncated: true.
Modelo
Escolhido por idioma: inglês e indonésio rodam em @cf/aisingapore/gemma-sea-lion-v4-27b-it; todos os outros idiomas, incluindo o português, em @cf/qwen/qwen3-30b-a3b-fp8. Quando um modelo está ocupado, limitado, lento ou falha, a solicitação passa ao próximo modelo 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 sempre nomeia o modelo que respondeu.

Códigos de erro

StatusCódigoQuando acontece
400invalid_requestJSON inválido, campo obrigatório ausente, ou task ou lang desconhecido.
413too_longtext passa de 6.000 caracteres.
403forbiddenA solicitação não veio de uma página do adeptwrite.com.
429rate_limitedO limite por IP ou o limite global por minuto foi excedido. Aguarde o número de segundos indicado em Retry-After.
429quota_exceededO limite diário dos recursos de IA se esgotou. Tente de novo no dia seguinte (UTC).
502upstreamNenhum modelo da cadeia respondeu a tempo.
502empty_outputOs modelos responderam, mas com resultado vazio.
503disabledO serviço foi desligado temporariamente pelo operador ou (em /api/v1/aidetect) ainda não foi implantado.

Formato de erro

Todo erro é devolvido em JSON, com o código de status HTTP correspondente e sempre no mesmo formato:

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

Confira primeiro ok e depois leia error.code para o tratamento por programa; error.message pode ser mostrada a usuários com segurança.

Boas práticas

  • Envie o texto em partes (por exemplo, um parágrafo por vez) em vez de um documento longo; os resultados voltam mais rápido e são mais fáceis de revisar.
  • Trate o 429 com espera crescente (backoff exponencial), sem repetir de imediato.
  • Não envie dados pessoais ou confidenciais de que você não precise: mesmo que não os armazenemos, vale o princípio da minimização de dados.
  • O texto de IA pode estar errado; apresente-o como uma sugestão a revisar, não como verdade final.

Perguntas frequentes

Posso chamar a API a partir do meu aplicativo ou domínio?

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

O texto enviado à API é armazenado?

Não. O texto é repassado ao modelo para gerar a resposta e depois descartado. Os logs contêm só metadados (código de status, tarefa, duração). Veja todos os detalhes na política de privacidade.

Por que a saída é texto simples e não JSON estruturado?

Cada tarefa produz um único texto pronto para uso, sem preâmbulo nem blocos de Markdown, para ser exibido direto no editor. Estrutura extra (por exemplo, uma lista de alterações) está prevista para uma versão futura, sem mudar a v1.

Quanto custa a API?

Pelo adeptwrite.com ela é gratuita, limitada a 30 solicitações de IA por minuto por IP. O preço do acesso externo será anunciado com o plano Pro; nada é cobrado antes disso.

Qual modelo responde à minha solicitação?

Depende do idioma: inglês e indonésio vão para o SEA-LION, os demais idiomas, inclusive o português, para o Qwen3-30B. Se esse modelo estiver ocupado ou falhar, o próximo da cadeia de reserva responde, e o campo model da resposta nomeia o que respondeu.