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
| 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 |
| 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  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
{
"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
}Exemples de code
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));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. |
{
"url": "https://example.com/app/pricing",
"render": "true",
"country": "de",
"include_links": true,
"max_chars": 30000
}Réponse 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"
}
]
}Exemples de code
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);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 est plus simple que de lancer de nombreux appels en parallèle.