Local Pois logo

Local Pois

Organization
brave
local-pois

USE FOR getting local business/POI details. Requires POI IDs from local-place-search, or from web-search with result_filter=locations. Returns full business information including ratings, hours, contact info. Max 20 IDs.

Overview

Publisherbrave
Repositorybrave-search-skills
Skill namelocal-pois
Stars
182
Forks
17
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by brave on GitHub. Read the source before you install it.

Installation

Install the Local Pois AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/brave/brave-search-skills/tree/main/skills/local-pois
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/brave/brave-search-skills.git /tmp/brave-search-skills
mkdir -p .claude/skills
cp -r /tmp/brave-search-skills/skills/local-pois .claude/skills/local-pois
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Local Pois in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Local Pois on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Local Pois is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

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 search.

  1. Get POI IDs from local-place-search, or from web-search with result_filter=locations (locations.results[].id)
  2. Pass those IDs to this endpoint to get full business details

Quick Start (cURL)

Get POI Details

bash
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

bash
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

http
GET https://api.search.brave.com/res/v1/local/pois

Authentication: X-Subscription-Token: <API_KEY> header

Parameters

ParameterTypeRequiredDefaultDescription
idsstring[]Yes—POI IDs from web search results (1-20)
search_langstringNoenLanguage preference (2+ char language code)
ui_langstringNoen-USUI language (locale code, e.g., "en-US")
unitsstringNonullmetric (km) or imperial (miles)

Location Headers (Optional)

For distance calculation from user location:

HeaderTypeRangeDescription
X-Loc-Latfloat-90.0 to 90.0User latitude
X-Loc-Longfloat-180.0 to 180.0User longitude

Response Fields

The response has type: "local_pois" and a results array of LocationResult objects:

FieldTypeDescription
titlestringBusiness/POI name
urlstringCanonical URL for the location
provider_urlstringProvider page URL
typestringAlways "location_result"
idstringPOI identifier (opaque string, valid ~8 hours)
descriptionstring?Short description
postal_address.typestringAlways "PostalAddress"
postal_address.displayAddressstringFormatted display address
postal_address.streetAddressstring?Street address
postal_address.addressLocalitystring?City
postal_address.addressRegionstring?State/region
postal_address.postalCodestring?Postal/ZIP code
postal_address.countrystring?Country code
contact.telephonestring?Phone number
contact.emailstring?Email address
rating.ratingValuefloat?Average rating (≥0)
rating.bestRatingfloat?Max possible rating
rating.reviewCountint?Number of reviews
rating.profile.namestring?Rating provider name
rating.profile.urlstring?Rating provider URL
opening_hours.current_dayobject[]?Today's hours (abbr_name, full_name, opens, closes)
opening_hours.daysobject[][]?Hours for each day of the week (same structure)
coordinates[float, float]?[latitude, longitude] tuple
distance.valuefloat?Distance from user location
distance.unitsstring?Distance unit (km or miles)
categoriesstring[]Business categories (default [])
price_rangestring?Price indicator ($, $$, $$$, $$$$)
serves_cuisinestring[]?Cuisine types (restaurants)
thumbnail.srcstring?Thumbnail image URL
thumbnail.originalstring?Original image URL
profilesobject[]?External profiles (name, url, long_name, img)
reviews.reviews_in_foreign_languageboolWhether reviews in a foreign language are available
pictures.resultsobject[]?Photo thumbnails
actionobject?Action to take — has type (string) and url (string)
resultsobject[]?Related web results (LocationWebResult with meta_url)
timezonestring?IANA timezone (e.g., America/Los_Angeles)
timezone_offsetint?UTC timezone offset

Example Response

json
{
  "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

local-place-search returns POI IDs directly. They also come from the Web Search API (web-search) with result_filter=locations:

bash
# 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 endpoint

Use 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-urlencode for cURL)
  • Units: metric or imperial for distance measurement preference
  • Max IDs: Up to 20 IDs per request

Frequently asked questions

What does the Local Pois AI skill do?

USE FOR getting local business/POI details. Requires POI IDs from local-place-search, or from web-search with result_filter=locations. Returns full business information including ratings, hours, contact info. Max 20 IDs.

Why use Local Pois on TypingMind?

Because you install it once and use it with any model. Local Pois is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Local Pois in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/brave/brave-search-skills/tree/main/skills/local-pois. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Local Pois?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Local Pois?

As many as you like. As long as a model supports skills, you can use Local Pois with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Local Pois AI skill free?

Yes. It is published on GitHub by brave under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇