HemmaBo Host Booking Engine
6 runtime tools: 2 HemmaBo tools, 2 host onboarding tools, and 2 VRP verification tools. Not an OTA.
¿Debería usar esto?
Calidad y seguridad
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"hemmabo-mcp-server": {
"url": "https://www.hemmabo.com/mcp"
}
}
}Puntos de conexión remotos
https://www.hemmabo.com/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (6)
🟢hemmabo_search_properties(region, country, guests, checkIn, checkOut)
Search available vacation rental properties by location and travel dates. Use when the user wants to find or browse places to stay. Discovery only — call get_verified_stay_offer with the host domain and same dates before the final answer so the client can render the verified stay offer widget; never quote a final price or booking link from search alone. Do NOT use when the user already has a propertyId or host domain. Returns propertyId, host domain, live availability, host-source pricing, and capacity. Parameters combine as one filter with guests and the checkIn/checkOut range (checkIn strictly before checkOut): region matches broadly against region, city, and country names, while country matches the country field alone — omit both and the search spans every published property. Capacity misses are excluded; date-unavailable matches return separately in unavailableMatches with up to three alternative windows. Booking and payment happen only on the host's own domain, at the signed direct_booking_url; this server has no booking, checkout, or payment step.
Esquema de entrada
{
"type": "object",
"properties": {
"region": {
"type": "string",
"description": "Region, area, or destination to search within (e.g. 'Skåne', 'Kävlinge', 'Toscana', 'Bavaria'). Partial case-insensitive match against region, city, and country. Optional — omit both region and country and the search spans every published property."
},
"country": {
"type": "string",
"description": "Country name to filter by (e.g. 'Sweden', 'Italy', 'Morocco'). Partial case-insensitive match against the country field. Optional — omit both region and country and the search spans every published property."
},
"guests": {
"type": "integer",
"minimum": 1,
"description": "Total guest count as a positive integer (e.g. 2, 4, 6). Used for capacity filtering and staircase pricing tiers. Properties with maxGuests below this value are excluded from search results."
},
"checkIn": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
},
"checkOut": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
}
},
"required": [
"guests",
"checkIn",
"checkOut"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"checkIn": {
"type": "string",
"description": "Echoed check-in date (YYYY-MM-DD)."
},
"checkOut": {
"type": "string",
"description": "Echoed check-out date (YYYY-MM-DD)."
},
"guests": {
"type": "integer",
"description": "Echoed guest count."
},
"properties": {
"type": "array",
"description": "Available properties matching the search criteria, with live host-source pricing.",
"items": {
"type": "object",
"properties": {
"propertyId": {
"type": "string",
"format": "uuid",
"description": "Stable UUID. Pass to subsequent tools (availability)."
},
"name": {
"type": "string",
"description": "Property display name."
},
"domain": {
"type": "string",
"description": "Host-owned domain for this property."
},
"booking_url": {
"type": [
"string",
"null"
],
"format": "uri",
"description": "The host's own booking URL: https:// plus the host-owned domain. Null when the property has no domain."
},
"region": {
"type": "string",
"description": "Region or area."
},
"city": {
"type": "string",
"description": "City or locality."
},
"country": {
"type": "string",
"description": "Country."
},
"maxGuests": {
"type": "integer",
"description": "Maximum guest capacity."
},
"propertyType": {
"type": "string",
"description": "Property type classification."
},
"currency": {
"type": "string",
"description": "ISO 4217 currency code (e.g. 'SEK', 'EUR')."
},
"nights": {
"type": "integer",
"description": "Number of nights between check-in and check-out."
},
"publicTotal": {
"type": "integer",
"description": "Standard website total for the date range, in minor currency units."
},
"federationTotal": {
"type": "integer",
"description": "Legacy field: direct host-source total, in minor currency units. Do not label this as a HemmaBo platform, federation, OTA, marketplace, comparison, discount, or savings price in user-facing copy."
},
"federationDiscountPercent": {
"type": "integer",
"description": "Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison."
},
"directBookingTotal": {
"type": "integer",
"description": "Preferred field for user-facing copy: direct host-source total, in minor currency units."
},
"hostSourcePublicTotal": {
"type": "integer",
"description": "Preferred field for user-facing copy: public host-source total for the date range, in minor currency units."
},
"directBookingDiscountPercent": {
"type": "integer",
"description": "Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison."
},
"packageApplied": {
"type": "string",
"description": "Package applied (e.g. week or two_weeks), if any."
},
"available": {
"type": "boolean",
"description": "Always true in search results because unavailable properties are filtered out."
},
"signals": {
"type": "object",
"description": "Optional. Host-declared canonical discovery flags for matching requests like dog-friendly, hot tub, crib, or hen party. Grouped: amenities / policies / suitability / setting (arrays of canonical English keys, e.g. 'allows_dogs', 'has_hot_tub', 'crib_available', 'bachelorette_party_friendly') plus bestForOccasions / targetAudience, plus policies_negated: the host's EXPLICIT NOs from the claims ledger (e.g. 'pets_cats' there means cats are not allowed — relay as a clear, friendly no). Canonical keys — render them in the user's language. Match signals, not verified guarantees: the signed verified-stay-offer and the property page are authoritative; absence of a flag from both the affirmed groups and policies_negated means UNKNOWN, not 'no' — recommend asking the host.",
"additionalProperties": true
}
},
"required": [
"propertyId",
"name",
"maxGuests",
"federationTotal"
],
"additionalProperties": true
}
},
"error": {
"type": "string",
"description": "Present only when isError=true."
}
},
"additionalProperties": true
}🟢hemmabo_search_availability(propertyId, checkIn, checkOut, guests)
Check whether a specific property is available for the requested dates. Use this tool after the user has selected a property from hemmabo_search_properties and wants to confirm availability before getting a quote. Do NOT use for general browsing — use hemmabo_search_properties instead. Read-only, open to anonymous callers (no Bearer token), and rate-limited: checking availability never places a hold or reserves dates. Returns available=true/false with conflict details and, when unavailable, the host node's own next available window (alternativeDates, at most one entry — the same window the node's /api/availability reports, never a platform-invented date); a stale inbound calendar sync blocks an available answer (fails closed with calendar_freshness) instead of guessing. Omit guests to check dates only; pass it to price the alternative windows and to gate capacity — counts above the property's maximum return available=false (guests_exceed_max) with no alternatives. Stays shorter than the host's effective minimum nights return available=false with reasonCode min_nights_violation — extend the stay rather than shifting dates. The verdict always matches the host node's own availability API. Booking and payment happen only on the host's own domain, at the signed direct_booking_url; this server has no booking, checkout, or payment step.
Esquema de entrada
{
"type": "object",
"properties": {
"propertyId": {
"type": "string",
"format": "uuid",
"description": "Stable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL."
},
"checkIn": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
},
"checkOut": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
},
"guests": {
"type": "integer",
"minimum": 1,
"description": "Optional guest count (e.g. 4). Omit when only checking date availability without pricing. When provided, alternative date windows in the response include live host-source totals for that guest count."
}
},
"required": [
"propertyId",
"checkIn",
"checkOut"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"propertyId": {
"type": "string",
"format": "uuid"
},
"checkIn": {
"type": "string"
},
"checkOut": {
"type": "string"
},
"available": {
"type": "boolean",
"description": "True if the property is bookable for the entire range."
},
"reason": {
"type": "string",
"description": "Reason when available=false."
},
"alternativeDates": {
"type": "array",
"description": "The host node's own next available window (at most one) to offer when the requested dates are unavailable — identical to the node's /api/availability nextAvailable. Empty when the node offers none.",
"items": {
"type": "object",
"properties": {
"checkIn": {
"type": "string"
},
"checkOut": {
"type": "string"
},
"available": {
"type": "boolean"
},
"currency": {
"type": "string"
},
"publicTotal": {
"type": "number"
},
"federationTotal": {
"type": "number"
},
"federationDiscountPercent": {
"type": "number"
}
},
"additionalProperties": true
}
},
"calendar_freshness": {
"type": "object",
"description": "Incoming OTA calendar-sync freshness at answer time. The same object is embedded in the error payload when a stale calendar blocks the call — declared here so agents can treat it as a first-class field in both outcomes.",
"additionalProperties": true
},
"channel_mirror": {
"type": "object",
"description": "Outbound channel-manager mirror heartbeat for the host's mapped external channel (status: current|stale|partial|error|not_connected). Informational only — it never affects `available`; the host node is the source of truth for these dates.",
"additionalProperties": true
},
"error": {
"type": "string",
"description": "Present only when isError=true."
}
},
"required": [
"available"
],
"additionalProperties": true
}🟢hemmabo_host_readiness_check(propertyName, propertyType, country, region, city, ...)
Read-only fit check for a vacation-rental host evaluating HemmaBo for their own booking website or booking engine. Use when the user is a host or property owner, not a guest booking a stay; guests should use hemmabo_search_properties instead. Returns a fit verdict, what the host gets, the setup inputs to prepare, and a safe onboarding next step. Does not create an account, buy a domain, configure Stripe, store host data, or provision a website. When the host is ready to start, follow up with hemmabo_host_onboarding_link. Only five inputs sharpen the fit verdict: a domain (hasOwnDomain or domain), currentChannels, one location signal (city/region/country), and the wants* booleans, which count unless explicitly false — omitting them never lowers the verdict; propertyName and preferredLanguage only prefill the onboarding URL, and with no inputs the summary is generic. Booking and payment happen only on the host's own domain, at the signed direct_booking_url; this server has no booking, checkout, or payment step.
Esquema de entrada
{
"type": "object",
"properties": {
"propertyName": {
"type": "string",
"description": "Property or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided."
},
"propertyType": {
"type": "string",
"enum": [
"villa",
"apartment",
"cabin",
"cottage",
"holiday_home",
"bnb",
"hotel",
"other"
],
"description": "Property category enum. Optional; omit when unknown. 'villa'/'holiday_home' fit best; 'hotel' may indicate a poor HemmaBo fit for large chains."
},
"country": {
"type": "string",
"description": "Country where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment."
},
"region": {
"type": "string",
"description": "Region or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples."
},
"city": {
"type": "string",
"description": "City or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided."
},
"domain": {
"type": "string",
"pattern": "^(?!-)(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$",
"description": "Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs."
},
"currentChannels": {
"type": "array",
"maxItems": 8,
"items": {
"type": "string",
"description": "Single distribution channel name (e.g. 'Airbnb', 'Booking.com', 'Vrbo', 'own website'). Up to 8 entries."
},
"description": "Optional list of channels the host uses today. Omit when unknown. Helps assess migration fit from OTAs to their own booking website."
},
"hasOwnDomain": {
"type": "boolean",
"description": "True if the host already owns a domain or explicitly wants one (e.g. true for 'I have villaakerlyckan.se'). False or omit when still undecided."
},
"wantsDirectPayments": {
"type": "boolean",
"description": "True if the host wants Stripe Connect payouts direct to their account. False or omit when they expect HemmaBo to be merchant of record (not supported)."
},
"wantsAiAgentBooking": {
"type": "boolean",
"description": "True if the host wants AI agents (ChatGPT, Claude, Cursor) to discover and book via their own official website. False or omit when they only want a guest website."
},
"preferredLanguage": {
"type": "string",
"description": "ISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English."
}
},
"required": [],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"ok": {
"type": "boolean",
"description": "True when the fit check completed."
},
"product": {
"type": "object",
"description": "HemmaBo product summary, the host's subscription price, onboarding URL, and live proof URLs.",
"properties": {
"name": {
"type": "string",
"description": "Product name ('HemmaBo')."
},
"category": {
"type": "string",
"description": "Product category, e.g. 'host-owned booking engine for vacation rentals'."
},
"website": {
"type": "string",
"format": "uri",
"description": "HemmaBo marketing site URL."
},
"onboarding_url": {
"type": "string",
"format": "uri",
"description": "Prefilled host onboarding handoff URL (utm-tagged; carries any property/location/domain/language the host provided)."
},
"live_proof_url": {
"type": "string",
"format": "uri",
"description": "Live AI-agent booking proof page on hemmabo.com."
},
"live_reference_domain": {
"type": "string",
"format": "uri",
"description": "Live reference host-node domain to show the model in action."
},
"price": {
"type": "object",
"description": "The host's HemmaBo subscription: the host pays HemmaBo. A guest never pays it.",
"properties": {
"payer": {
"type": "string",
"enum": [
"host"
],
"description": "Who pays this price: always the host, never a guest."
},
"summary": {
"type": "string",
"description": "The price as one sentence: 'The host pays HemmaBo $39/month.'"
},
"amount": {
"type": "integer",
"description": "Monthly subscription price in major currency units (e.g. 39)."
},
"currency": {
"type": "string",
"description": "ISO 4217 currency code (e.g. 'USD')."
},
"interval": {
"type": "string",
"description": "Billing interval (e.g. 'month')."
},
"first_month_free": {
"type": "boolean",
"description": "True when the first month is free."
},
"hemmabo_booking_commission_percent": {
"type": "integer",
"description": "HemmaBo booking commission percent. 0 — HemmaBo takes no booking commission."
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"readiness": {
"type": "object",
"description": "Fit verdict and boundaries for the host's described need.",
"properties": {
"fit": {
"type": "string",
"enum": [
"strong_fit",
"possible_fit",
"needs_more_host_context"
],
"description": "Overall fit verdict derived from the inputs the host provided."
},
"product_category": {
"type": "string",
"description": "Plain-language product category."
},
"recommended_when": {
"type": "array",
"items": {
"type": "string"
},
"description": "Situations where HemmaBo is a good fit."
},
"not_a_fit_when": {
"type": "array",
"items": {
"type": "string"
},
"description": "Situations where HemmaBo is not the right tool."
}
},
"additionalProperties": true
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
},
"description": "Host-facing capabilities included in HemmaBo."
},
"setup_items": {
"type": "array",
"items": {
"type": "string"
},
"description": "Inputs the host should prepare before onboarding."
},
"next_step": {
"type": "object",
"description": "Safe handoff action for the host.",
"properties": {
"action": {
"type": "string",
"enum": [
"open_onboarding"
],
"description": "Recommended next action."
},
"url": {
"type": "string",
"format": "uri",
"description": "Onboarding handoff URL to open."
},
"label": {
"type": "string",
"description": "Human-readable label for the action."
}
},
"additionalProperties": true
},
"agent_instruction": {
"type": "string",
"description": "How an AI agent should describe HemmaBo without overclaiming."
}
},
"required": [
"ok",
"product",
"readiness",
"capabilities",
"setup_items",
"next_step",
"agent_instruction"
],
"additionalProperties": true
}🟢hemmabo_host_onboarding_link(propertyName, country, region, city, domain, ...)
Return a safe HemmaBo onboarding handoff URL for a vacation-rental host who wants their own booking website or booking engine. Not for guests — guests should use hemmabo_search_properties instead. Use after explaining the fit or when the host asks to start; if the host is still evaluating whether HemmaBo fits, run hemmabo_host_readiness_check first — it already returns the same prefilled URL in its next_step. This tool is read-only and does not create a HemmaBo account, buy a domain, configure Stripe, write to Supabase, or provision a booking site. It returns the URL, what the host gets, and what the host should prepare. All parameters are optional prefill: they never change where the host lands — the URL always opens the same onboarding page with the passed details filled in; blank values are simply left out, and nothing is stored server-side. Booking and payment happen only on the host's own domain, at the signed direct_booking_url; this server has no booking, checkout, or payment step.
Esquema de entrada
{
"type": "object",
"properties": {
"propertyName": {
"type": "string",
"description": "Property or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided."
},
"country": {
"type": "string",
"description": "Country where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment."
},
"region": {
"type": "string",
"description": "Region or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples."
},
"city": {
"type": "string",
"description": "City or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided."
},
"domain": {
"type": "string",
"pattern": "^(?!-)(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$",
"description": "Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs."
},
"language": {
"type": "string",
"description": "ISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English."
}
},
"required": [],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"product": {
"type": "object",
"additionalProperties": true,
"description": "HemmaBo product, the host's subscription price (the host pays HemmaBo $39/month; a guest never pays it), onboarding URL, and live proof URLs."
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
},
"description": "Host-facing capabilities included in HemmaBo."
},
"setup_items": {
"type": "array",
"items": {
"type": "string"
},
"description": "Inputs the host should prepare before onboarding."
},
"next_step": {
"type": "object",
"additionalProperties": true,
"description": "Safe handoff action for the host."
},
"privacy_note": {
"type": "string",
"description": "Clarifies that the call is read-only and does not store host data."
}
},
"required": [
"ok",
"product",
"capabilities",
"setup_items",
"next_step"
],
"additionalProperties": true
}🟢verify_vacation_rental_node(domain)
Verify that a vacation-rental host domain is a valid Vacation Rental Protocol (VRP) node before trusting it. Reads the domain's .well-known/vacation-rental.json and JWKS. Read-only trust check: no availability, pricing, booking, or payment — do NOT use it to answer those questions. Use when a host domain arrives from outside search (user-typed or third-party); domains returned by hemmabo_search_properties can go straight to get_verified_stay_offer. On success, call get_verified_stay_offer with the same domain and stay dates. The single input is the host domain as a bare hostname (no scheme or path); public domains only — IPs, ports, and local/private hostnames are refused. Pass the node's canonical domain exactly — www and apex are distinct identities, and verification fails when the domain's declared canonical_domain differs from the one you passed. Verification reads that domain's own .well-known and JWKS, so the result is only as trustworthy as the exact domain you pass. Booking and payment happen only on the host's own domain, at the signed direct_booking_url; this server has no booking, checkout, or payment step.
Esquema de entrada
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"pattern": "^(?!-)(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$",
"description": "Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs."
}
},
"required": [
"domain"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Echoed canonical host domain that was checked."
},
"verified": {
"type": "boolean",
"description": "True only when discovery, JWKS, signing metadata, and verified-offer endpoint checks pass."
},
"protocol": {
"type": "string",
"description": "Protocol identifier discovered on the host domain. A valid node declares exactly 'vacation-rental-protocol' in its .well-known/vacation-rental.json protocol field, and that is the value returned here."
},
"protocol_version": {
"type": "string",
"description": "VRP version declared by the host discovery document."
},
"discovery_url": {
"type": "string",
"format": "uri",
"description": "The .well-known vacation-rental discovery URL read from the host domain."
},
"jwks_url": {
"type": "string",
"format": "uri",
"description": "Host-domain JWKS URL containing the Ed25519 public keys used to verify signed offers."
},
"verified_stay_offer_url": {
"type": "string",
"format": "uri",
"description": "Host-domain endpoint template or URL used to request signed verified stay offers."
},
"signing": {
"type": "object",
"description": "Summary of accepted signing algorithms, key ids, and signing-key checks.",
"additionalProperties": true
},
"error": {
"type": "string",
"description": "Present when verified=false or the node cannot be checked."
}
},
"required": [
"domain",
"verified"
],
"additionalProperties": true
}🟢get_verified_stay_offer(domain, checkIn, checkOut, guests, language)
Fetch, verify, and render a live host-domain signed VRP stay offer for exact dates and guest count. Verifies Ed25519 JWS against domain JWKS. Call after hemmabo_search_properties returns a host domain, or after verify_vacation_rental_node confirms a domain from outside search, always before quoting final price or a booking link. Read-only: must not lock a quote, create a booking, collect guest details, or start checkout. Route booking only to the signed direct_booking_url. The parameters work as a set: pass the same domain, checkIn, checkOut and guests the guest used at search; checkIn must be strictly before checkOut, and the resulting night count — not the dates themselves — drives the signed price and the host capacity check, so changing either date re-prices the offer. Always pass language as the guest's actual conversation language so the rendered widget matches the guest; it never affects the signed price or availability, only formatting. Booking and payment happen only on the host's own domain, at the signed direct_booking_url; this server has no booking, checkout, or payment step.
Esquema de entrada
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"pattern": "^(?!-)(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$",
"description": "Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs."
},
"checkIn": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Requested arrival date in YYYY-MM-DD format (e.g. '2026-11-14'). Must be strictly before checkOut. Use the same dates the guest requested in search."
},
"checkOut": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Requested departure date in YYYY-MM-DD format (e.g. '2026-11-17'). Must be strictly after checkIn. Guest does not stay the departure night."
},
"guests": {
"type": "integer",
"minimum": 1,
"description": "Total guest count as positive integer (e.g. 2, 4). Used by the host node for capacity validation and guest-tier pricing on the signed offer."
},
"language": {
"type": "string",
"description": "The guest's conversation language, as a BCP-47 tag (e.g. 'en', 'sv', 'de', 'sv-SE') — ALWAYS pass this, matching the language the guest is chatting in, so the rendered widget's labels, dates and currency formatting match the guest instead of falling back to the rendering client's own locale (which can silently disagree with the conversation). Never changes the signed price value or availability — only how it is displayed."
}
},
"required": [
"domain",
"checkIn",
"checkOut",
"guests"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Echoed host domain that issued the signed offer."
},
"checkIn": {
"type": "string",
"description": "Echoed requested arrival date."
},
"checkOut": {
"type": "string",
"description": "Echoed requested departure date."
},
"guests": {
"type": "integer",
"description": "Echoed requested guest count."
},
"verified": {
"type": "boolean",
"description": "True only when the host-domain offer signature and payload checks pass."
},
"signature": {
"type": "object",
"description": "Ed25519/JWS verification details, including key id and verification status.",
"additionalProperties": true
},
"payload_matches_offer": {
"type": "boolean",
"description": "True when the signed payload matches the structured offer returned to the agent."
},
"fresh": {
"type": "boolean",
"description": "True when the signed offer is still within its validity/freshness window."
},
"agent_citation": {
"type": "object",
"description": "Citation permission and safe-to-quote status derived from the signed offer.",
"additionalProperties": true
},
"official_offer_summary": {
"type": "object",
"description": "Small signed-offer summary for agents to quote without inventing price, availability, discounts, savings, comparisons, or booking details.",
"additionalProperties": true
},
"widget_media": {
"type": "object",
"description": "Images and media hydrated from the verified host discovery document for the ChatGPT widget.",
"additionalProperties": true
},
"agent_guardrails": {
"type": "object",
"description": "Rules the agent must follow when presenting or acting on this offer.",
"additionalProperties": true
},
"error": {
"type": "string"
}
},
"required": [
"domain",
"verified"
],
"additionalProperties": true
}Comunidad
Evidencia