$npx -y skills add brave/brave-search-skills --skill local-poisUSE FOR getting local business/POI details. Requires POI IDs obtained from web-search (with result_filter=locations). Returns full business information including ratings, hours, contact info. Max 20 IDs.
| 1 | # Local POIs (Search API) |
| 2 | |
| 3 | > **Requires API Key**: Get one at https://api.search.brave.com |
| 4 | > |
| 5 | > **Plan**: Included in the **Search** plan. See https://api-dashboard.search.brave.com/app/subscriptions/subscribe |
| 6 | > |
| 7 | > **Two-step flow**: This endpoint requires POI IDs from a prior web search. |
| 8 | > |
| 9 | > 1. Call `web-search` with `result_filter=locations` to get POI IDs from `locations.results[].id` |
| 10 | > 2. Pass those IDs to this endpoint to get full business details |
| 11 | |
| 12 | ## Quick Start (cURL) |
| 13 | |
| 14 | ### Get POI Details |
| 15 | ```bash |
| 16 | curl -s "https://api.search.brave.com/res/v1/local/pois" \ |
| 17 | -H "Accept: application/json" \ |
| 18 | -H "Accept-Encoding: gzip" \ |
| 19 | -H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \ |
| 20 | -G \ |
| 21 | --data-urlencode "ids=loc4CQWMJWLD4VBEBZ62XQLJTGK6YCJEEJDNAAAAAAA=" |
| 22 | ``` |
| 23 | |
| 24 | ### Multiple POIs with Location Headers |
| 25 | ```bash |
| 26 | curl -s "https://api.search.brave.com/res/v1/local/pois" \ |
| 27 | -H "Accept: application/json" \ |
| 28 | -H "Accept-Encoding: gzip" \ |
| 29 | -H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \ |
| 30 | -H "X-Loc-Lat: 37.7749" \ |
| 31 | -H "X-Loc-Long: -122.4194" \ |
| 32 | -G \ |
| 33 | --data-urlencode "ids=loc4CQWMJWLD4VBEBZ62XQLJTGK6YCJEEJDNAAAAAAA=" \ |
| 34 | --data-urlencode "ids=loc4HTAVTJKP4RBEBZCEMBI3NG26YD4II4PATIHPDYI=" \ |
| 35 | --data-urlencode "units=imperial" |
| 36 | ``` |
| 37 | |
| 38 | **Note**: POI IDs are opaque strings returned in web search `locations.results[].id`. IDs are ephemeral and expire after ~8 hours. The example IDs above are for illustration — fetch fresh IDs via `web-search` with `result_filter=locations`. Use `--data-urlencode` since IDs may contain `=`. |
| 39 | |
| 40 | ## Endpoint |
| 41 | |
| 42 | ```http |
| 43 | GET https://api.search.brave.com/res/v1/local/pois |
| 44 | ``` |
| 45 | |
| 46 | **Authentication**: `X-Subscription-Token: <API_KEY>` header |
| 47 | |
| 48 | ## Parameters |
| 49 | |
| 50 | | Parameter | Type | Required | Default | Description | |
| 51 | |--|--|--|--|--| |
| 52 | | `ids` | string[] | **Yes** | — | POI IDs from web search results (1-20) | |
| 53 | | `search_lang` | string | No | `en` | Language preference (2+ char language code) | |
| 54 | | `ui_lang` | string | No | `en-US` | UI language (locale code, e.g., "en-US") | |
| 55 | | `units` | string | No | null | `metric` (km) or `imperial` (miles) | |
| 56 | |
| 57 | ### Location Headers (Optional) |
| 58 | |
| 59 | For distance calculation from user location: |
| 60 | |
| 61 | | Header | Type | Range | Description | |
| 62 | |--|--|--|--| |
| 63 | | `X-Loc-Lat` | float | -90.0 to 90.0 | User latitude | |
| 64 | | `X-Loc-Long` | float | -180.0 to 180.0 | User longitude | |
| 65 | |
| 66 | ## Response Fields |
| 67 | |
| 68 | The response has `type: "local_pois"` and a `results` array of `LocationResult` objects: |
| 69 | |
| 70 | | Field | Type | Description | |
| 71 | |--|--|--| |
| 72 | | `title` | string | Business/POI name | |
| 73 | | `url` | string | Canonical URL for the location | |
| 74 | | `provider_url` | string | Provider page URL | |
| 75 | | `type` | string | Always `"location_result"` | |
| 76 | | `id` | string | POI identifier (opaque string, valid ~8 hours) | |
| 77 | | `description` | string? | Short description | |
| 78 | | `postal_address.type` | string | Always `"PostalAddress"` | |
| 79 | | `postal_address.displayAddress` | string | Formatted display address | |
| 80 | | `postal_address.streetAddress` | string? | Street address | |
| 81 | | `postal_address.addressLocality` | string? | City | |
| 82 | | `postal_address.addressRegion` | string? | State/region | |
| 83 | | `postal_address.postalCode` | string? | Postal/ZIP code | |
| 84 | | `postal_address.country` | string? | Country code | |
| 85 | | `contact.telephone` | string? | Phone number | |
| 86 | | `contact.email` | string? | Email address | |
| 87 | | `rating.ratingValue` | float? | Average rating (≥0) | |
| 88 | | `rating.bestRating` | float? | Max possible rating | |
| 89 | | `rating.reviewCount` | int? | Number of reviews | |
| 90 | | `rating.profile.name` | string? | Rating provider name | |
| 91 | | `rating.profile.url` | string? | Rating provider URL | |
| 92 | | `opening_hours.current_day` | object[]? | Today's hours (`abbr_name`, `full_name`, `opens`, `closes`) | |
| 93 | | `opening_hours.days` | object[][]? | Hours for each day of the week (same structure) | |
| 94 | | `coordinates` | [float, float]? | `[latitude, longitude]` tuple | |
| 95 | | `distance.value` | float? | Distance from user location | |
| 96 | | `distance.units` | string? | Distance unit (`km` or `miles`) | |
| 97 | | `categories` | string[] | Business categories (default `[]`) | |
| 98 | | `price_range` | string? | Price indicator (`$`, `$$`, `$$$`, `$$$$`) | |
| 99 | | `serves_cuisine` | string[]? | Cuisine types (restaurants) | |
| 100 | | `thumbnail.src` | string? | Thumbnail image URL | |
| 101 | | `thumbnail.original` | string? | Original image URL | |
| 102 | | `profiles` | object[]? | External profiles (`name`, `url`, `long_name`, `img`) | |
| 103 | | `reviews.reviews_in_foreign_language` | bool | Whether reviews in a foreign language are available | |
| 104 | | `pictures.results` | object[]? | Photo thumbnails | |
| 105 | | `action` | object? | Action to take — has `type` (string) and `url` (string) | |
| 106 | | `results` | object[]? | Related web results (`LocationWebResult` with `meta_url`) | |
| 107 | | `timezone` | string? | IANA timezone (e.g., `America/Los_Angeles`) |