# Formato de resposta da API de leitura, campo por campo

> Formato de resposta da API de leitura: campos por página, de markdown e word_count a final_url e rendered, e resultados de jobs. Sem KYC, pague com cripto.

- URL: https://webreaderapi.com/pt/docs/response/
- Última atualização: 2026-10-22
- Editor: WebReaderAPI (https://webreaderapi.com)

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.

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

*Uma resposta completa (os valores são 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" }
  ]
}
```

## 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](https://webreaderapi.com/pt/docs/errors/).

`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](https://webreaderapi.com/pt/docs/crawl/) tem um loop de polling completo.

*Uma página de resultado de tarefa (job) (valores 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
}
```

## 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](https://webreaderapi.com/pt/docs/errors/) 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.

---

WebReaderAPI: O WebReaderAPI é uma API de leitor web para agentes de IA que converte qualquer página web pública em Markdown limpo, pago com cripto e sem envio de documentos. Os créditos pré-pagos a partir de US$ 0,07/1K páginas nunca expiram, e o robots.txt é respeitado. Sem KYC — sem documento, sem selfie, sem envio de arquivos. Pague com cripto.
