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 |
{
"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
/readcompleta, exactamente como se describe arriba, para una página que se leyó; {url, error}para una página que no se leyó, dondeerrortiene el mismocodeymessageque un error de la API.
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 tiene un bucle de polling completo.
{
"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 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.