{"openapi":"3.1.0","info":{"title":"City of Trees House public agent API","version":"1.0.0","description":"Public facts, bounded availability, and anonymous quotes. Feature availability is controlled at runtime; disabled endpoints return 503 AGENT_API_DISABLED. Quotes expire after 30 minutes and do not reserve dates. Inventory is based on confirmed direct bookings and synchronized channel calendars; channel updates may be delayed. Payment and booking require the guest-facing checkout, fresh review, payment authorization, and identity verification. No API credential grants booking, guest-data, cancellation, or refund authority. Data handling for the agent API and MCP server: /agents#agent-data."},"servers":[{"url":"https://cityoftrees.house"}],"paths":{"/api/agent/v1/property":{"get":{"operationId":"getProperty","summary":"Read public property facts","responses":{"200":{"description":"Public facts; cache at most five minutes. Supports ETag and If-None-Match.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Property"}}}},"304":{"description":"Unchanged; no body."},"400":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"404":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"409":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"410":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"413":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"415":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"422":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"429":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"500":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"503":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}}}}},"/api/agent/v1/availability":{"get":{"operationId":"getAvailability","summary":"Check dates. No price and no inventory hold","parameters":[{"name":"checkIn","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"checkOut","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"guests","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":10}},{"name":"petCount","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":2,"default":0}}],"responses":{"200":{"description":"A live date check, no-store. A blocked stay includes unavailableReason booked. The check-in minimum includes minStayNights and, for a short open stay, below_min_stay plus a suggestion. That minimum is looked up even when the 10-minute price cache is empty. No price and no inventory hold. petCount defaults to 0 when omitted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Availability"}}}},"400":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"404":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"409":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"410":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"413":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"415":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"422":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"429":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"500":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"503":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}}}}},"/api/agent/v1/quotes":{"post":{"operationId":"createQuote","summary":"Quote a stay and return a booking handoff","description":"Dates use the America/Los_Angeles calendar, check-out is exclusive. Check-in must be today through 12 calendar months ahead, and checkout must be no later than the morning after that last night. Stay length must be 1 through 28 nights. bookingHorizonDays is the largest possible span (366); bookingHorizonMonths defines the calendar limit. PriceLabs may require a longer minimum stay. JSON body at most 4 KiB; no unknown fields or guest information. Maximum 10 quotes per minute per IP and 60 per minute for the property. All money is integer USD cents. Only enabled payment methods are returned. The response includes bookingUrl, requiredGuestActions, humanSteps, and handoff. checkoutEnabled is true when website checkout can complete the booking link in this environment and false when checkout is locked.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Stay"}}}},"responses":{"200":{"description":"Quote snapshot valid for 30 minutes, no-store. Not a reservation or price guarantee.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"404":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"409":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"410":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"413":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"415":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"422":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"429":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"500":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"503":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}}}}},"/api/agent/v1/quotes/{quoteId}":{"get":{"operationId":"getQuote","summary":"Read an unexpired snapshot; does not recheck inventory","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Snapshot, no-store, including humanSteps and handoff. 410 after expiry; 404 after retention cleanup.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"404":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"409":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"410":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"413":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"415":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"422":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"429":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"500":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}},"503":{"description":"Typed error. Honor retryable and Retry-After; never infer availability from an error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait when rate limited or temporarily unavailable."}}}}}}},"components":{"schemas":{"Stay":{"type":"object","properties":{"checkIn":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"checkOut":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":10},"petCount":{"type":"integer","minimum":0,"maximum":2}},"required":["checkIn","checkOut","guests","petCount"],"additionalProperties":false},"Property":{"type":"object","properties":{"propertySlug":{"type":"string","const":"city-of-trees-house"},"name":{"type":"string","const":"City of Trees House"},"entityId":{"type":"string","const":"https://cityoftrees.house/#vacation-rental"},"url":{"type":"string","const":"https://cityoftrees.house/"},"bookingUrl":{"type":"string","const":"https://cityoftrees.house/#book"},"operator":{"type":"object","properties":{"name":{"type":"string","const":"Good Reviews Only"},"url":{"type":"string","const":"https://www.goodreviewsonly.com"}},"required":["name","url"],"additionalProperties":false},"timezone":{"type":"string","const":"America/Los_Angeles"},"currency":{"type":"string","const":"USD"},"location":{"type":"object","properties":{"locality":{"type":"string","const":"West Sacramento"},"region":{"type":"string","const":"California"},"country":{"type":"string","const":"US"}},"required":["locality","region","country"],"additionalProperties":false},"occupancyMax":{"type":"number","const":10},"bedrooms":{"type":"number","const":3},"bathrooms":{"type":"number","const":2},"layout":{"type":"string","const":"single-level (one story), with a step up at the front entrance and a step down into the game room"},"sutterHealthParkTrip":{"type":"string","const":"about a mile from Sutter Health Park, a 5-minute drive or about a 30-minute walk"},"bookingType":{"type":"string","const":"whole"},"petsMax":{"type":"number","const":2},"maxStayNights":{"type":"number","const":28},"bookingHorizonDays":{"type":"number","const":366},"bookingHorizonMonths":{"type":"number","const":12},"amenities":{"type":"array","items":{"type":"string"}},"policyUrl":{"type":"string","const":"https://cityoftrees.house/terms"},"factsUpdatedAt":{"type":"string","const":"2026-10-29T00:00:00Z"},"rating":{"type":"object","additionalProperties":false,"description":"Public Airbnb listing score for listing 15435008, captured on asOf. Not a site-collected rating.","required":["value","scale","count","sourcePlatform","sourceListingUrl","sourceReviewsUrl","onSiteReviewsUrl","asOf","label"],"properties":{"value":{"type":"number","minimum":0,"maximum":5},"scale":{"type":"number","const":5},"count":{"type":"integer","minimum":0},"sourcePlatform":{"type":"string","const":"airbnb"},"sourceListingUrl":{"type":"string","format":"uri"},"sourceReviewsUrl":{"type":"string","format":"uri"},"onSiteReviewsUrl":{"type":"string","format":"uri"},"asOf":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"label":{"type":"string"}}},"minStay":{"type":"object","additionalProperties":false,"required":["minNightsFloor","variesByDate","rule","source","authoritativeIn","note"],"properties":{"minNightsFloor":{"type":"integer","const":1},"variesByDate":{"type":"boolean","const":true},"rule":{"type":"string","const":"check_in_night"},"source":{"type":"string","const":"pricelabs"},"authoritativeIn":{"type":"string","const":"quote.minStayNights"},"note":{"type":"string"}}},"apiVersion":{"type":"string","const":"1"},"apiDocumentationUrl":{"type":"string","const":"https://cityoftrees.house/agents"}},"required":["propertySlug","name","entityId","url","bookingUrl","operator","timezone","currency","location","occupancyMax","bedrooms","bathrooms","layout","sutterHealthParkTrip","bookingType","petsMax","maxStayNights","bookingHorizonDays","bookingHorizonMonths","amenities","policyUrl","factsUpdatedAt","rating","minStay","apiVersion","apiDocumentationUrl"],"additionalProperties":false},"Availability":{"type":"object","properties":{"propertySlug":{"type":"string","const":"city-of-trees-house"},"stay":{"type":"object","properties":{"checkIn":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"checkOut":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":10},"petCount":{"type":"integer","minimum":0,"maximum":2}},"required":["checkIn","checkOut","guests","petCount"],"additionalProperties":false},"inventoryAvailable":{"type":"boolean"},"reservesInventory":{"type":"boolean","const":false},"checkedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"calendarObservedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"availabilityBasis":{"type":"string","const":"confirmed_bookings_and_calendar_hub"},"requiresQuoteForPriceAndMinStay":{"type":"boolean","const":true},"unavailableReason":{"$ref":"#/components/schemas/UnavailableReason"},"minStayNights":{"type":"integer","minimum":1,"maximum":28},"suggestion":{"type":"object","properties":{"checkIn":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"checkOut":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"why":{"type":"string","minLength":1}},"required":["checkIn","checkOut","nights","why"],"additionalProperties":false}},"required":["propertySlug","stay","inventoryAvailable","reservesInventory","checkedAt","calendarObservedAt","availabilityBasis","requiresQuoteForPriceAndMinStay"],"additionalProperties":false},"PaymentOption":{"type":"object","properties":{"method":{"type":"string","enum":["zelle","stripe_ach","venmo","stripe_card","paypal","cash_app"]},"label":{"type":"string","minLength":1},"confirmationMode":{"type":"string","enum":["automatic","host_verified"]},"taxableSubtotalCents":{"type":"integer","minimum":0,"maximum":10000000000},"taxCents":{"type":"integer","minimum":0,"maximum":10000000000},"paymentFeeCents":{"type":"integer","minimum":0,"maximum":10000000000},"totalCents":{"type":"integer","minimum":0,"maximum":10000000000}},"required":["method","label","confirmationMode","taxableSubtotalCents","taxCents","paymentFeeCents","totalCents"],"additionalProperties":false},"Quote":{"type":"object","properties":{"quoteId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"propertySlug":{"type":"string","const":"city-of-trees-house"},"stay":{"type":"object","properties":{"checkIn":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"checkOut":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"guests":{"type":"integer","minimum":1,"maximum":10},"petCount":{"type":"integer","minimum":0,"maximum":2}},"required":["checkIn","checkOut","guests","petCount"],"additionalProperties":false},"currency":{"type":"string","const":"USD"},"timezone":{"type":"string","const":"America/Los_Angeles"},"generatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"quoteCheckedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"calendarObservedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"pricingAuthoritative":{"type":"boolean","const":true},"inventoryAvailable":{"type":"boolean","const":true},"reservesInventory":{"type":"boolean","const":false},"checkoutEnabled":{"type":"boolean","description":"True when website checkout can complete bookingUrl in this environment. False when checkout is locked."},"minStayNights":{"type":"integer","minimum":1,"maximum":28},"stayValueCents":{"type":"integer","minimum":0,"maximum":10000000000},"petFeeCents":{"type":"integer","minimum":0,"maximum":10000000000},"nightlyPrices":{"minItems":1,"maxItems":28,"type":"array","items":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"amountCents":{"type":"integer","minimum":0,"maximum":10000000000}},"required":["date","amountCents"],"additionalProperties":false}},"paymentOptions":{"minItems":1,"maxItems":6,"type":"array","items":{"type":"object","properties":{"method":{"type":"string","enum":["zelle","stripe_ach","venmo","stripe_card","paypal","cash_app"]},"label":{"type":"string","minLength":1},"confirmationMode":{"type":"string","enum":["automatic","host_verified"]},"taxableSubtotalCents":{"type":"integer","minimum":0,"maximum":10000000000},"taxCents":{"type":"integer","minimum":0,"maximum":10000000000},"paymentFeeCents":{"type":"integer","minimum":0,"maximum":10000000000},"totalCents":{"type":"integer","minimum":0,"maximum":10000000000}},"required":["method","label","confirmationMode","taxableSubtotalCents","taxCents","paymentFeeCents","totalCents"],"additionalProperties":false}},"cancellationPolicy":{"type":"object","properties":{"version":{"type":"string","minLength":1,"maxLength":80},"url":{"type":"string","format":"uri"},"summary":{"type":"string","minLength":1}},"required":["version","url","summary"],"additionalProperties":false},"requiredGuestActions":{"minItems":4,"maxItems":4,"type":"array","items":{"type":"string","enum":["review_total_and_terms","confirm_primary_renter_age","authorize_payment","verify_identity"]}},"bookingUrl":{"type":"string","format":"uri"},"humanSteps":{"type":"array","minItems":5,"maxItems":5,"items":{"$ref":"#/components/schemas/HumanStep"}},"handoff":{"$ref":"#/components/schemas/Handoff"}},"required":["quoteId","propertySlug","stay","currency","timezone","generatedAt","expiresAt","quoteCheckedAt","calendarObservedAt","pricingAuthoritative","inventoryAvailable","reservesInventory","checkoutEnabled","minStayNights","stayValueCents","petFeeCents","nightlyPrices","paymentOptions","cancellationPolicy","requiredGuestActions","bookingUrl","humanSteps","handoff"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_REQUEST","NOT_FOUND","DATES_UNAVAILABLE","QUOTE_EXPIRED","MIN_STAY_NOT_MET","RATE_LIMITED","CALENDAR_UNVERIFIED","PRICING_UNAVAILABLE","NO_PAYMENT_METHODS","AGENT_API_DISABLED","SERVICE_UNAVAILABLE","INTERNAL_ERROR"]},"message":{"type":"string"},"retryable":{"type":"boolean"},"requestId":{"type":"string"},"details":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"}},"minStayNights":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"reason":{"$ref":"#/components/schemas/UnavailableReason"},"reasons":{"type":"array","items":{"$ref":"#/components/schemas/UnavailableReason"}},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"lastCheckIn":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"suggestion":{"type":"object","properties":{"checkIn":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"checkOut":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"nights":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"why":{"type":"string","minLength":1}},"required":["checkIn","checkOut","nights","why"],"additionalProperties":false}},"additionalProperties":false}},"required":["code","message","retryable","requestId"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"UnavailableReason":{"type":"string","enum":["booked","below_min_stay","over_max_stay","over_occupancy","beyond_booking_horizon","pets_over_limit","check_in_in_past"]},"HumanStep":{"type":"object","properties":{"order":{"type":"integer","minimum":1,"maximum":5},"action":{"type":"string","enum":["enter_guest_details","review_total_and_terms","confirm_primary_renter_age","authorize_payment","verify_identity"]},"requiredGuestAction":{"anyOf":[{"type":"string","enum":["review_total_and_terms","confirm_primary_renter_age","authorize_payment","verify_identity"]},{"type":"null"}]},"title":{"type":"string","minLength":1},"detail":{"type":"string","minLength":1}},"required":["order","action","requiredGuestAction","title","detail"],"additionalProperties":false},"Handoff":{"type":"object","properties":{"quoteWindowMinutes":{"type":"number","const":30},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"reservesInventory":{"type":"boolean","const":false},"confirmationRule":{"type":"string","minLength":1},"protectionNote":{"type":"string","minLength":1},"idNote":{"type":"string","minLength":1},"contact":{"type":"object","properties":{"phone":{"type":"string","minLength":1},"phoneE164":{"type":"string","minLength":1},"email":{"type":"string","minLength":1},"line":{"type":"string","minLength":1}},"required":["phone","phoneE164","email","line"],"additionalProperties":false},"agentMustNot":{"type":"string","minLength":1}},"required":["quoteWindowMinutes","expiresAt","reservesInventory","confirmationRule","protectionNote","idNote","contact","agentMustNot"],"additionalProperties":false}}}}