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
- POST /api/v1/detectAnaliza un texto
- POST /api/v1/detect/batchAnaliza varios textos
- POST /api/v1/humanizeHumaniza un texto
- POST /api/v1/paraphraseParafrasea un texto
- POST /api/v1/summarizeResume un texto
- POST /api/v1/grammarRevisa la gramática
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.
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."}'const res = await fetch('https://blurwrite.com/api/v1/detect', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"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."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"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.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"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.
Authorization: Bearer YOUR_API_KEYEndpoints
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
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que se va a analizar o reescribir. |
| language | string | no | El código de idioma, como "en" o "de". Si se omite, se detecta a partir del texto. |
| contentType | string | no | El tipo de texto, como "essay" o "email", cuando el análisis deba usar la curva de ese tipo de texto. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| figure | number | La puntuación de 0 a 100: la probabilidad de que el texto se haya escrito con IA. |
| low | number | El extremo inferior del intervalo de la puntuación. |
| high | number | El extremo superior del intervalo de la puntuación. |
| uncertainty | number | La mitad de la amplitud del intervalo, en puntos. |
| verdict | string | La 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. |
| confidence | string | Cuánto se puede confiar en el resultado. Uno de: low, medium, high. |
| sentences | array de SentenceScore | Un resultado por oración. |
| words | integer | Las palabras analizadas. |
| language | string | El idioma en el que se ha analizado el texto. |
| model | string | El modelo que ha generado el resultado. |
| calibrated | boolean | Indica si el idioma tiene una curva ajustada. Cuando es false, la puntuación no debe usarse como resultado. |
| bandHumanFlagRate | number | null | La frecuencia con la que el texto humano en esta franja se ha clasificado como generado por IA en nuestras mediciones, o null. |
| usage | Usage | Lo que ha contabilizado esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | El cuerpo no contiene "text". |
| 422 | too_short | El texto no alcanza la extensión mínima. |
| 413 | text_too_long | El texto supera la extensión que el motor puede analizar en una sola llamada. Divídelo. No se ha contabilizado nada. |
| 422 | not_calibrated | Este idioma aún no se puede analizar. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
| 503 | engine_starting | El motor se está iniciando y no ha estado listo a tiempo. No se ha contabilizado nada. Vuelve a intentarlo en un minuto. |
| 503 | engine_busy | El 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. |
| 504 | engine_timeout | El 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. |
| 429 | concurrency_limited | Esta 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. |
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."}'const res = await fetch('https://blurwrite.com/api/v1/detect', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"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."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"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.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"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
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| items | array de object | sí | Los textos, cada uno con su propio "text" y, de forma opcional, "id", "language" y "contentType". |
| items[].id | string | no | Tu propio id para el elemento, que se devuelve con su resultado. Si se omite, se usa la posición del elemento. |
| items[].text | string | sí | El texto que se va a analizar o reescribir. |
| items[].language | string | no | El código de idioma, como "en" o "de". Si se omite, se detecta a partir del texto. |
| items[].contentType | string | no | El tipo de texto, como "essay" o "email", cuando el análisis deba usar la curva de ese tipo de texto. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| results | array de BatchResult | Un resultado por elemento, en el orden de envío. |
| usage | Usage | Lo que ha contabilizado esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | batch_empty | El cuerpo no contiene "items" o la lista está vacía. |
| 413 | batch_too_large | El lote tiene más elementos de los permitidos. |
| 429 | concurrency_limited | Esta 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. |
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."}]}'const res = await fetch('https://blurwrite.com/api/v1/detect/batch', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"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."
}
]
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect/batch",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"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.",
},
],
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"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
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que se va a analizar o reescribir. |
| mode | string | no | El modo de reescritura. Uno de: natural, formal, simple, academic, creative, shorten, expand, custom. Valor predeterminado: natural. |
| style_sample | string | no | Con 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. |
| tab | string | no | La 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. |
| strength | string | no | Normal 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. |
| ownTouch | string | no | Un detalle, ejemplo u opinión con tus propias palabras, de hasta 400 caracteres, que se incorpora al texto reescrito. |
| language | string | no | El código de idioma, como "en" o "de". Si se omite, se detecta a partir del texto. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| text | string | El texto reescrito. |
| before | Detection | El resultado del detector para tu texto, o null si no lo hay. |
| after | Detection | El resultado del detector para la reescritura, o null. |
| passes | integer | Cuántas reescrituras se han generado antes de elegir esta. |
| facts | object | Lo que han encontrado las comprobaciones de datos y por qué una reescritura no las supera, si es el caso. |
| late | boolean | True cuando la reescritura se ha devuelto al alcanzar el límite de tiempo con las comprobaciones sin terminar. |
| usage | Usage | Lo que ha contabilizado esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | El cuerpo no contiene "text". |
| 422 | too_short | El texto no alcanza la extensión mínima. |
| 400 | unknown_mode | La ruta no ofrece este modo. |
| 400 | unknown_option | La pestaña o el nivel de intensidad no está disponible en esta ruta. |
| 402 | plan_required | El 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. |
| 400 | no_sample | El modo "custom" necesita una muestra de escritura, enviada o guardada en la cuenta. |
| 400 | sample_too_short | La muestra de escritura no alcanza la extensión mínima. |
| 400 | sample_too_long | La muestra de escritura supera la extensión máxima. |
| 429 | concurrency_limited | Esta 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. |
| 422 | no_rewrite | El 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. |
| 503 | timeout | La reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado nada. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
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."}'const res = await fetch('https://blurwrite.com/api/v1/humanize', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"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."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/humanize",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"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.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"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
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que se va a analizar o reescribir. |
| mode | string | no | El modo de reescritura. Uno de: standard, fluency, formal, academic, simple, creative, expand, shorten. Valor predeterminado: standard. |
| strength | string | no | Cuánto puede alejarse la reescritura del original. Uno de: readable, balanced, strong. Valor predeterminado: balanced. |
| readability | string | no | El registro en el que se escribirá. Uno de: casual, professional, academic, creative. Valor predeterminado: professional. |
| purpose | string | no | La finalidad del texto. Uno de: general, essay, article, email, marketing, report, story. Valor predeterminado: general. |
| synonyms | string | no | Con qué libertad se pueden sustituir las palabras. Uno de: few, some, many. Valor predeterminado: some. |
| freezeWords | array de string | no | Palabras 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. |
| customInstruction | string | no | Una instrucción breve propia para la reescritura, de hasta 500 caracteres. Sus palabras cuentan como palabras de la llamada. |
| language | string | no | El código de idioma, como "en" o "de". Si se omite, se detecta a partir del texto. |
| closedLoop | boolean | no | Establece false para omitir el ciclo cerrado. Valor predeterminado: true. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| text | string | El texto reescrito. |
| before | Detection | El resultado del detector para tu texto, o null si no lo hay. |
| after | Detection | El resultado del detector para la reescritura, o null. |
| passes | integer | Cuántas reescrituras se han generado antes de elegir esta. |
| facts | object | Lo que han encontrado las comprobaciones de datos y por qué una reescritura no las supera, si es el caso. |
| late | boolean | True cuando la reescritura se ha devuelto al alcanzar el límite de tiempo con las comprobaciones sin terminar. |
| usage | Usage | Lo que ha contabilizado esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | El cuerpo no contiene "text". |
| 422 | too_short | El texto no alcanza la extensión mínima. |
| 400 | unknown_mode | La ruta no ofrece este modo. |
| 400 | option_invalid | freezeWords no es una lista de palabras o frases. No se ha contabilizado nada. |
| 400 | option_too_long | freezeWords o customInstruction supera su límite. No se ha contabilizado nada. |
| 429 | concurrency_limited | Esta 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. |
| 422 | no_rewrite | El 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. |
| 503 | timeout | La reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado nada. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
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."}'const res = await fetch('https://blurwrite.com/api/v1/paraphrase', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"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."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/paraphrase",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"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.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"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
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que se va a analizar o reescribir. |
| mode | string | no | El formato del resumen. Uno de: key-sentences, paragraph, bullets. Valor predeterminado: key-sentences. |
| length | string | no | La extensión del resumen. Uno de: short, medium, long. Valor predeterminado: medium. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| text | string | El resumen. |
| usage | Usage | Lo que ha contabilizado esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | El cuerpo no contiene "text". |
| 422 | too_short | El texto no alcanza la extensión mínima. |
| 429 | concurrency_limited | Esta 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. |
| 503 | timeout | La reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado nada. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
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."}'const res = await fetch('https://blurwrite.com/api/v1/summarize', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"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."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/summarize",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"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.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"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
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que se va a analizar o reescribir. |
| language | string | no | El código de idioma para la revisión, como "en-US" o "de-DE". Valor predeterminado: en-US. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| issues | array de GrammarIssue | Los problemas encontrados, en el orden en que aparecen. |
| usage | Usage | Lo que ha contabilizado esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | El cuerpo no contiene "text". |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado nada. |
| 503 | engine_starting | El motor se está iniciando y no ha estado listo a tiempo. No se ha contabilizado nada. Vuelve a intentarlo en un minuto. |
| 504 | engine_timeout | El 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. |
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."}'const res = await fetch('https://blurwrite.com/api/v1/grammar', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"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."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/grammar",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"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.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"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
| Estado | Código | Significado |
|---|---|---|
| 401 | key_in_url | La clave se ha enviado en la URL. Envíala en la cabecera Authorization. |
| 401 | no_key | No se ha enviado ninguna clave. |
| 401 | bad_key | La clave no es válida o se ha revocado. |
| 403 | out_of_scope | La clave no tiene el permiso que necesita esta ruta. |
| 429 | rate_limited | Demasiadas solicitudes para esta clave. Espera el tiempo indicado en Retry-After. |
| 403 | plan_lapsed | El plan de la cuenta ya no incluye la API. |
| 413 | too_large | La solicitud es demasiado grande. |
| 400 | bad_body | El cuerpo no es un objeto JSON. |
| 413 | too_many_words | La llamada tiene más palabras de las que admite. Divídela. No se ha contabilizado nada. |
| 402 | quota_exhausted | Se 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. |
| 402 | quota_short | La llamada necesita más palabras de las que quedan entre las palabras de API del plan y el saldo. No se ha contabilizado nada. |
| 402 | monthly_ceiling | La 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. |
| 503 | store_unavailable | No 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.
{
"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
| Campo | Tipo | Descripción |
|---|---|---|
| figure | number | La puntuación de 0 a 100: la probabilidad de que el texto se haya escrito con IA. |
| low | number | El extremo inferior del intervalo de la puntuación. |
| high | number | El extremo superior del intervalo de la puntuación. |
| uncertainty | number | La mitad de la amplitud del intervalo, en puntos. |
| verdict | string | La 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. |
| confidence | string | Cuánto se puede confiar en el resultado. Uno de: low, medium, high. |
| sentences | array de SentenceScore | Un resultado por oración. |
| words | integer | Las palabras analizadas. |
| language | string | El idioma en el que se ha analizado el texto. |
| model | string | El modelo que ha generado el resultado. |
| calibrated | boolean | Indica si el idioma tiene una curva ajustada. Cuando es false, la puntuación no debe usarse como resultado. |
| bandHumanFlagRate | number | null | La frecuencia con la que el texto humano en esta franja se ha clasificado como generado por IA en nuestras mediciones, o null. |
SentenceScore
| Campo | Tipo | Descripción |
|---|---|---|
| text | string | La oración. |
| score | number | De 0 a 1, la probabilidad de que la oración se haya escrito con IA. |
| verdict | string | La franja en la que se sitúa la oración. Uno de: human, uncertain, ai. |
Usage
| Campo | Tipo | Descripción |
|---|---|---|
| recorded | boolean | True 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". |
| words | integer | Las palabras contabilizadas en esta llamada. |
| source | string | De dónde proceden: las palabras de API del plan, el saldo de recargas o ambos. Uno de: plan, balance, plan_and_balance. |
| fromPlan | integer | Las palabras consumidas de las palabras de API del plan. Aparece cuando recorded es true. |
| fromBalance | integer | Las palabras consumidas del saldo de recargas. Aparece cuando recorded es true. |
| allowanceLeft | integer | null | Las 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. |
| balance | integer | El saldo de recargas restante tras esta llamada. Aparece cuando recorded es true. |
RewriteResult
| Campo | Tipo | Descripción |
|---|---|---|
| text | string | El texto reescrito. |
| before | Detection | El resultado del detector para tu texto, o null si no lo hay. |
| after | Detection | El resultado del detector para la reescritura, o null. |
| passes | integer | Cuántas reescrituras se han generado antes de elegir esta. |
| facts | object | Lo que han encontrado las comprobaciones de datos y por qué una reescritura no las supera, si es el caso. |
| late | boolean | True cuando la reescritura se ha devuelto al alcanzar el límite de tiempo con las comprobaciones sin terminar. |
GrammarIssue
| Campo | Tipo | Descripción |
|---|---|---|
| offset | integer | Dónde empieza el problema en el texto que has enviado, en unidades de código UTF-16 (un índice de cadena de JavaScript). |
| length | integer | Cuántas unidades de código UTF-16 del texto enviado abarca. |
| message | string | Cuál es el problema. |
| shortMessage | string | Lo mismo, en pocas palabras. |
| category | string | El tipo de problema. Uno de: grammar, spelling, punctuation, style, typography. |
| replacements | array de string | Sustituciones sugeridas, con las mejores primero. |
| context | string | El texto que rodea el problema. |
BatchResult
| Campo | Tipo | Descripción |
|---|---|---|
| id | string | El id del elemento. |
| detection | Detection | El resultado, cuando el elemento devuelve uno. |
| error | object | Por qué el elemento no ha devuelto un resultado. |
Error
| Campo | Tipo | Descripción |
|---|---|---|
| error | object | |
| usage | Usage | Lo que ha contabilizado esta llamada. |
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
Guarda tu clave de API en una variable de entorno llamada BLURWRITE_API_KEY, donde se ejecuta el cliente:
Ejecuta esto en una terminal:
O pon esto en .mcp.json:
.mcp.json{ "mcpServers": { "blurwrite": { "type": "http", "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${BLURWRITE_API_KEY}" } } } }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.
Claude Desktop Ejecuta el archivo del servidor
Descarga el archivo del servidor y anota dónde lo guardaste. Necesita Node.js.
Descarga el archivo del servidorEn la aplicación: Settings > Developer > Edit Config.
Añade esto a claude_desktop_config.json:
claude_desktop_config.json{ "mcpServers": { "blurwrite": { "command": "node", "args": [ "/path/to/server.mjs" ], "env": { "BLURWRITE_API_KEY": "YOUR_API_KEY" } } } }Cierra Claude Desktop y vuelve a abrirlo para que cargue el servidor.
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.
Claude (claude.ai) Próximamente
Pronto podrás conectar claude.ai iniciando sesión en tu cuenta de Blurwrite. Mientras tanto, las mismas herramientas ya funcionan en Claude Desktop con el archivo del servidor, o en Claude Code, con la configuración en sus pestañas.
Solo si tu organización tiene la opción de encabezados de solicitud para conectores personalizados: añade la dirección con este encabezado.
ChatGPT Próximamente
Pronto podrás conectar ChatGPT iniciando sesión en tu cuenta de Blurwrite. Mientras tanto, las mismas herramientas ya funcionan en Codex y Claude Code, con la configuración en sus pestañas.
Codex Se conecta en línea
Guarda tu clave de API en una variable de entorno llamada BLURWRITE_API_KEY, donde se ejecuta el cliente:
Ejecuta esto en una terminal:
O pon esto en ~/.codex/config.toml:
~/.codex/config.toml[mcp_servers.blurwrite] url = "https://blurwrite.com/api/mcp" bearer_token_env_var = "BLURWRITE_API_KEY"En la aplicación: MCP servers > Add server > Streamable HTTP.
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.
Cursor Se conecta en línea
Guarda tu clave de API en una variable de entorno llamada BLURWRITE_API_KEY, donde se ejecuta el cliente:
Añade esto a ~/.cursor/mcp.json:
~/.cursor/mcp.json{ "mcpServers": { "blurwrite": { "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }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.
VS Code (Copilot) Se conecta en línea
Añade esto a .vscode/mcp.json:
.vscode/mcp.json{ "inputs": [ { "type": "promptString", "id": "blurwrite-key", "description": "Blurwrite API key", "password": true } ], "servers": { "blurwrite": { "type": "http", "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${input:blurwrite-key}" } } } }Cuando el servidor se inicia, VS Code te pide la clave una sola vez y la guarda.
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.
Windsurf Se conecta en línea
Guarda tu clave de API en una variable de entorno llamada BLURWRITE_API_KEY, donde se ejecuta el cliente:
En la aplicación: Cascade > ... > Open MCP config file.
Añade esto a mcp_config.json:
mcp_config.json{ "mcpServers": { "blurwrite": { "serverUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Cierra Windsurf y vuelve a abrirlo para que cargue el servidor.
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.
Gemini CLI Se conecta en línea
Guarda tu clave de API en una variable de entorno llamada BLURWRITE_API_KEY, donde se ejecuta el cliente:
Ejecuta esto en una terminal:
O pon esto en ~/.gemini/settings.json:
~/.gemini/settings.json{ "mcpServers": { "blurwrite": { "httpUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }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.
Other clients En línea, con puente o archivo
Un cliente que se conecta a servidores MCP remotos por HTTP solo necesita estos dos valores:
Un cliente que solo inicia servidores locales puede llegar a la dirección a través del puente de código abierto mcp-remote (necesita Node.js):
O ejecuta tú mismo nuestro archivo de servidor:
Descarga el archivo del servidor
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.
Las claves nunca se crean en esta página.
Qué hacen la API y el servidor MCP