Recherche de lieux (API Search)
Nécessite une clé API : Obtenir une à https://api.search.brave.com
Plan : Inclus dans le plan Search (avec l'option
locations). Voir https://api-dashboard.search.brave.com/app/subscriptions/subscribeAutonome : Contrairement à
local-poisetlocal-descriptions, cet endpoint ne nécessite pas d'identifiants POI d'une recherche web préalable. Vous fournissez directement un lieu et une requête optionnelle.
Démarrage rapide (cURL)
Recherche par requête + coordonnées
curl -s "https://api.search.brave.com/res/v1/local/place_search" \
-H "Accept: application/json" \
-H "Accept-Encoding: gzip" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-G \
--data-urlencode "q=coffee shops" \
--data-urlencode "latitude=37.7749" \
--data-urlencode "longitude=-122.4194" \
--data-urlencode "radius=5000"
Recherche par requête + chaîne de lieu
curl -s "https://api.search.brave.com/res/v1/local/place_search" \
-H "Accept: application/json" \
-H "Accept-Encoding: gzip" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-G \
--data-urlencode "q=sushi restaurants" \
--data-urlencode "location=tokyo japan" \
--data-urlencode "country=JP" \
--data-urlencode "search_lang=en"
Parcourir les POI généraux (sans requête)
curl -s "https://api.search.brave.com/res/v1/local/place_search" \
-H "Accept: application/json" \
-H "Accept-Encoding: gzip" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-G \
--data-urlencode "latitude=48.8566" \
--data-urlencode "longitude=2.3522" \
--data-urlencode "radius=3000" \
--data-urlencode "country=FR"
Endpoint
GET https://api.search.brave.com/res/v1/local/place_search
Authentification : En-tête X-Subscription-Token: <API_KEY>
Paramètres
Lieu (optionnel mais recommandé)
Fournir une ancre géographique améliore la précision. Vous pouvez utiliser des coordonnées (latitude + longitude) ou une chaîne location. Omettre les deux est autorisé quand une q est fournie — les résultats sont issus mondialement et peuvent être moins précis. Omettre les trois (q, latitude/longitude, et location) renvoie HTTP 422.
| Paramètre | Type | Requis | Par défaut | Description |
|---|---|---|---|---|
latitude |
float | Conditionnel | — | Latitude (-90,0 à 90,0). Requis avec longitude |
longitude |
float | Conditionnel | — | Longitude (-180,0 à 180,0). Requis avec latitude |
location |
string | Non | — | Chaîne de lieu, alternative aux coordonnées. US : <city> <state> <country> (ex. san francisco ca united states). Non-US : <city> <country> (ex. tokyo japan). Insensible à la casse, pas de virgules nécessaires. L'anglais ou la langue locale la plus courante fonctionne mieux |
Recherche
| Paramètre | Type | Requis | Par défaut | Description |
|---|---|---|---|---|
q |
string | Non | — | Requête en texte libre (ex. coffee shops, pizza). Entièrement optionnel — si omis, retourne les POI généraux dans la zone donnée |
Options supplémentaires
| Paramètre | Type | Requis | Par défaut | Description |
|---|---|---|---|---|
radius |
float | Non | — | Biais de rayon de recherche autour des coordonnées fournies, en mètres. Pas une limite stricte — les résultats peuvent s'étendre au-delà. Aucune limite supérieure |
count |
int | Non | 20 |
Total d'éléments retournés sur tous les buckets (1–100), pas seulement results — une requête d'adresse peut dépenser tout le budget sur addresses/streets |
geoloc |
string | Non | — | Géolocalisation de l'utilisateur en tant que <latitude>x<longitude> (ex. 40.7128x-74.0060), utilisée pour calculer distance |
country |
string | Non | US |
Pays de recherche (code pays sur 2 lettres ou ALL) |
search_lang |
string | Non | en |
Langue pour les résultats de recherche (code langue de 2+ caractères) |
ui_lang |
string | Non | en-US |
Langue UI (code locale, ex. en-US) |
units |
string | Non | metric |
Unités de mesure : metric ou imperial |
safesearch |
string | Non | strict |
Niveau de safe search : off, moderate, ou strict |
spellcheck |
bool | Non | true |
S'il faut appliquer la correction orthographique à la requête |
Format de réponse
Champs de niveau supérieur
| Champ | Type | Description |
|---|---|---|
type |
string | Toujours "locations" |
results |
array | Liste d'objets LocationResult (POI individuels) |
cities |
array | Villes correspondantes, type: "city" — voir Champs de lieu géographique |
countries |
array | Pays correspondants, type: "country" |
regions |
array | Régions correspondantes, type: "region" |
neighborhoods |
array | Quartiers correspondants, type: "neighborhood" |
addresses |
array | Liste d'objets AddressResult avec type: "address" — emplacements rue + numéro spécifiques |
streets |
array | Liste d'objets AddressResult avec type: "street" — rues entières |
mixed |
array | Indices d'ordonnancement ResultReference décrivant comment entrelacer les buckets sur un SERP |
location |
object? | Info du lieu résolu |
location.coordinates |
[float, float] | [latitude, longitude] du centre résolu |
location.name |
string | Nom du lieu résolu (ex. "Helsinki") |
location.country |
string | Code pays sur 2 lettres (ex. "FI") |
Traitez un bucket manquant comme vide. Pour les requêtes de style POI typiques, seul results est rempli, donc les clients qui ne restituent pas des SERP riches peuvent ignorer le reste — sauf pour les requêtes en forme d'adresse ou de rue, qui peuvent retourner results vide et placer chaque correspondance dans addresses/streets.
Champs LocationResult
Chaque élément de results est un LocationResult :
| Champ | Type | Description |
|---|---|---|
type |
string | Toujours "location_result" |
title |
string | Nom de l'entreprise/POI |
url |
string | URL canonique |
description |
string? | Courte description ou libellé de catégorie (ex. "Coffee Shop") |
provider_url |
string | URL de page du fournisseur |
id |
string? | Identifiant POI opaque (valide ~8 heures, utilisable avec local-pois et local-descriptions) |
coordinates |
[float, float]? | [latitude, longitude] |
postal_address |
object | displayAddress, plus optionnellement streetAddress, addressLocality, addressRegion, postalCode, country |
contact.telephone |
string? | Numéro de téléphone |
contact.email |
string? | Adresse e-mail |
rating.ratingValue |
float? | Note moyenne |
rating.bestRating |
float? | Note maximale possible |
rating.reviewCount |
int? | Nombre d'avis |
rating.is_tripadvisor |
bool | Si la note provient de Tripadvisor |
opening_hours.current_day |
object[]? | Heures d'aujourd'hui (abbr_name, full_name, opens, closes) |
opening_hours.days |
object[][]? | Heures pour chaque jour de la semaine |
categories |
string[] | Catégories d'entreprise (par défaut []) |
price_range |
string? | Indicateur de prix, ex. $, $$, $$ - $$$ |
serves_cuisine |
string[]? | Types de cuisine (restaurants) |
distance.value |
float? | Distance depuis le lieu de recherche |
distance.units |
string? | Unité de distance |
icon_category |
string? | Slug de catégorie d'icône (ex. cafe) |
thumbnail.src |
string? | URL d'image miniature |
thumbnail.original |
string? | URL d'image originale |
pictures.results |
object[]? | Images supplémentaires (src, original) |
profiles |
object[]? | Profils externes (name, url, long_name, img) |
timezone |
string? | Fuseau horaire IANA (ex. America/Los_Angeles) |
zoom_level |
int | Niveau de zoom de carte suggéré (par défaut 7) |
Champs de lieu géographique (cities, countries, regions, neighborhoods)
Les quatre buckets partagent une même structure, différant seulement par l'identifiant type. La spec publiée les nomme CityResult / CountryResult / RegionResult / NeighborhoodResult.
| Champ | Type | Description |
|---|---|---|
type |
string | Identifiant du bucket : city, country, region, ou neighborhood |
name |
string | Nom du lieu |
country |
string | Code pays du lieu |
coordinates |
[float, float] | [latitude, longitude] |
thumbnail.src |
string | URL d'image primaire |
Champs AddressResult (addresses et streets)
Le même modèle est utilisé pour les deux buckets. Les éléments de addresses ont type: "address" (rue + numéro) ; les éléments de streets ont type: "street" (rue entière).
| Champ | Type | Description |
|---|---|---|
type |
string | "address" (dans addresses) ou "street" (dans streets) |
name |
string | Nom d'affichage de l'adresse ou de la rue |
coordinates |
[float, float] | [latitude, longitude] |
pois |
object[] | Objets LocationResult situés à cette adresse/rue |
pois_nearby |
object[] | Objets LocationResult situés à proximité |
zoom_level |
int | Niveau de zoom de carte suggéré (par défaut 15) |
distance.value |
float? | Distance depuis le lieu de recherche |
distance.units |
string? | Unité de distance |
postal_address |
object? | displayAddress, streetAddress, addressLocality, addressRegion, country |
Ordonnancement mixte (mixed)
mixed est une liste ordonnée d'objets ResultReference indiquant aux clients comment entrelacer les éléments des différents buckets sur un seul SERP.
| Champ | Type | Description |
|---|---|---|
type |
string | Bucket dont extraire : results, cities, countries, regions, neighborhoods, addresses, ou streets |
index |
int? | Index de base 0 de l'élément au sein de ce bucket. Peut être null quand all est true |
all |
bool | Quand true, tous les éléments restants du bucket nommé doivent être placés à cette position |
Les clients qui restituent seulement des POI peuvent ignorer mixed entièrement et lire results directement.
Exemple de réponse
{
"type": "locations",
"results": [
{
"type": "location_result",
"title": "Blue Bottle Coffee",
"url": "https://yelp.com/biz/blue-bottle-coffee-sf",
"provider_url": "",
"id": "loc4CQWMJWLD4VBEBZ62XQLJTGK6YCJEEJDNAAAAAAA=",
"description": "Coffee Shop",
"postal_address": {
"type": "PostalAddress",
"displayAddress": "315 Linden St, San Francisco, CA 94102"
},
"contact": { "telephone": "+15106533394" },
"rating": {
"ratingValue": 4.3,
"bestRating": 5.0,
"reviewCount": 1024,
"is_tripadvisor": true
},
"opening_hours": {
"current_day": [
{ "abbr_name": "Tue", "full_name": "Tuesday", "opens": "07:00", "closes": "18:00" }
],
"days": [
[{ "abbr_name": "Mon", "full_name": "Monday", "opens": "07:00", "closes": "18:00" }]
]
},
"coordinates": [37.7763, -122.4215],
"categories": [],
"serves_cuisine": ["Cafe", "Coffee Shop"],
"price_range": "$$",
"icon_category": "cafe",
"thumbnail": {
"src": "https://example.com/thumb.jpg",
"original": "https://example.com/original.jpg"
},
"zoom_level": 7
}
],
"cities": [],
"countries": [],
"regions": [],
"neighborhoods": [],
"addresses": [],
"streets": [],
"mixed": [
{ "type": "results", "index": 0, "all": false }
],
"location": {
"coordinates": [37.7749, -122.4194],
"name": "San Francisco",
"country": "US"
}
}
Pour une requête qui correspond à un nom de ville, la réponse ajoute une entrée city dans cities :
{
"cities": [
{
"type": "city",
"name": "San Francisco",
"country": "US",
"coordinates": [37.7749, -122.4194],
"thumbnail": { "src": "https://example.com/sf.jpg" }
}
],
"mixed": [
{ "type": "cities", "index": 0, "all": false }
]
}
Enrichir les résultats avec les détails POI et les descriptions
Les valeurs id POI de results peuvent être transmises aux endpoints frères pour des données plus riches :
# Obtenir les détails complets du POI (heures, avis, photos, mentions de résultats web)
curl -s "https://api.search.brave.com/res/v1/local/pois" -G \
--data-urlencode "ids=loc4CQWMJWLD4VBEBZ62XQLJTGK6YCJEEJDNAAAAAAA=" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}"
# Obtenir les descriptions générées par IA
curl -s "https://api.search.brave.com/res/v1/local/descriptions" -G \
--data-urlencode "ids=loc4CQWMJWLD4VBEBZ62XQLJTGK6YCJEEJDNAAAAAAA=" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}"
Cas d'usage
- Exploration basée sur carte : Rechercher des POI dans une fenêtre de carte visible en utilisant des coordonnées + rayon. Aucune requête préalable nécessaire.
- Applications géolocalisées : Construire des fonctionnalités « À proximité » — transmettre les coordonnées GPS de l'appareil et une requête pour trouver des entreprises pertinentes.
- Planification de voyage : Rechercher des attractions, restaurants et hôtels par chaîne de lieu (ex.
paris france) sans avoir besoin de coordonnées exactes.
Notes
- Trouve des lieux, pas des pages : Cet endpoint recherche dans un index géographique de lieux physiques. Utilisez la recherche web pour la récupération d'informations générales.
- Choisir un rayon : Un rayon plus serré (sous ~20 km) donne des résultats plus focalisés. Augmentez-le pour atteindre des lieux spécifiques ou bien connus plus loin ; pour les recherches de catégories courantes (ex.
restaurants), le biais par défaut ou plus serré fonctionne mieux.