# Mode JSON - Résultat structuré

> Extraire des données structurées à partir de pages via des LLM

import ExtractCURL from "/snippets/fr/v2/scrape/json/base/curl.mdx";
import ExtractPython from "/snippets/fr/v2/scrape/json/base/python.mdx";
import ExtractNode from "/snippets/fr/v2/scrape/json/base/js.mdx";
import ExtractOutput from "/snippets/fr/v2/scrape/json/base/output.mdx";
import ExtractNoSchemaPython from "/snippets/fr/v2/scrape/json/no-schema/python.mdx";
import ExtractNoSchemaNode from "/snippets/fr/v2/scrape/json/no-schema/js.mdx";
import ExtractNoSchemaCURL from "/snippets/fr/v2/scrape/json/no-schema/curl.mdx";
import ExtractNoSchemaOutput from "/snippets/fr/v2/scrape/json/no-schema/output.mdx";
import EventExampleCURL from "/snippets/fr/v2/scrape/json/events-example/curl.mdx";
import EventExamplePython from "/snippets/fr/v2/scrape/json/events-example/python.mdx";
import EventExampleNode from "/snippets/fr/v2/scrape/json/events-example/js.mdx";
import EventExampleOutput from "/snippets/fr/v2/scrape/json/events-example/output.mdx";
import ChooseDataExtractor from "/snippets/fr/shared/choose-data-extractor/from-llm-extract.mdx";

**Choisir le bon outil.** Le mode JSON (cette page) est adapté si vous avez **une seule URL** et souhaitez extraire des champs depuis cette page uniquement.

<ChooseDataExtractor />

<Note>
  **Changement de l’API v2 :** L’extraction de schémas JSON est entièrement prise en charge en v2, mais le format de l’API a changé. En v2, le schéma est directement intégré dans l’objet formats sous la forme `formats: [{type: "json", schema: {...}}]`. Le paramètre `jsonOptions` de la v1 n’existe plus en v2.
</Note>

<Note>Pour les échecs de validation de schéma et les autres erreurs d’extraction, consultez [Errors](/fr/api-reference/errors) — les problèmes spécifiques à l’extraction se manifestent généralement par des réponses `400` ou `422`.</Note>

<div id="scrape-and-extract-structured-data-with-firecrawl">
  ## Extraire et structurer des données avec Firecrawl
</div>

Firecrawl utilise l’IA pour obtenir des données structurées à partir de pages web en 3 étapes :

1. **Définir le schéma (optionnel) :**
   Définissez un schéma JSON (au format OpenAI) pour préciser les données souhaitées, ou fournissez simplement un `prompt` si vous n’avez pas besoin d’un schéma strict, ainsi que l’URL de la page web.

2. **Envoyer la requête :**
   Envoyez votre URL et votre schéma au point de terminaison /scrape en utilisant le mode JSON. Découvrez comment ici :
   [Scrape Endpoint Documentation](https://docs.firecrawl.dev/api-reference/endpoint/scrape)

3. **Récupérer vos données :**
   Recevez des données propres et structurées correspondant à votre schéma, prêtes à l’emploi.

Cela rend l’obtention de données web, au format dont vous avez besoin, rapide et simple.

<div id="extract-structured-data">
  ## Extraire des données structurées
</div>

<div id="json-mode-via-scrape">
  ### Mode JSON via /scrape
</div>

Permet d’extraire des données structurées à partir de pages explorées.

<CodeGroup>
  <ExtractPython />

  <ExtractNode />

  <ExtractCURL />
</CodeGroup>

Résultat :

<ExtractOutput />

<div id="structured-data-without-schema">
  ### Données structurées sans schéma
</div>

Vous pouvez aussi extraire sans schéma en passant simplement un `prompt` au point de terminaison. Le LLM détermine la structure des données.

<CodeGroup>
  <ExtractNoSchemaPython />

  <ExtractNoSchemaNode />

  <ExtractNoSchemaCURL />
</CodeGroup>

Résultat :

<ExtractNoSchemaOutput />

<div id="real-world-example-extracting-company-information">
  ### Exemple concret : extraction d’informations d’entreprise
</div>

Voici un exemple complet montrant comment extraire des informations structurées sur une entreprise à partir d’un site web :

<CodeGroup>
  <EventExamplePython />

  <EventExampleNode />

  <EventExampleCURL />
</CodeGroup>

Résultat :

<EventExampleOutput />

<div id="json-format-options">
  ### Options du format JSON
</div>

Lorsque vous utilisez le mode JSON dans la v2, incluez un objet dans `formats` avec le schéma directement intégré :

`formats: [{ type: 'json', schema: { ... }, prompt: '...' }]`

Paramètres :

* `schema` : schéma JSON décrivant la sortie structurée souhaitée (obligatoire pour l’extraction basée sur un schéma).
* `prompt` : prompt facultatif pour guider l’extraction (également utilisé pour l’extraction sans schéma).
* `checkPromptInjection` : booléen facultatif (valeur par défaut : `false`). Lorsqu’il est activé, Firecrawl analyse le contenu de la page scrapée à la recherche de tentatives d’injection de prompts avant d’exécuter l’extraction. Consultez [Détection des injections de prompts](#prompt-injection-detection).

**Important :** Contrairement à la v1, il n’existe pas de paramètre distinct `jsonOptions` dans la v2. Le schéma doit être inclus directement dans l’objet de format du tableau `formats`.

<div id="prompt-injection-detection">
  ### Détection des injections de prompts
</div>

Les pages web peuvent contenir du texte caché conçu pour détourner l’extraction basée sur un LLM — par exemple, des instructions demandant au modèle d’ignorer votre schéma et de renvoyer des données contrôlées par un attaquant. Si vous effectuez une extraction à partir d’URL non fiables ou soumises par les utilisateurs, vous pouvez activer une protection facultative qui vérifie le contenu scrapé avant le lancement de votre extraction :

```json
{
  "url": "https://example.com",
  "formats": [
    {
      "type": "json",
      "schema": { "type": "object", "properties": { "title": { "type": "string" } } },
      "checkPromptInjection": true
    }
  ]
}
```

Fonctionnement :

* Un appel dédié au classifieur inspecte le contenu de la page récupérée (il s’exécute en parallèle de l’extraction, donc son activation ne ralentit pas les récupérations sans problème).
* Si une tentative d’injection de prompt est détectée, la requête échoue avec un code HTTP `403` et le code d’erreur `SCRAPE_PROMPT_INJECTION_DETECTED` — aucune sortie d’extraction n’est renvoyée.
* La vérification est facturée **+4 crédits** en plus du coût standard du format JSON lorsqu’elle s’exécute. Si la récupération échoue après l’exécution de la vérification (y compris lorsqu’une injection est détectée et que la requête est bloquée), **5 crédits** sont facturés au lieu des 0 habituels pour une récupération ayant échoué, car l’appel au classifieur a tout de même été exécuté.

Dans la v1, la même option est disponible sous la forme `jsonOptions.checkPromptInjection`. Elle est également exposée dans tous les SDK officiels (par exemple, `checkPromptInjection` dans le SDK JS, `check_prompt_injection` dans le format JSON v2 du SDK Python).

<Note>
  **Les attributs HTML ne sont pas accessibles dans l’extraction JSON.** L’extraction JSON s’applique à la conversion de la page en markdown, qui ne préserve que le contenu textuel visible. Les attributs HTML (par exemple, `data-id`, attributs personnalisés sur les éléments) sont supprimés lors de la conversion et le LLM ne peut pas les voir. Si vous devez extraire des valeurs d’attribut HTML, utilisez le format `rawHtml` et analysez les attributs côté client, ou utilisez une action `executeJavascript` pour injecter les valeurs d’attribut dans le texte visible avant l’extraction.
</Note>

<div id="tips-for-consistent-extraction">
  ## Conseils pour une extraction cohérente
</div>

Si vous observez des résultats incohérents ou incomplets lors de l&#39;extraction JSON, ces pratiques peuvent aider :

* **Gardez les prompts courts et ciblés.** Des prompts longs avec de nombreuses règles augmentent la variabilité. Placez plutôt les contraintes spécifiques (comme les valeurs autorisées) dans le schéma.
* **Utilisez des noms de propriétés concis.** Évitez d&#39;inclure des instructions ou des listes d&#39;énumération dans les noms de propriétés. Utilisez une clé courte comme `"installation_type"` et placez les valeurs autorisées dans un tableau `enum`.
* **Ajoutez des tableaux `enum` pour les champs contraints.** Lorsqu&#39;un champ possède un ensemble fixe de valeurs, listez-les dans `enum` et assurez-vous qu&#39;elles correspondent exactement au texte affiché sur la page.
* **Incluez la gestion de `null` dans les descriptions de champs.** Ajoutez `"Return null if not found on the page."` à la `description` de chaque champ afin que le modèle ne devine pas les valeurs manquantes.
* **Ajoutez des indications de localisation.** Indiquez au modèle où trouver les données sur la page, par exemple : `"Flow rate in GPM from the Specifications table."`.
* **Divisez les grands schémas en requêtes plus petites.** Les schémas avec de nombreux champs (par exemple 30+) produisent des résultats moins cohérents. Divisez-les en 2–3 requêtes de 10–15 champs chacune.
* **Évitez `minItems`/`maxItems` sur les tableaux.** Les mots-clés de validation JSON Schema comme `minItems` et `maxItems` ne contrôlent pas la quantité de contenu collectée par le scraper. Définir `minItems: 20` n&#39;amènera pas le LLM à renvoyer davantage d&#39;éléments — il peut au contraire halluciner des entrées pour satisfaire la contrainte. Supprimez ces mots-clés et utilisez plutôt un `prompt` (par exemple `"Extract ALL reviews from the page. Do not skip any."`) pour guider l&#39;exhaustivité.
* **Utilisez `"type": "array"` pour extraire des listes d’éléments.** Si vous devez extraire plusieurs éléments (par exemple une liste de personnes, de produits ou d’avis), encapsulez-les dans une propriété tableau avec un bloc `items`. Utiliser `"type": "object"` pour une liste ne renverra qu’un seul élément. Consultez l’exemple de schéma de tableau ci-dessous.

**Exemple de schéma bien structuré :**

```json
{
  "type": "object",
  "properties": {
    "product_name": {
      "type": ["string", "null"],
      "description": "Full descriptive product name as shown on the page. Return null if not found."
    },
    "installation_type": {
      "type": ["string", "null"],
      "description": "Installation type from the Specifications section. Return null if not found.",
      "enum": ["Deck-mount", "Wall-mount", "Countertop", "Drop-in", "Undermount"]
    },
    "flow_rate_gpm": {
      "type": ["string", "null"],
      "description": "Flow rate in GPM from the Specifications section. Return null if not found."
    }
  }
}
```

**Exemple d’extraction d’une liste d’éléments :**

Lorsqu’une page contient plusieurs éléments (par exemple des membres d’équipe, des produits ou des avis), utilisez `"type": "array"` avec `"items"` pour obtenir la liste complète :

```json
{
  "type": "object",
  "properties": {
    "people": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "role": { "type": "string" },
          "department": { "type": "string" }
        }
      }
    }
  }
}
```

> Vous êtes un agent IA et vous avez besoin d’une clé API Firecrawl ? Consultez [firecrawl.dev/agent-onboarding/SKILL.md](https://www.firecrawl.dev/agent-onboarding/SKILL.md) pour obtenir les instructions d’intégration automatisée.
