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
Field
Type
Required
Notes
task
string
✓
Nombre de la tarea; consulta la lista de tareas más abajo.
text
string
✓
Texto de entrada, de 1 a 6000 caracteres.
lang
string
✓
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».
mode
string
—
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.
options
object
—
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
Field
Type
Required
Notes
text
string
✓
Al menos 30 palabras y como máximo 6000 caracteres.
lang
string
✓
Un código de idioma del sitio o auto.
options
object
—
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.
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).
Corrección gramatical y ortográfica en el idioma del texto.
tone
Cambiar el tono; modos: Formal, Kantor (profesional), Santai (informal).
rewrite
Arreglar frases rígidas o torpes; modos: Standar, Formal.
resize
Acortar o alargar frases; modos: Ringkas (acortar), Panjangkan (alargar).
essay
Construir párrafos o un ensayo a partir de ideas en viñetas; modos: Akademik, Kreatif, Panjangkan.
summarize
Resumen; modos: Poin-poin (viñetas), Paragraf (párrafo), Satu kalimat (una frase).
translate
Traducción entre dos idiomas admitidos cualesquiera; options.from (o auto) y options.to; modos: Alami (natural, por defecto), Formal, Santai (informal).
thesis
Ideas de títulos de tesis y esquema de capítulos.
abstract
Abstract estructurado a partir de un resumen de la investigación.
caption
Captions para redes sociales; options.platform: instagram, tiktok, linkedin.
email
Correos y cartas; modos: Lamaran kerja (solicitud de empleo), Surat resmi (carta formal), Follow-up (seguimiento).
headline
Títulos y titulares de artículos; modos: Kreatif, Ringkas.
product
Descripciones de producto; modos: Marketplace, Toko online (tienda en línea).
synonym
Lista de sinónimos de una palabra o expresión.
humanize
Hacer que un texto rígido o genérico suene más natural; modos: Alami (natural), Pribadi (personal), Profesional.
meta
Tres pares de título y descripción meta; modos: Artikel (artículo), Produk (producto), Halaman (cualquier página web).
hashtag
Una línea de hashtags; modos: Instagram, TikTok, LinkedIn, X.
bio
Tres bios de perfil; modos: Instagram, LinkedIn, X, TikTok.
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
Estado
Código
Cuándo ocurre
400
invalid_request
JSON no válido, falta un campo obligatorio, o task o lang desconocidos.
413
too_long
text supera los 6000 caracteres.
403
forbidden
La solicitud no procedía de una página de adeptwrite.com.
429
rate_limited
Se superó el límite por minuto por IP o el global. Espera los segundos indicados en Retry-After.
429
quota_exceeded
Se agotó el tope diario de las funciones de IA. Vuelve a intentarlo al día siguiente (UTC).
502
upstream
Ningún modelo de la cadena respondió a tiempo.
502
empty_output
Los modelos respondieron, pero con un resultado vacío.
503
disabled
El 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.