Saltar al contenido
Documentación para desarrolladores

La API v1 y el servidor MCP

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

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

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.

Ejemplo de solicitud
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."}'
Ejemplo de respuesta
{
  "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.

Autenticación
Authorization: Bearer YOUR_API_KEY

Endpoints

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

CampoTipoObligatorioDescripción
textstringsíEl texto que quieres analizar o reescribir.
languagestringnoEl código del idioma, como "en" o "de". Si lo omites, se detecta a partir del texto.
contentTypestringnoEl tipo de texto, como "essay" o "email", si quieres que el análisis use la curva correspondiente a ese tipo.

Respuesta

CampoTipoDescripción
figurenumberEl 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.
lownumberEl límite inferior del rango que rodea la cifra.
highnumberEl extremo superior del rango en torno al valor.
uncertaintynumberLa mitad de la amplitud del rango, en puntos.
verdictstringLa 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.
confidencestringEl grado de confianza que ofrece el resultado. Uno de estos valores: low, medium, high.
sentencesarray de SentenceScoreUn resultado por frase.
wordsintegerLas palabras analizadas.
languagestringEl idioma en el que se ha interpretado el texto.
modelstringEl modelo que generó el resultado.
calibratedbooleanIndica si el idioma tiene una curva ajustada. Si es false, el valor no debe usarse como resultado.
bandHumanFlagRatenumber | nullLa frecuencia con la que los textos humanos de esta franja se clasificaron como textos de IA en nuestras mediciones, o null.
usageUsageEl consumo contabilizado en esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textFalta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla.
422too_shortEl texto no alcanza la longitud mínima. Envía un texto más largo.
413text_too_longEl 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.
422not_calibratedEl análisis de este idioma aún no está disponible. Envía un texto en un idioma compatible.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
503engine_startingEl motor se está iniciando y no ha estado listo a tiempo. No se ha contabilizado ningún consumo. Vuelve a intentarlo en un minuto.
503engine_busyEl 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.
504engine_timeoutEl 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.
429concurrency_limitedEsta 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.
Ejemplo de solicitud
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."}'
Ejemplo de respuesta
{
  "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

CampoTipoObligatorioDescripción
itemsarray de objectsíLos textos, cada uno con su campo "text" y los campos opcionales "id", "language" y "contentType".
items[].idstringnoTu identificador para el elemento, que se devuelve junto con su resultado. Si lo omites, se usa la posición del elemento.
items[].textstringsíEl texto que quieres analizar o reescribir.
items[].languagestringnoEl código del idioma, como "en" o "de". Si lo omites, se detecta a partir del texto.
items[].contentTypestringnoEl tipo de texto, como "essay" o "email", si quieres que el análisis use la curva correspondiente a ese tipo.

Respuesta

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

Errores específicos de esta ruta

EstadoCódigoSignificado
400batch_emptyFalta el campo "items" en el cuerpo de la solicitud o la lista está vacía. Incluye una lista con al menos un elemento.
413batch_too_largeEl lote supera el límite de elementos. Divídelo en lotes más pequeños.
429concurrency_limitedEsta 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.
Ejemplo de solicitud
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."}]}'
Ejemplo de respuesta
{
  "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

CampoTipoObligatorioDescripción
textstringsíEl texto que quieres analizar o reescribir.
modestringnoEl modo de reescritura. Uno de estos valores: natural, formal, simple, academic, creative, shorten, expand, custom. Valor predeterminado: natural.
style_samplestringnoCon 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.
tabstringnoLa 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.
strengthstringnoNormal 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.
ownTouchstringnoUn detalle, ejemplo u opinión con tus propias palabras, de hasta 400 caracteres, que se integra en el texto reescrito.
languagestringnoEl código del idioma, como "en" o "de". Si lo omites, se detecta a partir del texto.

Respuesta

CampoTipoDescripción
textstringEl texto reescrito.
beforeDetectionEl resultado del detector para tu texto, o null si no lo hay.
afterDetectionEl resultado del detector para el texto reescrito, o null.
passesintegerEl número de versiones generadas antes de elegir esta.
factsobjectLos resultados de las comprobaciones de datos y, si una versión no las supera, los motivos.
latebooleanEs true cuando se ha devuelto el texto reescrito al alcanzar el límite de tiempo, con las comprobaciones aún sin terminar.
usageUsageEl consumo contabilizado en esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textFalta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla.
422too_shortEl texto no alcanza la longitud mínima. Envía un texto más largo.
400unknown_modeEsta ruta no admite el modo indicado. Elige un modo compatible.
400unknown_optionLa pestaña o la intensidad no está disponible en esta ruta.
402plan_requiredEl modo, la pestaña, la intensidad o el toque personal requieren un plan que la cuenta no tiene. El modo "custom" requiere Pro. No se ha contabilizado ningún consumo. Elige opciones incluidas en tu plan o cambia de plan.
400no_sampleEl modo "custom" requiere una muestra de escritura. Envíala con la solicitud o guárdala en tu cuenta.
400sample_too_shortLa muestra de escritura no alcanza la longitud mínima. Envía una muestra más larga.
400sample_too_longLa muestra de escritura supera la longitud máxima. Envía una muestra más corta.
429concurrency_limitedEsta 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.
422no_rewriteEl 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.
503timeoutLa 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.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
Ejemplo de solicitud
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."}'
Ejemplo de respuesta
{
  "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

CampoTipoObligatorioDescripción
textstringsíEl texto que quieres analizar o reescribir.
modestringnoEl modo de reescritura. Uno de estos valores: standard, fluency, formal, academic, simple, creative, expand, shorten. Valor predeterminado: standard.
strengthstringnoCuánto puede alejarse la reescritura del original. Uno de estos valores: readable, balanced, strong. Valor predeterminado: balanced.
readabilitystringnoEl registro que se usará al escribir. Uno de estos valores: casual, professional, academic, creative. Valor predeterminado: professional.
purposestringnoLa finalidad del texto. Uno de estos valores: general, essay, article, email, marketing, report, story. Valor predeterminado: general.
synonymsstringnoEl grado de libertad para sustituir palabras. Uno de estos valores: few, some, many. Valor predeterminado: some.
freezeWordsarray de stringnoPalabras 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.
customInstructionstringnoUna instrucción breve para la reescritura, de hasta 500 caracteres. Sus palabras se incluyen en el cómputo de la llamada.
languagestringnoEl código del idioma, como "en" o "de". Si lo omites, se detecta a partir del texto.
closedLoopbooleannoUsa false para omitir el ciclo de comprobación y corrección. Valor predeterminado: true.

Respuesta

CampoTipoDescripción
textstringEl texto reescrito.
beforeDetectionEl resultado del detector para tu texto, o null si no lo hay.
afterDetectionEl resultado del detector para el texto reescrito, o null.
passesintegerEl número de versiones generadas antes de elegir esta.
factsobjectLos resultados de las comprobaciones de datos y, si una versión no las supera, los motivos.
latebooleanEs true cuando se ha devuelto el texto reescrito al alcanzar el límite de tiempo, con las comprobaciones aún sin terminar.
usageUsageEl consumo contabilizado en esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textFalta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla.
422too_shortEl texto no alcanza la longitud mínima. Envía un texto más largo.
400unknown_modeEsta ruta no admite el modo indicado. Elige un modo compatible.
400option_invalidfreezeWords no es una lista de palabras o frases. No se contabilizó nada.
400option_too_longfreezeWords o customInstruction supera su límite. No se contabilizó nada.
429concurrency_limitedEsta 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.
422no_rewriteEl 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.
503timeoutLa 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.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
Ejemplo de solicitud
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."}'
Ejemplo de respuesta
{
  "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

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

Respuesta

CampoTipoDescripción
textstringEl resumen.
usageUsageEl consumo contabilizado en esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textFalta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla.
422too_shortEl texto no alcanza la longitud mínima. Envía un texto más largo.
429concurrency_limitedEsta 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.
503timeoutLa 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.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
Ejemplo de solicitud
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."}'
Ejemplo de respuesta
{
  "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

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

Respuesta

CampoTipoDescripción
issuesarray de GrammarIssueLos problemas detectados, en el orden en que aparecen.
usageUsageEl consumo contabilizado en esta llamada.

Errores específicos de esta ruta

EstadoCódigoSignificado
400no_textFalta el campo "text" en el cuerpo de la solicitud. Inclúyelo y vuelve a enviarla.
503engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
502engine_unavailableEl motor no ha respondido. No se ha contabilizado ningún consumo. Vuelve a intentarlo más tarde.
503engine_startingEl motor se está iniciando y no ha estado listo a tiempo. No se ha contabilizado ningún consumo. Vuelve a intentarlo en un minuto.
504engine_timeoutEl 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.
Ejemplo de solicitud
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."}'
Ejemplo de respuesta
{
  "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

EstadoCódigoSignificado
401key_in_urlLa clave se ha enviado en la URL. Envíala en el encabezado Authorization.
401no_keyNo se ha enviado ninguna clave. Inclúyela en el encabezado Authorization.
401bad_keyLa clave no es válida o se ha revocado. Usa una clave válida.
403out_of_scopeLa clave no tiene el permiso que requiere esta ruta. Usa una clave con el permiso necesario.
429rate_limitedSe han enviado demasiadas solicitudes con esta clave. Espera el tiempo indicado en Retry-After.
403plan_lapsedEl plan de la cuenta ya no incluye acceso a la API. Revisa tu plan para recuperar el acceso.
413too_largeLa solicitud es demasiado grande. Reduce su tamaño y vuelve a enviarla.
400bad_bodyEl cuerpo de la solicitud no es un objeto JSON. Envía un objeto JSON válido.
413too_many_wordsLa llamada supera el límite de palabras por llamada. Divídela en llamadas más pequeñas. No se contabilizó nada.
402quota_exhaustedSe 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.
402quota_shortLa 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.
402monthly_ceilingLa 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.
503store_unavailableNo 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.

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

Límites

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

CampoTipoDescripción
figurenumberEl 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.
lownumberEl límite inferior del rango que rodea la cifra.
highnumberEl extremo superior del rango en torno al valor.
uncertaintynumberLa mitad de la amplitud del rango, en puntos.
verdictstringLa 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.
confidencestringEl grado de confianza que ofrece el resultado. Uno de estos valores: low, medium, high.
sentencesarray de SentenceScoreUn resultado por frase.
wordsintegerLas palabras analizadas.
languagestringEl idioma en el que se ha interpretado el texto.
modelstringEl modelo que generó el resultado.
calibratedbooleanIndica si el idioma tiene una curva ajustada. Si es false, el valor no debe usarse como resultado.
bandHumanFlagRatenumber | nullLa frecuencia con la que los textos humanos de esta franja se clasificaron como textos de IA en nuestras mediciones, o null.

SentenceScore

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

Usage

CampoTipoDescripción
recordedbooleanEs 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".
wordsintegerLas palabras contabilizadas en esta llamada.
sourcestringDe 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.
fromPlanintegerLas palabras descontadas de las incluidas en el plan para la API. Se incluye cuando recorded es true.
fromBalanceintegerLas palabras descontadas del saldo de paquetes de palabras. Se incluye cuando recorded es true.
allowanceLeftinteger | nullLas 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.
balanceintegerEl saldo de paquetes de palabras que queda tras esta llamada. Se incluye cuando recorded es true.

RewriteResult

CampoTipoDescripción
textstringEl texto reescrito.
beforeDetectionEl resultado del detector para tu texto, o null si no lo hay.
afterDetectionEl resultado del detector para el texto reescrito, o null.
passesintegerEl número de versiones generadas antes de elegir esta.
factsobjectLos resultados de las comprobaciones de datos y, si una versión no las supera, los motivos.
latebooleanEs true cuando se ha devuelto el texto reescrito al alcanzar el límite de tiempo, con las comprobaciones aún sin terminar.

GrammarIssue

CampoTipoDescripción
offsetintegerLa posición donde empieza el problema en el texto enviado, en unidades de código UTF-16, como un índice de cadena de JavaScript.
lengthintegerEl número de unidades de código UTF-16 que abarca el problema en el texto enviado.
messagestringLa descripción del problema.
shortMessagestringLa misma descripción, en pocas palabras.
categorystringEl tipo de problema. Uno de estos valores: grammar, spelling, punctuation, style, typography.
replacementsarray de stringLas sustituciones sugeridas, empezando por la mejor opción.
contextstringEl texto que rodea el problema.

BatchResult

CampoTipoDescripción
idstringEl identificador del elemento.
detectionDetectionEl resultado, si el elemento ha devuelto uno.
errorobjectEl motivo por el que el elemento no ha devuelto un resultado.

Error

CampoTipoDescripción
errorobject
usageUsageEl consumo contabilizado en esta llamada.
Servidor MCP

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

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

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

    claude mcp add --transport http textlume https://textlume.com/api/mcp --header "Authorization: Bearer $TEXTLUME_API_KEY"
  3. 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}"
          }
        }
      }
    }
  4. 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.

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.

Obtener tu clave en el panel

Las claves no se crean en esta página.

Qué hacen la API y el servidor MCP