
Local Pois
- 643 installs
- 164 repo stars
- Updated August 3, 2026
- brave/brave-search-skills
local-pois is a Claude Code skill that fetches Brave Search API local business details from POI IDs for developers who need ratings, hours, and contact info in agent or app integrations.
About
local-pois is a Brave Search API integration skill from brave/brave-search-skills that returns full local business and point-of-interest details including ratings, hours, and contact information. It requires a Brave Search API key on the Search plan and operates as step two of a two-step flow: first call web-search with result_filter=locations to collect POI IDs from locations.results[].id, then pass up to 20 IDs to local-pois for enriched records. Developers reach for local-pois when building location-aware agents or apps that need structured POI data beyond basic search snippets.
- Local POI Brave API integration
- Geo-ranked place result parsing
- Natural-language nearby search
- Mobile and agent tool compatibility
- Location-aware query parameters
Local Pois by the numbers
- 643 all-time installs (skills.sh)
- Ranked #590 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/brave/brave-search-skills --skill local-poisAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 643 |
|---|---|
| repo stars | ★ 164 |
| Last updated | August 3, 2026 |
| Repository | brave/brave-search-skills ↗ |
How do you fetch local business details from Brave Search API?
Integrate Brave local points-of-interest search so agents and apps return nearby places, hours, and geo-ranked results from natural-language queries.
Who is it for?
Developers integrating Brave Search into location-aware agents who already obtain POI IDs from a prior web-search locations filter call.
Skip if: Global web search without local intent or workflows that skip the required web-search POI ID discovery step.
When should I use this skill?
An agent has POI IDs from Brave web-search with result_filter=locations and needs full business details for nearby places.
What you get
Enriched POI records with ratings, business hours, contact info, and geo-ranked local place metadata for up to 20 IDs.
- Enriched POI detail records
- Ratings and hours metadata
By the numbers
- Accepts a maximum of 20 POI IDs per local-pois request
Files
Local POIs (Search API)
Requires API Key: Get one at https://api.search.brave.com
>
Plan: Included in the Search plan. See https://api-dashboard.search.brave.com/app/subscriptions/subscribe
>
Two-step flow: This endpoint requires POI IDs from a prior web search.
>
1. Callweb-searchwithresult_filter=locationsto get POI IDs fromlocations.results[].id
2. Pass those IDs to this endpoint to get full business details
Quick Start (cURL)
Get POI Details
curl -s "https://api.search.brave.com/res/v1/local/pois" \
-H "Accept: application/json" \
-H "Accept-Encoding: gzip" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-G \
--data-urlencode "ids=loc4CQWMJWLD4VBEBZ62XQLJTGK6YCJEEJDNAAAAAAA="Multiple POIs with Location Headers
curl -s "https://api.search.brave.com/res/v1/local/pois" \
-H "Accept: application/json" \
-H "Accept-Encoding: gzip" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-H "X-Loc-Lat: 37.7749" \
-H "X-Loc-Long: -122.4194" \
-G \
--data-urlencode "ids=loc4CQWMJWLD4VBEBZ62XQLJTGK6YCJEEJDNAAAAAAA=" \
--data-urlencode "ids=loc4HTAVTJKP4RBEBZCEMBI3NG26YD4II4PATIHPDYI=" \
--data-urlencode "units=imperial"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 =.
Endpoint
GET https://api.search.brave.com/res/v1/local/poisAuthentication: X-Subscription-Token: <API_KEY> header
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
ids | string[] | Yes | — | POI IDs from web search results (1-20) |
search_lang | string | No | en | Language preference (2+ char language code) |
ui_lang | string | No | en-US | UI language (locale code, e.g., "en-US") |
units | string | No | null | metric (km) or imperial (miles) |
Location Headers (Optional)
For distance calculation from user location:
| Header | Type | Range | Description |
|---|---|---|---|
X-Loc-Lat | float | -90.0 to 90.0 | User latitude |
X-Loc-Long | float | -180.0 to 180.0 | User longitude |
Response Fields
The response has type: "local_pois" and a results array of LocationResult objects:
| Field | Type | Description |
|---|---|---|
title | string | Business/POI name |
url | string | Canonical URL for the location |
provider_url | string | Provider page URL |
type | string | Always "location_result" |
id | string | POI identifier (opaque string, valid ~8 hours) |
description | string? | Short description |
postal_address.type | string | Always "PostalAddress" |
postal_address.displayAddress | string | Formatted display address |
postal_address.streetAddress | string? | Street address |
postal_address.addressLocality | string? | City |
postal_address.addressRegion | string? | State/region |
postal_address.postalCode | string? | Postal/ZIP code |
postal_address.country | string? | Country code |
contact.telephone | string? | Phone number |
contact.email | string? | Email address |
rating.ratingValue | float? | Average rating (≥0) |
rating.bestRating | float? | Max possible rating |
rating.reviewCount | int? | Number of reviews |
rating.profile.name | string? | Rating provider name |
rating.profile.url | string? | Rating provider URL |
opening_hours.current_day | object[]? | Today's hours (abbr_name, full_name, opens, closes) |
opening_hours.days | object[][]? | Hours for each day of the week (same structure) |
coordinates | [float, float]? | [latitude, longitude] tuple |
distance.value | float? | Distance from user location |
distance.units | string? | Distance unit (km or miles) |
categories | string[] | Business categories (default []) |
price_range | string? | Price indicator ($, $$, $$$, $$$$) |
serves_cuisine | string[]? | Cuisine types (restaurants) |
thumbnail.src | string? | Thumbnail image URL |
thumbnail.original | string? | Original image URL |
profiles | object[]? | External profiles (name, url, long_name, img) |
reviews.reviews_in_foreign_language | bool | Whether reviews in a foreign language are available |
pictures.results | object[]? | Photo thumbnails |
action | object? | Action to take — has type (string) and url (string) |
results | object[]? | Related web results (LocationWebResult with meta_url) |
timezone | string? | IANA timezone (e.g., America/Los_Angeles) |
timezone_offset | int? | UTC timezone offset |
Example Response
{
"type": "local_pois",
"results": [
{
"type": "location_result",
"title": "Park Mediterranean Grill",
"url": "https://yelp.com/biz/park-mediterranean-grill-sf",
"provider_url": "https://yelp.com/biz/park-mediterranean-grill-sf",
"id": "loc4CQWMJWLD4VBEBZ62XQLJTGK6YCJEEJDNAAAAAAA=",
"postal_address": {
"type": "PostalAddress",
"displayAddress": "123 Main St, San Francisco, CA 94102",
"streetAddress": "123 Main St",
"addressLocality": "San Francisco",
"addressRegion": "CA",
"postalCode": "94102",
"country": "US"
},
"contact": { "telephone": "+1 415-555-0123" },
"thumbnail": {
"src": "https://example.com/thumb.jpg",
"original": "https://example.com/original.jpg"
},
"rating": {
"ratingValue": 4.5,
"bestRating": 5.0,
"reviewCount": 234,
},
"opening_hours": {
"current_day": [
{ "abbr_name": "Mon", "full_name": "Monday", "opens": "07:00", "closes": "21:00" }
]
},
"coordinates": [37.7749, -122.4194],
"distance": { "value": 0.3, "units": "miles" },
"categories": ["Mediterranean", "Greek"],
"price_range": "$$",
"serves_cuisine": ["Mediterranean", "Greek"],
"timezone": "America/Los_Angeles"
}
]
}Getting POI IDs
POI IDs come from the Web Search API (web-search) with result_filter=locations:
# 1. Search for local businesses
curl -s "https://api.search.brave.com/res/v1/web/search?q=coffee+shops+near+me&result_filter=locations" \
-H "Accept: application/json" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-H "X-Loc-Lat: 37.7749" \
-H "X-Loc-Long: -122.4194"
# 2. Extract POI IDs from locations.results[].id
# 3. Use those IDs with this endpointUse Cases
- Local business lookup: Retrieve full details (hours, contact, address) for POIs surfaced in web search
- Restaurant discovery pipeline: Search for restaurants, fetch POI details, filter by cuisine/rating/price_range
- Business hours checker: Get opening_hours for a business to determine if currently open
- Location-aware application: Combine with location headers to get distance calculations for nearby POIs
Notes
- ID format: Opaque strings (use
--data-urlencodefor cURL) - Units:
metricorimperialfor distance measurement preference - Max IDs: Up to 20 IDs per request
Related skills
How it compares
Use local-pois after web-search locations discovery; use web-search alone when snippets suffice without hours or contact details.
FAQ
What is the two-step flow for local-pois?
local-pois requires POI IDs from a prior Brave web-search call with result_filter=locations; pass locations.results[].id values, then local-pois returns full business details.
How many POI IDs can local-pois request at once?
local-pois accepts a maximum of 20 POI IDs per request and returns ratings, hours, contact info, and other enriched local business fields from the Brave Search API.