Kort antwoord
Welke parameters heeft het read-endpoint van WebReaderAPI?
Het /read-endpoint van WebReaderAPI heeft één parameter nodig, url. Optionele parameters bepalen de output (format), hoeveel van de pagina je behoudt (main_content), of er een browser draait (render), links en afbeeldingen, het leesland, een karakterlimiet en een timeout. Een gewone pagina kost 1 credit, 2 met een browser, vanaf US$ 0,07/1K pagina's per oktober 2026. Zonder KYC; betalen met crypto.
/read at a glance
| Methoden | GET met queryparameters, of POST met een JSON-body met dezelfde namen |
|---|---|
| URL | https://webreaderapi.com/api/v1/read |
| Vereist | url: een http- of https-adres, tot 2.048 tekens |
| Standaardoutput | Markdown van de hoofdinhoud |
| Facturering | 1 credit = 1 pagina lezen zonder browser; 2 credits wanneer de pagina een browser nodig heeft om JavaScript te renderen. Een verzoek dat mislukt, of dat de robots.txt van een site weigert, wordt niet in rekening gebracht |
| Land | Het land kiezen van waaruit een pagina wordt gelezen kost 10 credits extra, omdat de pagina dan via een residential-verbinding in dat land wordt gelezen |
| PDF-bestanden tot 20 MB en 100 pagina's worden omgezet naar Markdown, voor 1 credit per begonnen blok van 10 pagina's | |
| Identiteit van de crawler | WebReaderAPI/1.0 (+https://webreaderapi.com/bot/) |
Lees één pagina (GET)
GET/api/v1/read
Haalt één openbare pagina op en geeft de hoofdinhoud terug als Markdown, met de metadata van de pagina. Parameters gaan in de query string, URL-gecodeerd. Het voorbeeld leest een blogpost; ID's, datums en waarden zijn illustratief.
Authenticatie: API-sleutel in de Authorization: Bearer API_KEY-header.
Parameters
| Naam | In | Type | Vereist | Beschrijving |
|---|---|---|---|---|
url | query | string | Ja | De pagina om te lezen: http of https, maximaal 2.048 tekens. Privé-, lokale en cloud-metadata-adressen worden geweigerd. |
format | query | string | Nee | markdown (standaard), text (platte tekst, geen opmaak) of html (opgeschoonde HTML van de inhoud). |
main_content | query | boolean | Nee | true (standaard) behoudt alleen het artikel of de hoofdinhoud; false converteert de hele pagina, inclusief menu's en footer. |
render | query | string | Nee | auto (standaard) start alleen een browser wanneer de ruwe HTML te weinig tekst bevat; true altijd; false nooit. Een gerenderde pagina kost 2 credits. |
include_links | query | boolean | Nee | true voegt een links-lijst toe met {url, text}. Standaard false. |
include_images | query | boolean | Nee | true behoudt afbeeldingen als  in de Markdown. Standaard false. |
country | query | string | Nee | Tweeletterige landcode (ISO 3166-1 alpha-2). De pagina wordt gelezen vanaf een adres in dat land, voor 10 extra credits (residential-verbinding). |
max_chars | query | integer | Nee | Kapt de output af op dit aantal tekens, van 1.000 tot 500.000. Handig om binnen de context van een model te passen. |
timeout | query | integer | Nee | Seconden om op de site te wachten, van 5 tot 60. Standaard 30. |
api_key | query | string | Nee | Je sleutel, als je de Authorization header niet meestuurt. |
Response 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
}Codevoorbeelden
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));Eén pagina lezen (POST)
POST/api/v1/read
Zelfde endpoint, zelfde parameters, verzonden als JSON-body. Gebruik POST bij voorkeur wanneer de URL erg lang is of wanneer je HTTP-client makkelijker JSON bouwt dan query strings. De respons is identiek aan de GET-vorm.
Authenticatie: API-sleutel in de Authorization: Bearer API_KEY-header.
Request body
| Field | Type | Vereist | Beschrijving |
|---|---|---|---|
url | string | Ja | De pagina om te lezen. |
format, main_content, render, include_links, include_images, country, max_chars, timeout | mixed | Nee | Zoals in de GET-tabel hierboven, met JSON-typen: booleans als true/false, getallen zonder aanhalingstekens. |
{
"url": "https://example.com/app/pricing",
"render": "true",
"country": "de",
"include_links": true,
"max_chars": 30000
}Response 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"
}
]
}Codevoorbeelden
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);Welk uitvoerformaat moet ik kiezen?
Kies markdown voor taalmodellen en RAG: koppen, lijsten, tabellen en links blijven behouden en de tekst blijft compact. Kies text wanneer je alleen woorden telt, classificeert of zoekt en opmaak alleen ruis zou zijn. Kies html wanneer je eigen pipeline HTML al parseert en je alleen de rommel weg wilt hebben.
De metadata-velden zijn in alle drie de formaten hetzelfde. Alleen de naam van het contentveld verandert: markdown, text of html.
Wanneer moet ik main_content op false zetten?
Zet het op false wanneer je juist de delen rond het artikel nodig hebt. Voorbeelden zijn de navigatie van een site om de secties in kaart te brengen, een footer met juridische of contactgegevens, of een productpagina waarvan de specificaties in een zijbalk staan.
Met de standaardwaarde true houdt de extractor het blok met de hoofdinhoud en laat hij navigatie, cookiebanners, advertenties, deelknoppen en footers weg. Dat is wat de meeste agents en RAG-pipelines willen, en het reduceert een pagina vaak tot een fractie van de HTML-grootte.
Hoe beslist render=auto om een browser te gebruiken?
Eerst haalt het de ruwe HTML op, wat snel is en 1 credit kost. Bevat die HTML te weinig leesbare tekst, meestal een app die de pagina met JavaScript opbouwt, dan laadt het de pagina opnieuw in een headless browser en kost de aanroep 2 credits. De respons vertelt je welk pad is gelopen: rendered is true of false.
Zet render=false wanneer je weet dat de site volledige HTML levert en je een vaste prijs wilt. Zet render=true voor single-page apps, om de eerste poging over te slaan.
Wat veranderen country en max_chars?
country leest de pagina vanaf een adres in het land dat je opgeeft, met dezelfde User-Agent. Gebruik het voor pagina's waarvan de prijzen, taal of beschikbaarheid per land verschillen. Het kost 10 credits extra, omdat de pagina dan via een residential-verbinding wordt gelezen, en het kan niet worden gebruikt met de landen waar de dienst niet actief is.
max_chars kapt de uitvoer af na dat aantal tekens. Het verandert de prijs niet, maar het beschermt het contextvenster van een agent: 20.000 tekens is een verstandige standaard voor één pagina die je aan een model geeft.
Kan /read PDF-bestanden verwerken?
Ja. Wanneer de URL een PDF teruggeeft, komt de tekst terug als Markdown in hetzelfde markdown-veld. PDF-bestanden tot 20 MB en 100 pagina's worden omgezet naar Markdown, voor 1 credit per begonnen blok van 10 pagina's. Gescande PDF's zonder tekstlaag leveren weinig of geen tekst op, omdat er geen stap voor karakterherkenning is.
Read-endpoint: veelgestelde vragen
Volgt /read redirects?
Ja, tot 5. De respons geeft het adres dat je hebt opgevraagd in url en het adres dat daadwerkelijk is gelezen in final_url. Een redirect naar een privé- of lokaal adres wordt geweigerd.
Kan ik een pagina lezen waarvoor een login nodig is?
Nee. Als een site ons verzoek weigert, geven we het antwoord terug: we lossen nooit CAPTCHA's op, loggen niet in op accounts en proberen nooit een blokkade of paywall te omzeilen. Pagina's achter een login of paywall geven de weigering van de site terug en de aanroep is gratis.
Wordt de robots.txt-check bij elke aanroep gedaan?
Ja, tegen een kopie van de robots.txt van de site die maximaal 24 uur oud is. Een niet-toegestane URL geeft 403 blocked_by_robots terug en kost geen credit.
Hoeveel pagina's kan ik tegelijk lezen?
Elk account heeft een limiet voor het aantal pagina's dat het tegelijk leest; je dashboard toont die, en support kan hem verhogen. Voor veel URL's is een batchjob eenvoudiger dan veel parallelle aanroepen.