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
| 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 |
| 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  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
{
"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
}Exemplos de código
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=20000import 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])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. |
{
"url": "https://example.com/app/pricing",
"render": "true",
"country": "de",
"include_links": true,
"max_chars": 30000
}Resposta 200
{
"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"
}
]
}Exemplos de código
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}'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")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 é mais simples do que rodar muitas chamadas paralelas.