# Read API-responsformaat, veld voor veld

> API-responsformaat: elk veld dat voor een pagina wordt teruggegeven, van markdown tot final_url, plus resultaten van jobs. Zonder KYC, betalen met crypto.

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

Elke `/read`-aanroep geeft één JSON-object terug: de inhoud van de pagina in het formaat dat je hebt gevraagd, de metadata en drie velden die vertellen wat er is gebeurd en wat het heeft gekost. Resultaten van jobs hergebruiken hetzelfde object.

**Kort antwoord — Wat bevat de read-respons van WebReaderAPI?**

Een **WebReaderAPI** `/read`-respons bevat de paginainhoud in `markdown` (of `text` of `html`), de metadata (`title`, `description`, `author`, `published_at`, `language`, `site_name`, `word_count`) en de feiten van de fetch: `final_url`, `status_code`, `rendered` en `credits_used`. Een gewone pagina kost 1 credit, vanaf US$ 0,07/1K pagina's per oktober 2026. Zonder KYC; betalen met crypto.

## Welke velden beschrijven de fetch?

Deze velden staan altijd in een geslaagde respons.

| Field | Type | Betekenis |
| --- | --- | --- |
| `url` | string | Het adres dat je hebt gestuurd |
| `final_url` | string | Het adres dat daadwerkelijk is gelezen, na redirects (maximaal 5) |
| `status_code` | integer | De HTTP-status die de site voor het uiteindelijke adres teruggaf, normaal 200 |
| `fetched_at` | string | Tijdstip van de fetch, ISO 8601 in UTC |
| `rendered` | boolean | `true` wanneer een headless browser de pagina heeft opgebouwd |
| `credits_used` | integer | Credits die voor deze pagina in rekening worden gebracht: 1, 2 met een browser, plus 10 met `country`; PDF's 1 per begonnen 10 pagina's |

## Welke velden beschrijven de pagina?

Metadata komt van de pagina zelf: de title tag, meta tags, structured data en zichtbare byline. Een veld dat de pagina niet levert, ontbreekt, dus test erop voordat je het gebruikt.

| Field | Type | Betekenis |
| --- | --- | --- |
| `title` | string | De titel van de pagina of het artikel |
| `description` | string | De samenvatting die de pagina van zichzelf geeft |
| `language` | string | Taalcode van de inhoud, zoals `en` of `de` |
| `author` | string | De auteur die op de pagina wordt genoemd |
| `published_at` | string | Publicatiedatum die de pagina vermeldt |
| `site_name` | string | De eigen naam van de site |
| `word_count` | integer | Woorden in de teruggegeven inhoud, na extractie en vóór `max_chars` |

## Waar staat de inhoud zelf?

Er wordt één inhoudsveld teruggegeven, genoemd naar de `format` die je hebt gekozen.

| Field | Wanneer | Inhoud |
| --- | --- | --- |
| `markdown` | `format=markdown` (standaard) | Koppen, paragrafen, lijsten, tabellen en links in Markdown; ook afbeeldingen met `include_images=true` |
| `text` | `format=text` | Platte tekst, paragrafen gescheiden door lege regels |
| `html` | `format=html` | Opgeschoonde HTML van de hoofdinhoud, zonder scripts, styles of advertenties |
| `links` | `include_links=true` | Lijst met `{url, text}` voor de links die op de pagina zijn gevonden, absolute URL's |

*Een volledig antwoord (waarden zijn ter illustratie)*

```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" }
  ]
}
```

## Hoe zie ik of een pagina gerenderd is of niet?

Kijk naar `rendered`. Met `render=auto` leest de API eerst de ruwe HTML; pas als die HTML te weinig tekst bevat, start hij een browser, en dan zet hij `rendered` op `true` en `credits_used` op 2. Als een site die je vaak leest altijd gerenderd terugkomt, stuur dan vanaf het begin `render=true` mee: de kosten zijn hetzelfde en je slaat een verspilde eerste stap over.

Komt een pagina ongerenderd maar met weinig tekst terug, vergelijk dan `word_count` met wat je in een browser ziet. Een laag aantal betekent meestal dat de inhoud JavaScript nodig heeft; probeer het nog één keer met `render=true`.

## Waarom kan final_url afwijken van url?

Omdat sites doorverwijzen. Een korte link, een oud adres, een ontbrekende slash aan het eind of een taalwissel sturen je ergens anders heen. De API volgt tot 5 redirects en rapporteert het adres dat hij uiteindelijk heeft gelezen in `final_url`.

Sla `final_url` op als de canonieke bron van een document in een RAG-index. Twee verschillende `url`-waarden die op dezelfde `final_url` uitkomen, zijn dezelfde pagina, dus je kunt het duplicaat weggooien voordat je het embed.

## Hoe ziet een job-resultaat eruit?

`GET https://webreaderapi.com/api/v1/jobs/{job_id}` retourneert `job_id`, `status` (`queued`, `running` of `done`), `results`, `next_cursor` en de lopende `credits_used` van de job. Elk item van `results` heeft een van twee vormen:

- een volledig `/read`-antwoord, precies zoals hierboven beschreven, voor een pagina die is gelezen;
- `{url, error}` voor een pagina die dat niet is, waarbij `error` dezelfde `code` en `message` heeft als een [API-fout](https://webreaderapi.com/nl/docs/errors/).

`next_cursor` is aanwezig zolang er meer resultaten klaarstaan; stuur het terug als `cursor` om ze op te halen. De [batch- en crawl-pagina](https://webreaderapi.com/nl/docs/crawl/) heeft een complete polling-loop.

*Een job-resultaatpagina (waarden zijn ter illustratie)*

```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
}
```

## Hoe ziet een foutantwoord eruit?

Een fout komt terug met een HTTP-status van 400 of hoger en een JSON-body `{"error": {"code", "message"}}`. Als de site zelf het verzoek weigerde, geeft `target_status` de status die de site stuurde. Geen enkele fout wordt gefactureerd. De [foutenpagina](https://webreaderapi.com/nl/docs/errors/) somt elke code op met de oorzaak en of een nieuwe poging kan helpen.

## Antwoordformaat: veelgestelde vragen

### Wordt de Markdown afgekapt als ik max_chars instel?

Ja. Het content-veld stopt bij dat aantal tekens. `word_count` beschrijft nog steeds de volledig geëxtraheerde inhoud, zodat je kunt zien hoeveel er is weggelaten.

### Waarom ontbreken author of published_at?

Omdat de pagina het niet vermeldt op een manier die leesbaar is. Veel pagina's geven geen auteur of datum. Ontbrekende velden worden weggelaten in plaats van leeg teruggegeven.

### Zijn de links in de Markdown absoluut?

Links in de `links`-lijst zijn absoluut. Schrijf je code zo dat beide vormen in de Markdown-body worden geaccepteerd, en los relatieve links op tegen `final_url`.

### Kan ik de ruwe HTML van de hele pagina krijgen?

Het dichtst in de buurt komt `format=html` met `main_content=false`, dat de hele pagina teruggeeft, ontdaan van scripts en styles. De originele byte-voor-byte HTML maakt geen deel uit van v1.

---

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.
