# Formato de respuesta de la API Read, campo por campo

> Formato de respuesta de la API Read: campos que se devuelven para una página, desde markdown y word_count hasta final_url y rendered. Paga con criptomonedas.

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

Cada llamada a `/read` devuelve un objeto JSON: el contenido de la página en el formato que pediste, sus metadatos y tres campos que te indican qué ocurrió y cuánto costó. Los resultados de trabajos reutilizan el mismo objeto.

**Respuesta rápida — ¿Qué contiene la respuesta de lectura de WebReaderAPI?**

Una respuesta **WebReaderAPI** de `/read` contiene el contenido de la página en `markdown` (o `text` o `html`), sus metadatos (`title`, `description`, `author`, `published_at`, `language`, `site_name`, `word_count`) y los datos de la obtención: `final_url`, `status_code`, `rendered` y `credits_used`. Una página normal usa 1 crédito, desde 0,07 US$/1K páginas a partir de octubre de 2026. Sin KYC; paga con criptomonedas.

## ¿Qué campos describen la obtención?

Estos campos siempre están presentes en una respuesta correcta.

| Campo | Tipo | Significado |
| --- | --- | --- |
| `url` | string | La dirección que enviaste |
| `final_url` | string | La dirección que realmente se leyó, tras las redirecciones (5 como máximo) |
| `status_code` | integer | El código de estado HTTP que devolvió el sitio para la dirección final, normalmente 200 |
| `fetched_at` | string | Hora de la consulta, ISO 8601 en UTC |
| `rendered` | boolean | `true` cuando un navegador headless construyó la página |
| `credits_used` | integer | Créditos facturados por esta página: 1, 2 con navegador, más 10 con `country`; los PDF, 1 por cada 10 páginas iniciadas |

## ¿Qué campos describen la página?

Los metadatos provienen de la propia página: su etiqueta title, sus meta etiquetas, sus datos estructurados y la firma visible. Un campo que la página no proporciona está ausente, así que compruébalo antes de usarlo.

| Campo | Tipo | Significado |
| --- | --- | --- |
| `title` | string | El título de la página o del artículo |
| `description` | string | El resumen que la página da de sí misma |
| `language` | string | Código de idioma del contenido, como `en` o `de` |
| `author` | string | El autor indicado en la página |
| `published_at` | string | Fecha de publicación indicada por la página |
| `site_name` | string | El nombre del propio sitio |
| `word_count` | integer | Palabras del contenido devuelto, después de la extracción y antes de `max_chars` |

## ¿Dónde está el contenido en sí?

Se devuelve un campo de contenido, con el nombre del `format` que elegiste.

| Campo | Cuándo | Contenido |
| --- | --- | --- |
| `markdown` | `format=markdown` (predeterminado) | Encabezados, párrafos, listas, tablas y enlaces en Markdown; también imágenes con `include_images=true` |
| `text` | `format=text` | Texto plano, con párrafos separados por líneas en blanco |
| `html` | `format=html` | HTML limpio del contenido principal, sin scripts, estilos ni anuncios |
| `links` | `include_links=true` | Lista de `{url, text}` para los enlaces encontrados en la página, URLs absolutas |

*Una respuesta completa (los valores son ilustrativos)*

```json
{
  "url": "https://example.com/guides/compost",
  "final_url": "https://example.com/guides/compost-at-home",
  "status_code": 200,
  "fetched_at": "2026-10-22T10:02:44Z",
  "rendered": false,
  "credits_used": 1,
  "title": "Compost at home: a beginner's guide",
  "description": "What to put in a compost bin, and what to leave out.",
  "language": "en",
  "author": "Sam Rivera",
  "published_at": "2026-09-14",
  "site_name": "Example Garden",
  "markdown": "# Compost at home: a beginner's guide\n\nA compost bin turns kitchen scraps into soil...\n\n## What goes in\n\n- Fruit and vegetable peels\n- Coffee grounds\n\nSee also [Choosing a bin](https://example.com/guides/bins).",
  "word_count": 1184,
  "links": [
    { "url": "https://example.com/guides/bins", "text": "Choosing a bin" }
  ]
}
```

## ¿Cómo distingo una página renderizada de una simple?

Fíjate en `rendered`. Con `render=auto`, la API primero lee el HTML en bruto; solo arranca un navegador cuando ese HTML contiene muy poco texto, y entonces pone `rendered` en `true` y `credits_used` en 2. Si un sitio que lees a menudo siempre vuelve renderizado, envía `render=true` desde el principio: el coste es el mismo y te ahorras un primer paso inútil.

Si una página vuelve sin renderizar pero con poco contenido, compara `word_count` con lo que ves en un navegador. Un recuento bajo suele significar que el contenido necesita JavaScript; reinténtalo una vez con `render=true`.

## ¿Por qué final_url puede diferir de url?

Porque los sitios redirigen. Un enlace corto, una dirección antigua, una barra final que falta o un cambio de idioma te envían a otro sitio. La API sigue hasta 5 redirecciones y comunica la dirección que finalmente leyó en `final_url`.

Guarda `final_url` como la fuente canónica de un documento en un índice RAG. Dos valores distintos de `url` que terminan en el mismo `final_url` son la misma página, así que puedes descartar el duplicado antes de generar el embedding.

## ¿Cómo es el resultado de un job?

`GET https://webreaderapi.com/api/v1/jobs/{job_id}` devuelve `job_id`, `status` (`queued`, `running` o `done`), `results`, `next_cursor` y el `credits_used` en curso del job. Cada elemento de `results` tiene una de dos formas:

- una respuesta `/read` completa, exactamente como se describe arriba, para una página que se leyó;
- `{url, error}` para una página que no se leyó, donde `error` tiene el mismo `code` y `message` que un [error de la API](https://webreaderapi.com/es/docs/errors/).

`next_cursor` está presente mientras haya más resultados listos; envíalo de vuelta como `cursor` para obtenerlos. La [página de batch y crawl](https://webreaderapi.com/es/docs/crawl/) tiene un bucle de polling completo.

*Una página de resultado de un job (los valores son ilustrativos)*

```json
{
  "job_id": "job_5c1e8a90d2",
  "status": "done",
  "results": [
    { "url": "https://example.com/blog/post-1", "final_url": "https://example.com/blog/post-1", "status_code": 200, "rendered": false, "credits_used": 1, "title": "Post one", "markdown": "# Post one\n\n...", "word_count": 802 },
    { "url": "https://example.org/members/area", "error": { "code": "target_refused", "message": "The site refused the request.", "target_status": 403 } }
  ],
  "credits_used": 1
}
```

## ¿Cómo es una respuesta de error?

Un error vuelve con un estado HTTP de 400 o superior y un cuerpo JSON `{"error": {"code", "message"}}`. Cuando el propio sitio rechazó la solicitud, `target_status` indica el estado que envió el sitio. Ningún error se factura. La [página de errores](https://webreaderapi.com/es/docs/errors/) enumera cada código con su causa y si un reintento puede ayudar.

## Formato de respuesta: preguntas frecuentes

### ¿Se corta el Markdown cuando establezco max_chars?

Sí. El campo content se detiene en ese número de caracteres. `word_count` sigue describiendo todo el contenido extraído, así que puedes ver cuánto se quedó fuera.

### ¿Por qué falta author o published_at?

Porque la página no lo indica de una forma que se pueda leer. Muchas páginas no dan autor ni fecha. Los campos ausentes se omiten en lugar de devolverse vacíos.

### ¿Los enlaces del Markdown son absolutos?

Los enlaces de la lista `links` son absolutos. Escribe tu código para aceptar ambas formas en el cuerpo Markdown, y resuelve los relativos contra `final_url`.

### ¿Puedo obtener el HTML en bruto de toda la página?

Lo más parecido es `format=html` con `main_content=false`, que devuelve la página entera limpia de scripts y estilos. El HTML original byte a byte no forma parte de la v1.

---

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.
