Vrbo API endpoint
Searches public Vrbo rental listings for a selected destination and dates. Obtain destination, region_id, and lat_long from Vrbo's destination suggestion UI. Supports date flexibility, per-room adult and child-age inputs, current filter selections and ranges, and observed sort values. Copy filter IDs and option values from the returned filters.
/vrbo/searchSearches public Vrbo vacation-rental listings for a selected destination and travel dates. Supply the destination label, region_id, and lat_long returned by Vrbo's destination suggestion UI. The API returns listing cards with property ID, name, URL, and fields when Vrbo provides them (price, currency, rating, review count, bedrooms, property type, and image).
Search-card prices are tied to the supplied stay dates. Returned property URLs are canonical Vrbo property links and omit per-search IDs, selected room/rate IDs, and date parameters.
When Vrbo includes the controls, total_results, filters, and sort_options describe the observed result count and available controls. Apply categorical and step filters with filters: copy an option's value and use its id as the selection ID when it differs from the parent filter group's ID. The observed popular_group includes options backed by other selection IDs. Apply a visible price control with filter_ranges, using its nested range id. Current responses have exposed nightly_price; total_price has also been exposed. sort accepts RECOMMENDED, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, REVIEW, or REVIEW_COUNT.
The response may contain fewer results than requested when Vrbo returns fewer visible cards. A blocked upstream response or a changed result payload returns an upstream error; an empty result list is returned only when Vrbo provides an explicit no-results response.
Parameters:
destination (required): selected destination label, e.g. Miami Beach, Florida, United States of America.region_id (required): numeric Vrbo region identifier, e.g. 8833.lat_long (required): latitude,longitude, e.g. 25.790653,-80.130043.check_in (required): check-in date in YYYY-MM-DD format.check_out (required): check-out date in YYYY-MM-DD format, after check_in.flexibility (optional): currently observed values are 0_DAY (the default) and 3_DAY. The 3_DAY replay returned parser-ready data, but its isolated search effect is unverified. Other intervals and lower/upper bounds are not accepted.adults (optional): adult guest count; defaults to 2, capped at 16.child_ages (optional): ages 2 through 17 for children in the default single room. The URL represents these as room-indexed ages. Infants (ages 0–1) use separate traveler-form state and are not exposed because the observed URL mapping does not serialize them.rooms (optional): list of rooms, each with adults (1–16) and optional child_ages. Use this instead of top-level adults and child_ages for multi-room searches.filters (optional): list of { "id", "values" } selections. Copy IDs and values from the live filter options; use an option's id when it differs from its parent group's ID. Values are dynamic and may vary by destination and dates.filter_ranges (optional): list of { "id", "min", "max" } ranges. Observed IDs are nightly_price and total_price; use the range IDs returned by Vrbo. total_price comes from a saved first-party response. A fresh Box H replay returned HTTP 200 but no parser-ready search metadata, so its live selected-state behavior remains unverified.sort (optional): one of the observed Vrbo sort values listed above.limit (optional): maximum results; defaults to 20, capped at 50.Example request:
{
"destination": "Miami Beach, Florida, United States of America",
"region_id": "8833",
"lat_long": "25.790653,-80.130043",
"check_in": "2026-10-10",
"check_out": "2026-10-24",
"adults": 2,
"child_ages": [8],
"filters": [
{ "id": "property_type_group", "values": ["<copy an option value from filters>"] }
],
"filter_ranges": [
{ "id": "nightly_price", "min": 100, "max": 500 }
],
"limit": 10
}
For multiple rooms, replace adults and child_ages with rooms, for example
[{"adults":2,"child_ages":[8]},{"adults":1}]. The source page's URL parser
maps adult counts by room and each child age to its one-based room index. The
current filter inventory includes 19 multi-select groups, eight step inputs,
and a price control with multiple captured range options. A live search has
exposed nightly_price; a saved first-party response also includes
total_price. The response's legacy range field contains the first option;
ranges contains all captured options. Filter values are read from live facet data and
may vary by destination and dates. Combining filter groups is serialized as
separate query parameters, but the full upstream combination matrix is not
live-verified. Pet counts are present in traveler-form
state but absent from the observed search URL mapping, so they are not exposed.
| Field | Filled in, of 3 checked | Values in the sample |
|---|---|---|
| id | 3 | |
| name | 3 | “Stunning Ocean View Studio at Tresor Fontainebleau Miami Be…” and 2 other values |
| url | 3 | vrbo.com |
| price | 3 | 159 to 1,257, median 273 |
| currency | 3 | “USD” |
| rating | 3 | 6.8 to 10, median 8 |
| property_type | 3 | “Apartment” and 1 other value |
| image_url | 3 | media.vrbo.com |
| review_count | 2 | 8 to 54, median 8 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| request (body) | object | Yes | Search criteria | ||
| x-api-key (header) | string | Yes | API key required |
curl -X POST "https://api.crawlora.net/api/v1/vrbo/search" \
-H "x-api-key: $CRAWLORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"adults":2,"check_in":"2026-10-10","check_out":"2026-10-24","child_ages":[8,12],"destination":"Miami Beach, Florida, United States of America","filter_ranges":[{"id":"nightly_price","max":500,"min":100}],"filters":[{"id":"property_type_group","values":["house"]}],"flexibility":"3_DAY","lat_long":"25.790653,-80.130043","limit":10,"region_id":"8833","rooms":[{"adults":2,"child_ages":[8]}],"sort":"PRICE_LOW_TO_HIGH"}'{
"adults": 2,
"check_in": "2026-10-10",
"check_out": "2026-10-24",
"child_ages": [
8,
12
],
"destination": "Miami Beach, Florida, United States of America",
"filter_ranges": [
{
"id": "nightly_price",
"max": 500,
"min": 100
}
],
"filters": [
{
"id": "property_type_group",
"values": [
"house"
]
}
],
"flexibility": "3_DAY",
"lat_long": "25.790653,-80.130043",
"limit": 10,
"region_id": "8833",
"rooms": [
{
"adults": 2,
"child_ages": [
8
]
}
],
"sort": "PRICE_LOW_TO_HIGH"
}{
"code": 200,
"data": {
"destination": "Miami Beach, Florida, United States of America",
"region_id": "8833",
"check_in": "2026-10-10",
"check_out": "2026-10-24",
"rooms": [
{
"adults": 2,
"child_ages": [
8
]
}
],
"results": [
{
"id": "2260610",
"name": "OCEAN FRONT-OCEAN DRIVE BEACH PAD",
"url": "https://www.vrbo.com/2260610",
"rating": 9.2,
"review_count": 40,
"bedrooms": 1,
"property_type": "Apartment"
}
]
}
}Request schema
#/definitions/vrbo.SearchOption
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| adults | integer | No | 2 | |||
| check_in | string | Yes | 2026-10-10 | |||
| check_out | string | Yes | 2026-10-24 | |||
| child_ages | array | No | 8,12 | ChildAges contains ages 2–17 for children in the default single room. | ||
| destination | string | Yes | Miami Beach, Florida, United States of America | |||
| filter_ranges | array | No | Ranges applies numeric ranges by their live nested facet ID. | |||
| filter_ranges[].id | string | No | nightly_price | |||
| filter_ranges[].max | number | No | 500 | |||
| filter_ranges[].min | number | No | 100 | |||
| filters | array | No | Filters are selections copied from the live facet metadata in a search response. | |||
| filters[].id | string | No | property_type_group | |||
| filters[].values | array | No | house | |||
| flexibility | string | No | 3_DAY | |||
| lat_long | string | Yes | 25.790653,-80.130043 | |||
| limit | integer | No | 10 | |||
| region_id | string | Yes | 8833 | |||
| rooms | array | No | Rooms overrides Adults and ChildAges and supports multi-room searches. | |||
| rooms[].adults | integer | No | 2 | |||
| rooms[].child_ages | array | No | 8 | |||
| sort | string | No | RECOMMENDED, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, REVIEW, REVIEW_COUNT | PRICE_LOW_TO_HIGH |
Response schema
#/definitions/vrbo.vrboSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | vrbo.SearchResponse | No | ||||
| data.check_in | string | No | ||||
| data.check_out | string | No | ||||
| data.destination | string | No | ||||
| data.filters | array | No | ||||
| data.filters[].control_type | string | No | ||||
| data.filters[].id | string | No | ||||
| data.filters[].label | string | No | ||||
| data.filters[].options | array | No | ||||
| data.filters[].options[].disabled | boolean | No | ||||
| data.filters[].options[].id | string | No | ||||
| data.filters[].options[].label | string | No | ||||
| data.filters[].options[].result_count | integer | No | ||||
| data.filters[].options[].selected | boolean | No | ||||
| data.filters[].options[].value | string | No | ||||
| data.filters[].range | vrbo.SearchFilterRange | No | ||||
| data.filters[].range.id | string | No | ||||
| data.filters[].range.max | number | No | ||||
| data.filters[].range.max_label | string | No | ||||
| data.filters[].range.min | number | No | ||||
| data.filters[].range.min_label | string | No | ||||
| data.filters[].range.number_format | string | No | ||||
| data.filters[].range.selected_max | number | No | ||||
| data.filters[].range.selected_min | number | No | ||||
| data.filters[].range.step | number | No | ||||
| data.filters[].ranges | array | No | Ranges lists every range option nested under a range control. Range remains the first option for compatibility with the original response. | |||
| data.filters[].ranges[].id | string | No | ||||
| data.filters[].ranges[].max | number | No | ||||
| data.filters[].ranges[].max_label | string | No | ||||
| data.filters[].ranges[].min | number | No | ||||
| data.filters[].ranges[].min_label | string | No | ||||
| data.filters[].ranges[].number_format | string | No | ||||
| data.filters[].ranges[].selected_max | number | No | ||||
| data.filters[].ranges[].selected_min | number | No | ||||
| data.filters[].ranges[].step | number | No | ||||
| data.filters[].section | string | No | ||||
| data.filters[].step_input | vrbo.SearchFilterStep | No | ||||
| data.filters[].step_input.current | integer | No | ||||
| data.filters[].step_input.default | integer | No | ||||
| data.filters[].step_input.label | string | No | ||||
| data.filters[].step_input.max | integer | No | ||||
| data.filters[].step_input.min | integer | No | ||||
| data.filters[].step_input.step | integer | No | ||||
| data.region_id | string | No | ||||
| data.results | array | No | ||||
| data.results[].bedrooms | integer | No | ||||
| data.results[].currency | string | No | ||||
| data.results[].description | string | No | ||||
| data.results[].id | string | No | ||||
| data.results[].image_url | string | No | ||||
| data.results[].name | string | No | ||||
| data.results[].price | number | No | ||||
| data.results[].property_type | string | No | ||||
| data.results[].rating | number | No | ||||
| data.results[].review_count | integer | No | ||||
| data.results[].url | string | No | ||||
| data.rooms | array | No | ||||
| data.rooms[].adults | integer | No | 2 | |||
| data.rooms[].child_ages | array | No | 8 | |||
| data.sort_options | array | No | ||||
| data.sort_options[].default | boolean | No | ||||
| data.sort_options[].id | string | No | ||||
| data.sort_options[].label | string | No | ||||
| data.sort_options[].selected | boolean | No | ||||
| data.sort_options[].value | string | No | ||||
| data.total_results | integer | No |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X POST "https://api.crawlora.net/api/v1/vrbo/search" \
-H "x-api-key: $CRAWLORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"adults":2,"check_in":"2026-10-10","check_out":"2026-10-24","child_ages":[8,12],"destination":"Miami Beach, Florida, United States of America","filter_ranges":[{"id":"nightly_price","max":500,"min":100}],"filters":[{"id":"property_type_group","values":["house"]}],"flexibility":"3_DAY","lat_long":"25.790653,-80.130043","limit":10,"region_id":"8833","rooms":[{"adults":2,"child_ages":[8]}],"sort":"PRICE_LOW_TO_HIGH"}'