Sem KYC — sem documento, sem selfie, sem envio de arquivos. Pague com cripto: BTC, USDT, USDC, ETH, SOL, LTC
Idioma: Português
Obtenha uma chave de API

Docs · resposta

Formato de resposta da API de leitura, campo por campo

Toda chamada /read retorna um objeto JSON: o conteúdo da página no formato que você pediu, seus metadados e três campos que dizem o que aconteceu e quanto custou. Os resultados de jobs reutilizam o mesmo objeto.

Última atualização: · 5 min de leitura

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.

CampoTipoSignificado
urlstringO endereço que você enviou
final_urlstringO endereço realmente lido, após redirecionamentos (no máximo 5)
status_codeintegerO status HTTP que o site retornou para o endereço final, normalmente 200
fetched_atstringHorário da requisição, ISO 8601 em UTC
renderedbooleantrue quando um navegador headless montou a página
credits_usedintegerCré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.

CampoTipoSignificado
titlestringO título da página ou do artigo
descriptionstringO resumo que a página dá de si mesma
languagestringCódigo de idioma do conteúdo, como en ou de
authorstringO autor indicado na página
published_atstringData de publicação informada pela página
site_namestringO nome do próprio site
word_countintegerPalavras 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.

CampoQuandoConteúdo
markdownformat=markdown (padrão)Títulos, parágrafos, listas, tabelas e links em Markdown; imagens também com include_images=true
textformat=textTexto simples, com parágrafos separados por linhas em branco
htmlformat=htmlHTML limpo do conteúdo principal, sem scripts, estilos ou anúncios
linksinclude_links=trueLista de {url, text} para os links encontrados na página, URLs absolutos
Uma resposta completa (os valores são ilustrativos)
{
  "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, onde error tem os mesmos code e message de 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.

Uma página de resultado de tarefa (job) (valores ilustrativos)
{
  "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 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.

A partir de US$ 0,07/1K páginas · sem KYC

Obtenha uma chave de API