Recherche Web
Clé API requise : Obtiens-en une sur https://api.search.brave.com
Plan : Inclus dans le plan Search. Voir https://api-dashboard.search.brave.com/app/subscriptions/subscribe
Démarrage rapide (cURL)
Recherche basique
curl -s "https://api.search.brave.com/res/v1/web/search?q=python+web+frameworks" \
-H "Accept: application/json" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}"
Avec paramètres
curl -s "https://api.search.brave.com/res/v1/web/search" \
-H "Accept: application/json" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-G \
--data-urlencode "q=rust programming tutorials" \
--data-urlencode "country=US" \
--data-urlencode "search_lang=en" \
--data-urlencode "count=10" \
--data-urlencode "safesearch=moderate" \
--data-urlencode "freshness=pm"
Endpoint
GET https://api.search.brave.com/res/v1/web/search
POST https://api.search.brave.com/res/v1/web/search
Remarque : Les méthodes GET et POST sont toutes deux supportées. POST est utile pour les requêtes longues ou les Goggles complexes.
Authentification : En-tête X-Subscription-Token: <API_KEY>
En-têtes optionnels :
Accept-Encoding: gzip— Activer la compression gzip
Quand utiliser la recherche Web
| Fonctionnalité | Recherche Web (celle-ci) | Contexte LLM (llm-context) |
Réponses (answers) |
|---|---|---|---|
| Sortie | Résultats structurés (liens, extraits, métadonnées) | Contenu de page pré-extrait pour les LLM | Réponses IA complètes avec citations |
| Types de résultats | Web, actualités, vidéos, discussions, FAQ, infobox, lieux, enrichis | Extraits de texte, tableaux, code | Réponse synthétisée + liste de sources |
| Fonctionnalités uniques | Goggles, données structurées (schemas), callbacks enrichis |
Contrôle du budget de tokens, modes seuil | Recherche multi-itérations, streaming, compatible SDK OpenAI |
| Vitesse | Rapide (~0,5–1 s) | Rapide (<1 s) | Plus lent (~30–180 s) |
| Optimal pour | UI de recherche, extraction de données, classement personnalisé | Pipelines RAG, agents IA, ancrage | Interfaces de chat, recherche approfondie |
Paramètres
| Paramètre | Type | Requis | Défaut | Description |
|---|---|---|---|---|
q |
string | Oui | - | Requête de recherche (1–400 caractères, max 50 mots) |
country |
string | Non | US |
Pays de recherche (code pays 2 lettres ou ALL) |
search_lang |
string | Non | en |
Préférence de langue (code langue 2+ caractères) |
ui_lang |
string | Non | en-US |
Langue de l'UI (ex. « en-US ») |
count |
int | Non | 20 |
Max résultats par page (1–20) |
offset |
int | Non | 0 |
Décalage de page pour pagination (0–9) |
safesearch |
string | Non | moderate |
Filtre de contenu adulte (off/moderate/strict) |
freshness |
string | Non | - | Filtre temporel (pd/pw/pm/py ou plage de dates) |
text_decorations |
bool | Non | true |
Inclure marqueurs de surlignage |
spellcheck |
bool | Non | true |
Correction automatique de requête |
result_filter |
string | Non | - | Filtrer types de résultats (séparés par virgules) |
goggles |
string | Non | - | Filtre de classement personnalisé (URL ou inline) |
extra_snippets |
bool | Non | - | Obtenir jusqu'à 5 extraits supplémentaires par résultat |
operators |
bool | Non | true |
Appliquer opérateurs de recherche |
units |
string | Non | - | Unités de mesure (metric/imperial) |
enable_rich_callback |
bool | Non | false |
Activer callback de données tierces enrichies |
include_fetch_metadata |
bool | Non | false |
Inclure fetched_content_timestamp sur résultats |
Valeurs de Freshness
| Valeur | Description |
|---|---|
pd |
Jour passé (24 heures) |
pw |
Semaine passée (7 jours) |
pm |
Mois passé (31 jours) |
py |
Année passée (365 jours) |
YYYY-MM-DDtoYYYY-MM-DD |
Plage de dates personnalisée |
Valeurs de Result Filter
Types de filtre : discussions, faq, infobox, news, query, videos, web, locations
# Uniquement résultats web et vidéo
curl "...&result_filter=web,videos"
En-têtes de localisation (Optionnels)
Pour des résultats conscients de la localisation, ajoute ces en-têtes. Lat/Long suffit quand les coordonnées sont connues — les autres en-têtes ne sont nécessaires qu'en secours quand les coordonnées ne sont pas disponibles.
| En-tête | Type | Description |
|---|---|---|
X-Loc-Lat |
float | Latitude de l'utilisateur (-90,0 à 90,0) |
X-Loc-Long |
float | Longitude de l'utilisateur (-180,0 à 180,0) |
X-Loc-Timezone |
string | Fuseau horaire IANA (ex. « America/San_Francisco ») |
X-Loc-City |
string | Nom de la ville |
X-Loc-State |
string | Code état/région (ISO 3166-2) |
X-Loc-State-Name |
string | Nom complet état/région (ex. « California ») |
X-Loc-Country |
string | Code pays 2 lettres |
X-Loc-Postal-Code |
string | Code postal (ex. « 94105 ») |
Priorité :
X-Loc-Lat+X-Loc-Longprennent le dessus. Quand fournis, les services en aval résolvent la localisation directement à partir des coordonnées et les en-têtes textuels (City, State, Country, Postal-Code) ne sont pas utilisés pour la résolution de localisation. Fournis les en-têtes textuels uniquement quand tu n'as pas de coordonnées. Envoyer les deux ne causera aucun problème — lat/long gagne simplement.
Format de réponse
Champs de réponse
| Champ | Type | Description |
|---|---|---|
type |
string | Toujours "search" |
query.original |
string | Requête de recherche originale |
query.altered |
string? | Requête corrigée par vérification d'orthographe (si modifiée) |
query.cleaned |
string? | Requête nettoyée/normalisée |
query.spellcheck_off |
bool? | Si vérification d'orthographe était désactivée |
query.more_results_available |
bool | Si plus de pages existent |
query.show_strict_warning |
bool? | True si safesearch strict a bloqué résultats adultes |
query.search_operators |
object? | Opérateurs de recherche appliqués (applied, cleaned_query, sites) |
web.type |
string | Toujours "search" |
web.results[].title |
string | Titre de page |
web.results[].url |
string | URL de page |
web.results[].description |
string? | Texte d'extrait/description |
web.results[].age |
string? | Âge lisible (ex. « Il y a 2 jours ») |
web.results[].language |
string? | Code langue du contenu |
web.results[].meta_url |
object | Composants d'URL (scheme, netloc, hostname, path) |
web.results[].thumbnail |
object? | Miniature (src, original) |
web.results[].thumbnail.original |
string? | URL image taille complète originale |
web.results[].thumbnail.logo |
bool? | Si la miniature est un logo |
web.results[].profile |
object? | Identité de l'éditeur (name, url, long_name, img) |
web.results[].page_age |
string? | ISO datetime de publication (ex. "2025-04-12T14:22:41") |
web.results[].extra_snippets |
list[str]? | Jusqu'à 5 extraits supplémentaires |
web.results[].deep_results |
object? | Liens additionnels (buttons, links) de la page |
web.results[].schemas |
list? | Données structurées schema.org brutes |
web.results[].product |
object? | Info produit et avis |
web.results[].recipe |
object? | Détails recette (ingrédients, temps, notes) |
web.results[].article |
object? | Métadonnées article (auteur, éditeur, date) |
web.results[].book |
object? | Info livre (auteur, ISBN, note) |
web.results[].software |
object? | Info produit logiciel |
web.results[].rating |
object? | Notes agrégées |
web.results[].faq |
object? | FAQ trouvée sur la page |
web.results[].movie |
object? | Info film (réalisateurs, acteurs, genre) |
web.results[].video |
object? | Métadonnées vidéo (durée, vues, créateur) |
web.results[].location |
object? | Détails localisation/restaurant |
web.results[].qa |
object? | Info question/réponse |
web.results[].creative_work |
object? | Données créations artistiques |
web.results[].music_recording |
object? | Données musique/chanson |
web.results[].organization |
object? | Info organisation |
web.results[].review |
object? | Données avis |
web.results[].content_type |
string? | Classification type contenu |
web.results[].fetched_content_timestamp |
int? | Timestamp fetch (avec include_fetch_metadata=true) |
web.mutated_by_goggles |
bool | Si résultats réclassés par Goggles |
web.family_friendly |
bool | Si résultats sont familiaux |
mixed |
object? | Ordre d'affichage préféré (voir Réponse mixte ci-dessous) |
discussions.results[] |
array? | Clusters discussions forum |
discussions.results[].data.forum_name |
string? | Nom forum/communauté |
discussions.results[].data.num_answers |
int? | Nombre réponses/commentaires |
discussions.results[].data.question |
string? | Question discussion |
discussions.results[].data.top_comment |
string? | Extrait commentaire top voté |
faq.results[] |
array? | Entrées FAQ |
news.results[] |
array? | Articles actualités |
videos.results[] |
array? | Résultats vidéos |
infobox.results[] |
array? | Entrées graphe de connaissances |
locations.results[] |
array? | Résultats POI locaux |
rich.hint.vertical |
string? | Type résultat enrichi |
rich.hint.callback_key |
string? | Clé callback pour données enrichies |
Exemple JSON
{
"type": "search",
"query": {
"original": "python frameworks",
"altered": "python web frameworks",
"spellcheck_off": false,
"more_results_available": true
},
"web": {
"type": "search",
"results": [
{
"title": "Top Python Web Frameworks",
"url": "https://example.com/python-frameworks",
"description": "A comprehensive guide to Python web frameworks...",
"age": "2 days ago",
"language": "en",
"meta_url": {
"scheme": "https",
"netloc": "example.com",
"hostname": "example.com",
"path": "/python-frameworks"
},
"thumbnail": {
"src": "https://...",
"original": "https://original-image-url.com/img.jpg"
},
"extra_snippets": ["Additional excerpt 1...", "Additional excerpt 2..."]
}
],
"family_friendly": true
},
"mixed": {
"type": "mixed",
"main": [
{"type": "web", "index": 0, "all": false},
{"type": "web", "index": 1, "all": false},
{"type": "videos", "all": true}
],
"top": [],
"side": []
},
"videos": { "...": "..." },
"news": { "...": "..." },
"rich": {
"type": "rich",
"hint": {
"vertical": "weather",
"callback_key": "<callback_key_hex>"
}
}
}
Réponse mixte
L'objet mixed définit l'ordre d'affichage préféré des résultats à travers les types. Il contient trois tableaux :
| Tableau | Objectif |
|---|---|
main |
Liste des résultats primaires (séquence ordonnée de résultats à afficher) |
top |
Résultats à afficher au-dessus des résultats principaux |
side |
Résultats à afficher à côté des résultats principaux (ex. infobox) |
Chaque entrée est une ResultReference avec type (ex. "web", "videos"), index (dans le tableau de résultats correspondant), et all (true pour inclure tous les résultats de ce type à cette position).
Opérateurs de recherche
| Opérateur | Syntaxe | Description |
|---|---|---|
| Site | site:example.com |
Limiter résultats à un domaine spécifique |
| Extension fichier | ext:pdf |
Résultats avec extension fichier spécifique |
| Type fichier | filetype:pdf |
Résultats créés dans type fichier spécifique |
| Dans titre | intitle:python |
Pages avec terme dans titre |
| Dans corps | inbody:tutorial |
Pages avec terme dans corps |
| Dans page | inpage:guide |
Pages avec terme dans titre ou corps |
| Langue | lang:es |
Pages dans langue spécifique (ISO 639-1) |
| Localisation | loc:us |
Pages d'un pays spécifique (ISO 3166-1 alpha-2) |
| Inclure | +term |
Forcer inclusion d'un terme |
| Exclure | -term |
Exclure pages contenant le terme |
| Correspondance exacte | "exact phrase" |
Correspondre phrase exacte en ordre |
| AND | term1 AND term2 |
Les deux termes requis (majuscules) |
| OR / NOT | term1 OR term2, NOT term |
Opérateurs logiques (majuscules) |
Définis operators=false pour désactiver l'analyse des opérateurs.
Goggles (Classement personnalisé) — Unique à Brave
Les Goggles te permettent de réclasser les résultats de recherche — amplifier sources de confiance, supprimer spam SEO, ou construire scopes de recherche ciblés.
| Méthode | Exemple |
|---|---|
| Hébergée | --data-urlencode "goggles=https://raw.githubusercontent.com/brave/goggles-quickstart/main/goggles/rust_programming.goggle" |
| Inline | --data-urlencode 'goggles=$discard\n$site=example.com' |
Les Goggles hébergés doivent être sur GitHub/GitLab, inclure en-têtes
! name:,! description:,! author:, et être enregistrés sur https://search.brave.com/goggles/create. Les règles inline ne nécessitent aucune inscription.
Syntaxe : $boost=N / $downrank=N (1–10), $discard, $site=example.com. Combiner avec virgules : $site=example.com,boost=3. Séparer règles avec \n (%0A).
Liste blanche : $discard\n$site=docs.python.org\n$site=developer.mozilla.org — Liste noire : $discard,site=pinterest.com\n$discard,site=quora.com
Ressources : Discover · Syntaxe · Quickstart
Enrichissements de données enrichies
Pour requêtes sur météo, actions, sports, devises, etc., utilise le workflow callback enrichi :
# 1. Rechercher avec callback enrichi activé
curl -s "https://api.search.brave.com/res/v1/web/search?q=weather+san+francisco&enable_rich_callback=true" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}"
# Réponse inclut : "rich": {"hint": {"callback_key": "abc123...", "vertical": "weather"}}
# 2. Obtenir données enrichies avec la clé callback
curl -s "https://api.search.brave.com/res/v1/web/rich?callback_key=abc123..." \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}"
Types enrichis supportés : Calculator, Definitions, Unit Conversion, Unix Timestamp, Package Tracker, Stock, Currency, Cryptocurrency, Weather, American Football, Baseball, Basketball, Cricket, Football/Soccer, Ice Hockey, Web3, Translator
Endpoint Callback enrichi
GET https://api.search.brave.com/res/v1/web/rich
| Paramètre | Type | Requis | Description |
|---|---|---|---|
callback_key |
string | Oui | Clé callback du champ rich.hint.callback_key de la recherche web |
Cas d'usage
- Intégration de recherche généraliste : Ensemble de résultats le plus riche (web, actualités, vidéos, discussions, FAQ, infobox, lieux) en un appel. Pour ancrage RAG/LLM, préfère
llm-context. - Extraction de données structurées : Produits, recettes, notes, articles via
schemaset champs typés sur résultats. - Recherche personnalisée avec Goggles : Unique à Brave. Amplifier/ignorer sites avec règles inline ou Goggles hébergés pour classement entièrement personnalisé.
Notes
- Pagination : Utilise
offset(0–9) aveccountpour parcourir résultats - Count : Max 20 pour recherche web ; résultats réels peuvent être moins que demandé