# Referência do endpoint de leitura: GET e POST /read

> Endpoint de leitura: parâmetros de GET e POST /read, de format e render a country e max_chars, com exemplos. A partir de US$ 0,07/1K páginas.

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

`/read` busca uma página pública, extrai o conteúdo principal e devolve como Markdown, texto simples ou HTML limpo. Esta página lista cada parâmetro, seu padrão e quanto custa.

**Resposta rápida — Quais parâmetros o endpoint de leitura do WebReaderAPI aceita?**

O endpoint `/read` do **WebReaderAPI** precisa de um parâmetro, `url`. Os opcionais escolhem a saída (`format`), quanto da página manter (`main_content`), se um navegador roda (`render`), links e imagens, o país de leitura, um limite de caracteres e um timeout. Uma página simples custa 1 crédito, 2 com navegador, a partir de US$ 0,07/1K páginas em outubro de 2026. Sem KYC; pague com cripto.

## /read at a glance

| Atributo | Valor |
| --- | --- |
| Métodos | `GET` com parâmetros de consulta, ou `POST` com um corpo JSON usando os mesmos nomes |
| URL | `https://webreaderapi.com/api/v1/read` |
| Obrigatório | `url`: um endereço http ou https, de até 2.048 caracteres |
| Saída padrão | Markdown do conteúdo principal |
| Cobrança | 1 crédito = 1 página lida sem navegador; 2 créditos quando a página precisa de um navegador para renderizar JavaScript. Uma requisição que falha, ou que o robots.txt de um site recusa, não é cobrada |
| País | Escolher o país de onde a página é lida adiciona 10 créditos, porque a página passa a ser lida por uma conexão residencial naquele país |
| PDF | Arquivos PDF de até 20 MB e 100 páginas são convertidos em Markdown, a 1 crédito por bloco iniciado de 10 páginas |
| Identidade do crawler | `WebReaderAPI/1.0 (+https://webreaderapi.com/bot/)` |

## Ler uma página (GET)

`GET /api/v1/read`

Busca uma página pública e devolve seu conteúdo principal como Markdown, com os metadados da página. Os parâmetros vão na query string, codificados em URL. O exemplo lê um post de blog; IDs, datas e valores são ilustrativos.

Autenticação: chave de API no header `Authorization: Bearer API_KEY`.

**Parâmetros**

| Nome | Em | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- | --- |
| `url` | query | string | Sim | A página a ler: http ou https, no máximo 2.048 caracteres. Endereços privados, locais e de metadados de nuvem são recusados. |
| `format` | query | string | Não | `markdown` (padrão), `text` (texto simples, sem marcação) ou `html` (HTML limpo do conteúdo). |
| `main_content` | query | boolean | Não | `true` (padrão) mantém só o artigo ou conteúdo principal; `false` converte a página inteira, menus e rodapé incluídos. |
| `render` | query | string | Não | `auto` (padrão) inicia um navegador só quando o HTML bruto tem texto de menos; `true` sempre; `false` nunca. Uma página renderizada custa 2 créditos. |
| `include_links` | query | boolean | Não | `true` adiciona uma lista `links` de `{url, text}`. Padrão `false`. |
| `include_images` | query | boolean | Não | `true` mantém as imagens como `![alt](src)` no Markdown. Padrão `false`. |
| `country` | query | string | Não | Código de país de duas letras (ISO 3166-1 alpha-2). A página é lida a partir de um endereço nesse país, por 10 créditos extras (conexão residencial). |
| `max_chars` | query | integer | Não | Corta a saída neste número de caracteres, de 1.000 a 500.000. Útil para caber no contexto de um modelo. |
| `timeout` | query | integer | Não | Segundos de espera pelo site, de 5 a 60. Padrão 30. |
| `api_key` | query | string | Não | Sua chave, caso você não envie o header `Authorization`. |

**Resposta** `200`

```json
{
  "url": "https://example.com/blog/first-post",
  "final_url": "https://example.com/blog/first-post",
  "status_code": 200,
  "fetched_at": "2026-10-22T09:41:12Z",
  "rendered": false,
  "credits_used": 1,
  "title": "Our first post",
  "description": "Why we started this blog and what comes next.",
  "language": "en",
  "author": "Jane Doe",
  "published_at": "2026-10-01",
  "site_name": "Example Blog",
  "markdown": "# Our first post\n\nWe started this blog to share what we learn...\n\n## What comes next\n\n- A post every month\n- Notes from our team",
  "word_count": 612
}
```

*curl*

```bash
curl -sG "https://webreaderapi.com/api/v1/read" \
  -H "Authorization: Bearer $WEBREADER_API_KEY" \
  --data-urlencode "url=https://example.com/blog/first-post" \
  -d format=markdown -d max_chars=20000
```

*Python*

```python
import os
import requests

resp = requests.get(
    "https://webreaderapi.com/api/v1/read",
    headers={"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]},
    params={"url": "https://example.com/blog/first-post", "max_chars": 20000},
    timeout=70,
)
resp.raise_for_status()
print(resp.json()["markdown"][:300])
```

*Node.js*

```javascript
const params = new URLSearchParams({ url: 'https://example.com/blog/first-post', max_chars: '20000' });
const res = await fetch(`https://webreaderapi.com/api/v1/read?${params}`, {
  headers: { Authorization: `Bearer ${process.env.WEBREADER_API_KEY}` },
});
const page = await res.json();
console.log(page.markdown.slice(0, 300));
```

## Ler uma página (POST)

`POST /api/v1/read`

Mesmo endpoint, mesmos parâmetros, enviados como body JSON. Prefira POST quando a URL for muito longa ou quando seu cliente HTTP montar JSON com mais facilidade do que query strings. A resposta é idêntica à da forma GET.

Autenticação: chave de API no header `Authorization: Bearer API_KEY`.

**Corpo da requisição**

| Campo | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `url` | string | Sim | A página a ser lida. |
| `format`, `main_content`, `render`, `include_links`, `include_images`, `country`, `max_chars`, `timeout` | mixed | Não | Como na tabela GET acima, com tipos JSON: booleanos como `true`/`false`, números sem aspas. |

*Exemplo: a JavaScript-heavy page, read from Germany, with its links*

```json
{
  "url": "https://example.com/app/pricing",
  "render": "true",
  "country": "de",
  "include_links": true,
  "max_chars": 30000
}
```

**Resposta** `200`

```json
{
  "url": "https://example.com/app/pricing",
  "final_url": "https://example.com/de/app/pricing",
  "status_code": 200,
  "fetched_at": "2026-10-22T09:44:03Z",
  "rendered": true,
  "credits_used": 3,
  "title": "Pricing",
  "language": "de",
  "markdown": "# Pricing\n\n| Plan | Price |\n|---|---|\n| Basic | ... |",
  "word_count": 214,
  "links": [
    {
      "url": "https://example.com/de/contact",
      "text": "Contact"
    }
  ]
}
```

*curl*

```bash
curl -s "https://webreaderapi.com/api/v1/read" \
  -H "Authorization: Bearer $WEBREADER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/app/pricing", "render": "true", "country": "de", "include_links": true}'
```

*Python*

```python
import os
import requests

resp = requests.post(
    "https://webreaderapi.com/api/v1/read",
    headers={"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]},
    json={"url": "https://example.com/app/pricing", "render": "true", "country": "de", "include_links": True},
    timeout=70,
)
print(resp.json()["credits_used"], "credits")
```

*Node.js*

```javascript
const res = await fetch('https://webreaderapi.com/api/v1/read', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.WEBREADER_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ url: 'https://example.com/app/pricing', render: 'true', country: 'de', include_links: true }),
});
console.log((await res.json()).credits_used);
```

## Qual formato de saída devo escolher?

Escolha `markdown` para modelos de linguagem e RAG: títulos, listas, tabelas e links sobrevivem, e o texto fica compacto. Escolha `text` quando você só conta palavras, classifica ou pesquisa, e a marcação seria ruído. Escolha `html` quando seu próprio pipeline já interpreta HTML e você só quer remover o excesso.

Os campos de metadados são os mesmos nos três formatos. Só muda o nome do campo de conteúdo: `markdown`, `text` ou `html`.

## Quando devo definir main_content como false?

Defina como `false` quando o que você precisa são as partes ao redor do artigo. Exemplos são a navegação de um site para mapear suas seções, um rodapé com dados legais ou de contato, ou uma página de produto cujas especificações ficam em uma barra lateral.

Com o padrão `true`, o extrator mantém o bloco de conteúdo principal e descarta navegação, banners de cookies, anúncios, botões de compartilhamento e rodapés. É o que a maioria dos agentes e pipelines de RAG quer, e muitas vezes reduz uma página a uma fração do tamanho do HTML.

## Como o render=auto decide usar um navegador?

Primeiro ele busca o HTML bruto, o que é rápido e custa 1 crédito. Se esse HTML tiver pouco texto legível, tipicamente um app que monta a página com JavaScript, ele carrega a página novamente em um navegador headless e a chamada custa 2 créditos. A resposta informa qual caminho foi usado: `rendered` é `true` ou `false`.

Defina `render=false` quando você sabe que o site entrega HTML completo e quer um custo fixo. Defina `render=true` para single-page apps, para pular a primeira tentativa.

## O que country e max_chars mudam?

`country` lê a página de um endereço no país que você indicar, com o mesmo User-Agent. Use para páginas cujos preços, idioma ou disponibilidade mudam por país. Custa 10 créditos a mais, porque a página passa a ser lida por uma conexão residencial, e não pode ser usado com os países em que o serviço não opera.

`max_chars` corta a saída após essa quantidade de caracteres. Não muda o preço, mas protege a janela de contexto de um agente: 20.000 caracteres é um padrão razoável para uma única página enviada a um modelo.

## O /read consegue lidar com arquivos PDF?

Sim. Quando a URL retorna um PDF, o texto volta como Markdown no mesmo campo `markdown`. Arquivos PDF de até 20 MB e 100 páginas são convertidos em Markdown, a 1 crédito por bloco iniciado de 10 páginas. PDFs escaneados sem camada de texto retornam pouco ou nenhum texto, porque não há etapa de reconhecimento de caracteres.

## Endpoint read: perguntas frequentes

### O /read segue redirecionamentos?

Sim, até 5. A resposta traz o endereço que você pediu em `url` e o endereço realmente lido em `final_url`. Um redirecionamento para um endereço privado ou local é recusado.

### Posso ler uma página que exige login?

Não. Se um site recusa nossa requisição, devolvemos a resposta dele: nunca resolvemos CAPTCHAs, nunca entramos em contas e nunca tentamos contornar um bloqueio ou um paywall. Páginas atrás de login ou paywall retornam a recusa do site, e a chamada é gratuita.

### A checagem do robots.txt é feita em toda chamada?

Sim, contra uma cópia do robots.txt do site com no máximo 24 horas. Uma URL não permitida retorna `403 blocked_by_robots` e não consome crédito.

### Quantas páginas posso ler ao mesmo tempo?

Cada conta tem um limite de quantas páginas lê ao mesmo tempo; seu dashboard mostra esse limite, e o suporte pode aumentá-lo. Para muitas URLs, um [job em lote](https://webreaderapi.com/pt/docs/crawl/) é mais simples do que rodar muitas chamadas paralelas.

---

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.
