Página web a texto
A veces no quiere estructura, enlaces ni formato — solo quiere las palabras. Esta API de URL a texto renderiza una página y devuelve únicamente su prosa legible, las frases simples que una persona leería en voz alta si se le quitara toda etiqueta alrededor.
Ejecútela online
Ejecute esto en nuestros servidores con su cuenta. Las herramientas gratuitas corren en su navegador; esta cobra de su saldo del KIT según el precio de arriba.
Cuándo el texto plano gana a cualquier otro formato
Markdown conserva estructura; el HTML lo conserva todo. El texto plano no conserva ninguna de las dos cosas, y ahí está la gracia para tareas como índices de búsqueda por palabra clave, análisis de sentimiento, detección de idioma o conteo de palabras, donde los encabezados y los hipervínculos son ruido, no señal. Quien construye un flujo que solo necesita 'qué dice esta página, en palabras' ha estado recibiendo de más con cualquier formato más rico.
Qué elimina realmente la conversión
La página se renderiza primero para capturar el contenido cargado dinámicamente, y luego se retira todo lo que no sea prosa: etiquetas, atributos, scripts y estilos en línea, elementos de navegación, y marcas de formato que Markdown o HTML habrían conservado. Lo que queda es texto legible continuo — párrafos en orden, sin caracteres de marcado que interrumpan el flujo que espera una herramienta de procesamiento de texto.
Un formato sin ambición, a propósito
El texto plano es el formato de intercambio más antiguo de la computación, anterior incluso a la web, y ha sobrevivido porque no exige nada de la herramienta que lo lee — sin analizador de etiquetas, sin sorpresas de codificación más allá del juego de caracteres. Reducir una página moderna, cargada de JavaScript, de vuelta a texto plano es una simplificación deliberada: cambia cada pista visual y estructural por un formato que cualquier script, por sencillo que sea, puede consumir sin librerías.
Por qué es distinto del conversor a Markdown
El endpoint hermano de Markdown conserva encabezados, listas y enlaces porque algún uso posterior quiere recuperar esa estructura. Este asume que no — que lo que consuma la salida no le importa la estructura, o impondrá la suya propia. Si no sabe cuál necesita, pregúntese si su siguiente paso vuelve a analizar el formato; si no, el texto plano es la respuesta más simple y liviana.
Cómo encaja en un flujo automatizado
Como los resultados llegan por webhook o por un enlace firmado de 24 horas, un paso de extracción de texto se combina limpiamente con lo que venga después — un clasificador, un indexador de búsqueda, una llamada de traducción, un trabajo de detección de duplicados. Sin archivo HTML intermedio que limpiar, sin Markdown que despojar de nuevo si su herramienta posterior quería texto desde el principio.
Qué puede hacer con ella
Indexación de búsqueda
Alimente un índice de búsqueda con el texto plano de la página en lugar de analizar HTML cada vez que se indexa un documento.
Flujos de sentimiento y PLN
Extraiga el texto legible de páginas de reseñas o noticias antes de correr análisis de sentimiento o extracción de entidades sobre él.
Chequeos de duplicados y plagio
Compare el texto plano de dos URLs para detectar contenido copiado sin que diferencias de formato generen falsos negativos.
Preprocesamiento para traducción
Reduzca primero la página a texto y envíe esa prosa limpia al endpoint de traducción en vez de traducir marcado por error.
Preguntas frecuentes
¿En qué se diferencia del conversor a Markdown?
Markdown conserva encabezados, listas y enlaces; este endpoint conserva solo la prosa, sin ningún marcador estructural.
¿Renderiza el JavaScript primero?
Sí, la página se renderiza antes de la extracción para incluir el texto construido por frameworks del lado del cliente, no solo la respuesta HTML cruda.
¿Aparecen la navegación y los anuncios en el texto?
No, el relleno como menús, pies de página y bloques publicitarios queda excluido para que la salida sea solo el contenido legible de la página.
¿Hay periodo de prueba gratuito?
No hay capa gratuita: las capas gratis se abusan y ralentizan a todos. El acceso funciona con un saldo prepago de ForHosting KIT: se recarga desde $10.00 (no caduca) y cada solicitud se cobra a su precio publicado, así que una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens ni créditos inventados, y una tarea fallida no se cobra.
¿Cuánto cuesta?
$0.040 por solicitud más $0.001 por URL, publicado y el mismo sin importar cuán largo resulte el texto extraído.
¿Puedo enviar varias URLs a la vez?
Sí, una sola solicitud puede incluir varias URLs, cada una facturada a la tarifa por URL publicada.
¿Qué pasa si la extracción falla en una página?
Reintenta automáticamente hasta tres veces; una corrida que sigue fallando devuelve un error claro y nunca se cobra.
¿Cómo recibo el texto?
Por webhook firmado cuando termina la tarea, o por un enlace firmado válido por 24 horas si prefiere obtenerlo directamente.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/web/to-text \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://ejemplo.com"}'const res = await fetch("https://api.kit.forhosting.com/web/to-text", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"url": "https://ejemplo.com"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/to-text",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"url": "https://ejemplo.com"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/to-text", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"url":"https://ejemplo.com"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://ejemplo.com"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/to-text", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"url": "https://ejemplo.com"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.to_text",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
timeout_sec | 30 |
max_crawl_pages | 25 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
422 | task_failed | La tarea falló tras 3 reintentos. No se cobra. |