En esta página
Primeros pasos
Descripción general
La versión de la API se indica en la ruta, /api/v1. Todos los endpoints reciben solicitudes POST con un cuerpo JSON y devuelven respuestas en JSON, incluidos los errores.
URL base https://textlume.com
- POST /api/v1/detectAnalizar un texto
- POST /api/v1/detect/batchAnalizar varios textos
- POST /api/v1/humanizeHumanizar un texto
- POST /api/v1/paraphraseParafrasear un texto
- POST /api/v1/summarizeResumir un texto
- POST /api/v1/grammarRevisar gramática
Solo están disponibles en el sitio, no en la API: el contador de palabras, el contador de caracteres, el detector de plagio y la opción "Dedicar más tiempo" del humanizador de IA.
Esta referencia se genera a partir del documento OpenAPI, por lo que muestra exactamente las rutas y los campos que acepta la API. Documento OpenAPI
Tu primera llamada
El texto debe tener al menos 50 palabras.
Antes de nada, comprueba "calibrated": si es false, el idioma aún no tiene una curva ajustada y no debes usar la cifra como resultado.
En lugar de cada valor se muestra su tipo. Una respuesta real incluye el resultado de tu texto.
curl -X POST https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."}'const res = await fetch('https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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 el encabezado Authorization como token de tipo Bearer. No se aceptan claves en la URL.
Cada clave tiene permisos de acceso: detect, rewrite, summarize y grammar. Si la clave no tiene el permiso requerido para una ruta, esta devuelve 403 out_of_scope.
Authorization: Bearer YOUR_API_KEYEndpoints
POST /api/v1/detect
Analizar un texto. El resultado del Detector de IA para un texto: una cifra de 0 a 100, el rango que la rodea, un resultado por frase y una indicación de si el idioma está calibrado.
Ámbito de la clave: detect
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que quieres analizar o reescribir. |
| language | string | no | El código del idioma, como "en" o "de". Si lo omites, se detecta a partir del texto. |
| contentType | string | no | El tipo de texto, como "essay" o "email", si quieres que el análisis use la curva correspondiente a ese tipo. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| figure | number | El resultado de 0 a 100: la probabilidad de que el texto se haya generado con IA. En sus tarjetas e informes, el sitio muestra el punto medio entre low y high, que no siempre coincide con esta cifra. |
| low | number | El límite inferior del rango que rodea la cifra. |
| high | number | El extremo superior del rango en torno al valor. |
| uncertainty | number | La mitad de la amplitud del rango, en puntos. |
| verdict | string | La franja en la que se sitúa el valor. Indica una franja, nunca una conclusión sobre quién escribió el texto. Uno de estos valores: human, uncertain, ai. |
| confidence | string | El grado de confianza que ofrece el resultado. Uno de estos valores: low, medium, high. |
| sentences | array de SentenceScore | Un resultado por frase. |
| words | integer | Las palabras analizadas. |
| language | string | El idioma en el que se ha interpretado el texto. |
| model | string | El modelo que generó el resultado. |
| calibrated | boolean | Indica si el idioma tiene una curva ajustada. Si es false, el valor no debe usarse como resultado. |
| bandHumanFlagRate | number | null | La frecuencia con la que los textos humanos de esta franja se clasificaron como textos de IA en nuestras mediciones, o null. |
| usage | Usage | El consumo contabilizado en esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | Falta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla. |
| 422 | too_short | El texto no alcanza la longitud mínima. Envía un texto más largo. |
| 413 | text_too_long | El texto supera la longitud que el motor puede analizar en una sola llamada. Divídelo en varias partes. No se ha contabilizado ningún consumo. |
| 422 | not_calibrated | El análisis de este idioma aún no está disponible. Envía un texto en un idioma compatible. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
| 503 | engine_starting | El motor se está iniciando y no ha estado listo a tiempo. No se ha contabilizado ningún consumo. 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 de usuarios Pro en el sitio tienen prioridad sobre las llamadas a la API. No se ha contabilizado ningún consumo. Vuelve a intentarlo en un momento. |
| 504 | engine_timeout | El motor no ha terminado de procesar el texto a tiempo. No se ha contabilizado ningún consumo. 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 a que transcurra el tiempo indicado en Retry-After. |
curl -X POST https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."}'const res = await fetch('https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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
Analizar varios textos. Envía varios textos en una sola llamada, hasta el límite por lote. Antes de empezar, necesitas saldo suficiente para las palabras de todos los textos que se puedan analizar (50 palabras o más). Las palabras de los textos que no obtengan un resultado se devuelven después. Si un texto falla, el resto del lote se sigue procesando.
Ámbito de la clave: detect
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| items | array de object | sí | Los textos, cada uno con su campo "text" y los campos opcionales "id", "language" y "contentType". |
| items[].id | string | no | Tu identificador para el elemento, que se devuelve junto con su resultado. Si lo omites, se usa la posición del elemento. |
| items[].text | string | sí | El texto que quieres analizar o reescribir. |
| items[].language | string | no | El código del idioma, como "en" o "de". Si lo omites, se detecta a partir del texto. |
| items[].contentType | string | no | El tipo de texto, como "essay" o "email", si quieres que el análisis use la curva correspondiente a ese tipo. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| results | array de BatchResult | Un resultado por elemento, en el orden de envío. |
| usage | Usage | El consumo contabilizado en esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | batch_empty | Falta el campo "items" en el cuerpo de la solicitud o la lista está vacía. Incluye una lista con al menos un elemento. |
| 413 | batch_too_large | El lote supera el límite de elementos. Divídelo en lotes más pequeños. |
| 429 | concurrency_limited | Esta clave ya tiene el máximo permitido de llamadas de este tipo en curso. Espera a que termine una o a que transcurra el tiempo indicado en Retry-After. |
curl -X POST https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."},{"id":"2","text":"El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."}]}'const res = await fetch('https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."
},
{
"id": "2",
"text": "El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio.",
},
{
"id": "2",
"text": "El comité se reunió el martes para revisar el plan de la nueva biblioteca. Sus integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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
Humanizar un texto. El Humanizador de IA con comprobaciones de datos: conserva cifras, nombres y citas. Si una reescritura cambia algún dato, se corrige o se informa del cambio. El modo "custom" (Pro) escribe con tu estilo a partir de una muestra de tu escritura.
En la API, el Humanizador de IA usa la reescritura estándar. La opción "Dedicar más tiempo" solo está disponible en el sitio.
Ámbito de la clave: rewrite
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que quieres analizar o reescribir. |
| mode | string | no | El modo de reescritura. Uno de estos valores: natural, formal, simple, academic, creative, shorten, expand, custom. Valor predeterminado: natural. |
| style_sample | string | no | Con el modo "custom": una muestra de tu escritura, de 150 a 2000 palabras, que se analiza en el servidor. Si la omites, se usa la muestra guardada en tu cuenta. |
| tab | string | no | La pestaña del Humanizador de IA define el registro del texto reescrito. Estándar conserva el registro del texto original. Uno de estos valores: standard, academic, professional, casual. Valor predeterminado: standard. |
| strength | string | no | Normal conserva el contenido y el registro. Agresiva puede reorganizar el texto y omitir detalles, pero conserva todos los puntos principales. Algunas partes pueden sonar poco naturales. Uno de estos valores: regular, aggressive. Valor predeterminado: regular. |
| ownTouch | string | no | Un detalle, ejemplo u opinión con tus propias palabras, de hasta 400 caracteres, que se integra en el texto reescrito. |
| language | string | no | El código del idioma, como "en" o "de". Si lo omites, 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 el texto reescrito, o null. |
| passes | integer | El número de versiones generadas antes de elegir esta. |
| facts | object | Los resultados de las comprobaciones de datos y, si una versión no las supera, los motivos. |
| late | boolean | Es true cuando se ha devuelto el texto reescrito al alcanzar el límite de tiempo, con las comprobaciones aún sin terminar. |
| usage | Usage | El consumo contabilizado en esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | Falta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla. |
| 422 | too_short | El texto no alcanza la longitud mínima. Envía un texto más largo. |
| 400 | unknown_mode | Esta ruta no admite el modo indicado. Elige un modo compatible. |
| 400 | unknown_option | La pestaña o la 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 ningún consumo. Elige opciones incluidas en tu plan o cambia de plan. |
| 400 | no_sample | El modo "custom" requiere una muestra de escritura. Envíala con la solicitud o guárdala en tu cuenta. |
| 400 | sample_too_short | La muestra de escritura no alcanza la longitud mínima. Envía una muestra más larga. |
| 400 | sample_too_long | La muestra de escritura supera la longitud máxima. Envía una muestra más corta. |
| 429 | concurrency_limited | Esta clave ya tiene el máximo permitido de llamadas de este tipo en curso. Espera a que termine una o a que transcurra el tiempo indicado en Retry-After. |
| 422 | no_rewrite | El motor ha respondido, pero ningún borrador ha superado las comprobaciones: estaban vacíos, eran respuestas de rechazo o copiaban el texto original. No se ha contabilizado ningún consumo. Prueba a reformular el texto y vuelve a enviarlo. |
| 503 | timeout | La reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado ningún consumo. Vuelve a intentarlo o envía un texto más corto. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
curl -X POST https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."}'const res = await fetch('https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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
Parafrasear un texto. El Parafraseador, con los mismos modos que la herramienta del sitio.
Ámbito de la clave: rewrite
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que quieres analizar o reescribir. |
| mode | string | no | El modo de reescritura. Uno de estos valores: standard, fluency, formal, academic, simple, creative, expand, shorten. Valor predeterminado: standard. |
| strength | string | no | Cuánto puede alejarse la reescritura del original. Uno de estos valores: readable, balanced, strong. Valor predeterminado: balanced. |
| readability | string | no | El registro que se usará al escribir. Uno de estos valores: casual, professional, academic, creative. Valor predeterminado: professional. |
| purpose | string | no | La finalidad del texto. Uno de estos valores: general, essay, article, email, marketing, report, story. Valor predeterminado: general. |
| synonyms | string | no | El grado de libertad para sustituir palabras. Uno de estos valores: few, some, many. Valor predeterminado: some. |
| freezeWords | array de string | no | Palabras y frases que deben conservarse tal como las escribas: un máximo de 25, de hasta 60 caracteres cada una. Sus palabras se incluyen en el cómputo de la llamada. |
| customInstruction | string | no | Una instrucción breve para la reescritura, de hasta 500 caracteres. Sus palabras se incluyen en el cómputo de la llamada. |
| language | string | no | El código del idioma, como "en" o "de". Si lo omites, se detecta a partir del texto. |
| closedLoop | boolean | no | Usa false para omitir el ciclo de comprobación y corrección. 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 el texto reescrito, o null. |
| passes | integer | El número de versiones generadas antes de elegir esta. |
| facts | object | Los resultados de las comprobaciones de datos y, si una versión no las supera, los motivos. |
| late | boolean | Es true cuando se ha devuelto el texto reescrito al alcanzar el límite de tiempo, con las comprobaciones aún sin terminar. |
| usage | Usage | El consumo contabilizado en esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | Falta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla. |
| 422 | too_short | El texto no alcanza la longitud mínima. Envía un texto más largo. |
| 400 | unknown_mode | Esta ruta no admite el modo indicado. Elige un modo compatible. |
| 400 | option_invalid | freezeWords no es una lista de palabras o frases. No se contabilizó nada. |
| 400 | option_too_long | freezeWords o customInstruction supera su límite. No se contabilizó 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 a que transcurra el tiempo indicado en Retry-After. |
| 422 | no_rewrite | El motor ha respondido, pero ningún borrador ha superado las comprobaciones: estaban vacíos, eran respuestas de rechazo o copiaban el texto original. No se ha contabilizado ningún consumo. Prueba a reformular el texto y vuelve a enviarlo. |
| 503 | timeout | La reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado ningún consumo. Vuelve a intentarlo o envía un texto más corto. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
curl -X POST https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."}'const res = await fetch('https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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
Resumir un texto. El Resumidor de textos, con resultados en forma de frases clave, un párrafo o una lista con viñetas.
Ámbito de la clave: summarize
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que quieres analizar o reescribir. |
| mode | string | no | El formato del resumen. Uno de estos valores: key-sentences, paragraph, bullets. Valor predeterminado: key-sentences. |
| length | string | no | La extensión del resumen. Uno de estos valores: short, medium, long. Valor predeterminado: medium. |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| text | string | El resumen. |
| usage | Usage | El consumo contabilizado en esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | Falta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla. |
| 422 | too_short | El texto no alcanza la longitud mínima. Envía un texto más largo. |
| 429 | concurrency_limited | Esta clave ya tiene el máximo permitido de llamadas de este tipo en curso. Espera a que termine una o a que transcurra el tiempo indicado en Retry-After. |
| 503 | timeout | La reescritura ha tardado demasiado y se ha detenido. No se ha contabilizado ningún consumo. Vuelve a intentarlo o envía un texto más corto. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
curl -X POST https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."}'const res = await fetch('https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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
Revisar gramática. Problemas de gramática, ortografía, puntuación y estilo, cada uno con su ubicación en el texto y sugerencias de sustitución.
Ámbito de la clave: grammar
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| text | string | sí | El texto que quieres analizar o reescribir. |
| language | string | no | El código del 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 detectados, en el orden en que aparecen. |
| usage | Usage | El consumo contabilizado en esta llamada. |
Errores específicos de esta ruta
| Estado | Código | Significado |
|---|---|---|
| 400 | no_text | Falta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla. |
| 503 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
| 502 | engine_unavailable | El motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
| 503 | engine_starting | El motor se está iniciando y no ha estado listo a tiempo. No se ha contabilizado ningún consumo. Vuelve a intentarlo en un minuto. |
| 504 | engine_timeout | El motor no ha terminado de procesar el texto a tiempo. No se ha contabilizado ningún consumo. Vuelve a intentarlo o envía un texto más corto. |
curl -X POST https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en el resto del edificio."}'const res = await fetch('https://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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://textlume.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 integrantes acordaron ampliar el horario de la sala de lectura entre semana y pidieron al personal que preparara un presupuesto para las horas adicionales. En la próxima reunión se analizarán los costos, la cantidad prevista de visitantes y el efecto en 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
Si se produce un error, la respuesta incluye el estado HTTP y un cuerpo con esta estructura. Usa el código para decidir cómo actuar. El mensaje explica qué ha fallado y qué hacer a continuación.
Errores comunes a todas las rutas
| Estado | Código | Significado |
|---|---|---|
| 401 | key_in_url | La clave se ha enviado en la URL. Envíala en el encabezado Authorization. |
| 401 | no_key | No se ha enviado ninguna clave. Inclúyela en el encabezado Authorization. |
| 401 | bad_key | La clave no es válida o se ha revocado. Usa una clave válida. |
| 403 | out_of_scope | La clave no tiene el permiso que requiere esta ruta. Usa una clave con el permiso necesario. |
| 429 | rate_limited | Se han enviado demasiadas solicitudes con esta clave. Espera el tiempo indicado en Retry-After. |
| 403 | plan_lapsed | El plan de la cuenta ya no incluye acceso a la API. Revisa tu plan para recuperar el acceso. |
| 413 | too_large | La solicitud es demasiado grande. Reduce su tamaño y vuelve a enviarla. |
| 400 | bad_body | El cuerpo de la solicitud no es un objeto JSON. Envía un objeto JSON válido. |
| 413 | too_many_words | La llamada supera el límite de palabras por llamada. Divídela en llamadas más pequeñas. No se contabilizó nada. |
| 402 | quota_exhausted | Se han agotado las palabras del plan para la API en este periodo de facturación y no queda saldo de paquetes de palabras. No se ha contabilizado ningún consumo. Añade un paquete de palabras o espera al próximo periodo. |
| 402 | quota_short | La llamada requiere más palabras de las que quedan entre el plan para la API y el saldo de paquetes de palabras. No se ha contabilizado ningún consumo. Envía menos texto o añade un paquete de palabras. |
| 402 | monthly_ceiling | La cuenta ha alcanzado su límite de uso de la API para este periodo de facturación. Este límite se aplica aunque quede saldo. No se ha contabilizado ningún consumo. Espera al próximo periodo. |
| 503 | store_unavailable | No se ha podido consultar la clave, el recuento de palabras de la cuenta o su muestra de escritura guardada, o este despliegue no dispone de almacenamiento de cuentas. No se ha ejecutado nada ni se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde. |
Cada llamada reserva las palabras antes de ejecutarse y las devuelve si falla. Si en ese momento no se puede actualizar el saldo, las palabras siguen descontadas. En ese caso, una llamada fallida lo indica e incluye "recorded": false en sus datos de uso. Una respuesta por lotes también incluye "recorded": false en sus datos de uso. No se hacen estimaciones del consumo.
{
"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
Todos los valores que se muestran aquí corresponden a los límites que aplica la API.
- Cada clave permite un máximo de 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 para humanizar, parafrasear o resumir. Si se supera el límite, la llamada adicional recibe la respuesta 429 concurrency_limited con una cabecera Retry-After.
- Cuando los motores están ocupados, los análisis de las cuentas Pro del sitio tienen prioridad sobre las llamadas a la API, por lo que una llamada a la API puede tener que esperar su turno.
- Un lote admite un máximo de 50 textos.
- Cada llamada admite un máximo de 20.000 palabras, ya sea en un solo texto o en un lote completo.
- El Detector de IA analiza un texto de hasta 90.000 caracteres, unas 10.000 palabras, en todos los planes. Si el texto supera ese límite, la respuesta es 413 text_too_long, aunque no se supere el límite de palabras por llamada.
- Una cuenta puede tener hasta 5 claves activas, lo que permite renovar una clave sin interrumpir el servicio.
Objetos de respuesta
Los objetos que devuelve cada endpoint, campo por campo.
Detection
| Campo | Tipo | Descripción |
|---|---|---|
| figure | number | El resultado de 0 a 100: la probabilidad de que el texto se haya generado con IA. En sus tarjetas e informes, el sitio muestra el punto medio entre low y high, que no siempre coincide con esta cifra. |
| low | number | El límite inferior del rango que rodea la cifra. |
| high | number | El extremo superior del rango en torno al valor. |
| uncertainty | number | La mitad de la amplitud del rango, en puntos. |
| verdict | string | La franja en la que se sitúa el valor. Indica una franja, nunca una conclusión sobre quién escribió el texto. Uno de estos valores: human, uncertain, ai. |
| confidence | string | El grado de confianza que ofrece el resultado. Uno de estos valores: low, medium, high. |
| sentences | array de SentenceScore | Un resultado por frase. |
| words | integer | Las palabras analizadas. |
| language | string | El idioma en el que se ha interpretado el texto. |
| model | string | El modelo que generó el resultado. |
| calibrated | boolean | Indica si el idioma tiene una curva ajustada. Si es false, el valor no debe usarse como resultado. |
| bandHumanFlagRate | number | null | La frecuencia con la que los textos humanos de esta franja se clasificaron como textos de IA en nuestras mediciones, o null. |
SentenceScore
| Campo | Tipo | Descripción |
|---|---|---|
| text | string | La frase. |
| score | number | La probabilidad, de 0 a 1, de que la frase se haya escrito con IA. |
| verdict | string | La franja en la que se sitúa la frase. Uno de estos valores: human, uncertain, ai. |
Usage
| Campo | Tipo | Descripción |
|---|---|---|
| recorded | boolean | Es true cuando se ha registrado el consumo. Solo es false cuando no se han podido devolver las palabras no analizadas de un lote. En ese caso, solo se incluye "words". |
| words | integer | Las palabras contabilizadas en esta llamada. |
| source | string | De dónde proceden las palabras: de las incluidas en el plan para la API, del saldo de paquetes de palabras o de ambos. Uno de estos valores: plan, balance, plan_and_balance. |
| fromPlan | integer | Las palabras descontadas de las incluidas en el plan para la API. Se incluye cuando recorded es true. |
| fromBalance | integer | Las palabras descontadas del saldo de paquetes de palabras. Se incluye cuando recorded es true. |
| allowanceLeft | integer | null | Las palabras del plan que quedan para esta herramienta en el periodo de facturación actual tras esta llamada. Es null si el plan no incluye palabras para esta herramienta. Se incluye cuando recorded es true. |
| balance | integer | El saldo de paquetes de palabras que queda tras esta llamada. Se incluye 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 el texto reescrito, o null. |
| passes | integer | El número de versiones generadas antes de elegir esta. |
| facts | object | Los resultados de las comprobaciones de datos y, si una versión no las supera, los motivos. |
| late | boolean | Es true cuando se ha devuelto el texto reescrito al alcanzar el límite de tiempo, con las comprobaciones aún sin terminar. |
GrammarIssue
| Campo | Tipo | Descripción |
|---|---|---|
| offset | integer | La posición donde empieza el problema en el texto enviado, en unidades de código UTF-16, como un índice de cadena de JavaScript. |
| length | integer | El número de unidades de código UTF-16 que abarca el problema en el texto enviado. |
| message | string | La descripción del problema. |
| shortMessage | string | La misma descripción, en pocas palabras. |
| category | string | El tipo de problema. Uno de estos valores: grammar, spelling, punctuation, style, typography. |
| replacements | array de string | Las sustituciones sugeridas, empezando por la mejor opción. |
| context | string | El texto que rodea el problema. |
BatchResult
| Campo | Tipo | Descripción |
|---|---|---|
| id | string | El identificador del elemento. |
| detection | Detection | El resultado, si el elemento ha devuelto uno. |
| error | object | El motivo por el que el elemento no ha devuelto un resultado. |
Error
| Campo | Tipo | Descripción |
|---|---|---|
| error | object | |
| usage | Usage | El consumo contabilizado en esta llamada. |
El servidor MCP
Un agente puede usar las mismas herramientas a través del Model Context Protocol. El servidor solo actúa como cliente de esta API, así que el agente obtiene exactamente el mismo resultado que ofrece el sitio.
- detect_textAnaliza un texto.
- detect_batchAnaliza varios textos.
- humanize_textHumaniza un texto e incluye comprobaciones de los 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 TEXTLUME_API_KEY, en el entorno donde se ejecuta el cliente:
Ejecuta esto en una terminal:
O guarda esta configuración en .mcp.json:
.mcp.json{ "mcpServers": { "textlume": { "type": "http", "url": "https://textlume.com/api/mcp", "headers": { "Authorization": "Bearer ${TEXTLUME_API_KEY}" } } } }Comprueba que funciona. Pídele a tu asistente: "Revisa este párrafo con Textlume e indica el rango y el nivel de confianza."
Encontrarás tu clave de API en la sección API de tu panel. Nunca guardes 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.
Descargar el archivo del servidorEn la aplicación, ve a Settings > Developer > Edit Config.
Añade esto a claude_desktop_config.json:
claude_desktop_config.json{ "mcpServers": { "textlume": { "command": "node", "args": [ "/path/to/server.mjs" ], "env": { "TEXTLUME_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: "Revisa este párrafo con Textlume e indica el rango y el nivel de confianza."
Encontrarás tu clave de API en la sección API de tu panel. Nunca guardes una clave en un archivo compartido ni en un repositorio.
Claude (claude.ai) Próximamente
Próximamente podrás conectar claude.ai iniciando sesión en tu cuenta de Textlume. Mientras tanto, ya puedes usar las mismas herramientas en Claude Desktop con el archivo del servidor, o en Claude Code, con la configuración de sus respectivas pestañas.
Solo si tu organización tiene habilitada la opción de encabezados de solicitud para conectores personalizados: añade la dirección con este encabezado.
ChatGPT Próximamente
Próximamente podrás conectar ChatGPT iniciando sesión en tu cuenta de Textlume. Mientras tanto, ya puedes usar las mismas herramientas en Codex y Claude Code con la configuración de sus respectivas pestañas.
Codex Se conecta en línea
Guarda tu clave de API en una variable de entorno llamada TEXTLUME_API_KEY, en el entorno donde se ejecuta el cliente:
Ejecuta esto en una terminal:
O guarda esta configuración en ~/.codex/config.toml:
~/.codex/config.toml[mcp_servers.textlume] url = "https://textlume.com/api/mcp" bearer_token_env_var = "TEXTLUME_API_KEY"En la aplicación, ve a MCP servers > Add server > Streamable HTTP.
Comprueba que funciona. Pídele a tu asistente: "Revisa este párrafo con Textlume e indica el rango y el nivel de confianza."
Encontrarás tu clave de API en la sección API de tu panel. Nunca guardes 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 TEXTLUME_API_KEY, en el entorno donde se ejecuta el cliente:
Añade esto a ~/.cursor/mcp.json:
~/.cursor/mcp.json{ "mcpServers": { "textlume": { "url": "https://textlume.com/api/mcp", "headers": { "Authorization": "Bearer ${env:TEXTLUME_API_KEY}" } } } }Comprueba que funciona. Pídele a tu asistente: "Revisa este párrafo con Textlume e indica el rango y el nivel de confianza."
Encontrarás tu clave de API en la sección API de tu panel. Nunca guardes 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": "textlume-key", "description": "Textlume API key", "password": true } ], "servers": { "textlume": { "type": "http", "url": "https://textlume.com/api/mcp", "headers": { "Authorization": "Bearer ${input:textlume-key}" } } } }Cuando se inicia el servidor, VS Code te pide la clave una sola vez y la guarda.
Comprueba que funciona. Pídele a tu asistente: "Revisa este párrafo con Textlume e indica el rango y el nivel de confianza."
Encontrarás tu clave de API en la sección API de tu panel. Nunca guardes 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 TEXTLUME_API_KEY, en el entorno donde se ejecuta el cliente:
En la aplicación, ve a Cascade > ... > Open MCP config file.
Añade esto a mcp_config.json:
mcp_config.json{ "mcpServers": { "textlume": { "serverUrl": "https://textlume.com/api/mcp", "headers": { "Authorization": "Bearer ${env:TEXTLUME_API_KEY}" } } } }Cierra Windsurf y vuelve a abrirlo para que cargue el servidor.
Comprueba que funciona. Pídele a tu asistente: "Revisa este párrafo con Textlume e indica el rango y el nivel de confianza."
Encontrarás tu clave de API en la sección API de tu panel. Nunca guardes 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 TEXTLUME_API_KEY, en el entorno donde se ejecuta el cliente:
Ejecuta esto en una terminal:
O guarda esta configuración en ~/.gemini/settings.json:
~/.gemini/settings.json{ "mcpServers": { "textlume": { "httpUrl": "https://textlume.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }Comprueba que funciona. Pídele a tu asistente: "Revisa este párrafo con Textlume e indica el rango y el nivel de confianza."
Encontrarás tu clave de API en la sección API de tu panel. Nunca guardes una clave en un archivo compartido ni en un repositorio.
Other clients En línea, con un puente o con el 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 conectarse a la dirección mediante el puente de código abierto mcp-remote, que necesita Node.js:
O ejecuta directamente nuestro archivo del servidor:
Descargar el archivo del servidor
Encontrarás tu clave de API en la sección API de tu panel. Nunca guardes una clave en un archivo compartido ni en un repositorio.
Cada resultado que recibe un agente incluye el valor obtenido, la incertidumbre asociada y el estado de calibración. Así, el agente puede explicar qué significa el resultado y cuándo no debe usarse.
Tu clave
Inicia sesión y crea una clave en tu panel.
Las claves no se crean en esta página.
Qué hacen la API y el servidor MCP