Respuesta rápida
¿Qué parámetros acepta el endpoint de lectura de WebReaderAPI?
El endpoint /read de WebReaderAPI necesita un parámetro, url. Los opcionales eligen la salida (format), cuánto de la página conservar (main_content), si se ejecuta un navegador (render), enlaces e imágenes, el país de lectura, un límite de caracteres y un timeout. Una página simple cuesta 1 crédito, 2 con navegador, desde 0,07 US$/1K páginas a octubre de 2026. Sin KYC; paga con criptomonedas.
/read at a glance
| Métodos | GET con parámetros de consulta, o POST con un cuerpo JSON usando los mismos nombres |
|---|---|
| URL | https://webreaderapi.com/api/v1/read |
| Obligatorio | url: una dirección http o https, de hasta 2,048 caracteres |
| Salida predeterminada | Markdown del contenido principal |
| Facturación | 1 crédito = 1 página leída sin navegador; 2 créditos cuando la página necesita un navegador para renderizar JavaScript. Una solicitud que falla, o que el robots.txt de un sitio rechaza, no se cobra |
| País | Elegir el país desde el que se lee una página añade 10 créditos, porque la página se lee entonces a través de una conexión residencial en ese país |
| Los archivos PDF de hasta 20 MB y 100 páginas se convierten a Markdown, a 1 crédito por cada bloque de 10 páginas iniciado | |
| Identidad del rastreador | WebReaderAPI/1.0 (+https://webreaderapi.com/bot/) |
Leer una página (GET)
GET/api/v1/read
Obtiene una página pública y devuelve su contenido principal como Markdown, con los metadatos de la página. Los parámetros van en la query string, codificados en URL. El ejemplo lee una entrada de blog; los IDs, fechas y valores son ilustrativos.
Autenticación: clave API en el encabezado Authorization: Bearer API_KEY.
Parámetros
| Nombre | En | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
url | query | string | Sí | La página a leer: http o https, como máximo 2,048 caracteres. Se rechazan las direcciones privadas, locales y de metadatos de la nube. |
format | query | string | No | markdown (predeterminado), text (texto plano, sin marcado) o html (HTML limpio del contenido). |
main_content | query | boolean | No | true (predeterminado) conserva solo el artículo o contenido principal; false convierte toda la página, menús y pie incluidos. |
render | query | string | No | auto (predeterminado) inicia un navegador solo cuando el HTML sin procesar contiene muy poco texto; true siempre; false nunca. Una página renderizada cuesta 2 créditos. |
include_links | query | boolean | No | true añade una lista links de {url, text}. Predeterminado false. |
include_images | query | boolean | No | true conserva las imágenes como  en el Markdown. Predeterminado false. |
country | query | string | No | Código de país de dos letras (ISO 3166-1 alpha-2). La página se lee desde una dirección en ese país, por 10 créditos extra (conexión residencial). |
max_chars | query | integer | No | Corta la salida en este número de caracteres, de 1,000 a 500,000. Útil para ajustarse al contexto de un modelo. |
timeout | query | integer | No | Segundos de espera para el sitio, de 5 a 60. Por defecto, 30. |
api_key | query | string | No | Tu clave, si no envías el encabezado Authorization. |
Respuesta 200
{
"url": "https://example.com/blog/first-post",
"final_url": "https://example.com/blog/first-post",
"status_code": 200,
"fetched_at": "2026-10-22T09:41:12Z",
"rendered": false,
"credits_used": 1,
"title": "Our first post",
"description": "Why we started this blog and what comes next.",
"language": "en",
"author": "Jane Doe",
"published_at": "2026-10-01",
"site_name": "Example Blog",
"markdown": "# Our first post\n\nWe started this blog to share what we learn...\n\n## What comes next\n\n- A post every month\n- Notes from our team",
"word_count": 612
}Ejemplos de código
curl -sG "https://webreaderapi.com/api/v1/read" \
-H "Authorization: Bearer $WEBREADER_API_KEY" \
--data-urlencode "url=https://example.com/blog/first-post" \
-d format=markdown -d max_chars=20000import os
import requests
resp = requests.get(
"https://webreaderapi.com/api/v1/read",
headers={"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]},
params={"url": "https://example.com/blog/first-post", "max_chars": 20000},
timeout=70,
)
resp.raise_for_status()
print(resp.json()["markdown"][:300])const params = new URLSearchParams({ url: 'https://example.com/blog/first-post', max_chars: '20000' });
const res = await fetch(`https://webreaderapi.com/api/v1/read?${params}`, {
headers: { Authorization: `Bearer ${process.env.WEBREADER_API_KEY}` },
});
const page = await res.json();
console.log(page.markdown.slice(0, 300));Leer una página (POST)
POST/api/v1/read
El mismo endpoint, los mismos parámetros, enviados como cuerpo JSON. Prefiere POST cuando la URL sea muy larga o cuando tu cliente HTTP genere JSON más fácilmente que cadenas de consulta. La respuesta es idéntica a la de la forma GET.
Autenticación: clave API en el encabezado Authorization: Bearer API_KEY.
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
url | string | Sí | La página que se va a leer. |
format, main_content, render, include_links, include_images, country, max_chars, timeout | mixed | No | Como en la tabla GET de arriba, con tipos JSON: booleanos como true/false, números sin comillas. |
{
"url": "https://example.com/app/pricing",
"render": "true",
"country": "de",
"include_links": true,
"max_chars": 30000
}Respuesta 200
{
"url": "https://example.com/app/pricing",
"final_url": "https://example.com/de/app/pricing",
"status_code": 200,
"fetched_at": "2026-10-22T09:44:03Z",
"rendered": true,
"credits_used": 3,
"title": "Pricing",
"language": "de",
"markdown": "# Pricing\n\n| Plan | Price |\n|---|---|\n| Basic | ... |",
"word_count": 214,
"links": [
{
"url": "https://example.com/de/contact",
"text": "Contact"
}
]
}Ejemplos de código
curl -s "https://webreaderapi.com/api/v1/read" \
-H "Authorization: Bearer $WEBREADER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/app/pricing", "render": "true", "country": "de", "include_links": true}'import os
import requests
resp = requests.post(
"https://webreaderapi.com/api/v1/read",
headers={"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]},
json={"url": "https://example.com/app/pricing", "render": "true", "country": "de", "include_links": True},
timeout=70,
)
print(resp.json()["credits_used"], "credits")const res = await fetch('https://webreaderapi.com/api/v1/read', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WEBREADER_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ url: 'https://example.com/app/pricing', render: 'true', country: 'de', include_links: true }),
});
console.log((await res.json()).credits_used);¿Qué formato de salida debo elegir?
Elige markdown para modelos de lenguaje y RAG: los encabezados, las listas, las tablas y los enlaces se conservan, y el texto se mantiene compacto. Elige text cuando solo cuentes palabras, clasifiques o busques, y el marcado suponga ruido. Elige html cuando tu propio pipeline ya analice HTML y solo quieras eliminar el ruido.
Los campos de metadatos son los mismos en los tres formatos. Solo cambia el nombre del campo de contenido: markdown, text o html.
¿Cuándo debo poner main_content en false?
Ponlo en false cuando lo que necesites sean las partes que rodean al artículo. Por ejemplo, la navegación de un sitio para mapear sus secciones, un pie de página con datos legales o de contacto, o una página de producto cuyas especificaciones estén en una barra lateral.
Con el valor predeterminado true, el extractor conserva el bloque de contenido principal y descarta la navegación, los banners de cookies, los anuncios, los botones de compartir y los pies de página. Eso es lo que quieren la mayoría de los agentes y pipelines de RAG, y a menudo reduce una página a una fracción del tamaño de su HTML.
¿Cómo decide render=auto usar un navegador?
Primero obtiene el HTML en bruto, lo que es rápido y cuesta 1 crédito. Si ese HTML contiene muy poco texto legible, normalmente una app que construye la página con JavaScript, vuelve a cargar la página en un navegador headless y la llamada cuesta 2 créditos. La respuesta te indica qué ruta se ejecutó: rendered es true o false.
Ponlo en render=false cuando sepas que el sitio sirve HTML completo y quieras un coste fijo. Ponlo en render=true para aplicaciones de una sola página, para omitir el primer intento.
¿Qué cambian country y max_chars?
country lee la página desde una dirección en el país que indiques, con el mismo User-Agent. Úsalo para páginas cuyos precios, idioma o disponibilidad cambian según el país. Añade 10 créditos, porque la página se lee entonces a través de una conexión residencial, y no se puede usar con los países en los que el servicio no opera.
max_chars corta la salida después de esa cantidad de caracteres. No cambia el precio, pero protege la ventana de contexto de un agente: 20.000 caracteres es un valor predeterminado razonable para una sola página que se pasa a un modelo.
¿Puede /read procesar archivos PDF?
Sí. Cuando la URL devuelve un PDF, el texto vuelve como Markdown en el mismo campo markdown. Los archivos PDF de hasta 20 MB y 100 páginas se convierten a Markdown, a 1 crédito por cada bloque de 10 páginas iniciado. Los PDF escaneados sin capa de texto devuelven poco o ningún texto, porque no hay un paso de reconocimiento de caracteres.
Endpoint read: preguntas frecuentes
¿Sigue /read las redirecciones?
Sí, hasta 5. La respuesta indica la dirección que solicitaste en url y la dirección que realmente se leyó en final_url. Se rechaza una redirección a una dirección privada o local.
¿Puedo leer una página que requiere iniciar sesión?
No. Si un sitio rechaza nuestra solicitud, devolvemos su respuesta: nunca resolvemos CAPTCHAs, iniciamos sesión en cuentas ni intentamos saltar un bloqueo o un paywall. Las páginas detrás de un inicio de sesión o un muro de pago devuelven la negativa del sitio, y la llamada es gratuita.
¿Se comprueba robots.txt en cada llamada?
Sí, contra una copia del robots.txt del sitio que tiene como máximo 24 horas. Una URL no permitida devuelve 403 blocked_by_robots y no consume ningún crédito.
¿Cuántas páginas puedo leer al mismo tiempo?
Cada cuenta tiene un límite de cuántas páginas lee a la vez; tu panel lo muestra y el soporte puede ampliarlo. Para muchas URL, un trabajo por lotes es más sencillo que ejecutar muchas llamadas en paralelo.