Ir al contenido
Documentación para desarrolladores

La API v1 y el servidor MCP

Todo lo que necesitas para llamar a la API: cómo autenticarte, cada endpoint con su solicitud y respuesta, los errores y límites, y ejemplos de curl, JavaScript y Python.

En esta página

Primeros pasos

Resumen

La API lleva la versión en la ruta, /api/v1. Cada endpoint recibe un POST con un cuerpo JSON y responde con JSON, también en los errores.

URL base https://blurwrite.com

Solo en el sitio, no en la API: el contador de palabras, el contador de caracteres, el detector de plagio y la opción "Tomarse más tiempo" del humanizador.

Generada a partir del documento OpenAPI, por lo que enumera exactamente las rutas y los campos que acepta la API. El documento OpenAPI

Tu primera llamada

El texto necesita al menos 50 palabras.

Consulta "calibrated" antes que nada: cuando es false, el idioma aún no tiene una curva ajustada, por lo que la puntuación no debe usarse como resultado.

Cada valor se muestra como su tipo. Una respuesta real contiene el resultado de tu texto.

Solicitud de ejemplo
curl -X POST https://blurwrite.com/api/v1/detect \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus miembros acordaron que la sala de lectura debería permanecer abierta hasta más tarde entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se estudiarán los costes, el número previsto de visitantes y el efecto sobre el resto del edificio."}'
Respuesta de ejemplo
{
  "figure": "number, de 0 a 100",
  "low": "number, de 0 a 100",
  "high": "number, de 0 a 100",
  "uncertainty": "number",
  "verdict": "human | uncertain | ai",
  "confidence": "low | medium | high",
  "sentences": [
    {
      "text": "string",
      "score": "number, de 0 a 1",
      "verdict": "human | uncertain | ai"
    }
  ],
  "words": "integer",
  "language": "string",
  "model": "string",
  "calibrated": "boolean",
  "bandHumanFlagRate": "number | null",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

Autenticación

Envía tu clave en la cabecera Authorization como token bearer. No se aceptan claves en la URL.

Cada clave tiene permisos: detect, rewrite, summarize y grammar. Una ruta devuelve 403 out_of_scope cuando la clave no tiene el permiso correspondiente.

Autenticación
Authorization: Bearer YOUR_API_KEY

Endpoints

POST /api/v1/detect

Analiza un texto. El resultado del detector para un texto: una puntuación de 0 a 100, su intervalo, un resultado por oración y una indicación de si el idioma está calibrado.

Permiso de la clave: detect

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
textstringsíEl texto que se va a analizar o reescribir.
languagestringnoEl código de idioma, como "en" o "de". Si se omite, se detecta a partir del texto.
contentTypestringnoEl tipo de texto, como "essay" o "email", cuando el análisis deba usar la curva de ese tipo de texto.

Respuesta

CampoTipoDescripción
figurenumberLa puntuación de 0 a 100: la probabilidad de que el texto se haya escrito con IA.
lownumberEl extremo inferior del intervalo de la puntuación.
highnumberEl extremo superior del intervalo de la puntuación.
uncertaintynumberLa mitad de la amplitud del intervalo, en puntos.
verdictstringLa franja en la que se sitúa la puntuación; es una franja, nunca una conclusión sobre quién escribió el texto. Uno de: human, uncertain, ai.
confidencestringCuánto se puede confiar en el resultado. Uno de: low, medium, high.
sentencesarray de SentenceScoreUn resultado por oración.
wordsintegerLas palabras analizadas.
languagestringEl idioma en el que se ha analizado el texto.
modelstringEl modelo que ha generado el resultado.
calibratedbooleanIndica si el idioma tiene una curva ajustada. Cuando es false, la puntuación no debe usarse como resultado.
bandHumanFlagRatenumber | nullLa frecuencia con la que el texto humano en esta franja se ha clasificado como generado por IA en nuestras mediciones, o null.
usageUsageLo que ha contabilizado esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textEl cuerpo no contiene "text".
422too_shortEl texto no alcanza la extensión mínima.
413text_too_longEl texto supera la extensión que el motor puede analizar en una sola llamada. Divídelo. No se ha contabilizado nada.
422not_calibratedEste idioma aún no se puede analizar.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
503engine_startingEl motor se está iniciando y no ha estado listo a tiempo. No se ha contabilizado nada. Vuelve a intentarlo en un minuto.
503engine_busyEl motor estaba ocupado y el análisis no ha podido empezar a tiempo; los análisis Pro del sitio tienen prioridad sobre las llamadas a la API. No se ha contabilizado nada. Vuelve a intentarlo en unos momentos.
504engine_timeoutEl motor no ha terminado de procesar el texto a tiempo. No se ha contabilizado nada. Vuelve a intentarlo o envía un texto más corto.
429concurrency_limitedEsta clave ya tiene el máximo permitido de llamadas de este tipo en curso. Espera a que termine una o espera el tiempo indicado en Retry-After.
Solicitud de ejemplo
curl -X POST https://blurwrite.com/api/v1/detect \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus miembros acordaron que la sala de lectura debería permanecer abierta hasta más tarde entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se estudiarán los costes, el número previsto de visitantes y el efecto sobre el resto del edificio."}'
Respuesta de ejemplo
{
  "figure": "number, de 0 a 100",
  "low": "number, de 0 a 100",
  "high": "number, de 0 a 100",
  "uncertainty": "number",
  "verdict": "human | uncertain | ai",
  "confidence": "low | medium | high",
  "sentences": [
    {
      "text": "string",
      "score": "number, de 0 a 1",
      "verdict": "human | uncertain | ai"
    }
  ],
  "words": "integer",
  "language": "string",
  "model": "string",
  "calibrated": "boolean",
  "bandHumanFlagRate": "number | null",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/detect/batch

Analiza varios textos. Envía textos en una sola llamada, hasta el límite del lote. La llamada necesita disponer de antemano de las palabras de cada texto que pueda analizar (50 palabras o más); las palabras de los textos que no devuelvan un resultado se restituyen después. El fallo de un texto nunca hace fallar todo el lote.

Permiso de la clave: detect

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
itemsarray de objectsíLos textos, cada uno con su propio "text" y, de forma opcional, "id", "language" y "contentType".
items[].idstringnoTu propio id para el elemento, que se devuelve con su resultado. Si se omite, se usa la posición del elemento.
items[].textstringsíEl texto que se va a analizar o reescribir.
items[].languagestringnoEl código de idioma, como "en" o "de". Si se omite, se detecta a partir del texto.
items[].contentTypestringnoEl tipo de texto, como "essay" o "email", cuando el análisis deba usar la curva de ese tipo de texto.

Respuesta

CampoTipoDescripción
resultsarray de BatchResultUn resultado por elemento, en el orden de envío.
usageUsageLo que ha contabilizado esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400batch_emptyEl cuerpo no contiene "items" o la lista está vacía.
413batch_too_largeEl lote tiene más elementos de los permitidos.
429concurrency_limitedEsta clave ya tiene el máximo permitido de llamadas de este tipo en curso. Espera a que termine una o espera el tiempo indicado en Retry-After.
Solicitud de ejemplo
curl -X POST https://blurwrite.com/api/v1/detect/batch \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"id":"1","text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus miembros acordaron que la sala de lectura debería permanecer abierta hasta más tarde entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se estudiarán los costes, el número previsto de visitantes y el efecto sobre el resto del edificio."},{"id":"2","text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus miembros acordaron que la sala de lectura debería permanecer abierta hasta más tarde entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se estudiarán los costes, el número previsto de visitantes y el efecto sobre el resto del edificio."}]}'
Respuesta de ejemplo
{
  "results": [
    {
      "id": "string",
      "detection": {
        "figure": "number, de 0 a 100",
        "low": "number, de 0 a 100",
        "high": "number, de 0 a 100",
        "uncertainty": "number",
        "verdict": "human | uncertain | ai",
        "confidence": "low | medium | high",
        "sentences": [
          {
            "text": "string",
            "score": "number, de 0 a 1",
            "verdict": "human | uncertain | ai"
          }
        ],
        "words": "integer",
        "language": "string",
        "model": "string",
        "calibrated": "boolean",
        "bandHumanFlagRate": "number | null"
      },
      "error": {
        "code": "string",
        "message": "string"
      }
    }
  ],
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/humanize

Humaniza un texto. El humanizador con sus comprobaciones de datos: se conservan cifras, nombres y citas, y cualquier reescritura que altere un dato se corrige o se señala. El modo "custom" (Pro) escribe con tu propio estilo, extraído de una muestra de tu escritura.

A través de la API, el humanizador hace su reescritura estándar. "Tomarse más tiempo" solo está en el sitio.

Permiso de la clave: rewrite

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
textstringsíEl texto que se va a analizar o reescribir.
modestringnoEl modo de reescritura. Uno de: natural, formal, simple, academic, creative, shorten, expand, custom. Valor predeterminado: natural.
style_samplestringnoCon el modo "custom": una muestra de tu propia escritura, de 150 a 2000 palabras, analizada en el servidor. Si se omite, se usa la muestra guardada en tu cuenta.
tabstringnoLa pestaña del humanizador: el registro en el que se reescribe el texto. Estándar conserva el registro del texto original. Uno de: standard, academic, professional, casual. Valor predeterminado: standard.
strengthstringnoNormal conserva el contenido y el registro. Agresiva puede reordenar el texto y omitir detalles, pero conserva todas las ideas principales. Algunas partes pueden sonar poco naturales. Uno de: regular, aggressive. Valor predeterminado: regular.
ownTouchstringnoUn detalle, ejemplo u opinión con tus propias palabras, de hasta 400 caracteres, que se incorpora al texto reescrito.
languagestringnoEl código de idioma, como "en" o "de". Si se omite, se detecta a partir del texto.

Respuesta

CampoTipoDescripción
textstringEl texto reescrito.
beforeDetectionEl resultado del detector para tu texto, o null si no lo hay.
afterDetectionEl resultado del detector para la reescritura, o null.
passesintegerCuántas reescrituras se han generado antes de elegir esta.
factsobjectLo que han encontrado las comprobaciones de datos y por qué una reescritura no las supera, si es el caso.
latebooleanTrue cuando la reescritura se ha devuelto al alcanzar el límite de tiempo con las comprobaciones sin terminar.
usageUsageLo que ha contabilizado esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textEl cuerpo no contiene "text".
422too_shortEl texto no alcanza la extensión mínima.
400unknown_modeLa ruta no ofrece este modo.
400unknown_optionLa pestaña o el nivel de intensidad no está disponible en esta ruta.
402plan_requiredEl modo, la pestaña, la intensidad o el toque personal requieren un plan que la cuenta no tiene; el modo "custom" requiere Pro. No se ha contabilizado nada.
400no_sampleEl modo "custom" necesita una muestra de escritura, enviada o guardada en la cuenta.
400sample_too_shortLa muestra de escritura no alcanza la extensión mínima.
400sample_too_longLa muestra de escritura supera la extensión máxima.
429concurrency_limitedEsta clave ya tiene el máximo permitido de llamadas de este tipo en curso. Espera a que termine una o espera el tiempo indicado en Retry-After.
422no_rewriteEl motor ha respondido, pero ningún borrador ha superado las comprobaciones (vacío, una negativa o una copia del texto). No se ha contabilizado nada.
503timeoutLa reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado nada.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
Solicitud de ejemplo
curl -X POST https://blurwrite.com/api/v1/humanize \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus miembros acordaron que la sala de lectura debería permanecer abierta hasta más tarde entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se estudiarán los costes, el número previsto de visitantes y el efecto sobre el resto del edificio."}'
Respuesta de ejemplo
{
  "text": "string",
  "before": {
    "figure": "number, de 0 a 100",
    "low": "number, de 0 a 100",
    "high": "number, de 0 a 100",
    "uncertainty": "number",
    "verdict": "human | uncertain | ai",
    "confidence": "low | medium | high",
    "sentences": [
      {
        "text": "string",
        "score": "number, de 0 a 1",
        "verdict": "human | uncertain | ai"
      }
    ],
    "words": "integer",
    "language": "string",
    "model": "string",
    "calibrated": "boolean",
    "bandHumanFlagRate": "number | null"
  },
  "after": {
    "figure": "number, de 0 a 100",
    "low": "number, de 0 a 100",
    "high": "number, de 0 a 100",
    "uncertainty": "number",
    "verdict": "human | uncertain | ai",
    "confidence": "low | medium | high",
    "sentences": [
      {
        "text": "string",
        "score": "number, de 0 a 1",
        "verdict": "human | uncertain | ai"
      }
    ],
    "words": "integer",
    "language": "string",
    "model": "string",
    "calibrated": "boolean",
    "bandHumanFlagRate": "number | null"
  },
  "passes": "integer",
  "facts": "object",
  "late": "boolean",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/paraphrase

Parafrasea un texto. El parafraseador, con la misma lista de modos que la herramienta para parafrasear.

Permiso de la clave: rewrite

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
textstringsíEl texto que se va a analizar o reescribir.
modestringnoEl modo de reescritura. Uno de: standard, fluency, formal, academic, simple, creative, expand, shorten. Valor predeterminado: standard.
strengthstringnoCuánto puede alejarse la reescritura del original. Uno de: readable, balanced, strong. Valor predeterminado: balanced.
readabilitystringnoEl registro en el que se escribirá. Uno de: casual, professional, academic, creative. Valor predeterminado: professional.
purposestringnoLa finalidad del texto. Uno de: general, essay, article, email, marketing, report, story. Valor predeterminado: general.
synonymsstringnoCon qué libertad se pueden sustituir las palabras. Uno de: few, some, many. Valor predeterminado: some.
freezeWordsarray de stringnoPalabras y frases que deben devolverse exactamente como se escribieron: un máximo de 25, de hasta 60 caracteres cada una. Sus palabras cuentan como palabras de la llamada.
customInstructionstringnoUna instrucción breve propia para la reescritura, de hasta 500 caracteres. Sus palabras cuentan como palabras de la llamada.
languagestringnoEl código de idioma, como "en" o "de". Si se omite, se detecta a partir del texto.
closedLoopbooleannoEstablece false para omitir el ciclo cerrado. Valor predeterminado: true.

Respuesta

CampoTipoDescripción
textstringEl texto reescrito.
beforeDetectionEl resultado del detector para tu texto, o null si no lo hay.
afterDetectionEl resultado del detector para la reescritura, o null.
passesintegerCuántas reescrituras se han generado antes de elegir esta.
factsobjectLo que han encontrado las comprobaciones de datos y por qué una reescritura no las supera, si es el caso.
latebooleanTrue cuando la reescritura se ha devuelto al alcanzar el límite de tiempo con las comprobaciones sin terminar.
usageUsageLo que ha contabilizado esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textEl cuerpo no contiene "text".
422too_shortEl texto no alcanza la extensión mínima.
400unknown_modeLa ruta no ofrece este modo.
400option_invalidfreezeWords no es una lista de palabras o frases. No se ha contabilizado nada.
400option_too_longfreezeWords o customInstruction supera su límite. No se ha contabilizado nada.
429concurrency_limitedEsta clave ya tiene el máximo permitido de llamadas de este tipo en curso. Espera a que termine una o espera el tiempo indicado en Retry-After.
422no_rewriteEl motor ha respondido, pero ningún borrador ha superado las comprobaciones (vacío, una negativa o una copia del texto). No se ha contabilizado nada.
503timeoutLa reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado nada.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
Solicitud de ejemplo
curl -X POST https://blurwrite.com/api/v1/paraphrase \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus miembros acordaron que la sala de lectura debería permanecer abierta hasta más tarde entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se estudiarán los costes, el número previsto de visitantes y el efecto sobre el resto del edificio."}'
Respuesta de ejemplo
{
  "text": "string",
  "before": {
    "figure": "number, de 0 a 100",
    "low": "number, de 0 a 100",
    "high": "number, de 0 a 100",
    "uncertainty": "number",
    "verdict": "human | uncertain | ai",
    "confidence": "low | medium | high",
    "sentences": [
      {
        "text": "string",
        "score": "number, de 0 a 1",
        "verdict": "human | uncertain | ai"
      }
    ],
    "words": "integer",
    "language": "string",
    "model": "string",
    "calibrated": "boolean",
    "bandHumanFlagRate": "number | null"
  },
  "after": {
    "figure": "number, de 0 a 100",
    "low": "number, de 0 a 100",
    "high": "number, de 0 a 100",
    "uncertainty": "number",
    "verdict": "human | uncertain | ai",
    "confidence": "low | medium | high",
    "sentences": [
      {
        "text": "string",
        "score": "number, de 0 a 1",
        "verdict": "human | uncertain | ai"
      }
    ],
    "words": "integer",
    "language": "string",
    "model": "string",
    "calibrated": "boolean",
    "bandHumanFlagRate": "number | null"
  },
  "passes": "integer",
  "facts": "object",
  "late": "boolean",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/summarize

Resume un texto. El resumidor, en forma de oraciones clave, un párrafo o viñetas.

Permiso de la clave: summarize

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
textstringsíEl texto que se va a analizar o reescribir.
modestringnoEl formato del resumen. Uno de: key-sentences, paragraph, bullets. Valor predeterminado: key-sentences.
lengthstringnoLa extensión del resumen. Uno de: short, medium, long. Valor predeterminado: medium.

Respuesta

CampoTipoDescripción
textstringEl resumen.
usageUsageLo que ha contabilizado esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textEl cuerpo no contiene "text".
422too_shortEl texto no alcanza la extensión mínima.
429concurrency_limitedEsta clave ya tiene el máximo permitido de llamadas de este tipo en curso. Espera a que termine una o espera el tiempo indicado en Retry-After.
503timeoutLa reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado nada.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
Solicitud de ejemplo
curl -X POST https://blurwrite.com/api/v1/summarize \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus miembros acordaron que la sala de lectura debería permanecer abierta hasta más tarde entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se estudiarán los costes, el número previsto de visitantes y el efecto sobre el resto del edificio."}'
Respuesta de ejemplo
{
  "text": "string",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/grammar

Revisa la gramática. Problemas de gramática, ortografía, puntuación y estilo, cada uno con su ubicación en el texto y las sustituciones sugeridas.

Permiso de la clave: grammar

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
textstringsíEl texto que se va a analizar o reescribir.
languagestringnoEl código de idioma para la revisión, como "en-US" o "de-DE". Valor predeterminado: en-US.

Respuesta

CampoTipoDescripción
issuesarray de GrammarIssueLos problemas encontrados, en el orden en que aparecen.
usageUsageLo que ha contabilizado esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textEl cuerpo no contiene "text".
503engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado nada.
503engine_startingEl motor se está iniciando y no ha estado listo a tiempo. No se ha contabilizado nada. Vuelve a intentarlo en un minuto.
504engine_timeoutEl motor no ha terminado de procesar el texto a tiempo. No se ha contabilizado nada. Vuelve a intentarlo o envía un texto más corto.
Solicitud de ejemplo
curl -X POST https://blurwrite.com/api/v1/grammar \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus miembros acordaron que la sala de lectura debería permanecer abierta hasta más tarde entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se estudiarán los costes, el número previsto de visitantes y el efecto sobre el resto del edificio."}'
Respuesta de ejemplo
{
  "issues": [
    {
      "offset": "integer",
      "length": "integer",
      "message": "string",
      "shortMessage": "string",
      "category": "grammar | spelling | punctuation | style | typography",
      "replacements": [
        "string"
      ],
      "context": "string"
    }
  ],
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

Referencia

Errores

Un error responde con su estado HTTP y un cuerpo con esta forma. Actúa según el código; el mensaje dice qué falló y qué hacer después.

Errores que puede devolver cualquier ruta

EstadoCódigoSignificado
401key_in_urlLa clave se ha enviado en la URL. Envíala en la cabecera Authorization.
401no_keyNo se ha enviado ninguna clave.
401bad_keyLa clave no es válida o se ha revocado.
403out_of_scopeLa clave no tiene el permiso que necesita esta ruta.
429rate_limitedDemasiadas solicitudes para esta clave. Espera el tiempo indicado en Retry-After.
403plan_lapsedEl plan de la cuenta ya no incluye la API.
413too_largeLa solicitud es demasiado grande.
400bad_bodyEl cuerpo no es un objeto JSON.
413too_many_wordsLa llamada tiene más palabras de las que admite. Divídela. No se ha contabilizado nada.
402quota_exhaustedSe han agotado las palabras de API del plan para este periodo de facturación y el saldo de recargas está vacío. No se ha contabilizado nada.
402quota_shortLa llamada necesita más palabras de las que quedan entre las palabras de API del plan y el saldo. No se ha contabilizado nada.
402monthly_ceilingLa cuenta ha alcanzado su límite de API para este periodo de facturación, que se aplica independientemente del saldo. No se ha contabilizado nada.
503store_unavailableNo se ha podido consultar la clave, el recuento de palabras de la cuenta o su muestra de escritura guardada en este momento, o este despliegue no dispone de almacenamiento de cuentas. No se ha ejecutado ni contabilizado nada.

Una llamada reserva sus palabras antes de ejecutarse y las devuelve si falla. Si no se puede guardar el recuento de palabras en ese momento, las palabras siguen descontadas: la llamada fallida lo indica e incluye "recorded": false en sus datos de uso, y un lote también responde con "recorded": false en sus datos de uso. No se estima el número de palabras.

Cuerpo del error
{
  "error": {
    "code": "string",
    "message": "string",
    "docs": "string",
    "available": "integer"
  },
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

Límites

Todas las cifras que aparecen aquí son las que aplica la API.

  • Cada clave permite como máximo 60 solicitudes cada 60 segundos.
  • Cada clave permite ejecutar a la vez un máximo de 4 llamadas de detección (un lote cuenta como una) y 2 llamadas de humanización, paráfrasis o resumen; una llamada adicional recibe la respuesta 429 concurrency_limited con un Retry-After.
  • Cuando los motores están ocupados, las evaluaciones de las cuentas Pro del sitio se atienden antes que las llamadas a la API, por lo que una llamada a la API puede tener que esperar su turno.
  • Un lote admite como máximo 50 textos.
  • Cada llamada admite como máximo 20.000 palabras, ya sea un solo texto o un lote completo.
  • El detector analiza textos de hasta 90.000 caracteres, unas 10.000 palabras, en todos los planes. Si el texto supera ese límite, la respuesta será 413 text_too_long, aunque no supere el límite de palabras de la llamada.
  • Una cuenta admite hasta 5 claves activas, para que puedas rotar una clave sin interrumpir el servicio.

Objetos de respuesta

Los objetos que devuelven los endpoints, campo por campo.

Detection

CampoTipoDescripción
figurenumberLa puntuación de 0 a 100: la probabilidad de que el texto se haya escrito con IA.
lownumberEl extremo inferior del intervalo de la puntuación.
highnumberEl extremo superior del intervalo de la puntuación.
uncertaintynumberLa mitad de la amplitud del intervalo, en puntos.
verdictstringLa franja en la que se sitúa la puntuación; es una franja, nunca una conclusión sobre quién escribió el texto. Uno de: human, uncertain, ai.
confidencestringCuánto se puede confiar en el resultado. Uno de: low, medium, high.
sentencesarray de SentenceScoreUn resultado por oración.
wordsintegerLas palabras analizadas.
languagestringEl idioma en el que se ha analizado el texto.
modelstringEl modelo que ha generado el resultado.
calibratedbooleanIndica si el idioma tiene una curva ajustada. Cuando es false, la puntuación no debe usarse como resultado.
bandHumanFlagRatenumber | nullLa frecuencia con la que el texto humano en esta franja se ha clasificado como generado por IA en nuestras mediciones, o null.

SentenceScore

CampoTipoDescripción
textstringLa oración.
scorenumberDe 0 a 1, la probabilidad de que la oración se haya escrito con IA.
verdictstringLa franja en la que se sitúa la oración. Uno de: human, uncertain, ai.

Usage

CampoTipoDescripción
recordedbooleanTrue cuando se ha registrado el recuento. False solo cuando un lote no ha podido restituir sus palabras no analizadas; en ese caso, solo aparece "words".
wordsintegerLas palabras contabilizadas en esta llamada.
sourcestringDe dónde proceden: las palabras de API del plan, el saldo de recargas o ambos. Uno de: plan, balance, plan_and_balance.
fromPlanintegerLas palabras consumidas de las palabras de API del plan. Aparece cuando recorded es true.
fromBalanceintegerLas palabras consumidas del saldo de recargas. Aparece cuando recorded es true.
allowanceLeftinteger | nullLas palabras del plan que quedan para esta herramienta tras esta llamada, en el periodo de facturación actual. Null para una herramienta sin palabras asignadas en este plan. Aparece cuando recorded es true.
balanceintegerEl saldo de recargas restante tras esta llamada. Aparece cuando recorded es true.

RewriteResult

CampoTipoDescripción
textstringEl texto reescrito.
beforeDetectionEl resultado del detector para tu texto, o null si no lo hay.
afterDetectionEl resultado del detector para la reescritura, o null.
passesintegerCuántas reescrituras se han generado antes de elegir esta.
factsobjectLo que han encontrado las comprobaciones de datos y por qué una reescritura no las supera, si es el caso.
latebooleanTrue cuando la reescritura se ha devuelto al alcanzar el límite de tiempo con las comprobaciones sin terminar.

GrammarIssue

CampoTipoDescripción
offsetintegerDónde empieza el problema en el texto que has enviado, en unidades de código UTF-16 (un índice de cadena de JavaScript).
lengthintegerCuántas unidades de código UTF-16 del texto enviado abarca.
messagestringCuál es el problema.
shortMessagestringLo mismo, en pocas palabras.
categorystringEl tipo de problema. Uno de: grammar, spelling, punctuation, style, typography.
replacementsarray de stringSustituciones sugeridas, con las mejores primero.
contextstringEl texto que rodea el problema.

BatchResult

CampoTipoDescripción
idstringEl id del elemento.
detectionDetectionEl resultado, cuando el elemento devuelve uno.
errorobjectPor qué el elemento no ha devuelto un resultado.

Error

CampoTipoDescripción
errorobject
usageUsageLo que ha contabilizado esta llamada.
Servidor MCP

El servidor MCP

Un agente puede usar las mismas herramientas a través del Model Context Protocol. El servidor es únicamente un cliente de esta API, por lo que el agente obtiene exactamente la misma evaluación que ofrece el sitio.

  • detect_textEvalúa un texto.
  • detect_batchEvalúa varios textos.
  • humanize_textHumaniza un texto con sus comprobaciones de datos.
  • paraphrase_textParafrasea un texto.
  • summarize_textResume un texto.
  • check_grammarRevisa la gramática y la ortografía.

Claude Code Se conecta en línea

  1. Guarda tu clave de API en una variable de entorno llamada BLURWRITE_API_KEY, donde se ejecuta el cliente:

    export BLURWRITE_API_KEY="YOUR_API_KEY"
  2. Ejecuta esto en una terminal:

    claude mcp add --transport http blurwrite https://blurwrite.com/api/mcp --header "Authorization: Bearer $BLURWRITE_API_KEY"
  3. O pon esto en .mcp.json:

    .mcp.json
    {
      "mcpServers": {
        "blurwrite": {
          "type": "http",
          "url": "https://blurwrite.com/api/mcp",
          "headers": {
            "Authorization": "Bearer ${BLURWRITE_API_KEY}"
          }
        }
      }
    }
  4. Comprueba que funciona: pídele a tu asistente "Analiza este párrafo con Blurwrite y dime el intervalo y el nivel de confianza."

Tu clave de API está en tu panel, en la sección API. Nunca pongas una clave en un archivo compartido ni en un repositorio.

Cada evaluación que recibe un agente incluye la cifra, la incertidumbre asociada y el estado de calibración, para que el agente pueda explicar qué significa el resultado y cuándo no debe utilizarse.

Tu clave

Inicia sesión y luego crea una clave en tu panel.

Obtén tu clave en el panel

Las claves nunca se crean en esta página.

Qué hacen la API y el servidor MCP