# Format de réponse de l'API Read, champ par champ

> Format de réponse API Read : chaque champ d'une page, de markdown et word_count à final_url, plus les résultats de job. Paiement crypto, sans KYC.

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

Chaque appel `/read` renvoie un objet JSON : le contenu de la page dans le format demandé, ses métadonnées, et trois champs qui vous indiquent ce qui s'est passé et ce que cela a coûté. Les résultats de job réutilisent le même objet.

**Réponse rapide — Que contient la réponse de lecture de WebReaderAPI ?**

Une réponse **WebReaderAPI** `/read` contient le contenu de la page en `markdown` (ou `text` ou `html`), ses métadonnées (`title`, `description`, `author`, `published_at`, `language`, `site_name`, `word_count`), et les informations du fetch : `final_url`, `status_code`, `rendered` et `credits_used`. Une page simple utilise 1 crédit, à partir de 0,07 $US/1K pages en octobre 2026. Sans KYC ; payez en crypto.

## Quels champs décrivent le fetch ?

Ces champs sont toujours présents dans une réponse réussie.

| Champ | Type | Signification |
| --- | --- | --- |
| `url` | string | L'adresse que vous avez envoyée |
| `final_url` | string | L'adresse réellement lue, après redirections (5 au maximum) |
| `status_code` | entier | Le statut HTTP renvoyé par le site pour l'adresse finale, normalement 200 |
| `fetched_at` | string | Heure de la récupération, ISO 8601 en UTC |
| `rendered` | booléen | `true` lorsqu'un navigateur headless a construit la page |
| `credits_used` | entier | Crédits facturés pour cette page : 1, 2 avec un navigateur, plus 10 avec `country` ; PDF 1 par tranche de 10 pages commencées |

## Quels champs décrivent la page ?

Les métadonnées proviennent de la page elle-même : sa balise title, ses balises meta, ses données structurées et sa signature visible. Un champ que la page ne fournit pas est absent : testez sa présence avant de l'utiliser.

| Champ | Type | Signification |
| --- | --- | --- |
| `title` | string | Le titre de la page ou de l'article |
| `description` | string | Le résumé que la page donne d'elle-même |
| `language` | string | Code de langue du contenu, par exemple `en` ou `de` |
| `author` | string | L'auteur indiqué sur la page |
| `published_at` | string | Date de publication indiquée par la page |
| `site_name` | string | Le nom du site lui-même |
| `word_count` | entier | Mots dans le contenu renvoyé, après extraction et avant `max_chars` |

## Où se trouve le contenu lui-même ?

Un seul champ de contenu est renvoyé, nommé d'après le `format` choisi.

| Champ | Quand | Contenu |
| --- | --- | --- |
| `markdown` | `format=markdown` (par défaut) | Titres, paragraphes, listes, tableaux et liens en Markdown ; images aussi avec `include_images=true` |
| `text` | `format=text` | Texte brut, paragraphes séparés par des lignes vides |
| `html` | `format=html` | HTML nettoyé du contenu principal, sans scripts, styles ni publicités |
| `links` | `include_links=true` | Liste des `{url, text}` pour les liens trouvés sur la page, URL absolues |

*Une réponse complète (les valeurs sont illustratives)*

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

## Comment distinguer une page rendue d'une page brute ?

Regardez `rendered`. Avec `render=auto`, l'API lit d'abord le HTML brut ; elle ne lance un navigateur que lorsque ce HTML contient trop peu de texte, et passe alors `rendered` à `true` et `credits_used` à 2. Si un site que vous lisez souvent revient toujours rendu, envoyez `render=true` dès le départ : le coût est identique et vous évitez une première étape inutile.

Si une page revient non rendue mais pauvre en contenu, comparez `word_count` avec ce que vous voyez dans un navigateur. Un nombre faible signifie généralement que le contenu nécessite JavaScript ; réessayez une fois avec `render=true`.

## Pourquoi final_url peut-il différer de url ?

Parce que les sites redirigent. Un lien court, une ancienne adresse, une barre oblique finale manquante ou un changement de langue vous envoient ailleurs. L'API suit jusqu'à 5 redirections et indique l'adresse qu'elle a finalement lue dans `final_url`.

Stockez `final_url` comme source canonique d'un document dans un index RAG. Deux valeurs `url` différentes qui aboutissent au même `final_url` désignent la même page : vous pouvez donc supprimer le doublon avant de l'embedder.

## À quoi ressemble le résultat d'un job ?

`GET https://webreaderapi.com/api/v1/jobs/{job_id}` renvoie `job_id`, `status` (`queued`, `running` ou `done`), `results`, `next_cursor` et l'état d'avancement `credits_used` du job. Chaque élément de `results` prend l'une de deux formes :

- une réponse `/read` complète, exactement comme décrit ci-dessus, pour une page qui a été lue ;
- `{url, error}` pour une page qui ne l'a pas été, où `error` possède les mêmes `code` et `message` qu'une [erreur API](https://webreaderapi.com/fr/docs/errors/).

`next_cursor` est présent tant que d'autres résultats sont disponibles ; renvoyez-le en tant que `cursor` pour les récupérer. La [page batch et crawl](https://webreaderapi.com/fr/docs/crawl/) contient une boucle de polling complète.

*Une page de résultat de job (les valeurs sont illustratives)*

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

## À quoi ressemble une réponse d'erreur ?

Une erreur revient avec un statut HTTP de 400 ou plus et un corps JSON `{"error": {"code", "message"}}`. Lorsque le site lui-même a refusé la requête, `target_status` indique le statut envoyé par le site. Aucune erreur n'est facturée. La [page des erreurs](https://webreaderapi.com/fr/docs/errors/) liste chaque code avec sa cause et précise si une nouvelle tentative peut aider.

## Format de réponse : questions fréquentes

### Le Markdown est-il coupé lorsque je définis max_chars ?

Oui. Le champ content s'arrête à ce nombre de caractères. `word_count` décrit toujours l'intégralité du contenu extrait, vous pouvez donc voir ce qui a été omis.

### Pourquoi author ou published_at sont-ils absents ?

Parce que la page ne l'indique pas d'une manière lisible. Beaucoup de pages ne fournissent ni auteur ni date. Les champs absents sont omis plutôt que renvoyés vides.

### Les liens dans le Markdown sont-ils absolus ?

Les liens de la liste `links` sont absolus. Écrivez votre code pour accepter les deux formes dans le corps Markdown, et résolvez les liens relatifs par rapport à `final_url`.

### Puis-je obtenir le HTML brut de la page entière ?

Le plus proche est `format=html` avec `main_content=false`, qui renvoie la page entière nettoyée des scripts et des styles. Le HTML original octet par octet ne fait pas partie de la v1.

---

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.
