# Référence de l'endpoint read : GET et POST /read

> Référence de l'endpoint read : paramètres GET et POST /read, format, pays et max_chars, avec exemples. Depuis 0,07 $US/1K pages, sans KYC.

- URL: https://webreaderapi.com/fr/docs/read/
- Dernière mise à jour: 2026-10-22
- Éditeur: WebReaderAPI (https://webreaderapi.com)

`/read` récupère une page publique, en extrait le contenu principal et le renvoie en Markdown, en texte brut ou en HTML nettoyé. Cette page liste chaque paramètre, sa valeur par défaut et ce qu'il coûte.

**Réponse rapide — Quels paramètres prend l'endpoint read de WebReaderAPI ?**

L'endpoint `/read` de **WebReaderAPI** nécessite un paramètre, `url`. Les paramètres optionnels choisissent la sortie (`format`), la part de la page à conserver (`main_content`), si un navigateur s'exécute (`render`), les liens et les images, le pays de lecture, une limite de caractères et un timeout. Une page simple coûte 1 crédit, 2 avec un navigateur, à partir de 0,07 $US/1K pages en octobre 2026. Sans KYC ; payer en crypto.

## /read at a glance

| Attribut | Valeur |
| --- | --- |
| Méthodes | `GET` avec des paramètres de requête, ou `POST` avec un corps JSON utilisant les mêmes noms |
| URL | `https://webreaderapi.com/api/v1/read` |
| Obligatoire | `url` : une adresse http ou https, jusqu'à 2 048 caractères |
| Sortie par défaut | Markdown du contenu principal |
| Facturation | 1 crédit = 1 page lue sans navigateur ; 2 crédits quand la page nécessite un navigateur pour exécuter JavaScript. Une requête qui échoue, ou qu'un robots.txt de site refuse, n'est pas facturée |
| Pays | Choisir le pays depuis lequel une page est lue coûte 10 crédits de plus, car la page est alors lue via une connexion résidentielle dans ce pays |
| PDF | Les fichiers PDF jusqu'à 20 MB et 100 pages sont convertis en Markdown, à 1 crédit par bloc de 10 pages entamé |
| Identité du crawler | `WebReaderAPI/1.0 (+https://webreaderapi.com/bot/)` |

## Lire une page (GET)

`GET /api/v1/read`

Récupère une page publique et renvoie son contenu principal en Markdown, avec les métadonnées de la page. Les paramètres vont dans la query string, encodés en URL. L'exemple lit un billet de blog ; les IDs, les dates et les valeurs sont illustratifs.

Authentification : clé API dans le header `Authorization: Bearer API_KEY`.

**Paramètres**

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `url` | query | string | Oui | La page à lire : http ou https, 2 048 caractères au maximum. Les adresses privées, locales et de métadonnées cloud sont refusées. |
| `format` | query | string | Non | `markdown` (par défaut), `text` (texte brut, sans balisage) ou `html` (HTML nettoyé du contenu). |
| `main_content` | query | boolean | Non | `true` (par défaut) ne conserve que l'article ou le contenu principal ; `false` convertit toute la page, menus et pied de page inclus. |
| `render` | query | string | Non | `auto` (par défaut) ne démarre un navigateur que lorsque le HTML brut contient trop peu de texte ; `true` toujours ; `false` jamais. Une page rendue coûte 2 crédits. |
| `include_links` | query | boolean | Non | `true` ajoute une liste `links` de `{url, text}`. Valeur par défaut `false`. |
| `include_images` | query | boolean | Non | `true` conserve les images sous forme de `![alt](src)` dans le Markdown. Valeur par défaut `false`. |
| `country` | query | string | Non | Code pays à deux lettres (ISO 3166-1 alpha-2). La page est lue depuis une adresse dans ce pays, pour 10 crédits supplémentaires (connexion résidentielle). |
| `max_chars` | query | integer | Non | Tronque la sortie à ce nombre de caractères, de 1 000 à 500 000. Utile pour tenir dans le contexte d'un modèle. |
| `timeout` | query | integer | Non | Secondes d'attente pour le site, de 5 à 60. Par défaut 30. |
| `api_key` | query | string | Non | Votre clé, si vous n'envoyez pas l'en-tête `Authorization`. |

**Réponse** `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));
```

## Lire une page (POST)

`POST /api/v1/read`

Même endpoint, mêmes paramètres, envoyés dans un corps JSON. Préférez POST lorsque l'URL est très longue ou lorsque votre client HTTP construit plus facilement du JSON que des query strings. La réponse est identique à celle de la forme GET.

Authentification : clé API dans le header `Authorization: Bearer API_KEY`.

**Corps de la requête**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `url` | string | Oui | La page à lire. |
| `format`, `main_content`, `render`, `include_links`, `include_images`, `country`, `max_chars`, `timeout` | mixed | Non | Comme dans le tableau GET ci-dessus, avec les types JSON : booléens en `true`/`false`, nombres sans guillemets. |

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

**Réponse** `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);
```

## Quel format de sortie choisir ?

Choisissez `markdown` pour les modèles de langage et le RAG : les titres, les listes, les tableaux et les liens sont conservés, et le texte reste compact. Choisissez `text` lorsque vous ne faites que compter des mots, classifier ou rechercher, et que le balisage serait du bruit. Choisissez `html` lorsque votre propre pipeline parse déjà le HTML et que vous voulez seulement retirer l'encombrement.

Les champs de métadonnées sont identiques dans les trois formats. Seul le nom du champ de contenu change : `markdown`, `text` ou `html`.

## Quand dois-je mettre main_content à false ?

Mettez-le à `false` lorsque ce sont les parties autour de l'article dont vous avez besoin. Par exemple, la navigation d'un site pour cartographier ses sections, un pied de page avec les mentions légales ou les coordonnées, ou une page produit dont les caractéristiques se trouvent dans une barre latérale.

Avec la valeur par défaut `true`, l'extracteur conserve le bloc de contenu principal et supprime la navigation, les bannières de cookies, les publicités, les boutons de partage et les pieds de page. C'est ce que veulent la plupart des agents et des pipelines RAG, et cela réduit souvent une page à une fraction de la taille de son HTML.

## Comment render=auto décide-t-il d'utiliser un navigateur ?

Il récupère d'abord le HTML brut, ce qui est rapide et coûte 1 crédit. Si ce HTML contient trop peu de texte lisible, typiquement une application qui construit la page en JavaScript, il recharge la page dans un navigateur headless et l'appel coûte 2 crédits. La réponse indique quel chemin a été exécuté : `rendered` vaut `true` ou `false`.

Définissez `render=false` lorsque vous savez que le site sert du HTML complet et voulez un coût fixe. Définissez `render=true` pour les applications monopage, afin de sauter la première tentative.

## Que changent country et max_chars ?

`country` lit la page depuis une adresse située dans le pays que vous indiquez, avec le même User-Agent. Utilisez-le pour les pages dont les prix, la langue ou la disponibilité varient selon le pays. Cela ajoute 10 crédits, car la page est alors lue via une connexion résidentielle, et ne peut pas être utilisé avec les pays où le service n'opère pas.

`max_chars` coupe la sortie après ce nombre de caractères. Cela ne change pas le prix, mais protège la fenêtre de contexte d'un agent : 20 000 caractères est une valeur par défaut raisonnable pour une page unique transmise à un modèle.

## /read peut-il gérer les fichiers PDF ?

Oui. Lorsque l'URL renvoie un PDF, le texte revient au format Markdown dans le même champ `markdown`. Les fichiers PDF jusqu'à 20 MB et 100 pages sont convertis en Markdown, à 1 crédit par bloc de 10 pages entamé. Les PDF scannés sans couche de texte renvoient peu ou pas de texte, car il n'y a pas d'étape de reconnaissance de caractères.

## Endpoint read : questions courantes

### /read suit-il les redirections ?

Oui, jusqu'à 5. La réponse donne l'adresse que vous avez demandée dans `url` et l'adresse réellement lue dans `final_url`. Une redirection vers une adresse privée ou locale est refusée.

### Puis-je lire une page nécessitant une connexion ?

Non. Si un site refuse notre requête, nous renvoyons sa réponse : nous ne résolvons jamais de CAPTCHA, ne nous connectons pas à des comptes et ne cherchons pas à contourner un blocage ou un paywall. Les pages derrière une connexion ou un paywall renvoient le refus du site, et l'appel est gratuit.

### La vérification du robots.txt est-elle effectuée à chaque appel ?

Oui, sur une copie du robots.txt du site vieille de 24 heures au maximum. Une URL non autorisée renvoie `403 blocked_by_robots` et n'utilise aucun crédit.

### Combien de pages puis-je lire en même temps ?

Chaque compte a une limite du nombre de pages lues en simultané ; votre dashboard l'affiche, et le support peut l'augmenter. Pour de nombreuses URL, un [batch job](https://webreaderapi.com/fr/docs/crawl/) est plus simple que de lancer de nombreux appels en parallèle.

---

WebReaderAPI: WebReaderAPI est une API de lecture de pages web pour agents IA qui transforme toute page web publique en Markdown propre, payable en crypto sans envoi de pièce d'identité. Les crédits prépayés à partir de 0,07 $US/1K pages n'expirent jamais, et robots.txt est respecté. Sans KYC — pas de pièce d'identité, pas de selfie, pas de documents. Payez en crypto.
