Search remote-work accommodations worldwide; Trusted Stay Partners can manage their own listings.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create a real booking from a quoteId returned by quoteStayBooking, and return a hosted checkoutUrl. The quote's price/availability is re-validated server-side one more time before the booking is created — a stale or expired quote will be rejected with a message to call quoteStayBooking again. You MUST send the checkoutUrl to the member and tell them to open it in their own browser to pay — you cannot complete this payment on their behalf, and no card details ever pass through you. Requires NOMADSTAYS_MCP_AGENT_TOKEN with the 'bookings' scope.
The quoteId returned by quoteStayBooking
Guest's full name for the booking. Defaults to the member's account name if omitted.
Contact email for the booking. Defaults to the member's account email if omitted.
Contact phone number for the booking.
Any special request to pass along to the Stay.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Create a real booking from a quoteId returned by quoteStayBooking, and return a hosted checkoutUrl. The quote's price/availability is re-validated server-side one more time before the booking is created — a stale or expired quote will be rejected with a message to call quoteStayBooking again. You MUST send the checkoutUrl to the member and tell them to open it in their own browser to pay — you cannot complete this payment on their behalf, and no card details ever pass through you. Requires NOMADSTAYS_MCP_AGENT_TOKEN with the 'bookings' scope.
| Argument | Type | Description |
|---|---|---|
| quoteId* | string | The quoteId returned by quoteStayBooking |
| contactName | string | Guest's full name for the booking. Defaults to the member's account name if omitted. |
| contactEmail | string | Contact email for the booking. Defaults to the member's account email if omitted. |
| contactPhone | string | Contact phone number for the booking. |
| specialRequest | string | Any special request to pass along to the Stay. |
{
"type": "object",
"required": [
"quoteId"
],
"properties": {
"quoteId": {
"type": "string",
"description": "The quoteId returned by quoteStayBooking"
},
"contactName": {
"type": "string",
"description": "Guest's full name for the booking. Defaults to the member's account name if omitted."
},
"contactEmail": {
"type": "string",
"description": "Contact email for the booking. Defaults to the member's account email if omitted."
},
"contactPhone": {
"type": "string",
"description": "Contact phone number for the booking."
},
"specialRequest": {
"type": "string",
"description": "Any special request to pass along to the Stay."
}
}
}Check if a specific stay is available for given check-in and check-out dates. Returns availability status and room details.
| Argument | Type | Description |
|---|---|---|
| stayId* | string | The unique identifier of the stay |
| checkIn* | string | Check-in date in ISO format (YYYY-MM-DD) |
| checkOut* | string | Check-out date in ISO format (YYYY-MM-DD) |
| roomType | string | Optional specific room type to check availability for |
{
"type": "object",
"required": [
"stayId",
"checkIn",
"checkOut"
],
"properties": {
"stayId": {
"type": "string",
"description": "The unique identifier of the stay"
},
"checkIn": {
"type": "string",
"description": "Check-in date in ISO format (YYYY-MM-DD)"
},
"checkOut": {
"type": "string",
"description": "Check-out date in ISO format (YYYY-MM-DD)"
},
"roomType": {
"type": "string",
"description": "Optional specific room type to check availability for"
}
}
}Start a new Coworking Application for the caller. Much simpler than the Stay/Experience applications: no VAT/tourism-number/business-model rules, no Application Fee, and no billing step at all — once coworkingName, applicantName, applicantEmail, city and country are present, nextAction goes straight to 'submit'. Call getCountryOptions first to find a valid country name (must be the exact tbCountry.CountryName, not an ID). Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| city | string | |
| address | string | |
| country | string | Exact tbCountry.CountryName (not a country ID) — use getCountryOptions and take the countryName field. Must not be a sanctioned country. |
| website | string | |
| telephone | string | |
| applicantName | string | |
| coworkingName | string | |
| applicantEmail | string |
{
"type": "object",
"required": [],
"properties": {
"city": {
"type": "string"
},
"address": {
"type": "string"
},
"country": {
"type": "string",
"description": "Exact tbCountry.CountryName (not a country ID) — use getCountryOptions and take the countryName field. Must not be a sanctioned country."
},
"website": {
"type": "string"
},
"telephone": {
"type": "string"
},
"applicantName": {
"type": "string"
},
"coworkingName": {
"type": "string"
},
"applicantEmail": {
"type": "string"
}
}
}Start a new Experience Application for the caller. Any fields can be supplied now or filled in later via saveExperienceApplication — the applicant's name defaults from their Nomad Stays profile if not supplied. Call getCountryOptions and getBusinessModelOptions first to resolve experienceCountryId/postalCountryId/businessModelId, since country-specific rules (VAT number, tourism number, permitted business models) are enforced server-side and rejections name the specific field/reason. Experiences must run a minimum of 4 days. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| zip | string | |
| city | string | |
| state | string | |
| maxPax | string | Maximum participants |
| mobile | string | |
| street | string | |
| daysQty | string | Minimum 4 days, enforced server-side |
| website | string | |
| comments | string | |
| vatNumber |
Start a new Stay Application for the caller. Any fields can be supplied now or filled in later via saveStayApplication — the applicant's name defaults from their Nomad Stays profile if not supplied. Call getCountryOptions and getBusinessModelOptions first to resolve stayCountryId/postalCountryId/businessModelId, since country-specific rules (VAT number, tourism number, permitted business models) are enforced server-side and rejections name the specific field/reason. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| zip | string | |
| city | string | |
| state | string | |
| mobile | string | |
| street | string | |
| website | string | |
| comments | string | |
| stayName | string | |
| vatNumber | string | Required if the postal country's vatNumberRequired flag is true (see getCountryOptions) |
| hasKitchen | boolean |
Send an enquiry about a Stay that can't be booked right now — for example quoteStayBooking finds no bookable package, or the Stay page says it isn't bookable online. The enquiry goes to the Nomad Stays team, who check availability with the Stay and reply to the member by email (usually within one working day). The member's name and email come from their Nomad Stays account; do not ask for them. Only send an enquiry the member has asked for, and include what they told you (who is travelling, work needs, questions). Use bookStay instead whenever a quote succeeds. Requires the 'bookings' scope.
| Argument | Type | Description |
|---|---|---|
| nights | number | Number of nights, 1-365 (optional) |
| stayId* | number | The Stay's ID (EntryId), as returned by the search tools or getStayByID |
| message* | string | The member's enquiry, up to 2000 characters |
| arrivalDate | string | Preferred arrival date, YYYY-MM-DD (optional) |
{
"type": "object",
"required": [
"stayId",
"message"
],
"properties": {
"nights": {
"type": "number",
"description": "Number of nights, 1-365 (optional)"
},
"stayId": {
"type": "number",
"description": "The Stay's ID (EntryId), as returned by the search tools or getStayByID"
},
"message": {
"type": "string",
"description": "The member's enquiry, up to 2000 characters"
},
"arrivalDate": {
"type": "string",
"description": "Preferred arrival date, YYYY-MM-DD (optional)"
}
}
}Create a new pricing package on a Stay, optionally with initial price tiers. Requires an MCP agent token scoped to the owning account.
| Argument | Type | Description |
|---|---|---|
| listed | boolean | OPTIONAL: whether the package is publicly listed |
| maxPax | number | OPTIONAL: max occupancy for this package |
| prices | array | OPTIONAL: initial price tiers. If supplied, replaces all price rows for the package. Exactly one entry per 7/14/21/30-night tier used. |
| stayId* | number | The Stay's EntryID |
| endDate | string | OPTIONAL: last check-in date this package is available for |
| startDate | string | OPTIONAL: first check-in date this package is available for |
| currencyFK* | number | REQUIRED: the currency this package is priced in — an id from getCurrencyOptions. Packages can use any supported currency; ASK the owner which one, never assume USD. All buyPrice values are in this currency. |
| roomTypeFK | number | OPTIONAL: room type id this package covers. Call getRoomTypeOptions for valid values. |
Create a new room on a Stay. Call getRoomTypeOptions(stayId) and getRoomFacilityOptions() first to find valid roomTypeFK/roomFacilityFk values. Boutique Stays are capped at 6 rooms total (one per Boutique1-6 slot) — creation is rejected once all 6 exist. Requires an MCP agent token scoped to the owning account.
| Argument | Type | Description |
|---|---|---|
| beds | number | OPTIONAL: number of beds |
| stayId* | number | The Stay's EntryID |
| maxPerson | number | OPTIONAL: max occupancy |
| mcpRoomId | string | OPTIONAL: external MCP room identifier to bind. NOT AVAILABLE for boutique Stays — the host UI has no field for this there, and the API will reject it. |
| roomTitle* | string | Room name/title |
| roomTypeFK | number | REQUIRED for non-boutique Stays — a roomTypeId from getRoomTypeOptions(stayId). IGNORED for boutique Stays — the next available Boutique1-6 slot is auto-assigned server-side, matching the host UI (which has no room-type picker for boutique room creation). |
| mainBedSize | string | OPTIONAL: main bed size |
| otherBedSize | string |
Delete one photo from a room's gallery. Call getMyStayRooms first to find the exact fileName. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| roomId* | number | The room's EntryID |
| stayId* | number | The Stay's EntryID |
| fileName* | string | The exact file name from getMyStayRooms |
| roomArea* | string | 'photos' for the regular room gallery, 'workspace' for the room's coworking gallery |
{
"type": "object",
"required": [
"stayId",
"roomId",
"roomArea",
"fileName"
],
"properties": {
"roomId": {
"type": "number",
"description": "The room's EntryID"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"fileName": {
"type": "string",
"description": "The exact file name from getMyStayRooms"
},
"roomArea": {
"enum": [
"photos",
"workspace"
],
"type": "string",
"description": "'photos' for the regular room gallery, 'workspace' for the room's coworking gallery"
}
}
}Permanently delete a pricing package and all its price tiers from a Stay. This is a hard delete (unlike room deletion, which is soft). Requires an MCP agent token scoped to the owning account.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID |
| packageId* | number | The package's EntryID (tbStayPackages) to delete |
{
"type": "object",
"required": [
"stayId",
"packageId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"packageId": {
"type": "number",
"description": "The package's EntryID (tbStayPackages) to delete"
}
}
}Delete one photo from a Stay. Call getMyStayPhotos first to find the exact fileName. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| area* | string | Which photo area the file belongs to (room photos aren't supported by this tool — manage those via updateStayRoom) |
| stayId* | number | The Stay's EntryID |
| fileName* | string | The exact file name from getMyStayPhotos, e.g. '69bdf22cdb0c43a7be3e825a0a3a2074.jpg' |
{
"type": "object",
"required": [
"stayId",
"area",
"fileName"
],
"properties": {
"area": {
"enum": [
"listing",
"main",
"workspace",
"host"
],
"type": "string",
"description": "Which photo area the file belongs to (room photos aren't supported by this tool — manage those via updateStayRoom)"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"fileName": {
"type": "string",
"description": "The exact file name from getMyStayPhotos, e.g. '69bdf22cdb0c43a7be3e825a0a3a2074.jpg'"
}
}
}Delete (soft-delete) a room from a Stay. Requires an MCP agent token scoped to the owning account.
| Argument | Type | Description |
|---|---|---|
| roomId* | number | The room's EntryID — use getMyStayRooms to find it |
| stayId* | number | The Stay's EntryID |
{
"type": "object",
"required": [
"stayId",
"roomId"
],
"properties": {
"roomId": {
"type": "number",
"description": "The room's EntryID — use getMyStayRooms to find it"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
}
}
}Find the nearest available dates when requested dates are not available. Searches for alternative check-in dates within a specified window and can adjust length of stay.
| Argument | Type | Description |
|---|---|---|
| stayId* | string | The unique identifier of the stay |
| maxLengthOfStay | number | Maximum length of stay in days (optional) |
| minLengthOfStay* | number | Minimum length of stay in days |
| preferredCheckIn* | string | Preferred check-in date in ISO format (YYYY-MM-DD) |
| searchWindowDays | number | Number of days before and after preferred date to search (default: 90) |
{
"type": "object",
"required": [
"stayId",
"preferredCheckIn",
"minLengthOfStay"
],
"properties": {
"stayId": {
"type": "string",
"description": "The unique identifier of the stay"
},
"maxLengthOfStay": {
"type": "number",
"description": "Maximum length of stay in days (optional)"
},
"minLengthOfStay": {
"type": "number",
"description": "Minimum length of stay in days"
},
"preferredCheckIn": {
"type": "string",
"description": "Preferred check-in date in ISO format (YYYY-MM-DD)"
},
"searchWindowDays": {
"type": "number",
"description": "Number of days before and after preferred date to search (default: 90)"
}
}
}List valid values for one of the Additional Information picklists used in updateStayOrganisationalData: Children Allowed, Pets Allowed, or Parking. These are NOT booleans — they're lookup IDs (e.g. 'Yes', 'No', 'On Request') — call this to find the right value before writing petsAllowedId/childrenAllowedId/parkingId. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| filterName* | string | Which picklist to fetch options for |
{
"type": "object",
"required": [
"filterName"
],
"properties": {
"filterName": {
"enum": [
"Children Allowed",
"Pets Allowed",
"Parking"
],
"type": "string",
"description": "Which picklist to fetch options for"
}
}
}List all possible amenities in the database, grouped into Stay Amenities (referenced by tbStaysFacilities) and Room Amenities (referenced by tbStaysRoom.RoomFacilityFk).
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Returns all active lifestyle/genre categories available in NomadStays. Use this to discover what lifestyle categories exist before searching with getStaysByLifestyle.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Get all available booking windows in a specific month that meet the minimum length of stay requirement. Returns all possible check-in dates and their corresponding available periods.
| Argument | Type | Description |
|---|---|---|
| year* | number | Year (e.g., 2026) |
| month* | number | Month number (1-12, where 1=January, 12=December) |
| stayId* | string | The unique identifier of the stay |
| minLengthOfStay* | number | Minimum length of stay in days required |
{
"type": "object",
"required": [
"stayId",
"year",
"month",
"minLengthOfStay"
],
"properties": {
"year": {
"type": "number",
"description": "Year (e.g., 2026)"
},
"month": {
"type": "number",
"description": "Month number (1-12, where 1=January, 12=December)"
},
"stayId": {
"type": "string",
"description": "The unique identifier of the stay"
},
"minLengthOfStay": {
"type": "number",
"description": "Minimum length of stay in days required"
}
}
}Check a Stay booking's real payment status by PNR. Status is always freshly re-verified against Airwallex directly if not already confirmed paid — never trust a client-supplied claim of success. Only ever returns bookings owned by the caller's own account. Requires NOMADSTAYS_MCP_AGENT_TOKEN with the 'bookings' scope.
| Argument | Type | Description |
|---|---|---|
| pnr* | string | The booking reference (PNR) returned by bookStay |
{
"type": "object",
"required": [
"pnr"
],
"properties": {
"pnr": {
"type": "string",
"description": "The booking reference (PNR) returned by bookStay"
}
}
}List valid values for a Stay's listing/business model (businessModelId, read-only — displayed on the Stay but not editable via MCP or the host UI itself). Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List valid values for a Stay's cancellation policy (cxPolicyId in updateStayOrganisationalData). Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List valid values for a Stay's country (countryId in updateStayOrganisationalData), with each country's name and 2-letter code. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Get the full current state of one Coworking Application, including a nextAction hint and (if incomplete) a missingFields list naming exactly which required fields are still empty. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| applicationId* | number | The application's ID (use listCoworkingApplications to find it) |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"applicationId": {
"type": "number",
"description": "The application's ID (use listCoworkingApplications to find it)"
}
}
}List valid currency ids/codes for use as a package's currencyFK.
No arguments.
{
"type": "object",
"properties": {}
}Get the full current state of one Experience Application, including a nextAction hint and (if incomplete) a missingFields list naming exactly which required fields are still empty. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| applicationId* | number | The application's ID (use listExperienceApplications to find it) |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"applicationId": {
"type": "number",
"description": "The application's ID (use listExperienceApplications to find it)"
}
}
}List every facility/checkbox group name that exists on the platform (e.g. 'Languages Spoken', 'General', 'Services', 'Meal', 'Position', 'Remote Worker'). Call this first if you don't already know the exact group name to pass to getMyStayFacilities/updateStayFacilities. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Fetch a specific NomadStays Help Center article by its ID. Returns the full article content, title, slug, and categories.
| Argument | Type | Description |
|---|---|---|
| id* | string | The WordPress post ID of the Help Center article (e.g., '123') |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The WordPress post ID of the Help Center article (e.g., '123')"
}
}
}Get the host account's business profile: legal business name, VAT/business registration numbers, whether registered as a business entity. Does NOT include bank or tax-ID details — those are never exposed via MCP. Call this before updateHostBusinessProfile. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Get a Stay's contact/owner/manager details and social media links: owner name/email/mobile, manager (day-to-day contact person) name/email/mobile, booking email/phone/mobile, host display name, and website/Facebook/Twitter/YouTube/Instagram/TikTok/LinkedIn links. Call this before updateStayContacts so the agent knows current values. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID (use getMyStays to find it) |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID (use getMyStays to find it)"
}
}
}Get the current title, description, and listed status for one of your Stays. Call this before updateStayDetail so the agent knows the current values and doesn't accidentally overwrite them. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID (use getMyStays to find it) |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID (use getMyStays to find it)"
}
}
}Get the available options AND current selections for one facility/checkbox group on a Stay — e.g. 'Languages Spoken' returns every language the platform supports plus which ones are currently selected for this Stay. Call getFacilityGroups first if you don't know the exact group name. Common groups: 'General', 'Services', 'Languages Spoken', 'Meal', 'Position', 'Remote Worker'. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| group* | string | Exact facility group name, e.g. 'Languages Spoken', 'General', 'Services', 'Meal', 'Position', 'Remote Worker' (call getFacilityGroups for the full list) |
| stayId* | number | The Stay's EntryID |
{
"type": "object",
"required": [
"stayId",
"group"
],
"properties": {
"group": {
"type": "string",
"description": "Exact facility group name, e.g. 'Languages Spoken', 'General', 'Services', 'Meal', 'Position', 'Remote Worker' (call getFacilityGroups for the full list)"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
}
}
}Get the Stay's listing-completion scores — the same six 'Listing Completion' cards shown on the Stay dashboard (Stay Details, Availability, Rooms, Packages, Wi-Fi, Operator Information), plus an overall completion percentage. Use this when a host asks how far along they are with onboarding or what's left to finish. Note: Wi-Fi is a test-freshness score (recency of the last speed test), not a speed rating. Operator Information is the same score the owner's dashboard shows, with a missingItems list of labels (e.g. 'Date of Birth', 'Banking Details') — those fields are owner-only and never writable via MCP, so relay the list to the owner. Stay Details is recalculated automatically after every MCP edit to details, organisational data, contacts, facilities or photos. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID (use getMyStays to find it) |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID (use getMyStays to find it)"
}
}
}Get a Stay's organisational data: address, check-in/out policy, pets/children/parking, cancellation policy, tourism/land-registration numbers. Call this before updateStayOrganisationalData so the agent knows current values. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID (use getMyStays to find it) |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID (use getMyStays to find it)"
}
}
}List all pricing packages on one of your Stays, including their full price tiers (days, buy price, sell price, comparison price, listed status). Call this before createStayPackage or updateStayPackage — hosts often forget exactly what packages/pricing they've already set. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID (use getMyStays to find it) |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID (use getMyStays to find it)"
}
}
}Get every current photo for a Stay across all areas (listing gallery, main/hero, workspace/coworking gallery, host), each as a full https:// CDN URL an agent can view directly (not just a filename). Call this before deleteStayPhoto or reorderStayPhotos to see current filenames. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID (use getMyStays to find it) |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID (use getMyStays to find it)"
}
}
}List all rooms currently configured on one of your Stays, including bed setup, occupancy, facilities (resolved to names, not just IDs), and every room/workspace photo as a viewable CDN URL. Call this before createStayRoom, updateStayRoom, deleteStayRoom, deleteRoomPhoto, or reorderRoomPhotos so the agent can show current values or find the right roomId/fileName. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID (use getMyStays to find it) |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID (use getMyStays to find it)"
}
}
}List all Stays owned by the account bound to the MCP agent token. Returns stayId, title, and listed status for each — use this to find a stayId before calling any other owner-scoped tool. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Look up a Nomad Stays product's price and purchasability — currently only product 8, the Stay Application fee (EUR 39). Returns isWaivedForCaller: true if the caller is already a Stay Partner re-applying, in which case there's nothing to pay and purchaseProduct will process the waiver automatically. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| productId* | number | The product's EntryID — use 8 for the Stay Application fee |
{
"type": "object",
"required": [
"productId"
],
"properties": {
"productId": {
"type": "number",
"description": "The product's EntryID — use 8 for the Stay Application fee"
}
}
}Check whether a purchase has been paid. Only ever reports 'paid' after a fresh server-side check against the payment provider — never trust the member's own claim that they've paid, always poll this instead. Possible statuses: pending, paid, failed, waived. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| saleId* | string | The saleId returned by purchaseProduct |
{
"type": "object",
"required": [
"saleId"
],
"properties": {
"saleId": {
"type": "string",
"description": "The saleId returned by purchaseProduct"
}
}
}Get comprehensive list of all facilities and amenities for a specific room, including WiFi metrics (download/upload speed, jitter). Returns room details, all facilities, and network performance data.
| Argument | Type | Description |
|---|---|---|
| roomId* | string | The unique identifier of the room (tbStaysRoom.EntryID) |
{
"type": "object",
"required": [
"roomId"
],
"properties": {
"roomId": {
"type": "string",
"description": "The unique identifier of the room (tbStaysRoom.EntryID)"
}
}
}Check a specific room's availability for each night in a date range. Returns availability status (available/not available) for each night.
| Argument | Type | Description |
|---|---|---|
| roomId* | string | The unique identifier of the room (tbStaysRoom.EntryID) |
| checkIn* | string | Check-in date in ISO format (YYYY-MM-DD) |
| checkOut* | string | Check-out date in ISO format (YYYY-MM-DD) |
{
"type": "object",
"required": [
"roomId",
"checkIn",
"checkOut"
],
"properties": {
"roomId": {
"type": "string",
"description": "The unique identifier of the room (tbStaysRoom.EntryID)"
},
"checkIn": {
"type": "string",
"description": "Check-in date in ISO format (YYYY-MM-DD)"
},
"checkOut": {
"type": "string",
"description": "Check-out date in ISO format (YYYY-MM-DD)"
}
}
}List every room-level amenity/facility option available (roomFacilityFk in createStayRoom/updateStayRoom) — e.g. Wi-Fi, Air Conditioning, Private Bathroom. Wi-Fi is mandatory and always included even if not explicitly selected. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List valid room types for a specific Stay's rooms (roomTypeFK in createStayRoom/updateStayRoom). Valid values depend on the Stay: boutique Stays choose from a fixed boutique type range; standard Stays are restricted to types already used on one of their own rooms. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
}
}
}Get the full current state of one Stay Application, including a nextAction hint and (if incomplete) a missingFields list naming exactly which required fields are still empty. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| applicationId* | number | The application's ID (use listStayApplications to find it) |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"applicationId": {
"type": "number",
"description": "The application's ID (use listStayApplications to find it)"
}
}
}Returns full details for a single stay. The id parameter searches both EntryId and StayId fields.
| Argument | Type | Description |
|---|---|---|
| id* | string | Stay identifier (searches the EntryId field) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Stay identifier (searches the EntryId field)"
}
}
}Returns how many stays NomadStays has in each country, most first. Each row has the country name, 2-letter code, continent, 'stays' (live public listings) and 'bookableNow' (those currently listed for booking). Use this for questions like 'which countries have the most stays', 'how many stays do you have in Spain' or 'where do you have stays'. Optionally filter by continent.
| Argument | Type | Description |
|---|---|---|
| continent | string | Optional continent name or partial match (e.g., 'Europe', 'Asia') |
{
"type": "object",
"required": [],
"properties": {
"continent": {
"type": "string",
"description": "Optional continent name or partial match (e.g., 'Europe', 'Asia')"
}
}
}List valid values for a Stay's 'Main Accommodation Type' (stayTypeId in updateStayOrganisationalData). Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Find all stays that have specific amenities. Searches both stay-level amenities (referenced by tbStayFacilities) and room-level amenities (referenced by tbRoomFacilities). Use matchType 'any' to find stays with at least one amenity, or 'all' to find stays with all requested amenities. Can optionally filter by minimum WiFi download speed.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results to return (default: 25) |
| amenities* | array | Array of amenity names to search for (e.g., ['WiFi', 'Air Conditioning', 'Pool']). Use getAllAmenities to see all available amenities. |
| matchType | string | OPTIONAL: 'any' (default) finds stays with at least one amenity, 'all' finds stays with all amenities |
| minWifiSpeed | number | OPTIONAL: Minimum WiFi download speed in Mbps (default: 0). Only returns stays with WiFi speed at or above this threshold. |
{
"type": "object",
"required": [
"amenities"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results to return (default: 25)"
},
"amenities": {
"type": "array",
"items": {
"type": "string"
},
"description": "Array of amenity names to search for (e.g., ['WiFi', 'Air Conditioning', 'Pool']). Use getAllAmenities to see all available amenities."
},
"matchType": {
"enum": [
"any",
"all"
],
"type": "string",
"description": "OPTIONAL: 'any' (default) finds stays with at least one amenity, 'all' finds stays with all amenities"
},
"minWifiSpeed": {
"type": "number",
"description": "OPTIONAL: Minimum WiFi download speed in Mbps (default: 0). Only returns stays with WiFi speed at or above this threshold."
}
}
}Search for stays that fit within a budget for a given duration. Country is OPTIONAL - can search globally or filter by specific country. Perfect for queries like 'Find me somewhere to stay for 1 month under EUR 1000' or 'Find me a place in Spain for 1 month under EUR 1000'.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results to return (default: 15) |
| currency* | string | Currency code (e.g., 'EUR', 'USD', 'GBP') |
| maxPrice* | number | Maximum price for the entire duration (e.g., 1000 for EUR 1000) |
| continent | string | OPTIONAL: Continent name (e.g., 'Europe', 'Asia', 'Africa'). Filters results to stays in countries on this continent. If omitted, searches all continents globally. |
| checkInDate | string | OPTIONAL: Check-in date. Can be a full date (e.g., '2026-05-15'), a month name (e.g., 'May' ? uses May 1st), or omit for today (2026-01-19) |
| countryCode | string | OPTIONAL: 2-letter country code (e.g., 'ES', 'PT') or country name (e.g., 'Spain'). If omitted, searches all countries globally. |
| durationDays* |
Returns stays from the NomadStays database filtered by continent. Search by continent name (e.g., 'Europe', 'Asia', 'Africa', 'North America', 'South America', 'Oceania')
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results to return (default: 15) |
| continent* | string | Continent name or partial match (e.g., 'Europe', 'Asia', 'Africa') |
{
"type": "object",
"required": [
"continent"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results to return (default: 15)"
},
"continent": {
"type": "string",
"description": "Continent name or partial match (e.g., 'Europe', 'Asia', 'Africa')"
}
}
}Returns stays from the NomadStays database. Search by 2-letter country code (e.g., 'MA', 'US') or country name (e.g., 'Antigua' matches 'Antigua and Barbuda')
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results to return (default: 15) |
| countrycode* | string | 2-letter country code (e.g., 'MA', 'US') or partial country name (e.g., 'Antigua') |
{
"type": "object",
"required": [
"countrycode"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results to return (default: 15)"
},
"countrycode": {
"type": "string",
"description": "2-letter country code (e.g., 'MA', 'US') or partial country name (e.g., 'Antigua')"
}
}
}Returns stays from the NomadStays database filtered by lifestyle/genre category (e.g., 'Digital Nomad', 'Beach Life', 'City Living', 'Mountain Retreat'). Each stay can belong to multiple lifestyle categories.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results to return (default: 15) |
| lifestyle* | string | Lifestyle/genre category name or partial match (e.g., 'Digital Nomad', 'Beach', 'City'). Use getAllLifestyles tool to see all available categories. |
{
"type": "object",
"required": [
"lifestyle"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results to return (default: 15)"
},
"lifestyle": {
"type": "string",
"description": "Lifestyle/genre category name or partial match (e.g., 'Digital Nomad', 'Beach', 'City'). Use getAllLifestyles tool to see all available categories."
}
}
}Returns stays from the NomadStays database that match a location search term. Searches across City, State, location_name, location_country, and location_description fields. Use this for flexible location searches (e.g., 'Paris', 'California', 'Beach', 'Mountain')
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results to return (default: 15) |
| location* | string | Location search term to match against City, State, location_name, location_country, or location_description (e.g., 'Paris', 'California', 'Beach', 'Mountain') |
{
"type": "object",
"required": [
"location"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results to return (default: 15)"
},
"location": {
"type": "string",
"description": "Location search term to match against City, State, location_name, location_country, or location_description (e.g., 'Paris', 'California', 'Beach', 'Mountain')"
}
}
}Find all stays with WiFi download speed greater than 10Mbps, listed and not suspended.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results to return (default: 15) |
| minWiFiDownloadSpeed | number | Minimum WiFi download speed in Mbps (default: 10) |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results to return (default: 15)"
},
"minWiFiDownloadSpeed": {
"type": "number",
"description": "Minimum WiFi download speed in Mbps (default: 10)"
}
}
}Efficiently checks whether a stay has ANY open booking window of a minimum length within a date range, without checking every single day. Use this to filter search results down to stays with real availability somewhere in the near future (e.g. 'available at all in the next 6 months for a month-long stay'), instead of calling checkStayAvailability repeatedly for individual dates.
| Argument | Type | Description |
|---|---|---|
| stayId* | string | The unique identifier of the stay |
| fromDate* | string | Start of the search window, ISO format (YYYY-MM-DD). Usually today's date. |
| windowDays | number | How many days forward from fromDate to search (default: 180, i.e. 6 months) |
| minLengthOfStay* | number | Minimum length of stay in days required (e.g. 30 for a month-long stay) |
{
"type": "object",
"required": [
"stayId",
"fromDate",
"minLengthOfStay"
],
"properties": {
"stayId": {
"type": "string",
"description": "The unique identifier of the stay"
},
"fromDate": {
"type": "string",
"description": "Start of the search window, ISO format (YYYY-MM-DD). Usually today's date."
},
"windowDays": {
"type": "number",
"description": "How many days forward from fromDate to search (default: 180, i.e. 6 months)"
},
"minLengthOfStay": {
"type": "number",
"description": "Minimum length of stay in days required (e.g. 30 for a month-long stay)"
}
}
}List the caller's Coworking Applications (draft and submitted), each with a nextAction hint (provide_coworking_details, submit, awaiting_review, or accepted). Coworking has no Application Fee, so unlike Stay/Experience there is no pay_application_fee step. Call this to find an in-progress application's applicationId before resuming it. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List the caller's Experience Applications (draft and submitted), each with a nextAction hint telling you what's needed next (provide_applicant_details, provide_experience_details, pay_application_fee, submit, awaiting_review, or accepted). Call this to find an in-progress application's applicationId before resuming it. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List all available NomadStays Help Center categories. Returns category ID, name, slug, description, and article count for each category.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List all Stay bookings owned by the caller's own account, most recent first, with each one's current status. Each booking includes needsAction: true if it's still unpaid, with a ready-to-use checkoutUrl — call this proactively (e.g. at the start of a session, or when the member asks what's pending) and surface any needsAction bookings to the member, since there is no other way for them to be notified of an incomplete booking through this connection. Requires NOMADSTAYS_MCP_AGENT_TOKEN with the 'bookings' scope.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List the caller's Stay Applications (draft and submitted), each with a nextAction hint telling you what's needed next (provide_applicant_details, provide_property_details, pay_application_fee, submit, awaiting_review, or accepted). Call this to find an in-progress application's applicationId before resuming it. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Start a purchase of a Nomad Stays product on the caller's own behalf. If the caller already qualifies for a waiver (e.g. an existing Stay Partner re-applying), this resolves immediately with no payment step and returns status 'waived'. Otherwise it returns a checkoutUrl hosted on nomadstays.com — you must hand this URL to the member and ask them to open it in their own browser and pay; you cannot complete payment on their behalf. Poll getPurchaseStatus with the returned saleId afterwards to find out when it's actually paid. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| productId* | number | The product's EntryID — use 8 for the Stay Application fee |
| applicationId | number | Optional: if this purchase is paying a Stay Application's fee, pass its applicationId (from createStayApplication) so the payment is applied back to that application automatically once paid |
{
"type": "object",
"required": [
"productId"
],
"properties": {
"productId": {
"type": "number",
"description": "The product's EntryID — use 8 for the Stay Application fee"
},
"applicationId": {
"type": "number",
"description": "Optional: if this purchase is paying a Stay Application's fee, pass its applicationId (from createStayApplication) so the payment is applied back to that application automatically once paid"
}
}
}Get a server-computed price and availability quote for booking a Stay package on the caller's own behalf. Price is always re-derived from the package's actual pricing tiers — never trust or reuse a price shown elsewhere. Picks the largest price tier whose length is <= the requested nights (e.g. 10 nights against 7/14/21/30-day tiers uses the 7-day tier's rate), falling back to the smallest tier if the stay is shorter than all of them. Returns a quoteId valid for about 15 minutes — call bookStay with it to actually create the booking and get a payment link. Requires the caller's token to carry the 'bookings' OAuth scope (McpMember role), separate from the listings-management 'McpAgent' scope other tools here use.
| Argument | Type | Description |
|---|---|---|
| pets | number | Number of pets. Defaults to 0. |
| rooms | number | Number of rooms to book. Defaults to 1. |
| adults | number | Number of adult guests. Defaults to 1. |
| checkIn* | string | Check-in date, YYYY-MM-DD |
| checkOut* | string | Check-out date, YYYY-MM-DD |
| children | number | Number of child guests. Defaults to 0. |
| packageId* | number | The Stay package's ID (from getPackages or search/browse tools) |
Change the display order of a room's photo gallery. fileNames must be the FULL current gallery (same set, just reordered) — call getMyStayRooms first. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| roomId* | number | The room's EntryID |
| stayId* | number | The Stay's EntryID |
| roomArea* | string | 'photos' for the regular room gallery, 'workspace' for the room's coworking gallery |
| fileNames* | array | The complete gallery file names in the new desired order — must match the current set exactly (call getMyStayRooms first) |
{
"type": "object",
"required": [
"stayId",
"roomId",
"roomArea",
"fileNames"
],
"properties": {
"roomId": {
"type": "number",
"description": "The room's EntryID"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"roomArea": {
"enum": [
"photos",
"workspace"
],
"type": "string",
"description": "'photos' for the regular room gallery, 'workspace' for the room's coworking gallery"
},
"fileNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "The complete gallery file names in the new desired order — must match the current set exactly (call getMyStayRooms first)"
}
}
}Change the display order of a Stay's listing or workspace photo gallery. fileNames must be the FULL current gallery (same set of files, just reordered) — call getMyStayPhotos first. This only reorders; it cannot add or remove photos. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| area* | string | Only these two areas support reordering |
| stayId* | number | The Stay's EntryID |
| fileNames* | array | The complete gallery file names in the new desired order — must match the current set exactly (call getMyStayPhotos first) |
{
"type": "object",
"required": [
"stayId",
"area",
"fileNames"
],
"properties": {
"area": {
"enum": [
"listing",
"workspace"
],
"type": "string",
"description": "Only these two areas support reordering"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"fileNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "The complete gallery file names in the new desired order — must match the current set exactly (call getMyStayPhotos first)"
}
}
}Update any subset of fields on an existing, not-yet-submitted Coworking Application. Same field set and validation rules as createCoworkingApplication — only pass the fields you're changing. Fails with a 409 if the application has already been submitted. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| city | string | |
| address | string | |
| country | string | Exact tbCountry.CountryName (not a country ID) — use getCountryOptions. |
| website | string | |
| telephone | string | |
| applicantName | string | |
| applicationId* | number | The application's ID |
| coworkingName | string | |
| applicantEmail | string |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"city": {
"type": "string"
},
"address": {
"type": "string"
},
"country": {
"type": "string",
"description": "Exact tbCountry.CountryName (not a country ID) — use getCountryOptions."
},
"website": {
"type": "string"
},
"telephone": {
"type": "string"
},
"applicantName": {
"type": "string"
},
"applicationId": {
"type": "number",
"description": "The application's ID"
},
"coworkingName": {
"type": "string"
},
"applicantEmail": {
"type": "string"
}
}
}Update any subset of fields on an existing, not-yet-submitted Experience Application. Same field set and validation rules as createExperienceApplication — only pass the fields you're changing. Fails with a 409 if the application has already been submitted. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| zip | string | |
| city | string | |
| state | string | |
| maxPax | string | |
| mobile | string | |
| street | string | |
| daysQty | string | Minimum 4 days, enforced server-side |
| website | string | |
| comments | string | |
| vatNumber | string | |
| hasKitchen | boolean |
Update any subset of fields on an existing, not-yet-submitted Stay Application. Same field set and validation rules as createStayApplication — only pass the fields you're changing. Fails with a 409 if the application has already been submitted. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| zip | string | |
| city | string | |
| state | string | |
| mobile | string | |
| street | string | |
| website | string | |
| comments | string | |
| stayName | string | |
| vatNumber | string | |
| hasKitchen | boolean | |
| businessName | string | |
Search NomadStays Help Center articles from the public knowledgebase endpoint and return matching title/content/slug entries.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results to return (default: 15) |
| query | string | Search term to match against Help Center knowledgebase articles |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results to return (default: 15)"
},
"query": {
"type": "string",
"description": "Search term to match against Help Center knowledgebase articles"
}
}
}Creates a new NomadStays account on behalf of a person who does not have one yet. No authentication required — this is how an AI agent gets a person started. The account is created but inactive until the person clicks the confirmation link sent to their email; this call returns no session or token, so the agent cannot sign in or act as the user itself. Once confirmed, the person can log in at nomadstays.com/Account/Login and request their own MCP bearer token or OAuth grant to let an agent manage their account/listings going forward.
| Argument | Type | Description |
|---|---|---|
| email* | string | A real email address the person controls — the confirmation link is sent here and the account stays inactive until it's clicked |
| lastName* | string | The person's last name |
| password* | string | Account password, minimum 6 characters |
| firstName* | string | The person's first name |
| telephone* | string | Contact telephone number |
| acceptGdpr* | boolean | Must be true, and only after showing the person this statement and getting their explicit agreement (the same wording as the website's sign-up form): "I accept the Terms & Conditions (https://www.nomadstays.com/terms-and-conditions) and Privacy Policy (https://www.nomadstays.com/privacy), that the information collected is processed by Nomad Stays in order to receive the service, and I consent to analytics and advertising cookies as described in the Cookie Policy (https://www.nomadstays.com/cookies) and to receiving updates & newsletters." Never assume agreement on the person's behalf. |
Submit a completed Coworking Application for human review. Rejects with a missingFields list if any required field is still empty. There is no Application Fee to pay for Coworking, so — unlike submitStayApplication/submitExperienceApplication — this never returns a pay_application_fee/409-unpaid response. On success the application moves to human review. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| applicationId* | number | The application's ID |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"applicationId": {
"type": "number",
"description": "The application's ID"
}
}
}Submit a completed Experience Application for human review. Rejects with a missingFields list if any required field is still empty, or a 409 if the Application Fee hasn't been paid/waived yet (call purchaseProduct with productId 9 and applicationId first — Experience uses product 9, NOT product 8). There is no partial/optimistic submission. On success the application moves to human review. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| applicationId* | number | The application's ID |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"applicationId": {
"type": "number",
"description": "The application's ID"
}
}
}Submit a completed Stay Application for human review. Rejects with a missingFields list if any required field is still empty, or a 409 if the Application Fee hasn't been paid/waived yet (call purchaseProduct with productId 8 and applicationId first). There is no partial/optimistic submission — everything required must already be in place. On success the application moves to human review; nothing further is needed from the agent. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| applicationId* | number | The application's ID |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"applicationId": {
"type": "number",
"description": "The application's ID"
}
}
}Update the host account's business profile (legal business name, VAT/business registration numbers). Applies to the account owning the MCP agent token, not a specific stay. Only fields supplied are changed. Does NOT touch bank or tax-ID details — those are not MCP-writable.
| Argument | Type | Description |
|---|---|---|
| vatNumber | string | |
| businessName | string | |
| entityAccount | boolean | Whether the host operates as a registered business entity |
| businessNumber | string |
{
"type": "object",
"required": [],
"properties": {
"vatNumber": {
"type": "string"
},
"businessName": {
"type": "string"
},
"entityAccount": {
"type": "boolean",
"description": "Whether the host operates as a registered business entity"
},
"businessNumber": {
"type": "string"
}
}
}Update a Stay's contact/owner/manager details and social media links. Only fields supplied are changed. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| stayId* | number | The Stay's EntryID |
| tikTok | string | |
| string | X (Twitter) profile link | |
| website | string | |
| youtube | string | |
| string | ||
| string | ||
| ownerName | string | |
| ownerEmail | string | |
| managerName | string | The day-to-day contact person's name (not necessarily the owner) |
| ownerMobile | string | |
Update a Stay's title and/or description. Requires an MCP agent token (NOMADSTAYS_MCP_AGENT_TOKEN) scoped to the owning account. Only fields supplied are changed.
| Argument | Type | Description |
|---|---|---|
| title | string | OPTIONAL: new title |
| stayId* | number | The Stay's EntryID |
| description | string | OPTIONAL: new description |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"title": {
"type": "string",
"description": "OPTIONAL: new title"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"description": {
"type": "string",
"description": "OPTIONAL: new description"
}
}
}Set which options are selected for one facility/checkbox group on a Stay — e.g. which languages are spoken. facilityDetailIds is the COMPLETE replacement list: anything not included will be UNCHECKED. Call getMyStayFacilities first to see current selections and valid IDs before changing them. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| group* | string | Exact facility group name, matching what getMyStayFacilities was called with |
| stayId* | number | The Stay's EntryID |
| facilityDetailIds* | array | The FULL list of facilityDetailId values that should be selected after this call — call getMyStayFacilities first to see valid IDs. An empty array clears all selections in this group. |
{
"type": "object",
"required": [
"stayId",
"group",
"facilityDetailIds"
],
"properties": {
"group": {
"type": "string",
"description": "Exact facility group name, matching what getMyStayFacilities was called with"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"facilityDetailIds": {
"type": "array",
"items": {
"type": "number"
},
"description": "The FULL list of facilityDetailId values that should be selected after this call — call getMyStayFacilities first to see valid IDs. An empty array clears all selections in this group."
}
}
}Update a Stay's organisational data: address, check-in/out policy, pets/children/parking, cancellation policy, accommodation type, tourism/land-registration numbers, 'Why Choose Us' reasons, and more. Only fields supplied are changed. IMPORTANT: countryId, petsAllowedId, childrenAllowedId, parkingId, cxPolicyId, and stayTypeId are lookup IDs, NOT plain text or booleans — call getCountryOptions / getAdditionalInformationOptions / getCancellationPolicyOptions / getStayTypeOptions first to find the correct ID to send. Requires an MCP agent token scoped to the owning account.
| Argument | Type | Description |
|---|---|---|
| city | string | |
| state | string | |
| geoLat | number | Map pin latitude |
| geoLng | number | Map pin longitude |
| stayId* | number | The Stay's EntryID |
| address | string | |
| reason1 | string | First 'Why Choose Us' reason shown to guests |
| reason2 | string | |
| reason3 | string |
Update an existing pricing package on a Stay. Supplying 'prices' replaces ALL price rows for that package. Requires an MCP agent token scoped to the owning account.
| Argument | Type | Description |
|---|---|---|
| listed | boolean | |
| maxPax | number | |
| prices | array | OPTIONAL: replaces ALL price rows for this package when supplied. Exactly one entry per 7/14/21/30-night tier used. |
| stayId* | number | The Stay's EntryID |
| endDate | string | OPTIONAL: last check-in date this package is available for |
| isActive | boolean | OPTIONAL: archive (false) or restore (true) this package — cascades to 'listed' on all its price tiers, matching the host UI's Archive/Restore actions |
| packageId* | number | The package's EntryID (tbStayPackages) |
| startDate | string | OPTIONAL: first check-in date this package is available for |
| currencyFK | number | Call getCurrencyOptions for valid values. |
Update an existing room on a Stay. Only fields supplied are changed. Call getRoomTypeOptions(stayId) and getRoomFacilityOptions() first to find valid roomTypeFK/roomFacilityFk values. Requires an MCP agent token scoped to the owning account.
| Argument | Type | Description |
|---|---|---|
| beds | number | |
| roomId* | number | The room's EntryID (tbStaysRoom) — use getMyStayRooms to find it |
| stayId* | number | The Stay's EntryID |
| maxPerson | number | |
| mcpRoomId | string | External MCP room identifier. NOT AVAILABLE for boutique Stays — the host UI has no field for this there, and the API will reject it. |
| roomTitle | string | |
| roomTypeFK | number | A roomTypeId from getRoomTypeOptions(stayId). |
| mainBedSize | string | |
| otherBedSize | string | |
| roomFacilityFk |
Upload a photo to one of your Stay's photo areas. Supply EXACTLY ONE of 'url' (a public https:// link, e.g. a Google Drive or Dropbox share link — the server downloads it) or 'base64' (the raw image bytes, base64-encoded — use this when you already have the image data in hand, e.g. a user attached a photo in the conversation, and have nowhere public to host it first). The photo is validated against the same minimum specs as a manual upload: JPEG, PNG, or WebP, under 20MB, and a minimum resolution that depends on area. Most areas require at least 1920x1080 landscape; 'host' requires at least 1080x1350 PORTRAIT — a landscape photo will be rejected for that area. Every upload is downscaled to fit within 2560x1440 and re-encoded server-side as WebP (stripping metadata and anything that isn't genuine image data) before storage. Requires NOMADSTAYS_MCP_AGENT_TOKEN.
| Argument | Type | Description |
|---|---|---|
| url | string | A public https:// URL the server can download the image from (e.g. a Google Drive or Dropbox share link). Supply this OR base64, not both. |
| area* | string | Which photo area this belongs to: - 'listing': general Stay gallery photos (multiple allowed, min 1920x1080 landscape) - 'main': the single hero/cover photo shown first for the Stay (min 1920x1080 landscape, replaces any existing main photo) - 'workspace': coworking/workspace photos for the whole Stay (multiple allowed, min 1920x1080 landscape) - 'host': a photo of the HOST/CONTACT PERSON, not the property — must be PORTRAIT orientation, min 1080x1350 (replaces any existing host photo) - 'room': photos for one specific room — requires roomId (multiple allowed, min 1920x1080 landscape) |
| base64 | string | Base64-encoded JPEG, PNG, or WebP image bytes (a data:image/...;base64,... URI prefix is also accepted and stripped automatically). Supply this OR url, not both. Under ~27MB encoded (20MB image). |
| string |
| Required if the postal country's vatNumberRequired flag is true (see getCountryOptions) |
| hasKitchen | boolean |
| description | string |
| businessName | string |
| hasInsurance | boolean |
| monthlyPrice | string | Price per person (USD) |
| downloadSpeed | string |
| tourismNumber | string | Required if the experience country's tourismNumberRequired flag is true (see getCountryOptions) |
| applicantEmail | string |
| experienceName | string |
| workFacilities | string |
| businessModelId | number | tbBusinessModel.EntryID — use getBusinessModelOptions. If the experience country's bookingModelsRestricted flag is true, only a 'StayDirect'-prefixed model is accepted. |
| postalCountryId | number | tbCountry.CountryId for the applicant's billing/postal address — used only to check whether a VAT number is required, and stored on the member's business profile (not on the application itself). Use getCountryOptions to find a value. |
| applicantLastName | string | Overrides the profile default for this application only — does not change the member's profile |
| laundryFacilities | string |
| applicantFirstName | string | Overrides the profile default for this application only — does not change the member's profile |
| experienceCountryId | number | tbCountry.CountryId for where the experience actually takes place — this is the country the application itself is filed under. Use getCountryOptions to find a value. |
| availabilitySupplier | string |
| overnightLocationsQty | string |
{
"type": "object",
"required": [],
"properties": {
"zip": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"maxPax": {
"type": "string",
"description": "Maximum participants"
},
"mobile": {
"type": "string"
},
"street": {
"type": "string"
},
"daysQty": {
"type": "string",
"description": "Minimum 4 days, enforced server-side"
},
"website": {
"type": "string"
},
"comments": {
"type": "string"
},
"vatNumber": {
"type": "string",
"description": "Required if the postal country's vatNumberRequired flag is true (see getCountryOptions)"
},
"hasKitchen": {
"type": "boolean"
},
"description": {
"type": "string"
},
"businessName": {
"type": "string"
},
"hasInsurance": {
"type": "boolean"
},
"monthlyPrice": {
"type": "string",
"description": "Price per person (USD)"
},
"downloadSpeed": {
"type": "string"
},
"tourismNumber": {
"type": "string",
"description": "Required if the experience country's tourismNumberRequired flag is true (see getCountryOptions)"
},
"applicantEmail": {
"type": "string"
},
"experienceName": {
"type": "string"
},
"workFacilities": {
"enum": [
"None",
"Both",
"In Room",
"CoWorking Space"
],
"type": "string"
},
"businessModelId": {
"type": "number",
"description": "tbBusinessModel.EntryID — use getBusinessModelOptions. If the experience country's bookingModelsRestricted flag is true, only a 'StayDirect'-prefixed model is accepted."
},
"postalCountryId": {
"type": "number",
"description": "tbCountry.CountryId for the applicant's billing/postal address — used only to check whether a VAT number is required, and stored on the member's business profile (not on the application itself). Use getCountryOptions to find a value."
},
"applicantLastName": {
"type": "string",
"description": "Overrides the profile default for this application only — does not change the member's profile"
},
"laundryFacilities": {
"enum": [
"No",
"On Premises",
"Nearby"
],
"type": "string"
},
"applicantFirstName": {
"type": "string",
"description": "Overrides the profile default for this application only — does not change the member's profile"
},
"experienceCountryId": {
"type": "number",
"description": "tbCountry.CountryId for where the experience actually takes place — this is the country the application itself is filed under. Use getCountryOptions to find a value."
},
"availabilitySupplier": {
"type": "string"
},
"overnightLocationsQty": {
"type": "string"
}
}
}| businessName | string |
| monthlyPrice | string | Indicative monthly wholesale price in US dollars (USD) — the application is always priced in USD. Packages are priced in the owner's chosen currency later, after approval. |
| downloadSpeed | string |
| numberOfRooms | string |
| stayCountryId | number | tbCountry.CountryId for where the Stay is actually located — this is the country the application itself is filed under. Use getCountryOptions to find a value. |
| tourismNumber | string | Required if the stay country's tourismNumberRequired flag is true (see getCountryOptions) |
| applicantEmail | string |
| workFacilities | string |
| businessModelId | number | tbBusinessModel.EntryID — use getBusinessModelOptions. If the stay country's bookingModelsRestricted flag is true, only a 'StayDirect'-prefixed model is accepted. |
| postalCountryId | number | tbCountry.CountryId for the applicant's billing/postal address — used only to check whether a VAT number is required, and stored on the member's business profile (not on the application itself). Use getCountryOptions to find a value. |
| applicantLastName | string | Overrides the profile default for this application only — does not change the member's profile |
| laundryFacilities | string |
| applicantFirstName | string | Overrides the profile default for this application only — does not change the member's profile |
| availabilitySupplier | string |
{
"type": "object",
"required": [],
"properties": {
"zip": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"mobile": {
"type": "string"
},
"street": {
"type": "string"
},
"website": {
"type": "string"
},
"comments": {
"type": "string"
},
"stayName": {
"type": "string"
},
"vatNumber": {
"type": "string",
"description": "Required if the postal country's vatNumberRequired flag is true (see getCountryOptions)"
},
"hasKitchen": {
"type": "boolean"
},
"businessName": {
"type": "string"
},
"monthlyPrice": {
"type": "string",
"description": "Indicative monthly wholesale price in US dollars (USD) — the application is always priced in USD. Packages are priced in the owner's chosen currency later, after approval."
},
"downloadSpeed": {
"type": "string"
},
"numberOfRooms": {
"type": "string"
},
"stayCountryId": {
"type": "number",
"description": "tbCountry.CountryId for where the Stay is actually located — this is the country the application itself is filed under. Use getCountryOptions to find a value."
},
"tourismNumber": {
"type": "string",
"description": "Required if the stay country's tourismNumberRequired flag is true (see getCountryOptions)"
},
"applicantEmail": {
"type": "string"
},
"workFacilities": {
"enum": [
"None",
"Both",
"In Room",
"CoWorking Space"
],
"type": "string"
},
"businessModelId": {
"type": "number",
"description": "tbBusinessModel.EntryID — use getBusinessModelOptions. If the stay country's bookingModelsRestricted flag is true, only a 'StayDirect'-prefixed model is accepted."
},
"postalCountryId": {
"type": "number",
"description": "tbCountry.CountryId for the applicant's billing/postal address — used only to check whether a VAT number is required, and stored on the member's business profile (not on the application itself). Use getCountryOptions to find a value."
},
"applicantLastName": {
"type": "string",
"description": "Overrides the profile default for this application only — does not change the member's profile"
},
"laundryFacilities": {
"enum": [
"No",
"On Premises",
"Nearby"
],
"type": "string"
},
"applicantFirstName": {
"type": "string",
"description": "Overrides the profile default for this application only — does not change the member's profile"
},
"availabilitySupplier": {
"type": "string"
}
}
}| stayRoomFK |
| number |
| STRONGLY RECOMMENDED: the specific room this package covers (tbStaysRoom.EntryID). Call getMyStayRooms to find the right room id first. If omitted, the server guesses a room matching roomTypeFK, which may pick the wrong one when a Stay has multiple rooms of the same type. |
| description | string | OPTIONAL: package description |
| packageName* | string | Package name |
| advertisingEndpoint | string | OPTIONAL: only usable on Advertising-business-model Stays — ignored otherwise, matching the host UI which hides this field for all other business models. Check getBusinessModelOptions / the Stay's businessModelFK before setting. |
{
"type": "object",
"required": [
"stayId",
"packageName",
"currencyFK"
],
"properties": {
"listed": {
"type": "boolean",
"description": "OPTIONAL: whether the package is publicly listed"
},
"maxPax": {
"type": "number",
"description": "OPTIONAL: max occupancy for this package"
},
"prices": {
"type": "array",
"items": {
"type": "object",
"required": [
"days",
"buyPrice",
"listed"
],
"properties": {
"days": {
"enum": [
7,
14,
21,
30
],
"type": "number",
"description": "Length-of-stay tier in nights — must be one of 7, 14, 21, 30, the only tiers the host UI supports"
},
"listed": {
"type": "boolean",
"description": "Whether this price tier is publicly listed"
},
"buyPrice": {
"type": "number",
"description": "Internal cost basis. SellPrice is NOT settable — it is always server-computed from buyPrice (buyPrice / 0.88, or = buyPrice for Advertising-model Stays), matching the host UI exactly"
}
}
},
"description": "OPTIONAL: initial price tiers. If supplied, replaces all price rows for the package. Exactly one entry per 7/14/21/30-night tier used."
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"endDate": {
"type": "string",
"format": "date",
"description": "OPTIONAL: last check-in date this package is available for"
},
"startDate": {
"type": "string",
"format": "date",
"description": "OPTIONAL: first check-in date this package is available for"
},
"currencyFK": {
"type": "number",
"description": "REQUIRED: the currency this package is priced in — an id from getCurrencyOptions. Packages can use any supported currency; ASK the owner which one, never assume USD. All buyPrice values are in this currency."
},
"roomTypeFK": {
"type": "number",
"description": "OPTIONAL: room type id this package covers. Call getRoomTypeOptions for valid values."
},
"stayRoomFK": {
"type": "number",
"description": "STRONGLY RECOMMENDED: the specific room this package covers (tbStaysRoom.EntryID). Call getMyStayRooms to find the right room id first. If omitted, the server guesses a room matching roomTypeFK, which may pick the wrong one when a Stay has multiple rooms of the same type."
},
"description": {
"type": "string",
"description": "OPTIONAL: package description"
},
"packageName": {
"type": "string",
"description": "Package name"
},
"advertisingEndpoint": {
"type": "string",
"description": "OPTIONAL: only usable on Advertising-business-model Stays — ignored otherwise, matching the host UI which hides this field for all other business models. Check getBusinessModelOptions / the Stay's businessModelFK before setting."
}
}
}| OPTIONAL: other bed size, or empty for none |
| roomFacilityFk | array | OPTIONAL: facilityDetailId values from getRoomFacilityOptions() — the full set of amenities this room has. Wi-Fi is added automatically even if omitted. |
| roomDescription | string | OPTIONAL: room description |
{
"type": "object",
"required": [
"stayId",
"roomTitle"
],
"properties": {
"beds": {
"type": "number",
"description": "OPTIONAL: number of beds"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"maxPerson": {
"type": "number",
"description": "OPTIONAL: max occupancy"
},
"mcpRoomId": {
"type": "string",
"description": "OPTIONAL: external MCP room identifier to bind. NOT AVAILABLE for boutique Stays — the host UI has no field for this there, and the API will reject it."
},
"roomTitle": {
"type": "string",
"description": "Room name/title"
},
"roomTypeFK": {
"type": "number",
"description": "REQUIRED for non-boutique Stays — a roomTypeId from getRoomTypeOptions(stayId). IGNORED for boutique Stays — the next available Boutique1-6 slot is auto-assigned server-side, matching the host UI (which has no room-type picker for boutique room creation)."
},
"mainBedSize": {
"enum": [
"Single",
"Double",
"Twin",
"Queen",
"King",
"Other"
],
"type": "string",
"description": "OPTIONAL: main bed size"
},
"otherBedSize": {
"enum": [
"Single",
"Double",
"Twin",
"Queen",
"King",
"Other",
""
],
"type": "string",
"description": "OPTIONAL: other bed size, or empty for none"
},
"roomFacilityFk": {
"type": "array",
"items": {
"type": "number"
},
"description": "OPTIONAL: facilityDetailId values from getRoomFacilityOptions() — the full set of amenities this room has. Wi-Fi is added automatically even if omitted."
},
"roomDescription": {
"type": "string",
"description": "OPTIONAL: room description"
}
}
}| number |
| Duration of stay in days (e.g., 30 for 1 month, 90 for 3 months) |
{
"type": "object",
"required": [
"durationDays",
"maxPrice",
"currency"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results to return (default: 15)"
},
"currency": {
"type": "string",
"description": "Currency code (e.g., 'EUR', 'USD', 'GBP')"
},
"maxPrice": {
"type": "number",
"description": "Maximum price for the entire duration (e.g., 1000 for EUR 1000)"
},
"continent": {
"type": "string",
"description": "OPTIONAL: Continent name (e.g., 'Europe', 'Asia', 'Africa'). Filters results to stays in countries on this continent. If omitted, searches all continents globally."
},
"checkInDate": {
"type": "string",
"description": "OPTIONAL: Check-in date. Can be a full date (e.g., '2026-05-15'), a month name (e.g., 'May' ? uses May 1st), or omit for today (2026-01-19)"
},
"countryCode": {
"type": "string",
"description": "OPTIONAL: 2-letter country code (e.g., 'ES', 'PT') or country name (e.g., 'Spain'). If omitted, searches all countries globally."
},
"durationDays": {
"type": "number",
"description": "Duration of stay in days (e.g., 30 for 1 month, 90 for 3 months)"
}
}
}{
"type": "object",
"required": [
"packageId",
"checkIn",
"checkOut"
],
"properties": {
"pets": {
"type": "number",
"description": "Number of pets. Defaults to 0."
},
"rooms": {
"type": "number",
"description": "Number of rooms to book. Defaults to 1."
},
"adults": {
"type": "number",
"description": "Number of adult guests. Defaults to 1."
},
"checkIn": {
"type": "string",
"description": "Check-in date, YYYY-MM-DD"
},
"checkOut": {
"type": "string",
"description": "Check-out date, YYYY-MM-DD"
},
"children": {
"type": "number",
"description": "Number of child guests. Defaults to 0."
},
"packageId": {
"type": "number",
"description": "The Stay package's ID (from getPackages or search/browse tools)"
}
}
}| description | string |
| businessName | string |
| hasInsurance | boolean |
| monthlyPrice | string |
| applicationId* | number | The application's ID |
| downloadSpeed | string |
| tourismNumber | string |
| applicantEmail | string |
| experienceName | string |
| workFacilities | string |
| businessModelId | number | tbBusinessModel.EntryID — use getBusinessModelOptions. |
| postalCountryId | number | tbCountry.CountryId — used only for the VAT check, stored on the business profile, not on the application. Use getCountryOptions. |
| applicantLastName | string |
| laundryFacilities | string |
| applicantFirstName | string |
| experienceCountryId | number | tbCountry.CountryId — the country the application itself is filed under. Use getCountryOptions. |
| availabilitySupplier | string |
| overnightLocationsQty | string |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"zip": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"maxPax": {
"type": "string"
},
"mobile": {
"type": "string"
},
"street": {
"type": "string"
},
"daysQty": {
"type": "string",
"description": "Minimum 4 days, enforced server-side"
},
"website": {
"type": "string"
},
"comments": {
"type": "string"
},
"vatNumber": {
"type": "string"
},
"hasKitchen": {
"type": "boolean"
},
"description": {
"type": "string"
},
"businessName": {
"type": "string"
},
"hasInsurance": {
"type": "boolean"
},
"monthlyPrice": {
"type": "string"
},
"applicationId": {
"type": "number",
"description": "The application's ID"
},
"downloadSpeed": {
"type": "string"
},
"tourismNumber": {
"type": "string"
},
"applicantEmail": {
"type": "string"
},
"experienceName": {
"type": "string"
},
"workFacilities": {
"enum": [
"None",
"Both",
"In Room",
"CoWorking Space"
],
"type": "string"
},
"businessModelId": {
"type": "number",
"description": "tbBusinessModel.EntryID — use getBusinessModelOptions."
},
"postalCountryId": {
"type": "number",
"description": "tbCountry.CountryId — used only for the VAT check, stored on the business profile, not on the application. Use getCountryOptions."
},
"applicantLastName": {
"type": "string"
},
"laundryFacilities": {
"enum": [
"No",
"On Premises",
"Nearby"
],
"type": "string"
},
"applicantFirstName": {
"type": "string"
},
"experienceCountryId": {
"type": "number",
"description": "tbCountry.CountryId — the country the application itself is filed under. Use getCountryOptions."
},
"availabilitySupplier": {
"type": "string"
},
"overnightLocationsQty": {
"type": "string"
}
}
}| monthlyPrice |
| string |
| Indicative monthly wholesale price in US dollars (USD) — the application is always priced in USD. Packages are priced in the owner's chosen currency later, after approval. |
| applicationId* | number | The application's ID |
| downloadSpeed | string |
| numberOfRooms | string |
| stayCountryId | number | tbCountry.CountryId — the country the application itself is filed under. Use getCountryOptions. |
| tourismNumber | string |
| applicantEmail | string |
| workFacilities | string |
| businessModelId | number | tbBusinessModel.EntryID — use getBusinessModelOptions. |
| postalCountryId | number | tbCountry.CountryId — used only for the VAT check, stored on the business profile, not on the application. Use getCountryOptions. |
| applicantLastName | string |
| laundryFacilities | string |
| applicantFirstName | string |
| availabilitySupplier | string |
{
"type": "object",
"required": [
"applicationId"
],
"properties": {
"zip": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"mobile": {
"type": "string"
},
"street": {
"type": "string"
},
"website": {
"type": "string"
},
"comments": {
"type": "string"
},
"stayName": {
"type": "string"
},
"vatNumber": {
"type": "string"
},
"hasKitchen": {
"type": "boolean"
},
"businessName": {
"type": "string"
},
"monthlyPrice": {
"type": "string",
"description": "Indicative monthly wholesale price in US dollars (USD) — the application is always priced in USD. Packages are priced in the owner's chosen currency later, after approval."
},
"applicationId": {
"type": "number",
"description": "The application's ID"
},
"downloadSpeed": {
"type": "string"
},
"numberOfRooms": {
"type": "string"
},
"stayCountryId": {
"type": "number",
"description": "tbCountry.CountryId — the country the application itself is filed under. Use getCountryOptions."
},
"tourismNumber": {
"type": "string"
},
"applicantEmail": {
"type": "string"
},
"workFacilities": {
"enum": [
"None",
"Both",
"In Room",
"CoWorking Space"
],
"type": "string"
},
"businessModelId": {
"type": "number",
"description": "tbBusinessModel.EntryID — use getBusinessModelOptions."
},
"postalCountryId": {
"type": "number",
"description": "tbCountry.CountryId — used only for the VAT check, stored on the business profile, not on the application. Use getCountryOptions."
},
"applicantLastName": {
"type": "string"
},
"laundryFacilities": {
"enum": [
"No",
"On Premises",
"Nearby"
],
"type": "string"
},
"applicantFirstName": {
"type": "string"
},
"availabilitySupplier": {
"type": "string"
}
}
}{
"type": "object",
"required": [
"firstName",
"lastName",
"email",
"telephone",
"password",
"acceptGdpr"
],
"properties": {
"email": {
"type": "string",
"description": "A real email address the person controls — the confirmation link is sent here and the account stays inactive until it's clicked"
},
"lastName": {
"type": "string",
"description": "The person's last name"
},
"password": {
"type": "string",
"description": "Account password, minimum 6 characters"
},
"firstName": {
"type": "string",
"description": "The person's first name"
},
"telephone": {
"type": "string",
"description": "Contact telephone number"
},
"acceptGdpr": {
"type": "boolean",
"description": "Must be true, and only after showing the person this statement and getting their explicit agreement (the same wording as the website's sign-up form): \"I accept the Terms & Conditions (https://www.nomadstays.com/terms-and-conditions) and Privacy Policy (https://www.nomadstays.com/privacy), that the information collected is processed by Nomad Stays in order to receive the service, and I consent to analytics and advertising cookies as described in the Cookie Policy (https://www.nomadstays.com/cookies) and to receiving updates & newsletters.\" Never assume agreement on the person's behalf."
}
}
}| bookingEmail |
| string |
| Email guests use to reach the Stay about bookings |
| bookingPhone | string |
| facebookPage | string |
| hostFullName | string | Display name shown to guests as the host |
| managerEmail | string |
| bookingMobile | string |
| managerMobile | string |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"tikTok": {
"type": "string"
},
"twitter": {
"type": "string",
"description": "X (Twitter) profile link"
},
"website": {
"type": "string"
},
"youtube": {
"type": "string"
},
"linkedIn": {
"type": "string"
},
"instagram": {
"type": "string"
},
"ownerName": {
"type": "string"
},
"ownerEmail": {
"type": "string"
},
"managerName": {
"type": "string",
"description": "The day-to-day contact person's name (not necessarily the owner)"
},
"ownerMobile": {
"type": "string"
},
"bookingEmail": {
"type": "string",
"description": "Email guests use to reach the Stay about bookings"
},
"bookingPhone": {
"type": "string"
},
"facebookPage": {
"type": "string"
},
"hostFullName": {
"type": "string",
"description": "Display name shown to guests as the host"
},
"managerEmail": {
"type": "string"
},
"bookingMobile": {
"type": "string"
},
"managerMobile": {
"type": "string"
}
}
}| postCode | string |
| checkInTo | string |
| countryId | string | A country ID from getCountryOptions — NOT a country name. |
| parkingId | string | An optionId from getAdditionalInformationOptions(filterName='Parking') — NOT a boolean. |
| checkOutTo | string |
| cxPolicyId | string | A cxPolicyId from getCancellationPolicyOptions. |
| stayTypeId | number | A stayTypeId from getStayTypeOptions. |
| totalRooms | number |
| checkInFrom | string |
| fullPayment | boolean | Whether guests must pay in full up front (vs. pay on arrival). Only settable if the Stay's country allows it — check fullPaymentAllowedByCountry from getMyStayOrganisationalData first; writing true when the country doesn't allow it will be rejected. |
| checkOutFrom | string |
| earlyCheckIn | boolean |
| lateCheckout | boolean |
| petsAllowedId | string | An optionId from getAdditionalInformationOptions(filterName='Pets Allowed') — NOT a boolean. |
| tourismNumber | string |
| receiveReviews | boolean |
| childrenAllowedId | string | An optionId from getAdditionalInformationOptions(filterName='Children Allowed') — NOT a boolean. |
| customCxPolicyLink | string |
| registeredBusiness | boolean | Whether the Stay is officially registered for tourism/lodging |
| landRegistrationNumber | string |
| checkinLocationWhat3Words | string | what3words location for guest check-in |
{
"type": "object",
"required": [
"stayId"
],
"properties": {
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"geoLat": {
"type": "number",
"description": "Map pin latitude"
},
"geoLng": {
"type": "number",
"description": "Map pin longitude"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"address": {
"type": "string"
},
"reason1": {
"type": "string",
"description": "First 'Why Choose Us' reason shown to guests"
},
"reason2": {
"type": "string"
},
"reason3": {
"type": "string"
},
"postCode": {
"type": "string"
},
"checkInTo": {
"type": "string"
},
"countryId": {
"type": "string",
"description": "A country ID from getCountryOptions — NOT a country name."
},
"parkingId": {
"type": "string",
"description": "An optionId from getAdditionalInformationOptions(filterName='Parking') — NOT a boolean."
},
"checkOutTo": {
"type": "string"
},
"cxPolicyId": {
"type": "string",
"description": "A cxPolicyId from getCancellationPolicyOptions."
},
"stayTypeId": {
"type": "number",
"description": "A stayTypeId from getStayTypeOptions."
},
"totalRooms": {
"type": "number"
},
"checkInFrom": {
"type": "string"
},
"fullPayment": {
"type": "boolean",
"description": "Whether guests must pay in full up front (vs. pay on arrival). Only settable if the Stay's country allows it — check fullPaymentAllowedByCountry from getMyStayOrganisationalData first; writing true when the country doesn't allow it will be rejected."
},
"checkOutFrom": {
"type": "string"
},
"earlyCheckIn": {
"type": "boolean"
},
"lateCheckout": {
"type": "boolean"
},
"petsAllowedId": {
"type": "string",
"description": "An optionId from getAdditionalInformationOptions(filterName='Pets Allowed') — NOT a boolean."
},
"tourismNumber": {
"type": "string"
},
"receiveReviews": {
"type": "boolean"
},
"childrenAllowedId": {
"type": "string",
"description": "An optionId from getAdditionalInformationOptions(filterName='Children Allowed') — NOT a boolean."
},
"customCxPolicyLink": {
"type": "string"
},
"registeredBusiness": {
"type": "boolean",
"description": "Whether the Stay is officially registered for tourism/lodging"
},
"landRegistrationNumber": {
"type": "string"
},
"checkinLocationWhat3Words": {
"type": "string",
"description": "what3words location for guest check-in"
}
}
}| roomTypeFK | number | Call getRoomTypeOptions for valid values. |
| stayRoomFK | number | The specific room this package covers (tbStaysRoom.EntryID). Call getMyStayRooms to find valid values. |
| description | string |
| packageName | string |
| advertisingEndpoint | string | OPTIONAL: only usable on Advertising-business-model Stays — ignored otherwise, matching the host UI which hides this field for all other business models. |
{
"type": "object",
"required": [
"stayId",
"packageId"
],
"properties": {
"listed": {
"type": "boolean"
},
"maxPax": {
"type": "number"
},
"prices": {
"type": "array",
"items": {
"type": "object",
"required": [
"days",
"buyPrice",
"listed"
],
"properties": {
"days": {
"enum": [
7,
14,
21,
30
],
"type": "number",
"description": "Length-of-stay tier in nights — must be one of 7, 14, 21, 30"
},
"listed": {
"type": "boolean"
},
"buyPrice": {
"type": "number",
"description": "Internal cost basis. SellPrice is NOT settable — always server-computed from buyPrice"
}
}
},
"description": "OPTIONAL: replaces ALL price rows for this package when supplied. Exactly one entry per 7/14/21/30-night tier used."
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"endDate": {
"type": "string",
"format": "date",
"description": "OPTIONAL: last check-in date this package is available for"
},
"isActive": {
"type": "boolean",
"description": "OPTIONAL: archive (false) or restore (true) this package — cascades to 'listed' on all its price tiers, matching the host UI's Archive/Restore actions"
},
"packageId": {
"type": "number",
"description": "The package's EntryID (tbStayPackages)"
},
"startDate": {
"type": "string",
"format": "date",
"description": "OPTIONAL: first check-in date this package is available for"
},
"currencyFK": {
"type": "number",
"description": "Call getCurrencyOptions for valid values."
},
"roomTypeFK": {
"type": "number",
"description": "Call getRoomTypeOptions for valid values."
},
"stayRoomFK": {
"type": "number",
"description": "The specific room this package covers (tbStaysRoom.EntryID). Call getMyStayRooms to find valid values."
},
"description": {
"type": "string"
},
"packageName": {
"type": "string"
},
"advertisingEndpoint": {
"type": "string",
"description": "OPTIONAL: only usable on Advertising-business-model Stays — ignored otherwise, matching the host UI which hides this field for all other business models."
}
}
}| array |
| The FULL replacement list of facilityDetailId values from getRoomFacilityOptions() — anything not included will be removed (except Wi-Fi, which is always kept). |
| roomDescription | string |
{
"type": "object",
"required": [
"stayId",
"roomId"
],
"properties": {
"beds": {
"type": "number"
},
"roomId": {
"type": "number",
"description": "The room's EntryID (tbStaysRoom) — use getMyStayRooms to find it"
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID"
},
"maxPerson": {
"type": "number"
},
"mcpRoomId": {
"type": "string",
"description": "External MCP room identifier. NOT AVAILABLE for boutique Stays — the host UI has no field for this there, and the API will reject it."
},
"roomTitle": {
"type": "string"
},
"roomTypeFK": {
"type": "number",
"description": "A roomTypeId from getRoomTypeOptions(stayId)."
},
"mainBedSize": {
"enum": [
"Single",
"Double",
"Twin",
"Queen",
"King",
"Other"
],
"type": "string"
},
"otherBedSize": {
"enum": [
"Single",
"Double",
"Twin",
"Queen",
"King",
"Other",
""
],
"type": "string"
},
"roomFacilityFk": {
"type": "array",
"items": {
"type": "number"
},
"description": "The FULL replacement list of facilityDetailId values from getRoomFacilityOptions() — anything not included will be removed (except Wi-Fi, which is always kept)."
},
"roomDescription": {
"type": "string"
}
}
}| roomId | number | Required when area is 'room' — the room's EntryID (use getMyStayRooms to find it). Ignored for other areas. |
| stayId* | number | The Stay's EntryID (use getMyStays to find it) |
{
"type": "object",
"required": [
"stayId",
"area"
],
"properties": {
"url": {
"type": "string",
"description": "A public https:// URL the server can download the image from (e.g. a Google Drive or Dropbox share link). Supply this OR base64, not both."
},
"area": {
"enum": [
"listing",
"main",
"workspace",
"host",
"room"
],
"type": "string",
"description": "Which photo area this belongs to:\n- 'listing': general Stay gallery photos (multiple allowed, min 1920x1080 landscape)\n- 'main': the single hero/cover photo shown first for the Stay (min 1920x1080 landscape, replaces any existing main photo)\n- 'workspace': coworking/workspace photos for the whole Stay (multiple allowed, min 1920x1080 landscape)\n- 'host': a photo of the HOST/CONTACT PERSON, not the property — must be PORTRAIT orientation, min 1080x1350 (replaces any existing host photo)\n- 'room': photos for one specific room — requires roomId (multiple allowed, min 1920x1080 landscape)"
},
"base64": {
"type": "string",
"description": "Base64-encoded JPEG, PNG, or WebP image bytes (a data:image/...;base64,... URI prefix is also accepted and stripped automatically). Supply this OR url, not both. Under ~27MB encoded (20MB image)."
},
"roomId": {
"type": "number",
"description": "Required when area is 'room' — the room's EntryID (use getMyStayRooms to find it). Ignored for other areas."
},
"stayId": {
"type": "number",
"description": "The Stay's EntryID (use getMyStays to find it)"
}
}
}