Documentación de la API

Paráfrasis, corrección gramatical, resúmenes, traducción y comprobación de plagio en 56 idiomas para tu aplicación. Una API REST sencilla, servida desde el borde de Cloudflare.

Mismo origen
Por ahora la API solo atiende solicitudes del propio sitio adeptwrite.com (sin cabeceras CORS). El acceso externo con claves de API está previsto junto con el plan Pro. Esta documentación se publica con antelación para que el contrato sea abierto y puedas prepararte.
Resumen

La API v1 de AdeptWrite tiene tres endpoints activos. POST /api/v1/run recibe un JSON con task, mode, lang y text (hasta 6000 caracteres) y devuelve texto plano generado por un modelo de Cloudflare Workers AI elegido según el idioma; POST /api/v1/plagiarism compara un texto con fuentes abiertas y enumera todas las fuentes consultadas; GET /api/v1/health devuelve el estado del servicio. El texto nunca se guarda ni se registra, y las solicitudes de IA se limitan a 30 por minuto y por IP.

Lo básico

  • URL base: https://adeptwrite.com/api/v1
  • Formato: las solicitudes y las respuestas son JSON (Content-Type: application/json, UTF-8).
  • Autenticación: todavía no hay; las solicitudes deben proceder de páginas de adeptwrite.com (mismo origen). Las claves de API llegarán con Pro.
  • Privacidad: el campo text nunca se guarda ni se registra; las respuestas llevan Cache-Control: no-store.
  • Versiones: la ruta /v1/ no cambiará de forma incompatible; los cambios que rompan la compatibilidad usarán /v2/.

POST/api/v1/run

Ejecuta una tarea de IA sobre un texto y devuelve el resultado como texto plano (sin preámbulo y sin bloques de código Markdown).

Solicitud

FieldTypeRequiredNotes
taskstring✓Nombre de la tarea; consulta la lista de tareas más abajo.
textstring✓Texto de entrada, de 1 a 6000 caracteres.
langstring✓Idioma del resultado: uno de los 56 códigos de idioma del sitio (es, en, id, pt-pt, zh-hant…; las etiquetas BCP 47 como pt-BR se convierten) o auto para «el mismo idioma que la entrada».
modestring—Un modo disponible para esa herramienta, por ejemplo Formal, Akademik, Ringkas o Poin-poin (los nombres de los modos son las etiquetas del registro, en indonesio). Se ignora en las tareas sin modos.
optionsobject—Opciones propias de cada tarea: from / to para translate (de cualquier idioma admitido a cualquier otro; from puede ser auto; sr-Cyrl pide serbio en cirílico), platform (instagram / tiktok / linkedin) para caption, y fields opcionales con etiqueta para bio, coverletter y meta. Las demás claves se ignoran.
POST /api/v1/run HTTP/1.1
Content-Type: application/json

{
  "task": "paraphrase",
  "mode": "Formal",
  "lang": "es",
  "text": "Escribir bien es muy importante para los estudiantes.",
  "options": {}
}

Respuesta

Estado 200 con ok: true, el resultado en output, el modelo que respondió realmente en model (es distinto cuando ha intervenido un modelo de respaldo) y el tiempo de procesamiento en milisegundos. Se añade truncated: true cuando la respuesta alcanzó su límite de longitud o de tiempo y se cortó.

{
  "ok": true,
  "output": "Redactar con corrección resulta fundamental para el alumnado.",
  "model": "@cf/qwen/qwen3-30b-a3b-fp8",
  "ms": 812
}

Ejemplo: curl

curl -X POST https://adeptwrite.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{"task":"grammar","lang":"es","text":"Ayer fuimos a la biblioteca y haber si encontramos el libro."}'

Ejemplo: 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: 'es', 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

Elige de 4 a 8 frases distintivas del texto, las busca en fuentes abiertas en el idioma del texto (Wikipedia, Wikisource, texto completo de Internet Archive, Europe PMC, DOAJ y arXiv; un proveedor de búsqueda web solo si está configurado y se solicita) y puntúa la coincidencia. Solo esas frases cortas salen del servidor.

Solicitud

FieldTypeRequiredNotes
textstring✓Al menos 30 palabras y como máximo 6000 caracteres.
langstring✓Un código de idioma del sitio o auto.
optionsobject—web: true consulta además el proveedor de búsqueda web cuando el operador ha configurado uno; webSearched en la respuesta indica si realmente respondió.
POST /api/v1/plagiarism HTTP/1.1
Content-Type: application/json

{ "text": "…al menos 30 palabras…", "lang": "es", "options": { "web": false } }

Respuesta

Estado 200 con score (palabras coincidentes ÷ palabras, de 0 a 1), matches por fuente con passages resaltados (desplazamientos de caracteres dentro de tu texto), sourcesSearched (exactamente las fuentes cuyas respuestas están en el resultado), sourcesSkipped con el motivo y webSearched.

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

Ejemplo: curl

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

GET/api/v1/health

Indica qué servicios están activados. No lleva cuerpo y no cuenta para la cuota.

Respuesta

Estado 200. ai es false mientras el interruptor de emergencia de la IA está activado; plagiarism enumera las fuentes que puede consultar el comprobador; aidetect describe el análisis profundo del detector de IA en el servidor, que todavía no está desplegado (POST /api/v1/aidetect responde 503 disabled; el detector del sitio se ejecuta en tu navegador).

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

Ejemplo: curl

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

Task list

taskWhat it does
paraphraseParafrasear; modos: Standar, Formal, Santai (informal), Akademik (académico), Kreatif (creativo), Ringkas (acortar), Panjangkan (ampliar).
grammarCorrección gramatical y ortográfica en el idioma del texto.
toneCambiar el tono; modos: Formal, Kantor (profesional), Santai (informal).
rewriteArreglar frases rígidas o torpes; modos: Standar, Formal.
resizeAcortar o alargar frases; modos: Ringkas (acortar), Panjangkan (alargar).
essayConstruir párrafos o un ensayo a partir de ideas en viñetas; modos: Akademik, Kreatif, Panjangkan.
summarizeResumen; modos: Poin-poin (viñetas), Paragraf (párrafo), Satu kalimat (una frase).
translateTraducción entre dos idiomas admitidos cualesquiera; options.from (o auto) y options.to; modos: Alami (natural, por defecto), Formal, Santai (informal).
thesisIdeas de títulos de tesis y esquema de capítulos.
abstractAbstract estructurado a partir de un resumen de la investigación.
captionCaptions para redes sociales; options.platform: instagram, tiktok, linkedin.
emailCorreos y cartas; modos: Lamaran kerja (solicitud de empleo), Surat resmi (carta formal), Follow-up (seguimiento).
headlineTítulos y titulares de artículos; modos: Kreatif, Ringkas.
productDescripciones de producto; modos: Marketplace, Toko online (tienda en línea).
synonymLista de sinónimos de una palabra o expresión.
humanizeHacer que un texto rígido o genérico suene más natural; modos: Alami (natural), Pribadi (personal), Profesional.
metaTres pares de título y descripción meta; modos: Artikel (artículo), Produk (producto), Halaman (cualquier página web).
hashtagUna línea de hashtags; modos: Instagram, TikTok, LinkedIn, X.
bioTres bios de perfil; modos: Instagram, LinkedIn, X, TikTok.
outlineEsquema numerado con subpuntos; modos: Artikel (artículo), Esai (ensayo), Skripsi (tesis), Presentasi (presentación).
sloganDiez ideas de eslogan; modos: Merek (marca), Kampanye (campaña), Produk (producto).
paragraphUn párrafo a partir de un tema; modos: Pembuka (introducción), Isi (desarrollo), Penutup (conclusión).
coverletterBorrador de carta de presentación; modos: Fresh graduate (recién graduado), Berpengalaman (con experiencia), Magang (prácticas).
poemPoemas breves; modos: Bebas (verso libre), Berima (con rima), Akrostik (acróstico), Haiku.

Límites

Longitud del texto
Como máximo 6000 caracteres por solicitud (413 too_long por encima de eso).
Por dirección IP
30 solicitudes por minuto.
Global
100 solicitudes por minuto en todo el servicio, más un tope diario para las funciones de IA.
Plagio
5 comprobaciones por minuto y por IP y 60 por minuto en todo el servicio; mínimo de 30 palabras.
Salida
Un presupuesto de longitud por tarea, nunca superior a 2048 tokens; una respuesta cortada lleva truncated: true.
Modelo
Se elige según el idioma: el inglés y el indonesio usan @cf/aisingapore/gemma-sea-lion-v4-27b-it; todos los demás idiomas, incluido el español, usan @cf/qwen/qwen3-30b-a3b-fp8. Cuando un modelo está ocupado, limitado, lento o falla, la solicitud pasa al siguiente modelo de la cadena (Qwen3-30B, después @cf/google/gemma-4-26b-a4b-it y después @cf/meta/llama-3.3-70b-instruct-fp8-fast). El campo model siempre nombra el modelo que respondió.

Códigos de error

EstadoCódigoCuándo ocurre
400invalid_requestJSON no válido, falta un campo obligatorio, o task o lang desconocidos.
413too_longtext supera los 6000 caracteres.
403forbiddenLa solicitud no procedía de una página de adeptwrite.com.
429rate_limitedSe superó el límite por minuto por IP o el global. Espera los segundos indicados en Retry-After.
429quota_exceededSe agotó el tope diario de las funciones de IA. Vuelve a intentarlo al día siguiente (UTC).
502upstreamNingún modelo de la cadena respondió a tiempo.
502empty_outputLos modelos respondieron, pero con un resultado vacío.
503disabledEl operador ha desactivado el servicio temporalmente o, en el caso de /api/v1/aidetect, todavía no está desplegado.

Formato de los errores

Todos los errores se devuelven como JSON, con el código de estado HTTP correspondiente y la misma estructura:

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

Comprueba primero ok y lee después error.code para tratar el error desde el código; error.message se puede mostrar a los usuarios sin problema.

Buenas prácticas

  • Envía el texto por partes (por ejemplo, por párrafos) en lugar de un documento largo; los resultados llegan antes y son más fáciles de revisar.
  • Ante un 429, reintenta con espera exponencial, no de inmediato.
  • No envíes datos personales o confidenciales que no necesites: aunque no los guardamos, la minimización de datos sigue siendo una buena práctica.
  • El resultado de la IA puede ser erróneo; preséntalo como una sugerencia para revisar, no como una verdad definitiva.

Preguntas frecuentes

¿Puedo llamar a la API desde mi propia aplicación o dominio?

Todavía no. Por ahora el Worker no envía cabeceras CORS y solo atiende páginas de adeptwrite.com. El acceso externo con claves de API está previsto junto con el plan Pro; esta documentación se actualizará cuando esté disponible.

¿Se guarda el texto que envío a la API?

No. El texto se reenvía al modelo para generar la respuesta y después se descarta. Los registros solo contienen metadatos (código de estado, tarea y duración). Consulta la política de privacidad para ver todos los detalles.

¿Por qué el resultado es texto plano y no JSON estructurado?

Cada tarea produce un único texto listo para usar, sin preámbulo ni bloques Markdown, para poder mostrarlo directamente en el editor. Está previsto añadir más estructura (por ejemplo, una lista de cambios) en una versión posterior sin cambiar la v1.

¿Cuánto cuesta la API?

Desde adeptwrite.com es gratuita, con un límite de 30 solicitudes de IA por minuto y por IP. El precio del acceso externo se anunciará junto con el plan Pro; hasta entonces no se cobra nada.

¿Qué modelo responde a mi solicitud?

Depende del idioma: el inglés y el indonesio van a SEA-LION, y los demás idiomas, el español incluido, a Qwen3-30B. Si ese modelo está ocupado o falla, responde el siguiente de la cadena de respaldo, y el campo model de la respuesta nombra el que lo hizo.