Search
POST /v1/search is the discovery endpoint. Use it to find stays matching any
combination of location, dates, prices, capacities, and host attributes.
A second endpoint, POST /v1/search/with-details, runs the same search and
immediately fans out a detail lookup on every result — see below.
Request body
type SearchRequest = { // Location — exactly one of these two is required location?: string; // free-text query, e.g. "Lisbon, Portugal" locationQueries?: string[]; // multi-city in one call
// Optional: pin to an Airbnb search-results URL instead of free-text searchUrls?: string[]; // airbnb.com/s/... URLs (NOT /rooms URLs)
// Dates — both optional; defaults explained below checkIn?: string; // ISO date (YYYY-MM-DD) checkOut?: string; // ISO date
// Capacity adults?: number; children?: number; infants?: number; pets?: number; // count of pets, not boolean
// Price + room filters priceMin?: number; priceMax?: number; minBeds?: number; minBedrooms?: number; minBathrooms?: number;
// Locale currency?: string; // ISO code, default "USD" locale?: string; // e.g. "en", "pt"
// Paging maxItems?: number; // ≤240 sync, larger goes async nextPageToken?: string; // from a prior response's meta.next_page_token fields?: string; // projection, e.g. "id,title,pricing.price"};Example — text query
curl -X POST https://api.stayingapi.com/v1/search \ -H "Authorization: Bearer sk_live_..." \ -H "content-type: application/json" \ -d '{ "location": "Lisbon, Portugal", "checkIn": "2026-07-01", "checkOut": "2026-07-06", "minBeds": 2, "priceMax": 250, "maxItems": 25 }'Example — multi-city
curl -X POST https://api.stayingapi.com/v1/search \ -H "Authorization: Bearer sk_live_..." \ -d '{ "locationQueries": ["Lisbon, Portugal", "Porto, Portugal"], "maxItems": 50 }'Response shape
{ "data": [ /* Array<Stay> */ ], "meta": { "count": 50, "limit": 50, "has_more": true, "next_page_token": "eyJ..." }, "request_id": "req_..."}To fetch the next page, resend the same body with nextPageToken set to the
value from meta.next_page_token.
Dates
checkIn and checkOut are optional. If you omit them we run the search
against a 2-night window starting 14 days from today so you still get
useful results. Pass both fields when you need pricing and availability for a
specific date range — the response’s pricing.breakdown is then computed for
those exact dates.
POST /v1/search/with-details
Same request body as /v1/search. Instead of the lightweight discovery rows,
each result is enriched with a full /v1/stays/{id} lookup (reviews,
availability, description, amenities). One search credit + one detail credit
per row.
curl -X POST https://api.stayingapi.com/v1/search/with-details \ -H "Authorization: Bearer sk_live_..." \ -d '{ "location": "Lisbon, Portugal", "maxItems": 10 }'Notes on completeness
/v1/search results carry every field the discovery surface exposes — title,
photos, host, rating, pricing. Some fields (full reviews, availability
calendar, full description, complete amenities) require a follow-up
/v1/stays/{id} lookup or use /v1/search/with-details. See the
search-then-detail recipe.
Hard caps
maxItems is clamped to 250 server-side. For larger result sets, walk pages
via nextPageToken (see Pagination).