crewai-stayingapi
StayingAPI: the accommodation data API for AI agents. CrewAI tools edition. Also available as an n8n community node and a native MCP server.
This package gives CrewAI agents six tools over StayingAPI, so a crew can work with real accommodation data instead of guessing: live search, day by day availability, real prices, cross platform price comparison and normalized reviews across Airbnb, Booking.com, Vrbo and Google Hotels, all in one unified schema.
| Tool | What it does | Credits |
|---|---|---|
search_stays |
Find listings across platforms by place, dates and occupancy | from 5 per platform (Airbnb 2 per result, Booking.com and Vrbo 1 per result, Google Hotels 15 per page) |
check_availability |
Day by day availability for a known listing | from 5 per listing, scales with the date range (Vrbo from 12) |
get_listing |
Full normalized detail for one listing | 3 per call (Vrbo 15) |
get_price |
Real price quote for one listing and one stay | 3 per call |
compare_prices |
Cross platform comparison for the same property | 30 in name and location mode, or 3 per listing in direct mode |
get_reviews |
Normalized guest reviews for a known listing | from 5 per platform (Airbnb 5 per review, Booking.com and Vrbo 1 per review) |
Installation
pip install crewai-stayingapi
Credentials
You need a StayingAPI key. Live keys start with stay_live_, sandbox keys start with stay_test_.
- Create an account at stayingapi.com/signup: 300 free credits to start, no card required. Full plan details on the pricing page.
- Create a key on the keys page of your dashboard.
- Export it:
export STAYINGAPI_API_KEY="stay_live_..."
Sandbox first
A stay_test_ sandbox key returns deterministic sample data on the exact same schema, synchronously, and costs 0 credits. Build and test your crew against a sandbox key, then swap in a live key with no code changes.
Usage
from crewai import Agent
from crewai_stayingapi import (
StayingAPISearchTool,
StayingAPIAvailabilityTool,
StayingAPIListingTool,
StayingAPIPriceTool,
StayingAPIPriceCompareTool,
StayingAPIReviewsTool,
)
travel_researcher = Agent(
role="Travel researcher",
goal="Find good places to stay and the cheapest way to book them",
backstory="Researches real accommodation options across booking platforms.",
tools=[
StayingAPISearchTool(),
StayingAPIAvailabilityTool(),
StayingAPIListingTool(),
StayingAPIPriceTool(),
StayingAPIPriceCompareTool(),
StayingAPIReviewsTool(),
],
)
The usual flow is: search_stays to discover properties and collect their platformListingId values, then get_listing, check_availability, get_price or get_reviews on the ones that matter, and compare_prices when the crew has settled on a property and wants the best offer for it.
# Discover: a city and a set of dates, no ids needed
StayingAPISearchTool().run(
location="Split, HR",
check_in="2026-09-10",
check_out="2026-09-14",
platforms="airbnb,booking",
adults=2,
limit=5,
)
# Compare: one property, every booking site that sells it
StayingAPIPriceCompareTool().run(
name="Hotel Esplanade Zagreb",
location="Zagreb, Croatia",
check_in="2026-09-10",
check_out="2026-09-14",
)
Tool reference
search_stays (StayingAPISearchTool)
| Argument | Type | Default | Description |
|---|---|---|---|
location |
str | required | City, region or address, for example "Split, HR" |
check_in |
str | none | Check in date, YYYY-MM-DD |
check_out |
str | none | Check out date, YYYY-MM-DD |
platforms |
str | all enabled | Comma separated: airbnb, booking, vrbo, google |
adults |
int | 2 |
Number of adults, 1 to 30 |
children |
int | 0 |
Number of children; requires child_ages |
child_ages |
str | none | One age per child, for example "4,9" |
rooms |
int | 1 |
Number of rooms |
currency |
str | "USD" |
ISO 4217 code |
limit |
int | 10 |
Results per platform, 1 to 40 |
cursor |
str | none | Cursor from meta.pagination.nextCursor |
sort |
str | none | recommended, price_asc, price_desc, rating_desc |
limit applies per platform, so three platforms with limit=5 can return 15 results and bills each platform separately.
check_availability (StayingAPIAvailabilityTool)
| Argument | Type | Default | Description |
|---|---|---|---|
platform |
str | required | airbnb, booking, vrbo or google |
start_date |
str | required | First date of the window, YYYY-MM-DD |
end_date |
str | required | Last date of the window, YYYY-MM-DD |
listing_id |
str | one of three | Platform listing id |
listing_ids |
str | one of three | Comma separated ids on the same platform |
url |
str | one of three | Full listing URL |
only_available |
bool | none | Return only the available dates |
Pass exactly one of listing_id, listing_ids or url.
get_listing (StayingAPIListingTool)
| Argument | Type | Default | Description |
|---|---|---|---|
platform |
str | required | airbnb, booking or vrbo |
listing_id |
str | required | Platform listing id, or a full listing URL |
country |
str | none | Two letter code, needed for a bare Booking.com slug |
check_in |
str | none | Add dates to get a live price with the detail |
check_out |
str | none | Check out date, YYYY-MM-DD |
currency |
str | "USD" |
ISO 4217 code |
get_price (StayingAPIPriceTool)
| Argument | Type | Default | Description |
|---|---|---|---|
platform |
str | required | airbnb, booking, vrbo or google |
listing_id |
str | required | Platform listing id |
check_in |
str | required | Check in date, YYYY-MM-DD |
check_out |
str | required | Check out date, YYYY-MM-DD |
currency |
str | "USD" |
ISO 4217 code |
Booking.com slugs are not globally unique, so outside get_listing (which has its own country argument) pass the country qualified id, for example "hr/esplanade-zagreb", or the full listing URL. A bare slug returns needs_country and costs nothing.
compare_prices (StayingAPIPriceCompareTool)
| Argument | Type | Default | Description |
|---|---|---|---|
check_in |
str | required | Check in date, YYYY-MM-DD |
check_out |
str | required | Check out date, YYYY-MM-DD |
name |
str | one mode | Property name, when you have no listing ids |
location |
str | one mode | Location hint for that name |
google_hotel_id |
str | one mode | Google hotel id, instead of name and location |
listings |
str | one mode | 2 to 6 platform:listingId pairs for the same property |
adults |
int | 2 |
Number of adults |
children |
int | 0 |
Number of children |
currency |
str | "USD" |
ISO 4217 code |
Two modes, one response shape. Pass name with location (or google_hotel_id) when you have no ids: the property is resolved for you and every offer it surfaces is returned, for 30 credits. Pass listings when you already have ids from search_stays: each listing is priced for real and the comparison is normalized, billed as 3 credits per listing.
Fee coverage differs per platform. Airbnb reports cleaning, service and taxes, Booking.com reports taxes, Vrbo and Google Hotels report none. Compare on totalPrice, which is present everywhere. A null fee means it could not be read, not that the platform does not charge it. min and median only summarize offers quoted in the requested currency.
get_reviews (StayingAPIReviewsTool)
| Argument | Type | Default | Description |
|---|---|---|---|
platform |
str | required | airbnb, booking or vrbo |
listing_id |
str | one of two | Platform listing id |
url |
str | one of two | Full listing URL |
limit |
int | 20 |
Reviews to return, 1 to 100 |
cursor |
str | none | Cursor from meta.pagination.nextCursor |
language |
str | none | Two letter language filter, for example "en" |
sort |
str | none | recent, rating_desc, rating_asc |
Ratings keep the native scale of each platform, so read ratingScale before comparing numbers across platforms.
Platform coverage
| Operation | Airbnb | Booking.com | Vrbo | Google Hotels |
|---|---|---|---|---|
search_stays |
yes | yes | yes | yes |
check_availability |
yes | yes | yes | yes |
get_listing |
yes | yes | yes | no |
get_price |
yes | yes | yes | yes |
compare_prices |
yes | yes | yes | yes |
get_reviews |
yes | yes | yes | no |
Asking for a platform that does not serve an operation returns the error code platform_not_enabled and costs nothing.
Response envelope
Every tool returns a stable JSON string and never raises:
{
"success": true,
"data": [{"id": "stays_airbnb_42307961", "platform": "airbnb", "name": "..."}],
"meta": {"creditsCharged": 5, "platforms": ["airbnb"], "cached": false, "partial": false}
}
{
"success": false,
"error": {
"code": "credit_balance_too_low",
"message": "Not enough credits for this request.",
"fix": "The account is out of credits. Top up or upgrade at https://stayingapi.com/pricing. Nothing was charged for this call.",
"creditsCharged": 0
}
}
meta.creditsCharged is the real cost of that request and meta.platformResults[].creditsCharged breaks it down per platform, so a crew can measure its own spend. Every error carries a fix field with the next step.
Error codes
missing_api_key, invalid_api_key, revoked_api_key, email_unverified, subscription_required, credit_balance_too_low, rate_limit_exceeded, missing_parameter, invalid_parameter, invalid_date_range, date_in_past, child_ages_mismatch, stay_too_long, window_too_long, invalid_listing_url, invalid_language, invalid_sort, invalid_cursor, limit_out_of_range, mutually_exclusive_params, platform_not_enabled, no_enabled_platform, needs_country, listing_not_found, job_not_found, all_actors_failed, actor_blocked, upstream_degraded, actor_timeout, internal_error, plus the client side codes network, bad_response, job_timeout, job_failed and http_<status>. Each service code has a page at https://stayingapi.com/docs/errors/<code>.
Failed, empty, blocked and not-found calls are never billed.
Long running calls
A live key answers a long running request with a job id and the tool polls that job for you, free of charge, until the result is ready. Sandbox keys answer synchronously. Set STAYINGAPI_MAX_WAIT_SECONDS to change how long the tool waits before returning job_timeout (default 180).
Resources
- StayingAPI documentation
- Pricing: 300 free credits to start, no card required
- Credits and billing
- Family: n8n community node and MCP server
Disclosure
StayingAPI is an independent service for accommodation data. StayingAPI is not affiliated with, endorsed by, or sponsored by Airbnb, Booking.com, Vrbo, or Google Hotels. These are trademarks of their respective owners, used here descriptively to indicate the data sources StayingAPI can query.
Use of these tools is subject to the StayingAPI terms.
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file crewai_stayingapi-0.1.0.tar.gz.
File metadata
- Download URL: crewai_stayingapi-0.1.0.tar.gz
- Upload date:
- Size: 19.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d92c69a828c7c56b2907216255022b6521e4464e95e3ee00a5d3413a18f82de
|
|
| MD5 |
261bdcdb905d6d2b3e781662d23236db
|
|
| BLAKE2b-256 |
d6cdad25249208a3cdda13961ef652a6c02fc6cac2eba6dbf972af93a7d9d46b
|
File details
Details for the file crewai_stayingapi-0.1.0-py3-none-any.whl.
File metadata
- Download URL: crewai_stayingapi-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62bfef4e708cd2a21e5fe9c5673c02ac324e3f35cfb4a98a243310e62889875c
|
|
| MD5 |
d9ff8f3a14e81ac6df4bd4533c642954
|
|
| BLAKE2b-256 |
b669dbdc70935d1b27e9c19fb37d106743a062f3885cc38b9aed869f56d411e7
|