Sans KYC — pas de pièce d'identité, pas de selfie, pas de documents. Payez en crypto : BTC, USDT, USDC, ETH, SOL, LTC
Langue: Français
Obtenir une clé API

Docs · Référence API

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

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

Dernière mise à jour: · 8 min de lecture

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éthodesGET avec des paramètres de requête, ou POST avec un corps JSON utilisant les mêmes noms
URLhttps://webreaderapi.com/api/v1/read
Obligatoireurl : une adresse http ou https, jusqu'à 2 048 caractères
Sortie par défautMarkdown du contenu principal
Facturation1 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
PaysChoisir 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
PDFLes fichiers PDF jusqu'à 20 MB et 100 pages sont convertis en Markdown, à 1 crédit par bloc de 10 pages entamé
Identité du crawlerWebReaderAPI/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

NomEmplacementTypeObligatoireDescription
urlquerystringOuiLa 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.
formatquerystringNonmarkdown (par défaut), text (texte brut, sans balisage) ou html (HTML nettoyé du contenu).
main_contentquerybooleanNontrue (par défaut) ne conserve que l'article ou le contenu principal ; false convertit toute la page, menus et pied de page inclus.
renderquerystringNonauto (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_linksquerybooleanNontrue ajoute une liste links de {url, text}. Valeur par défaut false.
include_imagesquerybooleanNontrue conserve les images sous forme de ![alt](src) dans le Markdown. Valeur par défaut false.
countryquerystringNonCode 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_charsqueryintegerNonTronque la sortie à ce nombre de caractères, de 1 000 à 500 000. Utile pour tenir dans le contexte d'un modèle.
timeoutqueryintegerNonSecondes d'attente pour le site, de 5 à 60. Par défaut 30.
api_keyquerystringNonVotre 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
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
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
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

ChampTypeObligatoireDescription
urlstringOuiLa page à lire.
format, main_content, render, include_links, include_images, country, max_chars, timeoutmixedNonComme 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
{
  "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
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
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
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.

À partir de 0,07 $US/1K pages · sans KYC

Obtenir une clé API