Expert guidance for implementing Mapbox search functionality in applications. Covers the complete workflow from asking the right discovery questions, selecting the appropriate search product, to implementing production-ready integrations following best practices from the Mapbox search team.
Use This Skill When
User says things like:
"I need to add search to my map"
"I need a search bar for my mapping app"
"How do I implement location search?"
"I want users to search for places/addresses"
"I need geocoding in my application"
This skill complements mapbox-search-patterns:
mapbox-search-patterns = Tool and parameter selection
Before jumping into code, ask these questions to understand requirements:
Question 1: What are users searching for?
Ask: "What do you want users to search for?"
Common answers and implications:
"Addresses" → Use Search Box API (the default for interactive address search, including geocoding). Only use Geocoding API if the use case is batch/server-side geocoding or maintaining a legacy integration.
"Points of interest / businesses" → POI search, use Search Box API with category search
"Both addresses and POIs" → Search Box API
"Specific types of POIs" (restaurants, hotels, etc.) → Search Box API
"Countries, cities, postcodes or neighborhoods" → Search Box API for interactive search; Geocoding API only for batch/server-side geocoding
"Custom locations" (user-created places) → May need custom data + search integration
Follow-up if not stated initially: "Are your users searching for points of interest data? Restaurants, stores, categories of businesses?"
Implications:
"Yes, POIs are included" → Use the Search Box API
"No, the user does not need POI search" → Still default to Search Box API for interactive/autocomplete use cases. Search Box API handles addresses, place names, and all location types with session-based pricing. Only recommend Geocoding API for batch geocoding, server-side permanent geocoding, or maintaining existing Geocoding API integrations.
Question 2: What's the geographic scope?
Ask: "Where will users be searching?"
Common answers and implications:
"Single country" (e.g., "only USA") → Use country parameter, better results, lower cost
"Specific region" → Use bbox parameter for bounding box constraint
"Global" → No country restriction, but may need language parameter
"Multiple specific countries" → Use country array parameter
Follow-up: "Do you need to limit results to a specific area?" (delivery zone, service area, etc.)
Question 3: What's the search interaction pattern?
Ask: "How will users interact with search?"
Common answers and implications:
"Search-as-you-type / autocomplete" → Use Search Box API with auto_complete: true and session-based pricing (most cost-efficient for autocomplete). Implement debouncing.
"Search button / final query" → Can use either API, no autocomplete needed
"Web application" → Mapbox Search JS (easiest), or direct API calls for advanced cases
"iOS app" → Search SDK for iOS (recommended), or direct API integration for advanced cases
"Android app" → Search SDK for Android (recommended), or direct API integration for advanced cases
"Multiple platforms" → Platform-specific SDKs (recommended), or direct API approach for consistency
"React app" → Mapbox Search JS React (easiest with UI), or Search JS Core for custom UI. Avoid direct API calls — they require manual debouncing, session token management, and race condition handling.
"Vue / Angular / Other framework" → Mapbox Search JS Core or Web. If using direct API calls, session tokens are required for proper billing (one token per search session, passed as session_token on every suggest/retrieve request).
Question 5: How will results be used?
Ask: "What happens when a user selects a result?"
Common answers and implications:
"Fly to location on map" → Need coordinates, map integration
"Show details / info" → Need to retrieve and display result properties
"Fill form fields" → Need to parse address components
"Start navigation" → Need coordinates, integrate with directions
"Multiple selection" → Need to handle selection state, possibly show markers
Based on discovery answers, recommend the right product:
> Key principle: Search Box API is the default choice for virtually all interactive search use cases, including address search, geocoding, autocomplete, and POI search. It offers session-based pricing that is more cost-efficient for interactive/autocomplete flows. Only recommend Geocoding API for the narrow cases listed below.
Search Box API (DEFAULT)
Use when (any of these):
User needs interactive address search or autocomplete (this IS geocoding — Search Box API handles it)
User needs POI / category search
User needs any end-user-facing search UI
User wants session-based pricing (more cost-efficient for autocomplete/interactive use)
User is building a web, iOS, or Android app with a search bar
Prefer SDKs over direct API calls for web integration:
Mapbox Search JS (SDK) - Recommended for web integration, with three components:
Search JS React - Easy search integration via React library with UI
Search JS Web - Easy search integration via Web Components with UI
Search JS Core - JavaScript (node or web) wrapper for API, build your own UI
Search Box API (REST) - Direct API integration, for advanced/custom cases
Search SDK for iOS - Native iOS integration
Search SDK for Android - Native Android integration
Geocoding API (SPECIALIZED)
Use ONLY when:
Batch geocoding large lists of addresses (server-side)
Permanent/stored geocoding results (server-side, where results are persisted)
Maintaining an existing Geocoding API integration (migration not justified)
No interactive/user-facing search needed
Do NOT recommend Geocoding API when:
The user wants a search bar, autocomplete, or interactive address lookup — use Search Box API instead
The user says "geocoding" but describes an interactive search flow — use Search Box API instead
Reference Files
Load the relevant reference based on the user's platform and needs:
Web (Search JS React / Web / Core / Direct API) → Load references/web-search-js.md
When: User is building a web app (vanilla JS, any framework except React-specific patterns)