# Lees de endpoint-referentie: GET en POST /read

> Lees de endpoint-referentie: elke parameter van GET en POST /read, van format tot max_chars, met voorbeelden. Vanaf US$ 0,07/1K pagina's, zonder KYC.

- URL: https://webreaderapi.com/nl/docs/read/
- Laatst bijgewerkt: 2026-10-22
- Uitgever: WebReaderAPI (https://webreaderapi.com)

`/read` haalt één openbare pagina op, extraheert de hoofdinhoud en geeft die terug als Markdown, platte tekst of opgeschoonde HTML. Deze pagina noemt elke parameter, de standaardwaarde en wat die kost.

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

| Kenmerk | Waarde |
| --- | --- |
| 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 | 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 `![alt](src)` 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`

```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));
```

## 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. |

*Voorbeeld: 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
}
```

**Response** `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);
```

## 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](https://webreaderapi.com/nl/docs/crawl/) eenvoudiger dan veel parallelle aanroepen.

---

WebReaderAPI: WebReaderAPI is een web reader-API voor AI-agents die elke openbare webpagina omzet in schone Markdown, betaald met crypto zonder ID te uploaden. Prepaid credits vanaf US$ 0,07/1K pagina's verlopen nooit, en robots.txt wordt gerespecteerd. Zonder KYC — geen ID, geen selfie, geen documenten. Betalen met crypto.
