# Referencia del endpoint de lectura: GET y POST /read

> Referencia del endpoint de lectura: parámetros GET y POST /read, desde format y render hasta country y max_chars, con ejemplos. Desde 0,07 US$/1K páginas.

- URL: https://webreaderapi.com/es/docs/read/
- Última actualización: 2026-10-22
- Editor: WebReaderAPI (https://webreaderapi.com)

`/read` obtiene una página pública, extrae su contenido principal y lo devuelve como Markdown, texto plano o HTML limpio. Esta página lista cada parámetro, su valor predeterminado y lo que cuesta.

**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

| Atributo | Valor |
| --- | --- |
| 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 |
| PDF | 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 `![alt](src)` 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`

```json
{
  "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
}
```

*curl*

```bash
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=20000
```

*Python*

```python
import 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])
```

*Node.js*

```javascript
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. |

*Ejemplo: a JavaScript-heavy page, read from Germany, with its links*

```json
{
  "url": "https://example.com/app/pricing",
  "render": "true",
  "country": "de",
  "include_links": true,
  "max_chars": 30000
}
```

**Respuesta** `200`

```json
{
  "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"
    }
  ]
}
```

*curl*

```bash
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}'
```

*Python*

```python
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")
```

*Node.js*

```javascript
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](https://webreaderapi.com/es/docs/crawl/) es más sencillo que ejecutar muchas llamadas en paralelo.

---

WebReaderAPI: WebReaderAPI es una API de lectura web para agentes de IA que convierte cualquier página web pública en Markdown limpio, pagando con criptomonedas y sin subir ningún documento de identidad. Los créditos prepago desde 0,07 US$/1K páginas nunca caducan y se respeta robots.txt. Sin KYC: ni documento de identidad, ni selfie, ni documentos. Paga con criptomonedas.
