{"openapi":"3.1.0","info":{"title":"Total Parks Public API","description":"Total Parks public API for park discovery, availability, carts, and bookings. Agents should prefer the MCP connector for park Q&A, pet and rig checks, and planning calendars.\n\n## Versioning and deprecation\n\nThe current public REST surface is major version 1. Unversioned URL paths (/carts, /properties, and other existing routes) are v1.\n\nSend optional header `API-Version: 1`, or omit the header. Both select v1. An unknown major returns HTTP 400 with application/problem+json.\n\nAdditive, backward-compatible changes stay on v1. Breaking changes require a new major version.\n\nWhen an operation is retired it is marked `deprecated: true` in this document. Responses then include RFC 9745 `Deprecation: @<unix-timestamp>`, RFC 8594 `Sunset: <HTTP-date>`, and `Link` with `rel=\"deprecation\"`. Deprecated operations remain available for at least 90 days after Sunset is first advertised. The current v1 surface is not deprecated.","version":"1.0.0"},"paths":{"/signup":{"post":{"tags":["Auth"],"summary":"Register a new local user","description":"Registers a user.","operationId":"create_user_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSignUpLocal"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/confirm-email/{token}":{"post":{"tags":["Auth"],"summary":"Verify a new local users email address","description":"Verify a new local users email address.","operationId":"user_verification_confirm_email__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/resend-verification":{"post":{"tags":["Auth"],"summary":"Resend a verification email to a local user","description":"Resend a verification email to a new local user.","operationId":"resend_email_verfication_resend_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSchema"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/request-reset-password":{"post":{"tags":["Auth"],"summary":"Request a password reset for a local user","description":"Request a password reset for a local user.","operationId":"request_reset_password_request_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSchema"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/process-reset-password/{token}":{"post":{"tags":["Auth"],"summary":"Update a local users password","description":"Update a local users password.","operationId":"process_reset_password_process_reset_password__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPasswordReset"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accept-invite/start":{"post":{"tags":["Auth"],"summary":"Step 1 of invite acceptance — set password","description":"Step 1 of the two-step invite acceptance flow (Phase 1+2 of MFA\nroadmap).\n\nValidates the 7-day invite token, sets the user's password, and\ndecides which branch to return:\n\n- **Park admin / super admin** (``admin`` or any ``sa_*`` role):\n  returns ``kind=\"mfa_enrolment_required\"`` with a 15-minute\n  ``invite_enrolment_token``. The frontend takes that token to\n  the MFA enrolment endpoints; ``users.is_verified`` flips when\n  the first method activates.\n- **Other invitees**: returns ``kind=\"session\"`` with a full\n  access token, exactly like the legacy single-shot endpoint.\n\nThe 7-day invite link itself remains valid until the user's\nfull setup completes — bailing after step 1 just means they\nre-click the link and go through ``/accept-invite/start`` again\n(idempotent password update).","operationId":"accept_invite_start_accept_invite_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAcceptStartRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/InviteAcceptedResponse"},{"$ref":"#/components/schemas/InviteEnrolmentRequiredResponse"}],"title":"Response Accept Invite Start Accept Invite Start Post","discriminator":{"propertyName":"kind","mapping":{"session":"#/components/schemas/InviteAcceptedResponse","mfa_enrolment_required":"#/components/schemas/InviteEnrolmentRequiredResponse"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/accept-invite/{token}":{"post":{"tags":["Auth"],"summary":"Accept an invite and set password (legacy shim)","description":"Legacy single-shot invite acceptance — delegates to\n``/accept-invite/start``.\n\nKept around so still-cached invite emails (with the path-param\ntoken in the URL) keep working. New clients should use\n``/accept-invite/start`` directly.","operationId":"accept_invite_accept_invite__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPasswordReset"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"post":{"tags":["Auth"],"summary":"Login as a local user","description":"Verify the user's email + password. Returns one of two shapes:\n\n- ``kind: \"session\"`` — the user has no active MFA. The body\n  carries a full session JWT (``mfa_satisfied=false``). Backward-\n  compatible with the pre-MFA shape; existing clients can ignore\n  ``kind``.\n- ``kind: \"mfa_required\"`` — the user has at least one active MFA\n  method. The body carries a 5-minute ``mfa_challenge_token``\n  which must be exchanged at ``/auth/mfa/verify-login`` for a real\n  session JWT.\n\nSee docs/auth/USER_LOGIN.md and the MFA roadmap \"Two-step login\"\nsection.","operationId":"login_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/LoginSuccessResponse"},{"$ref":"#/components/schemas/MfaChallengeResponse"}],"title":"Response Login Login Post","discriminator":{"propertyName":"kind","mapping":{"session":"#/components/schemas/LoginSuccessResponse","mfa_required":"#/components/schemas/MfaChallengeResponse"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/logout":{"post":{"tags":["Auth"],"summary":"Logout a user from any provider","description":"Clear the legacy ``access_token`` cookie for older clients.\n\nDoes **not** revoke bearer JWTs. Session tokens are stored in browser\nlocalStorage and remain valid until natural expiry or MFA denylist\nrevocation paths. The frontend clears local auth state on logout.","operationId":"logout_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/availability/check":{"get":{"tags":["Availability"],"summary":"Check live inventory availability for a stay","description":"Return live Total Parks inventory availability for one stay.","operationId":"get_availability_check_availability_check_get","parameters":[{"name":"property_id","in":"query","required":true,"schema":{"type":"integer","minimum":1,"description":"Internal property ID.","title":"Property Id"},"description":"Internal property ID."},{"name":"room_type_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Optional internal room type ID.","title":"Room Type Id"},"description":"Optional internal room type ID."},{"name":"check_in","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Check-in date.","title":"Check In"},"description":"Check-in date."},{"name":"check_out","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Check-out date.","title":"Check Out"},"description":"Check-out date."},{"name":"adults","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":2,"title":"Adults"}},{"name":"children","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":0,"default":0,"title":"Children"}},{"name":"infants","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":0,"default":0,"title":"Infants"}},{"name":"accommodation_kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["site","accommodation"],"type":"string"},{"type":"null"}],"description":"Optional stay type filter.","title":"Accommodation Kind"},"description":"Optional stay type filter."},{"name":"equipment_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["caravan","campervan","motorhome","camp_trailer","roof_top_tent","tent","swag","car_ute","fifth_wheeler"],"type":"string"},{"type":"null"}],"description":"Canonical equipment type for RMS site compatibility.","title":"Equipment Type"},"description":"Canonical equipment type for RMS site compatibility."},{"name":"equipment_length_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":30,"minimum":1},{"type":"null"}],"description":"Rig length in metres for site fit checks.","title":"Equipment Length M"},"description":"Rig length in metres for site fit checks."},{"name":"equipment_width_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10,"minimum":1},{"type":"null"}],"description":"Optional rig width in metres for site fit checks.","title":"Equipment Width M"},"description":"Optional rig width in metres for site fit checks."},{"name":"power_required","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the traveller requires a powered site.","title":"Power Required"},"description":"Whether the traveller requires a powered site."},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"name":"X-Conversion-Attempt-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"X-Conversion-Attempt-Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/availability/batch-check":{"post":{"tags":["Availability"],"summary":"Batch check live inventory availability","description":"Return live Total Parks inventory availability for up to 50 stays.","operationId":"post_availability_batch_check_availability_batch_check_post","parameters":[{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"name":"X-Conversion-Attempt-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"X-Conversion-Attempt-Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningAvailabilityBatchCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/service-fee":{"get":{"tags":["Bookings"],"summary":"Get Service Fee","description":"Return the Total Parks service fee for a given booking subtotal.","operationId":"get_service_fee_bookings_service_fee_get","parameters":[{"name":"subtotal","in":"query","required":true,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"description":"Booking subtotal (accommodation + pet fees)","title":"Subtotal"},"description":"Booking subtotal (accommodation + pet fees)"},{"name":"currency","in":"query","required":false,"schema":{"type":"string","minLength":3,"maxLength":3,"default":"AUD","title":"Currency"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Calculated service fee for the given subtotal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceFeeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/requests/eligibility/{property_id}":{"get":{"tags":["Bookings"],"summary":"Get Request To Book Eligibility","description":"Return whether request-to-book is available for this property.","operationId":"get_request_to_book_eligibility_bookings_requests_eligibility__property_id__get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Eligibility check result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingRequestEligibilityResponse"}}}},"404":{"description":"Property not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/requests":{"post":{"tags":["Bookings"],"summary":"Submit Request To Book","description":"Submit an authenticated Request to Book for a non-PMS property.","operationId":"submit_request_to_book_bookings_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingRequestCreate"}}},"required":true},"responses":{"201":{"description":"Request submitted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingRequestSubmitResponse"}}}},"400":{"description":"Invalid room type or payload"},"401":{"description":"Authentication required"},"403":{"description":"Property is not eligible for request-to-book"},"404":{"description":"Property not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/bookings/{booking_id}":{"get":{"tags":["Bookings"],"summary":"Get Booking","description":"Retrieve booking details by ID. Requires authentication.\n\nThe caller must own the booking (by user_id or matching email) or be\na super admin. Accepts session JWT, PAT with bookings:read, or OAuth\naccess token with bookings:read.","operationId":"get_booking_bookings__booking_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"integer","title":"Booking Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Booking details retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDetailResponse"}}}},"401":{"description":"Authentication required"},"403":{"description":"Not authorised to view this booking"},"404":{"description":"Booking not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/ref/{confirmation_number}":{"get":{"tags":["Bookings"],"summary":"Get Booking By Confirmation","description":"Retrieve booking details by confirmation number.\n\nThe confirmation number (e.g. \"TP-123-A1B2C3D4\") acts as a bearer\nsecret for unauthenticated access (post-checkout confirmation page).\nRate-limited to prevent enumeration.","operationId":"get_booking_by_confirmation_bookings_ref__confirmation_number__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"confirmation_number","in":"path","required":true,"schema":{"type":"string","title":"Confirmation Number"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Booking details retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDetailResponse"}}}},"404":{"description":"Booking not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookings/{booking_id}/link":{"post":{"tags":["Bookings"],"summary":"Link Booking To Account","description":"Link an existing booking to the authenticated user's account.\n\nThis endpoint is used after a guest creates an account post-booking.\nIt verifies that the booking's guest email matches the user's email\nbefore linking.\n\n**Security:**\n- User must be authenticated\n- Booking guest_email must match user's email (from user_identities)\n- Booking must not already be linked to another account","operationId":"link_booking_to_account_bookings__booking_id__link_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"integer","title":"Booking Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Booking successfully linked to account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingLinkResponse"}}}},"400":{"description":"Email mismatch - cannot link"},"404":{"description":"Booking not found"},"409":{"description":"Booking already linked to an account"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts":{"post":{"tags":["Carts"],"summary":"Create Cart","operationId":"create_cart_carts_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Conversion-Journey-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Conversion-Journey-Token"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCartRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}":{"get":{"tags":["Carts"],"summary":"Get Cart","operationId":"get_cart_carts__cart_id__get","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Carts"],"summary":"Update Cart","operationId":"update_cart_carts__cart_id__patch","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Carts"],"summary":"Delete Cart","operationId":"delete_cart_carts__cart_id__delete","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}/promo":{"post":{"tags":["Carts"],"summary":"Apply Promo","description":"Apply a promo code to a cart (Cart-of-1).\n\nPersists ``cart.promo_code`` + ``cart.campaign_id`` and per-line\n``discount_amount`` + ``pms_discount_id``. Idempotent under\n``Idempotency-Key`` (5-minute replay window). Failures surface as\ntyped ``CartServiceError`` / ``CampaignServiceError`` (the standard\nhandlers in ``app.main`` build the envelope).","operationId":"apply_promo_carts__cart_id__promo_post","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyPromoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Carts"],"summary":"Remove Promo","description":"Remove the applied promo code from the cart (idempotent).","operationId":"remove_promo_carts__cart_id__promo_delete","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}/link-user":{"post":{"tags":["Carts"],"summary":"Link User","operationId":"link_user_carts__cart_id__link_user_post","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}/stays":{"post":{"tags":["Carts"],"summary":"Add Stay","operationId":"add_stay_carts__cart_id__stays_post","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddStayRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}/stays/{stay_id}":{"patch":{"tags":["Carts"],"summary":"Update Stay","operationId":"update_stay_carts__cart_id__stays__stay_id__patch","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"stay_id","in":"path","required":true,"schema":{"type":"integer","title":"Stay Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStayRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Carts"],"summary":"Delete Stay","operationId":"delete_stay_carts__cart_id__stays__stay_id__delete","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"stay_id","in":"path","required":true,"schema":{"type":"integer","title":"Stay Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}/stays/{stay_id}/lines":{"post":{"tags":["Carts"],"summary":"Add Line","operationId":"add_line_carts__cart_id__stays__stay_id__lines_post","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"stay_id","in":"path","required":true,"schema":{"type":"integer","title":"Stay Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddLineRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}/stays/{stay_id}/lines/{line_id}":{"patch":{"tags":["Carts"],"summary":"Update Line","operationId":"update_line_carts__cart_id__stays__stay_id__lines__line_id__patch","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"stay_id","in":"path","required":true,"schema":{"type":"integer","title":"Stay Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLineRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Carts"],"summary":"Delete Line","operationId":"delete_line_carts__cart_id__stays__stay_id__lines__line_id__delete","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"stay_id","in":"path","required":true,"schema":{"type":"integer","title":"Stay Id"}},{"name":"line_id","in":"path","required":true,"schema":{"type":"integer","title":"Line Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}/prepare":{"post":{"tags":["Carts"],"summary":"Prepare Cart","description":"Prepare checkout: live-verify, PMS hold, BookingIntent, PaymentIntent.","operationId":"prepare_cart_carts__cart_id__prepare_post","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareCartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/carts/{cart_id}/confirm":{"post":{"tags":["Carts"],"summary":"Confirm Cart","description":"Confirm booking after Stripe payment authorisation.","operationId":"confirm_cart_carts__cart_id__confirm_post","parameters":[{"name":"cart_id","in":"path","required":true,"schema":{"type":"integer","title":"Cart Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"tp_cart","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tp Cart"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmCartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartResponseEnvelope"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/categories":{"get":{"tags":["Propertys"],"summary":"List trip categories with live park counts","description":"Return every defined trip category with slug, label, kind, count.\n\nThe counts are cached in Redis for 24 h and refreshed by a\nCelery beat task + the embedding backfill. A Redis miss triggers a\nsynchronous recomputation over the current category set.","operationId":"list_categories_categories_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/categories/{slug}/parks":{"get":{"tags":["Propertys"],"summary":"List parks that match a trip category","description":"Return parks that match the given trip category slug.\n\nThe payload mirrors ``GET /properties/{id}/similar``: a\n``SuccessPayload`` whose ``data`` is a list of expanded GeoJSON\nfeatures (same shape the ``/properties/json?expanded=true`` and\nPDP similar-parks endpoints use), so the frontend transforms\nfollow the existing ``transformPropertyToPark`` pipeline.\n\n* 200 + empty list when the slug is valid but no park currently\n  qualifies (e.g. the structured feature hasn't landed in the\n  environment yet, or the similarity floor is too strict).\n* 404 when the slug is not one of the defined trip categories.\n* 500 on DB or OpenAI failures during the resolve step.","operationId":"get_category_parks_categories__slug__parks_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum number of parks to return (1-200). Defaults to 50.","default":50,"title":"Limit"},"description":"Maximum number of parks to return (1-200). Defaults to 50."},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed-integrators/{code}":{"get":{"tags":["Embed Integrators"],"summary":"Get Public Embed Integrator","operationId":"get_public_embed_integrator_embed_integrators__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEmbedIntegratorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed-integrators/{code}/embed-config":{"get":{"tags":["Embed Integrators"],"summary":"Get Public Embed Integrator Config","operationId":"get_public_embed_integrator_config_embed_integrators__code__embed_config_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEmbedIntegratorConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Health check verifying Redis, async PostgreSQL, and the public sync read path.\n\nReturns 200 if all components healthy, 503 if any fail.\nUsed by Docker Compose healthcheck, ECS container health checks, and ALB target groups.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/features":{"get":{"tags":["Property Features"],"summary":"Get Property Features","description":"Get a list of all property features.","operationId":"get_property_features_features_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyFeatureList"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"post":{"tags":["Property Features"],"summary":"Register a new PropertyFeature (e.g. 'Wifi')","description":"Registers a new Property Feature (e.g. 'Wifi').","operationId":"create_property_feature_features_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyFeatureCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyFeature"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/property-highlights":{"get":{"tags":["Property Highlights"],"summary":"Get curated property highlights","description":"Return curated highlight options for park-admin selection.","operationId":"get_property_highlights_property_highlights_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyHighlightCatalogResponse"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/managements":{"get":{"tags":["Property Managements"],"summary":"Get Property Manangement","description":"Get a list of all property managements.","operationId":"get_property_manangement_managements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyManagementList"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"post":{"tags":["Property Managements"],"summary":"Register a new PropertyManagement (e.g. 'BIG4')","description":"Registers a new Property Management (e.g. 'BIG4').","operationId":"create_property_management_managements_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyManagementCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyManagement"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/{property_id}/images":{"post":{"tags":["Property Images"],"summary":"Create a new PropertyImage.","description":"Create a new PropertyImage for a Property.","operationId":"create_property_images__property_id__images_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","title":"Property Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_property_images__property_id__images_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/images/{image_id}":{"delete":{"tags":["Property Images"],"summary":"Delete a PropertyImage.","description":"Delete a PropertyImage.","operationId":"delete_mgmt_image_properties__property_id__images__image_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Property Images"],"summary":"Update a PropertyImage record.","description":"Update a PropertyImage record (e.g. to set rating=5).","operationId":"update_mgmt_image_properties__property_id__images__image_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyImageMetadata"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/images":{"get":{"tags":["Property Images"],"summary":"Get Property Images","description":"Get a list of all images provided by property managers.","operationId":"get_property_images_properties__property_id__images_get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope the public property.","default":"AU","title":"Country"},"description":"ISO country code used to scope the public property."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/pet-blockouts":{"get":{"tags":["Propertys"],"summary":"Get pet blockout ranges overlapping a stay window","description":"Return blockout ranges that overlap ``[start, end - 1]``.\n\n``start`` must be strictly before ``end`` and the span must not exceed\none year to keep payloads bounded. The response is always a 200 with\na (possibly empty) ``ranges`` list — there is no 404 for properties\nthat have never configured a schedule, only for missing property ids.","operationId":"get_property_pet_blockouts_for_stay_properties__property_id__pet_blockouts_get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Property ID","title":"Property Id"},"description":"Property ID"},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Stay check-in date (inclusive)","title":"Start"},"description":"Stay check-in date (inclusive)"},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Stay check-out date (exclusive — matches booking convention)","title":"End"},"description":"Stay check-out date (exclusive — matches booking convention)"},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope the public property.","default":"AU","title":"Country"},"description":"ISO country code used to scope the public property."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Overlapping blockout ranges (possibly empty)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetBlockoutStayResponse"}}}},"400":{"description":"Invalid stay window"},"404":{"description":"Property not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/pet-restricted-breeds":{"get":{"tags":["Propertys"],"summary":"Get a property's effective restricted dog breed list","description":"Return the guest-safe restricted breed list for a property.","operationId":"get_property_pet_restricted_breeds_properties__property_id__pet_restricted_breeds_get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Property ID","title":"Property Id"},"description":"Property ID"},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope the public property.","default":"AU","title":"Country"},"description":"ISO country code used to scope the public property."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Restricted breed list (possibly empty)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetRestrictedBreedsStayResponse"}}}},"404":{"description":"Property not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/search-index":{"get":{"tags":["Propertys"],"summary":"Get lightweight search index for autocomplete","description":"Return a minimal property list for client-side autocomplete.\nOnly includes fields needed for search/display — no images, features, etc.","operationId":"get_search_index_properties_search_index_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/vibe-search":{"get":{"tags":["Propertys"],"summary":"Free-text vibe search over property embeddings","description":"Phase 7 of the semantic-search roadmap: the Hero homepage fallback\nfor queries that don't route to a place or a structured feature.\n\nThe query is normalised and embedded (``text-embedding-3-small``,\nRedis-cached for 24 h), then cosine-ranked against\n``properties.embedding`` with a permissive similarity floor. The\nresponse shape mirrors ``/categories/{slug}/parks`` and\n``/properties/{id}/similar``: a ``SuccessPayload`` whose ``data``\nis a list of expanded GeoJSON features.\n\nFail-open semantics:\n* Empty ``q`` → 200 + empty list (not 400, so the frontend can\n  safely call this with a loading-state query).\n* OpenAI outage → 200 + empty list (service degrades; the Hero\n  falls back to rendering the same \"no parks match\" banner as a\n  genuine zero-match result).\n* DB vector error → 200 + empty list.","operationId":"get_vibe_search_properties_properties_vibe_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Free-text vibe query. Empty string returns 200 + empty list (fail-open for misuse).","default":"","title":"Q"},"description":"Free-text vibe query. Empty string returns 200 + empty list (fail-open for misuse)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"description":"Maximum number of parks to return (1-24). Defaults to 12.","default":12,"title":"Limit"},"description":"Maximum number of parks to return (1-24). Defaults to 12."},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/geobuf":{"get":{"tags":["Propertys"],"summary":"Get properties as geobuf binary","description":"Get a list of all properties as a protobuf binary (ala `geobuf`).\n\nNote: Hidden properties are excluded from this endpoint.\n\nCaching: this dataset only changes when an admin edits a property,\nso we cache the encoded payload in Redis for an hour and advertise\nthe same TTL to shared caches (Cloudflare). Browsers get a shorter\n`max-age` so a stale tab heals quickly without a full reload.","operationId":"get_properties_properties_geobuf_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/summary":{"get":{"tags":["Propertys"],"summary":"Get Properties Summary","description":"Aggregate counts of visible properties used by the ``/holiday-parks``\nlanding page (header total + state-card grid).\n\nThe payload is a few hundred bytes, which lets the page render the\nhero count and state cards without fetching the multi-MB\n``/properties/json`` payload SSR-side.\n\nCaching: this dataset only changes when an admin edits a property,\nso we cache the encoded payload in Redis for an hour and advertise\nthe same TTL to shared caches (Cloudflare). Browsers get a shorter\n`max-age` so a stale tab heals quickly without a full reload.","operationId":"get_properties_summary_properties_summary_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/json":{"get":{"tags":["Propertys"],"summary":"Get Properties Json","description":"Get a geojson FeatureCollection of all properties.\n\nNote: Hidden properties are excluded from this endpoint.\n\nCaching: this dataset only changes when an admin edits a property,\nso we cache the encoded payload in Redis for an hour and advertise\nthe same TTL to shared caches (Cloudflare). Browsers get a shorter\n`max-age` so a stale tab heals quickly without a full reload.","operationId":"get_properties_json_properties_json_get","parameters":[{"name":"expanded","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Expanded"}},{"name":"include_capabilities","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Include Capabilities"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/by-state/{state}":{"get":{"tags":["Propertys"],"summary":"Get Properties By State","description":"Get a geojson FeatureCollection of visible properties for a single state.\n\nCaching: this dataset only changes when an admin edits a property,\nso we cache the encoded payload in Redis for an hour and advertise\nthe same TTL to shared caches (Cloudflare). Browsers get a shorter\n`max-age` so a stale tab heals quickly without a full reload.","operationId":"get_properties_by_state_properties_by_state__state__get","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"expanded","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Expanded"}},{"name":"include_capabilities","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Include Capabilities"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/by-location/{state}/{slug}":{"get":{"tags":["Propertys"],"summary":"Get Property By State And Slug","description":"Get a visible property by URL state + slug.\n\nReturns 404 if the property is not found or is hidden from public view.","operationId":"get_property_by_state_and_slug_properties_by_location__state___slug__get","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"include_capabilities","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Include Capabilities"}},{"name":"include_content_enrichment","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Include Content Enrichment"}},{"name":"include_local_entities","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Include Local Entities"}},{"name":"include_indicative_summary","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Include Indicative Summary"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/slug-redirect/{state}/{slug}":{"get":{"tags":["Propertys"],"summary":"Resolve an old property slug to the current one","description":"Look up a previously-used property slug and return the property's current\nslug so the frontend can issue a 301/308 permanent redirect.\n\nReturns 404 if the slug was never recorded in history.","operationId":"get_slug_redirect_properties_slug_redirect__state___slug__get","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/room-slug-redirect/{room_slug}":{"get":{"tags":["Propertys"],"summary":"Resolve an old room type slug to the current one","description":"Look up a previously-used room type slug within a property and return the\nroom type's current slug so the frontend can issue a 301/308 permanent\nredirect.\n\nProperty-scoped because the public room URL is already resolved within a\nproperty (``/{state}/{slug}/rooms/{roomSlug}``); the caller resolves the\nproperty (and its id) before the room lookup. Joins history back to\n``room_types`` so chained renames (A -> B -> C) still land on C. Excludes\ninactive / guest-disabled room types so we never redirect to a 404.\n\nReturns 404 if the slug was never recorded in history for this property.","operationId":"get_room_slug_redirect_properties__property_id__room_slug_redirect__room_slug__get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"room_slug","in":"path","required":true,"schema":{"type":"string","title":"Room Slug"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/embed-config/{state}/{slug}":{"get":{"tags":["Propertys"],"summary":"Embed frame-ancestors allowlist for a property","description":"Return the parent origins permitted to iframe this property's embed widget.\n\nConsumed by the Next.js `/embed/*` proxy (`proxy.ts`) to build a per-request\nCSP `frame-ancestors` header (see Stage 3 of the embeddable-checkout roadmap).\nDeliberately a thin, embed-only surface — kept off the shared\n`GET /properties/by-location` response so the agent-facing property schema\nstays free of GUI-embed-only fields (AGENT_HUMAN_PARITY). Returns an empty\nlist (default-deny) when the property has no registered origins; 404 when\nno visible property matches.","operationId":"get_property_embed_config_properties_embed_config__state___slug__get","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}":{"get":{"tags":["Propertys"],"summary":"Get Property","description":"Get a geojson Feature for a property, with reviews, qanda etc. added to props.\n\nReturns 404 if the property is not found or is hidden from public view.","operationId":"get_property_properties__property_id__get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/similar":{"get":{"tags":["Propertys"],"summary":"Get properties similar to the given seed property","description":"Get parks similar to the seed property, ranked by embedding cosine distance.\n\nPhase 3 of the semantic-search roadmap: the first user-visible consumer\nof ``properties.embedding``. Candidates are pulled via the HNSW index\nand then re-ranked in Python to prefer same-state matches and to cap\nsame-management-group siblings at one in the result set.\n\nReturns ``200`` with an empty list when the seed exists but has no\nembedding yet — the PDP carousel renders nothing and degrades quietly.\nReturns ``404`` when the seed is not found or hidden from public view.","operationId":"get_similar_properties_endpoint_properties__property_id__similar_get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"description":"Maximum number of similar properties to return (1-12).","default":6,"title":"Limit"},"description":"Maximum number of similar properties to return (1-12)."},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties":{"post":{"tags":["Propertys"],"summary":"Register a new Property (e.g. 'BIG4 Launceston')","description":"Registers a new Property (e.g. 'BIG4 Launceston').","operationId":"create_property_feature_properties_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Property"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/properties/{property_id}/stayed-here":{"post":{"tags":["Propertys"],"summary":"Toggle I stayed here.","description":"Toggle Toggle I stayed here.","operationId":"like_review_properties__property_id__stayed_here_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/room-types":{"get":{"tags":["Propertys"],"summary":"Get Property Room Types","description":"Get all room types for a property with their images and features.","operationId":"get_property_room_types_properties__property_id__room_types_get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/equipment-fit":{"get":{"tags":["Propertys"],"summary":"Date-independent equipment fit for site room types","description":"Date-independent equipment fit for a property's site room types.\n\nAnswers \"can this rig physically fit?\" without picking dates, so the\nproperty page can disable non-fitting site room types as soon as a\nguest enters equipment, and agents can compare fit before checking\navailability. Only guest-visible **site** room types are returned;\naccommodation room types have no equipment-fit concept and are omitted\n(treat them as always fitting).\n\nFit combines three orthogonal signals (see ``RoomTypeEquipmentFit``):\n``dimensions_pending``, ``equipment_type_excluded``, and\n``sites_matching``. The dimension rules (length strict, width relaxed)\nare shared with ``GET /properties/{id}/availability`` so the date-gated\ncalendar and this endpoint never diverge.","operationId":"get_property_equipment_fit_properties__property_id__equipment_fit_get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"equipment_length","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":30,"minimum":1},{"type":"null"}],"description":"Equipment length in metres (enables dimension fit).","title":"Equipment Length"},"description":"Equipment length in metres (enables dimension fit)."},{"name":"equipment_width","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10,"minimum":1},{"type":"null"}],"description":"Equipment width in metres (optional, relaxed filter).","title":"Equipment Width"},"description":"Equipment width in metres (optional, relaxed filter)."},{"name":"equipment_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Canonical equipment type (e.g. 'caravan', 'motorhome') for RMS dwelling-type compatibility checking.","title":"Equipment Type"},"description":"Canonical equipment type (e.g. 'caravan', 'motorhome') for RMS dwelling-type compatibility checking."},{"name":"room_type_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Restrict the result to a single site room type.","title":"Room Type Id"},"description":"Restrict the result to a single site room type."},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyEquipmentFitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/availability":{"get":{"tags":["Propertys"],"summary":"Get Property Availability","description":"Get availability for a property across a date range.\n\nReturns per-date availability combining inventory and restriction data.\nIf room_type_id is provided, returns availability for that specific room type.\nOtherwise, returns aggregated availability across all room types.\n\nGuest counts (adults, children, infants) are used to calculate adjusted rates\nthat include extra guest charges based on the rate plan's guest pricing.\n\nFor site room types, equipment_length and equipment_width can be provided to\nfilter availability to only sites that can accommodate the equipment dimensions.\n\nFor RMS properties, equipment_type triggers dwelling-type compatibility\nchecking.  Site categories whose RMS dwelling allocations do not include\nthe guest's equipment type are excluded (equipment_type_excluded=true).","operationId":"get_property_availability_properties__property_id__availability_get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Start date for availability check","title":"Start Date"},"description":"Start date for availability check"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"End date for availability check","title":"End Date"},"description":"End date for availability check"},{"name":"room_type_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by specific room type","title":"Room Type Id"},"description":"Filter by specific room type"},{"name":"adults","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Number of adults","default":2,"title":"Adults"},"description":"Number of adults"},{"name":"children","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":0,"description":"Number of children","default":0,"title":"Children"},"description":"Number of children"},{"name":"infants","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":0,"description":"Number of infants","default":0,"title":"Infants"},"description":"Number of infants"},{"name":"equipment_length","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":30,"minimum":1},{"type":"null"}],"description":"Equipment length in metres (for site filtering)","title":"Equipment Length"},"description":"Equipment length in metres (for site filtering)"},{"name":"equipment_width","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10,"minimum":1},{"type":"null"}],"description":"Equipment width in metres (for site filtering)","title":"Equipment Width"},"description":"Equipment width in metres (for site filtering)"},{"name":"equipment_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Canonical equipment type (e.g. 'caravan', 'motorhome') for RMS compatibility filtering","title":"Equipment Type"},"description":"Canonical equipment type (e.g. 'caravan', 'motorhome') for RMS compatibility filtering"},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope public property inventory.","default":"AU","title":"Country"},"description":"ISO country code used to scope public property inventory."},{"name":"X-Conversion-Attempt-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"X-Conversion-Attempt-Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties/{property_id}/capabilities":{"get":{"tags":["Propertys"],"summary":"Property capability graph (raw signals and/or derived summaries)","description":"Read the capability graph for a single visible property.\n\nReturns generic scoped records from the Phase 1A raw signal layer and the\nPhase 1B derived-summary layer. The raw layer includes ``active`` and\n``conflicting`` signals (superseded ones are excluded) so callers can\nreason about provenance and disagreement; the summary layer is the\nconservative published view. This endpoint is read-only and never\nreconciles or mutates the graph.\n\nReturns ``404`` when the property does not exist, is hidden from public\nview, or belongs to another country, mirroring ``GET /properties/{id}``.","operationId":"get_property_capabilities_endpoint_properties__property_id__capabilities_get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"name":"include","in":"query","required":false,"schema":{"$ref":"#/components/schemas/CapabilityInclude","description":"Which projection layer(s) to return: 'raw' (scoped signals with provenance/confidence for agents), 'summary' (conservative safe-to-publish claims for GEO/JSON-LD), or 'both' (default).","default":"both"},"description":"Which projection layer(s) to return: 'raw' (scoped signals with provenance/confidence for agents), 'summary' (conservative safe-to-publish claims for GEO/JSON-LD), or 'both' (default)."},{"name":"country","in":"query","required":false,"schema":{"enum":["AU","NZ"],"type":"string","description":"ISO country code used to scope the public property.","default":"AU","title":"Country"},"description":"ISO country code used to scope the public property."},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyCapabilitiesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/claim-requests":{"post":{"tags":["Park Claim Requests"],"summary":"Submit a park claim request","description":"Submit a request to claim or register a park on Total Parks.\n    \n    **For claiming an existing listing**: Include `linked_property_id`\n    **For registering a new park**: Omit `linked_property_id`\n    \n    Rate limited to 3 requests per IP per hour.","operationId":"submit_claim_request_claim_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequestCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequestSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/claim-requests/property/{property_id}":{"get":{"tags":["Park Claim Requests"],"summary":"Get property info for claim form","description":"Get property information for pre-populating the claim form.\n    \n    Returns property name, address, state, and whether it's claimable\n    (no pending claims exist).","operationId":"get_property_for_claim_claim_requests_property__property_id__get","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"integer","title":"Property Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/me/tokens":{"get":{"tags":["Tokens"],"summary":"List User Tokens","description":"List all PATs for the authenticated user (secrets never included).","operationId":"list_user_tokens_user_me_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PATResponse"},"type":"array","title":"Response List User Tokens User Me Tokens Get"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"post":{"tags":["Tokens"],"summary":"Create User Token","description":"Create a new PAT. The plaintext token is returned once.","operationId":"create_user_token_user_me_tokens_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/user/me/tokens/{token_id}":{"patch":{"tags":["Tokens"],"summary":"Update User Token","description":"Rename or change scopes of a PAT.","operationId":"update_user_token_user_me_tokens__token_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"integer","title":"Token Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PATResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tokens"],"summary":"Revoke User Token","description":"Revoke (soft-delete) a PAT.","operationId":"revoke_user_token_user_me_tokens__token_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"integer","title":"Token Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/me/oauth-grants":{"get":{"tags":["Tokens"],"summary":"List Grants","description":"List the authenticated user's active OAuth grants (connected apps).","operationId":"list_grants_user_me_oauth_grants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OAuthGrantResponse"},"type":"array","title":"Response List Grants User Me Oauth Grants Get"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/user/me/oauth-grants/{grant_id}":{"delete":{"tags":["Tokens"],"summary":"Revoke Grant","description":"Revoke an OAuth grant and all tokens issued to that app.","operationId":"revoke_grant_user_me_oauth_grants__grant_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/authorize":{"get":{"tags":["OAuth"],"summary":"Authorize Redirect","description":"Validate the authorize request and redirect to the consent UI.","operationId":"authorize_redirect_oauth_authorize_get","parameters":[{"name":"response_type","in":"query","required":true,"schema":{"type":"string","title":"Response Type"}},{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"","title":"Scope"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"code_challenge","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Challenge Method"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["OAuth"],"summary":"Authorize Decision","description":"User grants or denies the OAuth request. Requires session auth.","operationId":"authorize_decision_oauth_authorize_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizeDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/oauth/authorize/metadata":{"get":{"tags":["OAuth"],"summary":"Authorize Metadata","description":"Return the consent request metadata for the frontend consent page.","operationId":"authorize_metadata_oauth_authorize_metadata_get","parameters":[{"name":"request_id","in":"query","required":true,"schema":{"type":"string","title":"Request Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizeMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/token":{"post":{"tags":["OAuth"],"summary":"Token Endpoint","description":"Token endpoint — exchange code or refresh.","operationId":"token_endpoint_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_endpoint_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/oauth/revoke":{"post":{"tags":["OAuth"],"summary":"Revoke Endpoint","description":"RFC 7009 token revocation. Always returns 200 per spec.","operationId":"revoke_endpoint_oauth_revoke_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/oauth/introspect":{"post":{"tags":["OAuth"],"summary":"Introspect Endpoint","description":"RFC 7662 token introspection. Admin-gated.","operationId":"introspect_endpoint_oauth_introspect_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_introspect_endpoint_oauth_introspect_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntrospectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/magic-link/request":{"post":{"tags":["Auth"],"summary":"Request Magic Link","description":"Send a magic-link login email. Always returns 200 (prevents email enumeration).","operationId":"request_magic_link_auth_magic_link_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/magic-link/consume":{"post":{"tags":["Auth"],"summary":"Consume Magic Link","description":"Exchange a magic-link token for a session JWT.\n\nMagic-link replaces the *password* factor, not the MFA challenge\n(see ``docs/auth/MFA.md`` §\"Magic-link interaction\"). The\nresponse mirrors ``/login``'s discriminated union:\n\n- ``kind: \"session\"`` — user has no active MFA. A full session JWT\n  with ``mfa_satisfied=false`` is returned. Extranet routes still\n  bounce these tokens off ``get_admin_user`` /\n  ``get_property_admin_user`` once enforcement is on; guest users\n  sail through.\n- ``kind: \"mfa_required\"`` — user has at least one active MFA\n  method. A 5-minute ``mfa_challenge_token`` is returned and must\n  be exchanged at ``/auth/mfa/verify-login`` for a real session.\n  This is the path that prevents a magic-linked admin from being\n  redirected to ``/account/security?reason=mfa_required`` despite\n  already having MFA configured.","operationId":"consume_magic_link_auth_magic_link_consume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkConsumeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/LoginSuccessResponse"},{"$ref":"#/components/schemas/MfaChallengeResponse"}],"title":"Response Consume Magic Link Auth Magic Link Consume Post","discriminator":{"propertyName":"kind","mapping":{"session":"#/components/schemas/LoginSuccessResponse","mfa_required":"#/components/schemas/MfaChallengeResponse"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/status":{"get":{"tags":["Auth"],"summary":"Get Status","description":"Drive the /account/security UI: methods + recovery code count.","operationId":"get_status_auth_mfa_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaStatusResponse"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/enroll/totp":{"post":{"tags":["Auth"],"summary":"Enroll Totp","description":"Start a TOTP enrolment.\n\nGenerates a fresh secret, stores a pending (`is_active=False`) row,\nand returns the otpauth:// URI + the manual base32 secret so the\nuser can either scan the QR or paste it into their authenticator.\n\nRecovery-locked sessions (``mfa_recovery=true``) are deliberately\nallowed here — that's how a user clears their recovery lock.","operationId":"enroll_totp_auth_mfa_enroll_totp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpEnrolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpEnrolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/verify/totp":{"post":{"tags":["Auth"],"summary":"Verify Totp","description":"Confirm enrolment by submitting an OTP from the freshly-installed\nauthenticator.\n\nOn success:\n- Flip the method to ``is_active=True``.\n- First-time-only: mint a fresh batch of recovery codes (returned\n  exactly once) and stamp ``users.mfa_enforced_at``.\n- Mint a fresh access token with ``mfa_satisfied=true,\n  mfa_recovery=false`` — this is what unlocks a recovery-locked\n  session.","operationId":"verify_totp_auth_mfa_verify_totp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpVerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/disable":{"post":{"tags":["Auth"],"summary":"Disable Mfa","description":"Wipe every active MFA method on the current user.\n\nRequires a fresh password re-auth so a stolen session JWT alone\ncan't downgrade an account.","operationId":"disable_mfa_auth_mfa_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordReauthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/methods/{method_id}":{"patch":{"tags":["Auth"],"summary":"Rename Mfa Method","description":"Rename an active MFA method.\n\nLabel-only edit — purely cosmetic so we don't gate on a password\nre-auth. 409 on collision with another active method on the same\nuser; the user picked the new label deliberately so we surface\nthe clash rather than auto-suffixing.","operationId":"rename_mfa_method_auth_mfa_methods__method_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"method_id","in":"path","required":true,"schema":{"type":"integer","title":"Method Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaMethodRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaMethodSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/mfa/methods/{method_id}/remove":{"post":{"tags":["Auth"],"summary":"Remove Mfa Method","description":"Soft-disable a single MFA method.\n\nPer-method removal — the existence of multiple authenticators is\nthe whole point of letting a user have e.g. both Authy and a\npassword-manager TOTP. We block removal of the **last** active\nmethod here so the user has exactly one explicit path to MFA-off\n(the danger-zone \"Disable two-factor\" button), which also wipes\nrecovery codes. Without that block, a user clicking \"Remove\" on\ntheir only method would be silently full-disabled — surprising,\nand a UX cliff edge.\n\nRequires password re-auth so a stolen session JWT alone can't\nerode a user's MFA posture.","operationId":"remove_mfa_method_auth_mfa_methods__method_id__remove_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"method_id","in":"path","required":true,"schema":{"type":"integer","title":"Method Id"}},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordReauthRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessPayload"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/mfa/recovery-codes/regenerate":{"post":{"tags":["Auth"],"summary":"Regenerate Recovery Codes","description":"Mint a fresh batch of recovery codes — invalidates the old set.","operationId":"regenerate_recovery_codes_auth_mfa_recovery_codes_regenerate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordReauthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoveryCodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/enroll/webauthn/begin":{"post":{"tags":["Auth"],"summary":"Enroll Webauthn Begin","description":"Generate WebAuthn registration options and create a pending row.\n\nMirrors :func:`enroll_totp` — pending row stays inactive until the\nmatching ``/complete`` call verifies the attestation.","operationId":"enroll_webauthn_begin_auth_mfa_enroll_webauthn_begin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebAuthnEnrolBeginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebAuthnEnrolBeginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/enroll/webauthn/complete":{"post":{"tags":["Auth"],"summary":"Enroll Webauthn Complete","description":"Verify the WebAuthn attestation and activate the method.","operationId":"enroll_webauthn_complete_auth_mfa_enroll_webauthn_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebAuthnEnrolCompleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebAuthnEnrolCompleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/login/webauthn/begin":{"post":{"tags":["Auth"],"summary":"Login Webauthn Begin","description":"Generate WebAuthn assertion options for the second login step.\n\nUnauthenticated — the ``mfa_challenge_token`` from /login is the\nproof that step one (password) succeeded.","operationId":"login_webauthn_begin_auth_mfa_login_webauthn_begin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebAuthnLoginBeginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebAuthnLoginBeginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/auth/mfa/verify-login":{"post":{"tags":["Auth"],"summary":"Verify Login","description":"Exchange the 5-minute ``mfa_challenge_token`` (returned by\n/login when the user has active MFA) for a real session JWT.\n\nThree ``method`` values are accepted:\n\n- ``totp``: standard 6-digit code from the authenticator app.\n  Issues a full session token (``mfa_satisfied=true,\n  mfa_recovery=false``).\n- ``webauthn``: ``webauthn_response`` carries the JSON object the\n  browser produced from ``navigator.credentials.get`` (after the\n  separate ``/login/webauthn/begin`` call). Same outcome as\n  ``totp`` on success.\n- ``recovery_code``: one of the 8-char ``XXXX-XXXX`` codes\n  generated at enrolment. Single-use. Issues a *restricted*\n  session (``mfa_satisfied=true, mfa_recovery=true``) — the\n  ``get_admin_user`` dependency rejects this token on every\n  extranet route, forcing the user through /account/security to\n  enrol a fresh method before resuming work.","operationId":"verify_login_auth_mfa_verify_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaVerifyLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/.well-known/oauth-authorization-server":{"get":{"tags":[".well-known"],"summary":"Oauth Authorization Server Metadata","description":"RFC 8414 — OAuth 2.0 Authorization Server Metadata.","operationId":"oauth_authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/.well-known/agent.json":{"get":{"tags":[".well-known"],"summary":"Agent Card","description":"Legacy Total Parks agent card for existing local/dev agents.","operationId":"agent_card__well_known_agent_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/.well-known/agent-card.json":{"get":{"tags":[".well-known"],"summary":"A2A Agent Card","description":"A2A Agent Card discovery document.","operationId":"a2a_agent_card__well_known_agent_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}}},"components":{"schemas":{"ARISettingsResponse":{"properties":{"success":{"type":"boolean","title":"Success"}},"type":"object","required":["success"],"title":"ARISettingsResponse","description":"Response from ARISettingsRS after configuring ARI push settings."},"AccountSessionRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"business_type":{"type":"string","enum":["company","individual"],"title":"Business Type","default":"company"}},"type":"object","required":["property_id"],"title":"AccountSessionRequest","description":"Request to create a Stripe Account Session for embedded onboarding."},"AccountSessionResponse":{"properties":{"client_secret":{"type":"string","title":"Client Secret"}},"type":"object","required":["client_secret"],"title":"AccountSessionResponse","description":"Response containing the client_secret for embedded Connect components."},"AddLineRequest":{"properties":{"room_type_id":{"type":"integer","title":"Room Type Id"},"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In","description":"Optional compatibility field; defaults to the stay check-in."},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out","description":"Optional compatibility field; defaults to the stay check-out."},"adults":{"type":"integer","minimum":1,"title":"Adults","default":2},"children":{"type":"integer","minimum":0,"title":"Children","default":0},"infants":{"type":"integer","minimum":0,"title":"Infants","default":0},"pet_declaration":{"anyOf":[{"$ref":"#/components/schemas/PetDeclaration"},{"type":"null"}]},"equipment":{"anyOf":[{"$ref":"#/components/schemas/EquipmentSchema"},{"type":"null"}]},"lead_guest_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lead Guest Override"},"special_requests":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Special Requests"}},"type":"object","required":["room_type_id"],"title":"AddLineRequest","description":"``POST /carts/{id}/stays/{stay_id}/lines`` body."},"AddMemberRequest":{"properties":{"property_id":{"type":"integer","exclusiveMinimum":0,"title":"Property Id"}},"type":"object","required":["property_id"],"title":"AddMemberRequest"},"AddStayRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"lead_guest_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lead Guest Override"},"special_requests":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Special Requests"},"lines":{"items":{"$ref":"#/components/schemas/LineInput"},"type":"array","minItems":1,"title":"Lines","description":"At least one line per stay."}},"type":"object","required":["property_id","lines"],"title":"AddStayRequest","description":"``POST /carts/{id}/stays`` body."},"Address":{"properties":{"use_type":{"type":"string","title":"Use Type"},"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"city_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Name"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"state_prov":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Prov"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"}},"type":"object","required":["use_type"],"title":"Address","description":"Address information from OTA_HotelDescriptiveInfoRS."},"AdminBookingDetail":{"properties":{"id":{"type":"integer","title":"Id"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"booking_code":{"type":"string","title":"Booking Code"},"status":{"type":"string","title":"Status"},"payment_status":{"type":"string","title":"Payment Status"},"property":{"$ref":"#/components/schemas/AdminPropertySummary"},"room_type":{"$ref":"#/components/schemas/AdminRoomTypeSummary"},"guest_first_name":{"type":"string","title":"Guest First Name"},"guest_last_name":{"type":"string","title":"Guest Last Name"},"guest_email":{"type":"string","title":"Guest Email"},"guest_phone":{"type":"string","title":"Guest Phone"},"special_requests":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Requests"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"adults":{"type":"integer","title":"Adults"},"children":{"type":"integer","title":"Children"},"infants":{"type":"integer","title":"Infants"},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Amount"},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total"},"service_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee"},"currency":{"type":"string","title":"Currency"},"stripe_payment_intent_id":{"type":"string","title":"Stripe Payment Intent Id"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Id"},"pms_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","confirmation_number","booking_code","status","payment_status","property","room_type","guest_first_name","guest_last_name","guest_email","guest_phone","check_in","check_out","adults","children","infants","total_amount","service_fee","currency","stripe_payment_intent_id","created_at","updated_at"],"title":"AdminBookingDetail","description":"Full booking detail for admin view.\nIncludes all booking fields plus nested property and room type info."},"AdminBookingListItem":{"properties":{"id":{"type":"integer","title":"Id"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"booking_code":{"type":"string","title":"Booking Code"},"status":{"type":"string","title":"Status"},"payment_status":{"type":"string","title":"Payment Status"},"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"guest_first_name":{"type":"string","title":"Guest First Name"},"guest_last_name":{"type":"string","title":"Guest Last Name"},"guest_email":{"type":"string","title":"Guest Email"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Amount"},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total"},"service_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee"},"currency":{"type":"string","title":"Currency"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Id"},"pms_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","confirmation_number","booking_code","status","payment_status","property_id","property_name","guest_first_name","guest_last_name","guest_email","check_in","check_out","total_amount","service_fee","currency","created_at"],"title":"AdminBookingListItem","description":"Booking summary for admin list views.\nContains fields needed for the booking table display."},"AdminBookingListResponse":{"properties":{"bookings":{"items":{"$ref":"#/components/schemas/AdminBookingListItem"},"type":"array","title":"Bookings"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["bookings","total","page","limit"],"title":"AdminBookingListResponse","description":"Paginated response for admin booking list."},"AdminCampaignDetail":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source":{"type":"string","enum":["rms_auto","tp_managed"],"title":"Source"},"is_active":{"type":"boolean","title":"Is Active"},"usage_limit_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Usage Limit Total"},"usage_limit_per_user":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Usage Limit Per User"},"tp_booking_window_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tp Booking Window Start"},"tp_booking_window_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tp Booking Window End"},"tp_stay_window_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Tp Stay Window Start"},"tp_stay_window_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Tp Stay Window End"},"created_by_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Id"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name"},"pms_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Provider"},"pms_ref_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Ref Id"},"rms_discount_local_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Discount Local Id"},"rms_discount_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Discount Id"},"rms_discount_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Discount Name"},"rms_discount_available_to_ibe":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rms Discount Available To Ibe"},"rms_discount_promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Discount Promo Code"},"rms_discount_expose_as_promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Discount Expose As Promo Code"},"rms_discount_last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Rms Discount Last Synced At"},"usage_count":{"type":"integer","title":"Usage Count","default":0},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","code","name","source","is_active","created_at","updated_at"],"title":"AdminCampaignDetail","description":"Full detail view of a single campaign."},"AdminCampaignListResponse":{"properties":{"campaigns":{"items":{"$ref":"#/components/schemas/AdminCampaignRow"},"type":"array","title":"Campaigns"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["campaigns","total","page","limit"],"title":"AdminCampaignListResponse","description":"Paginated response for `/admin/campaigns`."},"AdminCampaignRow":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"source":{"type":"string","enum":["rms_auto","tp_managed"],"title":"Source"},"is_active":{"type":"boolean","title":"Is Active"},"property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Id"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name"},"rms_discount_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Discount Id"},"usage_count":{"type":"integer","title":"Usage Count","default":0},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","code","name","source","is_active","created_at","updated_at"],"title":"AdminCampaignRow","description":"One row in the paginated `/admin/campaigns` list."},"AdminCampaignUsageRow":{"properties":{"id":{"type":"integer","title":"Id"},"campaign_id":{"type":"integer","title":"Campaign Id"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"guest_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Email"},"booking_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Booking Id"},"cart_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cart Id"},"discount_amount":{"type":"number","title":"Discount Amount"},"used_at":{"type":"string","format":"date-time","title":"Used At"}},"type":"object","required":["id","campaign_id","discount_amount","used_at"],"title":"AdminCampaignUsageRow","description":"One row in `/admin/campaigns/{id}/usages`."},"AdminCampaignUsagesResponse":{"properties":{"usages":{"items":{"$ref":"#/components/schemas/AdminCampaignUsageRow"},"type":"array","title":"Usages"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","maximum":200,"minimum":1,"title":"Limit"},"offset":{"type":"integer","minimum":0,"title":"Offset"}},"type":"object","required":["usages","total","limit","offset"],"title":"AdminCampaignUsagesResponse","description":"Paginated response for `/admin/campaigns/{id}/usages`."},"AdminGrantRevokeResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"property_id":{"type":"integer","title":"Property Id"},"removed":{"type":"boolean","title":"Removed","description":"True iff a grant row was deleted; false when no grant existed (idempotent no-op)."},"capabilities_at_removal":{"items":{"type":"string"},"type":"array","title":"Capabilities At Removal","description":"The capability set that was held immediately before deletion. Empty when the call was a no-op."}},"type":"object","required":["user_id","property_id","removed"],"title":"AdminGrantRevokeResponse","description":"Response after deleting a single grant via DELETE .../grants/{pid}."},"AdminGrantSpec":{"properties":{"property_id":{"type":"integer","minimum":1,"title":"Property Id"},"capabilities":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Capabilities","description":"Capability strings to write for this property. Validated against the canonical Capability enum."}},"type":"object","required":["property_id","capabilities"],"title":"AdminGrantSpec","description":"A per-property capability assignment supplied on invite or PATCH.\n\nUsed by the super-admin surface to write or update ``park_admin_grants``\nrows directly. When ``grants`` is omitted on ``AdminUserInvite`` the\nbackend defaults to the full capability literal per ``sa_*`` role\nassigned (preserves pre-Phase-2d behaviour). When ``grants`` is\nomitted on ``AdminUserUpdate``, existing grants are left alone except\nfor synchronisation with role-string changes — adding ``sa_X`` to\nroles auto-creates a full-cap grant; removing ``sa_X`` deletes the\ngrant (subject to the last-Team-manager invariant)."},"AdminGrantUpsertRequest":{"properties":{"property_id":{"type":"integer","minimum":1,"title":"Property Id"},"capabilities":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Capabilities","description":"Capability strings to set on this property. Validated against the canonical Capability enum."}},"type":"object","required":["property_id","capabilities"],"title":"AdminGrantUpsertRequest","description":"Body for ``POST /admin/users/{user_id}/grants``.\n\nUpserts a single ``park_admin_grants`` row for the target user on\nthe listed property. Ensures the corresponding ``sa_{property_id}``\nrole string is present on ``users.roles`` so the\nrole + grant belt-and-braces predicate is always consistent.\nEmits ``park_admin_access_granted`` (new grant) or\n``park_admin_access_changed`` (cap edit) email post-commit when the\ntarget is an already-active user."},"AdminGrantUpsertResponse":{"properties":{"grant":{"$ref":"#/components/schemas/AdminUserGrant"},"created":{"type":"boolean","title":"Created","description":"True iff a new grant row was created; false on an update or an idempotent no-op."},"capabilities_before":{"items":{"type":"string"},"type":"array","title":"Capabilities Before","description":"Capabilities held on this property before the upsert."},"access_email_sent":{"type":"boolean","title":"Access Email Sent","default":false}},"type":"object","required":["grant","created"],"title":"AdminGrantUpsertResponse","description":"Response after upserting a single grant via POST .../grants."},"AdminGrantViaGroupRequest":{"properties":{"property_group_id":{"type":"integer","minimum":1,"title":"Property Group Id"},"capabilities":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Capabilities","description":"Capability strings to grant on every active member of this group. Validated against the canonical Capability enum."}},"type":"object","required":["property_group_id","capabilities"],"title":"AdminGrantViaGroupRequest","description":"Body for ``POST /admin/users/{user_id}/grants/via-group``.\n\nFans the supplied capability set out to every active member of the\nlisted property group. Atomic across the resolved member set — a\nlockout on any single member rolls back the whole call. No-op on\ninactive groups (surfaced via ``group_was_inactive`` on the\nresponse)."},"AdminGrantViaGroupResponse":{"properties":{"property_group_id":{"type":"integer","title":"Property Group Id"},"property_group_name":{"type":"string","title":"Property Group Name"},"group_member_count":{"type":"integer","title":"Group Member Count","description":"Total active-group membership at expansion time. Larger than ``applied_property_ids`` when some members already carried a matching grant (idempotent no-op)."},"group_was_inactive":{"type":"boolean","title":"Group Was Inactive","description":"True iff the supplied group has ``is_active = False`` — no grants were written and ``applied_property_ids`` is empty.","default":false},"applied_property_ids":{"items":{"type":"integer"},"type":"array","title":"Applied Property Ids","description":"Property IDs where the grant was newly created or modified. Idempotent no-op members are absent."},"grants":{"items":{"$ref":"#/components/schemas/AdminUserGrant"},"type":"array","title":"Grants","description":"Snapshot of every grant the target now holds on the resolved member set (including idempotent no-op members)."},"access_email_sent":{"type":"boolean","title":"Access Email Sent","default":false}},"type":"object","required":["property_group_id","property_group_name","group_member_count"],"title":"AdminGrantViaGroupResponse","description":"Response after applying a via-group grant fan-out."},"AdminGrantViaGroupRevokeResponse":{"properties":{"property_group_id":{"type":"integer","title":"Property Group Id"},"property_group_name":{"type":"string","title":"Property Group Name"},"group_member_count":{"type":"integer","title":"Group Member Count"},"group_was_inactive":{"type":"boolean","title":"Group Was Inactive","default":false},"removed_property_ids":{"items":{"type":"integer"},"type":"array","title":"Removed Property Ids","description":"Property IDs where the grant row was deleted. Members with no existing grant are absent (idempotent no-op)."},"capabilities_at_removal_by_property":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Capabilities At Removal By Property","description":"Per-property snapshot of the capability set held immediately before deletion. Only contains entries for properties listed in ``removed_property_ids``."}},"type":"object","required":["property_group_id","property_group_name","group_member_count"],"title":"AdminGrantViaGroupRevokeResponse","description":"Response after revoking grants for every member of a group."},"AdminGroupGrantExpansion":{"properties":{"property_group_id":{"type":"integer","minimum":1,"title":"Property Group Id"},"capabilities":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Capabilities","description":"Capability strings to grant on every member of this group. Validated against the canonical Capability enum."}},"type":"object","required":["property_group_id","capabilities"],"title":"AdminGroupGrantExpansion","description":"A per-group capability assignment supplied on invite or PATCH (Phase 3a.ii).\n\nAllows the super-admin surface to grant different capability sets to\ndifferent property groups in a single call without forcing the caller\nto enumerate every property by hand. Each entry is expanded to N\nper-property writes via ``expand_property_group_ids`` and processed\nthrough the existing ``reconcile_*`` orchestrators.\n\nPrecedence rules when multiple inputs name the same property:\n\n1. ``grants[]`` entries (direct per-property spec) win outright.\n2. ``group_grant_expansions[]`` win over the implicit full-cap default\n   from a bare ``property_group_ids`` entry.\n3. Within ``group_grant_expansions``, first-group-wins matches the\n   expansion helper's attribution rule."},"AdminLinkedProperty":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"AdminLinkedProperty","description":"Property summary for users with sa_* roles."},"AdminMfaResetRequest":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":4,"title":"Reason"}},"type":"object","required":["reason"],"title":"AdminMfaResetRequest","description":"POST body for /admin/users/{user_id}/mfa/reset.\n\n``reason`` is recorded verbatim on the audit row — keep it short\nand operational (e.g. \"phone lost; verified via payout BSB\")."},"AdminPMSConfigSummary":{"properties":{"id":{"type":"integer","title":"Id"},"pms_type":{"type":"string","title":"Pms Type"},"pms_property_id":{"type":"string","title":"Pms Property Id"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token"},"is_test_environment":{"type":"boolean","title":"Is Test Environment","default":false},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"rms_parent_client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Parent Client Id","description":"RMS parent database ID (clientId) used for API authentication"},"rms_selected_property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Selected Property Name","description":"Display name of the selected RMS property"},"rms_api_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Api Property Id","description":"RMS propertyId for API data access paths (from /properties endpoint)"},"onboarding_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Status"},"onboarding_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onboarding Started At"},"onboarding_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onboarding Completed At"},"onboarding_failed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onboarding Failed At"},"onboarding_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Error"},"onboarding_retry_count":{"type":"integer","title":"Onboarding Retry Count","default":0},"onboarding_last_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Last Step"},"onboarding_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Task Id"}},"type":"object","required":["id","pms_type","pms_property_id"],"title":"AdminPMSConfigSummary","description":"PMS config summary for admin property detail.\nSensitive credentials are omitted."},"AdminPMSDetailsSummary":{"properties":{"pms_source":{"type":"string","title":"Pms Source"},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code"},"check_in_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out Time"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"}},"type":"object","required":["pms_source"],"title":"AdminPMSDetailsSummary","description":"PMS details summary (check-in/out times, currency, sync status)."},"AdminPayoutDateAuditEntry":{"properties":{"from_check_in":{"type":"string","format":"date","title":"From Check In"},"from_check_out":{"type":"string","format":"date","title":"From Check Out"},"to_check_in":{"type":"string","format":"date","title":"To Check In"},"to_check_out":{"type":"string","format":"date","title":"To Check Out"},"source":{"type":"string","title":"Source"},"changed_at":{"type":"string","format":"date-time","title":"Changed At"}},"type":"object","required":["from_check_in","from_check_out","to_check_in","to_check_out","source","changed_at"],"title":"AdminPayoutDateAuditEntry","description":"One persisted PMS stay-date change marker for a payout line's booking."},"AdminPayoutDetailResponse":{"properties":{"id":{"type":"integer","title":"Id"},"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"gross_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Gross Amount"},"stripe_fee_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Stripe Fee Total"},"management_fee_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Management Fee Total"},"reserve_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Reserve Amount"},"refund_deductions":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Refund Deductions"},"net_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Net Amount"},"status":{"type":"string","title":"Status"},"bank_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Reference"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"bsb_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bsb Masked"},"account_number_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Number Masked"},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name"},"line_items":{"items":{"$ref":"#/components/schemas/AdminPayoutLineItem"},"type":"array","title":"Line Items","default":[]},"receipt_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Status"},"runs":{"items":{"$ref":"#/components/schemas/AdminPayoutReceiptRun"},"type":"array","title":"Runs","default":[]}},"type":"object","required":["id","property_id","property_name","period_start","period_end","gross_amount","stripe_fee_total","management_fee_total","reserve_amount","refund_deductions","net_amount","status","created_at","updated_at"],"title":"AdminPayoutDetailResponse","description":"Full payout detail for admin view."},"AdminPayoutLineItem":{"properties":{"id":{"type":"integer","title":"Id"},"booking_id":{"type":"integer","title":"Booking Id"},"confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Number"},"booking_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Code"},"guest_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Name"},"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out"},"gross_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Gross Amount"},"stripe_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Stripe Fee"},"management_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Management Fee"},"net_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Net Amount"},"is_refund":{"type":"boolean","title":"Is Refund","default":false},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"receipt_status":{"type":"string","title":"Receipt Status","default":"pending"},"receipt_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Detail"},"discount_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount Amount"},"discount_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Code"},"pms_dates_last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pms Dates Last Checked At"},"pms_dates_last_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Dates Last Source"},"pms_dates_last_changed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pms Dates Last Changed At"},"pms_dates_audit":{"items":{"$ref":"#/components/schemas/AdminPayoutDateAuditEntry"},"type":"array","title":"Pms Dates Audit","default":[]}},"type":"object","required":["id","booking_id","gross_amount","stripe_fee","management_fee","net_amount","created_at"],"title":"AdminPayoutLineItem","description":"Payout line item plus its derived PMS receipt status (ADR-0009 Slice 5).\n\nExtends the park-facing :class:`PayoutLineItemResponse` so the admin\ndetail table can render a per-line receipt pill. ``receipt_status`` is\none of ``posted`` / ``pending`` / ``failed`` / ``skipped``, derived\nfrom the idempotency markers + latest run outcomes (never stored).\n``receipt_detail`` is a short human string for skipped/failed lines."},"AdminPayoutListItem":{"properties":{"id":{"type":"integer","title":"Id"},"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"gross_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Gross Amount"},"stripe_fee_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Stripe Fee Total"},"management_fee_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Management Fee Total"},"reserve_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Reserve Amount"},"refund_deductions":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Refund Deductions"},"net_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Net Amount"},"status":{"type":"string","title":"Status"},"bank_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Reference"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"line_item_count":{"type":"integer","title":"Line Item Count","default":0},"bsb_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bsb Masked"},"account_number_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Number Masked"},"receipt_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Status"}},"type":"object","required":["id","property_id","property_name","period_start","period_end","gross_amount","stripe_fee_total","management_fee_total","reserve_amount","refund_deductions","net_amount","status","created_at"],"title":"AdminPayoutListItem","description":"Payout row for the admin payouts list."},"AdminPayoutListResponse":{"properties":{"payouts":{"items":{"$ref":"#/components/schemas/AdminPayoutListItem"},"type":"array","title":"Payouts","default":[]},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"limit":{"type":"integer","title":"Limit","default":20}},"type":"object","title":"AdminPayoutListResponse","description":"Paginated admin payout list."},"AdminPayoutReceiptRun":{"properties":{"id":{"type":"integer","title":"Id"},"triggered_by":{"type":"string","title":"Triggered By"},"status":{"type":"string","title":"Status"},"attempts":{"type":"integer","title":"Attempts","default":0},"posted":{"type":"integer","title":"Posted","default":0},"skipped":{"type":"integer","title":"Skipped","default":0},"failed":{"type":"integer","title":"Failed","default":0},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"}},"type":"object","required":["id","triggered_by","status","created_at"],"title":"AdminPayoutReceiptRun","description":"One PMS receipt-posting run row (ADR-0009) for the detail history.\n\nMirrors :class:`app.models.payout.PayoutReceiptRun`. Super-admin only;\nsurfaces the durable audit trail behind the per-line receipt status so\noperators can see when/how each posting attempt ran."},"AdminPayoutSummary":{"properties":{"pending_count":{"type":"integer","title":"Pending Count","default":0},"pending_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Pending Total","default":"0.00"},"properties_with_pending":{"items":{"$ref":"#/components/schemas/PropertyPendingSummary"},"type":"array","title":"Properties With Pending","default":[]},"held_funds_property_count":{"type":"integer","title":"Held Funds Property Count","default":0},"held_funds_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Held Funds Total","default":"0.00"},"held_funds_properties":{"items":{"$ref":"#/components/schemas/HeldFundsPropertySummary"},"type":"array","title":"Held Funds Properties","default":[]}},"type":"object","title":"AdminPayoutSummary","description":"Aggregate summary of pending payouts."},"AdminPropertyDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","default":"AU"},"state":{"type":"string","title":"State"},"address":{"type":"string","title":"Address"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desc"},"pms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone_free":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Free"},"phone_alt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Alt"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"visibility":{"type":"string","title":"Visibility","default":"visible"},"onboarding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding"},"booking_enabled":{"type":"boolean","title":"Booking Enabled","default":false},"manual_request_enabled":{"type":"boolean","title":"Manual Request Enabled","default":true},"google_place_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Place Id"},"google_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Google Rating"},"google_user_rating_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Google User Rating Count"},"register_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Register Date"},"stripe_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Account Id"},"stripe_account_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Account Type"},"stripe_charges_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stripe Charges Enabled"},"stripe_payouts_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stripe Payouts Enabled"},"pms_config":{"anyOf":[{"$ref":"#/components/schemas/AdminPMSConfigSummary"},{"type":"null"}]},"pms_details":{"anyOf":[{"$ref":"#/components/schemas/AdminPMSDetailsSummary"},{"type":"null"}]},"room_type_count":{"type":"integer","title":"Room Type Count","default":0},"booking_count":{"type":"integer","title":"Booking Count","default":0}},"type":"object","required":["id","name","slug","state","address"],"title":"AdminPropertyDetail","description":"Full property detail for admin view.\nIncludes core fields, nested PMS data, and computed counts."},"AdminPropertyListItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","default":"AU"},"state":{"type":"string","title":"State"},"address":{"type":"string","title":"Address"},"pms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms"},"booking_enabled":{"type":"boolean","title":"Booking Enabled","default":false},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"visibility":{"type":"string","title":"Visibility","default":"visible"},"register_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Register Date"},"onboarding_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Status"},"payment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Path"},"stripe_connected":{"type":"boolean","title":"Stripe Connected","default":false},"stripe_charges_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stripe Charges Enabled"},"has_outreach_lead":{"type":"boolean","title":"Has Outreach Lead","default":false}},"type":"object","required":["id","name","slug","state","address"],"title":"AdminPropertyListItem","description":"Lightweight property schema for admin list views.\nContains only the fields needed for the property table display."},"AdminPropertyListResponse":{"properties":{"properties":{"items":{"$ref":"#/components/schemas/AdminPropertyListItem"},"type":"array","title":"Properties"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["properties","total","page","limit"],"title":"AdminPropertyListResponse","description":"Paginated response for admin property list."},"AdminPropertySummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country"},"state":{"type":"string","title":"State"},"pms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms"}},"type":"object","required":["id","name","slug","country","state"],"title":"AdminPropertySummary","description":"Minimal property info for booking detail view."},"AdminPropertyUpdate":{"properties":{"booking_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Booking Enabled"},"manual_request_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Manual Request Enabled"},"visibility":{"anyOf":[{"type":"string","pattern":"^(visible|hidden)$"},{"type":"null"}],"title":"Visibility","description":"Property visibility: 'visible' or 'hidden'"},"address":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Address","description":"Display address shown to guests"},"google_place_id":{"anyOf":[{"type":"string","maxLength":255,"pattern":"^ChIJ[A-Za-z0-9_\\-]{20,}$"},{"type":"null"}],"title":"Google Place Id","description":"Google Maps Place ID for star ratings"}},"type":"object","title":"AdminPropertyUpdate","description":"Partial update request for admin property management."},"AdminRoomTypeCategoryOverrideResponse":{"properties":{"id":{"type":"integer","title":"Id"},"pms_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Category"},"category_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Override"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"is_site":{"type":"boolean","title":"Is Site","default":false},"category_override_set_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Override Set By Id"},"category_override_set_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Category Override Set At"}},"type":"object","required":["id"],"title":"AdminRoomTypeCategoryOverrideResponse","description":"Response after setting/clearing a PMS category override.\n\nReturns the current effective + raw + override state so the UI can\nreflect the new row without a refetch."},"AdminRoomTypeCategoryOverrideUpdateRequest":{"properties":{"category_override":{"anyOf":[{"type":"string","enum":["Site","Accommodation"]},{"type":"null"}],"title":"Category Override"}},"type":"object","title":"AdminRoomTypeCategoryOverrideUpdateRequest","description":"Request to set or clear the PMS category override for a room type.\n\n``category_override`` is one of ``\"Site\"`` / ``\"Accommodation\"`` to set the\noverride, or ``null`` to clear it and inherit from the PMS value."},"AdminRoomTypeListItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"pms_room_type_code":{"type":"string","title":"Pms Room Type Code"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"is_site":{"type":"boolean","title":"Is Site","default":false},"pms_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Category"},"category_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Override"},"category_override_set_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Override Set By Id"},"category_override_set_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Category Override Set At"},"max_occupancy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Occupancy"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity"},"is_active":{"type":"boolean","title":"Is Active","default":true},"rate_plan_count":{"type":"integer","title":"Rate Plan Count","default":0},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"}},"type":"object","required":["id","name","slug","pms_room_type_code"],"title":"AdminRoomTypeListItem","description":"Room type summary for admin property detail view.\nIncludes computed counts for rate plans."},"AdminRoomTypeSummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","required":["id","name"],"title":"AdminRoomTypeSummary","description":"Minimal room type info for booking detail view."},"AdminRoomTypesResponse":{"properties":{"room_types":{"items":{"$ref":"#/components/schemas/AdminRoomTypeListItem"},"type":"array","title":"Room Types"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["room_types","total"],"title":"AdminRoomTypesResponse","description":"Response for property room types list."},"AdminServiceFeeStats":{"properties":{"total_service_fees":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Service Fees"},"booking_count":{"type":"integer","title":"Booking Count"}},"type":"object","required":["total_service_fees","booking_count"],"title":"AdminServiceFeeStats","description":"Aggregated service fee statistics for admin dashboard."},"AdminUserAccessHistoryEntry":{"properties":{"id":{"type":"integer","title":"Id"},"action":{"type":"string","title":"Action"},"actor_user_id":{"type":"integer","title":"Actor User Id"},"actor_display":{"type":"string","title":"Actor Display"},"property_id":{"type":"integer","title":"Property Id"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name","description":"Resolved at read time. ``None`` when the property has been deleted since the audit row was written."},"property_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Group Id"},"property_group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Group Name","description":"Resolved at read time. ``None`` when the row is a direct write or the group has been deleted since."},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","action","actor_user_id","actor_display","property_id","created_at"],"title":"AdminUserAccessHistoryEntry","description":"One row in the cross-property ``park_admin_grant_*`` history feed.\n\nStrict scope per ``docs/auth/PARK_ADMIN_CAPABILITIES.md`` §Phase 3c:\nonly ``park_admin_grant_create`` / ``_update`` / ``_delete`` rows\nsurface here. Invite emails and lockout-blocked attempts are\nintentionally excluded (they live on the per-property park-admin\nfeed). ``property_group_id`` / ``property_group_name`` are\npopulated only when the underlying write was a group fan-out\n(``metadata.source = \"via_property_group\"``)."},"AdminUserAccessHistoryResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"entries":{"items":{"$ref":"#/components/schemas/AdminUserAccessHistoryEntry"},"type":"array","title":"Entries"}},"type":"object","required":["user_id"],"title":"AdminUserAccessHistoryResponse"},"AdminUserDetail":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"firstname":{"type":"string","title":"Firstname"},"lastname":{"type":"string","title":"Lastname"},"displayname":{"type":"string","title":"Displayname"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"profile_pic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Pic"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified"},"mfa_enabled":{"type":"boolean","title":"Mfa Enabled","description":"True iff the user has at least one active MFA method.","default":false},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"register_date":{"type":"string","format":"date-time","title":"Register Date"},"identities":{"items":{"$ref":"#/components/schemas/AdminUserIdentity"},"type":"array","title":"Identities"},"linked_properties":{"items":{"$ref":"#/components/schemas/AdminLinkedProperty"},"type":"array","title":"Linked Properties"},"grants":{"items":{"$ref":"#/components/schemas/AdminUserGrant"},"type":"array","title":"Grants","description":"Capability grants per property (Phase 2d). Empty for the rare orphan case where a user holds an ``sa_*`` role but has no grant row."},"skipped_inactive_group_ids":{"items":{"type":"integer"},"type":"array","title":"Skipped Inactive Group Ids","description":"Property group IDs (Phase 3a.ii) supplied by the caller whose ``is_active = False`` flag caused them to be silently skipped during expansion. Only populated on PATCH responses that included ``property_group_ids`` or ``group_grant_expansions`` — GET responses always omit this."}},"type":"object","required":["id","firstname","lastname","displayname","is_active","is_verified","roles","register_date","identities","linked_properties"],"title":"AdminUserDetail","description":"Full user detail for admin view.\nIncludes all user fields, identities, linked properties, and the\npark-admin capability grants (Phase 2d)."},"AdminUserGrant":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"is_team_manager":{"type":"boolean","title":"Is Team Manager","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["property_id","property_name","capabilities","created_at"],"title":"AdminUserGrant","description":"A park_admin_grants row enriched with property name for the detail UI."},"AdminUserIdentity":{"properties":{"id":{"type":"integer","title":"Id"},"provider":{"type":"string","title":"Provider"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["id","provider"],"title":"AdminUserIdentity","description":"User identity information for admin detail view.\nRepresents a login method (Google, Apple, local, etc.)"},"AdminUserInvite":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"firstname":{"type":"string","title":"Firstname"},"lastname":{"type":"string","title":"Lastname"},"roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles"},"grants":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdminGrantSpec"},"type":"array"},{"type":"null"}],"title":"Grants","description":"Optional explicit grant assignments per property. When omitted, the backend writes the full capability set for every ``sa_*`` role in ``roles`` — preserves pre-Phase-2d behaviour."},"property_group_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Property Group Ids","description":"Optional property-group IDs (Phase 3a.ii). Same expansion + precedence rules as on PATCH."},"group_grant_expansions":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdminGroupGrantExpansion"},"type":"array"},{"type":"null"}],"title":"Group Grant Expansions","description":"Optional per-group capability spec (Phase 3a.ii). Same precedence rules as on PATCH."}},"type":"object","required":["email","firstname","lastname"],"title":"AdminUserInvite","description":"Request schema for inviting a new user.\nCreates a user account and sends an invite email with a link to set password."},"AdminUserInviteLinkResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"invite_url":{"type":"string","title":"Invite Url"}},"type":"object","required":["user_id","invite_url"],"title":"AdminUserInviteLinkResponse","description":"Response containing a fresh invite URL for a pending (unverified) user.\n\nThe link is valid for 7 days from generation — see\n``backend/app/security/token_utils.py`` ``TOKEN_EXPIRY_7_DAYS``."},"AdminUserInviteResendResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"invite_sent":{"type":"boolean","title":"Invite Sent"},"message":{"type":"string","title":"Message","default":"Invite email resent"}},"type":"object","required":["user_id","invite_sent"],"title":"AdminUserInviteResendResponse","description":"Response after resending an invite email for a pending (unverified) user."},"AdminUserInviteResponse":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"firstname":{"type":"string","title":"Firstname"},"lastname":{"type":"string","title":"Lastname"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"grants":{"items":{"$ref":"#/components/schemas/AdminUserGrant"},"type":"array","title":"Grants","description":"Grants written for the newly invited user (Phase 2d)."},"skipped_inactive_group_ids":{"items":{"type":"integer"},"type":"array","title":"Skipped Inactive Group Ids","description":"Property group IDs (Phase 3a.ii) supplied by the caller whose ``is_active = False`` flag caused them to be silently skipped during expansion. Empty when no ``property_group_ids`` / ``group_grant_expansions`` were supplied."},"invite_sent":{"type":"boolean","title":"Invite Sent"}},"type":"object","required":["id","email","firstname","lastname","roles","invite_sent"],"title":"AdminUserInviteResponse","description":"Response schema for user invite."},"AdminUserListItem":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"firstname":{"type":"string","title":"Firstname"},"lastname":{"type":"string","title":"Lastname"},"displayname":{"type":"string","title":"Displayname"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"identity_count":{"type":"integer","title":"Identity Count"},"register_date":{"type":"string","format":"date-time","title":"Register Date"}},"type":"object","required":["id","firstname","lastname","displayname","is_active","is_verified","roles","identity_count","register_date"],"title":"AdminUserListItem","description":"User summary for admin list views.\nContains fields needed for the user table display."},"AdminUserListResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/AdminUserListItem"},"type":"array","title":"Users"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["users","total","page","limit"],"title":"AdminUserListResponse","description":"Paginated response for admin user list."},"AdminUserPasswordResetLinkResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"reset_url":{"type":"string","title":"Reset Url"}},"type":"object","required":["user_id","reset_url"],"title":"AdminUserPasswordResetLinkResponse","description":"Response containing a fresh password-reset URL for a user with a\nlocal login, generated without sending an email.\n\nThe link is valid for 30 minutes from generation — see\n``backend/app/security/token_utils.py`` ``TOKEN_EXPIRY_30_MIN``."},"AdminUserPasswordResetResendResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"reset_sent":{"type":"boolean","title":"Reset Sent"},"message":{"type":"string","title":"Message","default":"Password reset email resent"}},"type":"object","required":["user_id","reset_sent"],"title":"AdminUserPasswordResetResendResponse","description":"Response after resending a password-reset email for a user with a\nlocal login. The reset link is valid for 30 minutes — see\n``backend/app/security/token_utils.py`` ``TOKEN_EXPIRY_30_MIN``."},"AdminUserUpdate":{"properties":{"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"},"roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles"},"grants":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdminGrantSpec"},"type":"array"},{"type":"null"}],"title":"Grants","description":"Optional explicit grant assignments. When provided, the backend upserts each listed property's grant. Omitting this field leaves existing grants untouched except for the role-string sync (adding/removing sa_* roles)."},"property_group_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Property Group Ids","description":"Optional property-group IDs (Phase 3a.ii). Each active group is expanded to its current member property IDs and merged with ``grants[]`` + ``group_grant_expansions[]``. Members not otherwise spec'd receive the full capability default (matching ``sa_*``-role auto-grant behaviour)."},"group_grant_expansions":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdminGroupGrantExpansion"},"type":"array"},{"type":"null"}],"title":"Group Grant Expansions","description":"Optional per-group capability spec (Phase 3a.ii). Allows different capability sets per group in a single call. Precedence: ``grants[]`` > ``group_grant_expansions[]`` > bare ``property_group_ids[]`` full-cap default."}},"type":"object","title":"AdminUserUpdate","description":"Partial update request for user.\nAll fields are optional - only provided fields will be updated."},"AppliedChange":{"properties":{"type":{"type":"string","title":"Type","description":"Change kind: cart_created, stay_added, line_added, line_updated, stay_removed, line_removed, user_linked, cart_updated, prepared, confirmed."},"stay_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stay Id"},"line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Id"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra"}},"type":"object","required":["type"],"title":"AppliedChange","description":"Describes one atomic change made by a cart mutation."},"ApplyPromoRequest":{"properties":{"code":{"type":"string","maxLength":50,"minLength":1,"title":"Code","description":"Promo code to apply. Case-insensitive; canonicalised server-side."}},"type":"object","required":["code"],"title":"ApplyPromoRequest","description":"``POST /carts/{id}/promo`` body.\n\nThe ``code`` is canonicalised server-side (uppercase + trim + allowlist\nregex). Whitespace-only / empty / overly long / illegal-character inputs\nare rejected with ``error_code_invalid``."},"ApproveClaimResponse":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"property_id":{"type":"integer","title":"Property Id"},"user_id":{"type":"integer","title":"User Id"},"invite_sent":{"type":"boolean","title":"Invite Sent"},"message":{"type":"string","title":"Message","default":"Claim request approved"}},"type":"object","required":["request_id","property_id","user_id","invite_sent"],"title":"ApproveClaimResponse","description":"Response after approving a claim request."},"AreaDimensionInfo":{"properties":{"area_id":{"type":"integer","title":"Area Id"},"pms_area_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Area Id"},"name":{"type":"string","title":"Name"},"length_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length M"},"width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width M"},"dimension_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimension Source"},"dimension_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimension Confidence"},"dimensions_unlimited":{"type":"boolean","title":"Dimensions Unlimited","default":false},"has_area_dwelling_allocations":{"type":"boolean","title":"Has Area Dwelling Allocations","default":false},"equipment_types":{"items":{"$ref":"#/components/schemas/InferredEquipmentType"},"type":"array","title":"Equipment Types","default":[]},"equipment_narrower_than_category":{"type":"boolean","title":"Equipment Narrower Than Category","default":false},"excluded_category_equipment_types":{"items":{"type":"string"},"type":"array","title":"Excluded Category Equipment Types","default":[]},"dimension_candidates":{"items":{"$ref":"#/components/schemas/DimensionCandidate"},"type":"array","title":"Dimension Candidates","default":[]},"length_sources_conflict":{"type":"boolean","title":"Length Sources Conflict","default":false}},"type":"object","required":["area_id","name"],"title":"AreaDimensionInfo","description":"Dimension info for a single area (site) within a category."},"AreaDimensionOverride":{"properties":{"area_id":{"type":"integer","title":"Area Id"},"length_m":{"anyOf":[{"type":"number","maximum":50,"minimum":1},{"type":"null"}],"title":"Length M"},"width_m":{"anyOf":[{"type":"number","maximum":20,"minimum":2},{"type":"null"}],"title":"Width M"},"unlimited":{"type":"boolean","title":"Unlimited","default":false}},"type":"object","required":["area_id"],"title":"AreaDimensionOverride","description":"Single per-area dimension override.\n\nSet ``unlimited=True`` for open areas where any equipment size fits.\nWhen unlimited, ``length_m``/``width_m`` are ignored (sentinel applied\nserver-side)."},"AroundDateFlexibleWindow":{"properties":{"min_nights":{"type":"integer","maximum":90,"minimum":1,"title":"Min Nights","description":"Minimum number of nights to search inside the flexible window. For an exact stay length such as 'about 4 nights' or 'for three nights', set both min_nights and max_nights to that value.","default":1},"max_nights":{"anyOf":[{"type":"integer","maximum":90,"minimum":1},{"type":"null"}],"title":"Max Nights","description":"Maximum number of nights to search. When the traveller gives an exact stay length, explicitly set max_nights equal to min_nights instead of relying on the default."},"type":{"type":"string","const":"around_date","title":"Type","default":"around_date"},"anchor_date":{"type":"string","format":"date","title":"Anchor Date","description":"Preferred check-in date."},"flex_days":{"type":"integer","maximum":31,"minimum":0,"title":"Flex Days","description":"Number of days either side of anchor_date to search. For phrasing like 'around a date' or 'within a few days either side', explicitly set flex_days=3 instead of relying on the default.","default":3}},"additionalProperties":false,"type":"object","required":["anchor_date"],"title":"AroundDateFlexibleWindow","description":"Check-in dates within ±N days of an anchor date."},"AuDogBreed":{"properties":{"slug":{"type":"string","title":"Slug"},"display_name":{"type":"string","title":"Display Name"},"is_federally_restricted":{"type":"boolean","title":"Is Federally Restricted"},"synonyms":{"items":{"type":"string"},"type":"array","title":"Synonyms"}},"type":"object","required":["slug","display_name","is_federally_restricted"],"title":"AuDogBreed","description":"Public/API-safe view of an AU dog breed catalog entry."},"AuHolidayType":{"type":"string","enum":["school_holiday","public_holiday","christmas_nye","easter_long_weekend"],"title":"AuHolidayType","description":"Type values that appear in the au_holidays dataset."},"AustralianState":{"type":"string","enum":["new south wales","victoria","queensland","south australia","western australia","tasmania","northern territory","australian capital territory"],"title":"AustralianState","description":"Australian states and territories."},"AuthorizeDecisionRequest":{"properties":{"request_id":{"type":"string","title":"Request Id"},"decision":{"type":"string","pattern":"^(grant|deny)$","title":"Decision"}},"type":"object","required":["request_id","decision"],"title":"AuthorizeDecisionRequest","description":"Posted by the consent page to grant or deny."},"AuthorizeMetadataResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"client_name":{"type":"string","title":"Client Name"},"client_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Logo Url"},"client_homepage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Homepage Url"},"scopes":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Scopes"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},"type":"object","required":["request_id","client_name","scopes","redirect_uri"],"title":"AuthorizeMetadataResponse","description":"Consent screen payload — fetched by the frontend consent page."},"BSBLookupResponse":{"properties":{"bsb":{"type":"string","title":"Bsb"},"valid":{"type":"boolean","title":"Valid"},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name"},"bank_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Code"},"branch_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch Name"},"suburb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suburb"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},"type":"object","required":["bsb","valid"],"title":"BSBLookupResponse","description":"Result of a BSB validation/lookup."},"BankDetailsCopyRequest":{"properties":{"source_property_id":{"type":"integer","minimum":1,"title":"Source Property Id"},"target_property_id":{"type":"integer","minimum":1,"title":"Target Property Id"}},"type":"object","required":["source_property_id","target_property_id"],"title":"BankDetailsCopyRequest","description":"Request to copy verified bank details from one property to another."},"BankDetailsResponse":{"properties":{"payment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Path"},"management_fee_per_booking":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Management Fee Per Booking","description":"Current per-booking payment management fee for platform-collected path","default":"0.00"},"bsb_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bsb Masked","description":"e.g. 'XXX-456'"},"account_number_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Number Masked","description":"e.g. '****7890'"},"account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Name"},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name"},"abn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abn"},"verified":{"type":"boolean","title":"Verified","default":false}},"type":"object","title":"BankDetailsResponse","description":"Masked bank details returned to park admin."},"BankDetailsSubmit":{"properties":{"property_id":{"type":"integer","minimum":1,"title":"Property Id"},"bsb":{"type":"string","maxLength":7,"minLength":6,"title":"Bsb","description":"Australian BSB (6 digits, optional hyphen e.g. '012-345' or '012345')"},"account_number":{"type":"string","maxLength":10,"minLength":6,"title":"Account Number","description":"Bank account number (6-10 digits)"},"account_number_confirm":{"type":"string","maxLength":10,"minLength":6,"title":"Account Number Confirm","description":"Account number entered a second time for confirmation"},"account_name":{"type":"string","maxLength":200,"minLength":2,"title":"Account Name","description":"Name on the bank account"},"abn":{"type":"string","maxLength":14,"minLength":11,"title":"Abn","description":"Australian Business Number (11 digits, spaces allowed)"}},"type":"object","required":["property_id","bsb","account_number","account_number_confirm","account_name","abn"],"title":"BankDetailsSubmit","description":"Request to save bank details for platform-collected payouts."},"BatchExtractPetPolicyRequest":{"properties":{"property_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Property Ids","description":"Specific property IDs to extract. If None, extracts all properties with a website URL."},"dry_run":{"type":"boolean","title":"Dry Run","description":"If true, returns extraction results without writing to the database.","default":true}},"type":"object","title":"BatchExtractPetPolicyRequest"},"BatchMarkSentRequest":{"properties":{"payout_ids":{"items":{"type":"integer"},"type":"array","title":"Payout Ids"},"bank_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Reference"},"override_unverified_lookup":{"type":"boolean","title":"Override Unverified Lookup","default":false},"override_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Reason"}},"type":"object","required":["payout_ids"],"title":"BatchMarkSentRequest","description":"Request body for bulk marking payouts as sent."},"BatchMarkSentResponse":{"properties":{"updated_count":{"type":"integer","title":"Updated Count","default":0},"payout_ids":{"items":{"type":"integer"},"type":"array","title":"Payout Ids","default":[]}},"type":"object","title":"BatchMarkSentResponse","description":"Response after bulk-marking payouts as sent."},"BboxGeoParam":{"properties":{"type":{"type":"string","const":"bbox","title":"Type","default":"bbox"},"west":{"type":"number","maximum":180,"minimum":-180,"title":"West"},"south":{"type":"number","maximum":90,"minimum":-90,"title":"South"},"east":{"type":"number","maximum":180,"minimum":-180,"title":"East"},"north":{"type":"number","maximum":90,"minimum":-90,"title":"North"}},"additionalProperties":false,"type":"object","required":["west","south","east","north"],"title":"BboxGeoParam","description":"Pre-resolved rectangular viewport or region bounds."},"BillingGuest":{"properties":{"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name"},"last_name":{"type":"string","maxLength":100,"minLength":1,"title":"Last Name"},"email":{"type":"string","maxLength":255,"title":"Email"},"phone":{"type":"string","maxLength":20,"minLength":5,"title":"Phone"},"address":{"anyOf":[{"$ref":"#/components/schemas/BillingGuestAddress"},{"type":"null"}]}},"type":"object","required":["first_name","last_name","email","phone"],"title":"BillingGuest","description":"Cart-level billing guest collected at /prepare."},"BillingGuestAddress":{"properties":{"line1":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Line1"},"city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"State"},"postcode":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Postcode"},"country":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Country"}},"type":"object","title":"BillingGuestAddress","description":"Billing guest address sub-object."},"Body_add_profile_pic_user_profile_pic_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_add_profile_pic_user_profile_pic_post"},"Body_create_property_images__property_id__images_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_create_property_images__property_id__images_post"},"Body_introspect_endpoint_oauth_introspect_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_introspect_endpoint_oauth_introspect_post"},"Body_login_login_post":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"turnstile_token":{"type":"string","title":"Turnstile Token"}},"type":"object","required":["username","password","turnstile_token"],"title":"Body_login_login_post"},"Body_token_endpoint_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"code_verifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","required":["grant_type"],"title":"Body_token_endpoint_oauth_token_post"},"Body_upload_park_map_park_admin_property_park_map_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_park_map_park_admin_property_park_map_post"},"Body_upload_property_images_park_admin_property_images_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_property_images_park_admin_property_images_post"},"Body_upload_room_type_images_park_admin_room_types__room_type_id__images_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_room_type_images_park_admin_room_types__room_type_id__images_post"},"BookedValueMetric":{"type":"string","enum":["confirmed_bookings","confirmed_cart_stays","confirmed_carts","accommodation_amount","pet_fee_amount","service_fee_amount","booked_gross_value"],"title":"BookedValueMetric"},"BookedValueTimeBasis":{"type":"string","enum":["confirmed_at","cohort_started_at"],"title":"BookedValueTimeBasis"},"BookingDetailResponse":{"properties":{"booking_id":{"type":"integer","title":"Booking Id","description":"Total Parks booking ID"},"confirmation_number":{"type":"string","title":"Confirmation Number","description":"Bearer-secret confirmation number. Used in `?ref=...` URLs and the unauthenticated `GET /bookings/ref/{confirmation_number}` lookup. **Do not display to humans — use `booking_code` instead.**"},"pms_confirmation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Id","description":"PMS confirmation/reservation ID"},"status":{"type":"string","title":"Status","description":"Reservation status (e.g., 'confirmed')"},"payment_status":{"type":"string","title":"Payment Status","description":"Payment status (e.g., 'succeeded')"},"check_in":{"type":"string","format":"date","title":"Check In","description":"Check-in date"},"check_out":{"type":"string","format":"date","title":"Check Out","description":"Check-out date"},"adults":{"type":"integer","title":"Adults","description":"Number of adults"},"children":{"type":"integer","title":"Children","description":"Number of children","default":0},"infants":{"type":"integer","title":"Infants","description":"Number of infants","default":0},"total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total","description":"Accommodation subtotal (PMS nightly rates only). Excludes pet_fee_total and service_fee."},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total","description":"Pet fee charged to the guest (park revenue, refundable). None for legacy bookings; treat as zero."},"service_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee","description":"Total Parks service fee"},"grand_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Grand Total","description":"Total Stripe charge amount (total + pet_fee_total + service_fee)."},"currency":{"type":"string","title":"Currency","description":"Currency code (ISO 4217)"},"discount_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount Amount","description":"Phase 3 — realised discount applied to the accommodation total. Null on legacy or non-promo bookings; treat as zero. The confirmation page renders a `Discount` row when this is > 0."},"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Campaign Id","description":"Phase 3 — TP-side campaign id (joined to ``campaigns.id``)."},"promo_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Promo Code","description":"Phase 3 — canonical promo code applied to this booking, resolved via ``Booking.campaign_id → Campaign.code``."},"guest_first_name":{"type":"string","title":"Guest First Name","description":"Guest's first name"},"guest_last_name":{"type":"string","title":"Guest Last Name","description":"Guest's last name"},"guest_email":{"type":"string","title":"Guest Email","description":"Guest's email address"},"guest_phone":{"type":"string","title":"Guest Phone","description":"Guest's phone number"},"special_requests":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Requests","description":"Guest comments"},"property_id":{"type":"integer","title":"Property Id","description":"Property ID"},"property_name":{"type":"string","title":"Property Name","description":"Property name"},"property_slug":{"type":"string","title":"Property Slug","description":"Property URL slug"},"property_state":{"type":"string","title":"Property State","description":"Property state"},"property_address":{"type":"string","title":"Property Address","description":"Property address"},"property_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Email","description":"Property contact email"},"property_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Phone","description":"Property contact phone"},"room_type_id":{"type":"integer","title":"Room Type Id","description":"Room type ID"},"room_type_name":{"type":"string","title":"Room Type Name","description":"Room type name"},"room_type_slug":{"type":"string","title":"Room Type Slug","description":"Room type URL slug"},"pet_booking_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Booking Mode","description":"Effective pet booking mode applied to this booking."},"pet_declaration":{"anyOf":[{"$ref":"#/components/schemas/PetDeclaration"},{"type":"null"}],"description":"Captured pet declaration for this booking."},"equipment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Equipment Type","description":"Canonical equipment type (e.g. 'caravan', 'motorhome'). Set at booking time for site bookings; always None for cabins and for legacy bookings pre-dating migration 096."},"equipment_length":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Equipment Length","description":"Equipment length in metres (site bookings only)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Booking creation timestamp"},"is_linked_to_account":{"type":"boolean","title":"Is Linked To Account","description":"Whether this booking is linked to a user account","default":false},"booking_code":{"type":"string","title":"Booking Code","description":"Human-readable short code derived from ``confirmation_number``.","readOnly":true}},"type":"object","required":["booking_id","confirmation_number","status","payment_status","check_in","check_out","adults","total","service_fee","currency","guest_first_name","guest_last_name","guest_email","guest_phone","property_id","property_name","property_slug","property_state","property_address","room_type_id","room_type_name","room_type_slug","created_at","booking_code"],"title":"BookingDetailResponse","description":"Detailed booking response for confirmation page."},"BookingIntentSummary":{"properties":{"id":{"type":"integer","title":"Id"},"property_id":{"type":"integer","title":"Property Id"},"pms_provider":{"type":"string","title":"Pms Provider"},"status":{"type":"string","title":"Status"},"cart_stay_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cart Stay Id"},"payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Intent Id"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"},"payment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Path"},"pms_hold_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Hold Id"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Number"},"verified_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Verified Total"},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total"},"currency":{"type":"string","title":"Currency"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","property_id","pms_provider","status","currency","expires_at","created_at","updated_at"],"title":"BookingIntentSummary"},"BookingLinkResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the linking was successful"},"booking_id":{"type":"integer","title":"Booking Id","description":"The booking ID that was linked"},"message":{"type":"string","title":"Message","description":"Human-readable status message"}},"type":"object","required":["success","booking_id","message"],"title":"BookingLinkResponse","description":"Response after linking a booking to a user account."},"BookingListItem":{"properties":{"booking_id":{"type":"integer","title":"Booking Id","description":"Total Parks booking ID"},"confirmation_number":{"type":"string","title":"Confirmation Number","description":"Bearer-secret confirmation number for `?ref=...` lookups. Do not display to humans — use `booking_code` instead."},"status":{"type":"string","title":"Status","description":"Reservation status"},"payment_status":{"type":"string","title":"Payment Status","description":"Payment status"},"check_in":{"type":"string","format":"date","title":"Check In","description":"Check-in date"},"check_out":{"type":"string","format":"date","title":"Check Out","description":"Check-out date"},"total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total","description":"Accommodation subtotal"},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total","description":"Pet fee charged to guest (park revenue). None for legacy bookings."},"service_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee","description":"Total Parks service fee"},"grand_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Grand Total","description":"Total Stripe charge amount (total + pet_fee_total + service_fee)."},"currency":{"type":"string","title":"Currency","description":"Currency code (ISO 4217)"},"property_id":{"type":"integer","title":"Property Id","description":"Property ID"},"property_name":{"type":"string","title":"Property Name","description":"Property name"},"property_slug":{"type":"string","title":"Property Slug","description":"Property URL slug"},"property_state":{"type":"string","title":"Property State","description":"Property state"},"room_type_name":{"type":"string","title":"Room Type Name","description":"Room type name"},"equipment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Equipment Type","description":"Canonical equipment type for site bookings; None for cabins."},"equipment_length":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Equipment Length","description":"Equipment length in metres (site bookings only)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Booking creation timestamp"},"booking_code":{"type":"string","title":"Booking Code","description":"Human-readable short code derived from ``confirmation_number``.","readOnly":true}},"type":"object","required":["booking_id","confirmation_number","status","payment_status","check_in","check_out","total","service_fee","currency","property_id","property_name","property_slug","property_state","room_type_name","created_at","booking_code"],"title":"BookingListItem","description":"Summary of a booking for list views (e.g., My Bookings page)."},"BookingRequestCreate":{"properties":{"property_id":{"type":"integer","exclusiveMinimum":0,"title":"Property Id"},"room_type_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Room Type Id"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"adults":{"type":"integer","maximum":20,"minimum":1,"title":"Adults","default":1},"children":{"type":"integer","maximum":20,"minimum":0,"title":"Children","default":0},"accommodation_type":{"type":"string","enum":["cabin","site"],"title":"Accommodation Type"},"equipment_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Equipment Type"},"equipment_length":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Equipment Length"},"equipment_details":{"anyOf":[{"type":"string","maxLength":250},{"type":"null"}],"title":"Equipment Details"},"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name"},"last_name":{"type":"string","maxLength":100,"minLength":1,"title":"Last Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"type":"string","maxLength":20,"minLength":5,"title":"Phone"},"notes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Notes"},"source_channel":{"type":"string","maxLength":30,"title":"Source Channel","default":"web"},"source_campaign":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Source Campaign"},"source_locale":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Source Locale"},"source_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Metadata"}},"type":"object","required":["property_id","check_in","check_out","accommodation_type","first_name","last_name","email","phone"],"title":"BookingRequestCreate","description":"Payload submitted by an authenticated guest."},"BookingRequestEligibilityResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"eligible":{"type":"boolean","title":"Eligible"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["property_id","eligible"],"title":"BookingRequestEligibilityResponse","description":"Server-side eligibility check for request-to-book flow."},"BookingRequestSubmitResponse":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"reference_id":{"type":"string","title":"Reference Id"},"status":{"type":"string","title":"Status"},"submitted_at":{"type":"string","format":"date-time","title":"Submitted At"},"message":{"type":"string","title":"Message"}},"type":"object","required":["request_id","reference_id","status","submitted_at","message"],"title":"BookingRequestSubmitResponse","description":"Response after successful request submission."},"BookingSummary":{"properties":{"id":{"type":"integer","title":"Id"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"booking_code":{"type":"string","title":"Booking Code"},"status":{"type":"string","title":"Status"},"payment_status":{"type":"string","title":"Payment Status"},"cart_line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cart Line Id"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Id"},"pms_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Error"},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Amount"},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total"},"service_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee"},"currency":{"type":"string","title":"Currency"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","confirmation_number","booking_code","status","payment_status","total_amount","service_fee","currency","check_in","check_out","created_at","updated_at"],"title":"BookingSummary"},"BrowserConsentRequest":{"properties":{"schema_version":{"type":"string","const":"conversion-browser-v1","title":"Schema Version"},"consent_state":{"type":"string","enum":["unknown","denied","analytics"],"title":"Consent State"},"journey_start":{"anyOf":[{"$ref":"#/components/schemas/BrowserJourneyStartContext"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["schema_version","consent_state"],"title":"BrowserConsentRequest"},"BrowserConsentRequestV2":{"properties":{"schema_version":{"type":"string","const":"conversion-browser-v2","title":"Schema Version"},"consent_state":{"type":"string","enum":["unknown","denied","analytics","analytics_and_advertising"],"title":"Consent State"},"journey_start":{"anyOf":[{"$ref":"#/components/schemas/BrowserJourneyStartContextV2"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["schema_version","consent_state"],"title":"BrowserConsentRequestV2"},"BrowserConsentResponse":{"properties":{"active":{"type":"boolean","title":"Active"},"interactive_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Interactive Expires At"}},"additionalProperties":false,"type":"object","required":["active"],"title":"BrowserConsentResponse"},"BrowserEventBatchRequest":{"properties":{"schema_version":{"type":"string","const":"conversion-browser-v1","title":"Schema Version"},"events":{"items":{"oneOf":[{"$ref":"#/components/schemas/BrowserPropertyExposedEvent"},{"$ref":"#/components/schemas/BrowserPropertyEngagedEvent"}],"discriminator":{"propertyName":"event_name","mapping":{"property_engaged":"#/components/schemas/BrowserPropertyEngagedEvent","property_exposed":"#/components/schemas/BrowserPropertyExposedEvent"}}},"type":"array","maxItems":20,"minItems":1,"title":"Events"}},"additionalProperties":false,"type":"object","required":["schema_version","events"],"title":"BrowserEventBatchRequest"},"BrowserEventBatchResponse":{"properties":{"accepted":{"type":"integer","minimum":0,"title":"Accepted"},"duplicates":{"type":"integer","minimum":0,"title":"Duplicates"}},"additionalProperties":false,"type":"object","required":["accepted","duplicates"],"title":"BrowserEventBatchResponse"},"BrowserJourneyStartContext":{"properties":{"schema_version":{"type":"string","const":"conversion-gui-journey-v1","title":"Schema Version"},"market_country_code":{"type":"string","enum":["AU","NZ"],"title":"Market Country Code"},"path":{"type":"string","maxLength":500,"minLength":1,"title":"Path"},"referrer_origin":{"anyOf":[{"type":"string","maxLength":255,"minLength":8},{"type":"null"}],"title":"Referrer Origin"},"utm_source":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string","maxLength":160,"minLength":1},{"type":"null"}],"title":"Utm Campaign"},"utm_term":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Utm Term"},"utm_content":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Utm Content"}},"additionalProperties":false,"type":"object","required":["schema_version","market_country_code","path"],"title":"BrowserJourneyStartContext","description":"Bounded first-party route and attribution context for one GUI touch."},"BrowserJourneyStartContextV2":{"properties":{"schema_version":{"type":"string","const":"conversion-gui-journey-v2","title":"Schema Version"},"market_country_code":{"type":"string","enum":["AU","NZ"],"title":"Market Country Code"},"path":{"type":"string","maxLength":500,"minLength":1,"title":"Path"},"referrer_origin":{"anyOf":[{"type":"string","maxLength":255,"minLength":8},{"type":"null"}],"title":"Referrer Origin"},"utm_source":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string","maxLength":160,"minLength":1},{"type":"null"}],"title":"Utm Campaign"},"utm_term":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Utm Term"},"utm_content":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Utm Content"},"oppref":{"anyOf":[{"type":"string","maxLength":512,"minLength":6},{"type":"null"}],"title":"Oppref"}},"additionalProperties":false,"type":"object","required":["schema_version","market_country_code","path"],"title":"BrowserJourneyStartContextV2","description":"Bounded first-party route and advertising-attribution context."},"BrowserPropertyEngagedEvent":{"properties":{"idempotency_key":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9:._-]*$","title":"Idempotency Key"},"property_id":{"type":"integer","exclusiveMinimum":0,"title":"Property Id"},"event_name":{"type":"string","const":"property_engaged","title":"Event Name"},"payload":{"$ref":"#/components/schemas/PropertyEngagedPayload"}},"additionalProperties":false,"type":"object","required":["idempotency_key","property_id","event_name","payload"],"title":"BrowserPropertyEngagedEvent"},"BrowserPropertyExposedEvent":{"properties":{"idempotency_key":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9:._-]*$","title":"Idempotency Key"},"property_id":{"type":"integer","exclusiveMinimum":0,"title":"Property Id"},"event_name":{"type":"string","const":"property_exposed","title":"Event Name"},"payload":{"$ref":"#/components/schemas/PropertyExposedPayload"}},"additionalProperties":false,"type":"object","required":["idempotency_key","property_id","event_name","payload"],"title":"BrowserPropertyExposedEvent"},"BrowserRevocationRequest":{"properties":{"schema_version":{"type":"string","const":"conversion-browser-v1","title":"Schema Version"},"consent_state":{"type":"string","const":"denied","title":"Consent State"}},"additionalProperties":false,"type":"object","required":["schema_version","consent_state"],"title":"BrowserRevocationRequest"},"BrowserRevocationRequestV2":{"properties":{"schema_version":{"type":"string","const":"conversion-browser-v2","title":"Schema Version"},"consent_state":{"type":"string","const":"denied","title":"Consent State"}},"additionalProperties":false,"type":"object","required":["schema_version","consent_state"],"title":"BrowserRevocationRequestV2"},"BulkCreateFromPropertiesRequest":{"properties":{"property_ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"minItems":1,"title":"Property Ids"}},"type":"object","required":["property_ids"],"title":"BulkCreateFromPropertiesRequest"},"BulkPetPolicyRequest":{"properties":{"room_type_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Room Type Ids"},"pets_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pets Allowed"},"pet_booking_mode":{"anyOf":[{"type":"string","enum":["instant","blocked"]},{"type":"null"}],"title":"Pet Booking Mode"},"pet_max_count":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Pet Max Count"},"pet_fee_amount":{"anyOf":[{"type":"number","minimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Amount"},"pet_fee_basis":{"anyOf":[{"type":"string","enum":["per_stay","per_night","per_pet_per_stay","per_pet_per_night"]},{"type":"null"}],"title":"Pet Fee Basis"},"pet_fee_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Pet Fee Currency"},"pet_fee_review_status":{"anyOf":[{"type":"string","enum":["unknown","inferred_unreviewed","admin_confirmed","pms_confirmed"]},{"type":"null"}],"title":"Pet Fee Review Status"},"pet_fee_note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Pet Fee Note"},"pet_restrictions":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Pet Restrictions"},"pet_max_size":{"anyOf":[{"type":"string","enum":["small","medium"]},{"type":"null"}],"title":"Pet Max Size"},"pet_size_examples":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Pet Size Examples"},"pet_requested_detail_fields":{"anyOf":[{"items":{"type":"string","enum":["pet_type","pet_size","pet_weight"]},"type":"array"},{"type":"null"}],"title":"Pet Requested Detail Fields"}},"type":"object","required":["room_type_ids"],"title":"BulkPetPolicyRequest","description":"Apply pet policy settings to multiple room types at once."},"BulkUpdateStatusRequest":{"properties":{"lead_ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"minItems":1,"title":"Lead Ids"},"status":{"type":"string","maxLength":20,"minLength":1,"title":"Status"}},"type":"object","required":["lead_ids","status"],"title":"BulkUpdateStatusRequest"},"CalendarMonthFlexibleWindow":{"properties":{"min_nights":{"type":"integer","maximum":90,"minimum":1,"title":"Min Nights","description":"Minimum number of nights to search inside the flexible window. For an exact stay length such as 'about 4 nights' or 'for three nights', set both min_nights and max_nights to that value.","default":1},"max_nights":{"anyOf":[{"type":"integer","maximum":90,"minimum":1},{"type":"null"}],"title":"Max Nights","description":"Maximum number of nights to search. When the traveller gives an exact stay length, explicitly set max_nights equal to min_nights instead of relying on the default."},"type":{"type":"string","const":"calendar_month","title":"Type","default":"calendar_month"},"year":{"type":"integer","maximum":2100,"minimum":2024,"title":"Year"},"month":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}},"additionalProperties":false,"type":"object","required":["year","month"],"title":"CalendarMonthFlexibleWindow","description":"Check-in dates anywhere in one calendar month."},"CanonicalStage":{"type":"string","enum":["journey_started","property_exposed","property_engaged","availability_checked","bookable_option_returned","cart_created","checkout_prepared","payment_succeeded","booking_confirmed"],"title":"CanonicalStage"},"CapabilityInclude":{"type":"string","enum":["raw","summary","both"],"title":"CapabilityInclude","description":"Which projection layer(s) the caller wants in the response."},"CapabilitySignal":{"properties":{"feature_id":{"type":"integer","title":"Feature Id","description":"ID of the property_features row this signal is about."},"feature_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Name","description":"Display name of the feature (joined from property_features)."},"feature_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Category","description":"Category of the feature (e.g. 'Recreation', 'Pet')."},"scope_type":{"type":"string","title":"Scope Type","description":"What the fact applies to: 'property' today; 'room_type', 'area', 'policy', or 'date_rule' in later phases."},"scope_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scope Id","description":"ID of the scoped child entity (room type / area), or null for property-scoped facts."},"value":{"type":"string","title":"Value","description":"Tri-state assertion: 'present', 'absent', or 'unknown'."},"source":{"type":"string","title":"Source","description":"Provenance class, trust-ordered: 'enforced' > 'structured' > 'classified' > 'operator' > 'inferred' > 'mined'."},"confidence":{"type":"string","title":"Confidence","description":"Ordinal confidence bucket: 'verified' > 'high' > 'medium' > 'low'. Stored separately from source so corroboration can bump a signal without rewriting its provenance."},"status":{"type":"string","title":"Status","description":"'active' or 'conflicting'. A conflicting signal lost a disagreement to a higher-trust source but is retained, never silently dropped. Superseded signals are excluded from this endpoint."},"observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Observed At","description":"When the fact was last observed from its source."},"source_record_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Record Type","description":"Identifier of the originating record type (e.g. 'properties.features') for traceability back to the source."},"source_record_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Record Id","description":"ID of the originating source record, when applicable."}},"type":"object","required":["feature_id","scope_type","value","source","confidence","status"],"title":"CapabilitySignal","description":"A single raw, sourced capability fact scoped to the property.\n\nRaw signals make uncertainty explicit: a caller can see every source\nthat asserted a fact, how reliable each source is, when it was observed,\nand whether it currently conflicts with a higher-trust signal. Use the\nsummary layer for safe-to-publish claims; use this layer to reason about\nprovenance and disagreement."},"CapabilitySummary":{"properties":{"feature_id":{"type":"integer","title":"Feature Id","description":"ID of the property_features row this summary is about."},"feature_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Name","description":"Display name of the feature (joined from property_features)."},"feature_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Category","description":"Category of the feature (e.g. 'Recreation', 'Pet')."},"scope_type":{"type":"string","title":"Scope Type","description":"What the claim applies to: 'property' today; child scopes in later phases."},"scope_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scope Id","description":"ID of the scoped child entity, or null for property-scoped claims."},"value":{"type":"string","title":"Value","description":"Published assertion: 'present', 'absent', or 'unknown'."},"winning_source":{"type":"string","title":"Winning Source","description":"Provenance class of the signal that won this claim."},"winning_confidence":{"type":"string","title":"Winning Confidence","description":"Confidence bucket of the winning signal."},"supporting_signal_ids":{"items":{"type":"integer"},"type":"array","title":"Supporting Signal Ids","description":"IDs of the raw property_feature_signals that justified this published claim, for traceability back to the evidence."},"computed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Computed At","description":"When this summary was last (re)projected from raw signals."}},"type":"object","required":["feature_id","scope_type","value","winning_source","winning_confidence","supporting_signal_ids"],"title":"CapabilitySummary","description":"A derived, traceable capability claim safe for public read surfaces.\n\nSummaries are conservative by construction: a claim is only published\nwhen an enforced/structured source backs it, or when there is no\ndisagreement. A conflict between two non-enforced sources suppresses the\npublic claim entirely (the summary goes silent) while both raw signals\nstay queryable. Every summary traces back to the raw signals that\njustified it via ``supporting_signal_ids``."},"CaptureApplyRequest":{"properties":{"source_gmail_message_id":{"type":"string","maxLength":128,"minLength":1,"title":"Source Gmail Message Id"},"source_gmail_thread_id":{"type":"string","maxLength":128,"minLength":1,"title":"Source Gmail Thread Id"},"type":{"type":"string","maxLength":20,"minLength":1,"title":"Type","default":"email"},"direction":{"type":"string","maxLength":20,"minLength":1,"title":"Direction"},"summary":{"type":"string","minLength":1,"title":"Summary"},"lead_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lead Id"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"affiliation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Affiliation Id"},"follow_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Follow Up At"},"capture_confidence":{"type":"number","maximum":1,"minimum":0,"title":"Capture Confidence"},"capture_model":{"type":"string","maxLength":80,"minLength":1,"title":"Capture Model"},"capture_prompt_version":{"type":"string","maxLength":80,"minLength":1,"title":"Capture Prompt Version"}},"type":"object","required":["source_gmail_message_id","source_gmail_thread_id","direction","summary","capture_confidence","capture_model","capture_prompt_version"],"title":"CaptureApplyRequest"},"CaptureProposalBatchRequest":{"properties":{"decisions":{"items":{"$ref":"#/components/schemas/CaptureProposalDecision"},"type":"array","minItems":1,"title":"Decisions"}},"type":"object","required":["decisions"],"title":"CaptureProposalBatchRequest"},"CaptureProposalDecision":{"properties":{"id":{"type":"integer","title":"Id"},"action":{"type":"string","enum":["accept","reject"],"title":"Action"},"edits":{"anyOf":[{"$ref":"#/components/schemas/CaptureProposalEdits"},{"type":"null"}]}},"type":"object","required":["id","action"],"title":"CaptureProposalDecision"},"CaptureProposalEdits":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"},"park_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Park Name"},"contact_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Contact Phone"},"to_status":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"To Status"},"property_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Group Id"},"property_management_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Management Id"},"partner_label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Partner Label"}},"type":"object","title":"CaptureProposalEdits"},"CaptureProposalUpsert":{"properties":{"kind":{"type":"string","enum":["create_person","create_affiliation","create_lead","update_contact","stage_transition"],"title":"Kind"},"gmail_thread_id":{"type":"string","maxLength":128,"minLength":1,"title":"Gmail Thread Id"},"gmail_message_id":{"type":"string","maxLength":128,"minLength":1,"title":"Gmail Message Id"},"counterpart_emails":{"items":{"type":"string"},"type":"array","title":"Counterpart Emails","default":[]},"subject":{"anyOf":[{"type":"string","maxLength":998},{"type":"null"}],"title":"Subject"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"lead_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lead Id"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"affiliation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Affiliation Id"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"current":{"additionalProperties":true,"type":"object","title":"Current"},"reason":{"type":"string","minLength":1,"title":"Reason"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"direction":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Direction"},"follow_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Follow Up At"},"capture_confidence":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Capture Confidence"},"capture_model":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Capture Model"},"capture_prompt_version":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Capture Prompt Version"}},"type":"object","required":["kind","gmail_thread_id","gmail_message_id","reason"],"title":"CaptureProposalUpsert"},"CaptureUnresolvedDismiss":{"properties":{"status":{"type":"string","maxLength":20,"minLength":1,"title":"Status","default":"dismissed"}},"type":"object","title":"CaptureUnresolvedDismiss"},"CaptureUnresolvedUpsert":{"properties":{"gmail_thread_id":{"type":"string","maxLength":128,"minLength":1,"title":"Gmail Thread Id"},"gmail_message_id":{"type":"string","maxLength":128,"minLength":1,"title":"Gmail Message Id"},"counterpart_emails":{"items":{"type":"string"},"type":"array","title":"Counterpart Emails","default":[]},"subject":{"anyOf":[{"type":"string","maxLength":998},{"type":"null"}],"title":"Subject"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"scope_label":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Scope Label"},"unresolved_reason":{"type":"string","minLength":1,"title":"Unresolved Reason"},"capture_model":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Capture Model"},"capture_prompt_version":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Capture Prompt Version"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"direction":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Direction"},"follow_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Follow Up At"},"stage_cue":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Stage Cue"},"capture_confidence":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Capture Confidence"},"holder_candidates":{"items":{"$ref":"#/components/schemas/HolderCandidate"},"type":"array","title":"Holder Candidates","default":[]}},"type":"object","required":["gmail_thread_id","gmail_message_id","unresolved_reason"],"title":"CaptureUnresolvedUpsert"},"CartErrorEnvelope":{"properties":{"error_code":{"type":"string","title":"Error Code"},"error_category":{"type":"string","enum":["validation","auth","rate_limit","pms_unavailable","payment","internal"],"title":"Error Category"},"message":{"type":"string","title":"Message"},"recovery_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recovery Hint"},"retryable":{"type":"boolean","title":"Retryable","default":false},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["error_code","error_category","message"],"title":"CartErrorEnvelope","description":"Structured error body for non-2xx cart responses."},"CartLineSchema":{"properties":{"id":{"type":"integer","title":"Id"},"position":{"type":"integer","title":"Position"},"room_type_id":{"type":"integer","title":"Room Type Id"},"rate_plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Plan Id"},"area_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area Id"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"adults":{"type":"integer","title":"Adults"},"children":{"type":"integer","title":"Children","default":0},"infants":{"type":"integer","title":"Infants","default":0},"pet_declaration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pet Declaration"},"equipment":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Equipment"},"lead_guest_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lead Guest Override"},"total_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Amount","description":"Accommodation subtotal as string decimal."},"pet_fee_total":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Fee Total","description":"Pet fee total as string decimal."},"discount_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Amount","description":"Discount applied as string decimal."},"rates_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rates Snapshot"},"booking_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Booking Id"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Number"},"special_requests":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Requests"}},"type":"object","required":["id","position","room_type_id","check_in","check_out","adults"],"title":"CartLineSchema","description":"Response shape for a single cart line (one room/site)."},"CartLineSummary":{"properties":{"id":{"type":"integer","title":"Id"},"cart_stay_id":{"type":"integer","title":"Cart Stay Id"},"position":{"type":"integer","title":"Position"},"room_type_id":{"type":"integer","title":"Room Type Id"},"rate_plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Plan Id"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"adults":{"type":"integer","title":"Adults"},"children":{"type":"integer","title":"Children"},"infants":{"type":"integer","title":"Infants"},"total_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Total Amount"},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total"},"booking_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Booking Id"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Number"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","cart_stay_id","position","room_type_id","check_in","check_out","adults","children","infants","created_at","updated_at"],"title":"CartLineSummary"},"CartLookupHit":{"properties":{"cart_id":{"type":"integer","title":"Cart Id"},"matched_via":{"type":"string","title":"Matched Via"},"matched_value":{"type":"string","title":"Matched Value"}},"type":"object","required":["cart_id","matched_via","matched_value"],"title":"CartLookupHit"},"CartLookupResponse":{"properties":{"hits":{"items":{"$ref":"#/components/schemas/CartLookupHit"},"type":"array","title":"Hits"}},"type":"object","required":["hits"],"title":"CartLookupResponse"},"CartResponseEnvelope":{"properties":{"cart":{"$ref":"#/components/schemas/CartSchema"},"applied_changes":{"items":{"$ref":"#/components/schemas/AppliedChange"},"type":"array","title":"Applied Changes"},"warnings":{"items":{"$ref":"#/components/schemas/CartWarning"},"type":"array","title":"Warnings"},"errors":{"items":{"$ref":"#/components/schemas/CartErrorEnvelope"},"type":"array","title":"Errors"},"cart_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cart Token","description":"Plaintext cart token — returned ONCE on create and link-user."}},"type":"object","required":["cart"],"title":"CartResponseEnvelope","description":"Standard response wrapper returned by every cart endpoint."},"CartSchema":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"billing_guest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Billing Guest"},"promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Code"},"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Campaign Id"},"commit_strategy":{"type":"string","title":"Commit Strategy","default":"atomic"},"currency":{"type":"string","title":"Currency","default":"AUD"},"created_via":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Via"},"embed_integrator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Integrator"},"embed_parent_origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Parent Origin"},"stays":{"items":{"$ref":"#/components/schemas/CartStaySchema"},"type":"array","title":"Stays"},"totals":{"$ref":"#/components/schemas/CartTotals"},"payment_intent":{"anyOf":[{"$ref":"#/components/schemas/PaymentIntentInfo"},{"type":"null"}]}},"type":"object","required":["id","status","expires_at"],"title":"CartSchema","description":"Full cart state returned from every mutation."},"CartStaySchema":{"properties":{"id":{"type":"integer","title":"Id"},"position":{"type":"integer","title":"Position"},"property_id":{"type":"integer","title":"Property Id"},"pms_provider":{"type":"string","title":"Pms Provider"},"lead_guest_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lead Guest Override"},"special_requests":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Requests"},"booking_intent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Booking Intent Id"},"pricing_source":{"type":"string","title":"Pricing Source","default":"cached"},"quoted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Quoted At"},"status":{"type":"string","title":"Status"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"lines":{"items":{"$ref":"#/components/schemas/CartLineSchema"},"type":"array","title":"Lines"}},"type":"object","required":["id","position","property_id","pms_provider","status"],"title":"CartStaySchema","description":"Response shape for a single cart stay (one property/PMS transaction)."},"CartStaySummary":{"properties":{"id":{"type":"integer","title":"Id"},"cart_id":{"type":"integer","title":"Cart Id"},"position":{"type":"integer","title":"Position"},"property_id":{"type":"integer","title":"Property Id"},"pms_provider":{"type":"string","title":"Pms Provider"},"status":{"type":"string","title":"Status"},"pricing_source":{"type":"string","title":"Pricing Source"},"booking_intent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Booking Intent Id"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","cart_id","position","property_id","pms_provider","status","pricing_source","created_at","updated_at"],"title":"CartStaySummary"},"CartSummary":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"auth_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Method"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"created_via":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Via"},"embed_integrator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Integrator"},"embed_parent_origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Parent Origin"},"currency":{"type":"string","title":"Currency"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"billing_guest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Billing Guest"},"payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Intent Id"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"},"service_fee":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Service Fee"}},"type":"object","required":["id","status","currency","created_at","updated_at"],"title":"CartSummary"},"CartTotals":{"properties":{"accommodation":{"type":"string","title":"Accommodation","description":"Sum of line accommodation subtotals.","default":"0.00"},"pet_fee":{"type":"string","title":"Pet Fee","description":"Sum of line pet fees.","default":"0.00"},"discount":{"type":"string","title":"Discount","description":"Sum of line discounts.","default":"0.00"},"service_fee":{"type":"string","title":"Service Fee","description":"TP platform fee on (accommodation + pet_fee - discount).","default":"0.00"},"grand_total":{"type":"string","title":"Grand Total","description":"Guest-pays total.","default":"0.00"},"currency":{"type":"string","title":"Currency","default":"AUD"}},"type":"object","title":"CartTotals","description":"Rolled-up totals for the entire cart."},"CartTraceResponse":{"properties":{"cart":{"$ref":"#/components/schemas/CartSummary"},"stays":{"items":{"$ref":"#/components/schemas/CartStaySummary"},"type":"array","title":"Stays"},"lines":{"items":{"$ref":"#/components/schemas/CartLineSummary"},"type":"array","title":"Lines"},"booking_intents":{"items":{"$ref":"#/components/schemas/BookingIntentSummary"},"type":"array","title":"Booking Intents"},"bookings":{"items":{"$ref":"#/components/schemas/BookingSummary"},"type":"array","title":"Bookings"},"timeline":{"items":{"$ref":"#/components/schemas/TraceEvent"},"type":"array","title":"Timeline"}},"type":"object","required":["cart","stays","lines","booking_intents","bookings","timeline"],"title":"CartTraceResponse","description":"End-to-end trace of a single cart and everything chained off it."},"CartWarning":{"properties":{"code":{"type":"string","title":"Code"},"stay_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stay Id"},"line_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Id"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["code","reason"],"title":"CartWarning","description":"Non-fatal warning attached to a cart response."},"CategoryDimensionInfo":{"properties":{"room_type_id":{"type":"integer","title":"Room Type Id"},"category_name":{"type":"string","title":"Category Name"},"length_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length M"},"width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width M"},"dimension_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimension Source"},"dimension_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimension Confidence"},"area_count":{"type":"integer","title":"Area Count","default":0},"areas_with_dimensions":{"type":"integer","title":"Areas With Dimensions","default":0},"dimensions_unlimited":{"type":"boolean","title":"Dimensions Unlimited","default":false},"areas":{"items":{"$ref":"#/components/schemas/AreaDimensionInfo"},"type":"array","title":"Areas","default":[]},"equipment_types":{"items":{"$ref":"#/components/schemas/InferredEquipmentType"},"type":"array","title":"Equipment Types","default":[]},"areas_with_area_level_dwellings":{"type":"integer","title":"Areas With Area Level Dwellings","default":0},"areas_with_category_mismatch":{"type":"integer","title":"Areas With Category Mismatch","default":0},"areas_with_length_source_conflicts":{"type":"integer","title":"Areas With Length Source Conflicts","default":0}},"type":"object","required":["room_type_id","category_name"],"title":"CategoryDimensionInfo","description":"Dimension info for a single site category."},"CeleryHealthErrorResponse":{"properties":{"status":{"type":"string","title":"Status"},"error":{"type":"string","title":"Error"}},"type":"object","required":["status","error"],"title":"CeleryHealthErrorResponse","description":"Response model for Celery health check errors."},"CeleryHealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"workers":{"items":{"type":"string"},"type":"array","title":"Workers"},"ping_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Result"}},"type":"object","required":["status","workers"],"title":"CeleryHealthResponse","description":"Response model for Celery health check."},"CheckoutWorkloadMetric":{"type":"string","enum":["cart_created","booking_intent_created","payment_succeeded_intent","booking_created","confirmed_booking","confirmed_cart_stay","confirmed_cart"],"title":"CheckoutWorkloadMetric"},"CheckoutWorkloadTimeBasis":{"type":"string","enum":["activity_at","cohort_started_at"],"title":"CheckoutWorkloadTimeBasis"},"ClaimRequestCreate":{"properties":{"park_name":{"type":"string","maxLength":200,"minLength":3,"title":"Park Name","description":"Name of the park"},"park_address":{"type":"string","maxLength":500,"minLength":10,"title":"Park Address","description":"Full address of the park"},"park_state":{"$ref":"#/components/schemas/AustralianState","description":"Australian state"},"contact_name":{"type":"string","maxLength":100,"title":"Contact Name","description":"Contact person name"},"contact_email":{"type":"string","format":"email","title":"Contact Email","description":"Contact email address"},"contact_phone":{"type":"string","maxLength":20,"minLength":8,"title":"Contact Phone","description":"Contact phone number"},"pms_type":{"$ref":"#/components/schemas/app__schemas__park_claim_request__PMSType","description":"Property Management System type"},"request_newbook_setup":{"type":"boolean","title":"Request Newbook Setup","description":"Request Newbook to activate the Total Parks channel (only relevant when pms_type=newbook)","default":false},"message":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Message","description":"Optional message from submitter"},"linked_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Property Id","description":"Property ID if claiming an existing listing"},"honeypot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Honeypot","description":"Hidden field for spam detection - must be empty"},"turnstile_token":{"type":"string","title":"Turnstile Token","description":"Cloudflare Turnstile verification token"}},"type":"object","required":["park_name","park_address","park_state","contact_name","contact_email","contact_phone","pms_type","turnstile_token"],"title":"ClaimRequestCreate","description":"Schema for creating a new claim request (public form submission)."},"ClaimRequestDetail":{"properties":{"id":{"type":"integer","title":"Id"},"park_name":{"type":"string","title":"Park Name"},"park_address":{"type":"string","title":"Park Address"},"park_state":{"type":"string","title":"Park State"},"contact_name":{"type":"string","title":"Contact Name"},"contact_email":{"type":"string","title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"pms_type":{"type":"string","title":"Pms Type"},"request_newbook_setup":{"type":"boolean","title":"Request Newbook Setup","default":false},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"status":{"$ref":"#/components/schemas/ClaimRequestStatus"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"linked_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Property Id"},"created_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created Property Id"},"created_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created User Id"},"submitted_at":{"type":"string","format":"date-time","title":"Submitted At"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"reviewed_by_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviewed By User Id"},"linked_property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linked Property Name"}},"type":"object","required":["id","park_name","park_address","park_state","contact_name","contact_email","pms_type","status","submitted_at"],"title":"ClaimRequestDetail","description":"Full claim request details for admin view."},"ClaimRequestListItem":{"properties":{"id":{"type":"integer","title":"Id"},"park_name":{"type":"string","title":"Park Name"},"contact_email":{"type":"string","title":"Contact Email"},"pms_type":{"type":"string","title":"Pms Type"},"request_newbook_setup":{"type":"boolean","title":"Request Newbook Setup","default":false},"status":{"$ref":"#/components/schemas/ClaimRequestStatus"},"submitted_at":{"type":"string","format":"date-time","title":"Submitted At"},"linked_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Property Id"},"created_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created Property Id"}},"type":"object","required":["id","park_name","contact_email","pms_type","status","submitted_at"],"title":"ClaimRequestListItem","description":"Claim request summary for admin list view."},"ClaimRequestListResponse":{"properties":{"requests":{"items":{"$ref":"#/components/schemas/ClaimRequestListItem"},"type":"array","title":"Requests"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["requests","total","page","limit"],"title":"ClaimRequestListResponse","description":"Paginated response for admin claim request list."},"ClaimRequestStatus":{"type":"string","enum":["pending","approved","rejected"],"title":"ClaimRequestStatus","description":"Status of a park claim request."},"ClaimRequestSubmitResponse":{"properties":{"id":{"type":"integer","title":"Id"},"park_name":{"type":"string","title":"Park Name"},"status":{"$ref":"#/components/schemas/ClaimRequestStatus"},"message":{"type":"string","title":"Message","default":"Your request has been submitted successfully"}},"type":"object","required":["id","park_name","status"],"title":"ClaimRequestSubmitResponse","description":"Response after successfully submitting a claim request."},"ComponentHealth":{"properties":{"status":{"type":"string","title":"Status"},"latency_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latency Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["status"],"title":"ComponentHealth","description":"Health status of an individual component."},"ConfirmCartRequest":{"properties":{"payment_intent_id":{"type":"string","title":"Payment Intent Id","description":"Stripe PaymentIntent ID."},"guest":{"$ref":"#/components/schemas/GuestDetailsSchema","description":"Primary guest details for PMS finalisation."},"pet":{"anyOf":[{"$ref":"#/components/schemas/PetDeclaration"},{"type":"null"}],"description":"Pet declaration captured at checkout."}},"type":"object","required":["payment_intent_id","guest"],"title":"ConfirmCartRequest","description":"``POST /carts/{id}/confirm`` body."},"ConstraintConfidence":{"type":"string","enum":["confirmed","inferred"],"title":"ConstraintConfidence"},"ConversionBookedValueAppliedFilters":{"properties":{"time_basis":{"$ref":"#/components/schemas/BookedValueTimeBasis"},"conversion_surface":{"anyOf":[{"$ref":"#/components/schemas/Surface"},{"type":"null"}]},"created_via":{"anyOf":[{"$ref":"#/components/schemas/CreatedVia"},{"type":"null"}]},"property_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Property Id"},"property_country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Property Country Code"},"embed_integrator":{"anyOf":[{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-z0-9][a-z0-9-]*$"},{"type":"null"}],"title":"Embed Integrator"},"currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Currency"}},"additionalProperties":false,"type":"object","required":["time_basis"],"title":"ConversionBookedValueAppliedFilters"},"ConversionBookedValueResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"applied_filters":{"$ref":"#/components/schemas/ConversionBookedValueAppliedFilters"},"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"time_basis":{"$ref":"#/components/schemas/BookedValueTimeBasis"},"rows":{"items":{"$ref":"#/components/schemas/ConversionBookedValueRow"},"type":"array","title":"Rows"}},"additionalProperties":false,"type":"object","required":["query","applied_filters","envelope","time_basis","rows"],"title":"ConversionBookedValueResponse"},"ConversionBookedValueRow":{"properties":{"day_utc":{"type":"string","format":"date","title":"Day Utc"},"metric_name":{"$ref":"#/components/schemas/BookedValueMetric"},"counting_unit":{"$ref":"#/components/schemas/ReportingCountingUnit"},"currency":{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$","title":"Currency"},"metric_value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Metric Value"}},"additionalProperties":false,"type":"object","required":["day_utc","metric_name","counting_unit","currency","metric_value"],"title":"ConversionBookedValueRow"},"ConversionCampaignBookedValueAppliedFilters":{"properties":{"entry_surface":{"anyOf":[{"$ref":"#/components/schemas/Surface"},{"type":"null"}]},"entry_market_country_code":{"anyOf":[{"type":"string","enum":["AU","NZ"]},{"type":"null"}],"title":"Entry Market Country Code"},"entry_page_type":{"anyOf":[{"$ref":"#/components/schemas/EntryPageType"},{"type":"null"}]},"entry_page_key":{"anyOf":[{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9:._-]*$"},{"type":"null"}],"title":"Entry Page Key"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"time_basis":{"$ref":"#/components/schemas/BookedValueTimeBasis"},"conversion_surface":{"anyOf":[{"$ref":"#/components/schemas/Surface"},{"type":"null"}]},"created_via":{"anyOf":[{"$ref":"#/components/schemas/CreatedVia"},{"type":"null"}]},"property_country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Property Country Code"},"currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Currency"}},"additionalProperties":false,"type":"object","required":["time_basis"],"title":"ConversionCampaignBookedValueAppliedFilters"},"ConversionCampaignBookedValueResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"applied_filters":{"$ref":"#/components/schemas/ConversionCampaignBookedValueAppliedFilters"},"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"time_basis":{"$ref":"#/components/schemas/BookedValueTimeBasis"},"rows":{"items":{"$ref":"#/components/schemas/ConversionBookedValueRow"},"type":"array","title":"Rows"}},"additionalProperties":false,"type":"object","required":["query","applied_filters","envelope","time_basis","rows"],"title":"ConversionCampaignBookedValueResponse"},"ConversionCampaignCreativeStage":{"properties":{"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"stage":{"$ref":"#/components/schemas/CanonicalStage"},"stage_journeys":{"type":"integer","minimum":0,"title":"Stage Journeys"}},"additionalProperties":false,"type":"object","required":["stage","stage_journeys"],"title":"ConversionCampaignCreativeStage"},"ConversionCampaignFunnelAppliedFilters":{"properties":{"entry_surface":{"anyOf":[{"$ref":"#/components/schemas/Surface"},{"type":"null"}]},"entry_market_country_code":{"anyOf":[{"type":"string","enum":["AU","NZ"]},{"type":"null"}],"title":"Entry Market Country Code"},"entry_page_type":{"anyOf":[{"$ref":"#/components/schemas/EntryPageType"},{"type":"null"}]},"entry_page_key":{"anyOf":[{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9:._-]*$"},{"type":"null"}],"title":"Entry Page Key"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"}},"additionalProperties":false,"type":"object","title":"ConversionCampaignFunnelAppliedFilters"},"ConversionCampaignFunnelResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"applied_filters":{"$ref":"#/components/schemas/ConversionCampaignFunnelAppliedFilters"},"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"counting_unit":{"type":"string","const":"journey","title":"Counting Unit","default":"journey"},"stages":{"items":{"$ref":"#/components/schemas/ConversionCampaignFunnelStage"},"type":"array","title":"Stages"},"creatives":{"items":{"$ref":"#/components/schemas/ConversionCampaignCreativeStage"},"type":"array","title":"Creatives"}},"additionalProperties":false,"type":"object","required":["query","applied_filters","envelope","stages","creatives"],"title":"ConversionCampaignFunnelResponse"},"ConversionCampaignFunnelStage":{"properties":{"stage":{"$ref":"#/components/schemas/CanonicalStage"},"provisional":{"type":"boolean","title":"Provisional"},"stage_journeys":{"type":"integer","minimum":0,"title":"Stage Journeys"}},"additionalProperties":false,"type":"object","required":["stage","provisional","stage_journeys"],"title":"ConversionCampaignFunnelStage"},"ConversionCheckoutWorkloadAppliedFilters":{"properties":{"time_basis":{"$ref":"#/components/schemas/CheckoutWorkloadTimeBasis"},"conversion_surface":{"anyOf":[{"$ref":"#/components/schemas/Surface"},{"type":"null"}]},"created_via":{"anyOf":[{"$ref":"#/components/schemas/CreatedVia"},{"type":"null"}]},"property_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Property Id"},"property_country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Property Country Code"},"embed_integrator":{"anyOf":[{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-z0-9][a-z0-9-]*$"},{"type":"null"}],"title":"Embed Integrator"}},"additionalProperties":false,"type":"object","required":["time_basis"],"title":"ConversionCheckoutWorkloadAppliedFilters"},"ConversionCheckoutWorkloadResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"applied_filters":{"$ref":"#/components/schemas/ConversionCheckoutWorkloadAppliedFilters"},"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"time_basis":{"$ref":"#/components/schemas/CheckoutWorkloadTimeBasis"},"aggregation_scope":{"$ref":"#/components/schemas/ReportingAggregationScope"},"rows":{"items":{"$ref":"#/components/schemas/ConversionCheckoutWorkloadRow"},"type":"array","title":"Rows"}},"additionalProperties":false,"type":"object","required":["query","applied_filters","envelope","time_basis","aggregation_scope","rows"],"title":"ConversionCheckoutWorkloadResponse"},"ConversionCheckoutWorkloadRow":{"properties":{"day_utc":{"type":"string","format":"date","title":"Day Utc"},"metric_name":{"$ref":"#/components/schemas/CheckoutWorkloadMetric"},"counting_unit":{"$ref":"#/components/schemas/ReportingCountingUnit"},"metric_value":{"type":"integer","minimum":0,"title":"Metric Value"}},"additionalProperties":false,"type":"object","required":["day_utc","metric_name","counting_unit","metric_value"],"title":"ConversionCheckoutWorkloadRow"},"ConversionDailyCoverage":{"properties":{"day_utc":{"type":"string","format":"date","title":"Day Utc"},"gui_status":{"$ref":"#/components/schemas/ConversionSyntheticRunStatus"},"embed_status":{"$ref":"#/components/schemas/ConversionSyntheticRunStatus"},"mcp_status":{"$ref":"#/components/schemas/ConversionSyntheticRunStatus"},"booking_snapshot_numerator":{"type":"integer","minimum":0,"title":"Booking Snapshot Numerator"},"booking_snapshot_denominator":{"type":"integer","minimum":0,"title":"Booking Snapshot Denominator"},"cart_journey_numerator":{"type":"integer","minimum":0,"title":"Cart Journey Numerator"},"cart_journey_denominator":{"type":"integer","minimum":0,"title":"Cart Journey Denominator"},"entry_page_numerator":{"type":"integer","minimum":0,"title":"Entry Page Numerator"},"entry_page_denominator":{"type":"integer","minimum":0,"title":"Entry Page Denominator"},"duplicate_numerator":{"type":"integer","minimum":0,"title":"Duplicate Numerator"},"duplicate_denominator":{"type":"integer","minimum":0,"title":"Duplicate Denominator"},"unknown_actor_numerator":{"type":"integer","minimum":0,"title":"Unknown Actor Numerator"},"unknown_actor_denominator":{"type":"integer","minimum":0,"title":"Unknown Actor Denominator"},"ingestion_lag_sample_count":{"type":"integer","minimum":0,"title":"Ingestion Lag Sample Count"},"ingestion_lag_p95_seconds":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Ingestion Lag P95 Seconds"},"sequence_violation_count":{"type":"integer","minimum":0,"title":"Sequence Violation Count"},"day_status":{"$ref":"#/components/schemas/ConversionGateDayStatus"},"data_as_of":{"type":"string","format":"date-time","title":"Data As Of"}},"additionalProperties":false,"type":"object","required":["day_utc","gui_status","embed_status","mcp_status","booking_snapshot_numerator","booking_snapshot_denominator","cart_journey_numerator","cart_journey_denominator","entry_page_numerator","entry_page_denominator","duplicate_numerator","duplicate_denominator","unknown_actor_numerator","unknown_actor_denominator","ingestion_lag_sample_count","sequence_violation_count","day_status","data_as_of"],"title":"ConversionDailyCoverage"},"ConversionDailyCoverageMetric":{"properties":{"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"rows":{"items":{"$ref":"#/components/schemas/ConversionDailyCoverage"},"type":"array","title":"Rows"}},"additionalProperties":false,"type":"object","required":["envelope","rows"],"title":"ConversionDailyCoverageMetric"},"ConversionDataQualityMetric":{"properties":{"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"rows":{"items":{"$ref":"#/components/schemas/ConversionDataQualityViolation"},"type":"array","title":"Rows"}},"additionalProperties":false,"type":"object","required":["envelope","rows"],"title":"ConversionDataQualityMetric"},"ConversionDataQualityViolation":{"properties":{"violation_day_utc":{"type":"string","format":"date","title":"Violation Day Utc"},"violation_code":{"$ref":"#/components/schemas/QualityViolationCode"},"counting_unit":{"$ref":"#/components/schemas/ReportingCountingUnit"},"stage":{"$ref":"#/components/schemas/CanonicalStage"},"violation_count":{"type":"integer","minimum":1,"title":"Violation Count"}},"additionalProperties":false,"type":"object","required":["violation_day_utc","violation_code","counting_unit","stage","violation_count"],"title":"ConversionDataQualityViolation"},"ConversionGateDay":{"properties":{"day_utc":{"type":"string","format":"date","title":"Day Utc"},"gui_status":{"$ref":"#/components/schemas/ConversionSyntheticRunStatus"},"embed_status":{"$ref":"#/components/schemas/ConversionSyntheticRunStatus"},"mcp_status":{"$ref":"#/components/schemas/ConversionSyntheticRunStatus"},"booking_snapshot_numerator":{"type":"integer","minimum":0,"title":"Booking Snapshot Numerator"},"booking_snapshot_denominator":{"type":"integer","minimum":0,"title":"Booking Snapshot Denominator"},"cart_journey_numerator":{"type":"integer","minimum":0,"title":"Cart Journey Numerator"},"cart_journey_denominator":{"type":"integer","minimum":0,"title":"Cart Journey Denominator"},"entry_page_numerator":{"type":"integer","minimum":0,"title":"Entry Page Numerator"},"entry_page_denominator":{"type":"integer","minimum":0,"title":"Entry Page Denominator"},"duplicate_numerator":{"type":"integer","minimum":0,"title":"Duplicate Numerator"},"duplicate_denominator":{"type":"integer","minimum":0,"title":"Duplicate Denominator"},"unknown_actor_numerator":{"type":"integer","minimum":0,"title":"Unknown Actor Numerator"},"unknown_actor_denominator":{"type":"integer","minimum":0,"title":"Unknown Actor Denominator"},"ingestion_lag_sample_count":{"type":"integer","minimum":0,"title":"Ingestion Lag Sample Count"},"ingestion_lag_p95_seconds":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Ingestion Lag P95 Seconds"},"sequence_violation_count":{"type":"integer","minimum":0,"title":"Sequence Violation Count"},"day_status":{"$ref":"#/components/schemas/ConversionGateDayStatus"},"evaluated_at":{"type":"string","format":"date-time","title":"Evaluated At"}},"additionalProperties":false,"type":"object","required":["day_utc","gui_status","embed_status","mcp_status","booking_snapshot_numerator","booking_snapshot_denominator","cart_journey_numerator","cart_journey_denominator","entry_page_numerator","entry_page_denominator","duplicate_numerator","duplicate_denominator","unknown_actor_numerator","unknown_actor_denominator","ingestion_lag_sample_count","sequence_violation_count","day_status","evaluated_at"],"title":"ConversionGateDay"},"ConversionGateDayStatus":{"type":"string","enum":["complete_pass","complete_fail","incomplete_missing_run"],"title":"ConversionGateDayStatus"},"ConversionGateStatusMetric":{"properties":{"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"latest":{"anyOf":[{"$ref":"#/components/schemas/ConversionGateDay"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["envelope","latest"],"title":"ConversionGateStatusMetric"},"ConversionHeadlineFunnelAppliedFilters":{"properties":{"window_days":{"type":"integer","enum":[1,7,30],"title":"Window Days"},"entry_surface":{"anyOf":[{"$ref":"#/components/schemas/Surface"},{"type":"null"}]},"entry_market_country_code":{"anyOf":[{"type":"string","enum":["AU","NZ"]},{"type":"null"}],"title":"Entry Market Country Code"},"entry_page_type":{"anyOf":[{"$ref":"#/components/schemas/EntryPageType"},{"type":"null"}]},"entry_page_key":{"anyOf":[{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9:._-]*$"},{"type":"null"}],"title":"Entry Page Key"}},"additionalProperties":false,"type":"object","required":["window_days"],"title":"ConversionHeadlineFunnelAppliedFilters"},"ConversionHeadlineFunnelResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"applied_filters":{"$ref":"#/components/schemas/ConversionHeadlineFunnelAppliedFilters"},"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"counting_unit":{"type":"string","const":"journey","title":"Counting Unit","default":"journey"},"stages":{"items":{"$ref":"#/components/schemas/ConversionHeadlineFunnelStage"},"type":"array","title":"Stages"}},"additionalProperties":false,"type":"object","required":["query","applied_filters","envelope","stages"],"title":"ConversionHeadlineFunnelResponse"},"ConversionHeadlineFunnelStage":{"properties":{"stage":{"$ref":"#/components/schemas/CanonicalStage"},"provisional":{"type":"boolean","title":"Provisional"},"cohort_journeys":{"type":"integer","minimum":0,"title":"Cohort Journeys"},"stage_journeys":{"type":"integer","minimum":0,"title":"Stage Journeys"}},"additionalProperties":false,"type":"object","required":["stage","provisional","cohort_journeys","stage_journeys"],"title":"ConversionHeadlineFunnelStage"},"ConversionIntegratorConflictSummary":{"properties":{"provisional":{"type":"boolean","title":"Provisional"},"conflicting_opportunities":{"type":"integer","minimum":0,"title":"Conflicting Opportunities"}},"additionalProperties":false,"type":"object","required":["provisional","conflicting_opportunities"],"title":"ConversionIntegratorConflictSummary"},"ConversionMetricEnvelope":{"properties":{"source":{"$ref":"#/components/schemas/ReportingSource"},"grain":{"$ref":"#/components/schemas/ReportingGrain"},"counting_units":{"items":{"$ref":"#/components/schemas/ReportingCountingUnit"},"type":"array","minItems":1,"title":"Counting Units"},"window":{"$ref":"#/components/schemas/UtcDateWindow"},"data_as_of":{"type":"string","format":"date-time","title":"Data As Of"},"maturity_state":{"$ref":"#/components/schemas/ReportingMaturityState"},"provisional":{"type":"boolean","title":"Provisional"},"coverage_state":{"$ref":"#/components/schemas/ReportingCoverageState"},"limitations":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Limitations"}},"additionalProperties":false,"type":"object","required":["source","grain","counting_units","window","data_as_of","maturity_state","provisional","coverage_state","limitations"],"title":"ConversionMetricEnvelope"},"ConversionOutcomeSubstrateGaps":{"properties":{"cancelled_without_cancelled_at":{"type":"integer","minimum":0,"title":"Cancelled Without Cancelled At"},"refunded_without_first_refunded_at":{"type":"integer","minimum":0,"title":"Refunded Without First Refunded At"},"failed_pms_without_pms_failed_at":{"type":"integer","minimum":0,"title":"Failed Pms Without Pms Failed At"},"payment_auth_cancelled_without_payment_cancelled_at":{"type":"integer","minimum":0,"title":"Payment Auth Cancelled Without Payment Cancelled At"}},"additionalProperties":false,"type":"object","required":["cancelled_without_cancelled_at","refunded_without_first_refunded_at","failed_pms_without_pms_failed_at","payment_auth_cancelled_without_payment_cancelled_at"],"title":"ConversionOutcomeSubstrateGaps"},"ConversionOutcomesAppliedFilters":{"properties":{"time_basis":{"$ref":"#/components/schemas/OutcomeTimeBasis"},"conversion_surface":{"anyOf":[{"$ref":"#/components/schemas/Surface"},{"type":"null"}]},"created_via":{"anyOf":[{"$ref":"#/components/schemas/CreatedVia"},{"type":"null"}]},"property_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Property Id"},"property_country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Property Country Code"},"embed_integrator":{"anyOf":[{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-z0-9][a-z0-9-]*$"},{"type":"null"}],"title":"Embed Integrator"},"currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Currency"}},"additionalProperties":false,"type":"object","required":["time_basis"],"title":"ConversionOutcomesAppliedFilters"},"ConversionOutcomesResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"applied_filters":{"$ref":"#/components/schemas/ConversionOutcomesAppliedFilters"},"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"time_basis":{"$ref":"#/components/schemas/OutcomeTimeBasis"},"substrate_gaps":{"$ref":"#/components/schemas/ConversionOutcomeSubstrateGaps"},"rows":{"items":{"$ref":"#/components/schemas/ConversionOutcomesRow"},"type":"array","title":"Rows"}},"additionalProperties":false,"type":"object","required":["query","applied_filters","envelope","time_basis","substrate_gaps","rows"],"title":"ConversionOutcomesResponse"},"ConversionOutcomesRow":{"properties":{"day_utc":{"type":"string","format":"date","title":"Day Utc"},"metric_name":{"$ref":"#/components/schemas/OutcomeMetric"},"counting_unit":{"$ref":"#/components/schemas/ReportingCountingUnit"},"currency":{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$","title":"Currency"},"metric_value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Metric Value"}},"additionalProperties":false,"type":"object","required":["day_utc","metric_name","counting_unit","currency","metric_value"],"title":"ConversionOutcomesRow"},"ConversionPropertyOpportunityFunnelAppliedFilters":{"properties":{"window_days":{"type":"integer","enum":[1,7,30],"title":"Window Days"},"entry_surface":{"anyOf":[{"$ref":"#/components/schemas/Surface"},{"type":"null"}]},"entry_market_country_code":{"anyOf":[{"type":"string","enum":["AU","NZ"]},{"type":"null"}],"title":"Entry Market Country Code"},"entry_page_type":{"anyOf":[{"$ref":"#/components/schemas/EntryPageType"},{"type":"null"}]},"entry_page_key":{"anyOf":[{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9:._-]*$"},{"type":"null"}],"title":"Entry Page Key"},"property_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"title":"Property Id"},"property_country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Property Country Code"},"embed_integrator":{"anyOf":[{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-z0-9][a-z0-9-]*$"},{"type":"null"}],"title":"Embed Integrator"}},"additionalProperties":false,"type":"object","required":["window_days"],"title":"ConversionPropertyOpportunityFunnelAppliedFilters"},"ConversionPropertyOpportunityFunnelResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"applied_filters":{"$ref":"#/components/schemas/ConversionPropertyOpportunityFunnelAppliedFilters"},"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"counting_unit":{"type":"string","const":"journey_property","title":"Counting Unit","default":"journey_property"},"stages":{"items":{"$ref":"#/components/schemas/ConversionPropertyOpportunityFunnelStage"},"type":"array","title":"Stages"},"integrator_conflicts":{"items":{"$ref":"#/components/schemas/ConversionIntegratorConflictSummary"},"type":"array","title":"Integrator Conflicts"}},"additionalProperties":false,"type":"object","required":["query","applied_filters","envelope","stages","integrator_conflicts"],"title":"ConversionPropertyOpportunityFunnelResponse"},"ConversionPropertyOpportunityFunnelStage":{"properties":{"stage":{"$ref":"#/components/schemas/CanonicalStage"},"provisional":{"type":"boolean","title":"Provisional"},"cohort_opportunities":{"type":"integer","minimum":0,"title":"Cohort Opportunities"},"stage_opportunities":{"type":"integer","minimum":0,"title":"Stage Opportunities"}},"additionalProperties":false,"type":"object","required":["stage","provisional","cohort_opportunities","stage_opportunities"],"title":"ConversionPropertyOpportunityFunnelStage"},"ConversionQualityStatusResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"coverage_state":{"$ref":"#/components/schemas/ReportingCoverageState"},"latest_gate":{"$ref":"#/components/schemas/ConversionGateStatusMetric"},"daily_coverage":{"$ref":"#/components/schemas/ConversionDailyCoverageMetric"},"data_quality":{"$ref":"#/components/schemas/ConversionDataQualityMetric"}},"additionalProperties":false,"type":"object","required":["query","coverage_state","latest_gate","daily_coverage","data_quality"],"title":"ConversionQualityStatusResponse"},"ConversionReconciliationTotalsAppliedFilters":{"properties":{"time_basis":{"anyOf":[{"$ref":"#/components/schemas/ReconciliationTimeBasis"},{"type":"null"}]},"window_days":{"anyOf":[{"type":"integer","enum":[1,7,30]},{"type":"null"}],"title":"Window Days"},"currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Currency"}},"additionalProperties":false,"type":"object","title":"ConversionReconciliationTotalsAppliedFilters"},"ConversionReconciliationTotalsResponse":{"properties":{"query":{"$ref":"#/components/schemas/ConversionReportingQueryEnvelope"},"applied_filters":{"$ref":"#/components/schemas/ConversionReconciliationTotalsAppliedFilters"},"envelope":{"$ref":"#/components/schemas/ConversionMetricEnvelope"},"rows":{"items":{"$ref":"#/components/schemas/ConversionReconciliationTotalsRow"},"type":"array","title":"Rows"}},"additionalProperties":false,"type":"object","required":["query","applied_filters","envelope","rows"],"title":"ConversionReconciliationTotalsResponse"},"ConversionReconciliationTotalsRow":{"properties":{"day_utc":{"type":"string","format":"date","title":"Day Utc"},"time_basis":{"$ref":"#/components/schemas/ReconciliationTimeBasis"},"window_days":{"anyOf":[{"type":"integer","enum":[1,7,30]},{"type":"null"}],"title":"Window Days"},"provisional":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Provisional"},"metric_name":{"$ref":"#/components/schemas/ReconciliationMetric"},"counting_unit":{"$ref":"#/components/schemas/ReportingCountingUnit"},"currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Currency"},"metric_value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Metric Value"}},"additionalProperties":false,"type":"object","required":["day_utc","time_basis","metric_name","counting_unit","metric_value"],"title":"ConversionReconciliationTotalsRow"},"ConversionReportingQueryEnvelope":{"properties":{"schema_version":{"type":"string","const":"conversion-reporting-v1","title":"Schema Version","default":"conversion-reporting-v1"},"scope":{"$ref":"#/components/schemas/ConversionReportingScopeDescriptor"},"window":{"$ref":"#/components/schemas/UtcDateWindow"},"data_as_of":{"type":"string","format":"date-time","title":"Data As Of"}},"additionalProperties":false,"type":"object","required":["scope","window","data_as_of"],"title":"ConversionReportingQueryEnvelope"},"ConversionReportingScopeDescriptor":{"properties":{"kind":{"type":"string","const":"internal_super_admin","title":"Kind","default":"internal_super_admin"},"unrestricted":{"type":"boolean","const":true,"title":"Unrestricted","default":true}},"additionalProperties":false,"type":"object","title":"ConversionReportingScopeDescriptor","description":"Non-sensitive description of the server-created reporting scope."},"ConversionSyntheticRunStatus":{"type":"string","enum":["pass","fail","missing"],"title":"ConversionSyntheticRunStatus"},"CreateCartRequest":{"properties":{"single_stay_seed":{"anyOf":[{"$ref":"#/components/schemas/SingleStaySeed"},{"type":"null"}]},"commit_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Strategy","description":"Reserved. Phase 1 forces 'atomic'."},"created_via":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Created Via","description":"Creator hint for analytics (e.g. 'gui', 'cursor', 'mcp', 'embed')."},"embed_integrator":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Embed Integrator","description":"Embed attribution: the non-secret `data-integrator` id (e.g. 'ccia-nsw') self-reported by the embeddable-checkout iframe. Only meaningful when `created_via='embed'`."},"embed_parent_origin":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Embed Parent Origin","description":"Embed attribution: the aggregator origin that framed the widget, resolved by the iframe from `ancestorOrigins` / `document.referrer`. Only meaningful when `created_via='embed'`."}},"type":"object","title":"CreateCartRequest","description":"``POST /carts`` body."},"CreatedVia":{"type":"string","enum":["gui","embed","mcp","cursor","legacy","unknown"],"title":"CreatedVia"},"DateRangeFlexibleWindow":{"properties":{"min_nights":{"type":"integer","maximum":90,"minimum":1,"title":"Min Nights","description":"Minimum number of nights to search inside the flexible window. For an exact stay length such as 'about 4 nights' or 'for three nights', set both min_nights and max_nights to that value.","default":1},"max_nights":{"anyOf":[{"type":"integer","maximum":90,"minimum":1},{"type":"null"}],"title":"Max Nights","description":"Maximum number of nights to search. When the traveller gives an exact stay length, explicitly set max_nights equal to min_nights instead of relying on the default."},"type":{"type":"string","const":"date_range","title":"Type","default":"date_range"},"start_date":{"type":"string","format":"date","title":"Start Date","description":"First acceptable check-in date."},"end_date":{"type":"string","format":"date","title":"End Date","description":"Last acceptable check-in date."}},"additionalProperties":false,"type":"object","required":["start_date","end_date"],"title":"DateRangeFlexibleWindow","description":"Check-in dates inside an explicit bounded range."},"DeleteClaimResponse":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"message":{"type":"string","title":"Message","default":"Claim request deleted"}},"type":"object","required":["request_id"],"title":"DeleteClaimResponse","description":"Response after deleting a claim request."},"DeletePropertyResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["property_id","message"],"title":"DeletePropertyResponse","description":"Response for property deletion."},"DepositPayment":{"properties":{"description":{"type":"string","title":"Description"},"amount":{"type":"number","title":"Amount"},"currency_code":{"type":"string","title":"Currency Code","default":"AUD"},"guarantee_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guarantee Code"}},"type":"object","required":["description","amount"],"title":"DepositPayment","description":"Payment information for a reservation deposit."},"DescriptiveSyncStats":{"properties":{"property_pms_details_upserted":{"type":"integer","title":"Property Pms Details Upserted","default":0},"room_types_upserted":{"type":"integer","title":"Room Types Upserted","default":0},"room_types_created":{"type":"integer","title":"Room Types Created","default":0},"features_synced":{"type":"integer","title":"Features Synced","default":0},"images_synced":{"type":"integer","title":"Images Synced","default":0},"bed_configs_synced":{"type":"integer","title":"Bed Configs Synced","default":0},"areas_synced":{"type":"integer","title":"Areas Synced","default":0}},"type":"object","title":"DescriptiveSyncStats","description":"Statistics from syncing descriptive info."},"DimensionCandidate":{"properties":{"source":{"type":"string","title":"Source"},"length_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length M"},"width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width M"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence"}},"type":"object","required":["source"],"title":"DimensionCandidate","description":"One length/width value RMS exposes for an area (Phase 7a).\n\n``source`` is the RMS origin: ``area_config`` (RMS area configuration),\n``name_description`` (site name / description), ``dwelling_cap`` (largest\napplicable dwelling-length bucket), or ``manual_override``. Surfaced so\noperators can see when sources disagree. Read-only — does not change which\nvalue wins or affect booking enforcement."},"DimensionHealthResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"site_types_total":{"type":"integer","title":"Site Types Total","default":0},"site_types_missing_dims":{"type":"integer","title":"Site Types Missing Dims","default":0},"missing_category_names":{"items":{"type":"string"},"type":"array","title":"Missing Category Names","default":[]},"site_types_missing_equipment_types":{"type":"integer","title":"Site Types Missing Equipment Types","default":0},"missing_equipment_type_category_names":{"items":{"type":"string"},"type":"array","title":"Missing Equipment Type Category Names","default":[]},"site_types_with_area_mismatch":{"type":"integer","title":"Site Types With Area Mismatch","default":0},"area_mismatch_category_names":{"items":{"type":"string"},"type":"array","title":"Area Mismatch Category Names","default":[]},"site_types_with_length_source_conflicts":{"type":"integer","title":"Site Types With Length Source Conflicts","default":0},"length_source_conflict_category_names":{"items":{"type":"string"},"type":"array","title":"Length Source Conflict Category Names","default":[]},"site_types_compatibility_unknown":{"type":"integer","title":"Site Types Compatibility Unknown","default":0},"compatibility_unknown_category_names":{"items":{"type":"string"},"type":"array","title":"Compatibility Unknown Category Names","default":[]},"area_dwelling_sync_failed_count":{"type":"integer","title":"Area Dwelling Sync Failed Count","default":0},"area_dwelling_sync_aborted":{"type":"boolean","title":"Area Dwelling Sync Aborted","default":false},"inference_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inference Status"}},"type":"object","required":["property_id"],"title":"DimensionHealthResponse","description":"Lightweight dimension health summary for the dashboard banner.\n\nCounts how many site room types have zero dimension coverage\n(i.e. are currently unbookable) and, for RMS properties, how many\nhave configured dwelling allocations that cannot be interpreted.\nMissing allocations mean unrestricted and are not warnings."},"DimensionInferenceProgress":{"properties":{"stage":{"type":"string","enum":["queued","loading_site_data","analysing_sites","checking_sites","finalising"],"title":"Stage"},"sites_checked":{"type":"integer","minimum":0,"title":"Sites Checked","default":0},"sites_total":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Sites Total"},"overall_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Overall Percent","default":0},"stage_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Stage Started At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"estimated_seconds_remaining":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Estimated Seconds Remaining"}},"type":"object","required":["stage"],"title":"DimensionInferenceProgress","description":"Durable progress for a long-running dimension sync."},"DimensionLengthSourceRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"rms_length_source":{"type":"string","enum":["auto","area_config","name_description","dwelling_cap"],"title":"Rms Length Source"}},"type":"object","required":["property_id","rms_length_source"],"title":"DimensionLengthSourceRequest","description":"PUT /park-admin/dimensions/length-source (RMS Phase 7b).\n\nChooses which RMS length source Total Parks treats as a site's physical\nlength/width when sources disagree. Applied instantly from the already\ncaptured candidates — no RMS/LLM calls. Manual per-area overrides still win."},"DimensionLengthSourceResponse":{"properties":{"rms_length_source":{"type":"string","title":"Rms Length Source"},"updated_count":{"type":"integer","title":"Updated Count"},"message":{"type":"string","title":"Message"}},"type":"object","required":["rms_length_source","updated_count","message"],"title":"DimensionLengthSourceResponse","description":"Response from PUT /park-admin/dimensions/length-source"},"DimensionOverride":{"properties":{"room_type_id":{"type":"integer","title":"Room Type Id"},"length_m":{"anyOf":[{"type":"number","maximum":50,"minimum":1},{"type":"null"}],"title":"Length M"},"width_m":{"anyOf":[{"type":"number","maximum":20,"minimum":2},{"type":"null"}],"title":"Width M"},"unlimited":{"type":"boolean","title":"Unlimited","default":false}},"type":"object","required":["room_type_id"],"title":"DimensionOverride","description":"Single category dimension override (applies to all areas in a room type).\n\nSet ``unlimited=True`` for open areas where any equipment size fits.\nWhen unlimited, ``length_m``/``width_m`` are ignored (sentinel applied\nserver-side)."},"DimensionOverridesRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"overrides":{"items":{"$ref":"#/components/schemas/DimensionOverride"},"type":"array","title":"Overrides","default":[]},"area_overrides":{"items":{"$ref":"#/components/schemas/AreaDimensionOverride"},"type":"array","title":"Area Overrides","default":[]}},"type":"object","required":["property_id"],"title":"DimensionOverridesRequest","description":"PATCH /park-admin/dimensions/overrides\n\n``overrides`` applies values to all areas in each room type (bulk).\n``area_overrides`` targets individual areas.  Per-area values are\napplied *after* bulk overrides, so they take precedence when both\nlists reference the same areas."},"DimensionOverridesResponse":{"properties":{"updated_count":{"type":"integer","title":"Updated Count"},"message":{"type":"string","title":"Message"}},"type":"object","required":["updated_count","message"],"title":"DimensionOverridesResponse","description":"Response from PATCH /park-admin/dimensions/overrides"},"DimensionResetRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"room_type_ids":{"items":{"type":"integer"},"type":"array","title":"Room Type Ids"}},"type":"object","required":["property_id","room_type_ids"],"title":"DimensionResetRequest","description":"POST /park-admin/dimensions/reset"},"DimensionResetResponse":{"properties":{"reset_count":{"type":"integer","title":"Reset Count"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["reset_count","message"],"title":"DimensionResetResponse","description":"Response from POST /park-admin/dimensions/reset"},"DimensionStatusResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"inference_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inference Status"},"inference_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Inference Started At"},"inference_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Inference Completed At"},"inference_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inference Error"},"progress":{"anyOf":[{"$ref":"#/components/schemas/DimensionInferenceProgress"},{"type":"null"}]},"categories":{"items":{"$ref":"#/components/schemas/CategoryDimensionInfo"},"type":"array","title":"Categories","default":[]},"rms_length_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Length Source"}},"type":"object","required":["property_id"],"title":"DimensionStatusResponse","description":"Response from GET /park-admin/dimensions/status"},"DimensionSyncRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"}},"type":"object","required":["property_id"],"title":"DimensionSyncRequest","description":"POST /park-admin/dimensions/sync"},"DimensionSyncResponse":{"properties":{"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"status":{"type":"string","title":"Status"},"already_running":{"type":"boolean","title":"Already Running","default":false}},"type":"object","required":["status"],"title":"DimensionSyncResponse","description":"Response from POST /park-admin/dimensions/sync"},"DisconnectRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"}},"type":"object","required":["property_id"],"title":"DisconnectRequest","description":"Request to disconnect a Stripe account from a property."},"DisputeEvidencePreview":{"properties":{"dispute_id":{"type":"integer","title":"Dispute Id"},"stripe_dispute_id":{"type":"string","title":"Stripe Dispute Id"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name"},"evidence_submitted":{"type":"boolean","title":"Evidence Submitted","default":false},"evidence_submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Evidence Submitted At"},"evidence_auto_submitted":{"type":"boolean","title":"Evidence Auto Submitted","default":false},"evidence_submission_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evidence Submission Error"},"evidence_due_by":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Evidence Due By"},"incomplete":{"type":"boolean","title":"Incomplete","default":false},"stripe_evidence":{"additionalProperties":true,"type":"object","title":"Stripe Evidence","default":{}},"preview":{"items":{"type":"string"},"type":"array","title":"Preview","default":[]}},"type":"object","required":["dispute_id","stripe_dispute_id"],"title":"DisputeEvidencePreview","description":"Evidence package for a single dispute."},"DisputeListItem":{"properties":{"id":{"type":"integer","title":"Id"},"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"booking_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Booking Id"},"confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Number"},"stripe_dispute_id":{"type":"string","title":"Stripe Dispute Id"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"status":{"type":"string","title":"Status"},"is_platform":{"type":"boolean","title":"Is Platform"},"outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome"},"evidence_submitted":{"type":"boolean","title":"Evidence Submitted","default":false},"evidence_due_by":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Evidence Due By"},"has_evidence":{"type":"boolean","title":"Has Evidence","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"closed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed At"},"booking_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Code","description":"Human-readable short code for the linked booking, if any.","readOnly":true}},"type":"object","required":["id","property_id","property_name","stripe_dispute_id","amount_cents","currency","status","is_platform","created_at","booking_code"],"title":"DisputeListItem","description":"Single dispute row for the admin dispute list."},"DisputeListResponse":{"properties":{"disputes":{"items":{"$ref":"#/components/schemas/DisputeListItem"},"type":"array","title":"Disputes","default":[]},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"limit":{"type":"integer","title":"Limit","default":20}},"type":"object","title":"DisputeListResponse","description":"Paginated dispute list."},"DisputeMonitoringOverview":{"properties":{"open_dispute_count":{"type":"integer","title":"Open Dispute Count","default":0},"parks_above_warning":{"type":"integer","title":"Parks Above Warning","default":0},"suspended_count":{"type":"integer","title":"Suspended Count","default":0},"properties":{"items":{"$ref":"#/components/schemas/PropertyDisputeRate"},"type":"array","title":"Properties","default":[]}},"type":"object","title":"DisputeMonitoringOverview","description":"Aggregate dispute monitoring dashboard."},"DisputeOutcomesResponse":{"properties":{"summary":{"$ref":"#/components/schemas/OutcomesSummary","default":{"total":0,"won":0,"lost":0,"pending":0,"win_rate_percent":0,"evidence_submitted_count":0}},"properties":{"items":{"$ref":"#/components/schemas/PropertyOutcomeSummary"},"type":"array","title":"Properties","default":[]}},"type":"object","title":"DisputeOutcomesResponse","description":"Full outcomes dashboard response."},"EmailChangeRequest":{"properties":{"new_email":{"type":"string","format":"email","title":"New Email"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","default":"AU"}},"type":"object","required":["new_email"],"title":"EmailChangeRequest","description":"Body for requesting a verified change of the login email address."},"EmailSchema":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","default":"AU"}},"type":"object","required":["email"],"title":"EmailSchema"},"EmbedEventBatchRequest":{"properties":{"schema_version":{"type":"string","const":"conversion-embed-v1","title":"Schema Version"},"events":{"items":{"$ref":"#/components/schemas/EmbedPropertyEngagedEvent"},"type":"array","maxItems":20,"minItems":1,"title":"Events"}},"additionalProperties":false,"type":"object","required":["schema_version","events"],"title":"EmbedEventBatchRequest"},"EmbedEventBatchResponse":{"properties":{"accepted":{"type":"integer","minimum":0,"title":"Accepted"},"duplicates":{"type":"integer","minimum":0,"title":"Duplicates"}},"additionalProperties":false,"type":"object","required":["accepted","duplicates"],"title":"EmbedEventBatchResponse"},"EmbedIntegratorCreate":{"properties":{"code":{"type":"string","maxLength":100,"minLength":2,"pattern":"^[a-z0-9][a-z0-9-]{1,99}$","title":"Code"},"display_name":{"type":"string","maxLength":255,"minLength":1,"title":"Display Name"},"allowed_parent_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Parent Origins"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["code","display_name"],"title":"EmbedIntegratorCreate"},"EmbedIntegratorOriginRequest":{"properties":{"origin":{"type":"string","maxLength":255,"minLength":1,"title":"Origin"}},"type":"object","required":["origin"],"title":"EmbedIntegratorOriginRequest"},"EmbedIntegratorTestOriginRequest":{"properties":{"origin":{"type":"string","maxLength":255,"minLength":1,"title":"Origin"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"}},"type":"object","required":["origin","expires_at"],"title":"EmbedIntegratorTestOriginRequest"},"EmbedIntegratorUpdate":{"properties":{"display_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Display Name"},"allowed_parent_origins":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Parent Origins"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"EmbedIntegratorUpdate"},"EmbedJourneyResponse":{"properties":{"active":{"type":"boolean","title":"Active"},"interactive_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Interactive Expires At"}},"additionalProperties":false,"type":"object","required":["active"],"title":"EmbedJourneyResponse"},"EmbedJourneyStartRequest":{"properties":{"schema_version":{"type":"string","const":"conversion-embed-v1","title":"Schema Version"},"property_id":{"type":"integer","exclusiveMinimum":0,"title":"Property Id"},"integrator":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-z0-9][a-z0-9-]*$","title":"Integrator"},"parent_origin":{"type":"string","maxLength":255,"minLength":8,"title":"Parent Origin"}},"additionalProperties":false,"type":"object","required":["schema_version","property_id","integrator","parent_origin"],"title":"EmbedJourneyStartRequest","description":"Server-validated context for one single-property embed session."},"EmbedPropertyEngagedEvent":{"properties":{"idempotency_key":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9:._-]*$","title":"Idempotency Key"},"event_name":{"type":"string","const":"property_engaged","title":"Event Name"},"payload":{"$ref":"#/components/schemas/PropertyEngagedPayload"}},"additionalProperties":false,"type":"object","required":["idempotency_key","event_name","payload"],"title":"EmbedPropertyEngagedEvent"},"EmbedRevocationRequest":{"properties":{"schema_version":{"type":"string","const":"conversion-embed-v1","title":"Schema Version"},"consent_state":{"type":"string","const":"denied","title":"Consent State"}},"additionalProperties":false,"type":"object","required":["schema_version","consent_state"],"title":"EmbedRevocationRequest"},"EngagementKind":{"type":"string","enum":["property_detail","room_interaction","dates_selected","mcp_resolve","mcp_detail","mcp_assessment"],"title":"EngagementKind"},"EntryPageType":{"type":"string","enum":["home","directory","property","room_type","state","region","curated_collection","guide","itinerary","news","vibe"],"title":"EntryPageType","description":"Controlled public-route taxonomy used by aggregate reporting."},"EquipmentCreate":{"properties":{"equipment_type":{"type":"string","enum":["caravan","campervan","motorhome","camp_trailer","roof_top_tent","tent","swag","car_ute","fifth_wheeler"],"title":"Equipment Type"},"length":{"anyOf":[{"type":"number","maximum":30,"minimum":0.5},{"type":"null"}],"title":"Length","description":"Length in metres"},"width":{"anyOf":[{"type":"number","maximum":10,"minimum":0.5},{"type":"null"}],"title":"Width","description":"Width in metres"},"nickname":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Nickname","description":"Optional nickname (e.g., 'Our Jayco')"},"is_primary":{"type":"boolean","title":"Is Primary","description":"Set as primary equipment for auto-fill","default":true}},"type":"object","required":["equipment_type"],"title":"EquipmentCreate","description":"Schema for creating new equipment."},"EquipmentResponse":{"properties":{"id":{"type":"integer","title":"Id"},"equipment_type":{"type":"string","enum":["caravan","campervan","motorhome","camp_trailer","roof_top_tent","tent","swag","car_ute","fifth_wheeler"],"title":"Equipment Type"},"length":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length"},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"is_primary":{"type":"boolean","title":"Is Primary"}},"type":"object","required":["id","equipment_type","is_primary"],"title":"EquipmentResponse","description":"Schema for equipment response."},"EquipmentSchema":{"properties":{"type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Type","description":"Canonical equipment type (e.g. caravan, motorhome, camper_trailer)."},"length_m":{"anyOf":[{"type":"number","maximum":30,"minimum":1},{"type":"null"}],"title":"Length M","description":"Equipment length in metres."},"power_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Power Required","description":"Whether powered site is required."}},"type":"object","title":"EquipmentSchema","description":"Per-line equipment declaration (caravan/motorhome details)."},"EquipmentUpdate":{"properties":{"equipment_type":{"anyOf":[{"type":"string","enum":["caravan","campervan","motorhome","camp_trailer","roof_top_tent","tent","swag","car_ute","fifth_wheeler"]},{"type":"null"}],"title":"Equipment Type"},"length":{"anyOf":[{"type":"number","maximum":30,"minimum":0.5},{"type":"null"}],"title":"Length"},"width":{"anyOf":[{"type":"number","maximum":10,"minimum":0.5},{"type":"null"}],"title":"Width"},"nickname":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Nickname"},"is_primary":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Primary"}},"type":"object","title":"EquipmentUpdate","description":"Schema for updating equipment."},"ExposureKind":{"type":"string","enum":["search_result","property_detail","embed_open","mcp_result"],"title":"ExposureKind"},"FactorStatus":{"type":"string","enum":["needs_work","good","excellent"],"title":"FactorStatus","description":"Status tier for an individual factor."},"FactorThresholds":{"properties":{"needs_work":{"type":"string","title":"Needs Work"},"good":{"type":"string","title":"Good"},"excellent":{"type":"string","title":"Excellent"}},"type":"object","required":["needs_work","good","excellent"],"title":"FactorThresholds","description":"Threshold descriptions for display."},"Feature":{"properties":{"description":{"type":"string","title":"Description"},"quantity":{"type":"integer","title":"Quantity","default":1}},"type":"object","required":["description"],"title":"Feature","description":"Room feature."},"FrontendApiRoundtripEvent":{"properties":{"route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Route"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"},"occurred_at_ms":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Occurred At Ms"},"environment":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment"},"event_type":{"type":"string","const":"api_roundtrip","title":"Event Type"},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"],"title":"Method"},"path":{"type":"string","maxLength":1024,"minLength":1,"title":"Path"},"status_code":{"anyOf":[{"type":"integer","maximum":599,"minimum":100},{"type":"null"}],"title":"Status Code"},"duration_ms":{"type":"number","maximum":120000,"minimum":0,"title":"Duration Ms"},"success":{"type":"boolean","title":"Success"},"error_type":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Error Type"}},"additionalProperties":false,"type":"object","required":["event_type","method","path","duration_ms","success"],"title":"FrontendApiRoundtripEvent"},"FrontendErrorEvent":{"properties":{"route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Route"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"},"occurred_at_ms":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Occurred At Ms"},"environment":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment"},"event_type":{"type":"string","const":"error","title":"Event Type"},"message":{"type":"string","maxLength":2000,"minLength":1,"title":"Message"},"source":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Source"},"stack":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Stack"}},"additionalProperties":false,"type":"object","required":["event_type","message"],"title":"FrontendErrorEvent"},"FrontendObservabilityIngestRequest":{"properties":{"events":{"items":{"oneOf":[{"$ref":"#/components/schemas/FrontendErrorEvent"},{"$ref":"#/components/schemas/FrontendUnhandledRejectionEvent"},{"$ref":"#/components/schemas/FrontendWebVitalEvent"},{"$ref":"#/components/schemas/FrontendRouteChangeEvent"},{"$ref":"#/components/schemas/FrontendApiRoundtripEvent"},{"$ref":"#/components/schemas/RevalidateSubscriberStateEvent"},{"$ref":"#/components/schemas/RevalidateMessageReceivedEvent"},{"$ref":"#/components/schemas/RevalidateApplyEvent"}],"discriminator":{"propertyName":"event_type","mapping":{"api_roundtrip":"#/components/schemas/FrontendApiRoundtripEvent","error":"#/components/schemas/FrontendErrorEvent","revalidate_apply":"#/components/schemas/RevalidateApplyEvent","revalidate_message_received":"#/components/schemas/RevalidateMessageReceivedEvent","revalidate_subscriber_state":"#/components/schemas/RevalidateSubscriberStateEvent","route_change":"#/components/schemas/FrontendRouteChangeEvent","unhandled_rejection":"#/components/schemas/FrontendUnhandledRejectionEvent","web_vital":"#/components/schemas/FrontendWebVitalEvent"}}},"type":"array","maxItems":50,"minItems":1,"title":"Events"}},"additionalProperties":false,"type":"object","required":["events"],"title":"FrontendObservabilityIngestRequest"},"FrontendRouteChangeEvent":{"properties":{"route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Route"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"},"occurred_at_ms":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Occurred At Ms"},"environment":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment"},"event_type":{"type":"string","const":"route_change","title":"Event Type"},"from_route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"From Route"},"to_route":{"type":"string","maxLength":512,"minLength":1,"title":"To Route"},"duration_ms":{"type":"number","maximum":120000,"minimum":0,"title":"Duration Ms"}},"additionalProperties":false,"type":"object","required":["event_type","to_route","duration_ms"],"title":"FrontendRouteChangeEvent"},"FrontendUnhandledRejectionEvent":{"properties":{"route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Route"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"},"occurred_at_ms":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Occurred At Ms"},"environment":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment"},"event_type":{"type":"string","const":"unhandled_rejection","title":"Event Type"},"reason":{"type":"string","maxLength":2000,"minLength":1,"title":"Reason"}},"additionalProperties":false,"type":"object","required":["event_type","reason"],"title":"FrontendUnhandledRejectionEvent"},"FrontendWebVitalEvent":{"properties":{"route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Route"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"},"occurred_at_ms":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Occurred At Ms"},"environment":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment"},"event_type":{"type":"string","const":"web_vital","title":"Event Type"},"metric_name":{"type":"string","enum":["LCP","FID","CLS","INP","TTFB","FCP"],"title":"Metric Name"},"value":{"type":"number","maximum":120000,"minimum":0,"title":"Value"},"rating":{"anyOf":[{"type":"string","enum":["good","needs-improvement","poor"]},{"type":"null"}],"title":"Rating"}},"additionalProperties":false,"type":"object","required":["event_type","metric_name","value"],"title":"FrontendWebVitalEvent"},"GeneratePayoutsRequest":{"properties":{"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"}},"type":"object","required":["period_start","period_end"],"title":"GeneratePayoutsRequest","description":"Request body for batch payout generation (also used for preview)."},"GeneratePayoutsResponse":{"properties":{"generated_count":{"type":"integer","title":"Generated Count","default":0},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Amount","default":"0.00"},"payouts":{"items":{"$ref":"#/components/schemas/AdminPayoutListItem"},"type":"array","title":"Payouts","default":[]},"date_reconciliation":{"items":{"$ref":"#/components/schemas/PayoutDateReconciliationRow"},"type":"array","title":"Date Reconciliation","default":[]}},"type":"object","title":"GeneratePayoutsResponse","description":"Response after generating payouts."},"GeneratePreviewResponse":{"properties":{"eligible_count":{"type":"integer","title":"Eligible Count","default":0},"eligible_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Eligible Total","default":"0.00"},"upcoming_count":{"type":"integer","title":"Upcoming Count","default":0},"upcoming_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Upcoming Total","default":"0.00"},"upcoming_bookings":{"items":{"$ref":"#/components/schemas/UpcomingBooking"},"type":"array","title":"Upcoming Bookings","default":[]},"date_reconciliation":{"items":{"$ref":"#/components/schemas/PayoutDateReconciliationRow"},"type":"array","title":"Date Reconciliation","default":[]}},"type":"object","title":"GeneratePreviewResponse","description":"Preview of unpaid bookings relative to a proposed eligibility cutoff.\n\nUnder the check-in eligibility model (ADR-0006), ``period_end`` is the\ncutoff: bookings with ``check_in <= period_end`` are eligible; bookings\nwith ``check_in > period_end`` are upcoming and will roll into a future\ncycle."},"GoLiveResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"$ref":"#/components/schemas/OnboardingProgress"},"booking_enabled":{"type":"boolean","title":"Booking Enabled","default":true}},"type":"object","required":["msg","data"],"title":"GoLiveResponse","description":"Response for go-live endpoint."},"GuestAddress":{"properties":{"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"city_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Name"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"state_prov":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Prov"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"}},"type":"object","title":"GuestAddress","description":"Guest address for reservation request."},"GuestDetailsSchema":{"properties":{"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name"},"last_name":{"type":"string","maxLength":100,"minLength":1,"title":"Last Name"},"email":{"type":"string","maxLength":255,"title":"Email"},"phone":{"type":"string","maxLength":20,"minLength":5,"title":"Phone"},"special_requests":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Special Requests"}},"type":"object","required":["first_name","last_name","email","phone"],"title":"GuestDetailsSchema","description":"Guest information for cart confirmation."},"GuestRoom":{"properties":{"code":{"type":"string","title":"Code"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity"},"max_occupancy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Occupancy"},"room_type_name":{"type":"string","title":"Room Type Name"},"room_type_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type Category"},"sort":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort"},"descriptive_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descriptive Text"},"features":{"items":{"$ref":"#/components/schemas/Feature"},"type":"array","title":"Features","default":[]},"images":{"items":{"$ref":"#/components/schemas/ImageItem"},"type":"array","title":"Images","default":[]},"room_names":{"items":{"type":"string"},"type":"array","title":"Room Names","default":[]},"rooms":{"items":{"$ref":"#/components/schemas/Room"},"type":"array","title":"Rooms","default":[]},"type_rooms":{"items":{"$ref":"#/components/schemas/TypeRoom"},"type":"array","title":"Type Rooms","default":[]},"taxes":{"items":{"$ref":"#/components/schemas/Tax"},"type":"array","title":"Taxes","default":[]}},"type":"object","required":["code","room_type_name"],"title":"GuestRoom","description":"Guest room/site type from OTA_HotelDescriptiveInfoRS."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"version":{"type":"string","title":"Version"},"checks":{"additionalProperties":{"$ref":"#/components/schemas/ComponentHealth"},"type":"object","title":"Checks","default":{}}},"type":"object","required":["status","version"],"title":"HealthResponse","description":"Response model for /health endpoint."},"HeldFundsPropertySummary":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"held_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Held Amount"},"booking_count":{"type":"integer","title":"Booking Count"},"oldest_eligible_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Oldest Eligible Date"},"days_waiting":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Waiting"}},"type":"object","required":["property_id","property_name","held_amount","booking_count"],"title":"HeldFundsPropertySummary","description":"Per-property held-funds exposure for a deferred-bank platform park.\n\nWorkstream B (Connect → Platform migration): a platform park with\n``payout_bank_verified=False`` that has taken bookings TP is holding cash\nfor but can't yet pay out. ``held_amount`` is the net figure a payout\nwould disburse; ``days_waiting`` is derived from the oldest eligible\n(past check-in) unpaid booking."},"HolderCandidate":{"properties":{"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"affiliation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Affiliation Id"},"property_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Group Id"},"property_management_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Management Id"}},"type":"object","title":"HolderCandidate","description":"Suggested holder for unresolved threads. Never a guessed park-lead."},"HolidayPreset":{"properties":{"key":{"type":"string","title":"Key","description":"Canonical preset key (e.g. 'nsw_school_holidays')"},"type":{"$ref":"#/components/schemas/AuHolidayType"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","description":"Two- or three-letter state code, or null for national/curated"},"label":{"type":"string","title":"Label","description":"Display label, e.g. 'NSW School Holidays'"},"year":{"type":"integer","title":"Year"},"ranges":{"items":{"$ref":"#/components/schemas/HolidayRange"},"type":"array","title":"Ranges","description":"Date ranges that make up this preset, sorted by start date"}},"type":"object","required":["key","type","label","year"],"title":"HolidayPreset","description":"A resolved holiday preset (all ranges for one key + year)."},"HolidayPresetsResponse":{"properties":{"year":{"type":"integer","title":"Year"},"school_holidays":{"items":{"$ref":"#/components/schemas/HolidayPreset"},"type":"array","title":"School Holidays"},"public_holidays":{"items":{"$ref":"#/components/schemas/HolidayPreset"},"type":"array","title":"Public Holidays"},"curated":{"items":{"$ref":"#/components/schemas/HolidayPreset"},"type":"array","title":"Curated"}},"type":"object","required":["year"],"title":"HolidayPresetsResponse","description":"Grouped holiday preset response for a given year."},"HolidayRange":{"properties":{"start":{"type":"string","format":"date","title":"Start","description":"Inclusive start date of the range"},"end":{"type":"string","format":"date","title":"End","description":"Inclusive end date of the range"},"name":{"type":"string","title":"Name","description":"Human-friendly name, e.g. 'NSW Term 1 Holidays'"}},"type":"object","required":["start","end","name"],"title":"HolidayRange","description":"A single date range inside a preset (e.g. one school term break)."},"HotelDescriptiveInfo":{"properties":{"hotel_code":{"type":"string","title":"Hotel Code"},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code"},"hotel_info":{"anyOf":[{"$ref":"#/components/schemas/HotelInfo"},{"type":"null"}]},"guest_rooms":{"items":{"$ref":"#/components/schemas/GuestRoom"},"type":"array","title":"Guest Rooms","default":[]}},"type":"object","required":["hotel_code"],"title":"HotelDescriptiveInfo","description":"Parsed OTA_HotelDescriptiveInfoRS response."},"HotelInfo":{"properties":{"hotel_name":{"type":"string","title":"Hotel Name"},"addresses":{"items":{"$ref":"#/components/schemas/Address"},"type":"array","title":"Addresses","default":[]},"emails":{"items":{"type":"string"},"type":"array","title":"Emails","default":[]},"phones":{"items":{"$ref":"#/components/schemas/Phone"},"type":"array","title":"Phones","default":[]},"urls":{"items":{"type":"string"},"type":"array","title":"Urls","default":[]}},"type":"object","required":["hotel_name"],"title":"HotelInfo","description":"Hotel/property information from OTA_HotelDescriptiveInfoRS."},"ImageItem":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"last_modify_date_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Modify Date Time"}},"type":"object","title":"ImageItem","description":"Image item from multimedia descriptions."},"InferredEquipmentType":{"properties":{"equipment_type":{"type":"string","title":"Equipment Type"},"label":{"type":"string","title":"Label"},"raw_pms_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Pms Label"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence"}},"type":"object","required":["equipment_type","label"],"title":"InferredEquipmentType","description":"An equipment type inferred from RMS dwelling labels."},"IntrospectResponse":{"properties":{"active":{"type":"boolean","title":"Active"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"token_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Type"},"exp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exp"},"iat":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Iat"},"sub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub"}},"type":"object","required":["active"],"title":"IntrospectResponse","description":"RFC 7662 introspection response."},"InviteAcceptStartRequest":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"InviteAcceptStartRequest","description":"POST body for /accept-invite/start.\n\nToken-as-body rather than token-in-path so the same endpoint\ncan be hit by both the new two-step UI and the legacy\n``/accept-invite/{token}`` shim."},"InviteAcceptedResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","format":"email","title":"Username"},"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"displayname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"register_date":{"type":"string","format":"date-time","title":"Register Date"},"roles":{"items":{},"type":"array","title":"Roles","default":[]},"profile_pic":{"type":"string","title":"Profile Pic"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token","default":""},"pending_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Email"},"mfa_satisfied":{"type":"boolean","title":"Mfa Satisfied","default":false},"mfa_enrolled":{"type":"boolean","title":"Mfa Enrolled","default":false},"mfa_recovery":{"type":"boolean","title":"Mfa Recovery","default":false},"mfa_access_required":{"type":"boolean","title":"Mfa Access Required","default":false},"kind":{"type":"string","const":"session","title":"Kind","default":"session"}},"type":"object","required":["id","username","register_date","profile_pic"],"title":"InviteAcceptedResponse","description":"Returned by /accept-invite/start for non-admin invites — a\nfull session token and the standard ``UserPublic`` payload.\n\nBackward-compatible with the legacy single-shot ``/accept-invite/{token}``\nbody so older clients keep working through the shim."},"InviteEnrolmentRequiredResponse":{"properties":{"kind":{"type":"string","const":"mfa_enrolment_required","title":"Kind","default":"mfa_enrolment_required"},"invite_enrolment_token":{"type":"string","title":"Invite Enrolment Token"},"username":{"type":"string","title":"Username"},"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"mfa_methods":{"items":{"type":"string","enum":["totp","webauthn","recovery_code"]},"type":"array","title":"Mfa Methods"}},"type":"object","required":["invite_enrolment_token","username","mfa_methods"],"title":"InviteEnrolmentRequiredResponse","description":"Returned by /accept-invite/start for park-admin invites.\n\nThe user has set their password but ``users.is_verified`` has\n*not* yet flipped — that happens when the embedded\n``invite_enrolment_token`` is exchanged at any of the MFA\nenrolment endpoints (TOTP or WebAuthn) and a first method\nactivates. The token is good for 15 minutes; the underlying\n7-day invite link can be re-clicked to start a fresh attempt."},"InviteLinkResponse":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"invite_url":{"type":"string","title":"Invite Url"}},"type":"object","required":["request_id","invite_url"],"title":"InviteLinkResponse","description":"Response containing a fresh invite URL for an approved claim."},"LineInput":{"properties":{"room_type_id":{"type":"integer","title":"Room Type Id"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"adults":{"type":"integer","minimum":1,"title":"Adults","default":2},"children":{"type":"integer","minimum":0,"title":"Children","default":0},"infants":{"type":"integer","minimum":0,"title":"Infants","default":0},"pet_declaration":{"anyOf":[{"$ref":"#/components/schemas/PetDeclaration"},{"type":"null"}]},"equipment":{"anyOf":[{"$ref":"#/components/schemas/EquipmentSchema"},{"type":"null"}]},"lead_guest_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lead Guest Override"},"special_requests":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Special Requests"}},"type":"object","required":["room_type_id","check_in","check_out"],"title":"LineInput","description":"Single line within an ``AddStayRequest``."},"LinkPropertyRequest":{"properties":{"linked_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Property Id","description":"Property ID to link, or null to unlink"}},"type":"object","title":"LinkPropertyRequest","description":"Body for linking a claim request to an existing property.\nPass null to unlink."},"ListingStrength":{"properties":{"property_id":{"type":"integer","title":"Property Id","description":"Property this score belongs to"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name","description":"Property name for display"},"score":{"type":"integer","maximum":100,"minimum":0,"title":"Score","description":"Overall listing strength score"},"tier":{"$ref":"#/components/schemas/StrengthTier","description":"Quality tier based on score"},"factors":{"items":{"$ref":"#/components/schemas/StrengthFactor"},"type":"array","title":"Factors","description":"Individual factors"},"recommendations":{"items":{"$ref":"#/components/schemas/StrengthRecommendation"},"type":"array","title":"Recommendations","description":"Actionable improvement suggestions (max 3)"},"calculated_at":{"type":"string","format":"date-time","title":"Calculated At","description":"When this score was computed"}},"type":"object","required":["property_id","score","tier","calculated_at"],"title":"ListingStrength","description":"Full listing strength data for a property."},"ListingStrengthResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"$ref":"#/components/schemas/ListingStrength"}},"type":"object","required":["msg","data"],"title":"ListingStrengthResponse","description":"API response wrapper for listing strength."},"LocalAreaAdminResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"prose":{"$ref":"#/components/schemas/LocalAreaProseState"},"chips":{"items":{"$ref":"#/components/schemas/LocalAreaChipItem"},"type":"array","title":"Chips"},"allowed_topics":{"items":{"type":"string","enum":["supermarket","pharmacy","boat_ramp","dump_point","ev_charging","beach","playground","skatepark","golf_course","shopping_mall","brewery","scenic_lookout","fun_centre"]},"type":"array","title":"Allowed Topics"},"enrich":{"$ref":"#/components/schemas/LocalAreaEnrichState"},"last_enriched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Enriched At"}},"type":"object","required":["property_id","prose","chips","allowed_topics","enrich"],"title":"LocalAreaAdminResponse","description":"GET /park-admin/local-area"},"LocalAreaChipCreateRequest":{"properties":{"topic":{"type":"string","enum":["supermarket","pharmacy","boat_ramp","dump_point","ev_charging","beach","playground","skatepark","golf_course","shopping_mall","brewery","scenic_lookout","fun_centre"],"title":"Topic"},"place_name":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Place Name"},"distance_km":{"type":"number","maximum":500,"minimum":0,"title":"Distance Km"}},"type":"object","required":["topic","distance_km"],"title":"LocalAreaChipCreateRequest","description":"POST /park-admin/local-area/chips"},"LocalAreaChipItem":{"properties":{"link_id":{"type":"integer","title":"Link Id"},"local_entity_id":{"type":"integer","title":"Local Entity Id"},"topic":{"type":"string","enum":["supermarket","pharmacy","boat_ramp","dump_point","ev_charging","beach","playground","skatepark","golf_course","shopping_mall","brewery","scenic_lookout","fun_centre"],"title":"Topic"},"topic_label":{"type":"string","title":"Topic Label"},"place_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Name"},"distance_km":{"type":"number","title":"Distance Km"},"publish_status":{"type":"string","enum":["hidden","structured","named"],"title":"Publish Status"},"visible":{"type":"boolean","title":"Visible"},"preview":{"type":"string","title":"Preview"},"discover_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discover Provider"}},"type":"object","required":["link_id","local_entity_id","topic","topic_label","distance_km","publish_status","visible","preview"],"title":"LocalAreaChipItem","description":"One nearby-fact chip for park-admin editing (includes hidden)."},"LocalAreaChipUpdateRequest":{"properties":{"place_name":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Place Name"},"distance_km":{"anyOf":[{"type":"number","maximum":500,"minimum":0},{"type":"null"}],"title":"Distance Km"},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Visible"}},"type":"object","title":"LocalAreaChipUpdateRequest","description":"PATCH /park-admin/local-area/chips/{link_id}"},"LocalAreaEnrichEnqueueResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","enum":["idle","pending","running","succeeded","failed","prose_needs_review"],"title":"Status","default":"pending"}},"type":"object","required":["task_id"],"title":"LocalAreaEnrichEnqueueResponse","description":"POST /park-admin/local-area/enrich"},"LocalAreaEnrichState":{"properties":{"status":{"type":"string","enum":["idle","pending","running","succeeded","failed","prose_needs_review"],"title":"Status","default":"idle"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"prose_quality_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prose Quality Status"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"LocalAreaEnrichState","description":"Last / in-flight enrichment job for this property."},"LocalAreaEnrichStatusResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"enrich":{"$ref":"#/components/schemas/LocalAreaEnrichState"},"local_area":{"anyOf":[{"$ref":"#/components/schemas/LocalAreaAdminResponse"},{"type":"null"}]}},"type":"object","required":["property_id","enrich"],"title":"LocalAreaEnrichStatusResponse","description":"GET /park-admin/local-area/enrich/status"},"LocalAreaProseState":{"properties":{"practical_nearby_blurb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Practical Nearby Blurb"},"quality_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality Status"},"last_generated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Generated At"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"prompt_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Version"}},"type":"object","title":"LocalAreaProseState","description":"Current prose draft state (any quality_status)."},"LocalAreaProseUpdateRequest":{"properties":{"practical_nearby_blurb":{"type":"string","maxLength":1200,"minLength":1,"title":"Practical Nearby Blurb"}},"type":"object","required":["practical_nearby_blurb"],"title":"LocalAreaProseUpdateRequest","description":"PATCH /park-admin/local-area/prose"},"LoginSuccessResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","format":"email","title":"Username"},"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"displayname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"register_date":{"type":"string","format":"date-time","title":"Register Date"},"roles":{"items":{},"type":"array","title":"Roles","default":[]},"profile_pic":{"type":"string","title":"Profile Pic"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token","default":""},"pending_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Email"},"mfa_satisfied":{"type":"boolean","title":"Mfa Satisfied","default":false},"mfa_enrolled":{"type":"boolean","title":"Mfa Enrolled","default":false},"mfa_recovery":{"type":"boolean","title":"Mfa Recovery","default":false},"mfa_access_required":{"type":"boolean","title":"Mfa Access Required","default":false},"kind":{"type":"string","const":"session","title":"Kind","default":"session"}},"type":"object","required":["id","username","register_date","profile_pic"],"title":"LoginSuccessResponse","description":"Returned by /login when the user has no active MFA. Backward-compat\nwith the pre-MFA shape — extra ``kind`` field is the only diff."},"MCPHandoffRedeemRequestV1":{"properties":{"schema_version":{"type":"string","const":"conversion-mcp-handoff-v1","title":"Schema Version"},"handoff_token":{"type":"string","maxLength":160,"minLength":40,"pattern":"^tp_mcp_ho_[A-Za-z0-9_-]{32}\\.[0-9a-f]{64}$","title":"Handoff Token"},"consent_state":{"type":"string","enum":["analytics","analytics_and_advertising"],"title":"Consent State"},"journey_start":{"$ref":"#/components/schemas/BrowserJourneyStartContextV2"}},"additionalProperties":false,"type":"object","required":["schema_version","handoff_token","consent_state","journey_start"],"title":"MCPHandoffRedeemRequestV1","description":"First-party redemption of one opaque MCP measurement handoff."},"MCPHandoffRedeemResponseV1":{"properties":{"schema_version":{"type":"string","const":"conversion-mcp-handoff-v1","title":"Schema Version","default":"conversion-mcp-handoff-v1"},"linked":{"type":"boolean","title":"Linked"},"active":{"type":"boolean","title":"Active"},"reason":{"type":"string","enum":["none","feature_disabled","consent","expired","tampered","replayed","continuity","context_mismatch","validation","internal"],"title":"Reason","default":"none"}},"additionalProperties":false,"type":"object","required":["linked","active"],"title":"MCPHandoffRedeemResponseV1","description":"Bounded redemption outcome; never echoes journey IDs or tokens."},"MagicLinkConsumeRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"MagicLinkConsumeRequest"},"MagicLinkRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","default":"AU"}},"type":"object","required":["email"],"title":"MagicLinkRequest"},"Mapping":{"properties":{"room_types":{"items":{"$ref":"#/components/schemas/RoomTypeMapping"},"type":"array","title":"Room Types","default":[]}},"type":"object","title":"Mapping","description":"Parsed GetMappingRS response."},"MappingSyncStats":{"properties":{"room_types_updated":{"type":"integer","title":"Room Types Updated","default":0},"rate_plans_updated":{"type":"integer","title":"Rate Plans Updated","default":0}},"type":"object","title":"MappingSyncStats","description":"Statistics from syncing mapping data."},"MarkSentRequest":{"properties":{"bank_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Reference"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"override_unverified_lookup":{"type":"boolean","title":"Override Unverified Lookup","default":false},"override_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Reason"}},"type":"object","title":"MarkSentRequest","description":"Request body for marking a single payout as sent."},"MfaChallengeResponse":{"properties":{"kind":{"type":"string","const":"mfa_required","title":"Kind","default":"mfa_required"},"mfa_challenge_token":{"type":"string","title":"Mfa Challenge Token"},"mfa_methods":{"items":{"type":"string","enum":["totp","webauthn","recovery_code"]},"type":"array","title":"Mfa Methods"},"preferred_hint":{"anyOf":[{"type":"string","enum":["totp","webauthn"]},{"type":"null"}],"title":"Preferred Hint"},"extranet_handoff":{"type":"boolean","title":"Extranet Handoff","default":false}},"type":"object","required":["mfa_challenge_token","mfa_methods"],"title":"MfaChallengeResponse","description":"Returned by /login when the user has at least one active MFA method.\nThe challenge token must be exchanged at /auth/mfa/verify-login.\n\n``mfa_methods`` is computed from the user's actual active method\ntypes (plus the implicit ``recovery_code`` fallback) so the client\nonly renders branches the user can actually satisfy.\n\n``preferred_hint`` is the most recently used primary factor\n(``totp`` / ``webauthn``) when both are enrolled — soft UI ordering\nonly; ``None`` when neither has been used yet.\n\n``extranet_handoff`` is true when the account holds ``admin`` or any\n``sa_*`` role. NZ guest hosts use this to send operators to the\nAU-canonical login before starting an MFA ceremony (passkeys are\nRP-bound to ``totalparks.com.au``). A boolean avoids leaking the\nfull role list on the unauthenticated challenge response."},"MfaEnrolmentSummary":{"properties":{"total_park_admins":{"type":"integer","title":"Total Park Admins"},"enrolled":{"type":"integer","title":"Enrolled"},"enrolment_pct":{"type":"number","title":"Enrolment Pct"},"unenrolled":{"items":{"$ref":"#/components/schemas/UnenrolledParkAdmin"},"type":"array","title":"Unenrolled"},"by_property":{"items":{"$ref":"#/components/schemas/PropertyEnrolmentRow"},"type":"array","title":"By Property"}},"type":"object","required":["total_park_admins","enrolled","enrolment_pct","unenrolled","by_property"],"title":"MfaEnrolmentSummary","description":"Body returned by GET /admin/mfa-enrolment.\n\nDrives the super-admin \"MFA Enrolment\" dashboard card and the\nT−7 extend / pull-forward decision per the roadmap. Phase 3\nfunnel-conversion stat is deliberately deferred — when the\n``mfa_enrolment_required`` 403 audit row lands in Phase 3, this\nschema gains the fields rather than getting replaced."},"MfaMethodRenameRequest":{"properties":{"label":{"type":"string","maxLength":100,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"MfaMethodRenameRequest","description":"PATCH body for /auth/mfa/methods/{method_id}.\n\nLabel-only edit. No password re-auth — labels are cosmetic, an\nattacker who knows my authenticator's name can't escalate."},"MfaMethodSummary":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","enum":["totp","webauthn"],"title":"Type"},"label":{"type":"string","title":"Label"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","type","label","created_at"],"title":"MfaMethodSummary"},"MfaStatusResponse":{"properties":{"enrolled":{"type":"boolean","title":"Enrolled"},"methods":{"items":{"$ref":"#/components/schemas/MfaMethodSummary"},"type":"array","title":"Methods"},"recovery_codes_remaining":{"type":"integer","title":"Recovery Codes Remaining"}},"type":"object","required":["enrolled","methods","recovery_codes_remaining"],"title":"MfaStatusResponse","description":"Body returned by GET /auth/mfa/status — drives /account/security."},"MfaVerifyLoginRequest":{"properties":{"mfa_challenge_token":{"type":"string","title":"Mfa Challenge Token"},"code":{"type":"string","title":"Code","default":""},"method":{"type":"string","enum":["totp","webauthn","recovery_code"],"title":"Method","default":"totp"},"webauthn_response":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Webauthn Response"}},"type":"object","required":["mfa_challenge_token"],"title":"MfaVerifyLoginRequest","description":"POST body for /auth/mfa/verify-login.\n\nFor ``method=\"totp\"`` and ``method=\"recovery_code\"`` the value sits\nin ``code``. For ``method=\"webauthn\"`` the browser's\n``navigator.credentials.get`` response goes in\n``webauthn_response`` and ``code`` is empty/ignored — kept on the\nschema so the discriminator stays open."},"NewbookConfig":{"properties":{"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"instance_token":{"type":"string","title":"Instance Token"}},"type":"object","required":["username","password","instance_token"],"title":"NewbookConfig"},"OAuthCallbackRequest":{"properties":{"code":{"type":"string","title":"Code"},"state":{"type":"string","title":"State"}},"type":"object","required":["code","state"],"title":"OAuthCallbackRequest","description":"Request to complete the OAuth flow after Stripe redirects back with an authorization code."},"OAuthClientCreateRequest":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name"},"client_type":{"type":"string","enum":["confidential","public"],"title":"Client Type","default":"public"},"redirect_uris":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Redirect Uris"},"allowed_scopes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Allowed Scopes"},"consent_required":{"type":"boolean","title":"Consent Required","default":true},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"homepage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Homepage Url"}},"type":"object","required":["name","redirect_uris","allowed_scopes"],"title":"OAuthClientCreateRequest"},"OAuthClientCreateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret","description":"Only set for confidential clients; shown once"},"name":{"type":"string","title":"Name"},"client_type":{"type":"string","title":"Client Type"},"redirect_uris":{"items":{"type":"string"},"type":"array","title":"Redirect Uris"},"allowed_scopes":{"items":{"type":"string"},"type":"array","title":"Allowed Scopes"},"consent_required":{"type":"boolean","title":"Consent Required"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"homepage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Homepage Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","client_id","name","client_type","redirect_uris","allowed_scopes","consent_required","created_at"],"title":"OAuthClientCreateResponse","description":"Returned once — includes the one-shot client_secret for confidential clients."},"OAuthClientResponse":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"name":{"type":"string","title":"Name"},"client_type":{"type":"string","title":"Client Type"},"redirect_uris":{"items":{"type":"string"},"type":"array","title":"Redirect Uris"},"allowed_scopes":{"items":{"type":"string"},"type":"array","title":"Allowed Scopes"},"consent_required":{"type":"boolean","title":"Consent Required"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"homepage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Homepage Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","client_id","name","client_type","redirect_uris","allowed_scopes","consent_required","created_at"],"title":"OAuthClientResponse","description":"Listed client — secret is never included."},"OAuthClientUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"redirect_uris":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Redirect Uris"},"allowed_scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Scopes"},"consent_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Consent Required"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"homepage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Homepage Url"}},"type":"object","title":"OAuthClientUpdateRequest"},"OAuthGrantResponse":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"client_name":{"type":"string","title":"Client Name"},"client_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Logo Url"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","client_id","client_name","scopes","created_at"],"title":"OAuthGrantResponse","description":"A connected OAuth application from the user's perspective."},"OAuthLinkRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"}},"type":"object","required":["property_id"],"title":"OAuthLinkRequest","description":"Request to generate a Stripe OAuth authorize URL for connecting an existing account."},"OAuthLinkResponse":{"properties":{"oauth_url":{"type":"string","title":"Oauth Url"}},"type":"object","required":["oauth_url"],"title":"OAuthLinkResponse","description":"Response containing the Stripe OAuth authorize URL."},"OnboardingProgress":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name"},"pms_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Type"},"status":{"$ref":"#/components/schemas/app__schemas__park_admin__onboarding__OnboardingStatus"},"phases":{"additionalProperties":{"$ref":"#/components/schemas/PhaseProgress"},"type":"object","title":"Phases"},"phase_definitions":{"items":{"$ref":"#/components/schemas/PhaseDefinition"},"type":"array","title":"Phase Definitions"},"completion_percentage":{"type":"integer","maximum":100,"minimum":0,"title":"Completion Percentage"},"current_phase":{"anyOf":[{"$ref":"#/components/schemas/PhaseId"},{"type":"null"}]},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["property_id","status","completion_percentage"],"title":"OnboardingProgress","description":"Full onboarding progress response."},"OnboardingProgressResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"$ref":"#/components/schemas/OnboardingProgress"}},"type":"object","required":["msg","data"],"title":"OnboardingProgressResponse","description":"API response wrapper for onboarding progress."},"OnboardingReadiness":{"properties":{"can_enable_bookings":{"type":"boolean","title":"Can Enable Bookings","default":false},"missing_requirements":{"items":{"type":"string"},"type":"array","title":"Missing Requirements","default":[]}},"type":"object","title":"OnboardingReadiness","description":"Indicates whether a property can enable bookings.\nUsed to gate the booking_enabled toggle in the Park Admin UI."},"OptionFacet":{"type":"string","enum":["powered","unpowered","ensuite","drive_through","slab","tent_only","accessible","spa","pet_friendly","family","pet_fee_applies","no_pet_fee","declaration_required"],"title":"OptionFacet","description":"Traveller-facing inventory-option facts at room/site scope."},"OutcomeMetric":{"type":"string","enum":["cancelled_bookings","pms_failed_bookings","payment_auth_cancelled_bookings","refund_occurred_bookings","fully_refunded_bookings","refunded_accommodation_amount","refunded_pet_fee_amount","refunded_service_fee_amount","refunded_gross_amount"],"title":"OutcomeMetric"},"OutcomeTimeBasis":{"type":"string","enum":["outcome_at","cohort_started_at"],"title":"OutcomeTimeBasis"},"OutcomesSummary":{"properties":{"total":{"type":"integer","title":"Total","default":0},"won":{"type":"integer","title":"Won","default":0},"lost":{"type":"integer","title":"Lost","default":0},"pending":{"type":"integer","title":"Pending","default":0},"win_rate_percent":{"type":"number","title":"Win Rate Percent","default":0},"evidence_submitted_count":{"type":"integer","title":"Evidence Submitted Count","default":0}},"type":"object","title":"OutcomesSummary","description":"Aggregate stats across all platform disputes."},"OutreachActivityCreate":{"properties":{"type":{"type":"string","maxLength":20,"minLength":1,"title":"Type"},"direction":{"type":"string","maxLength":20,"minLength":1,"title":"Direction"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"template_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Template Used"}},"type":"object","required":["type","direction"],"title":"OutreachActivityCreate"},"OutreachAffiliationCreate":{"properties":{"kind":{"type":"string","enum":["property","property_group","property_management","partner"],"title":"Kind"},"property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Id"},"property_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Group Id"},"property_management_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Management Id"},"partner_label":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Partner Label"}},"type":"object","required":["kind"],"title":"OutreachAffiliationCreate"},"OutreachEmailTemplateCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"subject":{"type":"string","maxLength":500,"minLength":1,"title":"Subject"},"body":{"type":"string","minLength":1,"title":"Body"}},"type":"object","required":["name","subject","body"],"title":"OutreachEmailTemplateCreate"},"OutreachEmailTemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"subject":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Subject"},"body":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Body"}},"type":"object","title":"OutreachEmailTemplateUpdate"},"OutreachLeadCreate":{"properties":{"park_name":{"type":"string","maxLength":200,"minLength":1,"title":"Park Name"},"contact_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Contact Phone"},"state":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"State"},"pms_type":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Pms Type"},"source":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Source","default":"manual"},"status":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Status","default":"identified"},"priority":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Priority","default":"medium"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Id"},"management_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Management Id"},"follow_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Follow Up At"}},"type":"object","required":["park_name"],"title":"OutreachLeadCreate"},"OutreachLeadUpdate":{"properties":{"park_name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Park Name"},"contact_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Contact Phone"},"state":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"State"},"pms_type":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Pms Type"},"source":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Source"},"status":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Status"},"priority":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Priority"},"assigned_to":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assigned To"},"follow_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Follow Up At"},"property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Property Id"},"management_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Management Id"},"claim_request_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Claim Request Id"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"OutreachLeadUpdate"},"OutreachPersonCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"follow_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Follow Up At"}},"type":"object","required":["name"],"title":"OutreachPersonCreate"},"OutreachPersonUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Phone"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"follow_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Follow Up At"}},"type":"object","title":"OutreachPersonUpdate"},"PATCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","description":"User-chosen label, e.g. 'My Cursor agent'"},"scopes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Scopes","description":"Scopes to grant, e.g. ['carts:write','bookings:read']"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Optional expiry; null means never"}},"type":"object","required":["name","scopes"],"title":"PATCreateRequest"},"PATCreateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"token":{"type":"string","title":"Token","description":"Plaintext token — store securely, shown only once"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","scopes","token","created_at"],"title":"PATCreateResponse","description":"Returned once at creation — the only time the plaintext secret is visible."},"PATResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","scopes","created_at"],"title":"PATResponse","description":"Listed token — secret is never included."},"PATUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"}},"type":"object","title":"PATUpdateRequest"},"PMSAreaAssignment":{"properties":{"area_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area Id"},"area_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area Name"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"}},"type":"object","title":"PMSAreaAssignment","description":"Room/site assignment from PMS."},"PMSBookingData":{"properties":{"pms_type":{"type":"string","title":"Pms Type"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_booking_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Booking Number"},"pms_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Status"},"pms_status_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Status Name"},"check_in":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nights"},"created_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Date"},"adults":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Adults"},"children":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Children"},"infants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Infants"},"total_accommodation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Accommodation"},"total_charges":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Charges"},"total_payments":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Payments"},"balance_due":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance Due"},"area_assignment":{"anyOf":[{"$ref":"#/components/schemas/PMSAreaAssignment"},{"type":"null"}]},"rate_breakdown":{"items":{"$ref":"#/components/schemas/PMSRateBreakdown"},"type":"array","title":"Rate Breakdown","default":[]},"services":{"items":{"$ref":"#/components/schemas/PMSService"},"type":"array","title":"Services","default":[]},"discounts":{"items":{"$ref":"#/components/schemas/app__schemas__admin__bookings__PMSDiscount"},"type":"array","title":"Discounts","default":[]},"guests":{"items":{"$ref":"#/components/schemas/PMSGuest"},"type":"array","title":"Guests","default":[]},"payments":{"items":{"$ref":"#/components/schemas/PMSPayment"},"type":"array","title":"Payments","default":[]},"equipment":{"anyOf":[{"$ref":"#/components/schemas/PMSEquipment"},{"type":"null"}]},"special_requests":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Requests"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"comments":{"items":{"type":"string"},"type":"array","title":"Comments","default":[]},"raw_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Response"},"raw_response_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Response Format"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","default":[]}},"type":"object","required":["pms_type"],"title":"PMSBookingData","description":"Rich booking data fetched directly from PMS.\nNot stored in our database - fetched on-demand for admin view."},"PMSCancellationPolicy":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_default":{"type":"boolean","title":"Is Default","default":false},"rules":{"items":{"$ref":"#/components/schemas/PMSCancellationRule"},"type":"array","title":"Rules","default":[]}},"type":"object","title":"PMSCancellationPolicy","description":"Cancellation policy from PMS."},"PMSCancellationRule":{"properties":{"days_before":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Before"},"charge_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Type"},"charge_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Charge Amount"},"charge_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Charge Percentage"}},"type":"object","title":"PMSCancellationRule","description":"Cancellation policy rule from PMS."},"PMSConfigCreate":{"properties":{"pms_type":{"$ref":"#/components/schemas/app__schemas__property__property_pms_config__PMSType","description":"Type of PMS (newbook, rms)"},"pms_property_id":{"type":"string","title":"Pms Property Id","description":"PMS property identifier (Newbook: instance_token, RMS: client_id)"},"property_id":{"type":"integer","title":"Property Id","description":"Total Parks property ID"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"API username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"API password"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url","description":"API endpoint URL"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token","description":"Newbook instance token"},"is_test_environment":{"type":"boolean","title":"Is Test Environment","description":"Whether this is a Newbook test environment (affects ARISettingsRQ)","default":false},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id","description":"RMS client ID"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id","description":"RMS agent ID"},"rms_parent_client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Parent Client Id","description":"RMS parent database ID (rmsClientId) for API auth"},"rms_selected_property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Selected Property Name","description":"Display name of selected child property"},"rms_api_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Api Property Id","description":"RMS propertyId for API data access paths (from /properties endpoint)"},"rms_booking_source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Booking Source Id","description":"RMS booking source ID applied to reservation confirmations"},"rms_receipt_type":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Rms Receipt Type","description":"RMS DirectCredit slot to route Total Parks receipts to (e.g. 'directCredit', 'directCredit6'). Null = default 'directCredit'."},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config","description":"Additional PMS-specific configuration as JSON"}},"type":"object","required":["pms_type","pms_property_id","property_id"],"title":"PMSConfigCreate","description":"Schema for creating a new PMS configuration."},"PMSConfigResponse":{"properties":{"pms_type":{"$ref":"#/components/schemas/PMSType-Output","description":"Type of PMS (newbook, rms)"},"pms_property_id":{"type":"string","title":"Pms Property Id","description":"PMS property identifier (Newbook: instance_token, RMS: client_id)"},"id":{"type":"integer","title":"Id"},"property_id":{"type":"integer","title":"Property Id"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token"},"is_test_environment":{"type":"boolean","title":"Is Test Environment","default":false},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"rms_travel_agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Travel Agent Id","description":"Cached RMS travel/online agent ID for reservations"},"rms_booking_source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Booking Source Id","description":"RMS booking source ID applied to reservation confirmations"},"rms_receipt_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Receipt Type","description":"RMS DirectCredit slot for Total Parks receipts. Null falls back to default 'directCredit'."},"onboarding_status":{"$ref":"#/components/schemas/app__schemas__property__property_pms_config__OnboardingStatus","default":"pending"},"onboarding_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onboarding Started At"},"onboarding_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onboarding Completed At"},"onboarding_failed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onboarding Failed At"},"onboarding_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Error"},"onboarding_retry_count":{"type":"integer","title":"Onboarding Retry Count","default":0},"last_descriptive_sync":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Descriptive Sync"},"last_ari_push_received":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Ari Push Received"}},"type":"object","required":["pms_type","pms_property_id","id","property_id"],"title":"PMSConfigResponse","description":"Schema for PMS configuration response (excludes sensitive data)."},"PMSConfigUpdate":{"properties":{"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token"},"is_test_environment":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Test Environment"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"rms_booking_source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Booking Source Id"},"rms_receipt_type":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Rms Receipt Type"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","title":"PMSConfigUpdate","description":"Schema for updating an existing PMS configuration."},"PMSEquipment":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"make":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Make"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"registration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration"},"length_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length M"},"width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width M"}},"type":"object","title":"PMSEquipment","description":"Equipment info from PMS (caravan, RV details)."},"PMSGuest":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mobile"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"loyalty_member_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loyalty Member Id"},"loyalty_program_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loyalty Program Id"}},"type":"object","title":"PMSGuest","description":"Guest profile from PMS."},"PMSPayment":{"properties":{"amount":{"type":"number","title":"Amount"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"payment_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Date"},"payment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Type"}},"type":"object","required":["amount"],"title":"PMSPayment","description":"Payment/deposit from PMS."},"PMSPropertyData":{"properties":{"pms_type":{"type":"string","title":"Pms Type"},"pms_property_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Property Id"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name"},"images":{"items":{"$ref":"#/components/schemas/PMSPropertyImage"},"type":"array","title":"Images","default":[]},"cancellation_policies":{"items":{"$ref":"#/components/schemas/PMSCancellationPolicy"},"type":"array","title":"Cancellation Policies","default":[]},"discounts":{"items":{"$ref":"#/components/schemas/app__schemas__admin__properties__PMSDiscount"},"type":"array","title":"Discounts","default":[]},"room_types":{"items":{"$ref":"#/components/schemas/PMSRoomType"},"type":"array","title":"Room Types","default":[]},"raw_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Response"},"raw_response_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Response Format"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["pms_type"],"title":"PMSPropertyData","description":"Rich property data fetched directly from PMS.\nNot stored in our database - fetched on-demand for admin view."},"PMSPropertyImage":{"properties":{"url":{"type":"string","title":"Url"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","required":["url"],"title":"PMSPropertyImage","description":"Property image from PMS."},"PMSRateBreakdown":{"properties":{"date":{"type":"string","title":"Date"},"amount":{"type":"number","title":"Amount"},"adults":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Adults"},"children":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Children"},"infants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Infants"}},"type":"object","required":["date","amount"],"title":"PMSRateBreakdown","description":"Daily rate breakdown from PMS."},"PMSRoomType":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"max_occupancy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Occupancy"},"min_occupancy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Occupancy"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity"},"category_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Type"},"images":{"items":{"$ref":"#/components/schemas/PMSPropertyImage"},"type":"array","title":"Images","default":[]}},"type":"object","required":["id","name"],"title":"PMSRoomType","description":"Room type from PMS (category in RMS terminology)."},"PMSService":{"properties":{"name":{"type":"string","title":"Name"},"quantity":{"type":"integer","title":"Quantity","default":1},"amount":{"type":"number","title":"Amount"},"contribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contribution"}},"type":"object","required":["name","amount"],"title":"PMSService","description":"Service/extra from PMS (e.g., pet fees, booking fees)."},"PMSTestConnectionRequest":{"properties":{"pms_type":{"$ref":"#/components/schemas/app__schemas__property__property_pms_config__PMSType","description":"Type of PMS (newbook, rms)"},"config_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Config Id","description":"Existing PMS config ID to merge with (for edit mode)"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"API username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"API password"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url","description":"API endpoint URL"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token","description":"Newbook instance token"},"is_test_environment":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Test Environment","description":"Whether this is a Newbook test environment"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id","description":"RMS client ID"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id","description":"RMS agent ID"}},"type":"object","required":["pms_type"],"title":"PMSTestConnectionRequest","description":"Request body for testing PMS connection without saving.\n\nIf config_id is provided, missing fields will be filled from the existing\nconfig in the database. This allows testing with partial updates in edit mode."},"PMSTestConnectionResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the connection test succeeded"},"message":{"type":"string","title":"Message","description":"Success or error message"},"pms_type":{"$ref":"#/components/schemas/PMSType-Output","description":"Type of PMS that was tested"}},"type":"object","required":["success","message","pms_type"],"title":"PMSTestConnectionResponse","description":"Response from testing PMS connection."},"PMSType-Output":{"type":"string","enum":["newbook","rms"],"title":"PMSType","description":"Supported Property Management System types."},"ParkAdminAuditEntry":{"properties":{"id":{"type":"integer","title":"Id"},"action":{"type":"string","title":"Action"},"actor_user_id":{"type":"integer","title":"Actor User Id"},"actor_display":{"type":"string","title":"Actor Display"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","action","actor_user_id","actor_display","created_at"],"title":"ParkAdminAuditEntry","description":"A single ``admin_audit_log`` row scoped to the per-user audit feed.\n\nOnly ``park_admin_*`` actions surface here. ``actor_display`` is a\nconvenience string (full name when available, falling back to the\nusername) so the UI doesn't have to join against ``users``."},"ParkAdminBookingCancellationError":{"properties":{"msg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Msg"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"detail":{"anyOf":[{},{"type":"null"}],"title":"Detail"}},"type":"object","title":"ParkAdminBookingCancellationError","description":"Error shapes returned by the route or its capability dependency."},"ParkAdminBookingCancellationResponse":{"properties":{"booking_id":{"type":"integer","title":"Booking Id"},"pms_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Provider"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"reservation_status":{"type":"string","title":"Reservation Status"},"payment_status":{"type":"string","title":"Payment Status"},"already_cancelled":{"type":"boolean","title":"Already Cancelled"}},"type":"object","required":["booking_id","pms_provider","pms_reservation_id","reservation_status","payment_status","already_cancelled"],"title":"ParkAdminBookingCancellationResponse","description":"Reservation and payment state after a cancellation request."},"ParkAdminBookingDetail":{"properties":{"id":{"type":"integer","title":"Id"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"booking_code":{"type":"string","title":"Booking Code"},"status":{"type":"string","title":"Status"},"payment_status":{"type":"string","title":"Payment Status"},"payment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Path"},"room_type":{"$ref":"#/components/schemas/ParkAdminRoomTypeSummary"},"guest_first_name":{"type":"string","title":"Guest First Name"},"guest_last_name":{"type":"string","title":"Guest Last Name"},"guest_email":{"type":"string","title":"Guest Email"},"guest_phone":{"type":"string","title":"Guest Phone"},"special_requests":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Requests"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"adults":{"type":"integer","title":"Adults"},"children":{"type":"integer","title":"Children"},"infants":{"type":"integer","title":"Infants"},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Amount"},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total"},"service_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee"},"discount_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount Amount"},"park_revenue":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Park Revenue"},"guest_paid_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Guest Paid Total"},"promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Code"},"currency":{"type":"string","title":"Currency"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"stripe_account_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Account Type"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Id"},"pms_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Provider"},"pet_booking_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Booking Mode"},"pet_declaration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pet Declaration"},"equipment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Equipment Type"},"equipment_length":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Equipment Length"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","confirmation_number","booking_code","status","payment_status","room_type","guest_first_name","guest_last_name","guest_email","guest_phone","check_in","check_out","adults","children","infants","total_amount","service_fee","park_revenue","guest_paid_total","currency","created_at","updated_at"],"title":"ParkAdminBookingDetail","description":"Full booking detail for park admin view.\nIncludes the payment path plus Stripe payment intent metadata so the\nfrontend can explain refunds correctly and link Standard (OAuth)\noperators to their own Stripe Dashboard."},"ParkAdminBookingListItem":{"properties":{"id":{"type":"integer","title":"Id"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"booking_code":{"type":"string","title":"Booking Code"},"status":{"type":"string","title":"Status"},"payment_status":{"type":"string","title":"Payment Status"},"guest_first_name":{"type":"string","title":"Guest First Name"},"guest_last_name":{"type":"string","title":"Guest Last Name"},"guest_email":{"type":"string","title":"Guest Email"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"adults":{"type":"integer","title":"Adults"},"children":{"type":"integer","title":"Children"},"room_type_name":{"type":"string","title":"Room Type Name"},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Amount"},"pet_fee_total":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Total"},"service_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee"},"discount_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount Amount"},"park_revenue":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Park Revenue"},"promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Code"},"currency":{"type":"string","title":"Currency"},"pet_booking_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Booking Mode"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","confirmation_number","booking_code","status","payment_status","guest_first_name","guest_last_name","guest_email","check_in","check_out","adults","children","room_type_name","total_amount","service_fee","park_revenue","currency","created_at"],"title":"ParkAdminBookingListItem","description":"Booking summary for park admin list views.\nSimilar to admin version but without some internal fields."},"ParkAdminBookingListResponse":{"properties":{"bookings":{"items":{"$ref":"#/components/schemas/ParkAdminBookingListItem"},"type":"array","title":"Bookings"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["bookings","total","page","limit"],"title":"ParkAdminBookingListResponse","description":"Paginated response for park admin booking list."},"ParkAdminBookingNotificationRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether the property contact email should receive a notification when Total Parks takes a booking."}},"type":"object","required":["enabled"],"title":"ParkAdminBookingNotificationRequest","description":"Request to toggle the opt-in park booking notification email.\n\nWhen enabled, the property's contact email also receives a\nnotification each time Total Parks takes a booking for the park."},"ParkAdminBookingNotificationResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"park_booking_notification_enabled":{"type":"boolean","title":"Park Booking Notification Enabled"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"missing_contact_email":{"type":"boolean","title":"Missing Contact Email","default":false}},"type":"object","required":["property_id","park_booking_notification_enabled"],"title":"ParkAdminBookingNotificationResponse","description":"Response after toggling the park booking notification opt-in.\n\n``contact_email`` echoes the address that will receive notifications\n(``properties.email``). ``missing_contact_email`` is True when the\nopt-in is enabled but no contact email is configured, so the UI can\nwarn that mail will not be delivered until one is set."},"ParkAdminBookingPayoutInfo":{"properties":{"stripe_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Stripe Fee"},"net_payout":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Net Payout"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["stripe_fee","net_payout","currency"],"title":"ParkAdminBookingPayoutInfo","description":"Actual payout breakdown for a booking.\n\nUses the stored Stripe balance-transaction fee when available, with a\nlive Stripe lookup fallback for older Connect bookings."},"ParkAdminBootstrapResponse":{"properties":{"properties":{"items":{"$ref":"#/components/schemas/ParkAdminPropertySummary"},"type":"array","title":"Properties","default":[]},"selected_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Property Id"},"dashboard":{"anyOf":[{"$ref":"#/components/schemas/ParkAdminDashboard"},{"type":"null"}]}},"type":"object","title":"ParkAdminBootstrapResponse","description":"Bootstrap response: everything the park admin shell needs in one round-trip.\nCollapses PropertyProvider + root page + dashboard page waterfall into one call."},"ParkAdminCapabilityDiff":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"capabilities_before":{"items":{"type":"string"},"type":"array","title":"Capabilities Before","default":[]},"capabilities_after":{"items":{"type":"string"},"type":"array","title":"Capabilities After","default":[]},"capabilities_added":{"items":{"type":"string"},"type":"array","title":"Capabilities Added","default":[]},"capabilities_removed":{"items":{"type":"string"},"type":"array","title":"Capabilities Removed","default":[]}},"type":"object","required":["property_id"],"title":"ParkAdminCapabilityDiff","description":"Per-property capability diff returned by a PATCH/DELETE call.\n\nMirrors ``app.services.park_admin.team_grants.CapabilityDiff`` so\nthe response surface stays stable when the service refactors.\nEmpty ``capabilities_added`` / ``capabilities_removed`` lists\nindicate a no-op that's been included for completeness (the\nresponse excludes idempotent properties entirely, so this is\nonly used when the row actually changed)."},"ParkAdminDashboard":{"properties":{"property":{"$ref":"#/components/schemas/ParkAdminPropertySummary"},"stats":{"$ref":"#/components/schemas/ParkAdminDashboardStats"},"recent_bookings":{"items":{"$ref":"#/components/schemas/ParkAdminRecentBooking"},"type":"array","title":"Recent Bookings","default":[]}},"type":"object","required":["property","stats"],"title":"ParkAdminDashboard","description":"Full dashboard response for park admin."},"ParkAdminDashboardStats":{"properties":{"total_bookings":{"type":"integer","title":"Total Bookings","default":0},"bookings_this_month":{"type":"integer","title":"Bookings This Month","default":0},"upcoming_check_ins":{"type":"integer","title":"Upcoming Check Ins","default":0},"room_type_count":{"type":"integer","title":"Room Type Count","default":0}},"type":"object","title":"ParkAdminDashboardStats","description":"Dashboard statistics for a property."},"ParkAdminDiscountPatchRequest":{"properties":{"promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Code","description":"The typeable code, or null to clear. Allowlist [A-Z0-9_-], max 50 chars. Uppercased server-side."},"expose_as_promo_code":{"anyOf":[{"type":"string","enum":["auto","never"]},{"type":"null"}],"title":"Expose As Promo Code"}},"type":"object","title":"ParkAdminDiscountPatchRequest","description":"Update one discount's promo-code exposure metadata.\n\nAll fields are optional. `promo_code: null` clears the override.\n`promo_code` is uppercased before validation; the allowlist is enforced\nso a bogus code can't slip past the canonicalisation expected by\n`app.services.campaign.resolvers.canonicalise_code`."},"ParkAdminImageReorderRequest":{"properties":{"image_ids":{"items":{"type":"integer"},"type":"array","title":"Image Ids"}},"type":"object","required":["image_ids"],"title":"ParkAdminImageReorderRequest","description":"Request to reorder property images.\nExpects a list of image IDs in the desired order."},"ParkAdminImportPmsImagesRequest":{"properties":{"pms_image_ids":{"items":{"type":"integer"},"type":"array","maxItems":10,"minItems":1,"title":"Pms Image Ids"}},"type":"object","required":["pms_image_ids"],"title":"ParkAdminImportPmsImagesRequest","description":"Request body for copying PMS room-type images into the overrides gallery.\n\nThe list is bounded by the override gallery cap (10 images) so a\nsingle bulk request can never exceed it on its own; the router also\nrejects the request when ``current_count + len(pms_image_ids)`` would\nbust the cap."},"ParkAdminInviteRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"firstname":{"type":"string","maxLength":100,"minLength":1,"title":"Firstname"},"lastname":{"type":"string","maxLength":100,"minLength":1,"title":"Lastname"},"capabilities":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Capabilities","description":"Capability strings to grant on every resolved property. Validated against the ``Capability`` enum."},"property_ids":{"items":{"type":"integer"},"type":"array","title":"Property Ids","description":"Direct property IDs to grant access on. Optional when ``property_group_ids`` is non-empty (groups expand to their member properties server-side)."},"property_group_ids":{"items":{"type":"integer"},"type":"array","title":"Property Group Ids","description":"Property-group IDs to expand into per-property grants server-side. Inactive groups are silently skipped (see ``skipped_inactive_group_ids`` on the response). Effective access stays per-property — see ADR-0008."},"preset_name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Preset Name","description":"UX-only label (e.g. 'Front desk'). Recorded in the audit log metadata for support queries; the backend does not expand it server-side."}},"type":"object","required":["email","firstname","lastname","capabilities"],"title":"ParkAdminInviteRequest","description":"Request body for ``POST /park-admin/users/invite``.\n\nBulk-shaped from day one — ``property_ids`` is always a list, even\nfor the single-property case. ``capabilities`` applies to every\nlisted property; per-property capability divergence is a Phase 2b\nfeature (PATCH).\n\nPhase 3a (Team-manager slice) adds ``property_group_ids`` as a\nbulk-action shortcut: each active group is expanded server-side to\nits current member properties and merged with ``property_ids``\nbefore R1 / scope / lockout checks run. Inactive groups are\nsilently skipped and reported back in\n``skipped_inactive_group_ids``. At least one of ``property_ids``\nor ``property_group_ids`` must be non-empty.\n\nThe ``preset_name`` is purely UX sugar — the backend records it in\nthe audit log but does not interpret it. Resolved client-side to a\ncapability list before the call."},"ParkAdminInviteResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"is_new_user":{"type":"boolean","title":"Is New User"},"affected_property_ids":{"items":{"type":"integer"},"type":"array","title":"Affected Property Ids","default":[]},"skipped_inactive_group_ids":{"items":{"type":"integer"},"type":"array","title":"Skipped Inactive Group Ids","default":[]},"invite_email_sent":{"type":"boolean","title":"Invite Email Sent","default":false}},"type":"object","required":["user_id","email","is_new_user"],"title":"ParkAdminInviteResponse","description":"Response shape for ``POST /park-admin/users/invite``.\n\n``is_new_user`` distinguishes the two email pathways for any\ncaller-side analytics. ``affected_property_ids`` is the subset of\nthe resolved property set where a grant was actually written —\nempty when every property was already a no-op match (the spec's\n\"zero-net-change\" rule on bulk contract Q3).\n\n``skipped_inactive_group_ids`` (Phase 3a) lists group IDs the\ncaller supplied whose ``is_active = False`` flag caused them to be\nsilently skipped at expansion time. UI can warn the user without\nforcing them to re-submit."},"ParkAdminMePropertiesResponse":{"properties":{"properties":{"items":{"$ref":"#/components/schemas/ParkAdminMeProperty"},"type":"array","title":"Properties","default":[]}},"type":"object","title":"ParkAdminMePropertiesResponse","description":"Response shape for ``GET /park-admin/me/properties``."},"ParkAdminMeProperty":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"booking_enabled":{"type":"boolean","title":"Booking Enabled","default":false},"payment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Path","description":"\"connect\" | \"platform\" | None — drives nav gating."},"cover_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image","description":"Filename of first property image (by sort_order)."},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities","description":"Capabilities the requesting user holds on this property."},"is_team_manager":{"type":"boolean","title":"Is Team Manager","description":"True iff ``users.manage`` is in ``capabilities``.","default":false}},"type":"object","required":["id","name","slug"],"title":"ParkAdminMeProperty","description":"Single entry in the ``GET /park-admin/me/properties`` response.\n\nLighter than ``ParkAdminPropertySummary`` (no PMS config, no\ndetailed dashboard fields) but carries every field the layout's\nproperty switcher and nav need today — ``cover_image``,\n``address``, ``booking_enabled``, ``payment_path``,\n``capabilities`` — so the layout can call this endpoint as the\ncanonical source of the user's property list, without needing to\nhave a property selected first. The endpoint is non-capability-\ngated (any park admin role) so the picker always works even\nbefore a property is selected."},"ParkAdminMultiPropertyDashboard":{"properties":{"properties":{"items":{"$ref":"#/components/schemas/ParkAdminPropertySummary"},"type":"array","title":"Properties","default":[]},"selected_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Property Id"},"dashboard":{"anyOf":[{"$ref":"#/components/schemas/ParkAdminDashboard"},{"type":"null"}]}},"type":"object","title":"ParkAdminMultiPropertyDashboard","description":"Dashboard response for users managing multiple properties."},"ParkAdminPMSConfigCreate":{"properties":{"pms_type":{"$ref":"#/components/schemas/app__schemas__property__property_pms_config__PMSType","description":"Type of PMS (newbook, rms)"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"API username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"API password"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url","description":"API endpoint URL"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token","description":"Newbook instance token (property identifier)"},"is_test_environment":{"type":"boolean","title":"Is Test Environment","description":"Whether this is a Newbook test environment","default":false},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id","description":"RMS parent client ID (for API auth)"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id","description":"RMS agent ID"},"rms_booking_source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Booking Source Id","description":"RMS booking source ID applied to new reservations"},"rms_receipt_type":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Rms Receipt Type","description":"Optional RMS DirectCredit slot for Total Parks receipts (e.g. 'directCredit', 'directCredit6'). Null = default 'directCredit'."},"selected_rms_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Rms Property Id","description":"Property ID from /properties endpoint (for API data access paths, e.g., 1)"},"selected_rms_client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Rms Client Id","description":"Client ID from /properties endpoint (for webhook routing, e.g., 11282)"},"selected_rms_property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Rms Property Name","description":"Display name of selected child property"}},"type":"object","required":["pms_type"],"title":"ParkAdminPMSConfigCreate","description":"Request body for creating a new PMS configuration.\nPark admins use this to set up their PMS integration."},"ParkAdminPMSConfigData":{"properties":{"id":{"type":"integer","title":"Id"},"property_id":{"type":"integer","title":"Property Id"},"pms_type":{"$ref":"#/components/schemas/PMSType-Output"},"pms_property_id":{"type":"string","title":"Pms Property Id"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token"},"is_test_environment":{"type":"boolean","title":"Is Test Environment","default":false},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"rms_travel_agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Travel Agent Id","description":"Cached RMS travel/online agent ID used on reservations"},"rms_booking_source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Booking Source Id","description":"RMS booking source ID applied to new reservations"},"rms_receipt_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Receipt Type","description":"RMS DirectCredit slot for Total Parks receipts (e.g. 'directCredit6'). Null falls back to default 'directCredit'."},"rms_parent_client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Parent Client Id","description":"Parent database ID (rmsClientId) used for API auth"},"rms_selected_property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rms Selected Property Name","description":"Display name of connected child property"},"rms_api_property_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Api Property Id","description":"Property ID for API data access paths (from /properties endpoint)"},"onboarding_status":{"$ref":"#/components/schemas/app__schemas__property__property_pms_config__OnboardingStatus","default":"pending"},"onboarding_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Error"}},"type":"object","required":["id","property_id","pms_type","pms_property_id"],"title":"ParkAdminPMSConfigData","description":"PMS configuration data returned to park admins.\nExcludes sensitive credentials (username, password)."},"ParkAdminPMSConfigResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"anyOf":[{"$ref":"#/components/schemas/ParkAdminPMSConfigData"},{"type":"null"}]}},"type":"object","required":["msg"],"title":"ParkAdminPMSConfigResponse","description":"Response wrapper for PMS configuration."},"ParkAdminPMSConfigUpdate":{"properties":{"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token"},"is_test_environment":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Test Environment"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"},"rms_booking_source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Booking Source Id","description":"RMS booking source ID applied to new reservations"},"rms_receipt_type":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Rms Receipt Type","description":"Optional RMS DirectCredit slot for Total Parks receipts. Send null to clear the override (falls back to default 'directCredit')."}},"type":"object","title":"ParkAdminPMSConfigUpdate","description":"Request body for updating an existing PMS configuration.\nEmpty fields preserve existing values (FR-010)."},"ParkAdminPMSStatus":{"properties":{"config_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Config Id"},"pms_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Type"},"is_connected":{"type":"boolean","title":"Is Connected","default":false},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code"},"check_in_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out Time"}},"type":"object","title":"ParkAdminPMSStatus","description":"PMS connection status for park admin view.\nNo credentials exposed."},"ParkAdminPMSTestRequest":{"properties":{"pms_type":{"$ref":"#/components/schemas/app__schemas__property__property_pms_config__PMSType","description":"Type of PMS (newbook, rms)"},"config_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Config Id","description":"Existing PMS config ID to merge with (for edit mode)"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"instance_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Token"},"is_test_environment":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Test Environment"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Agent Id"}},"type":"object","required":["pms_type"],"title":"ParkAdminPMSTestRequest","description":"Request body for testing PMS connection.\nIf config_id is provided, missing fields merge with existing config."},"ParkAdminPipelineStatusData":{"properties":{"config_id":{"type":"integer","title":"Config Id"},"pms_type":{"$ref":"#/components/schemas/PMSType-Output"},"status":{"$ref":"#/components/schemas/app__schemas__property__property_pms_config__OnboardingStatus"},"current_step":{"type":"string","title":"Current Step","description":"User-friendly current step label (FR-007)"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Machine-readable error category for contextual UI display. Values: 'multiple_rate_plans', 'no_ari_data', 'insufficient_inventory', 'no_rate_plans'"},"error_details":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Error Details","description":"Individual error items parsed from the pipeline error message"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"sync_stats":{"anyOf":[{"$ref":"#/components/schemas/ParkAdminSyncStats"},{"type":"null"}]},"webhook_credentials_generated":{"type":"boolean","title":"Webhook Credentials Generated","description":"Whether webhook credentials have been generated (RMS only)","default":false},"last_ari_push_received":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Ari Push Received","description":"When the last ARI push was received from RMS (RMS only)"},"rate_plan_review_pending":{"type":"boolean","title":"Rate Plan Review Pending","description":"True when multi-rate was detected during onboarding and admin hasn't confirmed selections","default":false}},"type":"object","required":["config_id","pms_type","status","current_step"],"title":"ParkAdminPipelineStatusData","description":"Pipeline status data with user-friendly labels.\nUsed for polling during sync process."},"ParkAdminPipelineStatusResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"anyOf":[{"$ref":"#/components/schemas/ParkAdminPipelineStatusData"},{"type":"null"}]}},"type":"object","required":["msg"],"title":"ParkAdminPipelineStatusResponse","description":"Response wrapper for pipeline status."},"ParkAdminPropertyDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country"},"state":{"type":"string","title":"State"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"address":{"type":"string","title":"Address"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desc"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"remittance_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remittance Email"},"phone_free":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Free"},"phone_alt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Alt"},"visibility":{"type":"string","title":"Visibility","default":"visible"},"booking_enabled":{"type":"boolean","title":"Booking Enabled","default":false},"google_place_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Place Id"},"google_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Google Rating"},"google_user_rating_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Google User Rating Count"},"features":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Features","default":[]},"managements":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Managements","default":[]},"highlights":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Highlights","default":[]},"pet_allowed_species":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pet Allowed Species"},"cancellation_policy_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancellation Policy Note"},"room_type_label_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type Label Prefix"},"park_booking_notification_enabled":{"type":"boolean","title":"Park Booking Notification Enabled","default":false},"park_map":{"anyOf":[{"$ref":"#/components/schemas/ParkMapInfo"},{"type":"null"}]},"pms_status":{"anyOf":[{"$ref":"#/components/schemas/ParkAdminPMSStatus"},{"type":"null"}]},"onboarding_readiness":{"anyOf":[{"$ref":"#/components/schemas/OnboardingReadiness"},{"type":"null"}]},"room_types":{"items":{"$ref":"#/components/schemas/ParkAdminRoomTypeListItem"},"type":"array","title":"Room Types","default":[]},"total_bookings":{"type":"integer","title":"Total Bookings","default":0}},"type":"object","required":["id","name","slug","country","state","address"],"title":"ParkAdminPropertyDetail","description":"Full property detail for park admin view.\nExcludes sensitive PMS credentials and internal fields."},"ParkAdminPropertyGroup":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"is_active":{"type":"boolean","title":"Is Active"},"member_count":{"type":"integer","title":"Member Count"},"members":{"items":{"$ref":"#/components/schemas/ParkAdminPropertyGroupMember"},"type":"array","title":"Members","default":[]}},"type":"object","required":["id","name","is_active","member_count"],"title":"ParkAdminPropertyGroup","description":"A property group visible to the calling Team manager.\n\n\"Visible\" = the caller holds ``users.manage`` on at least one\nmember (super admins see every active group, matching the\ncapability-resolver bypass).\n\nOnly active groups (``is_active = TRUE``) are returned — the\npicker should never offer a group that ``expand_property_group_ids``\nwould silently skip. ``members[]`` is the full membership of the\ngroup, including properties the caller does **not** manage; the\nbackend re-asserts ``users.manage`` per resolved property at write\ntime so a partial-scope selection still surfaces a precise\n``scope_violation`` envelope."},"ParkAdminPropertyGroupMember":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name"}},"type":"object","required":["property_id"],"title":"ParkAdminPropertyGroupMember","description":"One property inside a ``ParkAdminPropertyGroup``.\n\nRestricted to the fields the Team-manager picker needs for its\nexpansion preview (id + name). The picker never needs the full\n``ParkAdminMeProperty`` shape because the rendered set is sourced\nfrom ``GET /park-admin/me/properties`` — group membership is just\nan attribution overlay."},"ParkAdminPropertyGroupsResponse":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/ParkAdminPropertyGroup"},"type":"array","title":"Groups","default":[]}},"type":"object","title":"ParkAdminPropertyGroupsResponse","description":"Response shape for ``GET /park-admin/property-groups``."},"ParkAdminPropertyImage":{"properties":{"id":{"type":"integer","title":"Id"},"filename":{"type":"string","title":"Filename"},"url":{"type":"string","title":"Url"},"sort_order":{"type":"integer","title":"Sort Order"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"created_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Date"}},"type":"object","required":["id","filename","url","sort_order"],"title":"ParkAdminPropertyImage","description":"Property image for park admin view."},"ParkAdminPropertyImagesResponse":{"properties":{"images":{"items":{"$ref":"#/components/schemas/ParkAdminPropertyImage"},"type":"array","title":"Images","default":[]},"total":{"type":"integer","title":"Total","default":0}},"type":"object","title":"ParkAdminPropertyImagesResponse","description":"Response for listing property images."},"ParkAdminPropertySummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country"},"state":{"type":"string","title":"State"},"address":{"type":"string","title":"Address"},"visibility":{"type":"string","title":"Visibility","default":"visible"},"booking_enabled":{"type":"boolean","title":"Booking Enabled","default":false},"payment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Path"},"cover_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities","description":"Capabilities the requesting user holds on this property. Empty list means no grant row was found (belt-and-braces with the role string). See docs/auth/PARK_ADMIN_CAPABILITIES.md."},"is_team_manager":{"type":"boolean","title":"Is Team Manager","description":"True iff ``users.manage`` is in ``capabilities``. The Team-manager surface (Phase 2) gates on this.","default":false}},"type":"object","required":["id","name","slug","country","state","address"],"title":"ParkAdminPropertySummary","description":"Property summary for park admin dashboard.\nSimplified view without sensitive PMS credentials.\n\nPhase 1 of capability-based access (see\n``docs/auth/PARK_ADMIN_CAPABILITIES.md``) adds ``capabilities`` and\n``is_team_manager`` so the frontend can gate UI on what the\nrequesting user can actually do on this property. ``capabilities``\nis sourced from ``park_admin_grants`` per ``(user, property)`` pair;\nsuper admins get the full vocabulary. ``is_team_manager`` is a\nconvenience boolean equal to ``\"users.manage\" in capabilities``."},"ParkAdminPropertyUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":3},{"type":"null"}],"title":"Name"},"desc":{"anyOf":[{"type":"string","maxLength":1200},{"type":"null"}],"title":"Desc"},"address":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Address","description":"Display address shown to guests on the public listing"},"features":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Features"},"managements":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Managements"},"highlights":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Highlights"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"remittance_email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Remittance Email","description":"Dedicated email for payout remittance advice (e.g. bookkeeper)"},"phone_free":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Free"},"phone_alt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Alt"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"booking_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Booking Enabled"},"google_place_id":{"anyOf":[{"type":"string","maxLength":255,"pattern":"^ChIJ[A-Za-z0-9_\\-]{20,}$"},{"type":"null"}],"title":"Google Place Id","description":"Google Maps Place ID for star ratings"},"region":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Region","description":"Tourism region ID within the state (e.g., 'tas-north-west')"},"lat":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat","description":"Latitude in decimal degrees (-90 to 90)"},"lon":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lon","description":"Longitude in decimal degrees (-180 to 180)"},"pet_allowed_species":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pet Allowed Species","description":"Pet species accepted at this property. Allowed values: dog, cat, bird, other. NULL or omitted means dog-only (the default)."},"cancellation_policy_note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Cancellation Policy Note","description":"Optional short cancellation policy note shown to guests at checkout, attributed to the park. Leave blank to show the generic deferral copy. Max 200 characters."},"rms_promo_codes_auto_publish_all":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rms Promo Codes Auto Publish All","description":"Deprecated no-op. IBE-flagged RMS discounts are auto-exposed as typeable promo codes for all RMS properties; per-discount `promo_code` overrides take precedence."},"room_type_label_prefix":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Room Type Label Prefix","description":"Internal PMS prefix to strip from guest-facing room/category labels (e.g. 'GHP' -> 'GHP Ensuite Powered Sites' shows as 'Ensuite Powered Sites'). Display-only: PMS names are not modified and manual room name overrides take precedence. Blank or omitted clears the rule."}},"type":"object","title":"ParkAdminPropertyUpdate","description":"Partial update request for property content fields.\nOnly operator-editable fields are included here."},"ParkAdminRecentBooking":{"properties":{"id":{"type":"integer","title":"Id"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"booking_code":{"type":"string","title":"Booking Code"},"guest_name":{"type":"string","title":"Guest Name"},"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"status":{"type":"string","title":"Status"},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Amount"}},"type":"object","required":["id","confirmation_number","booking_code","guest_name","check_in","check_out","status","total_amount"],"title":"ParkAdminRecentBooking","description":"Minimal booking info for dashboard recent bookings list."},"ParkAdminRefundRequest":{"properties":{"amount":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Amount","description":"Partial refund amount in dollars. If omitted, refunds the full park-retained revenue (accommodation subtotal + pet fee). The Total Parks guest service fee is never refunded."}},"type":"object","title":"ParkAdminRefundRequest","description":"Request to refund a booking's park-retained revenue (accommodation + pet fee)."},"ParkAdminRefundResponse":{"properties":{"booking_id":{"type":"integer","title":"Booking Id"},"refund_id":{"type":"string","title":"Refund Id"},"amount_refunded":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount Refunded","description":"Total refund amount (accommodation_refunded + pet_fee_refunded)."},"accommodation_refunded":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Accommodation Refunded","description":"Portion of the refund applied to the accommodation subtotal.","default":"0.00"},"pet_fee_refunded":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Pet Fee Refunded","description":"Portion of the refund applied to the park pet fee.","default":"0.00"},"service_fee_retained":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee Retained"},"new_status":{"type":"string","title":"New Status"},"new_payment_status":{"type":"string","title":"New Payment Status"}},"type":"object","required":["booking_id","refund_id","amount_refunded","service_fee_retained","new_status","new_payment_status"],"title":"ParkAdminRefundResponse","description":"Response after issuing a refund."},"ParkAdminRemoveResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"is_self_removal":{"type":"boolean","title":"Is Self Removal","default":false},"removed_property_ids":{"items":{"type":"integer"},"type":"array","title":"Removed Property Ids","default":[]},"skipped_inactive_group_ids":{"items":{"type":"integer"},"type":"array","title":"Skipped Inactive Group Ids","default":[]},"removed_grants":{"items":{"$ref":"#/components/schemas/ParkAdminRemovedGrant"},"type":"array","title":"Removed Grants","default":[]}},"type":"object","required":["user_id","email"],"title":"ParkAdminRemoveResponse","description":"Response shape for ``DELETE /park-admin/users/{user_id}``.\n\n``removed_property_ids`` is the subset of the resolved set\nactually deleted (a property with no existing grant is silently\nskipped, matching the idempotent contract). ``is_self_removal``\nis exposed so the UI can show the appropriate confirmation copy.\n\n``skipped_inactive_group_ids`` (Phase 3a) mirrors the invite/PATCH\nresponse surface: inactive groups passed via the new\n``property_group_ids`` query parameter are reported back so the\nUI can warn."},"ParkAdminRemovedGrant":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"capabilities_at_removal":{"items":{"type":"string"},"type":"array","title":"Capabilities At Removal","default":[]}},"type":"object","required":["property_id"],"title":"ParkAdminRemovedGrant","description":"Per-property snapshot included in the DELETE response."},"ParkAdminRoomTypeDefaultRatePlanRequest":{"properties":{"rate_plan_id":{"type":"integer","minimum":1,"title":"Rate Plan Id","description":"Rate plan ID to use as the default/public plan for this room type."}},"type":"object","required":["rate_plan_id"],"title":"ParkAdminRoomTypeDefaultRatePlanRequest","description":"Request body for changing a room type's guest-facing default rate plan."},"ParkAdminRoomTypeGuestVisibilityRequest":{"properties":{"guest_disabled":{"type":"boolean","title":"Guest Disabled","description":"When True, the room type is hidden from public listings, availability lookups, and the booking flow. PMS sync will not override this value."}},"type":"object","required":["guest_disabled"],"title":"ParkAdminRoomTypeGuestVisibilityRequest","description":"Toggle whether a room type is hidden from guests."},"ParkAdminRoomTypeImageReorderRequest":{"properties":{"image_ids":{"items":{"type":"integer"},"type":"array","title":"Image Ids"}},"type":"object","required":["image_ids"],"title":"ParkAdminRoomTypeImageReorderRequest"},"ParkAdminRoomTypeListItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"pms_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Name"},"slug":{"type":"string","title":"Slug"},"pms_room_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Room Type Code"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"max_occupancy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Occupancy"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity"},"is_site":{"type":"boolean","title":"Is Site","default":false},"is_active":{"type":"boolean","title":"Is Active","default":true},"guest_disabled":{"type":"boolean","title":"Guest Disabled","default":false},"dimension_coverage_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dimension Coverage Pct"},"default_rate_plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Rate Plan Id"},"default_rate_plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Rate Plan Name"},"rate_plan_options":{"items":{"$ref":"#/components/schemas/ParkAdminRoomTypeRatePlanOption"},"type":"array","title":"Rate Plan Options","default":[]},"restriction_summary":{"anyOf":[{"$ref":"#/components/schemas/RoomTypeRestrictionSummary"},{"type":"null"}]},"effective_sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Effective Sort Order"},"name_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Source"},"description_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description Source"},"images_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Images Source"},"override_image_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Override Image Count"},"pms_image_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pms Image Count"},"pets_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pets Allowed"},"pet_booking_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Booking Mode"},"pet_fee_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Amount"},"pet_fee_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Fee Basis"},"pet_fee_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Fee Currency"},"pet_max_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pet Max Count"},"pet_restrictions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Restrictions"},"pet_max_size":{"anyOf":[{"type":"string","enum":["small","medium"]},{"type":"null"}],"title":"Pet Max Size"},"pet_size_examples":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Size Examples"},"pet_requested_detail_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pet Requested Detail Fields"},"pet_fee_review_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Fee Review Status"},"pet_policy_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pet Policy Source"},"hidden_from_guests_reason":{"anyOf":[{"type":"string","enum":["missing_max_occupancy","admin_disabled"]},{"type":"null"}],"title":"Hidden From Guests Reason"}},"type":"object","required":["id","name","slug"],"title":"ParkAdminRoomTypeListItem","description":"Room type summary for property detail view."},"ParkAdminRoomTypeRatePlanOption":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"pms_rate_plan_code":{"type":"string","title":"Pms Rate Plan Code"},"is_default":{"type":"boolean","title":"Is Default","default":false},"is_public":{"type":"boolean","title":"Is Public","default":false}},"type":"object","required":["id","name","pms_rate_plan_code"],"title":"ParkAdminRoomTypeRatePlanOption","description":"Rate plan option available for a park-admin room type row."},"ParkAdminRoomTypeReorderRequest":{"properties":{"room_type_ids":{"items":{"type":"integer"},"type":"array","title":"Room Type Ids"}},"type":"object","required":["room_type_ids"],"title":"ParkAdminRoomTypeReorderRequest"},"ParkAdminRoomTypeResetRequest":{"properties":{"fields":{"items":{"type":"string","enum":["name","description","images","pet_policy"]},"type":"array","title":"Fields"}},"type":"object","required":["fields"],"title":"ParkAdminRoomTypeResetRequest"},"ParkAdminRoomTypeSummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"is_site":{"type":"boolean","title":"Is Site","default":false}},"type":"object","required":["id","name"],"title":"ParkAdminRoomTypeSummary","description":"Room type info for booking detail view."},"ParkAdminRoomTypeUpdateRequest":{"properties":{"guest_name_override":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Guest Name Override","description":"Guest-facing name override (null/blank to clear). Max 120 characters. Changing the name regenerates the public room URL slug; the old URL keeps redirecting."},"guest_description_override":{"anyOf":[{"type":"string","maxLength":800},{"type":"null"}],"title":"Guest Description Override","description":"Guest-facing description override (null to clear). Max 800 characters."},"pets_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pets Allowed"},"pet_booking_mode":{"anyOf":[{"type":"string","enum":["instant","blocked"]},{"type":"null"}],"title":"Pet Booking Mode"},"pet_max_count":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Pet Max Count"},"pet_fee_amount":{"anyOf":[{"type":"number","minimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pet Fee Amount"},"pet_fee_basis":{"anyOf":[{"type":"string","enum":["per_stay","per_night","per_pet_per_stay","per_pet_per_night"]},{"type":"null"}],"title":"Pet Fee Basis"},"pet_fee_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Pet Fee Currency"},"pet_fee_review_status":{"anyOf":[{"type":"string","enum":["unknown","inferred_unreviewed","admin_confirmed","pms_confirmed"]},{"type":"null"}],"title":"Pet Fee Review Status"},"pet_fee_note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Pet Fee Note"},"pet_restrictions":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Pet Restrictions"},"pet_max_size":{"anyOf":[{"type":"string","enum":["small","medium"]},{"type":"null"}],"title":"Pet Max Size"},"pet_size_examples":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Pet Size Examples"},"pet_requested_detail_fields":{"anyOf":[{"items":{"type":"string","enum":["pet_type","pet_size","pet_weight"]},"type":"array"},{"type":"null"}],"title":"Pet Requested Detail Fields"}},"type":"object","title":"ParkAdminRoomTypeUpdateRequest"},"ParkAdminStartSyncData":{"properties":{"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id","description":"Celery task chain ID"},"correlation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correlation Id","description":"Pipeline correlation ID for log tracing"},"config_id":{"type":"integer","title":"Config Id"},"status":{"$ref":"#/components/schemas/app__schemas__property__property_pms_config__OnboardingStatus","description":"Current onboarding pipeline status","default":"pending"},"already_running":{"type":"boolean","title":"Already Running","description":"True when an existing in-flight sync was reused","default":false},"retry_started":{"type":"boolean","title":"Retry Started","description":"True when this request dispatched a retry after failure","default":false},"force_newbook_push_test":{"type":"boolean","title":"Force Newbook Push Test","description":"True when a NewBook retry requested a date-scoped ARI re-push","default":false}},"type":"object","required":["config_id"],"title":"ParkAdminStartSyncData","description":"Start sync result data."},"ParkAdminStartSyncResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"$ref":"#/components/schemas/ParkAdminStartSyncData"}},"type":"object","required":["msg","data"],"title":"ParkAdminStartSyncResponse","description":"Response wrapper for start sync."},"ParkAdminStayDatesError":{"properties":{"msg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Msg"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"detail":{"anyOf":[{},{"type":"null"}],"title":"Detail"}},"type":"object","title":"ParkAdminStayDatesError","description":"Error shapes returned by stay-date preview/apply."},"ParkAdminStayDatesResponse":{"properties":{"booking_id":{"type":"integer","title":"Booking Id"},"pms_provider":{"type":"string","title":"Pms Provider"},"dates_updated":{"type":"boolean","title":"Dates Updated"},"status_updated":{"type":"boolean","title":"Status Updated"},"can_update":{"type":"boolean","title":"Can Update"},"total_parks_check_in":{"type":"string","format":"date","title":"Total Parks Check In"},"total_parks_check_out":{"type":"string","format":"date","title":"Total Parks Check Out"},"pms_check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Pms Check In"},"pms_check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Pms Check Out"},"total_parks_status":{"type":"string","title":"Total Parks Status"},"pms_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Status"},"message":{"type":"string","title":"Message"},"park_revenue":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Park Revenue"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["booking_id","pms_provider","dates_updated","status_updated","can_update","total_parks_check_in","total_parks_check_out","total_parks_status","message","park_revenue","currency"],"title":"ParkAdminStayDatesResponse","description":"Live PMS stay-date and reservation-status comparison for park-admin.\n\nPreview (GET) never writes. Apply (POST) copies ``check_in`` /\n``check_out`` and, when the PMS reports cancelled, marks the local\nreservation cancelled. Money and payment fields are never changed."},"ParkAdminSyncStats":{"properties":{"room_types":{"type":"integer","title":"Room Types","description":"Number of room types synced","default":0},"rate_plans":{"type":"integer","title":"Rate Plans","description":"Number of rate plans synced","default":0},"images":{"type":"integer","title":"Images","description":"Number of images synced","default":0}},"type":"object","title":"ParkAdminSyncStats","description":"Statistics about synced data for completion display."},"ParkAdminTestConnectionData":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"pms_type":{"$ref":"#/components/schemas/PMSType-Output"},"rms_parent_client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rms Parent Client Id","description":"Parent database ID (rmsClientId) for API auth"},"rms_properties":{"anyOf":[{"items":{"$ref":"#/components/schemas/RMSPropertyInfo"},"type":"array"},{"type":"null"}],"title":"Rms Properties","description":"List of properties from /properties endpoint. Use 'id' field for property selection."}},"type":"object","required":["success","message","pms_type"],"title":"ParkAdminTestConnectionData","description":"Test connection result data."},"ParkAdminTestConnectionResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"$ref":"#/components/schemas/ParkAdminTestConnectionData"}},"type":"object","required":["msg","data"],"title":"ParkAdminTestConnectionResponse","description":"Response wrapper for test connection."},"ParkAdminUpdateRequest":{"properties":{"capabilities":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Capabilities","description":"Capability strings to set on every resolved property. Validated against the ``Capability`` enum."},"property_ids":{"items":{"type":"integer"},"type":"array","title":"Property Ids","description":"Direct property IDs to update the grant on. Optional when ``property_group_ids`` is non-empty. The grant must already exist on each resolved property; missing grants return 404."},"property_group_ids":{"items":{"type":"integer"},"type":"array","title":"Property Group Ids","description":"Property-group IDs to expand into per-property updates server-side. Inactive groups are silently skipped (see ``skipped_inactive_group_ids`` on the response). Effective access stays per-property — see ADR-0008."},"preset_name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Preset Name","description":"UX-only label. Recorded in the audit log metadata for support queries; the backend does not expand it."}},"type":"object","required":["capabilities"],"title":"ParkAdminUpdateRequest","description":"Request body for ``PATCH /park-admin/users/{user_id}``.\n\nSame bulk-shape as the invite endpoint — ``capabilities`` applies\nto every resolved property. The PATCH is creation-free: properties\nwithout an existing grant raise ``404 grant_not_found`` so the UI\nroutes to \"Invite\" instead.\n\nPhase 3a (Team-manager slice) adds ``property_group_ids`` — same\nexpansion semantics as the invite endpoint (active groups expand\nto members, inactive groups are reported back in\n``skipped_inactive_group_ids``). At least one of ``property_ids``\nor ``property_group_ids`` must be non-empty.\n\nPer-property capability divergence (different sets per property\nin the same call) is a Phase 3 feature — for now, the same set is\napplied uniformly."},"ParkAdminUpdateResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"affected_property_ids":{"items":{"type":"integer"},"type":"array","title":"Affected Property Ids","default":[]},"skipped_inactive_group_ids":{"items":{"type":"integer"},"type":"array","title":"Skipped Inactive Group Ids","default":[]},"diffs":{"items":{"$ref":"#/components/schemas/ParkAdminCapabilityDiff"},"type":"array","title":"Diffs","default":[]},"access_changed_email_sent":{"type":"boolean","title":"Access Changed Email Sent","default":false}},"type":"object","required":["user_id","email"],"title":"ParkAdminUpdateResponse","description":"Response shape for ``PATCH /park-admin/users/{user_id}``.\n\n``affected_property_ids`` is the subset of the resolved property\nset where the grant actually changed. Empty list means the call\nwas an idempotent no-op (``200 OK``); a non-empty list keeps the\nresponse code at ``200`` but the email is sent.\n\n``skipped_inactive_group_ids`` (Phase 3a) mirrors the invite\nresponse surface."},"ParkAdminUserAuditResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"property_id":{"type":"integer","title":"Property Id"},"entries":{"items":{"$ref":"#/components/schemas/ParkAdminAuditEntry"},"type":"array","title":"Entries","default":[]}},"type":"object","required":["user_id","property_id"],"title":"ParkAdminUserAuditResponse","description":"Response shape for ``GET /park-admin/users/{user_id}/audit``.\n\nEntries are returned newest-first. The default ``limit`` is 20 to\nmatch the existing \"Recent access changes\" panel pattern used by\nthe MFA history on ``/admin/users/{id}``."},"ParkAdminUserMeResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"is_team_manager":{"type":"boolean","title":"Is Team Manager","default":false}},"type":"object","required":["property_id"],"title":"ParkAdminUserMeResponse","description":"Response shape for ``GET /park-admin/users/me``.\n\nPulled straight off ``ParkAdminContext.capabilities`` — no extra DB\nqueries. Used by the frontend to know what UI affordances to render\nimmediately after login on the property without waiting for\nbootstrap."},"ParkAdminUserSummary":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"firstname":{"type":"string","title":"Firstname"},"lastname":{"type":"string","title":"Lastname"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified","description":"False = invite sent but not yet accepted (the user has no password and hasn't enrolled MFA)."},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities","description":"Capabilities held by this user on the requested property."},"is_team_manager":{"type":"boolean","title":"Is Team Manager","description":"True iff ``users.manage`` is in ``capabilities``.","default":false},"mfa_enabled":{"type":"boolean","title":"Mfa Enabled","description":"True iff the user has at least one active MFA method.","default":false},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When this grant row was created (i.e. when the user got access)."}},"type":"object","required":["id","email","firstname","lastname","is_active","is_verified","created_at"],"title":"ParkAdminUserSummary","description":"Single park-admin entry on the team list for a property.\n\nThe ``capabilities`` field is the authoritative \"what this user can\ndo here\" set — drawn directly from ``park_admin_grants``. Empty\nlist means the row exists but no capabilities are held (e.g. a\ngrant created with an empty bundle by a future admin tool).\n\n``mfa_enabled`` and ``last_login_at`` mirror the super-admin user\nlist so the Team page can render the same compliance signals\nwithout a separate query."},"ParkAdminUsersListResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"users":{"items":{"$ref":"#/components/schemas/ParkAdminUserSummary"},"type":"array","title":"Users","default":[]}},"type":"object","required":["property_id"],"title":"ParkAdminUsersListResponse","description":"Response shape for ``GET /park-admin/users``."},"ParkAdminVisibilityToggleRequest":{"properties":{"visibility":{"type":"string","pattern":"^(visible|hidden)$","title":"Visibility","description":"Target visibility: 'visible' or 'hidden'"}},"type":"object","required":["visibility"],"title":"ParkAdminVisibilityToggleRequest","description":"Request to toggle property visibility.\nPark admins can control whether their property is publicly visible."},"ParkAdminVisibilityToggleResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"visibility":{"type":"string","title":"Visibility"},"previous_visibility":{"type":"string","title":"Previous Visibility"},"content_warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Warning"}},"type":"object","required":["property_id","visibility","previous_visibility"],"title":"ParkAdminVisibilityToggleResponse","description":"Response after toggling visibility."},"ParkMapInfo":{"properties":{"url":{"type":"string","title":"Url","description":"Full CloudFront URL to the park map file"},"type":{"type":"string","title":"Type","description":"File type: 'image' or 'pdf'"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename","description":"Original uploaded filename"}},"type":"object","required":["url","type"],"title":"ParkMapInfo","description":"Park map file info (image or PDF)."},"PasswordReauthRequest":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"PasswordReauthRequest","description":"POST body for /auth/mfa/disable and /auth/mfa/recovery-codes/regenerate.\n\nRe-authentication with the password (which they just supplied at\nlogin) is a deliberately lower bar than a fresh MFA step-up — that\nlands in Phase 3."},"PaymentCard":{"properties":{"card_number":{"type":"string","title":"Card Number"},"expire_date":{"type":"string","title":"Expire Date"},"card_holder_name":{"type":"string","title":"Card Holder Name"}},"type":"object","required":["card_number","expire_date","card_holder_name"],"title":"PaymentCard","description":"Credit card details for guarantee."},"PaymentIntentInfo":{"properties":{"id":{"type":"string","title":"Id"},"client_secret":{"type":"string","title":"Client Secret"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["id","client_secret","amount","currency"],"title":"PaymentIntentInfo","description":"Subset of Stripe PaymentIntent surfaced to the client."},"PayoutDateReconciliationRow":{"properties":{"booking_id":{"type":"integer","title":"Booking Id"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"booking_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Code"},"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"outcome":{"type":"string","title":"Outcome"},"impact":{"type":"string","title":"Impact"},"pms_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Type"},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"tp_check_in":{"type":"string","format":"date","title":"Tp Check In"},"tp_check_out":{"type":"string","format":"date","title":"Tp Check Out"},"pms_check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Pms Check In"},"pms_check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Pms Check Out"},"pms_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Status"},"dates_updated":{"type":"boolean","title":"Dates Updated","default":false},"diagnostic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Diagnostic"}},"type":"object","required":["booking_id","confirmation_number","property_id","property_name","outcome","impact","tp_check_in","tp_check_out"],"title":"PayoutDateReconciliationRow","description":"Transient stay-date reconciliation row surfaced to super admins."},"PayoutDetailResponse":{"properties":{"id":{"type":"integer","title":"Id"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"gross_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Gross Amount"},"stripe_fee_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Stripe Fee Total"},"management_fee_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Management Fee Total"},"reserve_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Reserve Amount"},"refund_deductions":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Refund Deductions"},"net_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Net Amount"},"status":{"type":"string","title":"Status"},"bank_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Reference"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pms_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Provider"},"line_items":{"items":{"$ref":"#/components/schemas/PayoutLineItemResponse"},"type":"array","title":"Line Items","default":[]}},"type":"object","required":["id","period_start","period_end","gross_amount","stripe_fee_total","management_fee_total","reserve_amount","refund_deductions","net_amount","status","created_at","updated_at"],"title":"PayoutDetailResponse","description":"Full payout with line items."},"PayoutLineItemResponse":{"properties":{"id":{"type":"integer","title":"Id"},"booking_id":{"type":"integer","title":"Booking Id"},"confirmation_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Number"},"booking_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Code"},"guest_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Name"},"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out"},"gross_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Gross Amount"},"stripe_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Stripe Fee"},"management_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Management Fee"},"net_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Net Amount"},"is_refund":{"type":"boolean","title":"Is Refund","default":false},"pms_reservation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Reservation Id"},"pms_confirmation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms Confirmation Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","booking_id","gross_amount","stripe_fee","management_fee","net_amount","created_at"],"title":"PayoutLineItemResponse","description":"Per-booking line item within a payout."},"PayoutListItem":{"properties":{"id":{"type":"integer","title":"Id"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"gross_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Gross Amount"},"stripe_fee_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Stripe Fee Total"},"management_fee_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Management Fee Total"},"reserve_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Reserve Amount"},"refund_deductions":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Refund Deductions"},"net_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Net Amount"},"status":{"type":"string","title":"Status"},"bank_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Reference"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"line_item_count":{"type":"integer","title":"Line Item Count","default":0}},"type":"object","required":["id","period_start","period_end","gross_amount","stripe_fee_total","management_fee_total","reserve_amount","refund_deductions","net_amount","status","created_at"],"title":"PayoutListItem","description":"Summary row for the payouts list."},"PayoutListResponse":{"properties":{"payouts":{"items":{"$ref":"#/components/schemas/PayoutListItem"},"type":"array","title":"Payouts","default":[]},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"limit":{"type":"integer","title":"Limit","default":20}},"type":"object","title":"PayoutListResponse","description":"Paginated payout list."},"PayoutSummaryResponse":{"properties":{"management_fee_per_booking":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Management Fee Per Booking","description":"Current per-booking payment management fee for platform-collected path","default":"0.00"},"pending_balance":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Pending Balance","description":"Total unpaid balance (pending payouts + orphaned refunds)","default":"0.00"},"total_paid_out":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Paid Out","description":"Lifetime total disbursed to park","default":"0.00"},"last_payout_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Last Payout Amount"},"last_payout_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Payout Date"},"last_payout_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Payout Status"},"next_payout_booking_count":{"type":"integer","title":"Next Payout Booking Count","description":"Confirmed platform bookings already past check-in and not yet in a payout","default":0},"upcoming_booking_count":{"type":"integer","title":"Upcoming Booking Count","description":"Confirmed platform bookings whose check-in is still in the future","default":0},"upcoming_revenue":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Upcoming Revenue","description":"Forecast park-retained revenue from upcoming (future check-in) bookings","default":"0.00"},"bank_details_on_file":{"type":"boolean","title":"Bank Details On File","default":false},"bsb_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bsb Masked"},"account_number_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Number Masked"},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name"},"bank_verified":{"type":"boolean","title":"Bank Verified","default":false}},"type":"object","title":"PayoutSummaryResponse","description":"Payout dashboard summary card data."},"PendingCountResponse":{"properties":{"count":{"type":"integer","title":"Count"}},"type":"object","required":["count"],"title":"PendingCountResponse","description":"Response for pending claim request count (for badge display)."},"PetBlockoutCustomRange":{"properties":{"start":{"type":"string","format":"date","title":"Start","description":"Inclusive start date of the range"},"end":{"type":"string","format":"date","title":"End","description":"Inclusive end date of the range"},"recurring_annually":{"type":"boolean","title":"Recurring Annually","description":"If true, only the month/day pair is meaningful — the range is re-applied every year relative to the requested target year.","default":true},"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label","description":"Optional short label, e.g. 'Peak season'"}},"type":"object","required":["start","end"],"title":"PetBlockoutCustomRange","description":"A manual custom blockout range configured by a park admin."},"PetBlockoutSchedule":{"properties":{"presets":{"items":{"type":"string"},"type":"array","title":"Presets","description":"List of preset keys sourced from the holiday dataset"},"custom_ranges":{"items":{"$ref":"#/components/schemas/PetBlockoutCustomRange"},"type":"array","title":"Custom Ranges"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note","description":"Optional human-friendly caption shown at checkout"},"last_reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Reviewed At","description":"Server-set timestamp stamped on every update"}},"type":"object","title":"PetBlockoutSchedule","description":"The persisted blockout schedule for a single property."},"PetBlockoutScheduleResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"year":{"type":"integer","title":"Year","description":"Year the resolved_ranges were computed for"},"schedule":{"$ref":"#/components/schemas/PetBlockoutSchedule"},"resolved_ranges":{"items":{"$ref":"#/components/schemas/ResolvedBlockoutRange"},"type":"array","title":"Resolved Ranges"}},"type":"object","required":["property_id","year","schedule"],"title":"PetBlockoutScheduleResponse","description":"Response envelope for the per-property schedule endpoints."},"PetBlockoutScheduleUpdate":{"properties":{"presets":{"items":{"type":"string"},"type":"array","title":"Presets"},"custom_ranges":{"items":{"$ref":"#/components/schemas/PetBlockoutCustomRange"},"type":"array","title":"Custom Ranges"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"type":"object","title":"PetBlockoutScheduleUpdate","description":"Request body for PUT /park-admin/properties/{id}/pet-blockouts."},"PetBlockoutStayResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"start":{"type":"string","format":"date","title":"Start","description":"Stay check-in date (inclusive)"},"end":{"type":"string","format":"date","title":"End","description":"Stay check-out date (exclusive — matches booking convention)"},"ranges":{"items":{"$ref":"#/components/schemas/ResolvedBlockoutRange"},"type":"array","title":"Ranges","description":"Blockout ranges that overlap the stay's night window"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note","description":"Optional admin caption (`properties.pet_blockout_note`). Returned when set on the property; the frontend renders it only when the stay is actually blocked, per the Phase E 'immediately relevant' guest-display principle."}},"type":"object","required":["property_id","start","end"],"title":"PetBlockoutStayResponse","description":"Public response for the guest-facing stay-window blockout endpoint.\n\nPowers the booking flow's proactive \"Book Now\" disable: the room-type\npage fetches this when a guest has dates + pets selected and uses the\nresulting ranges to gate the booking button before verify runs."},"PetBreedAttestation":{"properties":{"attested_at":{"type":"string","format":"date-time","title":"Attested At","description":"When the guest confirmed their pet is not a restricted breed."},"restricted_list_snapshot":{"items":{"type":"string"},"type":"array","title":"Restricted List Snapshot","description":"Restricted breed slugs shown to the guest at attestation time."}},"type":"object","required":["attested_at","restricted_list_snapshot"],"title":"PetBreedAttestation","description":"Guest attestation for property-level restricted breed lists."},"PetDeclaration":{"properties":{"traveling_with_pets":{"type":"boolean","title":"Traveling With Pets","description":"Whether the guest is travelling with pets.","default":false},"pet_count":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Pet Count","description":"Number of pets travelling."},"pet_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Pet Type","description":"Primary pet type (e.g. dog)."},"pet_size":{"anyOf":[{"type":"string","enum":["small","medium","large"]},{"type":"null"}],"title":"Pet Size","description":"Optional pet size declaration."},"pet_weight_kg":{"anyOf":[{"type":"number","maximum":200,"minimum":0.1},{"type":"null"}],"title":"Pet Weight Kg","description":"Optional pet weight in kilograms."},"pet_breed_attestation":{"anyOf":[{"$ref":"#/components/schemas/PetBreedAttestation"},{"type":"null"}],"description":"Guest attestation against the property's restricted breed list."}},"type":"object","title":"PetDeclaration","description":"Pet declaration captured during checkout."},"PetRestrictedBreedsConfig":{"properties":{"mode":{"$ref":"#/components/schemas/PetRestrictedBreedsMode"},"additional":{"items":{"type":"string"},"type":"array","title":"Additional"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"type":"object","required":["mode"],"title":"PetRestrictedBreedsConfig","description":"Persisted restricted-breed configuration for one property."},"PetRestrictedBreedsMode":{"type":"string","enum":["none","au_standard","au_standard_plus","custom"],"title":"PetRestrictedBreedsMode","description":"Supported property-level restricted breed modes."},"PetRestrictedBreedsResponse":{"properties":{"config":{"$ref":"#/components/schemas/PetRestrictedBreedsConfig"},"resolved_breeds":{"items":{"$ref":"#/components/schemas/AuDogBreed"},"type":"array","title":"Resolved Breeds"},"last_reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Reviewed At"}},"type":"object","required":["config"],"title":"PetRestrictedBreedsResponse","description":"Park-admin response for restricted-breed config."},"PetRestrictedBreedsStayResponse":{"properties":{"mode":{"$ref":"#/components/schemas/PetRestrictedBreedsMode"},"resolved_breeds":{"items":{"$ref":"#/components/schemas/AuDogBreed"},"type":"array","title":"Resolved Breeds"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"type":"object","required":["mode"],"title":"PetRestrictedBreedsStayResponse","description":"Public response used by guest-facing surfaces."},"PetRestrictedBreedsUpdate":{"properties":{"mode":{"$ref":"#/components/schemas/PetRestrictedBreedsMode"},"additional":{"items":{"type":"string"},"type":"array","title":"Additional"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"type":"object","required":["mode"],"title":"PetRestrictedBreedsUpdate","description":"PUT payload for the restricted-breed config endpoint."},"PhaseCompletionRequest":{"properties":{"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"}},"type":"object","title":"PhaseCompletionRequest","description":"Request to mark a phase as complete."},"PhaseDataRequest":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","title":"PhaseDataRequest","description":"Request to save phase-specific data."},"PhaseDefinition":{"properties":{"id":{"$ref":"#/components/schemas/PhaseId"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"is_required":{"type":"boolean","title":"Is Required"},"order":{"type":"integer","title":"Order"},"estimated_minutes":{"type":"integer","title":"Estimated Minutes"}},"type":"object","required":["id","title","description","is_required","order","estimated_minutes"],"title":"PhaseDefinition","description":"Definition of an onboarding phase."},"PhaseId":{"type":"string","enum":["pms_configuration","payment_setup","content_review"],"title":"PhaseId","description":"Onboarding phase identifier."},"PhaseProgress":{"properties":{"status":{"$ref":"#/components/schemas/PhaseStatus","default":"not_started"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"skipped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Skipped At"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","title":"PhaseProgress","description":"Progress status of a single phase."},"PhaseStatus":{"type":"string","enum":["not_started","in_progress","complete","skipped"],"title":"PhaseStatus","description":"Status of an individual phase."},"Phone":{"properties":{"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"}},"type":"object","title":"Phone","description":"Phone information."},"PlaceAutocompleteRequest":{"properties":{"input":{"type":"string","maxLength":100,"minLength":2,"title":"Input","description":"Partial text the operator has typed (min 2 chars)"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","description":"Property country used to constrain Google Places results","default":"AU"}},"type":"object","required":["input"],"title":"PlaceAutocompleteRequest","description":"Request body for the Google Places autocomplete proxy endpoints."},"PlaceGeoParam":{"properties":{"type":{"type":"string","const":"place","title":"Type","default":"place"},"query":{"type":"string","maxLength":200,"minLength":1,"title":"Query","description":"Place, region, POI, or park name to resolve server-side."},"radius_km":{"anyOf":[{"type":"number","maximum":500,"minimum":1},{"type":"null"}],"title":"Radius Km","description":"Optional radius around the resolved anchor in kilometres."}},"additionalProperties":false,"type":"object","required":["query"],"title":"PlaceGeoParam","description":"Server-resolved place, region, POI, or park-name query."},"PlanningAvailabilityBatchCheckRequest":{"properties":{"checks":{"items":{"$ref":"#/components/schemas/PlanningAvailabilityCheckRequest"},"type":"array","maxItems":50,"minItems":1,"title":"Checks","description":"Availability checks to evaluate, capped at 50."}},"additionalProperties":false,"type":"object","required":["checks"],"title":"PlanningAvailabilityBatchCheckRequest","description":"Batch of cache-only planning availability checks."},"PlanningAvailabilityCheckRequest":{"properties":{"property_id":{"type":"integer","minimum":1,"title":"Property Id","description":"Internal property identifier."},"room_type_id":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Room Type Id","description":"Optional internal room type identifier."},"check_in":{"type":"string","format":"date","title":"Check In","description":"Check-in date."},"check_out":{"type":"string","format":"date","title":"Check Out","description":"Check-out date; must be after check_in."},"adults":{"type":"integer","maximum":20,"minimum":1,"title":"Adults","default":2},"children":{"type":"integer","maximum":20,"minimum":0,"title":"Children","default":0},"infants":{"type":"integer","maximum":10,"minimum":0,"title":"Infants","default":0},"accommodation_kind":{"anyOf":[{"type":"string","enum":["site","accommodation"]},{"type":"null"}],"title":"Accommodation Kind","description":"Optional stay type filter."},"equipment_type":{"anyOf":[{"type":"string","enum":["caravan","campervan","motorhome","camp_trailer","roof_top_tent","tent","swag","car_ute","fifth_wheeler"]},{"type":"null"}],"title":"Equipment Type","description":"Canonical equipment type for RMS site compatibility."},"equipment_length_m":{"anyOf":[{"type":"number","maximum":30,"minimum":1},{"type":"null"}],"title":"Equipment Length M","description":"Rig length in metres for site fit checks."},"equipment_width_m":{"anyOf":[{"type":"number","maximum":10,"minimum":1},{"type":"null"}],"title":"Equipment Width M","description":"Optional rig width in metres for site fit checks."},"power_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Power Required","description":"Whether the traveller requires a powered site."}},"additionalProperties":false,"type":"object","required":["property_id","check_in","check_out"],"title":"PlanningAvailabilityCheckRequest","description":"Cache-only stay-window availability check for one property or room type."},"PlanningAvailabilityStatus":{"type":"string","enum":["available","limited","unavailable","unknown"],"title":"PlanningAvailabilityStatus","description":"Live Total Parks inventory status from PMS-synced ARI."},"PlanningFreshnessEnvelope":{"properties":{"status":{"$ref":"#/components/schemas/PlanningAvailabilityStatus","description":"Live inventory availability status from Total Parks ARI."},"status_label":{"type":"string","title":"Status Label","description":"Traveller-facing availability phrase derived from status. Render this in answers instead of the raw status enum.","default":""},"last_updated":{"type":"string","format":"date-time","title":"Last Updated","description":"Most recent source timestamp contributing to this status."},"provenance":{"type":"string","const":"tp_cached_ari","title":"Provenance","description":"Total Parks live inventory source (PMS-synced ARI). Search reads this replica rather than issuing per-candidate PMS round-trips.","default":"tp_cached_ari"},"checkout_note":{"type":"string","title":"Checkout Note","description":"Traveller/agent-facing note: availability comes from live Total Parks inventory and is confirmed at checkout before payment.","default":"Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment."},"planning_tier_caveat":{"type":"string","title":"Planning Tier Caveat","description":"Deprecated alias of checkout_note. Emitted for ChatGPT plugin / MCP compatibility until the next directory release; prefer checkout_note. See docs/features/CHATGPT_PLUGIN.md.","default":"Availability and rates from Total Parks live inventory, kept current by park PMS sync. Confirmed at checkout before payment."}},"additionalProperties":false,"type":"object","required":["status","last_updated"],"title":"PlanningFreshnessEnvelope","description":"Freshness/provenance wrapper for planning-tier availability facts."},"PointGeoParam":{"properties":{"type":{"type":"string","const":"point","title":"Type","default":"point"},"lat":{"type":"number","maximum":90,"minimum":-90,"title":"Lat","description":"Latitude in WGS84."},"lon":{"type":"number","maximum":180,"minimum":-180,"title":"Lon","description":"Longitude in WGS84."},"radius_km":{"anyOf":[{"type":"number","maximum":500,"minimum":1},{"type":"null"}],"title":"Radius Km","description":"Optional radius around the point in kilometres."}},"additionalProperties":false,"type":"object","required":["lat","lon"],"title":"PointGeoParam","description":"Pre-resolved point geometry from a trusted client."},"PolygonGeoParam":{"properties":{"type":{"type":"string","const":"polygon","title":"Type","default":"polygon"},"coordinates":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","minItems":4,"title":"Coordinates","description":"Closed polygon ring as `[lon, lat]` coordinate pairs. Corridor geometry is deliberately reserved for Phase C."}},"additionalProperties":false,"type":"object","required":["coordinates"],"title":"PolygonGeoParam","description":"Pre-resolved polygon ring in WGS84 `[lon, lat]` coordinates."},"PrepareCartRequest":{"properties":{"pet":{"anyOf":[{"$ref":"#/components/schemas/PetDeclaration"},{"type":"null"}],"description":"Optional pet declaration update before payment starts."}},"type":"object","title":"PrepareCartRequest","description":"``POST /carts/{id}/prepare`` body.\n\nBilling guest should already be set via ``PATCH /carts/{id}``.\nThis payload carries only the optional idempotency key and\npet declaration override."},"Property":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"type":"integer","title":"Type"},"slug":{"type":"string","title":"Slug"},"address":{"type":"string","title":"Address"},"state":{"type":"string","title":"State"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","default":"AU"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desc"},"pms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms"},"pms_config":{"anyOf":[{"$ref":"#/components/schemas/PropertyPMSConfig"},{"type":"null"}]},"website":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Website"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone_free":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Free"},"phone_alt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Alt"},"features":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Features","default":[]},"managements":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Managements","default":[]},"highlights":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Highlights","default":[]},"images":{"anyOf":[{"items":{"$ref":"#/components/schemas/PropertyImage"},"type":"array"},{"type":"null"}],"title":"Images","default":[]},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"visibility":{"type":"string","title":"Visibility","default":"visible"},"booking_enabled":{"type":"boolean","title":"Booking Enabled","default":false},"register_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Register Date"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","type","slug","address","state","lat","lon","desc","pms","pms_config","website","email","phone_free","phone_alt","status","register_date"],"title":"Property","description":"Property is a Pydantic model that represents the schema for a property."},"PropertyCapabilitiesResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id","description":"Property the capability records belong to."},"include":{"$ref":"#/components/schemas/CapabilityInclude","description":"Echoed selection of which projection layer(s) were returned: 'raw', 'summary', or 'both'."},"signals":{"anyOf":[{"items":{"$ref":"#/components/schemas/CapabilitySignal"},"type":"array"},{"type":"null"}],"title":"Signals","description":"Raw scoped signals (active + conflicting). Null when include=summary."},"summaries":{"anyOf":[{"items":{"$ref":"#/components/schemas/CapabilitySummary"},"type":"array"},{"type":"null"}],"title":"Summaries","description":"Derived, safe-to-publish summary claims. Null when include=raw."}},"type":"object","required":["property_id","include"],"title":"PropertyCapabilitiesResponse","description":"Capability read-model response for a single property.\n\nExposes generic scoped records from both projection layers. The\n``include`` request parameter controls which layers are populated:\n``signals`` is null when ``include=summary`` and ``summaries`` is null\nwhen ``include=raw``."},"PropertyContentEnrichEnqueueResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","enum":["idle","pending","running","succeeded","failed","needs_review"],"title":"Status","default":"pending"}},"type":"object","required":["task_id"],"title":"PropertyContentEnrichEnqueueResponse","description":"POST /park-admin/property-content/enrich"},"PropertyContentEnrichState":{"properties":{"status":{"type":"string","enum":["idle","pending","running","succeeded","failed","needs_review"],"title":"Status","default":"idle"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"quality_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality Status"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"PropertyContentEnrichState","description":"Last / in-flight property-content enrichment job for this property."},"PropertyContentEnrichStatusResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"enrich":{"$ref":"#/components/schemas/PropertyContentEnrichState"},"desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desc"}},"type":"object","required":["property_id","enrich"],"title":"PropertyContentEnrichStatusResponse","description":"GET /park-admin/property-content/enrich/status"},"PropertyCreate":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"integer","title":"Type"},"slug":{"type":"string","title":"Slug"},"address":{"type":"string","title":"Address"},"state":{"type":"string","title":"State"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","default":"AU"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desc"},"pms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pms"},"pms_config":{"anyOf":[{"$ref":"#/components/schemas/PropertyPMSConfig"},{"type":"null"}]},"website":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Website"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone_free":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Free"},"phone_alt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Alt"},"features":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Features","default":[]},"managements":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Managements","default":[]},"highlights":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Highlights","default":[]},"images":{"anyOf":[{"items":{"$ref":"#/components/schemas/PropertyImage"},"type":"array"},{"type":"null"}],"title":"Images","default":[]},"google_place_id":{"anyOf":[{"type":"string","maxLength":255,"pattern":"^ChIJ[A-Za-z0-9_\\-]{20,}$"},{"type":"null"}],"title":"Google Place Id","description":"Google Maps Place ID for star ratings"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"visibility":{"type":"string","title":"Visibility","default":"hidden"},"booking_enabled":{"type":"boolean","title":"Booking Enabled","default":false},"manual_request_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Manual Request Enabled","description":"Whether guests can submit Request to Book. Omission preserves the existing AU default and keeps new NZ catalogue entries directory-only."}},"type":"object","required":["name","type","slug","address","state","lat","lon"],"title":"PropertyCreate","description":"PropertyCreate is a Pydantic model that represents the schema for creating a new property."},"PropertyDisputeDetail":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"payment_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Path"},"suspended":{"type":"boolean","title":"Suspended"},"suspended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suspended At"},"rate":{"$ref":"#/components/schemas/PropertyDisputeDetailRate"},"disputes":{"items":{"$ref":"#/components/schemas/DisputeListItem"},"type":"array","title":"Disputes","default":[]}},"type":"object","required":["property_id","property_name","suspended","rate"],"title":"PropertyDisputeDetail","description":"Full dispute detail for a single property."},"PropertyDisputeDetailRate":{"properties":{"dispute_count":{"type":"integer","title":"Dispute Count"},"charge_count":{"type":"integer","title":"Charge Count"},"rate_percent":{"type":"number","title":"Rate Percent"}},"type":"object","required":["dispute_count","charge_count","rate_percent"],"title":"PropertyDisputeDetailRate","description":"Rate info for a single property."},"PropertyDisputeRate":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"charge_count":{"type":"integer","title":"Charge Count"},"dispute_count":{"type":"integer","title":"Dispute Count"},"rate_percent":{"type":"number","title":"Rate Percent"},"suspended":{"type":"boolean","title":"Suspended"},"suspended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suspended At"}},"type":"object","required":["property_id","property_name","charge_count","dispute_count","rate_percent","suspended"],"title":"PropertyDisputeRate","description":"Per-park dispute rate row for the monitoring overview."},"PropertyEngagedPayload":{"properties":{"engagement_kind":{"$ref":"#/components/schemas/EngagementKind"},"route_template":{"anyOf":[{"type":"string","enum":["/","/holiday-parks","/map","/search","/parks/{state}/{slug}","/embed/{state}/{slug}","/destinations/{slug}","/guides/{slug}","/itineraries/{slug}","/vibes/{slug}"]},{"type":"null"}],"title":"Route Template"}},"additionalProperties":false,"type":"object","required":["engagement_kind"],"title":"PropertyEngagedPayload"},"PropertyEnrolmentRow":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"name":{"type":"string","title":"Name"},"total_admins":{"type":"integer","title":"Total Admins"},"enrolled":{"type":"integer","title":"Enrolled"}},"type":"object","required":["property_id","name","total_admins","enrolled"],"title":"PropertyEnrolmentRow","description":"Per-property breakdown of park-admin enrolment for the\nsuper-admin \"MFA Enrolment\" card.\n\nProperties with zero park admins are deliberately included with\n``total_admins=0, enrolled=0`` so the dashboard can flag parks\nwe forgot to invite anyone to."},"PropertyEquipmentFitResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id","description":"Property the verdicts belong to."},"equipment_length":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Equipment Length","description":"Echoed equipment length (metres) used for dimension fit."},"equipment_width":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Equipment Width","description":"Echoed equipment width (metres) used for dimension fit."},"equipment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Equipment Type","description":"Echoed canonical equipment type used for RMS type compatibility."},"room_types":{"items":{"$ref":"#/components/schemas/RoomTypeEquipmentFit"},"type":"array","title":"Room Types","description":"Per-site-room-type fit verdicts. Only guest-visible site room types are included; accommodation room types are omitted."}},"type":"object","required":["property_id","room_types"],"title":"PropertyEquipmentFitResponse","description":"Date-free equipment-fit result across a property's site room types."},"PropertyExposedPayload":{"properties":{"exposure_kind":{"$ref":"#/components/schemas/ExposureKind"},"result_position":{"anyOf":[{"type":"integer","maximum":1000,"minimum":1},{"type":"null"}],"title":"Result Position"},"result_count":{"anyOf":[{"type":"integer","maximum":10000,"minimum":0},{"type":"null"}],"title":"Result Count"},"route_template":{"anyOf":[{"type":"string","enum":["/","/holiday-parks","/map","/search","/parks/{state}/{slug}","/embed/{state}/{slug}","/destinations/{slug}","/guides/{slug}","/itineraries/{slug}","/vibes/{slug}"]},{"type":"null"}],"title":"Route Template"}},"additionalProperties":false,"type":"object","required":["exposure_kind"],"title":"PropertyExposedPayload"},"PropertyFeature":{"properties":{"name":{"type":"string","title":"Name"},"icon":{"type":"string","title":"Icon"},"category":{"type":"string","title":"Category"}},"type":"object","required":["name","icon","category"],"title":"PropertyFeature"},"PropertyFeatureCreate":{"properties":{"name":{"type":"string","title":"Name"},"icon":{"type":"string","title":"Icon"},"category":{"type":"string","title":"Category"}},"type":"object","required":["name","icon","category"],"title":"PropertyFeatureCreate"},"PropertyFeatureList":{"properties":{"root":{"items":{"$ref":"#/components/schemas/PropertyFeature"},"type":"array","title":"Root"}},"type":"object","required":["root"],"title":"PropertyFeatureList"},"PropertyGroupCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"management_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Management Id"}},"type":"object","required":["name"],"title":"PropertyGroupCreate"},"PropertyGroupTeamAccessGrant":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"is_team_manager":{"type":"boolean","title":"Is Team Manager"}},"type":"object","required":["property_id","capabilities","is_team_manager"],"title":"PropertyGroupTeamAccessGrant","description":"A single ``park_admin_grants`` row on a group member property.\n\nUsed inside ``PropertyGroupTeamAccessUser`` to enumerate the\nper-property capability spread a user holds across the group's\nmembers. ``capabilities`` is visible-only — implicit caps (the\ndeprecated Stripe Connect strings) are stripped."},"PropertyGroupTeamAccessResponse":{"properties":{"group_id":{"type":"integer","title":"Group Id"},"group_name":{"type":"string","title":"Group Name"},"group_is_active":{"type":"boolean","title":"Group Is Active"},"member_count":{"type":"integer","title":"Member Count"},"users":{"items":{"$ref":"#/components/schemas/PropertyGroupTeamAccessUser"},"type":"array","title":"Users"}},"type":"object","required":["group_id","group_name","group_is_active","member_count","users"],"title":"PropertyGroupTeamAccessResponse","description":"``GET /admin/property-groups/{group_id}/team-access`` payload.\n\nRead-only correlation view backing the Phase 3b Team Access card on\nthe property-group detail page. Joins ``park_admin_grants`` to the\ncurrent member set so support can answer \"who has access to a\nmember of this group?\" without a per-property loop."},"PropertyGroupTeamAccessUser":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"firstname":{"type":"string","title":"Firstname"},"lastname":{"type":"string","title":"Lastname"},"is_active":{"type":"boolean","title":"Is Active"},"capabilities_union":{"items":{"type":"string"},"type":"array","title":"Capabilities Union"},"is_team_manager_on_all":{"type":"boolean","title":"Is Team Manager On All"},"is_team_manager_on_some":{"type":"boolean","title":"Is Team Manager On Some"},"grants":{"items":{"$ref":"#/components/schemas/PropertyGroupTeamAccessGrant"},"type":"array","title":"Grants"}},"type":"object","required":["user_id","firstname","lastname","is_active","capabilities_union","is_team_manager_on_all","is_team_manager_on_some","grants"],"title":"PropertyGroupTeamAccessUser","description":"A user with at least one grant on a property in this group.\n\n``capabilities_union`` is the visible-only union of the user's\ncapabilities across every member property where they hold a grant —\na quick \"what can this user do anywhere in this portfolio?\"\nsummary.\n\n``is_team_manager_on_all`` is true when the user holds\n``users.manage`` on every member of the group; ``_on_some`` is true\nwhen they hold it on at least one. Both are false when they hold\nno ``users.manage`` anywhere in the group."},"PropertyGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"management_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Management Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"PropertyGroupUpdate"},"PropertyHighlightCatalogResponse":{"properties":{"highlights":{"items":{"$ref":"#/components/schemas/PropertyHighlightOption"},"type":"array","title":"Highlights"}},"type":"object","required":["highlights"],"title":"PropertyHighlightCatalogResponse","description":"Response payload for the highlight catalog endpoint."},"PropertyHighlightOption":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"icon":{"type":"string","title":"Icon"}},"type":"object","required":["id","title","description","icon"],"title":"PropertyHighlightOption","description":"One predefined highlight option."},"PropertyImage":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"}},"type":"object","required":["description","url"],"title":"PropertyImage"},"PropertyImageMetadata":{"properties":{"rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating","default":0}},"type":"object","title":"PropertyImageMetadata"},"PropertyList":{"properties":{"root":{"items":{"$ref":"#/components/schemas/Property"},"type":"array","title":"Root"}},"type":"object","required":["root"],"title":"PropertyList","description":"PropertyList is a Pydantic model that represents the schema for a list of properties."},"PropertyManagement":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"logo":{"type":"string","title":"Logo"},"fav":{"type":"string","title":"Fav"},"logo_background":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background"}},"type":"object","required":["id","name","logo","fav"],"title":"PropertyManagement"},"PropertyManagementCreate":{"properties":{"name":{"type":"string","title":"Name"},"logo":{"type":"string","title":"Logo"},"fav":{"type":"string","title":"Fav"},"logo_background":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background"}},"type":"object","required":["name","logo","fav"],"title":"PropertyManagementCreate"},"PropertyManagementList":{"properties":{"root":{"items":{"$ref":"#/components/schemas/PropertyManagement"},"type":"array","title":"Root"}},"type":"object","required":["root"],"title":"PropertyManagementList"},"PropertyOutcomeSummary":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"total":{"type":"integer","title":"Total"},"won":{"type":"integer","title":"Won"},"lost":{"type":"integer","title":"Lost"},"pending":{"type":"integer","title":"Pending"},"win_rate_percent":{"type":"number","title":"Win Rate Percent"},"evidence_submitted_count":{"type":"integer","title":"Evidence Submitted Count"}},"type":"object","required":["property_id","property_name","total","won","lost","pending","win_rate_percent","evidence_submitted_count"],"title":"PropertyOutcomeSummary","description":"Win/loss stats for a single property."},"PropertyPMSConfig":{"properties":{"type":{"type":"string","title":"Type"},"endpoint":{"type":"string","title":"Endpoint"},"newbook":{"anyOf":[{"$ref":"#/components/schemas/NewbookConfig"},{"type":"null"}]},"rms":{"anyOf":[{"$ref":"#/components/schemas/RMSConfig"},{"type":"null"}]}},"type":"object","required":["type","endpoint"],"title":"PropertyPMSConfig"},"PropertyPendingSummary":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"property_name":{"type":"string","title":"Property Name"},"pending_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Pending Amount"},"payout_count":{"type":"integer","title":"Payout Count"}},"type":"object","required":["property_id","property_name","pending_amount","payout_count"],"title":"PropertyPendingSummary","description":"Per-property pending balance summary."},"PublicBookingChannelState":{"type":"string","enum":["live_booking","request_only","directory_only"],"title":"PublicBookingChannelState","description":"What transaction or handoff Total Parks supports for a public property."},"PublicEmbedIntegratorConfigResponse":{"properties":{"allowed_parent_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Parent Origins"}},"type":"object","title":"PublicEmbedIntegratorConfigResponse"},"PublicEmbedIntegratorResponse":{"properties":{"code":{"type":"string","title":"Code"},"display_name":{"type":"string","title":"Display Name"}},"type":"object","required":["code","display_name"],"title":"PublicEmbedIntegratorResponse"},"QualityViolationCode":{"type":"string","enum":["later_stage_without_earlier_stage","consent_eligible_cart_without_journey","missing_property_link","missing_property_country_code","missing_revenue_currency","unknown_actor_dimension"],"title":"QualityViolationCode"},"RMSAPICredentialResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"$ref":"#/components/schemas/RMSAPICredentials"}},"type":"object","required":["msg","data"],"title":"RMSAPICredentialResponse","description":"Response wrapper for RMS API credential endpoint."},"RMSAPICredentials":{"properties":{"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id","description":"RMS Client ID used for WebServices/API authentication"},"webservices_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webservices Password","description":"RMS Webservices Password, only returned when explicitly requested"},"using_parent_client_id":{"type":"boolean","title":"Using Parent Client Id","description":"True when client_id comes from rms_parent_client_id","default":false}},"type":"object","title":"RMSAPICredentials","description":"RMS API credentials provided by the park for outbound RMS WebServices calls.\n\nThese are separate from Total Parks-generated webhook credentials used for\nincoming RMS Channel Management pushes."},"RMSARIPush":{"properties":{"areaId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Areaid"},"clientId":{"type":"integer","title":"Clientid"},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp"},"categories":{"items":{"$ref":"#/components/schemas/RMSCategory"},"type":"array","title":"Categories","default":[]},"categoryRates":{"items":{"$ref":"#/components/schemas/RMSCategoryRate"},"type":"array","title":"Categoryrates","default":[]},"additionals":{"items":{"$ref":"#/components/schemas/RMSTopLevelAdditional"},"type":"array","title":"Additionals"},"availability_updates":{"items":{},"type":"array","title":"Availability Updates","default":[]},"rate_updates":{"items":{},"type":"array","title":"Rate Updates","default":[]}},"type":"object","required":["clientId"],"title":"RMSARIPush","description":"Top-level ARI push payload from RMS Cloud.\n\nContains all availability, rate, and inventory data for a property.\nReceived via webhook at /rms/webhook/ari.\n\nRMS supports two formats:\n1. Legacy: `categories` with nested `rates` arrays, inline additionals\n2. New: `categoryRates` flat list, top-level `additionals` array with additionalId references\n\nThe schema supports both formats for backward compatibility."},"RMSAdditionalBase":{"properties":{"includeInBase":{"type":"boolean","title":"Includeinbase"},"personBase":{"type":"integer","title":"Personbase"}},"type":"object","required":["includeInBase","personBase"],"title":"RMSAdditionalBase","description":"Base occupancy configuration for a guest type.\n\nSpecifies how many guests of this type are included in the base rate."},"RMSAdditionalGuestPricing":{"properties":{"additionalCount":{"type":"integer","title":"Additionalcount"},"amount":{"type":"number","title":"Amount"}},"type":"object","required":["additionalCount","amount"],"title":"RMSAdditionalGuestPricing","description":"Pricing tier for additional guests (adults/children/infants).\n\nEach entry represents the amount charged for a specific number of additional guests."},"RMSBookingSourceOption":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},"type":"object","required":["id","name"],"title":"RMSBookingSourceOption","description":"A booking source option shown to RMS park admins."},"RMSBookingSourcesResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"items":{"$ref":"#/components/schemas/RMSBookingSourceOption"},"type":"array","title":"Data"}},"type":"object","required":["msg","data"],"title":"RMSBookingSourcesResponse","description":"Response wrapper for RMS booking source options."},"RMSCategory":{"properties":{"categoryId":{"type":"integer","title":"Categoryid"},"rates":{"items":{"$ref":"#/components/schemas/RMSRate"},"type":"array","title":"Rates","default":[]}},"type":"object","required":["categoryId"],"title":"RMSCategory","description":"Category (room type) from RMS ARI push (legacy nested format).\n\nEach category contains multiple rates with their breakdown."},"RMSCategoryRate":{"properties":{"categoryId":{"type":"integer","title":"Categoryid"},"rateId":{"type":"integer","title":"Rateid"},"dayBreakdown":{"items":{"$ref":"#/components/schemas/RMSDayBreakdown"},"type":"array","title":"Daybreakdown"}},"type":"object","required":["categoryId","rateId","dayBreakdown"],"title":"RMSCategoryRate","description":"Flat category-rate from RMS ARI push (new format).\n\nIn the new RMS format, categoryRates is a flat list where each entry\nrepresents a single category+rate combination with its day breakdown.\nThe personBase is in the dayBreakdown, and additionalId references\na separate top-level additionals array."},"RMSConfig":{"properties":{"client_id":{"type":"string","title":"Client Id"},"client_password":{"type":"string","title":"Client Password"}},"type":"object","required":["client_id","client_password"],"title":"RMSConfig"},"RMSDayBreakdown":{"properties":{"dateFrom":{"type":"string","title":"Datefrom"},"dateTo":{"type":"string","title":"Dateto"},"dailyRate":{"type":"number","title":"Dailyrate"},"availableAreas":{"type":"integer","title":"Availableareas"},"closedOnArrival":{"type":"boolean","title":"Closedonarrival","default":false},"closedOnDeparture":{"type":"boolean","title":"Closedondeparture","default":false},"minStay":{"type":"integer","title":"Minstay","default":0},"minStayOnArrival":{"type":"integer","title":"Minstayonarrival","default":0},"maxStay":{"type":"integer","title":"Maxstay","default":0},"stopSell":{"type":"boolean","title":"Stopsell","default":false},"personBase":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Personbase"},"additionalId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Additionalid"}},"type":"object","required":["dateFrom","dateTo","dailyRate","availableAreas"],"title":"RMSDayBreakdown","description":"Daily rate, availability, and restriction data from RMS ARI push.\n\nEach entry represents data for a date range (dateFrom to dateTo)."},"RMSInlineAdditionals":{"properties":{"adults":{"items":{"$ref":"#/components/schemas/RMSAdditionalGuestPricing"},"type":"array","title":"Adults","default":[]},"children":{"items":{"$ref":"#/components/schemas/RMSAdditionalGuestPricing"},"type":"array","title":"Children","default":[]},"infants":{"items":{"$ref":"#/components/schemas/RMSAdditionalGuestPricing"},"type":"array","title":"Infants","default":[]},"adultsBase":{"anyOf":[{"$ref":"#/components/schemas/RMSAdditionalBase"},{"type":"null"}]},"childrenBase":{"anyOf":[{"$ref":"#/components/schemas/RMSAdditionalBase"},{"type":"null"}]},"infantsBase":{"anyOf":[{"$ref":"#/components/schemas/RMSAdditionalBase"},{"type":"null"}]}},"type":"object","title":"RMSInlineAdditionals","description":"Inline additional guest pricing within a rate.\n\nContains tiered pricing for adults, children, and infants beyond the base occupancy.\nEmbedded directly in each rate, not as a separate top-level array."},"RMSPropertyInfo":{"properties":{"id":{"type":"integer","title":"Id","description":"Property ID - USE THIS for API calls"},"name":{"type":"string","title":"Name","description":"Property display name"},"client_id":{"type":"integer","title":"Client Id","description":"Database client ID (auth only)"},"address_line1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line1","description":"Address line 1"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","description":"State/Province"},"inactive":{"type":"boolean","title":"Inactive","description":"Whether property is inactive","default":false}},"type":"object","required":["id","name","client_id"],"title":"RMSPropertyInfo","description":"Property info from RMS /properties endpoint.\n\nIMPORTANT: Use 'id' (not 'client_id') for API data access:\n- id: The actual property ID for /properties/{id}, /categories?propertyId=\n- client_id: Database ID for authentication only"},"RMSRate":{"properties":{"rateId":{"type":"integer","title":"Rateid"},"personBase":{"type":"integer","title":"Personbase"},"dayBreakdown":{"items":{"$ref":"#/components/schemas/RMSDayBreakdown"},"type":"array","title":"Daybreakdown"},"additionals":{"anyOf":[{"$ref":"#/components/schemas/RMSInlineAdditionals"},{"type":"null"}]}},"type":"object","required":["rateId","personBase","dayBreakdown"],"title":"RMSRate","description":"Rate within a category from RMS ARI push (legacy nested format).\n\nContains rate-level data including day breakdown and additional guest pricing."},"RMSReceiptTypeOption":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"}},"type":"object","required":["key","label"],"title":"RMSReceiptTypeOption","description":"A DirectCredit receipt-type slot shown to RMS park admins.\n\n``key`` is the value persisted to\n``property_pms_configs.rms_receipt_type`` and sent to RMS on\n``POST /transactions/receipt`` (e.g. ``\"directCredit\"``, ``\"directCredit2\"``).\n``label`` is the human-readable name the park has assigned to that slot\nin their RMS Receipt Type Labels setup."},"RMSReceiptTypesResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"items":{"$ref":"#/components/schemas/RMSReceiptTypeOption"},"type":"array","title":"Data"}},"type":"object","required":["msg","data"],"title":"RMSReceiptTypesResponse","description":"Response wrapper for RMS DirectCredit receipt-type slots."},"RMSReservationWebhookData":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"accountId":{"type":"integer","title":"Accountid","default":0},"areaId":{"type":"integer","title":"Areaid","default":0},"categoryId":{"type":"integer","title":"Categoryid","default":0},"guestId":{"type":"integer","title":"Guestid","default":0},"arrivalDate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arrivaldate"},"departureDate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departuredate"},"cancelledDate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancelleddate"},"rateTypeId":{"type":"integer","title":"Ratetypeid","default":0},"rateTypeName":{"type":"string","title":"Ratetypename","default":""}},"type":"object","required":["id","status"],"title":"RMSReservationWebhookData","description":"The ``data`` block inside a reservation webhook callback (lite model)."},"RMSReservationWebhookPayload":{"properties":{"clientId":{"type":"integer","title":"Clientid"},"subscription":{"$ref":"#/components/schemas/RMSReservationWebhookSubscription"},"data":{"$ref":"#/components/schemas/RMSReservationWebhookData"}},"type":"object","required":["clientId","subscription","data"],"title":"RMSReservationWebhookPayload","description":"Top-level payload POSTed by RMS to ``/rms/webhook/reservation``.\n\nThe ``clientId`` is the parent (enterprise) client ID, not the child\nproperty ID used for ARI webhook routing."},"RMSReservationWebhookSubscription":{"properties":{"id":{"type":"integer","title":"Id"},"propertyId":{"type":"integer","title":"Propertyid","default":0},"entityType":{"type":"integer","title":"Entitytype"},"action":{"type":"integer","title":"Action","default":0},"subAction":{"type":"string","title":"Subaction","default":""},"modelType":{"type":"integer","title":"Modeltype","default":1}},"type":"object","required":["id","entityType"],"title":"RMSReservationWebhookSubscription","description":"The ``subscription`` block inside a reservation webhook callback."},"RMSTopLevelAdditional":{"properties":{"additionalId":{"type":"integer","title":"Additionalid"},"adults":{"items":{"$ref":"#/components/schemas/RMSAdditionalGuestPricing"},"type":"array","title":"Adults","default":[]},"children":{"items":{"$ref":"#/components/schemas/RMSAdditionalGuestPricing"},"type":"array","title":"Children","default":[]},"infants":{"items":{"$ref":"#/components/schemas/RMSAdditionalGuestPricing"},"type":"array","title":"Infants","default":[]},"adultsBase":{"anyOf":[{"$ref":"#/components/schemas/RMSAdditionalBase"},{"type":"null"}]},"childrenBase":{"anyOf":[{"$ref":"#/components/schemas/RMSAdditionalBase"},{"type":"null"}]},"infantsBase":{"anyOf":[{"$ref":"#/components/schemas/RMSAdditionalBase"},{"type":"null"}]}},"type":"object","required":["additionalId"],"title":"RMSTopLevelAdditional","description":"Top-level additional guest pricing (new format).\n\nIn the new RMS format, additionals is a top-level array with additionalId\nas a key, referenced by dayBreakdown entries via their additionalId field."},"RatePlan":{"properties":{"rate_plan_code":{"type":"string","title":"Rate Plan Code"},"name":{"type":"string","title":"Name"}},"type":"object","required":["rate_plan_code","name"],"title":"RatePlan","description":"Rate plan from GetMappingRS."},"RatePlanConfirmRequest":{"properties":{"selections":{"items":{"$ref":"#/components/schemas/RatePlanSelection"},"type":"array","minItems":1,"title":"Selections","description":"One entry per room type being reviewed"}},"type":"object","required":["selections"],"title":"RatePlanConfirmRequest","description":"Request body to confirm rate plan selections for all affected room types."},"RatePlanOption":{"properties":{"rate_plan_id":{"type":"integer","title":"Rate Plan Id"},"name":{"type":"string","title":"Name"},"pms_rate_plan_code":{"type":"string","title":"Pms Rate Plan Code"},"avg_daily_rate":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Avg Daily Rate","description":"Average base rate across available dates (AUD). None if no rate records exist."},"is_current_default":{"type":"boolean","title":"Is Current Default"}},"type":"object","required":["rate_plan_id","name","pms_rate_plan_code","is_current_default"],"title":"RatePlanOption","description":"A single rate plan option shown during rate plan review."},"RatePlanReviewData":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"room_types":{"items":{"$ref":"#/components/schemas/RoomTypeReviewItem"},"type":"array","title":"Room Types"}},"type":"object","required":["property_id","room_types"],"title":"RatePlanReviewData","description":"Rate plan review data for all affected room types."},"RatePlanReviewResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"$ref":"#/components/schemas/RatePlanReviewData"}},"type":"object","required":["msg","data"],"title":"RatePlanReviewResponse","description":"Response wrapper for rate plan review endpoint."},"RatePlanSelection":{"properties":{"room_type_id":{"type":"integer","title":"Room Type Id"},"rate_plan_id":{"type":"integer","title":"Rate Plan Id"}},"type":"object","required":["room_type_id","rate_plan_id"],"title":"RatePlanSelection","description":"A single room type → rate plan selection."},"ReadReservation":{"properties":{"create_date_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Create Date Time"},"unique_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unique Id"},"room_stays":{"items":{"$ref":"#/components/schemas/ReadReservationRoomStay"},"type":"array","title":"Room Stays","default":[]},"services":{"items":{"$ref":"#/components/schemas/ReadReservationService"},"type":"array","title":"Services","default":[]},"guests":{"items":{"$ref":"#/components/schemas/ReadReservationGuest"},"type":"array","title":"Guests","default":[]},"deposit_payments":{"items":{"$ref":"#/components/schemas/ReadReservationDepositPayment"},"type":"array","title":"Deposit Payments","default":[]},"hotel_reservation_ids":{"items":{"$ref":"#/components/schemas/ReadReservationID"},"type":"array","title":"Hotel Reservation Ids","default":[]},"total_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Amount"},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code"}},"type":"object","title":"ReadReservation","description":"Hotel reservation from OTA_ReadRS."},"ReadReservationDepositPayment":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"amount":{"type":"number","title":"Amount"},"currency_code":{"type":"string","title":"Currency Code"}},"type":"object","required":["amount","currency_code"],"title":"ReadReservationDepositPayment","description":"Deposit payment in OTA_ReadRS."},"ReadReservationDiscount":{"properties":{"amount_after_tax":{"type":"number","title":"Amount After Tax"},"discount_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Code"},"discount_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Type"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["amount_after_tax"],"title":"ReadReservationDiscount","description":"Discount applied to a room stay."},"ReadReservationGuest":{"properties":{"res_guest_rph":{"type":"string","title":"Res Guest Rph"},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"given_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Given Name"},"surname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surname"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mobile"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"address":{"anyOf":[{"$ref":"#/components/schemas/ReadReservationGuestAddress"},{"type":"null"}]},"loyalty_member_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loyalty Member Id"},"loyalty_program_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loyalty Program Id"}},"type":"object","required":["res_guest_rph"],"title":"ReadReservationGuest","description":"Guest profile in OTA_ReadRS."},"ReadReservationGuestAddress":{"properties":{"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"city_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Name"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"state_prov":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Prov"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"}},"type":"object","title":"ReadReservationGuestAddress","description":"Guest address in OTA_ReadRS."},"ReadReservationID":{"properties":{"res_id_type":{"type":"string","title":"Res Id Type"},"res_id_value":{"type":"string","title":"Res Id Value"},"res_id_source":{"type":"string","title":"Res Id Source"}},"type":"object","required":["res_id_type","res_id_value","res_id_source"],"title":"ReadReservationID","description":"Reservation ID from OTA_ReadRS."},"ReadReservationRate":{"properties":{"start_date":{"type":"string","title":"Start Date"},"end_date":{"type":"string","title":"End Date"},"amount_after_tax":{"type":"number","title":"Amount After Tax"},"currency_code":{"type":"string","title":"Currency Code"}},"type":"object","required":["start_date","end_date","amount_after_tax","currency_code"],"title":"ReadReservationRate","description":"Rate for a date range in OTA_ReadRS."},"ReadReservationRoomRate":{"properties":{"room_type_code":{"type":"string","title":"Room Type Code"},"rate_plan_code":{"type":"string","title":"Rate Plan Code"},"rates":{"items":{"$ref":"#/components/schemas/ReadReservationRate"},"type":"array","title":"Rates","default":[]}},"type":"object","required":["room_type_code","rate_plan_code"],"title":"ReadReservationRoomRate","description":"Room rate in OTA_ReadRS."},"ReadReservationRoomStay":{"properties":{"index_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index Number"},"room_stay_status":{"type":"string","title":"Room Stay Status"},"start_date":{"type":"string","title":"Start Date"},"end_date":{"type":"string","title":"End Date"},"room_rates":{"items":{"$ref":"#/components/schemas/ReadReservationRoomRate"},"type":"array","title":"Room Rates","default":[]},"adults":{"type":"integer","title":"Adults","default":0},"children":{"type":"integer","title":"Children","default":0},"infants":{"type":"integer","title":"Infants","default":0},"total_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Amount"},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code"},"discount":{"anyOf":[{"$ref":"#/components/schemas/ReadReservationDiscount"},{"type":"null"}]},"comments":{"items":{"type":"string"},"type":"array","title":"Comments","default":[]},"service_rphs":{"items":{"type":"string"},"type":"array","title":"Service Rphs","default":[]}},"type":"object","required":["room_stay_status","start_date","end_date"],"title":"ReadReservationRoomStay","description":"Room stay in OTA_ReadRS."},"ReadReservationService":{"properties":{"service_rph":{"type":"string","title":"Service Rph"},"quantity":{"type":"integer","title":"Quantity"},"amount_after_tax":{"type":"number","title":"Amount After Tax"},"currency_code":{"type":"string","title":"Currency Code"},"name":{"type":"string","title":"Name"},"stay_cost_contribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stay Cost Contribution"}},"type":"object","required":["service_rph","quantity","amount_after_tax","currency_code","name"],"title":"ReadReservationService","description":"Service/extra attached to a reservation."},"ReadReservationsResponse":{"properties":{"reservations":{"items":{"$ref":"#/components/schemas/ReadReservation"},"type":"array","title":"Reservations","default":[]}},"type":"object","title":"ReadReservationsResponse","description":"Parsed OTA_ReadRS response."},"ReconciliationMetric":{"type":"string","enum":["headline_journey_started","headline_property_exposed","headline_property_engaged","headline_availability_checked","headline_bookable_option_returned","headline_cart_created","headline_checkout_prepared","headline_payment_succeeded","headline_booking_confirmed","property_opportunity_journey_started","property_opportunity_property_exposed","property_opportunity_property_engaged","property_opportunity_availability_checked","property_opportunity_bookable_option_returned","property_opportunity_cart_created","property_opportunity_checkout_prepared","property_opportunity_payment_succeeded","property_opportunity_booking_confirmed","cart_created","booking_intent_created","payment_succeeded_intent","booking_created","confirmed_booking","confirmed_cart_stay","confirmed_cart","accommodation_amount","pet_fee_amount","service_fee_amount","booked_gross_value","cancelled_bookings","pms_failed_bookings","payment_auth_cancelled_bookings","refund_occurred_bookings","fully_refunded_bookings","refunded_accommodation_amount","refunded_pet_fee_amount","refunded_service_fee_amount","refunded_gross_amount"],"title":"ReconciliationMetric"},"ReconciliationTimeBasis":{"type":"string","enum":["cohort_started_at","activity_at","confirmed_at","cancelled_at","pms_failed_at","payment_cancelled_at","first_refunded_at","fully_refunded_at"],"title":"ReconciliationTimeBasis"},"RecoveryCodesResponse":{"properties":{"codes":{"items":{"type":"string"},"type":"array","title":"Codes"}},"type":"object","required":["codes"],"title":"RecoveryCodesResponse","description":"Body returned by /auth/mfa/recovery-codes/regenerate.\n\nPlaintext codes are returned **once** here and never persisted\nplaintext anywhere."},"RejectClaimRequest":{"properties":{"reason":{"type":"string","maxLength":1000,"minLength":10,"title":"Reason","description":"Reason for rejection"}},"type":"object","required":["reason"],"title":"RejectClaimRequest","description":"Schema for rejecting a claim request."},"RejectClaimResponse":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"message":{"type":"string","title":"Message","default":"Claim request rejected"}},"type":"object","required":["request_id"],"title":"RejectClaimResponse","description":"Response after rejecting a claim request."},"ReportingAggregationScope":{"type":"string","enum":["total","dimensions"],"title":"ReportingAggregationScope"},"ReportingCountingUnit":{"type":"string","enum":["utc_day","journey","journey_property","cart","booking_intent","cart_stay","booking","booking_currency_amount","source_row"],"title":"ReportingCountingUnit"},"ReportingCoverageState":{"type":"string","enum":["complete","provisional_failed","provisional_missing"],"title":"ReportingCoverageState"},"ReportingGrain":{"type":"string","enum":["utc_day","utc_day_violation_stage","funnel_stage_maturity","funnel_stage","utc_day_metric","utc_day_currency_metric","reconciliation_total"],"title":"ReportingGrain"},"ReportingMaturityState":{"type":"string","enum":["immutable","live"],"title":"ReportingMaturityState"},"ReportingSource":{"type":"string","enum":["reporting_conversion_gate_days","reporting_conversion_daily_coverage","reporting_conversion_data_quality_violations","reporting_conversion_headline_funnel","reporting_conversion_property_opportunity_funnel","reporting_conversion_checkout_workload","reporting_conversion_booked_value","reporting_conversion_campaign_stage_reach","reporting_conversion_campaign_booked_value","reporting_conversion_reconciliation_totals","reporting_conversion_outcomes","reporting_conversion_outcome_gaps"],"title":"ReportingSource"},"ResendInviteResponse":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"invite_sent":{"type":"boolean","title":"Invite Sent"},"message":{"type":"string","title":"Message","default":"Invite email resent"}},"type":"object","required":["request_id","invite_sent"],"title":"ResendInviteResponse","description":"Response after resending an invite email for an approved claim."},"ReservationGuest":{"properties":{"given_name":{"type":"string","title":"Given Name"},"surname":{"type":"string","title":"Surname"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"phone_type":{"type":"integer","title":"Phone Type","default":1},"address":{"anyOf":[{"$ref":"#/components/schemas/GuestAddress"},{"type":"null"}]},"is_primary":{"type":"boolean","title":"Is Primary","default":true}},"type":"object","required":["given_name","surname"],"title":"ReservationGuest","description":"Guest information for reservation request."},"ReservationRate":{"properties":{"start_date":{"type":"string","title":"Start Date"},"end_date":{"type":"string","title":"End Date"},"amount_after_tax":{"type":"number","title":"Amount After Tax"},"currency_code":{"type":"string","title":"Currency Code","default":"AUD"}},"type":"object","required":["start_date","end_date","amount_after_tax"],"title":"ReservationRate","description":"Rate for a specific date range in a reservation request."},"ReservationRequest":{"properties":{"reservation_id":{"type":"string","title":"Reservation Id"},"room_stays":{"items":{"$ref":"#/components/schemas/ReservationRoomStay"},"type":"array","title":"Room Stays"},"guests":{"items":{"$ref":"#/components/schemas/ReservationGuest"},"type":"array","title":"Guests"},"total_amount":{"type":"number","title":"Total Amount"},"currency_code":{"type":"string","title":"Currency Code","default":"AUD"},"payment_card":{"anyOf":[{"$ref":"#/components/schemas/PaymentCard"},{"type":"null"}]},"deposit_payments":{"anyOf":[{"items":{"$ref":"#/components/schemas/DepositPayment"},"type":"array"},{"type":"null"}],"title":"Deposit Payments"},"comments":{"items":{"type":"string"},"type":"array","title":"Comments","default":[]}},"type":"object","required":["reservation_id","room_stays","guests","total_amount"],"title":"ReservationRequest","description":"Request to create/modify/cancel a reservation via OTA_HotelResNotifRQ."},"ReservationResponse":{"properties":{"reservation_id":{"type":"string","title":"Reservation Id"},"newbook_reservation_id":{"type":"string","title":"Newbook Reservation Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["reservation_id","newbook_reservation_id","status"],"title":"ReservationResponse","description":"Response from OTA_HotelResNotifRS after creating/modifying a reservation."},"ReservationRoomRate":{"properties":{"room_type_code":{"type":"string","title":"Room Type Code"},"rate_plan_code":{"type":"string","title":"Rate Plan Code"},"rates":{"items":{"$ref":"#/components/schemas/ReservationRate"},"type":"array","title":"Rates"}},"type":"object","required":["room_type_code","rate_plan_code","rates"],"title":"ReservationRoomRate","description":"Room rate information for reservation request."},"ReservationRoomStay":{"properties":{"index_number":{"type":"integer","title":"Index Number"},"start_date":{"type":"string","title":"Start Date"},"end_date":{"type":"string","title":"End Date"},"room_rates":{"items":{"$ref":"#/components/schemas/ReservationRoomRate"},"type":"array","title":"Room Rates"},"total_amount":{"type":"number","title":"Total Amount"},"currency_code":{"type":"string","title":"Currency Code","default":"AUD"},"adults":{"type":"integer","title":"Adults","default":1},"children":{"type":"integer","title":"Children","default":0},"infants":{"type":"integer","title":"Infants","default":0},"room_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Id"},"comments":{"items":{"type":"string"},"type":"array","title":"Comments","default":[]},"guest_rphs":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Guest Rphs"}},"type":"object","required":["index_number","start_date","end_date","room_rates","total_amount"],"title":"ReservationRoomStay","description":"Room stay for reservation request."},"ResolveAriWebhookFailureRequest":{"properties":{"resolution_notes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Resolution Notes","description":"Optional operator note explaining why the DLQ row was cleared"}},"type":"object","title":"ResolveAriWebhookFailureRequest","description":"Request body for marking ARI webhook DLQ rows resolved."},"ResolvedBlockoutRange":{"properties":{"start":{"type":"string","format":"date","title":"Start"},"end":{"type":"string","format":"date","title":"End"},"source":{"type":"string","enum":["preset","custom"],"title":"Source"},"label":{"type":"string","title":"Label","description":"Display label for UI and booking rejections"},"preset_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset Key","description":"Preset key when source == 'preset', otherwise null"}},"type":"object","required":["start","end","source","label"],"title":"ResolvedBlockoutRange","description":"A concrete blocked date range resolved for a specific year."},"RevalidateApplyEvent":{"properties":{"route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Route"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"},"occurred_at_ms":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Occurred At Ms"},"environment":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment"},"event_type":{"type":"string","const":"revalidate_apply","title":"Event Type"},"correlation_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Correlation Id"},"source":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Source"},"duration_ms":{"type":"number","maximum":120000,"minimum":0,"title":"Duration Ms"},"success":{"type":"boolean","title":"Success"},"error_type":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Error Type"},"items_count":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Items Count"}},"additionalProperties":false,"type":"object","required":["event_type","duration_ms","success"],"title":"RevalidateApplyEvent"},"RevalidateMessageReceivedEvent":{"properties":{"route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Route"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"},"occurred_at_ms":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Occurred At Ms"},"environment":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment"},"event_type":{"type":"string","const":"revalidate_message_received","title":"Event Type"},"correlation_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Correlation Id"},"source":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Source"},"kind":{"type":"string","enum":["single","bulk"],"title":"Kind","default":"single"},"properties_count":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Properties Count"}},"additionalProperties":false,"type":"object","required":["event_type"],"title":"RevalidateMessageReceivedEvent"},"RevalidateSubscriberStateEvent":{"properties":{"route":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Route"},"request_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"},"occurred_at_ms":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Occurred At Ms"},"environment":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Environment"},"event_type":{"type":"string","const":"revalidate_subscriber_state","title":"Event Type"},"state":{"type":"string","enum":["subscribed","connected","reconnecting","disconnected"],"title":"State"},"error_type":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Error Type"}},"additionalProperties":false,"type":"object","required":["event_type","state"],"title":"RevalidateSubscriberStateEvent"},"RevokeRequest":{"properties":{"token":{"type":"string","title":"Token"},"token_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Type Hint"}},"type":"object","required":["token"],"title":"RevokeRequest"},"Room":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"length_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length M"},"width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Width M"},"size_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size Unit"}},"type":"object","required":["id","name"],"title":"Room","description":"Individual room/site within a room type."},"RoomTypeEquipmentFit":{"properties":{"room_type_id":{"type":"integer","title":"Room Type Id","description":"ID of the site room type this verdict applies to."},"is_site":{"type":"boolean","title":"Is Site","description":"Always true — only site room types are evaluated for equipment fit. Accommodation (cabins, villas) is omitted from the response and should be treated as always fitting."},"dimensions_pending":{"type":"boolean","title":"Dimensions Pending","description":"True when the park has not configured per-site dimensions for this room type yet. Fit cannot be verified, so the room type is treated as not fitting (an onboarding gap, not a guest-side mismatch)."},"equipment_type_excluded":{"type":"boolean","title":"Equipment Type Excluded","description":"True when an equipment_type was supplied and the room type's RMS category does not accept it. Lenient by default: false when the category has no dwelling-type allocations at all."},"sites_matching":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sites Matching","description":"Number of individual sites whose dimensions and RMS dwelling compatibility fit the equipment. Null when no equipment_length was supplied (dimension fit not evaluated). Length is strict (areas with NULL length excluded); width is relaxed (NULL/0 width passes)."},"total_sites":{"type":"integer","title":"Total Sites","description":"Total number of individual sites in this room type."},"fits_equipment":{"type":"boolean","title":"Fits Equipment","description":"Convenience verdict: false when dimensions_pending, equipment_type_excluded, or (equipment_length supplied and sites_matching == 0); true otherwise."},"unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unavailable Reason","description":"Human-facing copy for the failing signal, or null when the equipment fits. Programmatic callers should branch on the boolean / count fields, not this string."},"physical_sites_matching":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Physical Sites Matching","description":"Sites that pass physical length/width checks before RMS dwelling compatibility is applied. Null when no equipment_length was supplied."},"dwelling_compatible_sites":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dwelling Compatible Sites","description":"Sites that pass RMS dwelling type/length compatibility before physical fit. Null when RMS compatibility was not evaluated."},"compatibility_status":{"type":"string","enum":["compatible","incompatible","unknown","not_evaluated"],"title":"Compatibility Status","description":"Overall static compatibility after combining physical dimensions and RMS dwelling rules. Unknown means missing/incomplete dwelling data failed open rather than excluding the site type.","default":"not_evaluated"},"physical_fit_status":{"type":"string","enum":["compatible","incompatible","unknown","not_evaluated"],"title":"Physical Fit Status","description":"Aggregate physical length/width fit status.","default":"not_evaluated"},"type_compatibility_status":{"type":"string","enum":["compatible","incompatible","unknown","not_evaluated"],"title":"Type Compatibility Status","description":"Aggregate RMS dwelling type compatibility status.","default":"not_evaluated"},"length_compatibility_status":{"type":"string","enum":["compatible","incompatible","unknown","not_evaluated"],"title":"Length Compatibility Status","description":"Aggregate RMS dwelling length-bucket compatibility status.","default":"not_evaluated"}},"type":"object","required":["room_type_id","is_site","dimensions_pending","equipment_type_excluded","total_sites","fits_equipment"],"title":"RoomTypeEquipmentFit","description":"Date-independent equipment-fit verdict for one site room type.\n\nLets an agent or the property page decide whether a site room type can\nphysically accommodate the guest's rig before any dates are chosen. The\nthree exclusion signals are orthogonal and must not be conflated:\n\n- ``dimensions_pending`` — park onboarding gap (no per-site dimensions).\n- ``equipment_type_excluded`` — RMS category rejects the equipment type.\n- ``sites_matching == 0`` — sites exist but none are physically large\n  enough for the supplied dimensions."},"RoomTypeMapping":{"properties":{"inv_type_code":{"type":"string","title":"Inv Type Code"},"name":{"type":"string","title":"Name"},"rate_plans":{"items":{"$ref":"#/components/schemas/RatePlan"},"type":"array","title":"Rate Plans","default":[]}},"type":"object","required":["inv_type_code","name"],"title":"RoomTypeMapping","description":"Room type with its associated rate plans from GetMappingRS."},"RoomTypeRestrictionSummary":{"properties":{"days_checked":{"type":"integer","title":"Days Checked","default":0},"stop_sell_days":{"type":"integer","title":"Stop Sell Days","default":0},"min_stay_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Stay Max"},"max_stay_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Stay Min"},"closed_on_arrival_days":{"type":"integer","title":"Closed On Arrival Days","default":0},"closed_on_departure_days":{"type":"integer","title":"Closed On Departure Days","default":0}},"type":"object","title":"RoomTypeRestrictionSummary","description":"ARI restriction summary for the next 30 days (via default rate plan)."},"RoomTypeReviewItem":{"properties":{"room_type_id":{"type":"integer","title":"Room Type Id"},"room_type_name":{"type":"string","title":"Room Type Name"},"rate_plans":{"items":{"$ref":"#/components/schemas/RatePlanOption"},"type":"array","title":"Rate Plans"},"selected_rate_plan_id":{"type":"integer","title":"Selected Rate Plan Id","description":"Currently selected default rate plan ID"}},"type":"object","required":["room_type_id","room_type_name","rate_plans","selected_rate_plan_id"],"title":"RoomTypeReviewItem","description":"A room type with multiple rate plans that needs admin review."},"SearchCandidate":{"properties":{"property_ref":{"type":"string","minLength":1,"title":"Property Ref","description":"Public property reference accepted by MCP/search consumers."},"property_url":{"type":"string","minLength":1,"title":"Property Url","description":"Traveller-facing Total Parks URL for the property."},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name","description":"Display name for lightweight cards and agent summaries."},"google_rating":{"anyOf":[{"type":"number","maximum":5,"minimum":0},{"type":"null"}],"title":"Google Rating","description":"Cached Google star rating for grounded result summaries."},"google_user_rating_count":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Google User Rating Count","description":"Cached Google review count associated with google_rating."},"room_type_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type Url","description":"Traveller-facing room/site URL when the candidate is option-specific."},"tier":{"$ref":"#/components/schemas/SearchCandidateTier","description":"Outer candidate tier: bookable, likely, or discovery."},"channel_state":{"$ref":"#/components/schemas/PublicBookingChannelState","description":"Server-authoritative booking channel; separate from candidate tier."},"confidence":{"$ref":"#/components/schemas/ConstraintConfidence","description":"Orthogonal confidence axis for the candidate tier."},"matched_signals":{"items":{"$ref":"#/components/schemas/SearchMatchedSignal"},"type":"array","title":"Matched Signals","description":"Lane-specific annotations; not full constraint results."},"planning":{"anyOf":[{"$ref":"#/components/schemas/PlanningFreshnessEnvelope"},{"type":"null"}],"description":"Planning-tier availability envelope when intent was supplied."},"indicative_pricing":{"anyOf":[{"$ref":"#/components/schemas/SearchIndicativePricing"},{"type":"null"}],"description":"Cache-only indicative pricing split by stay kind. Omitted when search did not run dated/flexible planning, rates are incomplete, or the candidate is discovery-only."},"actions":{"anyOf":[{"$ref":"#/components/schemas/SearchCandidateActions"},{"type":"null"}],"description":"Optional Total Parks handoff URLs."}},"additionalProperties":false,"type":"object","required":["property_ref","property_url","tier","channel_state","confidence"],"title":"SearchCandidate","description":"Lightweight search result; deep judgement lives in assess tools."},"SearchCandidateActions":{"properties":{"start_booking_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Booking Url","description":"Traveller-facing Total Parks booking link when a specific option is ready for checkout handoff. It does not reserve inventory."},"request_to_book_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request To Book Url","description":"Traveller-facing Request-to-Book form for an eligible request-only property. A submitted request is not a confirmed booking."}},"additionalProperties":false,"type":"object","title":"SearchCandidateActions","description":"Optional handoff links for a candidate."},"SearchCandidateTier":{"type":"string","enum":["bookable","likely","discovery"],"title":"SearchCandidateTier","description":"Outer result tier shared by discovery and assessment surfaces."},"SearchEquipmentIntent":{"properties":{"type":{"anyOf":[{"type":"string","enum":["caravan","campervan","motorhome","camp_trailer","roof_top_tent","tent","swag","car_ute","fifth_wheeler"]},{"type":"null"}],"title":"Type","description":"Canonical equipment type, e.g. caravan or motorhome."},"length_m":{"anyOf":[{"type":"number","maximum":30,"minimum":1},{"type":"null"}],"title":"Length M","description":"Rig length in metres."},"width_m":{"anyOf":[{"type":"number","maximum":10,"minimum":1},{"type":"null"}],"title":"Width M","description":"Optional rig width in metres."},"power_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Power Required","description":"Whether the traveller requires a powered site."}},"additionalProperties":false,"type":"object","title":"SearchEquipmentIntent","description":"Backward-compatible wire name for the embedded search rig profile."},"SearchFacetCount":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"boolean"}],"title":"Value","description":"Filter value represented by this facet."},"count":{"type":"integer","minimum":0,"title":"Count","description":"Number of current candidates with this value."}},"additionalProperties":false,"type":"object","required":["value","count"],"title":"SearchFacetCount","description":"Count for one search filter value in the current result set."},"SearchFilterAnyGroup":{"properties":{"feature_ids":{"items":{"type":"integer"},"type":"array","title":"Feature Ids","description":"Feature IDs; matching any one satisfies this group."},"highlight_ids":{"items":{"type":"string"},"type":"array","title":"Highlight Ids","description":"Highlight IDs; matching any one satisfies this group."},"local_proximity":{"items":{"$ref":"#/components/schemas/SearchLocalProximityConstraint"},"type":"array","title":"Local Proximity","description":"Independent off-site topic/distance alternatives; matching any one satisfies this group."}},"additionalProperties":false,"type":"object","title":"SearchFilterAnyGroup","description":"An OR-group of on-property and/or off-site structured facts.\n\nA candidate satisfies the group when it has *any* of the listed feature IDs\nor highlight IDs (overlap, not contains-all), or satisfies any listed local\nproximity constraint. Groups let a single real-world concept represented in\ndifferent source stores — e.g. on-site EV charging or a confirmed charger\nnearby — match without merging those stores.\n\nMultiple groups on a filter are ANDed together; members *within* a group are\nORed."},"SearchFilterFacets":{"properties":{"feature_ids":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Feature Ids"},"highlight_ids":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Highlight Ids"},"management_ids":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Management Ids"},"states":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"States"},"booking_enabled":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Booking Enabled"},"channel_state":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Channel State"},"accommodation_kind":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Accommodation Kind"},"option_facets":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Option Facets"},"pet_friendly":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Pet Friendly"},"accessible":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Accessible"},"setting":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Setting"},"traveller_appeal":{"items":{"$ref":"#/components/schemas/SearchFacetCount"},"type":"array","title":"Traveller Appeal"}},"additionalProperties":false,"type":"object","title":"SearchFilterFacets","description":"Filter-lane facet counts for the current search result set."},"SearchFilterParams":{"properties":{"feature_ids":{"items":{"type":"integer"},"type":"array","title":"Feature Ids","description":"Property feature IDs that candidates must satisfy."},"highlight_ids":{"items":{"type":"string"},"type":"array","title":"Highlight Ids","description":"Curated property highlight IDs that candidates must satisfy. Use stable highlight slugs when the traveller asks for known curated signals such as campfire-friendly, swimming-pool, resort-style-pool, beach-access, or pet-friendly."},"any_of":{"items":{"$ref":"#/components/schemas/SearchFilterAnyGroup"},"type":"array","title":"Any Of","description":"OR-groups: each group is satisfied when a candidate has any listed feature, highlight, or confirmed local-proximity match. Groups are ANDed together; members within a group are ORed."},"local_proximity":{"items":{"$ref":"#/components/schemas/SearchLocalProximityConstraint"},"type":"array","title":"Local Proximity","description":"Confirmed current off-site topic/distance requirements. Every entry is required (AND semantics). Use this for explicit 'near', 'close', or 'within X km' venue needs, not on-property amenities, coastal vibe, or walking/driving claims."},"management_ids":{"items":{"type":"integer"},"type":"array","title":"Management Ids","description":"Optional management or chain IDs to include."},"states":{"items":{"type":"string"},"type":"array","title":"States","description":"Uppercase Australian state names aligned with map geobuf data."},"region_ids":{"items":{"type":"string"},"type":"array","maxItems":54,"title":"Region Ids","description":"Canonical tourism-region IDs to include with exact, OR-within-dimension matching against Property.region (for example, nsw-north-coast). Regions are distinct from state filters."},"booking_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Booking Enabled","description":"When true, restricts to parks bookable on Total Parks."},"min_google_rating":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"title":"Min Google Rating","description":"Optional explicit minimum cached Google star rating. Properties with a lower or missing rating do not satisfy this hard filter."},"accommodation_kind":{"anyOf":[{"type":"string","enum":["site","accommodation"]},{"type":"null"}],"title":"Accommodation Kind","description":"Optional stay-kind filter: use site for caravan, campervan, motorhome, fifth-wheeler, tent, camping, powered-site, unpowered-site, ensuite-site, slab-site, and drive-through-site requests; use accommodation for cabins, villas, cottages, glamping, and similar roofed stays."},"option_facets":{"items":{"$ref":"#/components/schemas/OptionFacet"},"type":"array","title":"Option Facets","description":"Canonical room/site option facts requested by the traveller, e.g. powered, ensuite, drive_through, slab, accessible, spa, pet_friendly, family. Search annotates and tiers by scoped room-type evidence rather than treating these as park-level amenity checkboxes. Do not leave requested room/site option words only in vibe.query: copy every explicit option requirement here. For powered-site requests include option_facets=['powered'] and also set intent.equipment.power_required=true when using tp_search_stays."},"pet_friendly":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pet Friendly","description":"Property-level pet-friendly filter. For dog-friendly or pet-friendly discovery/stay searches, set this true as a search filter and also put the declared travelling pet facts in intent.pet when using tp_search_stays. Phase B hard pet checks use the capability graph and room-type truth before claiming fit."},"accessible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Accessible","description":"Optional accessibility-oriented filter signal."},"setting":{"anyOf":[{"type":"string","enum":["beachside","riverside","lakeside","bushland","mountain","rural","town_centre","city_fringe","coastal","outback"]},{"type":"null"}],"title":"Setting","description":"Canonical enrichment setting, e.g. beachside or bushland."},"traveller_appeal":{"items":{"type":"string","enum":["grey_nomads","families","couples","groups","fishers","hikers","pet_owners","big_rig_tourers"]},"type":"array","title":"Traveller Appeal","description":"Traveller segment hints from the enrichment taxonomy."}},"additionalProperties":false,"type":"object","title":"SearchFilterParams","description":"Authoritative structured filters applied before vibe ranking."},"SearchIndicativePrice":{"properties":{"amount":{"type":"number","minimum":0,"title":"Amount","description":"Indicative cached stay total."},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency","default":"AUD"},"nights":{"type":"integer","minimum":1,"title":"Nights","description":"Number of sleeping nights priced."},"stay_kind":{"type":"string","enum":["site","accommodation"],"title":"Stay Kind","description":"Stay-kind lane this indicative price applies to."},"source":{"type":"string","const":"tp_cached_ari","title":"Source","description":"Pricing source: Total Parks live inventory (PMS-synced ARI).","default":"tp_cached_ari"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated","description":"Most recent ARI timestamp contributing to the stay check."},"recheck_caveat":{"type":"string","title":"Recheck Caveat","description":"Traveller/agent-facing note: rates come from live inventory and are confirmed at checkout before payment."}},"additionalProperties":false,"type":"object","required":["amount","nights","stay_kind","last_updated","recheck_caveat"],"title":"SearchIndicativePrice","description":"Cache-backed public ARI price summary safe for search result cards."},"SearchIndicativePricing":{"properties":{"site":{"anyOf":[{"$ref":"#/components/schemas/SearchIndicativePrice"},{"type":"null"}],"description":"Indicative site stay price when complete cached rates exist."},"accommodation":{"anyOf":[{"$ref":"#/components/schemas/SearchIndicativePrice"},{"type":"null"}],"description":"Indicative cabin/accommodation stay price when complete cached rates exist."}},"additionalProperties":false,"type":"object","title":"SearchIndicativePricing","description":"Separate indicative price summaries for supported stay kinds."},"SearchIntentParams":{"properties":{"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In","description":"Desired check-in date. Must be paired with check_out."},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out","description":"Desired check-out date. Must be after check_in."},"adults":{"type":"integer","maximum":20,"minimum":1,"title":"Adults","default":2},"children":{"type":"integer","maximum":20,"minimum":0,"title":"Children","default":0},"infants":{"type":"integer","maximum":10,"minimum":0,"title":"Infants","default":0},"flexible_window":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/AroundDateFlexibleWindow"},{"$ref":"#/components/schemas/CalendarMonthFlexibleWindow"},{"$ref":"#/components/schemas/DateRangeFlexibleWindow"},{"$ref":"#/components/schemas/SeasonFlexibleWindow"}],"discriminator":{"propertyName":"type","mapping":{"around_date":"#/components/schemas/AroundDateFlexibleWindow","calendar_month":"#/components/schemas/CalendarMonthFlexibleWindow","date_range":"#/components/schemas/DateRangeFlexibleWindow","season":"#/components/schemas/SeasonFlexibleWindow"}}},{"type":"null"}],"title":"Flexible Window","description":"Flexible check-in window for planning-tier search. Mutually exclusive with check_in/check_out."},"equipment":{"anyOf":[{"$ref":"#/components/schemas/SearchEquipmentIntent"},{"type":"null"}]},"pet":{"anyOf":[{"$ref":"#/components/schemas/SearchPetIntent"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"SearchIntentParams","description":"Dates, guests, pets, and rig intent layered over discovery results."},"SearchLocalProximityConstraint":{"properties":{"topic":{"type":"string","enum":["supermarket","pharmacy","boat_ramp","dump_point","ev_charging","beach","brewery"],"title":"Topic","description":"Allowlisted off-site topic: supermarket, pharmacy, boat_ramp, dump_point, ev_charging, beach, or brewery."},"max_distance_km":{"type":"number","exclusiveMinimum":0,"title":"Max Distance Km","description":"Required maximum straight-line distance in kilometres. REST and GUI callers and explicit MCP arguments must provide a bound; the controlled MCP natural-language adapter may fill an audited topic default for clear 'near' or 'close' wording."}},"additionalProperties":false,"type":"object","required":["topic","max_distance_km"],"title":"SearchLocalProximityConstraint","description":"One confirmed off-site topic required within a straight-line bound."},"SearchMapCandidate":{"properties":{"property_id":{"type":"integer","minimum":1,"title":"Property Id","description":"Internal property ID for GeoBuf joins."},"property_ref":{"type":"string","minLength":1,"title":"Property Ref","description":"Public property reference accepted by MCP/search consumers."},"property_url":{"type":"string","minLength":1,"title":"Property Url","description":"Traveller-facing Total Parks URL for the property."},"property_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Name","description":"Display name for lightweight map popovers."},"tier":{"$ref":"#/components/schemas/SearchCandidateTier","description":"Outer candidate tier: bookable, likely, or discovery."},"channel_state":{"$ref":"#/components/schemas/PublicBookingChannelState","description":"Server-authoritative booking channel; separate from candidate tier."},"confidence":{"$ref":"#/components/schemas/ConstraintConfidence","description":"Orthogonal confidence axis for the candidate tier."},"planning_status":{"anyOf":[{"$ref":"#/components/schemas/PlanningAvailabilityStatus"},{"type":"null"}],"description":"Planning status for marker colour, when intent was supplied."},"planning_status_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planning Status Label","description":"Traveller-facing planning label for marker popovers."},"bookable_option_count":{"type":"integer","minimum":0,"title":"Bookable Option Count","description":"Matching bookable room options for the dated planning request.","default":0},"headline_price":{"anyOf":[{"$ref":"#/components/schemas/SearchMapCandidatePrice"},{"type":"null"}],"description":"Single cache-only headline price for marker labels."},"start_booking_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Booking Url","description":"Traveller-facing booking handoff URL when available."},"request_to_book_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request To Book Url","description":"Traveller-facing request form for an eligible request-only property."}},"additionalProperties":false,"type":"object","required":["property_id","property_ref","property_url","tier","channel_state","confidence"],"title":"SearchMapCandidate","description":"Compact, unpaginated marker state for search map projections."},"SearchMapCandidatePrice":{"properties":{"amount":{"type":"number","minimum":0,"title":"Amount","description":"Indicative cached stay total."},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency","default":"AUD"},"nights":{"type":"integer","minimum":1,"title":"Nights","description":"Number of sleeping nights priced."},"stay_kind":{"type":"string","enum":["site","accommodation"],"title":"Stay Kind","description":"Stay-kind lane this indicative price applies to."}},"additionalProperties":false,"type":"object","required":["amount","nights","stay_kind"],"title":"SearchMapCandidatePrice","description":"Single compact headline price for map marker labels."},"SearchMatchedSignal":{"properties":{"lane":{"type":"string","enum":["geo","filter","vibe","intent"],"title":"Lane","description":"Search lane that produced this annotation."},"code":{"type":"string","maxLength":100,"minLength":1,"title":"Code","description":"Stable machine-readable match code."},"label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Label","description":"Short traveller-facing match label."},"confidence":{"anyOf":[{"$ref":"#/components/schemas/ConstraintConfidence"},{"type":"null"}],"description":"Confidence for this annotation when applicable."},"provenance":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Provenance","description":"Source class for the matched signal when known."},"detail":{"additionalProperties":true,"type":"object","title":"Detail","description":"Optional structured detail for clients that need it."}},"additionalProperties":false,"type":"object","required":["lane","code"],"title":"SearchMatchedSignal","description":"One lane-specific reason a candidate matched the structured query."},"SearchNearbyParams":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether to return nearby candidates outside the primary envelope.","default":true},"radius_km":{"type":"number","maximum":500,"minimum":1,"title":"Radius Km","description":"Maximum distance from the resolved place anchor for nearby candidates.","default":100},"limit":{"type":"integer","maximum":20,"minimum":0,"title":"Limit","description":"Maximum number of nearby candidates to return.","default":6}},"additionalProperties":false,"type":"object","title":"SearchNearbyParams","description":"Bounded nearby results outside the primary search envelope."},"SearchPagingParams":{"properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"title":"Limit","description":"Maximum number of candidates to return.","default":20},"cursor":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Cursor","description":"Opaque cursor returned by a previous search response."}},"additionalProperties":false,"type":"object","title":"SearchPagingParams","description":"Cursor pagination for search results."},"SearchPetIntent":{"properties":{"traveling_with_pets":{"type":"boolean","title":"Traveling With Pets","description":"Whether the traveller is travelling with pets.","default":false},"pet_count":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Pet Count","description":"Number of pets travelling."},"pet_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Pet Type","description":"Primary pet type, e.g. dog."},"pet_size":{"anyOf":[{"type":"string","enum":["small","medium","large"]},{"type":"null"}],"title":"Pet Size","description":"Optional pet size declaration."},"breed":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Breed","description":"Guest-supplied breed name or slug when known."}},"additionalProperties":false,"type":"object","title":"SearchPetIntent","description":"Pet intent facts used for planning-tier policy checks."},"SearchRequest":{"properties":{"country":{"type":"string","enum":["AU","NZ"],"title":"Country","description":"ISO country code used to scope public property inventory.","default":"AU"},"geo":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/PlaceGeoParam"},{"$ref":"#/components/schemas/PointGeoParam"},{"$ref":"#/components/schemas/BboxGeoParam"},{"$ref":"#/components/schemas/PolygonGeoParam"}],"discriminator":{"propertyName":"type","mapping":{"bbox":"#/components/schemas/BboxGeoParam","place":"#/components/schemas/PlaceGeoParam","point":"#/components/schemas/PointGeoParam","polygon":"#/components/schemas/PolygonGeoParam"}}},{"type":"null"}],"title":"Geo","description":"Authoritative geo gate: place, point, bbox, or polygon."},"filter":{"anyOf":[{"$ref":"#/components/schemas/SearchFilterParams"},{"type":"null"}],"description":"Structured hard filters applied before vibe ranking."},"vibe":{"anyOf":[{"$ref":"#/components/schemas/SearchVibeParams"},{"type":"null"}],"description":"Soft preference signals used for ranking within candidates."},"intent":{"anyOf":[{"$ref":"#/components/schemas/SearchIntentParams"},{"type":"null"}],"description":"Dates, guests, pets, and rig intent for later tiering."},"paging":{"$ref":"#/components/schemas/SearchPagingParams","description":"Pagination controls."},"nearby":{"$ref":"#/components/schemas/SearchNearbyParams","description":"Controls bounded nearby candidates outside the primary search envelope. Paging and facets apply only to primary candidates."}},"additionalProperties":false,"type":"object","title":"SearchRequest","description":"Unified structured search request composed from independent lanes."},"SearchResponse":{"properties":{"contract_version":{"type":"string","const":"search.v1","title":"Contract Version","description":"Stable search contract version.","default":"search.v1"},"candidates":{"items":{"$ref":"#/components/schemas/SearchCandidate"},"type":"array","title":"Candidates","description":"Ranked, tiered primary candidate results."},"map_candidates":{"items":{"$ref":"#/components/schemas/SearchMapCandidate"},"type":"array","title":"Map Candidates","description":"Compact unpaginated marker projection for every primary candidate matching the canonical query. List pagination does not apply to this field."},"nearby_candidates":{"items":{"$ref":"#/components/schemas/SearchCandidate"},"type":"array","title":"Nearby Candidates","description":"Ranked, tiered candidates outside the primary search envelope but within the request's nearby radius. Not included in paging totals or facet counts."},"paging":{"$ref":"#/components/schemas/SearchResponsePaging","description":"Pagination metadata for primary candidates only."},"warnings":{"items":{"$ref":"#/components/schemas/SearchWarning"},"type":"array","title":"Warnings","description":"Query-level warnings, refusals, or coverage caveats."},"facets":{"anyOf":[{"$ref":"#/components/schemas/SearchFilterFacets"},{"type":"null"}],"description":"Filter facet counts for the primary result set."}},"additionalProperties":false,"type":"object","required":["paging"],"title":"SearchResponse","description":"Versioned response envelope for the unified search primitive."},"SearchResponsePaging":{"properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"title":"Limit","description":"Page size used for the response."},"returned":{"type":"integer","minimum":0,"title":"Returned","description":"Number of candidates returned."},"total":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Total","description":"Total matching candidates when cheaply known."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page is available.","default":false},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for the next page, when has_more is true."}},"additionalProperties":false,"type":"object","required":["limit","returned"],"title":"SearchResponsePaging","description":"Cursor page metadata returned with search results."},"SearchVibeParams":{"properties":{"query":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Query","description":"Free-text vibe or inspiration phrase for semantic ranking."},"category_slug":{"anyOf":[{"type":"string","maxLength":80,"minLength":1,"pattern":"^[a-z0-9][a-z0-9-]*$"},{"type":"null"}],"title":"Category Slug","description":"Optional editorial vibe/category slug."},"setting":{"anyOf":[{"type":"string","enum":["beachside","riverside","lakeside","bushland","mountain","rural","town_centre","city_fringe","coastal","outback"]},{"type":"null"}],"title":"Setting","description":"Soft setting preference used for ranking, not hard gating."},"traveller_appeal":{"items":{"type":"string","enum":["grey_nomads","families","couples","groups","fishers","hikers","pet_owners","big_rig_tourers"]},"type":"array","title":"Traveller Appeal","description":"Soft traveller segment preferences used for ranking."}},"additionalProperties":false,"type":"object","title":"SearchVibeParams","description":"Soft preference signals used to rank within the gated candidate set."},"SearchWarning":{"properties":{"code":{"type":"string","maxLength":100,"minLength":1,"title":"Code"},"message":{"type":"string","maxLength":500,"minLength":1,"title":"Message"},"recovery_hint":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Recovery Hint"}},"additionalProperties":false,"type":"object","required":["code","message"],"title":"SearchWarning","description":"Non-fatal warning or query-level limitation."},"SeasonFlexibleWindow":{"properties":{"min_nights":{"type":"integer","maximum":90,"minimum":1,"title":"Min Nights","description":"Minimum number of nights to search inside the flexible window. For an exact stay length such as 'about 4 nights' or 'for three nights', set both min_nights and max_nights to that value.","default":1},"max_nights":{"anyOf":[{"type":"integer","maximum":90,"minimum":1},{"type":"null"}],"title":"Max Nights","description":"Maximum number of nights to search. When the traveller gives an exact stay length, explicitly set max_nights equal to min_nights instead of relying on the default."},"type":{"type":"string","const":"season","title":"Type","default":"season"},"year":{"type":"integer","maximum":2100,"minimum":2024,"title":"Year","description":"Season start year; summer spans December of this year through February of the following year."},"season":{"type":"string","enum":["summer","autumn","winter","spring"],"title":"Season"}},"additionalProperties":false,"type":"object","required":["year","season"],"title":"SeasonFlexibleWindow","description":"Check-in dates inside an Australian tourism season."},"ServiceFeeResponse":{"properties":{"service_fee":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Service Fee","description":"Calculated service fee"},"grand_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Grand Total","description":"Subtotal + service fee"},"currency":{"type":"string","title":"Currency","description":"Currency code (ISO 4217)","default":"AUD"}},"type":"object","required":["service_fee","grand_total"],"title":"ServiceFeeResponse","description":"Response from service fee calculation."},"SingleStaySeed":{"properties":{"property_id":{"type":"integer","title":"Property Id","description":"Total Parks property ID."},"room_type_id":{"type":"integer","title":"Room Type Id","description":"Room type to book."},"check_in":{"type":"string","format":"date","title":"Check In","description":"Check-in date."},"check_out":{"type":"string","format":"date","title":"Check Out","description":"Check-out date."},"adults":{"type":"integer","minimum":1,"title":"Adults","default":2},"children":{"type":"integer","minimum":0,"title":"Children","default":0},"infants":{"type":"integer","minimum":0,"title":"Infants","default":0},"pet_declaration":{"anyOf":[{"$ref":"#/components/schemas/PetDeclaration"},{"type":"null"}]},"equipment":{"anyOf":[{"$ref":"#/components/schemas/EquipmentSchema"},{"type":"null"}]},"lead_guest_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lead Guest Override"},"special_requests":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Special Requests"},"promo_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Promo Code","description":"Optional promo code to attempt to apply on cart creation. Powers the tracked-link pre-apply path (?promo=CODE on a property URL). Failures emit a non-blocking ``CartWarning`` so the cart is created either way."}},"type":"object","required":["property_id","room_type_id","check_in","check_out"],"title":"SingleStaySeed","description":"Convenience payload for the existing 'Book Now' path.\n\nPassed as ``single_stay_seed`` on ``POST /carts`` to atomically create\nCart + CartStay + CartLine in one call."},"StrengthFactor":{"properties":{"id":{"type":"string","title":"Id","description":"Factor identifier (e.g., 'images', 'description')"},"label":{"type":"string","title":"Label","description":"Human-readable factor name"},"weight":{"type":"number","maximum":1,"minimum":0,"title":"Weight","description":"Weight in overall score calculation"},"current_value":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"boolean"}],"title":"Current Value","description":"Current value (count, length, etc.)"},"status":{"$ref":"#/components/schemas/FactorStatus","description":"Factor status tier"},"score":{"type":"integer","maximum":100,"minimum":0,"title":"Score","description":"Individual factor score"},"thresholds":{"$ref":"#/components/schemas/FactorThresholds","description":"Threshold descriptions for display"}},"type":"object","required":["id","label","weight","current_value","status","score","thresholds"],"title":"StrengthFactor","description":"Individual factor contributing to listing strength."},"StrengthRecommendation":{"properties":{"factor_id":{"type":"string","title":"Factor Id","description":"Factor this recommendation improves"},"priority":{"type":"integer","minimum":1,"title":"Priority","description":"Display priority (1 = highest impact)"},"title":{"type":"string","title":"Title","description":"Short recommendation title"},"description":{"type":"string","title":"Description","description":"Detailed explanation"},"target_url":{"type":"string","title":"Target Url","description":"URL path to the editing page"},"impact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Impact","description":"Expected impact (e.g., '+15 points')"}},"type":"object","required":["factor_id","priority","title","description","target_url"],"title":"StrengthRecommendation","description":"Actionable suggestion to improve a factor."},"StrengthTier":{"type":"string","enum":["needs_work","good","great","excellent"],"title":"StrengthTier","description":"Overall listing strength tier."},"StripeAccountStatus":{"type":"string","enum":["not_connected","onboarding_incomplete","requires_information","pending_verification","active","restricted"],"title":"StripeAccountStatus","description":"Status of a Stripe Connect account."},"StripeCallbackRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["property_id","status"],"title":"StripeCallbackRequest","description":"Request to handle Stripe Connect callback."},"StripeConnectAccountType":{"type":"string","enum":["express","standard"],"title":"StripeConnectAccountType","description":"Type of Stripe Connect account linked to a property."},"StripeConnectLinkRequest":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"business_type":{"type":"string","enum":["company","individual"],"title":"Business Type","default":"company"}},"type":"object","required":["property_id"],"title":"StripeConnectLinkRequest","description":"Request to generate a Stripe Connect onboarding link."},"StripeConnectLinkResponse":{"properties":{"onboarding_url":{"type":"string","title":"Onboarding Url"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["onboarding_url"],"title":"StripeConnectLinkResponse","description":"Response with Stripe Connect onboarding URL."},"StripeConnectStatusResponse":{"properties":{"status":{"$ref":"#/components/schemas/StripeAccountStatus"},"account_type":{"anyOf":[{"$ref":"#/components/schemas/StripeConnectAccountType"},{"type":"null"}]},"stripe_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Account Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"charges_enabled":{"type":"boolean","title":"Charges Enabled","default":false},"payouts_enabled":{"type":"boolean","title":"Payouts Enabled","default":false},"details_submitted":{"type":"boolean","title":"Details Submitted","default":false},"requirements_due":{"items":{"type":"string"},"type":"array","title":"Requirements Due"},"dashboard_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dashboard Url"},"capabilities_insufficient":{"type":"boolean","title":"Capabilities Insufficient","default":false},"capabilities_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capabilities Message"}},"type":"object","required":["status"],"title":"StripeConnectStatusResponse","description":"Response for Stripe Connect status check."},"SuccessPayload":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Data"}},"type":"object","required":["msg"],"title":"SuccessPayload"},"Surface":{"type":"string","enum":["gui","embed","mcp"],"title":"Surface"},"SyncResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"hotel_code":{"type":"string","title":"Hotel Code"},"descriptive_stats":{"$ref":"#/components/schemas/DescriptiveSyncStats"},"mapping_stats":{"$ref":"#/components/schemas/MappingSyncStats"}},"type":"object","required":["property_id","hotel_code","descriptive_stats","mapping_stats"],"title":"SyncResponse","description":"Response from full property sync."},"Tax":{"properties":{"percent":{"type":"number","title":"Percent"},"type":{"type":"string","title":"Type"},"charge_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Unit"},"charge_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Group"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["percent","type"],"title":"Tax","description":"Tax information."},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"Bearer"},"expires_in":{"type":"integer","title":"Expires In","description":"Access token lifetime in seconds"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"scope":{"type":"string","title":"Scope","description":"Space-delimited granted scopes"}},"type":"object","required":["access_token","expires_in","scope"],"title":"TokenResponse","description":"RFC 6749 token endpoint response."},"TotpEnrolRequest":{"properties":{"label":{"type":"string","maxLength":100,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"TotpEnrolRequest","description":"POST body for /auth/mfa/enroll/totp.\n\n``label`` is a free-text user-chosen string surfaced in the methods\nlist so they can tell their devices apart (e.g. \"Authy on iPhone\")."},"TotpEnrolResponse":{"properties":{"method_id":{"type":"integer","title":"Method Id"},"otpauth_uri":{"type":"string","title":"Otpauth Uri"},"manual_secret":{"type":"string","title":"Manual Secret"}},"type":"object","required":["method_id","otpauth_uri","manual_secret"],"title":"TotpEnrolResponse","description":"Body returned by /auth/mfa/enroll/totp.\n\nThe plaintext secret is returned exactly once so the user can either\nscan the QR (rendered client-side from ``otpauth_uri``) or type the\ncode manually into apps that don't scan QRs."},"TotpVerifyRequest":{"properties":{"method_id":{"type":"integer","title":"Method Id"},"code":{"type":"string","maxLength":10,"minLength":4,"title":"Code"}},"type":"object","required":["method_id","code"],"title":"TotpVerifyRequest","description":"POST body for /auth/mfa/verify/totp."},"TotpVerifyResponse":{"properties":{"method_id":{"type":"integer","title":"Method Id"},"access_token":{"type":"string","title":"Access Token"},"recovery_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recovery Codes"}},"type":"object","required":["method_id","access_token"],"title":"TotpVerifyResponse","description":"Body returned by /auth/mfa/verify/totp.\n\nOn a successful verification we also issue a fresh access token —\nthis is what flips the user out of a recovery-locked session and\ninto a full one once they've re-enrolled."},"TraceEvent":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"source":{"type":"string","title":"Source"},"source_id":{"type":"integer","title":"Source Id"},"event":{"type":"string","title":"Event"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["timestamp","source","source_id","event"],"title":"TraceEvent","description":"One row in the assembled chronological trace timeline.\n\nBuilt from the ``created_at`` / ``updated_at`` fields on each linked\nresource. Stage 7 keeps this purely DB-derived; future iterations can\nbackfill from the structured cart audit log lines if a richer event\nfeed is needed."},"TypeRoom":{"properties":{"bed_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bed Type Code"},"standard_num_beds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Standard Num Beds"}},"type":"object","title":"TypeRoom","description":"Bed type information."},"UnenrolledParkAdmin":{"properties":{"user_id":{"type":"integer","title":"User Id"},"username":{"type":"string","title":"Username"},"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"sa_property_ids":{"items":{"type":"integer"},"type":"array","title":"Sa Property Ids","default":[]}},"type":"object","required":["user_id","username"],"title":"UnenrolledParkAdmin","description":"A row on the \"still need to enrol\" sub-list of the admin\nenrolment summary. Drives the priority-outreach list described in\nthe roadmap §\"Tracking enrolment from Phase 1+2 onwards\"."},"UpcomingBooking":{"properties":{"booking_id":{"type":"integer","title":"Booking Id"},"confirmation_number":{"type":"string","title":"Confirmation Number"},"booking_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booking Code"},"guest_name":{"type":"string","title":"Guest Name"},"property_name":{"type":"string","title":"Property Name"},"check_in":{"type":"string","format":"date","title":"Check In"},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Amount"}},"type":"object","required":["booking_id","confirmation_number","guest_name","property_name","check_in","total_amount"],"title":"UpcomingBooking","description":"Unpaid platform booking whose check-in is still in the future.\n\nSurfaced in the admin generate-preview dialog so the operator can see\nwhat funds Total Parks is holding for upcoming stays and when each\nbecomes eligible."},"UpdateCartRequest":{"properties":{"billing_guest":{"anyOf":[{"$ref":"#/components/schemas/BillingGuest"},{"type":"null"}]},"commit_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Strategy","description":"Reserved. Phase 1 forces 'atomic'."}},"type":"object","title":"UpdateCartRequest","description":"``PATCH /carts/{id}`` body."},"UpdateLineRequest":{"properties":{"room_type_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Room Type Id"},"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In"},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out"},"adults":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Adults"},"children":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Children"},"infants":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Infants"},"pet_declaration":{"anyOf":[{"$ref":"#/components/schemas/PetDeclaration"},{"type":"null"}]},"equipment":{"anyOf":[{"$ref":"#/components/schemas/EquipmentSchema"},{"type":"null"}]},"lead_guest_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lead Guest Override"},"special_requests":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Special Requests"}},"type":"object","title":"UpdateLineRequest","description":"``PATCH /carts/{id}/stays/{stay_id}/lines/{line_id}`` body."},"UpdateStayRequest":{"properties":{"check_in":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check In","description":"Stay-wide check-in date; cascades to every line."},"check_out":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Check Out","description":"Stay-wide check-out date; cascades to every line."},"lead_guest_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lead Guest Override"},"special_requests":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Special Requests"}},"type":"object","title":"UpdateStayRequest","description":"``PATCH /carts/{id}/stays/{stay_id}`` body."},"User":{"properties":{"username":{"type":"string","format":"email","title":"Username"},"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"displayname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"register_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Register Date"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified","default":false},"roles":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Roles","default":[]},"profile_pic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Pic"}},"type":"object","required":["username","register_date","profile_pic"],"title":"User"},"UserBookingsResponse":{"properties":{"bookings":{"items":{"$ref":"#/components/schemas/BookingListItem"},"type":"array","title":"Bookings","description":"List of bookings for the user"},"total_count":{"type":"integer","title":"Total Count","description":"Total number of bookings"}},"type":"object","required":["bookings","total_count"],"title":"UserBookingsResponse","description":"Response containing a list of user's bookings."},"UserPasswordReset":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","title":"UserPasswordReset"},"UserProfileUpdate":{"properties":{"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","title":"UserProfileUpdate"},"UserPublic":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","format":"email","title":"Username"},"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"displayname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"register_date":{"type":"string","format":"date-time","title":"Register Date"},"roles":{"items":{},"type":"array","title":"Roles","default":[]},"profile_pic":{"type":"string","title":"Profile Pic"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token","default":""},"pending_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Email"},"mfa_satisfied":{"type":"boolean","title":"Mfa Satisfied","default":false},"mfa_enrolled":{"type":"boolean","title":"Mfa Enrolled","default":false},"mfa_recovery":{"type":"boolean","title":"Mfa Recovery","default":false},"mfa_access_required":{"type":"boolean","title":"Mfa Access Required","default":false}},"type":"object","required":["id","username","register_date","profile_pic"],"title":"UserPublic"},"UserSignUpLocal":{"properties":{"username":{"type":"string","format":"email","title":"Username"},"password":{"type":"string","title":"Password"},"firstname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"},"lastname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"},"displayname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"marketing_email_opt_in":{"type":"boolean","title":"Marketing Email Opt In","default":false},"marketing_email_opt_in_source":{"type":"string","enum":["signup","booking_account_create"],"title":"Marketing Email Opt In Source","default":"signup"},"return_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Url"},"country":{"type":"string","enum":["AU","NZ"],"title":"Country","default":"AU"},"turnstile_token":{"type":"string","title":"Turnstile Token"}},"type":"object","required":["username","password","turnstile_token"],"title":"UserSignUpLocal","description":"Signup model for local users."},"UtcDateWindow":{"properties":{"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"}},"additionalProperties":false,"type":"object","required":["start_date","end_date"],"title":"UtcDateWindow","description":"Resolved inclusive UTC-day window used by all returned metrics."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifiedPropertyBankSummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"bsb_masked":{"type":"string","title":"Bsb Masked","description":"e.g. 'XXX-456'"},"account_number_masked":{"type":"string","title":"Account Number Masked","description":"e.g. '****7890'"},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name"},"account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Name"}},"type":"object","required":["id","name","bsb_masked","account_number_masked"],"title":"VerifiedPropertyBankSummary","description":"Minimal bank summary for the 'copy from' dropdown."},"VersionTags":{"properties":{"properties":{"type":"integer","title":"Properties"},"features":{"type":"integer","title":"Features"},"mgmts":{"type":"integer","title":"Mgmts"},"edited_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Edited Date"}},"type":"object","required":["properties","features","mgmts","edited_date"],"title":"VersionTags","description":"Model for version tags."},"VisibilityToggleRequest":{"properties":{"visibility":{"type":"string","pattern":"^(visible|hidden)$","title":"Visibility","description":"Target visibility: 'visible' or 'hidden'"}},"type":"object","required":["visibility"],"title":"VisibilityToggleRequest","description":"Request to toggle property visibility."},"VisibilityToggleResponse":{"properties":{"property_id":{"type":"integer","title":"Property Id"},"visibility":{"type":"string","title":"Visibility"},"previous_visibility":{"type":"string","title":"Previous Visibility"},"cache_revalidated":{"type":"boolean","title":"Cache Revalidated","default":false},"content_warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Warning"}},"type":"object","required":["property_id","visibility","previous_visibility"],"title":"VisibilityToggleResponse","description":"Response after toggling visibility."},"WebAuthnEnrolBeginRequest":{"properties":{"label":{"type":"string","maxLength":100,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"WebAuthnEnrolBeginRequest","description":"POST body for /auth/mfa/enroll/webauthn/begin."},"WebAuthnEnrolBeginResponse":{"properties":{"method_id":{"type":"integer","title":"Method Id"},"options":{"additionalProperties":true,"type":"object","title":"Options"}},"type":"object","required":["method_id","options"],"title":"WebAuthnEnrolBeginResponse","description":"Body returned by /auth/mfa/enroll/webauthn/begin.\n\n``options`` is the JSON form of ``PublicKeyCredentialCreationOptions``\n— fed straight to ``@simplewebauthn/browser``'s ``startRegistration``."},"WebAuthnEnrolCompleteRequest":{"properties":{"method_id":{"type":"integer","title":"Method Id"},"credential":{"additionalProperties":true,"type":"object","title":"Credential"}},"type":"object","required":["method_id","credential"],"title":"WebAuthnEnrolCompleteRequest","description":"POST body for /auth/mfa/enroll/webauthn/complete.\n\n``credential`` is the JSON object the browser produced during the\nWebAuthn ceremony — opaque to the server schema; the WebAuthn\nlibrary validates its shape."},"WebAuthnEnrolCompleteResponse":{"properties":{"method_id":{"type":"integer","title":"Method Id"},"access_token":{"type":"string","title":"Access Token"},"recovery_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recovery Codes"}},"type":"object","required":["method_id","access_token"],"title":"WebAuthnEnrolCompleteResponse","description":"Body returned by /auth/mfa/enroll/webauthn/complete.\n\nMirrors :class:`TotpVerifyResponse` — fresh access token to lift\na recovery-locked session, plus first-method-only recovery codes."},"WebAuthnLoginBeginRequest":{"properties":{"mfa_challenge_token":{"type":"string","title":"Mfa Challenge Token"}},"type":"object","required":["mfa_challenge_token"],"title":"WebAuthnLoginBeginRequest","description":"POST body for /auth/mfa/login/webauthn/begin.\n\nThe ``mfa_challenge_token`` proves the password step has already\nsucceeded; we lean on it instead of requiring an authenticated\nsession (the whole point of this step is that the user does not\nyet have one)."},"WebAuthnLoginBeginResponse":{"properties":{"options":{"additionalProperties":true,"type":"object","title":"Options"}},"type":"object","required":["options"],"title":"WebAuthnLoginBeginResponse","description":"Body returned by /auth/mfa/login/webauthn/begin.\n\n``options`` is the JSON form of ``PublicKeyCredentialRequestOptions``."},"WebhookCredentialResponse":{"properties":{"msg":{"type":"string","title":"Msg"},"data":{"$ref":"#/components/schemas/WebhookCredentials"}},"type":"object","required":["msg","data"],"title":"WebhookCredentialResponse","description":"Response wrapper for webhook credential endpoints."},"WebhookCredentials":{"properties":{"username":{"type":"string","title":"Username","description":"Webhook username (always visible)"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"Webhook password (only shown on generation, not retrieval)"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When credentials were generated"}},"type":"object","required":["username","created_at"],"title":"WebhookCredentials","description":"Webhook credentials for RMS Channel Management.\n\nRMS requires bidirectional credential exchange:\n- Park provides Client ID + Password to Total Parks (for API calls)\n- Total Parks generates webhook credentials (for incoming ARI pushes)\n- Park enters webhook credentials in RMS Channel Management\n\nNote: password is only returned on generation, not on retrieval (stored as hash)."},"app__schemas__admin__bookings__PMSDiscount":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"amount":{"type":"number","title":"Amount"}},"type":"object","required":["amount"],"title":"PMSDiscount","description":"Discount applied to booking from PMS."},"app__schemas__admin__properties__PMSDiscount":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percentage"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"}},"type":"object","title":"PMSDiscount","description":"Available discount from PMS."},"app__schemas__park_admin__onboarding__OnboardingStatus":{"type":"string","enum":["not_started","in_progress","complete"],"title":"OnboardingStatus","description":"Overall onboarding status."},"app__schemas__park_claim_request__PMSType":{"type":"string","enum":["newbook","rms","other","none"],"title":"PMSType","description":"Property Management System types."},"app__schemas__property__property_pms_config__OnboardingStatus":{"type":"string","enum":["pending","validating","fetching_metadata","triggering_ari","awaiting_rms_config","awaiting_data","verifying","complete","failed"],"title":"OnboardingStatus","description":"Onboarding pipeline status states."},"app__schemas__property__property_pms_config__PMSType":{"type":"string","enum":["newbook","rms"],"title":"PMSType","description":"Supported Property Management System types."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}},"parameters":{"ApiVersion":{"name":"API-Version","in":"header","required":false,"description":"Major API version. Omit or send 1 for the current v1 surface. Retired operations use RFC 9745 Deprecation and RFC 8594 Sunset headers.","schema":{"type":"string","enum":["1"],"default":"1"}}}},"servers":[{"url":"http://localhost:8000","description":"Total Parks Public API"}]}