# Endpoint Extract : lire les URL que votre agent possède déjà

> Endpoint Extract : envoyez 1 à 20 URL et obtenez le contenu principal de chaque page en Markdown, 1 crédit par groupe de 3 entamé. Paiement en crypto.

- URL: https://llmwebsearch.com/fr/docs/extract/
- Dernière mise à jour: 2026-10-22
- Éditeur: LLMWebSearch (https://llmwebsearch.com)

Parfois l'agent possède déjà les liens : un utilisateur les a collés, une recherche précédente les a listés, ou un document les cite. `/extract` lit ces pages et renvoie leur contenu principal, avec le même lecteur et les mêmes règles que `/search`.

**Réponse rapide — Comment lire des pages web dont j'ai déjà les URL ?**

Envoyez jusqu'à 20 URL à `POST https://llmwebsearch.com/api/v1/extract`. **LLMWebSearch** lit chaque page publique et renvoie son contenu principal en Markdown ou en texte brut, avec un statut par URL. La facturation est de 1 crédit par groupe de 3 pages lues entamé, à partir de 1,20 $US/1K requêtes par crédit de recherche en octobre 2026. robots.txt est respecté. Sans KYC ; payez en crypto.

## /extract at a glance

| Attribut | Valeur |
| --- | --- |
| Méthode | `POST` avec un body JSON |
| URL | `https://llmwebsearch.com/api/v1/extract` |
| Entrée | `urls` : 1 à 20 adresses http ou https |
| Sortie | Contenu principal par URL, en `markdown` (par défaut) ou `text` |
| Facturation | Lire des pages dont vous avez déjà les URLs coûte 1 crédit par groupe de 3 pages entamé, renvoyées avec leur contenu, jusqu'à 20 URLs par appel ; les URLs refusées ou en échec ne sont pas comptées |
| robots.txt | Notre lecteur respecte robots.txt : il s'annonce comme LLMWebSearch, suit les règles qu'un site écrit pour lui ou pour tous les robots, et laisse de côté le contenu de toute page qu'il n'est pas autorisé à lire |
| Lecteur de pages | `LLMWebSearch/1.0 (+https://llmwebsearch.com/bot/)` |

## Lire une liste d'URL

`POST /api/v1/extract`

Récupère chaque URL en parallèle et renvoie son contenu principal, dans l'ordre où vous les avez envoyées. Chaque élément a son propre `content_status`, ainsi une page refusée ne fait pas échouer l'appel. L'exemple lit trois pages ; les titres et les valeurs sont illustratifs.

Authentification : clé API dans l’en-tête `Authorization: Bearer API_KEY`.

**Corps de la requête**

| Champ | Type | Requis | Description |
| --- | --- | --- | --- |
| `urls` | string[] | Oui | 1 à 20 adresses http ou https. Les adresses privées, locales et de métadonnées cloud sont refusées. |
| `format` | string | Non | `markdown` (par défaut) ou `text`. |
| `max_chars` | integer | Non | Limite de longueur du contenu de chaque page, de 500 à 50 000 caractères. Par défaut 6 000. |

*Exemple: three pages, longer content*

```json
{
  "urls": [
    "https://docs.example.com/security/key-rotation",
    "https://blog.example.org/key-rotation-checklist",
    "https://example.com/changelog"
  ],
  "max_chars": 20000
}
```

**Réponse** `200`

```json
{
  "credits_used": 1,
  "results": [
    {
      "url": "https://docs.example.com/security/key-rotation",
      "title": "Rotating API keys",
      "content_status": "ok",
      "content": "# Rotating API keys\n\n## Zero-downtime rotation\n\n1. Create a second key...",
      "word_count": 948
    },
    {
      "url": "https://blog.example.org/key-rotation-checklist",
      "content_status": "blocked_by_robots"
    },
    {
      "url": "https://example.com/changelog",
      "title": "Changelog",
      "content_status": "ok",
      "content": "# Changelog\n\n## 2026-10-20\n\n- New export format...",
      "word_count": 2204
    }
  ]
}
```

*curl*

```bash
curl -s "https://llmwebsearch.com/api/v1/extract" \
  -H "Authorization: Bearer $LLMWEBSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://docs.example.com/security/key-rotation", "https://example.com/changelog"], "max_chars": 20000}'
```

*Python*

```python
import os
import requests

resp = requests.post(
    "https://llmwebsearch.com/api/v1/extract",
    headers={"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]},
    json={"urls": ["https://docs.example.com/security/key-rotation", "https://example.com/changelog"]},
    timeout=60,
)
for page in resp.json()["results"]:
    print(page["url"], page["content_status"], page.get("word_count", 0))
```

*Node.js*

```javascript
const res = await fetch('https://llmwebsearch.com/api/v1/extract', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.LLMWEBSEARCH_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ urls: ['https://docs.example.com/security/key-rotation', 'https://example.com/changelog'] }),
});
for (const page of (await res.json()).results) console.log(page.url, page.content_status);
```

## Quand utiliser extract plutôt que read dans une recherche ?

Utilisez extract quand les URL ne proviennent pas de la recherche en cours. Un utilisateur colle un lien, un document cite trois sources, ou une première recherche avec `read=0` a permis au modèle de choisir les pages qui méritent une lecture complète.

Utilisez `read` dans `/search` quand vous voulez simplement lire les meilleurs résultats dans le même appel. C'est une requête au lieu de deux, et jusqu'à 3 pages sont incluses dans le crédit unique de la recherche.

## Comment sont facturés les appels extract ?

Un crédit pour chaque groupe de 3 pages lues entamé. Le décompte utilise les pages qui reviennent avec du contenu : une URL refusée par robots.txt ou par le site, ou qui ne se charge pas, n'est pas comptée.

| Pages lues | Crédits |
|---|---|
| 1 à 3 | 1 |
| 4 à 6 | 2 |
| 7 à 9 | 3 |
| 19 ou 20 | 7 |

La réponse indique toujours le total dans `credits_used`. Un appel où aucune page n'a pu être lue ne coûte rien.

## Que m'indique chaque élément de la réponse ?

Chaque élément répète le `url` que vous avez envoyé et donne un `content_status`. Avec `ok`, vous obtenez aussi la page `title`, son `content` principal et son `word_count`. Sinon, le statut indique la raison : `blocked_by_robots`, `blocked_by_site_policy`, `target_refused` avec le `target_status` du site, `fetch_failed`, `fetch_timeout` ou `unsupported_content`.

Les éléments conservent l'ordre de votre liste de `urls`, vous pouvez donc les associer par index comme par URL. La page [format de réponse](https://llmwebsearch.com/fr/docs/response/) décrit chaque statut.

## Quelles URL sont refusées avant toute récupération ?

Les adresses qui pointent vers des réseaux privés, vers la machine locale ou vers des services de métadonnées cloud sont refusées. Cela empêche quiconque d'utiliser notre lecteur pour atteindre des systèmes internes. Une redirection qui mène à une telle adresse est aussi refusée, et au plus 5 redirections sont suivies.

L'adresse doit utiliser `http` ou `https`. Un appel où `urls` est vide, contient plus de 20 entrées ou contient une adresse malformée renvoie `400 invalid_parameter`, sans frais.

## Est-ce que extract suit les mêmes règles que search ?

Oui. C'est le même lecteur, qui se présente comme `LLMWebSearch/1.0 (+https://llmwebsearch.com/bot/)`. Un site qui définit Content-Signal: ai-input=no dans son robots.txt garde ses pages hors du contenu de vos résultats. Quand un site refuse notre lecteur, le résultat revient sans contenu et avec le statut du site : nous ne résolvons jamais de CAPTCHA, ne nous connectons pas à des comptes et ne contournons ni un blocage ni un paywall.

Les pages qui nécessitent une connexion, ou qui se trouvent derrière un paywall, reviennent sans contenu. Indiquez à l'agent une autre source, ou une page que vous êtes autorisé à lire avec votre propre session de navigateur.

## Endpoint extract : questions fréquentes

### Quels types de fichiers peut-il lire ?

Il est conçu pour les pages web. Un lien vers une vidéo, une archive ou un autre fichier sans texte lisible revient en `unsupported_content`, et cette URL n'est pas comptée dans le prix.

### Une URL envoyée deux fois est-elle lue deux fois ?

Envoyez chaque URL une seule fois. Si une liste peut contenir des doublons, retirez-les d'abord de votre côté, pour que les résultats correspondent à votre liste un pour un.

### Le rendu JavaScript est-il en supplément ?

Non. Lorsqu'une page a besoin d'un navigateur pour afficher son texte, elle est rendue sans coût supplémentaire.

### Est-ce que extract peut lire une page à laquelle je suis connecté ?

Non. Le lecteur ne se connecte jamais à des comptes et n'envoie aucun de vos cookies. Quand un site refuse notre lecteur, le résultat revient sans contenu et avec le statut du site : nous ne résolvons jamais de CAPTCHA, ne nous connectons pas à des comptes et ne contournons ni un blocage ni un paywall.

---

LLMWebSearch: LLMWebSearch est une API de recherche web pour agents IA qui renvoie des résultats classés avec le contenu des meilleures pages en Markdown, payée en crypto sans envoi de pièce d'identité. Les crédits prépayés à partir de 1,20 $US/1K requêtes n'expirent jamais. Sans KYC — pas de pièce d'identité, pas de selfie, pas de documents. Payez en crypto.
