Marriott Bonvoy Search API
Search for Marriott Bonvoy hotels by geographic coordinates with real-time availability and pricing.
Copy for your AI agent
Paste into Claude, ChatGPT, Cursor or Copilot — endpoint, parameters, response fields and a curl example in Markdown.
Overview
Coordinate-Based Search
This endpoint searches by latitude and longitude, making it ideal for map-based applications and proximity searches.
The Marriott Bonvoy Search endpoint returns hotels near a geographic location with real-time pricing, brand information, ratings, and distance from the search center. Supports pagination, sorting, and currency selection.
Endpoint URL
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| latitude | float | Required | Latitude of search center (-90 to 90) |
| longitude | float | Required | Longitude of search center (-180 to 180) |
| check_in | string | Required | Check-in date in YYYY-MM-DD format |
| check_out | string | Required | Check-out date in YYYY-MM-DD format |
| adults | integer | Optional | Number of adults (1-10). Default: 2 |
| rooms | integer | Optional | Number of rooms (1-8). Default: 1 |
| currency | string | Optional | Currency code (e.g., USD, EUR, GBP). Default: USD |
| offset | integer | Optional | Pagination offset. Default: 0. For the next page, use page_info.next_offset from the previous response. |
| limit | integer | Optional | Results per page (max 20). Default: 20 |
| sort_by | string | Optional | Sort field (DISTANCE or PRICE). Default: DISTANCE |
| corporate_code | string | Optional | Corporate or promotional rate code (e.g., MMP, AAA). Marriott silently ignores invalid codes. See Corporate rates. |
| corporate_only | boolean | Optional |
Return only hotels that have a rate under corporate_code, priced at that rate. Requires corporate_code. Default: false
|
Finding Coordinates
Use Google Maps or a geocoding service to get latitude and longitude for your target location. For example, Bangkok is approximately 13.7563, 100.5018.
Corporate Rates
corporate_codealone: hotels with a rate under the code are priced at that rate, but hotels without one still appear at their regular lowest price. The response does not say which hotels the code applied to.corporate_codewithcorporate_only=true: only hotels with a rate under the code are returned, andpriceis that rate. Hotels without a rate under the code are left out. The response shape is unchanged.corporate_only=truewithoutcorporate_codereturns 400INVALID_PARAMETERS.- When a code covers several rate plans,
priceis the lowest of them and the response does not say which plan it came from. See Codes that cover several rate plans.
Flexible dates
To find the cheapest dates rather than the cheapest hotel for fixed dates, collect property_id values here and request a Price Calendar for each one with the same corporate_code.
See the flexible dates recipe on the Price Calendar page.
Response Format
The response includes a list of Marriott hotels with pricing, brand details, ratings, and distance from the search coordinates.
Response Structure
- success: Boolean indicating request success
- hotels: Array of hotel objects
- total: Total number of matching hotels
- page_info: Pagination metadata (has_next_page, has_previous_page, next_offset, current_offset)
Pagination
- has_next_page (boolean): Whether another page is available
- has_previous_page (boolean): Whether a previous page is available
- next_offset (integer or null): Offset for the next request; null on the last page
- current_offset (integer): Offset of the current page
Start with offset=0 and a limit of up to 20. While page_info.has_next_page is true, pass page_info.next_offset as the next request's offset, keeping the other search parameters unchanged. Stop when has_next_page is false. The offset and limit fields are request parameters.
Hotel Object Fields
| Field | Type | Description |
|---|---|---|
| property_id | string | Marriott property code (e.g., "BKKDT", "LAXJW") |
| name | string | Hotel name |
| brand | object | Brand details (id, name) e.g., "JW Marriott", "The Ritz-Carlton" |
| location | object | GPS coordinates (latitude, longitude) |
| description | string | Hotel description |
| rating | float | Guest rating score |
| review_count | integer | Total number of reviews |
| image | string | Primary hotel image URL |
| url | string | Marriott.com hotel page URL |
| bookable | boolean | Whether the property has available rooms |
| price | object | Pricing details (per_night, total, taxes, fees, currency, points_per_night) |
| distance_meters | float | Distance from search center in meters |
Error Responses
The API returns standard HTTP error codes with detailed error messages following the RFC 7807 Problem Details format.
400 Bad Request
Invalid request parameters (e.g., invalid dates, out-of-range coordinates, or corporate_only without corporate_code)
{
"type": "https://api.stayapi.com/errors/invalid-dates",
"title": "Invalid Dates",
"status": 400,
"detail": "Check-out date must be after check-in date"
}
502 Bad Gateway
Upstream service error from Marriott
{
"type": "https://api.stayapi.com/errors/upstream-error",
"title": "Upstream Error",
"status": 502,
"detail": "The upstream service could not complete the request."
}
Usage Tips
Best Practices
- Use precise coordinates for best results (e.g., city center or airport location)
- Dates must be in YYYY-MM-DD format and check-in cannot be in the past
- Use
offsetandlimitfor pagination through large result sets - The
property_idfield can be used with the Rooms endpoint to get detailed rates - Sort by PRICE to find the cheapest options first
- Pass a
property_idto the Price Calendar endpoint to compare the lowest rate across up to 36 check-in dates - The
distance_metersfield helps rank results by proximity
Rate Limiting
This endpoint is subject to your plan's rate limits. Each search counts as one API call regardless of the number of results returned.
Related Endpoints
Marriott Bonvoy Rooms
Get room types and rates for a specific Marriott property
View Documentation →Marriott Bonvoy Price Calendar
Lowest rate per check-in date for one property, including corporate and points calendars
View Documentation →