Resposta rápida
O que a resposta de leitura do WebReaderAPI contém?
Uma resposta WebReaderAPI /read traz o conteúdo da página em markdown (ou text ou html), seus metadados (title, description, author, published_at, language, site_name, word_count) e os fatos da busca: final_url, status_code, rendered e credits_used. Uma página simples usa 1 crédito, a partir de US$ 0,07/1K páginas em outubro de 2026. Sem KYC; pague com cripto.
Quais campos descrevem a busca?
Estes campos estão sempre presentes em uma resposta bem-sucedida.
| Campo | Tipo | Significado |
|---|---|---|
url | string | O endereço que você enviou |
final_url | string | O endereço realmente lido, após redirecionamentos (no máximo 5) |
status_code | integer | O status HTTP que o site retornou para o endereço final, normalmente 200 |
fetched_at | string | Horário da requisição, ISO 8601 em UTC |
rendered | boolean | true quando um navegador headless montou a página |
credits_used | integer | Créditos cobrados por esta página: 1, 2 com um navegador, mais 10 com country; PDFs 1 a cada 10 páginas iniciadas |
Quais campos descrevem a página?
Os metadados vêm da própria página: sua tag title, meta tags, dados estruturados e a assinatura visível. Um campo que a página não fornece fica ausente, então teste antes de usar.
| Campo | Tipo | Significado |
|---|---|---|
title | string | O título da página ou do artigo |
description | string | O resumo que a página dá de si mesma |
language | string | Código de idioma do conteúdo, como en ou de |
author | string | O autor indicado na página |
published_at | string | Data de publicação informada pela página |
site_name | string | O nome do próprio site |
word_count | integer | Palavras no conteúdo retornado, após a extração e antes de max_chars |
Onde está o conteúdo em si?
Um campo de conteúdo é retornado, nomeado conforme o format que você escolheu.
| Campo | Quando | Conteúdo |
|---|---|---|
markdown | format=markdown (padrão) | Títulos, parágrafos, listas, tabelas e links em Markdown; imagens também com include_images=true |
text | format=text | Texto simples, com parágrafos separados por linhas em branco |
html | format=html | HTML limpo do conteúdo principal, sem scripts, estilos ou anúncios |
links | include_links=true | Lista de {url, text} para os links encontrados na página, URLs absolutos |
{
"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" }
]
}Como sei se uma página veio renderizada ou simples?
Veja rendered. Com render=auto, a API primeiro lê o HTML bruto; ela só inicia um navegador quando esse HTML tem texto de menos, e aí define rendered como true e credits_used como 2. Se um site que você lê com frequência sempre volta renderizado, envie render=true desde o início: o custo é o mesmo e você pula uma primeira etapa desperdiçada.
Se uma página voltar sem renderização mas com pouco texto, compare word_count com o que você vê no navegador. Uma contagem baixa geralmente significa que o conteúdo precisa de JavaScript; tente de novo uma vez com render=true.
Por que final_url pode ser diferente de url?
Porque os sites redirecionam. Um link curto, um endereço antigo, uma barra final ausente ou uma troca de idioma levam você para outro lugar. A API segue até 5 redirecionamentos e informa o endereço que finalmente leu em final_url.
Guarde final_url como a fonte canônica de um documento em um índice RAG. Dois valores de url diferentes que terminam no mesmo final_url são a mesma página, então você pode descartar a duplicata antes de gerar o embedding.
Como é o resultado de uma tarefa (job)?
GET https://webreaderapi.com/api/v1/jobs/{job_id} retorna job_id, status (queued, running ou done), results, next_cursor e o credits_used em execução da tarefa. Cada item de results tem uma de duas formas:
- uma resposta completa de
/read, exatamente como descrito acima, para uma página que foi lida; {url, error}para uma página que não foi, ondeerrortem os mesmoscodeemessagede um erro de API.
next_cursor está presente enquanto houver mais resultados prontos; envie-o de volta como cursor para obtê-los. A página de lote e crawl tem um loop 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
}Como é uma resposta de erro?
Um erro volta com status HTTP 400 ou mais e um corpo JSON {"error": {"code", "message"}}. Quando o próprio site recusou a solicitação, target_status traz o status que o site enviou. Nenhum erro é cobrado. A página de erros lista todos os códigos com a causa e se uma nova tentativa pode ajudar.
Formato da resposta: perguntas frequentes
O Markdown é cortado quando defino max_chars?
Sim. O campo content para nessa quantidade de caracteres. word_count ainda descreve todo o conteúdo extraído, então você pode ver quanto ficou de fora.
Por que author ou published_at estão ausentes?
Porque a página não informa isso de uma forma que possa ser lida. Muitas páginas não trazem autor nem data. Campos ausentes são omitidos em vez de retornados vazios.
Os links no Markdown são absolutos?
Os links na lista links são absolutos. Escreva seu código para aceitar os dois formatos no corpo do Markdown e resolva os relativos com base em final_url.
Posso obter o HTML bruto da página inteira?
O mais próximo é format=html com main_content=false, que retorna a página inteira limpa de scripts e estilos. O HTML original, byte a byte, não faz parte da v1.