{"openapi":"3.1.0","info":{"title":"Cohost External API","description":"External / Third-Party API for Cohost.\n\n## Authentication\n\n### API Key (X-API-Key)\nRequired for all `/api/v1/external/*` endpoints.\nUsed by partner backend to manage customers, listings, and bookings.\nContact Cohost team to obtain your API key.\n\n### JWT Bearer Token\nRequired for customer-facing endpoints in internal API:\n- `/api/v1/checkout/*` - Booking preview and confirmation\n- `/api/v1/bookings/*` - Get customer bookings\n- `/api/v1/auth/me` - Get customer profile\n\n**How to get JWT token:**\n1. Customer logs in via `POST /api/v1/external/customers/login`\n2. Response contains `access_token` (JWT)\n3. Use `Authorization: Bearer <access_token>` header\n\n**Important:** Customer must verify email before creating bookings.\n\nSee security schemes below for details.","version":"1.0.0"},"paths":{"/api/v1/external/customers/login":{"post":{"tags":["customers"],"summary":"Customer Login","description":"Login customer via Auth0.\n\nPartner backend can use this endpoint to authenticate customer on their behalf.\nCustomer must be registered and belong to at least one team in the API token.\n\n**Authentication:**\n- This endpoint requires API Key (X-API-Key header)\n- Returns JWT Bearer token (`access_token`) for customer to use with internal API\n\n**Flow:**\n1. Validate customer credentials with Auth0\n2. Check customer belongs to teams in API token\n3. Return JWT token for customer to use with Cohost API\n\n**Response:**\n- `access_token`: JWT token to use with `Authorization: Bearer <token>` header\n- `id_token`: Identity token (optional)\n- `expires_in`: Token expiration time in seconds\n- `user_id`, `email`, `full_name`, `teams`: Customer information\n\n**Next Steps:**\nAfter login, customer can use the `access_token` to call:\n- `POST /api/v1/checkout/preview` - Preview booking price\n- `POST /api/v1/checkout/confirm` - Create booking (requires verified email)\n- `GET /api/v1/bookings/my` - Get customer bookings\n- `GET /api/v1/auth/me` - Get customer profile\n\n**Note:** Customer must verify email before creating bookings.\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"customer_login_api_v1_external_customers_login_post","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerLoginRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerLoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/customers/register":{"post":{"tags":["customers"],"summary":"Register Customer","description":"Register a new customer for partner.\n\nUser will be created in Auth0 and added to all teams in the API token.\nAn email verification will be sent to the customer.\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"register_customer_api_v1_external_customers_register_post","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerRegisterRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/customers":{"get":{"tags":["customers"],"summary":"List Customers","description":"List customers for partner.\n\nReturns only customers that belong to teams in the API token.\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"list_customers_api_v1_external_customers_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/customers/{user_id}":{"get":{"tags":["customers"],"summary":"Get Customer","description":"Get customer detail.\n\nReturns customer info only if they belong to at least one team in the API token.\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"get_customer_api_v1_external_customers__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]},"patch":{"tags":["customers"],"summary":"Update Customer","description":"Update customer info.\n\nOnly full_name and phone can be updated.\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"update_customer_api_v1_external_customers__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/customers/{user_id}/teams/{team_id}":{"delete":{"tags":["customers"],"summary":"Remove Customer From Team","description":"Remove customer from a specific team.\n\nDoes not delete the user, only removes the team membership.\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"remove_customer_from_team_api_v1_external_customers__user_id__teams__team_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/customers/{user_id}/resend-verification":{"post":{"tags":["customers"],"summary":"Resend Verification","description":"Resend verification email to customer.\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"resend_verification_api_v1_external_customers__user_id__resend_verification_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/customers/{user_id}/email-verification":{"get":{"tags":["customers"],"summary":"Check Customer Email Verification","description":"Check customer email verification status.\n\nReturns email verification status directly from Auth0, not from database.\nThis ensures the status is always up-to-date.\n\n**Response:**\n- `email_verified`: Whether email is verified in Auth0\n- `has_auth0_account`: Whether customer has Auth0 account\n\n**Use cases:**\n- Check if customer can create bookings (requires verified email)\n- Display verification status in partner portal\n- Trigger email verification flow if needed\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"check_customer_email_verification_api_v1_external_customers__user_id__email_verification_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerEmailVerificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/listings":{"get":{"tags":["listings"],"summary":"Get Listings","description":"Get listings for teams allowed by API token.\n\nSupports advanced filtering by location (lat/lng/radius), availability dates,\namenities, price range, property type, capacity, and sorting.\n\nReturns paginated results with metadata when advanced filters are used.","operationId":"get_listings_api_v1_external_listings_get","parameters":[{"name":"team_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional JSON array of team IDs to filter. Format: '[1,2,3]'. If not provided, returns listings from all teams managed by the token.","title":"Team Ids"},"description":"Optional JSON array of team IDs to filter. Format: '[1,2,3]'. If not provided, returns listings from all teams managed by the token."},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by listing state (DRAFT, ACTIVE, INACTIVE, SUSPENDED)","title":"State"},"description":"Filter by listing state (DRAFT, ACTIVE, INACTIVE, SUSPENDED)"},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by country code (e.g., VN)","title":"Country Code"},"description":"Filter by country code (e.g., VN)"},{"name":"province_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by province code (e.g., HCM, HN)","title":"Province Code"},"description":"Filter by province code (e.g., HCM, HN)"},{"name":"latitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"string"},{"type":"null"}],"description":"Center latitude for proximity search","title":"Latitude"},"description":"Center latitude for proximity search"},{"name":"longitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"string"},{"type":"null"}],"description":"Center longitude for proximity search","title":"Longitude"},"description":"Center longitude for proximity search"},{"name":"radius","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"description":"Search radius in km (default: 5km when lat/lng provided)","title":"Radius"},"description":"Search radius in km (default: 5km when lat/lng provided)"},{"name":"check_in_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter listings available from this date (YYYY-MM-DD)","title":"Check In Date"},"description":"Filter listings available from this date (YYYY-MM-DD)"},{"name":"check_out_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter listings available until this date (YYYY-MM-DD)","title":"Check Out Date"},"description":"Filter listings available until this date (YYYY-MM-DD)"},{"name":"amenity_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated amenity IDs. Listings must have ALL specified amenities. Example: '1,5,12'","title":"Amenity Ids"},"description":"Comma-separated amenity IDs. Listings must have ALL specified amenities. Example: '1,5,12'"},{"name":"min_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"description":"Minimum nightly rate","title":"Min Price"},"description":"Minimum nightly rate"},{"name":"max_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"description":"Maximum nightly rate","title":"Max Price"},"description":"Maximum nightly rate"},{"name":"listing_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Listing type (e.g., ENTIRE_PLACE, PRIVATE_ROOM, SHARED_ROOM)","title":"Listing Type"},"description":"Listing type (e.g., ENTIRE_PLACE, PRIVATE_ROOM, SHARED_ROOM)"},{"name":"min_capacity","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Minimum guest capacity","title":"Min Capacity"},"description":"Minimum guest capacity"},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum number of bedrooms","title":"Min Bedrooms"},"description":"Minimum number of bedrooms"},{"name":"min_bathrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum number of bathrooms","title":"Min Bathrooms"},"description":"Minimum number of bathrooms"},{"name":"instant_book","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by instant book enabled","title":"Instant Book"},"description":"Filter by instant book enabled"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort by: price_asc, price_desc, rating_desc, distance_asc, newest","title":"Sort By"},"description":"Sort by: price_asc, price_desc, rating_desc, distance_asc, newest"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100)","default":20,"title":"Limit"},"description":"Items per page (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/listings/{listing_id}":{"get":{"tags":["listings"],"summary":"Get Listing Detail","description":"Get listing detail.","operationId":"get_listing_detail_api_v1_external_listings__listing_id__get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingWithDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/listings/slug/{slug}":{"get":{"tags":["listings"],"summary":"Get Listing Detail By Slug","description":"Get listing detail by slug.","operationId":"get_listing_detail_by_slug_api_v1_external_listings_slug__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingWithDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/listings/{listing_id}/availability":{"get":{"tags":["listings"],"summary":"Get Listing Availability","description":"Get availability slots for a listing within date range.","operationId":"get_listing_availability_api_v1_external_listings__listing_id__availability_get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/listings/slug/{slug}/availability":{"get":{"tags":["listings"],"summary":"Get Listing Availability By Slug","description":"Get availability slots for a listing within date range by slug.","operationId":"get_listing_availability_by_slug_api_v1_external_listings_slug__slug__availability_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/bookings/preview":{"post":{"tags":["bookings"],"summary":"Preview External Booking","description":"Preview pricing for a booking — no login required, API Key auth only.\n\nUses the same PricingCalculatorService as internal checkout preview,\nensuring consistent pricing between partner and direct bookings.\n\n**Authentication:** X-API-Key header (no Bearer token needed)\n\n**What it does:**\n1. Validates listing belongs to the token's teams\n2. Checks availability (with parent-child logic)\n3. Calculates price breakdown using all pricing rules\n4. Returns full breakdown without creating any booking\n\n**Pricing priority:**\nCombo > Night Short > Hourly > Daily > Standard Nightly\n\n**Note:** After login, customers use JWT Bearer token (from `access_token` in response) to call booking endpoints in internal API (`/api/v1/checkout/*`, `/api/v1/bookings/*`).","operationId":"preview_external_booking_api_v1_external_bookings_preview_post","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalBookingPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalBookingPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/bookings":{"post":{"tags":["bookings"],"summary":"Create External Booking","description":"Create booking from Third-Party API.\n\nTeam ID is automatically determined from the listing.\nListing must belong to one of the teams managed by the token.","operationId":"create_external_booking_api_v1_external_bookings_post","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalBookingCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReservationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]},"get":{"tags":["bookings"],"summary":"List External Bookings","description":"List bookings for allowed team(s).","operationId":"list_external_bookings_api_v1_external_bookings_get","parameters":[{"name":"team_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional JSON array of team IDs to filter. Format: '[1,2,3]'. If not provided, returns bookings from all teams managed by the token.","title":"Team Ids"},"description":"Optional JSON array of team IDs to filter. Format: '[1,2,3]'. If not provided, returns bookings from all teams managed by the token."},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional customer ID to filter bookings. Customer must belong to at least one team in the token.","title":"User Id"},"description":"Optional customer ID to filter bookings. Customer must belong to at least one team in the token."},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReservationResponse"},"title":"Response List External Bookings Api V1 External Bookings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/bookings/{booking_id}":{"get":{"tags":["bookings"],"summary":"Get External Booking Detail","description":"Get booking detail.","operationId":"get_external_booking_detail_api_v1_external_bookings__booking_id__get","parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"integer","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReservationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/catalogs":{"get":{"tags":["reference"],"summary":"Get Catalogs","description":"Get reference catalogs (view types, listing types, property types, etc.).\n\nUse this to discover valid codes for listing_type, view_types, and\nproperty_type filters. Each catalog item has a 'code' field that can be\nused as a filter value.\n\n**Common catalog_type values:**\n- `view_type` — View types (sea, city, garden, mountain, ...)\n- `listing_type` — Listing types (ENTIRE_PLACE, PRIVATE_ROOM, ...)\n- `property_type` — Property types (apartment, villa, house, ...)\n- `additional_area` — Additional areas (garden, balcony, pool, ...)","operationId":"get_catalogs_api_v1_external_catalogs_get","parameters":[{"name":"catalog_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by catalog type. Common types: 'view_type' (sea view, city view, ...), 'listing_type' (entire place, private room, ...), 'property_type' (apartment, villa, ...), 'additional_area' (garden, pool, ...). Omit to get all catalog types.","title":"Catalog Type"},"description":"Filter by catalog type. Common types: 'view_type' (sea view, city view, ...), 'listing_type' (entire place, private room, ...), 'property_type' (apartment, villa, ...), 'additional_area' (garden, pool, ...). Omit to get all catalog types."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/amenities":{"get":{"tags":["reference"],"summary":"Get Amenities","description":"Get all amenities grouped by category.\n\nUse this to discover available amenity IDs for the `amenity_ids` filter\non the listings endpoint. Each amenity item has an 'id' and 'name'.\n\nResponse is organized by category (e.g., \"General\", \"Kitchen\", \"Safety\", etc.)\nwith each category containing a list of amenity items.","operationId":"get_amenities_api_v1_external_amenities_get","parameters":[],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AmenityCategoryResponse"},"title":"Response Get Amenities Api V1 External Amenities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/locations/countries":{"get":{"tags":["reference"],"summary":"List Countries","description":"Get list of supported countries.\n\nUse country codes (e.g., 'VN') in the `country_code` filter on the listings endpoint.","operationId":"list_countries_api_v1_external_locations_countries_get","parameters":[],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CountryResponse"},"title":"Response List Countries Api V1 External Locations Countries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}},"/api/v1/external/locations/{country_code}/provinces":{"get":{"tags":["reference"],"summary":"List Provinces","description":"Get provinces/cities for a country.\n\nUse province codes (e.g., 'HCM', 'HN') in the `province_code` filter\non the listings endpoint.","operationId":"list_provinces_api_v1_external_locations__country_code__provinces_get","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search provinces by name or code","title":"Q"},"description":"Search provinces by name or code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProvinceResponse"},"title":"Response List Provinces Api V1 External Locations  Country Code  Provinces Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ExternalApiKey":[]}]}}},"components":{"schemas":{"AmenityCategoryGroupResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"root_id":{"type":"integer","title":"Root Id"},"index_amenities":{"type":"integer","title":"Index Amenities"},"amenities":{"items":{"$ref":"#/components/schemas/ListingAmenityWithDetailsResponse"},"type":"array","title":"Amenities","default":[]}},"type":"object","required":["id","name","code","root_id","index_amenities"],"title":"AmenityCategoryGroupResponse","description":"Schema for amenity category group with listing amenities."},"AmenityCategoryResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"root_id":{"type":"integer","title":"Root Id"},"index_amenities":{"type":"integer","title":"Index Amenities"},"items":{"items":{"$ref":"#/components/schemas/AmenityItem"},"type":"array","title":"Items","default":[]}},"type":"object","required":["id","name","code","root_id","index_amenities"],"title":"AmenityCategoryResponse","description":"Schema for amenity category with nested items."},"AmenityItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"index_amenities":{"type":"integer","title":"Index Amenities"},"is_necessary":{"type":"boolean","title":"Is Necessary"}},"type":"object","required":["id","name","index_amenities","is_necessary"],"title":"AmenityItem","description":"Schema for amenity item within category."},"ApiTokenCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"team_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Team Ids"},"scopes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Scopes"},"rate_limit_per_minute":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Rate Limit Per Minute","default":60},"ip_whitelist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ip Whitelist"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By"}},"type":"object","required":["name","team_ids","scopes"],"title":"ApiTokenCreate","description":"Payload for creating API token."},"ApiTokenResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"team_ids":{"items":{"type":"integer"},"type":"array","title":"Team Ids"},"team_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Team Names","description":"Team names corresponding to team_ids"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"rate_limit_per_minute":{"type":"integer","title":"Rate Limit Per Minute"},"ip_whitelist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ip Whitelist"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"status":{"$ref":"#/components/schemas/ApiTokenStatusEnum"},"created_by":{"type":"integer","title":"Created By"},"creator_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Name","description":"Full name of the token creator"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token","description":"Plain token, returned only on creation"}},"type":"object","required":["id","name","team_ids","scopes","rate_limit_per_minute","status","created_by","created_at","updated_at"],"title":"ApiTokenResponse","description":"Response schema for API token (includes plain token on creation)."},"ApiTokenRevealResponse":{"properties":{"token":{"type":"string","title":"Token","description":"Plain API token"}},"type":"object","required":["token"],"title":"ApiTokenRevealResponse","description":"Response schema for revealing a plain token."},"ApiTokenStatusEnum":{"type":"string","enum":["ACTIVE","SUSPENDED","REVOKED"],"title":"ApiTokenStatusEnum","description":"Lifecycle state of an API token."},"ApiTokenUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"team_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","minItems":1},{"type":"null"}],"title":"Team Ids"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Scopes"},"rate_limit_per_minute":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Rate Limit Per Minute"},"ip_whitelist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ip Whitelist"}},"type":"object","title":"ApiTokenUpdate","description":"Payload for updating API token."},"AuthLoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"AuthLoginRequest","description":"Schema request for login with email & password (Auth0)."},"AuthLoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"},"expires_in":{"type":"integer","title":"Expires In"},"id_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Token"},"user":{"$ref":"#/components/schemas/UserResponse"}},"type":"object","required":["access_token","token_type","expires_in","user"],"title":"AuthLoginResponse","description":"Schema response for login API."},"AutoMessageRuleAnchorEnum":{"type":"string","enum":["EVENT_TIME","CHECK_IN","CHECK_OUT"],"title":"AutoMessageRuleAnchorEnum","description":"Enum for auto message rule anchor point."},"AutoMessageRuleCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name","description":"Rule name"},"anchor":{"$ref":"#/components/schemas/AutoMessageRuleAnchorEnum","description":"Anchor point (EVENT_TIME, CHECK_IN, CHECK_OUT)"},"scope":{"$ref":"#/components/schemas/AutoMessageRuleScopeEnum","description":"Scope (GLOBAL, TEAM, LISTING)"},"tactics":{"additionalProperties":true,"type":"object","title":"Tactics","description":"Send strategy configuration (JSON)"},"receivers":{"additionalProperties":true,"type":"object","title":"Receivers","description":"List of receivers (JSON array)"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (NULL for global rule)"},"state":{"$ref":"#/components/schemas/AutoMessageRuleStateEnum","description":"Rule state","default":"ENABLED"}},"type":"object","required":["name","anchor","scope","tactics","receivers"],"title":"AutoMessageRuleCreate","description":"Schema for creating a new AutoMessageRule."},"AutoMessageRuleListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AutoMessageRuleResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AutoMessageRuleListResponse","description":"Schema for list of AutoMessageRules."},"AutoMessageRuleResponse":{"properties":{"id":{"type":"integer","title":"Id"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"name":{"type":"string","title":"Name"},"anchor":{"$ref":"#/components/schemas/AutoMessageRuleAnchorEnum"},"scope":{"$ref":"#/components/schemas/AutoMessageRuleScopeEnum"},"tactics":{"additionalProperties":true,"type":"object","title":"Tactics"},"receivers":{"additionalProperties":true,"type":"object","title":"Receivers"},"state":{"$ref":"#/components/schemas/AutoMessageRuleStateEnum"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","anchor","scope","tactics","receivers","state","created_at","updated_at"],"title":"AutoMessageRuleResponse","description":"Schema for AutoMessageRule response."},"AutoMessageRuleScopeEnum":{"type":"string","enum":["GLOBAL","TEAM","LISTING"],"title":"AutoMessageRuleScopeEnum","description":"Enum for auto message rule scope."},"AutoMessageRuleStateEnum":{"type":"string","enum":["ENABLED","DISABLED"],"title":"AutoMessageRuleStateEnum","description":"Enum for auto message rule state."},"AutoMessageRuleUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name","description":"Rule name"},"anchor":{"anyOf":[{"$ref":"#/components/schemas/AutoMessageRuleAnchorEnum"},{"type":"null"}],"description":"Anchor point"},"scope":{"anyOf":[{"$ref":"#/components/schemas/AutoMessageRuleScopeEnum"},{"type":"null"}],"description":"Scope"},"tactics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tactics","description":"Send strategy configuration"},"receivers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Receivers","description":"List of receivers"},"state":{"anyOf":[{"$ref":"#/components/schemas/AutoMessageRuleStateEnum"},{"type":"null"}],"description":"Rule state"}},"type":"object","title":"AutoMessageRuleUpdate","description":"Schema for updating AutoMessageRule."},"AvailabilityResponse":{"properties":{"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reservation Id"},"date":{"type":"string","format":"date","title":"Date"},"start_at":{"type":"string","format":"date-time","title":"Start At"},"end_at":{"type":"string","format":"date-time","title":"End At"},"state":{"$ref":"#/components/schemas/AvailabilityStateEnum"},"locked_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Locked Until"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","listing_id","date","start_at","end_at","state"],"title":"AvailabilityResponse","description":"Response schema for ListingAvailability."},"AvailabilityStateEnum":{"type":"string","enum":["AVAILABLE","BLOCKED","BOOKED","SOFT_LOCK"],"title":"AvailabilityStateEnum","description":"Enum for availability state."},"BelongToEnum":{"type":"string","enum":["HOST","COHOST","BOTH"],"title":"BelongToEnum","description":"Enum for revenue ownership."},"BlockRequest":{"properties":{"date":{"type":"string","format":"date","title":"Date","description":"Block date"},"start_at":{"type":"string","format":"date-time","title":"Start At","description":"Start time"},"end_at":{"type":"string","format":"date-time","title":"End At","description":"End time"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Block note"}},"type":"object","required":["date","start_at","end_at"],"title":"BlockRequest","description":"Request body to block a time period."},"Body_upload_file_api_v1_uploads_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"File to upload"}},"type":"object","required":["file"],"title":"Body_upload_file_api_v1_uploads_post"},"Body_upload_multiple_files_api_v1_uploads_multiple_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Files to upload"}},"type":"object","required":["files"],"title":"Body_upload_multiple_files_api_v1_uploads_multiple_post"},"Body_upload_verification_documents_api_v1_identity_verifications_upload_post":{"properties":{"front_image":{"type":"string","format":"binary","title":"Front Image"},"back_image":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Back Image"},"selfie_image":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Selfie Image"}},"type":"object","required":["front_image"],"title":"Body_upload_verification_documents_api_v1_identity_verifications_upload_post"},"BookingConfirmRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BookingItem"},"type":"array","minItems":1,"title":"Items"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"payment_method":{"type":"string","maxLength":50,"title":"Payment Method"},"payment_gateway_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Gateway Token"},"guest_info":{"anyOf":[{"$ref":"#/components/schemas/HostGuestInfo"},{"type":"null"}]}},"type":"object","required":["items","payment_method"],"title":"BookingConfirmRequest","description":"Schema for booking confirm request."},"BookingConfirmResponse":{"properties":{"master_reservation_id":{"type":"integer","title":"Master Reservation Id"},"reservations":{"items":{"$ref":"#/components/schemas/ReservationResponse"},"type":"array","title":"Reservations"},"payment_status":{"$ref":"#/components/schemas/PaymentStatusEnum"},"payment_transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Transaction Id"},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url","description":"URL to redirect user to payment gateway"}},"type":"object","required":["master_reservation_id","reservations","payment_status"],"title":"BookingConfirmResponse","description":"Schema for booking confirm response."},"BookingItem":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check Out Time"},"guest_number":{"type":"integer","minimum":1.0,"title":"Guest Number"},"adult_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Adult Number","description":"Number of adult guests (for extra fee calculation)"},"children_number":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Children Number","description":"Number of children guests (for extra fee calculation)","default":0},"rooms":{"type":"integer","minimum":1.0,"title":"Rooms","default":1},"combo_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Combo Id","description":"Selected combo ID to apply"},"extra_service_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Extra Service Ids","description":"List of extra service IDs to include"}},"type":"object","required":["listing_id","check_in_date","check_out_date","guest_number"],"title":"BookingItem","description":"Schema for an item in booking request (a listing with dates).\n\nNote: Discounts (last-minute, monthly) are controlled by Listing configuration,\nnot by request parameters."},"BookingItemPreview":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"listing_name":{"type":"string","title":"Listing Name"},"check_in_date":{"type":"string","title":"Check In Date"},"check_out_date":{"type":"string","title":"Check Out Date"},"nights":{"type":"integer","title":"Nights"},"guest_number":{"type":"integer","title":"Guest Number"},"adult_number":{"type":"integer","title":"Adult Number","default":0},"children_number":{"type":"integer","title":"Children Number","default":0},"pricing_type":{"type":"string","title":"Pricing Type"},"base_price":{"type":"string","title":"Base Price"},"combo_price":{"type":"string","title":"Combo Price","default":"0"},"hourly_price":{"type":"string","title":"Hourly Price","default":"0"},"daily_price":{"type":"string","title":"Daily Price","default":"0"},"night_short_discount":{"type":"string","title":"Night Short Discount","default":"0"},"last_minute_discount":{"type":"string","title":"Last Minute Discount","default":"0"},"monthly_discount":{"type":"string","title":"Monthly Discount","default":"0"},"total_discount":{"type":"string","title":"Total Discount"},"extra_guest_fee":{"type":"string","title":"Extra Guest Fee","default":"0"},"extra_adult_fee":{"type":"string","title":"Extra Adult Fee","default":"0"},"extra_child_fee":{"type":"string","title":"Extra Child Fee","default":"0"},"cleaning_fee":{"type":"string","title":"Cleaning Fee","default":"0"},"extra_services_total":{"type":"string","title":"Extra Services Total","default":"0"},"extra_services":{"items":{"$ref":"#/components/schemas/ExtraServicePreview"},"type":"array","title":"Extra Services"},"earning":{"type":"string","title":"Earning"},"deposit":{"type":"string","title":"Deposit","default":"0"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["listing_id","listing_name","check_in_date","check_out_date","nights","guest_number","pricing_type","base_price","total_discount","earning","currency"],"title":"BookingItemPreview","description":"Schema for a single item in booking preview response."},"BookingPreviewResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BookingItemPreview"},"type":"array","title":"Items","description":"Details of each item with full pricing breakdown"},"total_nights":{"type":"integer","title":"Total Nights"},"total_earning":{"type":"string","title":"Total Earning"},"total_discount":{"type":"string","title":"Total Discount"},"total_extra_guest_fee":{"type":"string","title":"Total Extra Guest Fee","default":"0"},"total_cleaning_fee":{"type":"string","title":"Total Cleaning Fee","default":"0"},"total_extra_services":{"type":"string","title":"Total Extra Services","default":"0"},"total_deposit":{"type":"string","title":"Total Deposit"},"currency":{"type":"string","title":"Currency"},"estimated_total":{"type":"string","title":"Estimated Total"}},"type":"object","required":["items","total_nights","total_earning","total_discount","total_deposit","currency","estimated_total"],"title":"BookingPreviewResponse","description":"Schema for booking preview (price calculation before confirmation)."},"BookingRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BookingItem"},"type":"array","minItems":1,"title":"Items","description":"List of listings to book"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"payment_method":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Payment Method"}},"type":"object","required":["items"],"title":"BookingRequest","description":"Schema for booking request (can have multiple items - combo booking)."},"CartItem":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"check_in_date":{"type":"string","title":"Check In Date","description":"YYYY-MM-DD"},"check_out_date":{"type":"string","title":"Check Out Date","description":"YYYY-MM-DD"},"check_in_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In Time","description":"HH:MM:SS"},"check_out_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out Time","description":"HH:MM:SS"},"guest_number":{"type":"integer","minimum":1.0,"title":"Guest Number","default":1},"price":{"type":"number","minimum":0.0,"title":"Price"}},"type":"object","required":["listing_id","check_in_date","check_out_date","price"],"title":"CartItem","description":"Schema for cart item."},"CartItemCreate":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"check_in_date":{"type":"string","title":"Check In Date","description":"YYYY-MM-DD"},"check_out_date":{"type":"string","title":"Check Out Date","description":"YYYY-MM-DD"},"check_in_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In Time","description":"HH:MM:SS"},"check_out_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out Time","description":"HH:MM:SS"},"guest_number":{"type":"integer","minimum":1.0,"title":"Guest Number","default":1},"price":{"type":"number","minimum":0.0,"title":"Price"}},"type":"object","required":["listing_id","check_in_date","check_out_date","price"],"title":"CartItemCreate","description":"Schema for adding item to cart."},"CartItemUpdate":{"properties":{"check_in_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In Date"},"check_out_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out Date"},"check_in_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check Out Time"},"guest_number":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Guest Number"},"price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price"}},"type":"object","title":"CartItemUpdate","description":"Schema for updating cart item."},"CartResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CartItem"},"type":"array","title":"Items"},"total_price":{"type":"number","title":"Total Price"},"item_count":{"type":"integer","title":"Item Count"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["items","total_price","item_count"],"title":"CartResponse","description":"Schema for cart response."},"CashierEnum":{"type":"string","enum":["HOST","COHOST"],"title":"CashierEnum","description":"Enum for cashier (receiver/payer)."},"CatalogListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CatalogResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"CatalogListResponse","description":"Schema for list of Catalogs."},"CatalogResponse":{"properties":{"id":{"type":"integer","title":"Id"},"catalog_type":{"type":"string","title":"Catalog Type","description":"Catalog type (property_type, listing_type, etc.)"},"code":{"type":"string","title":"Code","description":"Unique code within catalog_type"},"name_vi":{"type":"string","title":"Name Vi","description":"Vietnamese name"},"name_en":{"type":"string","title":"Name En","description":"English name"},"description_vi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description Vi","description":"Vietnamese description"},"description_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description En","description":"English description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"Icon class/URL"},"display_order":{"type":"integer","title":"Display Order","description":"Display order"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether catalog item is active"},"extra_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra Metadata","description":"Additional metadata"}},"type":"object","required":["id","catalog_type","code","name_vi","name_en","display_order","is_active"],"title":"CatalogResponse","description":"Schema for Catalog response."},"ChannelCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"type":{"$ref":"#/components/schemas/ChannelTypeEnum","default":"INTERNAL"},"listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Id"},"reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reservation Id"},"team_id":{"type":"integer","title":"Team Id"},"member_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Member Ids","description":"List of user IDs to add to channel"}},"type":"object","required":["name","team_id"],"title":"ChannelCreate","description":"Schema for creating a new channel."},"ChannelMemberCreate":{"properties":{"user_id":{"type":"integer","title":"User Id"}},"type":"object","required":["user_id"],"title":"ChannelMemberCreate","description":"Schema for adding member to channel."},"ChannelMemberResponse":{"properties":{"state":{"$ref":"#/components/schemas/ChannelMemberStateEnum","default":"JOINED"},"id":{"type":"integer","title":"Id"},"channel_id":{"type":"integer","title":"Channel Id"},"user_id":{"type":"integer","title":"User Id"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","channel_id","user_id","joined_at","created_at"],"title":"ChannelMemberResponse","description":"Schema for returning channel member data."},"ChannelMemberStateEnum":{"type":"string","enum":["JOINED","LEFT","REMOVED"],"title":"ChannelMemberStateEnum","description":"Enum for channel member state."},"ChannelResponse":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"type":{"$ref":"#/components/schemas/ChannelTypeEnum","default":"INTERNAL"},"listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Id"},"reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reservation Id"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"state":{"$ref":"#/components/schemas/ChannelStateEnum"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","id","team_id","state","created_at","updated_at"],"title":"ChannelResponse","description":"Schema for returning channel data."},"ChannelStateEnum":{"type":"string","enum":["ACTIVE","ARCHIVED"],"title":"ChannelStateEnum","description":"Enum for channel state."},"ChannelTypeEnum":{"type":"string","enum":["INTERNAL","EXTERNAL","SUPPORT"],"title":"ChannelTypeEnum","description":"Enum for channel type."},"ChannelUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"state":{"anyOf":[{"$ref":"#/components/schemas/ChannelStateEnum"},{"type":"null"}]}},"type":"object","title":"ChannelUpdate","description":"Schema for updating channel."},"ChannelWithDetails":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"type":{"$ref":"#/components/schemas/ChannelTypeEnum","default":"INTERNAL"},"listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Id"},"reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reservation Id"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"state":{"$ref":"#/components/schemas/ChannelStateEnum"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"members":{"items":{"$ref":"#/components/schemas/ChannelMemberResponse"},"type":"array","title":"Members","default":[]},"last_message":{"anyOf":[{"$ref":"#/components/schemas/MessageResponse"},{"type":"null"}]},"unread_count":{"type":"integer","title":"Unread Count","default":0}},"type":"object","required":["name","id","team_id","state","created_at","updated_at"],"title":"ChannelWithDetails","description":"Schema for channel with related data."},"ChargeUnitEnum":{"type":"string","enum":["PER_BOOKING","PER_NIGHT","PER_HOUR","PACKAGE","PER_MONTH"],"title":"ChargeUnitEnum","description":"Enum for pricing calculation method."},"CheckinMethodEnum":{"type":"string","enum":["SELF_CHECKIN","HOST_CHECKIN","BOTH"],"title":"CheckinMethodEnum","description":"Enum for check-in method."},"Combo":{"properties":{"combo_id":{"type":"string","title":"Combo Id","description":"Combo ID (generated)"},"items":{"items":{"$ref":"#/components/schemas/ComboItem"},"type":"array","minItems":2,"title":"Items","description":"List of listings in combo"},"total_price":{"type":"string","title":"Total Price","description":"Total price of combo"},"total_discount":{"type":"string","title":"Total Discount","description":"Total discount"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"center_latitude":{"type":"string","title":"Center Latitude","description":"Center latitude of combo"},"center_longitude":{"type":"string","title":"Center Longitude","description":"Center longitude of combo"},"average_distance":{"type":"string","title":"Average Distance","description":"Average distance between listings"}},"type":"object","required":["combo_id","items","total_price"],"title":"Combo","description":"Schema for combo (multiple nearby listings)."},"ComboItem":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"listing_name":{"type":"string","title":"Listing Name"},"listing_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Image Url"},"distance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Distance"},"price":{"type":"string","title":"Price"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["listing_id","listing_name","price","currency"],"title":"ComboItem","description":"Schema for an item in combo."},"ComboPriceCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name","description":"Display name, e.g. 'Combo qua dem 21h-9h'"},"start_time":{"type":"string","format":"time","title":"Start Time","description":"Start of combo window"},"end_time":{"type":"string","format":"time","title":"End Time","description":"End of combo window"},"original_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Original Price","description":"Reference price shown as strikethrough"},"discounted_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Discounted Price","description":"Actual price charged"},"combo_type":{"$ref":"#/components/schemas/ComboTypeEnum","description":"Category of combo","default":"other"},"priority":{"type":"integer","minimum":0.0,"title":"Priority","description":"Higher = applied first when multiple combos match","default":0},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","start_time","end_time","original_price","discounted_price"],"title":"ComboPriceCreate","description":"Schema for creating a new combo price."},"ComboPriceResponse":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name","description":"Display name, e.g. 'Combo qua dem 21h-9h'"},"start_time":{"type":"string","format":"time","title":"Start Time","description":"Start of combo window"},"end_time":{"type":"string","format":"time","title":"End Time","description":"End of combo window"},"original_price":{"type":"string","title":"Original Price","description":"Reference price shown as strikethrough"},"discounted_price":{"type":"string","title":"Discounted Price","description":"Actual price charged"},"combo_type":{"$ref":"#/components/schemas/ComboTypeEnum","description":"Category of combo","default":"other"},"priority":{"type":"integer","minimum":0.0,"title":"Priority","description":"Higher = applied first when multiple combos match","default":0},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","start_time","end_time","original_price","discounted_price","id","listing_id","created_at","updated_at"],"title":"ComboPriceResponse","description":"Schema for combo price API responses."},"ComboPriceUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"start_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"End Time"},"original_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Original Price"},"discounted_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Discounted Price"},"combo_type":{"anyOf":[{"$ref":"#/components/schemas/ComboTypeEnum"},{"type":"null"}]},"priority":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Priority"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"ComboPriceUpdate","description":"Schema for partially updating a combo price."},"ComboTypeEnum":{"type":"string","enum":["overnight","day_use","hourly_block","other"],"title":"ComboTypeEnum"},"CommissionRequest":{"properties":{"commission_rate":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"string"}],"title":"Commission Rate","description":"Commission rate (0.20 or 0.15)"}},"type":"object","required":["commission_rate"],"title":"CommissionRequest","description":"Schema for setting commission rate.\n\nCommission rate must be either 0.20 (20%) or 0.15 (15%)."},"CountryResponse":{"properties":{"code":{"type":"string","maxLength":2,"minLength":2,"title":"Code"},"name_en":{"type":"string","title":"Name En"},"native_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Native Name"},"currency":{"type":"string","title":"Currency"},"default_timezone":{"type":"string","title":"Default Timezone"}},"type":"object","required":["code","name_en","currency","default_timezone"],"title":"CountryResponse","description":"Schema for country data."},"CustomerEmailVerificationResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"email_verified":{"type":"boolean","title":"Email Verified","description":"Whether email is verified in Auth0"},"has_auth0_account":{"type":"boolean","title":"Has Auth0 Account","description":"Whether customer has Auth0 account"}},"type":"object","required":["user_id","email","email_verified","has_auth0_account"],"title":"CustomerEmailVerificationResponse","description":"Schema for customer email verification status response."},"CustomerListItem":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"teams":{"items":{"type":"integer"},"type":"array","title":"Teams"},"verified":{"type":"boolean","title":"Verified"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["user_id","email","full_name","teams","verified","created_at"],"title":"CustomerListItem","description":"Schema for customer in list response."},"CustomerListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CustomerListItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"CustomerListResponse","description":"Schema for customer list response."},"CustomerLoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"CustomerLoginRequest","description":"Schema for customer login request."},"CustomerLoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"},"expires_in":{"type":"integer","title":"Expires In"},"id_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Token"},"user":{"$ref":"#/components/schemas/UserResponse"},"customer_teams":{"items":{"type":"integer"},"type":"array","title":"Customer Teams","description":"List of team IDs where user is a customer"}},"type":"object","required":["access_token","token_type","expires_in","user"],"title":"CustomerLoginResponse","description":"Schema for customer login response."},"CustomerRegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"full_name":{"type":"string","maxLength":255,"minLength":1,"title":"Full Name"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["email","full_name","password"],"title":"CustomerRegisterRequest","description":"Schema for customer registration request."},"CustomerUpdateRequest":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"}},"type":"object","title":"CustomerUpdateRequest","description":"Schema for customer update request."},"CustomerUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/UserResponse"},"customer_teams":{"items":{"type":"integer"},"type":"array","title":"Customer Teams","description":"List of team IDs where user is a customer"}},"type":"object","required":["user"],"title":"CustomerUserResponse","description":"Schema for customer user response with customer teams."},"DateTypeEnum":{"type":"string","enum":["ALWAYS","WEEKDAY","DATE_RANGE","SPECIFIC_DATE"],"title":"DateTypeEnum","description":"Enum for date range type."},"DeviceRegistrationRequest":{"properties":{"device_token":{"type":"string","title":"Device Token","description":"Firebase FCM token"},"platform":{"type":"string","title":"Platform","description":"ios, android, web"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},"type":"object","required":["device_token","platform"],"title":"DeviceRegistrationRequest","description":"Schema for device registration."},"DiscountTypeEnum":{"type":"string","enum":["PERCENTAGE","PRICE_BUNDLING"],"title":"DiscountTypeEnum","description":"Enum for discount type."},"ExternalBookingCreate":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"guest_info":{"$ref":"#/components/schemas/GuestInfo"},"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check Out Time"},"guest_number":{"type":"integer","minimum":1.0,"title":"Guest Number"},"nights":{"type":"integer","minimum":1.0,"title":"Nights"},"rooms":{"type":"integer","minimum":1.0,"title":"Rooms","default":1},"payment_method":{"type":"string","maxLength":50,"title":"Payment Method"},"external_system":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"External System"},"external_booking_id":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"External Booking Id"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"}},"type":"object","required":["listing_id","guest_info","check_in_date","check_out_date","guest_number","nights","payment_method"],"title":"ExternalBookingCreate","description":"Booking payload for external API."},"ExternalBookingPreviewRequest":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check Out Time"},"guest_number":{"type":"integer","minimum":1.0,"title":"Guest Number"},"adult_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Adult Number","description":"Number of adult guests (for extra fee calculation)"},"children_number":{"type":"integer","minimum":0.0,"title":"Children Number","description":"Number of children guests (for extra fee calculation)","default":0}},"type":"object","required":["listing_id","check_in_date","check_out_date","guest_number"],"title":"ExternalBookingPreviewRequest","description":"Request schema for partner pricing preview.\n\nSimpler than internal BookingItem — single listing, no combo selection."},"ExternalBookingPreviewResponse":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"listing_name":{"type":"string","title":"Listing Name"},"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"nights":{"type":"integer","title":"Nights"},"guest_number":{"type":"integer","title":"Guest Number"},"pricing_type":{"type":"string","title":"Pricing Type"},"base_price":{"type":"string","title":"Base Price"},"combo_price":{"type":"string","title":"Combo Price","default":"0"},"hourly_price":{"type":"string","title":"Hourly Price","default":"0"},"daily_price":{"type":"string","title":"Daily Price","default":"0"},"night_short_discount":{"type":"string","title":"Night Short Discount","default":"0"},"last_minute_discount":{"type":"string","title":"Last Minute Discount","default":"0"},"monthly_discount":{"type":"string","title":"Monthly Discount","default":"0"},"total_discount":{"type":"string","title":"Total Discount","default":"0"},"extra_guest_fee":{"type":"string","title":"Extra Guest Fee","default":"0"},"extra_adult_fee":{"type":"string","title":"Extra Adult Fee","default":"0"},"extra_child_fee":{"type":"string","title":"Extra Child Fee","default":"0"},"cleaning_fee":{"type":"string","title":"Cleaning Fee","default":"0"},"extra_services_total":{"type":"string","title":"Extra Services Total","default":"0"},"total_price":{"type":"string","title":"Total Price"},"deposit":{"type":"string","title":"Deposit","default":"0"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["listing_id","listing_name","check_in_date","check_out_date","nights","guest_number","pricing_type","base_price","total_price","currency"],"title":"ExternalBookingPreviewResponse","description":"Response schema for partner pricing preview."},"ExtraServicePreview":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"price":{"type":"string","title":"Price"},"price_unit":{"type":"string","title":"Price Unit"},"quantity":{"type":"integer","title":"Quantity","default":1}},"type":"object","required":["id","name","price","price_unit"],"title":"ExtraServicePreview","description":"Schema for extra service in booking preview."},"FinancialBelongToEnum":{"type":"string","enum":["HOST","COHOST","BOTH"],"title":"FinancialBelongToEnum","description":"Enum for ownership."},"FinancialCashierEnum":{"type":"string","enum":["HOST","COHOST"],"title":"FinancialCashierEnum","description":"Enum for receiver/payer."},"FinancialStateEnum":{"type":"string","enum":["PENDING","CONFIRMED","CANCELLED"],"title":"FinancialStateEnum","description":"Enum for transaction state."},"FinancialSummary":{"properties":{"total_income":{"type":"string","title":"Total Income","description":"Total income"},"total_expense":{"type":"string","title":"Total Expense","description":"Total expense"},"total_refund":{"type":"string","title":"Total Refund","description":"Total refund"},"net_profit":{"type":"string","title":"Net Profit","description":"Net profit (income - expense - refund)"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period End"}},"type":"object","required":["total_income","total_expense","total_refund","net_profit"],"title":"FinancialSummary","description":"Schema for team financial summary."},"FinancialTransactionListResponse":{"properties":{"transactions":{"items":{"$ref":"#/components/schemas/FinancialTransactionWithDetails"},"type":"array","title":"Transactions"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"},"summary":{"anyOf":[{"$ref":"#/components/schemas/FinancialSummary"},{"type":"null"}]}},"type":"object","required":["transactions","total","page","page_size","total_pages"],"title":"FinancialTransactionListResponse","description":"Schema for list of financial transactions."},"FinancialTransactionWithDetails":{"properties":{"amount":{"type":"string","title":"Amount","description":"Transaction amount"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"transaction_type":{"$ref":"#/components/schemas/TransactionTypeEnum"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"attachments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attachments"},"cashier":{"$ref":"#/components/schemas/FinancialCashierEnum","default":"HOST"},"belong_to":{"$ref":"#/components/schemas/FinancialBelongToEnum","default":"HOST"},"state":{"$ref":"#/components/schemas/FinancialStateEnum"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reservation Id"},"listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Id"},"service_type_id":{"type":"integer","title":"Service Type Id"},"issued_at":{"type":"string","format":"date-time","title":"Issued At"},"created_by":{"type":"integer","title":"Created By"},"updated_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Updated By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"reservation":{"anyOf":[{"$ref":"#/components/schemas/ReservationResponse"},{"type":"null"}]},"listing":{"anyOf":[{"$ref":"#/components/schemas/ListingResponse"},{"type":"null"}]},"service_type":{"$ref":"#/components/schemas/ServiceTypeResponse"},"creator":{"$ref":"#/components/schemas/UserPublic"},"updater":{"anyOf":[{"$ref":"#/components/schemas/UserPublic"},{"type":"null"}]}},"type":"object","required":["amount","transaction_type","state","id","team_id","service_type_id","issued_at","created_by","created_at","updated_at","service_type","creator"],"title":"FinancialTransactionWithDetails","description":"Schema for financial transaction with related data."},"GenderEnum":{"type":"string","enum":["MALE","FEMALE","OTHER"],"title":"GenderEnum","description":"Enum for gender."},"GuestInfo":{"properties":{"full_name":{"type":"string","maxLength":255,"title":"Full Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"}},"type":"object","required":["full_name","email"],"title":"GuestInfo","description":"Guest info provided by third-party."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HostApplicationApproveRequest":{"properties":{"rejection_reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Rejection Reason","description":"Reason for rejection (if rejecting)"}},"type":"object","title":"HostApplicationApproveRequest","description":"Schema for approving/rejecting Host application."},"HostApplicationListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/HostApplicationResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"HostApplicationListResponse","description":"Schema for list of Host applications."},"HostApplicationRequest":{"properties":{},"type":"object","title":"HostApplicationRequest","description":"Schema for applying to become a Host."},"HostApplicationResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"host_status":{"$ref":"#/components/schemas/HostStatusEnum"},"host_application_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Host Application At"},"host_approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Host Approved At"},"host_approved_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Host Approved By"},"verification_status":{"type":"string","title":"Verification Status"},"is_verified":{"type":"boolean","title":"Is Verified"}},"type":"object","required":["user_id","full_name","email","host_status","verification_status","is_verified"],"title":"HostApplicationResponse","description":"Schema for Host application response (for admin)."},"HostGuestInfo":{"properties":{"full_name":{"type":"string","maxLength":255,"title":"Full Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"}},"type":"object","required":["full_name"],"title":"HostGuestInfo","description":"Guest information for host/cohost bookings."},"HostStatusEnum":{"type":"string","enum":["NOT_APPLIED","PENDING","APPROVED","REJECTED","SUSPENDED"],"title":"HostStatusEnum","description":"Enum for host approval status."},"HostStatusResponse":{"properties":{"host_status":{"$ref":"#/components/schemas/HostStatusEnum"},"host_application_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Host Application At"},"host_approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Host Approved At"},"host_approved_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Host Approved By"}},"type":"object","required":["host_status"],"title":"HostStatusResponse","description":"Schema for Host status response."},"ImageTypeEnum":{"type":"string","enum":["GENERAL","BEDROOM","BATHROOM","LIVING_ROOM","KITCHEN","EXTERIOR","AMENITY"],"title":"ImageTypeEnum","description":"Enum for listing image type/category."},"ListingAmenityCreate":{"properties":{"amenity_id":{"type":"integer","minimum":1.0,"title":"Amenity Id"},"is_chargeable":{"type":"boolean","title":"Is Chargeable","default":false},"price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Price","default":0},"is_private":{"type":"boolean","title":"Is Private","default":true}},"type":"object","required":["amenity_id"],"title":"ListingAmenityCreate","description":"Schema for creating listing amenity."},"ListingAmenityResponse":{"properties":{"amenity_id":{"type":"integer","minimum":1.0,"title":"Amenity Id"},"is_chargeable":{"type":"boolean","title":"Is Chargeable","default":false},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"is_private":{"type":"boolean","title":"Is Private","default":true},"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["amenity_id","id","listing_id","created_at"],"title":"ListingAmenityResponse","description":"Schema for returning listing amenity data."},"ListingAmenityWithDetailsResponse":{"properties":{"amenity_id":{"type":"integer","minimum":1.0,"title":"Amenity Id"},"is_chargeable":{"type":"boolean","title":"Is Chargeable","default":false},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"is_private":{"type":"boolean","title":"Is Private","default":true},"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"amenity_name":{"type":"string","title":"Amenity Name","description":"Amenity name"},"amenity_icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amenity Icon","description":"Amenity icon class/URL"},"amenity_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amenity Code","description":"Amenity category code"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id","description":"Category ID"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name","description":"Category name"},"category_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Code","description":"Category code"},"root_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Root Id","description":"Root category ID (0 for top-level, >0 for child)"}},"type":"object","required":["amenity_id","id","listing_id","created_at","amenity_name"],"title":"ListingAmenityWithDetailsResponse","description":"Schema for returning listing amenity with amenity details (name, code from category)."},"ListingCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"type":"string","maxLength":50,"title":"Listing Type","description":"Listing type code from catalogs","default":"ENTIRE_PLACE"},"property_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Property Type","description":"Property type code from catalogs"},"address":{"type":"string","maxLength":500,"title":"Address"},"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code","default":"VN"},"province_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Province Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Longitude"},"capacity":{"type":"integer","minimum":1.0,"title":"Capacity"},"standard_capacity":{"type":"integer","minimum":0.0,"title":"Standard Capacity","default":0},"bedrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bathrooms"},"beds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Beds"},"square_meters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Square Meters"},"shared_bathrooms":{"type":"integer","minimum":0.0,"title":"Shared Bathrooms","default":0},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (optional, can also be provided via query param or header)"},"slug":{"type":"string","maxLength":255,"title":"Slug","description":"URL-friendly identifier"},"full_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Full Rate"},"minimum_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Minimum Rate"},"extra_adult_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Extra Adult Rate","default":0},"extra_child_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Extra Child Rate","default":0},"guest_included_in_rate":{"type":"integer","minimum":0.0,"title":"Guest Included In Rate","default":0},"maximum_guest":{"type":"integer","minimum":1.0,"title":"Maximum Guest"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"instant_book_enabled":{"type":"boolean","title":"Instant Book Enabled","default":false},"security_deposit":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Security Deposit"},"allow_hourly_booking":{"type":"boolean","title":"Allow Hourly Booking","default":false},"allow_individual_rental":{"type":"boolean","title":"Allow Individual Rental","default":false},"standard_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check In Time"},"standard_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check Out Time"},"flexible_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check In Time"},"flexible_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check Out Time"},"checkin_support_start":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support Start"},"checkin_support_end":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support End"},"checkin_method":{"$ref":"#/components/schemas/CheckinMethodEnum","default":"BOTH"},"min_hours":{"type":"integer","minimum":1.0,"title":"Min Hours","description":"Minimum hours for hourly booking","default":2},"price_first_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Price First Hours","description":"Price for first hours (combo)"},"extra_hour_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Extra Hour Price","description":"Price per hour after first block"},"price_rate_in_day":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"string"}],"title":"Price Rate In Day","description":"Price rate multiplier for daily booking"},"checkin_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Night Short Hour"},"checkout_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkout Night Short Hour"},"night_short_discount":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string"}],"title":"Night Short Discount","description":"Discount percentage for night short booking"},"no_checkin_after_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"No Checkin After Hour"},"checkin_guide_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Checkin Guide Url"},"checkin_link_available_hours":{"anyOf":[{"type":"integer","maximum":168.0,"minimum":1.0},{"type":"null"}],"title":"Checkin Link Available Hours","description":"Hours before check-in to send link"},"commission_rate":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Commission Rate","description":"Commission rate (0.20 or 0.15)"},"nickname":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Nickname","description":"Internal nickname for listing"},"neighborhood_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood Overview","description":"Overview of the neighborhood"},"cleaning_fee":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Cleaning Fee","description":"One-time cleaning fee"},"clean_time":{"type":"integer","minimum":0.0,"title":"Clean Time","description":"Time needed for cleaning (in minutes)","default":0},"door_code":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Door Code","description":"Door access code information (JSON)"},"wifi_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Wifi Name","description":"WiFi network name"},"wifi_password":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Wifi Password","description":"WiFi password"},"place_id":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Place Id","description":"Google Place ID"},"additional_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Additional Areas","description":"Additional area codes array (e.g., ['garden', 'balcony', 'pool']). Each code must exist in catalogs table with catalog_type='additional_area'"},"view_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"View Types","description":"List of view type codes (e.g., ['city', 'beach', 'garden']). Each code must exist in catalogs table with catalog_type='view_type'"},"refund_rule":{"type":"string","title":"Refund Rule","description":"Refund policy text","default":""},"amenities":{"anyOf":[{"items":{"$ref":"#/components/schemas/ListingAmenityCreate"},"type":"array"},{"type":"null"}],"title":"Amenities","description":"List of amenities to create with the listing"},"images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ListingImageCreate"},"type":"array"},{"type":"null"}],"title":"Images","description":"List of images to create with the listing"},"parking_details":{"anyOf":[{"$ref":"#/components/schemas/ParkingDetailsRequest"},{"type":"null"}],"description":"Parking details (motorbike and car) to create with the listing"},"policy":{"anyOf":[{"$ref":"#/components/schemas/ListingPolicyCreate"},{"type":"null"}],"description":"Listing policy (home rules) to create with the listing"},"extra_services":{"anyOf":[{"items":{"$ref":"#/components/schemas/ListingExtraServiceCreate"},"type":"array"},{"type":"null"}],"title":"Extra Services","description":"List of extra services to create with the listing"},"weekly_prices":{"anyOf":[{"$ref":"#/components/schemas/WeeklyPricesRequest"},{"type":"null"}],"description":"Weekly prices configuration to create pricing rules"},"ical_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ical Urls"},"airbnb_room_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Airbnb Room Id"},"website_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Website Url"},"parent_listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Listing Id"}},"type":"object","required":["name","address","capacity","slug","full_rate","minimum_rate","maximum_guest"],"title":"ListingCreate","description":"Schema for creating a new listing."},"ListingExtraServiceCreate":{"properties":{"service_name":{"type":"string","maxLength":255,"title":"Service Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Price"},"price_unit":{"type":"string","maxLength":50,"title":"Price Unit"},"is_required":{"type":"boolean","title":"Is Required","default":false},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["service_name","price","price_unit"],"title":"ListingExtraServiceCreate","description":"Schema for creating listing extra service."},"ListingExtraServiceResponse":{"properties":{"service_name":{"type":"string","maxLength":255,"title":"Service Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"price_unit":{"type":"string","maxLength":50,"title":"Price Unit"},"is_required":{"type":"boolean","title":"Is Required","default":false},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["service_name","price","price_unit","id","listing_id","created_at","updated_at"],"title":"ListingExtraServiceResponse","description":"Schema for returning listing extra service data."},"ListingIcalUrlCreate":{"properties":{"ical_url":{"type":"string","maxLength":500,"title":"Ical Url","description":"ICAL feed URL"},"source":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Source","description":"Source of ICAL (AIRBNB, BOOKING_COM, MANUAL, etc.)"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether ICAL sync is active","default":true}},"type":"object","required":["ical_url"],"title":"ListingIcalUrlCreate","description":"Schema for creating a new ListingIcalUrl."},"ListingIcalUrlListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ListingIcalUrlResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ListingIcalUrlListResponse","description":"Schema for list of ListingIcalUrls."},"ListingIcalUrlResponse":{"properties":{"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"ical_url":{"type":"string","title":"Ical Url"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"is_active":{"type":"boolean","title":"Is Active"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced 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","listing_id","ical_url","is_active","created_at","updated_at"],"title":"ListingIcalUrlResponse","description":"Schema for ListingIcalUrl response."},"ListingIcalUrlUpdate":{"properties":{"ical_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Ical Url","description":"ICAL feed URL"},"source":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Source","description":"Source of ICAL"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether ICAL sync is active"}},"type":"object","title":"ListingIcalUrlUpdate","description":"Schema for updating ListingIcalUrl."},"ListingImageCreate":{"properties":{"image_url":{"type":"string","maxLength":500,"title":"Image Url"},"display_order":{"type":"integer","minimum":0.0,"title":"Display Order","default":0},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"image_type":{"$ref":"#/components/schemas/ImageTypeEnum","description":"Image type/category for UI grouping. Allowed values: GENERAL, BEDROOM, BATHROOM, LIVING_ROOM, KITCHEN, EXTERIOR, AMENITY.","default":"GENERAL"}},"type":"object","required":["image_url"],"title":"ListingImageCreate","description":"Schema for creating listing image."},"ListingImageResponse":{"properties":{"image_url":{"type":"string","maxLength":500,"title":"Image Url"},"display_order":{"type":"integer","minimum":0.0,"title":"Display Order","default":0},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"image_type":{"$ref":"#/components/schemas/ImageTypeEnum","description":"Image type/category for UI grouping. Allowed values: GENERAL, BEDROOM, BATHROOM, LIVING_ROOM, KITCHEN, EXTERIOR, AMENITY.","default":"GENERAL"},"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["image_url","id","listing_id","created_at"],"title":"ListingImageResponse","description":"Schema for returning listing image data."},"ListingParkingRuleBase":{"properties":{"vehicle_type":{"$ref":"#/components/schemas/VehicleTypeEnum"},"is_free":{"type":"boolean","title":"Is Free","default":true},"price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Price","default":0},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"location_type":{"$ref":"#/components/schemas/ParkingLocationTypeEnum"},"distance_in_meters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Distance In Meters"},"description":{"type":"string","minLength":1,"title":"Description"}},"type":"object","required":["vehicle_type","location_type","description"],"title":"ListingParkingRuleBase","description":"Base schema for ListingParkingRule."},"ListingParkingRuleResponse":{"properties":{"vehicle_type":{"$ref":"#/components/schemas/VehicleTypeEnum"},"is_free":{"type":"boolean","title":"Is Free","default":true},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"location_type":{"$ref":"#/components/schemas/ParkingLocationTypeEnum"},"distance_in_meters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Distance In Meters"},"description":{"type":"string","minLength":1,"title":"Description"},"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["vehicle_type","location_type","description","id","listing_id","created_at","updated_at"],"title":"ListingParkingRuleResponse","description":"Schema for returning listing parking rule data."},"ListingPolicyCreate":{"properties":{"outside_food_allowed":{"type":"boolean","title":"Outside Food Allowed","default":true},"party_allowed":{"type":"boolean","title":"Party Allowed","default":true},"smoking_allowed":{"type":"boolean","title":"Smoking Allowed","default":false},"photography_allowed":{"type":"boolean","title":"Photography Allowed","default":false},"pet_allowed":{"type":"boolean","title":"Pet Allowed","default":true},"id_card_required":{"type":"boolean","title":"Id Card Required","default":true},"quiet_time_start":{"type":"string","format":"time","title":"Quiet Time Start","default":"23:00:00"},"quiet_time_end":{"type":"string","format":"time","title":"Quiet Time End","default":"08:00:00"},"other_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Other Rules"},"refund_rule":{"type":"string","title":"Refund Rule","description":"Refund policy text"}},"type":"object","required":["refund_rule"],"title":"ListingPolicyCreate","description":"Schema for creating listing policy."},"ListingPolicyResponse":{"properties":{"outside_food_allowed":{"type":"boolean","title":"Outside Food Allowed","default":true},"party_allowed":{"type":"boolean","title":"Party Allowed","default":true},"smoking_allowed":{"type":"boolean","title":"Smoking Allowed","default":false},"photography_allowed":{"type":"boolean","title":"Photography Allowed","default":false},"pet_allowed":{"type":"boolean","title":"Pet Allowed","default":true},"id_card_required":{"type":"boolean","title":"Id Card Required","default":true},"quiet_time_start":{"type":"string","format":"time","title":"Quiet Time Start","default":"23:00:00"},"quiet_time_end":{"type":"string","format":"time","title":"Quiet Time End","default":"08:00:00"},"other_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Other Rules"},"refund_rule":{"type":"string","title":"Refund Rule","description":"Refund policy text"},"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["refund_rule","id","listing_id","created_at","updated_at"],"title":"ListingPolicyResponse","description":"Schema for returning listing policy data."},"ListingPolicyUpdate":{"properties":{"outside_food_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Outside Food Allowed"},"party_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Party Allowed"},"smoking_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smoking Allowed"},"photography_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Photography Allowed"},"pet_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pet Allowed"},"id_card_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Id Card Required"},"quiet_time_start":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Quiet Time Start"},"quiet_time_end":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Quiet Time End"},"other_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Other Rules"},"refund_rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Rule"}},"type":"object","title":"ListingPolicyUpdate","description":"Schema for updating listing policy."},"ListingPreviewRequest":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"type":"string","maxLength":50,"title":"Listing Type","description":"Listing type code from catalogs","default":"ENTIRE_PLACE"},"property_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Property Type","description":"Property type code from catalogs"},"address":{"type":"string","maxLength":500,"title":"Address"},"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code","default":"VN"},"province_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Province Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Longitude"},"capacity":{"type":"integer","minimum":1.0,"title":"Capacity"},"standard_capacity":{"type":"integer","minimum":0.0,"title":"Standard Capacity","default":0},"bedrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bathrooms"},"beds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Beds"},"square_meters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Square Meters"},"shared_bathrooms":{"type":"integer","minimum":0.0,"title":"Shared Bathrooms","default":0},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (optional, can also be provided via query param or header)"},"slug":{"type":"string","maxLength":255,"title":"Slug","description":"URL-friendly identifier"},"full_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Full Rate"},"minimum_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Minimum Rate"},"extra_adult_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Extra Adult Rate","default":0},"extra_child_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Extra Child Rate","default":0},"guest_included_in_rate":{"type":"integer","minimum":0.0,"title":"Guest Included In Rate","default":0},"maximum_guest":{"type":"integer","minimum":1.0,"title":"Maximum Guest"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"instant_book_enabled":{"type":"boolean","title":"Instant Book Enabled","default":false},"security_deposit":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Security Deposit"},"allow_hourly_booking":{"type":"boolean","title":"Allow Hourly Booking","default":false},"allow_individual_rental":{"type":"boolean","title":"Allow Individual Rental","default":false},"standard_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check In Time"},"standard_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check Out Time"},"flexible_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check In Time"},"flexible_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check Out Time"},"checkin_support_start":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support Start"},"checkin_support_end":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support End"},"checkin_method":{"$ref":"#/components/schemas/CheckinMethodEnum","default":"BOTH"},"min_hours":{"type":"integer","minimum":1.0,"title":"Min Hours","description":"Minimum hours for hourly booking","default":2},"price_first_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Price First Hours","description":"Price for first hours (combo)"},"extra_hour_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Extra Hour Price","description":"Price per hour after first block"},"price_rate_in_day":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"string"}],"title":"Price Rate In Day","description":"Price rate multiplier for daily booking"},"checkin_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Night Short Hour"},"checkout_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkout Night Short Hour"},"night_short_discount":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string"}],"title":"Night Short Discount","description":"Discount percentage for night short booking"},"no_checkin_after_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"No Checkin After Hour"},"checkin_guide_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Checkin Guide Url"},"checkin_link_available_hours":{"anyOf":[{"type":"integer","maximum":168.0,"minimum":1.0},{"type":"null"}],"title":"Checkin Link Available Hours","description":"Hours before check-in to send link"},"commission_rate":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Commission Rate","description":"Commission rate (0.20 or 0.15)"},"nickname":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Nickname","description":"Internal nickname for listing"},"neighborhood_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood Overview","description":"Overview of the neighborhood"},"cleaning_fee":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Cleaning Fee","description":"One-time cleaning fee"},"clean_time":{"type":"integer","minimum":0.0,"title":"Clean Time","description":"Time needed for cleaning (in minutes)","default":0},"door_code":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Door Code","description":"Door access code information (JSON)"},"wifi_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Wifi Name","description":"WiFi network name"},"wifi_password":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Wifi Password","description":"WiFi password"},"place_id":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Place Id","description":"Google Place ID"},"additional_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Additional Areas","description":"Additional area codes array (e.g., ['garden', 'balcony', 'pool']). Each code must exist in catalogs table with catalog_type='additional_area'"},"view_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"View Types","description":"List of view type codes (e.g., ['city', 'beach', 'garden']). Each code must exist in catalogs table with catalog_type='view_type'"},"refund_rule":{"type":"string","title":"Refund Rule","description":"Refund policy text","default":""},"amenities":{"anyOf":[{"items":{"$ref":"#/components/schemas/ListingAmenityCreate"},"type":"array"},{"type":"null"}],"title":"Amenities","description":"List of amenities to create with the listing"},"images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ListingImageCreate"},"type":"array"},{"type":"null"}],"title":"Images","description":"List of images to create with the listing"},"parking_details":{"anyOf":[{"$ref":"#/components/schemas/ParkingDetailsRequest"},{"type":"null"}],"description":"Parking details (motorbike and car) to create with the listing"},"policy":{"anyOf":[{"$ref":"#/components/schemas/ListingPolicyCreate"},{"type":"null"}],"description":"Listing policy (home rules) to create with the listing"},"extra_services":{"anyOf":[{"items":{"$ref":"#/components/schemas/ListingExtraServiceCreate"},"type":"array"},{"type":"null"}],"title":"Extra Services","description":"List of extra services to create with the listing"},"weekly_prices":{"anyOf":[{"$ref":"#/components/schemas/WeeklyPricesRequest"},{"type":"null"}],"description":"Weekly prices configuration to create pricing rules"},"ical_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ical Urls"},"airbnb_room_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Airbnb Room Id"},"website_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Website Url"},"parent_listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Listing Id"}},"type":"object","required":["name","address","capacity","slug","full_rate","minimum_rate","maximum_guest"],"title":"ListingPreviewRequest","description":"Schema for previewing listing before creation.\n\nSame as ListingCreate but used for validation without creating in database."},"ListingPreviewResponse":{"properties":{"is_ready_to_submit":{"type":"boolean","title":"Is Ready To Submit"},"validation_errors":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Validation Errors","default":[]},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","default":[]},"listing_data":{"anyOf":[{"$ref":"#/components/schemas/ListingResponse"},{"type":"null"}]}},"type":"object","required":["is_ready_to_submit"],"title":"ListingPreviewResponse","description":"Schema for listing preview response."},"ListingResponse":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"type":"string","maxLength":50,"title":"Listing Type","description":"Listing type code from catalogs","default":"ENTIRE_PLACE"},"property_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Property Type","description":"Property type code from catalogs"},"address":{"type":"string","maxLength":500,"title":"Address"},"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code","default":"VN"},"province_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Province Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"capacity":{"type":"integer","minimum":1.0,"title":"Capacity"},"standard_capacity":{"type":"integer","minimum":0.0,"title":"Standard Capacity","default":0},"bedrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bathrooms"},"beds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Beds"},"square_meters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Square Meters"},"shared_bathrooms":{"type":"integer","minimum":0.0,"title":"Shared Bathrooms","default":0},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"parent_listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Listing Id"},"created_by":{"type":"integer","title":"Created By"},"slug":{"type":"string","title":"Slug"},"full_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Full Rate"},"minimum_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minimum Rate"},"extra_adult_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Extra Adult Rate"},"extra_child_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Extra Child Rate"},"guest_included_in_rate":{"type":"integer","title":"Guest Included In Rate"},"maximum_guest":{"type":"integer","title":"Maximum Guest"},"currency":{"type":"string","title":"Currency"},"instant_book_enabled":{"type":"boolean","title":"Instant Book Enabled"},"security_deposit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Security Deposit"},"allow_hourly_booking":{"type":"boolean","title":"Allow Hourly Booking"},"allow_individual_rental":{"type":"boolean","title":"Allow Individual Rental"},"standard_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check In Time"},"standard_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check Out Time"},"flexible_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check In Time"},"flexible_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check Out Time"},"checkin_support_start":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support Start"},"checkin_support_end":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support End"},"checkin_method":{"$ref":"#/components/schemas/CheckinMethodEnum"},"min_hours":{"type":"integer","title":"Min Hours"},"price_first_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price First Hours"},"extra_hour_price":{"type":"string","title":"Extra Hour Price"},"price_rate_in_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Rate In Day"},"checkin_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Night Short Hour"},"checkout_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkout Night Short Hour"},"night_short_discount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Night Short Discount"},"no_checkin_after_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"No Checkin After Hour"},"checkin_guide_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkin Guide Url"},"checkin_link_available_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checkin Link Available Hours"},"commission_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Commission Rate"},"ical_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ical Urls"},"airbnb_room_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airbnb Room Id"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"view_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"View Types"},"refund_rule":{"type":"string","title":"Refund Rule"},"state":{"$ref":"#/components/schemas/ListingStateEnum"},"rating_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Average"},"review_count":{"type":"integer","title":"Review Count"},"view_count":{"type":"integer","title":"View Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"}},"type":"object","required":["name","address","capacity","id","team_id","created_by","slug","full_rate","minimum_rate","extra_adult_rate","extra_child_rate","guest_included_in_rate","maximum_guest","currency","instant_book_enabled","security_deposit","allow_hourly_booking","allow_individual_rental","checkin_method","min_hours","price_first_hours","extra_hour_price","price_rate_in_day","night_short_discount","commission_rate","refund_rule","state","review_count","view_count","created_at","updated_at"],"title":"ListingResponse","description":"Schema for returning listing data."},"ListingStateEnum":{"type":"string","enum":["DRAFT","ACTIVE","INACTIVE","SUSPENDED","DELETED"],"title":"ListingStateEnum","description":"Enum for listing state."},"ListingSummaryResponse":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"type":"string","maxLength":50,"title":"Listing Type","description":"Listing type code from catalogs","default":"ENTIRE_PLACE"},"property_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Property Type","description":"Property type code from catalogs"},"address":{"type":"string","maxLength":500,"title":"Address"},"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code","default":"VN"},"province_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Province Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"capacity":{"type":"integer","minimum":1.0,"title":"Capacity"},"standard_capacity":{"type":"integer","minimum":0.0,"title":"Standard Capacity","default":0},"bedrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bathrooms"},"beds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Beds"},"square_meters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Square Meters"},"shared_bathrooms":{"type":"integer","minimum":0.0,"title":"Shared Bathrooms","default":0},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"parent_listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Listing Id"},"created_by":{"type":"integer","title":"Created By"},"slug":{"type":"string","title":"Slug"},"full_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Full Rate"},"minimum_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minimum Rate"},"extra_adult_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Extra Adult Rate"},"extra_child_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Extra Child Rate"},"guest_included_in_rate":{"type":"integer","title":"Guest Included In Rate"},"maximum_guest":{"type":"integer","title":"Maximum Guest"},"currency":{"type":"string","title":"Currency"},"instant_book_enabled":{"type":"boolean","title":"Instant Book Enabled"},"security_deposit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Security Deposit"},"allow_hourly_booking":{"type":"boolean","title":"Allow Hourly Booking"},"allow_individual_rental":{"type":"boolean","title":"Allow Individual Rental"},"standard_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check In Time"},"standard_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check Out Time"},"flexible_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check In Time"},"flexible_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check Out Time"},"checkin_support_start":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support Start"},"checkin_support_end":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support End"},"checkin_method":{"$ref":"#/components/schemas/CheckinMethodEnum"},"min_hours":{"type":"integer","title":"Min Hours"},"price_first_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price First Hours"},"extra_hour_price":{"type":"string","title":"Extra Hour Price"},"price_rate_in_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Rate In Day"},"checkin_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Night Short Hour"},"checkout_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkout Night Short Hour"},"night_short_discount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Night Short Discount"},"no_checkin_after_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"No Checkin After Hour"},"checkin_guide_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkin Guide Url"},"checkin_link_available_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checkin Link Available Hours"},"commission_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Commission Rate"},"ical_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ical Urls"},"airbnb_room_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airbnb Room Id"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"view_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"View Types"},"refund_rule":{"type":"string","title":"Refund Rule"},"state":{"$ref":"#/components/schemas/ListingStateEnum"},"rating_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Average"},"review_count":{"type":"integer","title":"Review Count"},"view_count":{"type":"integer","title":"View Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"images":{"items":{"$ref":"#/components/schemas/ListingImageResponse"},"type":"array","title":"Images","default":[]},"province_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province Name","description":"Province name for display"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name","description":"Country name for display"}},"type":"object","required":["name","address","capacity","id","team_id","created_by","slug","full_rate","minimum_rate","extra_adult_rate","extra_child_rate","guest_included_in_rate","maximum_guest","currency","instant_book_enabled","security_deposit","allow_hourly_booking","allow_individual_rental","checkin_method","min_hours","price_first_hours","extra_hour_price","price_rate_in_day","night_short_discount","commission_rate","refund_rule","state","review_count","view_count","created_at","updated_at"],"title":"ListingSummaryResponse","description":"Schema for returning listing summary data with images for list views."},"ListingUpdate":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (optional, can also be provided via query param or header)"},"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Listing Type","description":"Listing type code from catalogs"},"property_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Property Type","description":"Property type code from catalogs"},"address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Address"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"province_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Province Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Longitude"},"capacity":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Capacity"},"standard_capacity":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Standard Capacity"},"bedrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bathrooms"},"beds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Beds"},"square_meters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Square Meters"},"shared_bathrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Shared Bathrooms"},"full_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Full Rate"},"minimum_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Minimum Rate"},"extra_adult_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Extra Adult Rate"},"extra_child_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Extra Child Rate"},"guest_included_in_rate":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Guest Included In Rate"},"maximum_guest":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Maximum Guest"},"currency":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Currency"},"instant_book_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Instant Book Enabled"},"security_deposit":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Security Deposit"},"allow_hourly_booking":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Hourly Booking"},"allow_individual_rental":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Individual Rental"},"standard_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check In Time"},"standard_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check Out Time"},"flexible_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check In Time"},"flexible_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check Out Time"},"checkin_support_start":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support Start"},"checkin_support_end":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support End"},"checkin_method":{"anyOf":[{"$ref":"#/components/schemas/CheckinMethodEnum"},{"type":"null"}]},"min_hours":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Min Hours"},"price_first_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Price First Hours"},"extra_hour_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Extra Hour Price"},"price_rate_in_day":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"string"}],"title":"Price Rate In Day"},"checkin_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Night Short Hour"},"checkout_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkout Night Short Hour"},"night_short_discount":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string"}],"title":"Night Short Discount"},"no_checkin_after_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"No Checkin After Hour"},"checkin_guide_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Checkin Guide Url"},"checkin_link_available_hours":{"anyOf":[{"type":"integer","maximum":168.0,"minimum":1.0},{"type":"null"}],"title":"Checkin Link Available Hours"},"commission_rate":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"string"}],"title":"Commission Rate"},"ical_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ical Urls"},"airbnb_room_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Airbnb Room Id"},"website_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Website Url"},"state":{"anyOf":[{"$ref":"#/components/schemas/ListingStateEnum"},{"type":"null"}]},"nickname":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Nickname","description":"Internal nickname for listing"},"neighborhood_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood Overview","description":"Overview of the neighborhood"},"cleaning_fee":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Cleaning Fee","description":"One-time cleaning fee"},"clean_time":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Clean Time","description":"Time needed for cleaning (in minutes)"},"door_code":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Door Code","description":"Door access code information (JSON)"},"wifi_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Wifi Name","description":"WiFi network name"},"wifi_password":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Wifi Password","description":"WiFi password"},"place_id":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Place Id","description":"Google Place ID"},"additional_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Additional Areas","description":"Additional area codes array (e.g., ['garden', 'balcony', 'pool']). Each code must exist in catalogs table with catalog_type='additional_area'"},"parent_listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Listing Id"},"view_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"View Types","description":"List of view type codes (e.g., ['city', 'beach', 'garden']). Each code must exist in catalogs table with catalog_type='view_type'"},"refund_rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Rule","description":"Refund policy text"},"policy":{"anyOf":[{"$ref":"#/components/schemas/ListingPolicyUpdate"},{"type":"null"}],"description":"Listing policy (home rules) to update together with the listing"},"extra_services":{"anyOf":[{"items":{"$ref":"#/components/schemas/ListingExtraServiceCreate"},"type":"array"},{"type":"null"}],"title":"Extra Services","description":"List of extra services to upsert with the listing (existing extra services should be managed via dedicated endpoints if fine-grained control is needed)"},"weekly_prices":{"anyOf":[{"$ref":"#/components/schemas/WeeklyPricesRequest"},{"type":"null"}],"description":"Weekly prices configuration to update pricing rules for the listing"}},"type":"object","title":"ListingUpdate","description":"Schema for updating listing (all fields optional)."},"ListingWithDetails":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"type":"string","maxLength":50,"title":"Listing Type","description":"Listing type code from catalogs","default":"ENTIRE_PLACE"},"property_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Property Type","description":"Property type code from catalogs"},"address":{"type":"string","maxLength":500,"title":"Address"},"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code","default":"VN"},"province_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Province Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"capacity":{"type":"integer","minimum":1.0,"title":"Capacity"},"standard_capacity":{"type":"integer","minimum":0.0,"title":"Standard Capacity","default":0},"bedrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Bathrooms"},"beds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Beds"},"square_meters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Square Meters"},"shared_bathrooms":{"type":"integer","minimum":0.0,"title":"Shared Bathrooms","default":0},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"parent_listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Listing Id"},"created_by":{"type":"integer","title":"Created By"},"slug":{"type":"string","title":"Slug"},"full_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Full Rate"},"minimum_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minimum Rate"},"extra_adult_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Extra Adult Rate"},"extra_child_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Extra Child Rate"},"guest_included_in_rate":{"type":"integer","title":"Guest Included In Rate"},"maximum_guest":{"type":"integer","title":"Maximum Guest"},"currency":{"type":"string","title":"Currency"},"instant_book_enabled":{"type":"boolean","title":"Instant Book Enabled"},"security_deposit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Security Deposit"},"allow_hourly_booking":{"type":"boolean","title":"Allow Hourly Booking"},"allow_individual_rental":{"type":"boolean","title":"Allow Individual Rental"},"standard_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check In Time"},"standard_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Standard Check Out Time"},"flexible_check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check In Time"},"flexible_check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Flexible Check Out Time"},"checkin_support_start":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support Start"},"checkin_support_end":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Support End"},"checkin_method":{"$ref":"#/components/schemas/CheckinMethodEnum"},"min_hours":{"type":"integer","title":"Min Hours"},"price_first_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price First Hours"},"extra_hour_price":{"type":"string","title":"Extra Hour Price"},"price_rate_in_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Rate In Day"},"checkin_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkin Night Short Hour"},"checkout_night_short_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Checkout Night Short Hour"},"night_short_discount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Night Short Discount"},"no_checkin_after_hour":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"No Checkin After Hour"},"checkin_guide_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkin Guide Url"},"checkin_link_available_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checkin Link Available Hours"},"commission_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Commission Rate"},"ical_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ical Urls"},"airbnb_room_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airbnb Room Id"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"view_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"View Types"},"refund_rule":{"type":"string","title":"Refund Rule"},"state":{"$ref":"#/components/schemas/ListingStateEnum"},"rating_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Average"},"review_count":{"type":"integer","title":"Review Count"},"view_count":{"type":"integer","title":"View Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"amenities_by_category":{"items":{"$ref":"#/components/schemas/AmenityCategoryGroupResponse"},"type":"array","title":"Amenities By Category","description":"Amenities grouped by category child (root_id > 0) with name and code","default":[]},"images":{"items":{"$ref":"#/components/schemas/ListingImageResponse"},"type":"array","title":"Images","default":[]},"policies":{"items":{"$ref":"#/components/schemas/ListingPolicyResponse"},"type":"array","title":"Policies","default":[]},"extra_services":{"items":{"$ref":"#/components/schemas/ListingExtraServiceResponse"},"type":"array","title":"Extra Services","default":[]},"parking_rules":{"items":{"$ref":"#/components/schemas/ListingParkingRuleResponse"},"type":"array","title":"Parking Rules","default":[]},"team":{"anyOf":[{"$ref":"#/components/schemas/TeamResponse"},{"type":"null"}],"description":"Team that owns this listing"},"creator":{"anyOf":[{"$ref":"#/components/schemas/UserPublic"},{"type":"null"}],"description":"User who created this listing"}},"type":"object","required":["name","address","capacity","id","team_id","created_by","slug","full_rate","minimum_rate","extra_adult_rate","extra_child_rate","guest_included_in_rate","maximum_guest","currency","instant_book_enabled","security_deposit","allow_hourly_booking","allow_individual_rental","checkin_method","min_hours","price_first_hours","extra_hour_price","price_rate_in_day","night_short_discount","commission_rate","refund_rule","state","review_count","view_count","created_at","updated_at"],"title":"ListingWithDetails","description":"Schema for listing with all related data."},"MasterBookingResponse":{"properties":{"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check Out Time"},"nights":{"type":"integer","minimum":1.0,"title":"Nights"},"rooms":{"type":"integer","minimum":1.0,"title":"Rooms","default":1},"guest_number":{"type":"integer","minimum":1.0,"title":"Guest Number"},"daily_price":{"type":"string","title":"Daily Price"},"monthly_price":{"type":"string","title":"Monthly Price"},"earning":{"type":"string","title":"Earning"},"discount":{"type":"string","title":"Discount","default":0},"discount_type":{"$ref":"#/components/schemas/DiscountTypeEnum","default":"PRICE_BUNDLING"},"deposit":{"type":"string","title":"Deposit","default":0},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"reservation_type":{"$ref":"#/components/schemas/ReservationTypeEnum","default":"SHORT_TERM"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"master_reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Master Reservation Id"},"listing_id":{"type":"integer","title":"Listing Id"},"guest_id":{"type":"integer","title":"Guest Id"},"host_id":{"type":"integer","title":"Host Id"},"thread_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thread Id"},"booked_date":{"type":"string","format":"date-time","title":"Booked Date"},"state":{"$ref":"#/components/schemas/ReservationStateEnum"},"cashier":{"$ref":"#/components/schemas/CashierEnum"},"cohost_commission":{"type":"string","title":"Cohost Commission"},"belong_to":{"$ref":"#/components/schemas/BelongToEnum"},"contract_urls":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Contract Urls"},"cancellation_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancellation Reason"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"cancelled_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cancelled By"},"payment_status":{"$ref":"#/components/schemas/PaymentStatusEnum"},"payment_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method"},"payment_transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Transaction Id"},"external_system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External System"},"external_booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Booking Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"sub_reservations":{"items":{"$ref":"#/components/schemas/ReservationResponse"},"type":"array","title":"Sub Reservations","default":[]}},"type":"object","required":["check_in_date","check_out_date","nights","guest_number","daily_price","earning","id","team_id","listing_id","guest_id","host_id","booked_date","state","cashier","cohost_commission","belong_to","payment_status","created_at","updated_at"],"title":"MasterBookingResponse","description":"Schema for master booking with all sub-bookings."},"MemberManageListingAssign":{"properties":{"user_id":{"type":"integer","title":"User Id","description":"User ID to assign permission"},"listing_id":{"type":"integer","title":"Listing Id","description":"Listing ID to assign permission"},"state":{"$ref":"#/components/schemas/MemberManageListingStateEnum","description":"Permission state","default":"ACTIVE"}},"type":"object","required":["user_id","listing_id"],"title":"MemberManageListingAssign","description":"Schema for assigning listing management permission."},"MemberManageListingListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MemberManageListingResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"MemberManageListingListResponse","description":"Schema for list of MemberManageListings."},"MemberManageListingResponse":{"properties":{"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"user_id":{"type":"integer","title":"User Id"},"listing_id":{"type":"integer","title":"Listing Id"},"state":{"$ref":"#/components/schemas/MemberManageListingStateEnum"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","team_id","user_id","listing_id","state","created_at","updated_at"],"title":"MemberManageListingResponse","description":"Schema for MemberManageListing response."},"MemberManageListingStateEnum":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"MemberManageListingStateEnum","description":"Enum for member manage listing state."},"MessageCreate":{"properties":{"content":{"type":"string","title":"Content"},"message_type":{"$ref":"#/components/schemas/MessageTypeEnum","default":"TEXT"},"attachments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attachments"},"team_id":{"type":"integer","title":"Team Id"},"sender_id":{"type":"integer","title":"Sender Id"},"thread_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thread Id"},"channel_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channel Id"}},"type":"object","required":["content","team_id","sender_id"],"title":"MessageCreate","description":"Schema for creating a new message."},"MessageCreateRequest":{"properties":{"content":{"type":"string","title":"Content"},"message_type":{"$ref":"#/components/schemas/MessageTypeEnum","default":"TEXT"},"attachments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attachments"}},"type":"object","required":["content"],"title":"MessageCreateRequest","description":"Schema for API request to create a new message (team_id and sender_id are inferred from context)."},"MessageResponse":{"properties":{"content":{"type":"string","title":"Content"},"message_type":{"$ref":"#/components/schemas/MessageTypeEnum","default":"TEXT"},"attachments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attachments"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"thread_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thread Id"},"channel_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channel Id"},"sender_id":{"type":"integer","title":"Sender Id"},"is_read":{"type":"boolean","title":"Is Read"},"read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Read At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["content","id","team_id","sender_id","is_read","created_at"],"title":"MessageResponse","description":"Schema for returning message data."},"MessageTypeEnum":{"type":"string","enum":["TEXT","IMAGE","FILE","SYSTEM"],"title":"MessageTypeEnum","description":"Enum for message type."},"MessageWithSender":{"properties":{"content":{"type":"string","title":"Content"},"message_type":{"$ref":"#/components/schemas/MessageTypeEnum","default":"TEXT"},"attachments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attachments"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"thread_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thread Id"},"channel_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channel Id"},"sender_id":{"type":"integer","title":"Sender Id"},"is_read":{"type":"boolean","title":"Is Read"},"read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Read At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"sender":{"anyOf":[{"$ref":"#/components/schemas/UserPublic"},{"type":"null"}]}},"type":"object","required":["content","id","team_id","sender_id","is_read","created_at"],"title":"MessageWithSender","description":"Schema for message with sender info."},"MultipleUploadResponse":{"properties":{"files":{"items":{"$ref":"#/components/schemas/UploadResponse"},"type":"array","title":"Files","description":"List of uploaded files"},"total_files":{"type":"integer","title":"Total Files","description":"Total number of files uploaded"},"total_size":{"type":"integer","title":"Total Size","description":"Total size of all files in bytes"}},"type":"object","required":["files","total_files","total_size"],"title":"MultipleUploadResponse","description":"Response schema for multiple file uploads.","example":{"files":[{"content_type":"image/jpeg","file_key":"uploads/abc123.jpg","file_name":"photo1.jpg","file_size":102400,"url":"http://localhost:9000/cohost-files/uploads/abc123.jpg"}],"total_files":1,"total_size":102400}},"NotificationListResponse":{"properties":{"notifications":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Notifications"},"total":{"type":"integer","title":"Total"},"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["notifications","total","unread_count"],"title":"NotificationListResponse","description":"Schema for list of notifications."},"NotificationResponse":{"properties":{"type":{"type":"string","title":"Type"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"id":{"type":"string","title":"Id"},"is_read":{"type":"boolean","title":"Is Read"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["type","title","body","id","is_read","created_at"],"title":"NotificationResponse","description":"Schema for returning notification data."},"ParkingDetailsRequest":{"properties":{"motorbike":{"anyOf":[{"$ref":"#/components/schemas/ListingParkingRuleBase"},{"type":"null"}]},"car":{"anyOf":[{"$ref":"#/components/schemas/ListingParkingRuleBase"},{"type":"null"}]}},"type":"object","title":"ParkingDetailsRequest","description":"Schema for parking details request (motorbike and car)."},"ParkingDetailsResponse":{"properties":{"motorbike":{"anyOf":[{"$ref":"#/components/schemas/ListingParkingRuleResponse"},{"type":"null"}]},"car":{"anyOf":[{"$ref":"#/components/schemas/ListingParkingRuleResponse"},{"type":"null"}]}},"type":"object","title":"ParkingDetailsResponse","description":"Schema for parking details response (motorbike and car)."},"ParkingLocationTypeEnum":{"type":"string","enum":["ONSITE","OFFSITE"],"title":"ParkingLocationTypeEnum","description":"Enum for parking location type."},"PaymentStatusEnum":{"type":"string","enum":["PENDING","PAID","REFUNDED","PARTIAL_REFUND"],"title":"PaymentStatusEnum","description":"Enum for payment status."},"PricingPreviewRequest":{"properties":{"listing_id":{"type":"integer","title":"Listing Id"},"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"guest_number":{"type":"integer","title":"Guest Number","default":1}},"type":"object","required":["listing_id","check_in_date","check_out_date"],"title":"PricingPreviewRequest","description":"Schema for legacy pricing preview (deprecated — use checkout preview)."},"PricingPreviewResponse":{"properties":{"base_price":{"type":"string","title":"Base Price"},"total_price":{"type":"string","title":"Total Price"},"currency":{"type":"string","title":"Currency","default":"VND"},"breakdown":{"additionalProperties":true,"type":"object","title":"Breakdown","default":{}}},"type":"object","required":["base_price","total_price"],"title":"PricingPreviewResponse","description":"Schema for legacy pricing preview response."},"PricingRuleBase":{"properties":{"date_type":{"$ref":"#/components/schemas/DateTypeEnum","default":"ALWAYS"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"date_specific":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Specific"},"day_of_week":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Day Of Week"},"time_from":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time From"},"time_to":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time To"},"min_duration_hours":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Min Duration Hours"},"max_duration_hours":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Max Duration Hours"},"charge_unit":{"$ref":"#/components/schemas/ChargeUnitEnum","default":"PER_NIGHT"},"stay_type":{"anyOf":[{"$ref":"#/components/schemas/StayTypeEnum"},{"type":"null"}]},"price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"}],"title":"Price"},"priority":{"type":"integer","minimum":0.0,"title":"Priority","default":0},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["price"],"title":"PricingRuleBase","description":"Base schema for PricingRule."},"PricingRuleResponse":{"properties":{"date_type":{"$ref":"#/components/schemas/DateTypeEnum","default":"ALWAYS"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"date_specific":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Specific"},"day_of_week":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Day Of Week"},"time_from":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time From"},"time_to":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time To"},"min_duration_hours":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Min Duration Hours"},"max_duration_hours":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Max Duration Hours"},"charge_unit":{"$ref":"#/components/schemas/ChargeUnitEnum","default":"PER_NIGHT"},"stay_type":{"anyOf":[{"$ref":"#/components/schemas/StayTypeEnum"},{"type":"null"}]},"price":{"type":"string","title":"Price"},"priority":{"type":"integer","minimum":0.0,"title":"Priority","default":0},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"integer","title":"Id"},"listing_id":{"type":"integer","title":"Listing Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["price","id","listing_id","created_at","updated_at"],"title":"PricingRuleResponse","description":"Schema for returning pricing rule data."},"PricingRuleUpdate":{"properties":{"date_type":{"anyOf":[{"$ref":"#/components/schemas/DateTypeEnum"},{"type":"null"}]},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"date_specific":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Specific"},"day_of_week":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Day Of Week"},"time_from":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time From"},"time_to":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Time To"},"min_duration_hours":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Min Duration Hours"},"max_duration_hours":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Max Duration Hours"},"charge_unit":{"anyOf":[{"$ref":"#/components/schemas/ChargeUnitEnum"},{"type":"null"}]},"stay_type":{"anyOf":[{"$ref":"#/components/schemas/StayTypeEnum"},{"type":"null"}]},"price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Price"},"priority":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Priority"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"PricingRuleUpdate","description":"Schema for updating pricing rule."},"ProvinceResponse":{"properties":{"id":{"type":"integer","title":"Id"},"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"full_name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name En"},"code_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Name"},"centroid":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Centroid"},"bbox":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Bbox"},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}},"type":"object","required":["id","country_code","code","name"],"title":"ProvinceResponse","description":"Schema for province data."},"RatingSummary":{"properties":{"overall_rating":{"type":"number","maximum":5.0,"minimum":0.0,"title":"Overall Rating","description":"Average overall rating"},"accuracy_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Accuracy Rating"},"communication_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Communication Rating"},"location_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Location Rating"},"value_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Value Rating"},"cleanliness_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Cleanliness Rating"},"check_in_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Check In Rating"},"total_reviews":{"type":"integer","minimum":0.0,"title":"Total Reviews","description":"Total number of reviews"},"rating_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Rating Distribution","description":"Rating distribution: {1: count, 2: count, ...}"}},"type":"object","required":["overall_rating","total_reviews"],"title":"RatingSummary","description":"Schema for a listing's rating summary."},"ReservationResponse":{"properties":{"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check Out Time"},"nights":{"type":"integer","minimum":1.0,"title":"Nights"},"rooms":{"type":"integer","minimum":1.0,"title":"Rooms","default":1},"guest_number":{"type":"integer","minimum":1.0,"title":"Guest Number"},"daily_price":{"type":"string","title":"Daily Price"},"monthly_price":{"type":"string","title":"Monthly Price"},"earning":{"type":"string","title":"Earning"},"discount":{"type":"string","title":"Discount","default":0},"discount_type":{"$ref":"#/components/schemas/DiscountTypeEnum","default":"PRICE_BUNDLING"},"deposit":{"type":"string","title":"Deposit","default":0},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"reservation_type":{"$ref":"#/components/schemas/ReservationTypeEnum","default":"SHORT_TERM"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"master_reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Master Reservation Id"},"listing_id":{"type":"integer","title":"Listing Id"},"guest_id":{"type":"integer","title":"Guest Id"},"host_id":{"type":"integer","title":"Host Id"},"thread_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thread Id"},"booked_date":{"type":"string","format":"date-time","title":"Booked Date"},"state":{"$ref":"#/components/schemas/ReservationStateEnum"},"cashier":{"$ref":"#/components/schemas/CashierEnum"},"cohost_commission":{"type":"string","title":"Cohost Commission"},"belong_to":{"$ref":"#/components/schemas/BelongToEnum"},"contract_urls":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Contract Urls"},"cancellation_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancellation Reason"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"cancelled_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cancelled By"},"payment_status":{"$ref":"#/components/schemas/PaymentStatusEnum"},"payment_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method"},"payment_transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Transaction Id"},"external_system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External System"},"external_booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Booking Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"}},"type":"object","required":["check_in_date","check_out_date","nights","guest_number","daily_price","earning","id","team_id","listing_id","guest_id","host_id","booked_date","state","cashier","cohost_commission","belong_to","payment_status","created_at","updated_at"],"title":"ReservationResponse","description":"Schema for returning reservation data."},"ReservationStateEnum":{"type":"string","enum":["REQUESTED","CONFIRMED","CANCELLED","CHANGED","COMPLETED"],"title":"ReservationStateEnum","description":"Enum for booking state (aligned with state machine)."},"ReservationTypeEnum":{"type":"string","enum":["SHORT_TERM","LONG_TERM"],"title":"ReservationTypeEnum","description":"Enum for booking type."},"ReservationWithDetails":{"properties":{"check_in_date":{"type":"string","format":"date","title":"Check In Date"},"check_out_date":{"type":"string","format":"date","title":"Check Out Date"},"check_in_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check In Time"},"check_out_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Check Out Time"},"nights":{"type":"integer","minimum":1.0,"title":"Nights"},"rooms":{"type":"integer","minimum":1.0,"title":"Rooms","default":1},"guest_number":{"type":"integer","minimum":1.0,"title":"Guest Number"},"daily_price":{"type":"string","title":"Daily Price"},"monthly_price":{"type":"string","title":"Monthly Price"},"earning":{"type":"string","title":"Earning"},"discount":{"type":"string","title":"Discount","default":0},"discount_type":{"$ref":"#/components/schemas/DiscountTypeEnum","default":"PRICE_BUNDLING"},"deposit":{"type":"string","title":"Deposit","default":0},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"reservation_type":{"$ref":"#/components/schemas/ReservationTypeEnum","default":"SHORT_TERM"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"master_reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Master Reservation Id"},"listing_id":{"type":"integer","title":"Listing Id"},"guest_id":{"type":"integer","title":"Guest Id"},"host_id":{"type":"integer","title":"Host Id"},"thread_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thread Id"},"booked_date":{"type":"string","format":"date-time","title":"Booked Date"},"state":{"$ref":"#/components/schemas/ReservationStateEnum"},"cashier":{"$ref":"#/components/schemas/CashierEnum"},"cohost_commission":{"type":"string","title":"Cohost Commission"},"belong_to":{"$ref":"#/components/schemas/BelongToEnum"},"contract_urls":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Contract Urls"},"cancellation_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancellation Reason"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"cancelled_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cancelled By"},"payment_status":{"$ref":"#/components/schemas/PaymentStatusEnum"},"payment_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method"},"payment_transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Transaction Id"},"external_system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External System"},"external_booking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Booking Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"listing":{"$ref":"#/components/schemas/ListingResponse"},"guest":{"$ref":"#/components/schemas/UserPublic"},"host":{"$ref":"#/components/schemas/UserPublic"},"sub_reservations":{"items":{"$ref":"#/components/schemas/ReservationResponse"},"type":"array","title":"Sub Reservations","default":[]}},"type":"object","required":["check_in_date","check_out_date","nights","guest_number","daily_price","earning","id","team_id","listing_id","guest_id","host_id","booked_date","state","cashier","cohost_commission","belong_to","payment_status","created_at","updated_at","listing","guest","host"],"title":"ReservationWithDetails","description":"Schema for reservation with related data."},"ReviewCreate":{"properties":{"overall_rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Overall Rating"},"accuracy_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Accuracy Rating","description":"Accuracy rating"},"communication_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Communication Rating","description":"Communication rating"},"location_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Location Rating","description":"Location rating"},"value_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Value Rating","description":"Value for money rating"},"cleanliness_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Cleanliness Rating","description":"Cleanliness rating"},"check_in_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Check In Rating","description":"Check-in rating"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"team_id":{"type":"integer","title":"Team Id"},"reservation_id":{"type":"integer","title":"Reservation Id"},"listing_id":{"type":"integer","title":"Listing Id"},"reviewer_id":{"type":"integer","title":"Reviewer Id"},"reviewee_id":{"type":"integer","title":"Reviewee Id"},"review_type":{"$ref":"#/components/schemas/ReviewTypeEnum"}},"type":"object","required":["overall_rating","team_id","reservation_id","listing_id","reviewer_id","reviewee_id","review_type"],"title":"ReviewCreate","description":"Schema for creating a new review."},"ReviewListResponse":{"properties":{"reviews":{"items":{"$ref":"#/components/schemas/ReviewWithDetails"},"type":"array","title":"Reviews"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"},"rating_summary":{"anyOf":[{"$ref":"#/components/schemas/RatingSummary"},{"type":"null"}]}},"type":"object","required":["reviews","total","page","page_size","total_pages"],"title":"ReviewListResponse","description":"Schema for a list of reviews."},"ReviewResponse":{"properties":{"overall_rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Overall Rating","description":"Overall rating (1-5)"},"accuracy_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Accuracy Rating","description":"Accuracy rating"},"communication_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Communication Rating","description":"Communication rating"},"location_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Location Rating","description":"Location rating"},"value_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Value Rating","description":"Value for money rating"},"cleanliness_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Cleanliness Rating","description":"Cleanliness rating"},"check_in_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Check In Rating","description":"Check-in rating"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"reservation_id":{"type":"integer","title":"Reservation Id"},"listing_id":{"type":"integer","title":"Listing Id"},"reviewer_id":{"type":"integer","title":"Reviewer Id"},"reviewee_id":{"type":"integer","title":"Reviewee Id"},"review_type":{"$ref":"#/components/schemas/ReviewTypeEnum"},"state":{"$ref":"#/components/schemas/ReviewStateEnum"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["overall_rating","id","team_id","reservation_id","listing_id","reviewer_id","reviewee_id","review_type","state","created_at","updated_at"],"title":"ReviewResponse","description":"Schema for returning review data."},"ReviewStateEnum":{"type":"string","enum":["PENDING","PUBLISHED","HIDDEN","REPORTED"],"title":"ReviewStateEnum","description":"Enum for review state."},"ReviewTypeEnum":{"type":"string","enum":["GUEST_TO_HOST","HOST_TO_GUEST"],"title":"ReviewTypeEnum","description":"Enum for review type."},"ReviewWithDetails":{"properties":{"overall_rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Overall Rating","description":"Overall rating (1-5)"},"accuracy_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Accuracy Rating","description":"Accuracy rating"},"communication_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Communication Rating","description":"Communication rating"},"location_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Location Rating","description":"Location rating"},"value_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Value Rating","description":"Value for money rating"},"cleanliness_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Cleanliness Rating","description":"Cleanliness rating"},"check_in_rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Check In Rating","description":"Check-in rating"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"reservation_id":{"type":"integer","title":"Reservation Id"},"listing_id":{"type":"integer","title":"Listing Id"},"reviewer_id":{"type":"integer","title":"Reviewer Id"},"reviewee_id":{"type":"integer","title":"Reviewee Id"},"review_type":{"$ref":"#/components/schemas/ReviewTypeEnum"},"state":{"$ref":"#/components/schemas/ReviewStateEnum"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"reviewer":{"$ref":"#/components/schemas/UserPublic"},"reviewee":{"$ref":"#/components/schemas/UserPublic"},"listing":{"$ref":"#/components/schemas/ListingResponse"},"reservation":{"$ref":"#/components/schemas/ReservationResponse"}},"type":"object","required":["overall_rating","id","team_id","reservation_id","listing_id","reviewer_id","reviewee_id","review_type","state","created_at","updated_at","reviewer","reviewee","listing","reservation"],"title":"ReviewWithDetails","description":"Schema for review with related data."},"SearchResult":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SearchResultItem"},"type":"array","title":"Items","description":"List of listings"},"combos":{"items":{"$ref":"#/components/schemas/Combo"},"type":"array","title":"Combos","description":"List of combos (if enable_clustering=True)"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"Total number of results"},"page":{"type":"integer","minimum":1.0,"title":"Page","description":"Current page"},"page_size":{"type":"integer","minimum":1.0,"title":"Page Size","description":"Number of items per page"},"total_pages":{"type":"integer","minimum":0.0,"title":"Total Pages","description":"Total number of pages"}},"type":"object","required":["items","total","page","page_size","total_pages"],"title":"SearchResult","description":"Schema for search results."},"SearchResultItem":{"properties":{"listing":{"$ref":"#/components/schemas/ListingResponse"},"distance":{"type":"string","title":"Distance","description":"Distance from location (km)"},"available":{"type":"boolean","title":"Available","description":"Available for the requested time period","default":true},"price":{"type":"string","title":"Price","description":"Price for the requested time period"},"currency":{"type":"string","maxLength":3,"title":"Currency","default":"VND"},"discount":{"type":"string","title":"Discount","description":"Discount if available"}},"type":"object","required":["listing","price"],"title":"SearchResultItem","description":"Schema for an item in search results."},"ServiceTypeCategoryEnum":{"type":"string","enum":["INCOME","EXPENSE"],"title":"ServiceTypeCategoryEnum","description":"Enum for service type category."},"ServiceTypeCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"type":{"$ref":"#/components/schemas/ServiceTypeCategoryEnum"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"}},"type":"object","required":["name","type"],"title":"ServiceTypeCreate","description":"Schema for creating a new service type."},"ServiceTypeListResponse":{"properties":{"service_types":{"items":{"$ref":"#/components/schemas/ServiceTypeResponse"},"type":"array","title":"Service Types"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["service_types","total"],"title":"ServiceTypeListResponse","description":"Schema for list of service types."},"ServiceTypeResponse":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"type":{"$ref":"#/components/schemas/ServiceTypeCategoryEnum"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"type":"integer","title":"Id"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"state":{"$ref":"#/components/schemas/ServiceTypeStateEnum"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["name","type","id","state","created_at"],"title":"ServiceTypeResponse","description":"Schema for returning service type data."},"ServiceTypeStateEnum":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"ServiceTypeStateEnum","description":"Enum for service type state."},"StayTypeEnum":{"type":"string","enum":["DAY","OVERNIGHT","ANY"],"title":"StayTypeEnum","description":"Enum for distinguishing overnight/daytime bookings."},"SystemRoleEnum":{"type":"string","enum":["USER","ADMIN"],"title":"SystemRoleEnum","description":"Enum for system role."},"TeamCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"handle_name":{"type":"string","maxLength":100,"minLength":1,"title":"Handle Name","description":"Handle name must contain only letters, numbers, underscores, and hyphens. No spaces allowed."},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email","description":"Team email address"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Team description"}},"type":"object","required":["name","handle_name"],"title":"TeamCreate","description":"Schema for creating a new team."},"TeamInviteRequest":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (optional, can also be provided via query param or header)"},"email":{"type":"string","maxLength":255,"title":"Email","description":"Email of user to invite"},"role":{"$ref":"#/components/schemas/TeamMemberRoleEnum","description":"Role in team","default":"GUEST"}},"type":"object","required":["email"],"title":"TeamInviteRequest","description":"Schema for inviting user to team."},"TeamMemberCreate":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (optional, can also be provided via query param or header)"},"user_id":{"type":"integer","title":"User Id"},"role":{"$ref":"#/components/schemas/TeamMemberRoleEnum","default":"GUEST"}},"type":"object","required":["user_id"],"title":"TeamMemberCreate","description":"Schema for creating team member (invite)."},"TeamMemberResponse":{"properties":{"role":{"$ref":"#/components/schemas/TeamMemberRoleEnum","default":"GUEST"},"state":{"$ref":"#/components/schemas/TeamMemberStateEnum","default":"INVITED"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"user_id":{"type":"integer","title":"User Id"},"listing_count":{"type":"integer","title":"Listing Count"},"invited_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invited By"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined 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","team_id","user_id","listing_count","created_at","updated_at"],"title":"TeamMemberResponse","description":"Schema for returning team member data."},"TeamMemberRoleEnum":{"type":"string","enum":["OWNER","HOST","COHOST","GUEST"],"title":"TeamMemberRoleEnum","description":"Enum for role in team."},"TeamMemberStateEnum":{"type":"string","enum":["INVITED","JOINED","LEFT","REMOVED"],"title":"TeamMemberStateEnum","description":"Enum for team member state."},"TeamMemberUpdate":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (optional, can also be provided via query param or header)"},"role":{"anyOf":[{"$ref":"#/components/schemas/TeamMemberRoleEnum"},{"type":"null"}]},"state":{"anyOf":[{"$ref":"#/components/schemas/TeamMemberStateEnum"},{"type":"null"}]}},"type":"object","title":"TeamMemberUpdate","description":"Schema for updating team member (role, state)."},"TeamMemberWithUser":{"properties":{"role":{"$ref":"#/components/schemas/TeamMemberRoleEnum","default":"GUEST"},"state":{"$ref":"#/components/schemas/TeamMemberStateEnum","default":"INVITED"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"user_id":{"type":"integer","title":"User Id"},"listing_count":{"type":"integer","title":"Listing Count"},"invited_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invited By"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"user":{"$ref":"#/components/schemas/UserPublic"}},"type":"object","required":["id","team_id","user_id","listing_count","created_at","updated_at","user"],"title":"TeamMemberWithUser","description":"Schema for team member with user info."},"TeamResponse":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"handle_name":{"type":"string","maxLength":100,"minLength":1,"title":"Handle Name","description":"Handle name must contain only letters, numbers, underscores, and hyphens. No spaces allowed."},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email","description":"Team email address"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Team description"},"id":{"type":"integer","title":"Id"},"handle_number":{"type":"integer","title":"Handle Number"},"owner_id":{"type":"integer","title":"Owner Id"},"member_count":{"type":"integer","title":"Member Count"},"listing_count":{"type":"integer","title":"Listing Count"},"status":{"$ref":"#/components/schemas/TeamStatusEnum"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"}},"type":"object","required":["name","handle_name","id","handle_number","owner_id","member_count","listing_count","status","created_at","updated_at"],"title":"TeamResponse","description":"Schema for returning team data."},"TeamStatusEnum":{"type":"string","enum":["ACTIVE","SUSPENDED","DELETED"],"title":"TeamStatusEnum","description":"Enum for team status."},"TeamUpdate":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (optional, can also be provided via query param or header)"},"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email","description":"Team email address"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Team description"},"status":{"anyOf":[{"$ref":"#/components/schemas/TeamStatusEnum"},{"type":"null"}]}},"type":"object","title":"TeamUpdate","description":"Schema for updating team (all fields optional)."},"TeamWithOwner":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"handle_name":{"type":"string","maxLength":100,"minLength":1,"title":"Handle Name","description":"Handle name must contain only letters, numbers, underscores, and hyphens. No spaces allowed."},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email","description":"Team email address"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Team description"},"id":{"type":"integer","title":"Id"},"handle_number":{"type":"integer","title":"Handle Number"},"owner_id":{"type":"integer","title":"Owner Id"},"member_count":{"type":"integer","title":"Member Count"},"listing_count":{"type":"integer","title":"Listing Count"},"status":{"$ref":"#/components/schemas/TeamStatusEnum"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"owner":{"$ref":"#/components/schemas/UserPublic"}},"type":"object","required":["name","handle_name","id","handle_number","owner_id","member_count","listing_count","status","created_at","updated_at","owner"],"title":"TeamWithOwner","description":"Schema for team with owner info."},"TeamWithRole":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name"},"handle_name":{"type":"string","maxLength":100,"minLength":1,"title":"Handle Name","description":"Handle name must contain only letters, numbers, underscores, and hyphens. No spaces allowed."},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email","description":"Team email address"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Team description"},"id":{"type":"integer","title":"Id"},"handle_number":{"type":"integer","title":"Handle Number"},"owner_id":{"type":"integer","title":"Owner Id"},"member_count":{"type":"integer","title":"Member Count"},"listing_count":{"type":"integer","title":"Listing Count"},"status":{"$ref":"#/components/schemas/TeamStatusEnum"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"role":{"$ref":"#/components/schemas/TeamMemberRoleEnum","description":"User's role in this team"}},"type":"object","required":["name","handle_name","id","handle_number","owner_id","member_count","listing_count","status","created_at","updated_at","role"],"title":"TeamWithRole","description":"Schema for team with user's role in that team."},"TemplateCreate":{"properties":{"name":{"type":"string","maxLength":255,"title":"Name","description":"Template name"},"content":{"type":"string","title":"Content","description":"Template content with variables"},"variables":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Variables","description":"Available variables (e.g., {{guest_name}}, {{check_in_date}})"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID (NULL for global template)"}},"type":"object","required":["name","content"],"title":"TemplateCreate","description":"Schema for creating a new Template."},"TemplateListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TemplateResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"TemplateListResponse","description":"Schema for list of Templates."},"TemplateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"name":{"type":"string","title":"Name"},"content":{"type":"string","title":"Content"},"variables":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Variables"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","content","created_at","updated_at"],"title":"TemplateResponse","description":"Schema for Template response."},"TemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name","description":"Template name"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Template content with variables"},"variables":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Variables","description":"Available variables"}},"type":"object","title":"TemplateUpdate","description":"Schema for updating Template."},"ThreadCreateRequest":{"properties":{"listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Id"},"reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reservation Id"}},"type":"object","title":"ThreadCreateRequest","description":"Schema for API request to create a new thread (team_id and guest_id are inferred from context)."},"ThreadResponse":{"properties":{"listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Id"},"reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reservation Id"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"guest_id":{"type":"integer","title":"Guest Id"},"state":{"$ref":"#/components/schemas/ThreadStateEnum"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message 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","team_id","guest_id","state","created_at","updated_at"],"title":"ThreadResponse","description":"Schema for returning thread data."},"ThreadStateEnum":{"type":"string","enum":["NORMAL","CANCELLED"],"title":"ThreadStateEnum","description":"Enum for thread state."},"ThreadWithDetails":{"properties":{"listing_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Id"},"reservation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reservation Id"},"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"guest_id":{"type":"integer","title":"Guest Id"},"state":{"$ref":"#/components/schemas/ThreadStateEnum"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"guest":{"$ref":"#/components/schemas/UserPublic"},"listing":{"anyOf":[{"$ref":"#/components/schemas/ListingResponse"},{"type":"null"}]},"reservation":{"anyOf":[{"$ref":"#/components/schemas/ReservationResponse"},{"type":"null"}]},"last_message":{"anyOf":[{"$ref":"#/components/schemas/MessageResponse"},{"type":"null"}]},"unread_count":{"type":"integer","title":"Unread Count","default":0}},"type":"object","required":["id","team_id","guest_id","state","created_at","updated_at","guest"],"title":"ThreadWithDetails","description":"Schema for thread with related data."},"TransactionTypeEnum":{"type":"string","enum":["INCOME","EXPENSE","REFUND"],"title":"TransactionTypeEnum","description":"Enum for transaction type."},"UploadResponse":{"properties":{"file_key":{"type":"string","title":"File Key","description":"Object key (path) of the uploaded file"},"file_name":{"type":"string","title":"File Name","description":"Original file name"},"file_size":{"type":"integer","title":"File Size","description":"File size in bytes"},"content_type":{"type":"string","title":"Content Type","description":"MIME type of the file"},"url":{"type":"string","title":"Url","description":"Public URL to access the file"}},"type":"object","required":["file_key","file_name","file_size","content_type","url"],"title":"UploadResponse","description":"Response schema for file upload.","example":{"content_type":"image/jpeg","file_key":"uploads/abc123-def456-ghi789.jpg","file_name":"photo.jpg","file_size":102400,"url":"http://localhost:9000/cohost-files/uploads/abc123-def456-ghi789.jpg"}},"UserPublic":{"properties":{"id":{"type":"integer","title":"Id"},"full_name":{"type":"string","title":"Full Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"is_verified":{"type":"boolean","title":"Is Verified"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","full_name","is_verified","created_at"],"title":"UserPublic","description":"Schema for public user info (no sensitive data)."},"UserResponse":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"full_name":{"type":"string","maxLength":255,"title":"Full Name"},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"gender":{"anyOf":[{"$ref":"#/components/schemas/GenderEnum"},{"type":"null"}]},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language","default":"vi"},"timezone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Timezone","default":"Asia/Ho_Chi_Minh"},"id":{"type":"integer","title":"Id"},"auth0_id":{"type":"string","title":"Auth0 Id"},"is_verified":{"type":"boolean","title":"Is Verified"},"verification_status":{"$ref":"#/components/schemas/VerificationStatusEnum"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"status":{"$ref":"#/components/schemas/UserStatusEnum"},"system_role":{"$ref":"#/components/schemas/SystemRoleEnum"},"host_status":{"$ref":"#/components/schemas/HostStatusEnum"},"host_application_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Host Application At"},"host_approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Host Approved At"},"host_approved_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Host Approved By"},"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"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"teams":{"items":{"$ref":"#/components/schemas/TeamWithRole"},"type":"array","title":"Teams","description":"Teams that user is a member of with their role"},"email_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Verified","description":"Email verification status from Auth0"}},"type":"object","required":["email","full_name","id","auth0_id","is_verified","verification_status","status","system_role","host_status","created_at","updated_at"],"title":"UserResponse","description":"Schema for returning user data."},"UserStatusEnum":{"type":"string","enum":["ACTIVE","SUSPENDED","DELETED"],"title":"UserStatusEnum","description":"Enum for user status."},"UserUpdate":{"properties":{"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"full_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Full Name"},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"gender":{"anyOf":[{"$ref":"#/components/schemas/GenderEnum"},{"type":"null"}]},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"timezone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Timezone"}},"type":"object","title":"UserUpdate","description":"Schema for updating user (all fields optional)."},"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"},"VehicleTypeEnum":{"type":"string","enum":["MOTORBIKE","CAR"],"title":"VehicleTypeEnum","description":"Enum for vehicle type in parking rules."},"VerificationRequest":{"properties":{"document_type":{"type":"string","title":"Document Type","description":"CCCD, CMND, Passport, etc."},"document_number":{"type":"string","maxLength":50,"title":"Document Number"},"front_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Front Image Url","description":"Front image URL"},"back_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Back Image Url","description":"Back image URL"},"selfie_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selfie Image Url","description":"Selfie image URL"}},"type":"object","required":["document_type","document_number"],"title":"VerificationRequest","description":"Schema for verification request."},"VerificationResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"verification_status":{"type":"string","title":"Verification Status"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"submitted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitted At"}},"type":"object","required":["user_id","verification_status"],"title":"VerificationResponse","description":"Schema for verification response."},"VerificationReviewRequest":{"properties":{"status":{"type":"string","title":"Status","description":"VERIFIED or REJECTED"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason","description":"Required if status is REJECTED"}},"type":"object","required":["status"],"title":"VerificationReviewRequest","description":"Schema for review verification request."},"VerificationStatusEnum":{"type":"string","enum":["PENDING","VERIFIED","REJECTED"],"title":"VerificationStatusEnum","description":"Enum for verification status."},"WeeklyPricesRequest":{"properties":{"monday":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Monday","description":"Price for Monday"},"tuesday":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Tuesday","description":"Price for Tuesday"},"wednesday":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Wednesday","description":"Price for Wednesday"},"thursday":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Thursday","description":"Price for Thursday"},"friday":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Friday","description":"Price for Friday"},"saturday":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Saturday","description":"Price for Saturday"},"sunday":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Sunday","description":"Price for Sunday"}},"type":"object","title":"WeeklyPricesRequest","description":"Schema for setting weekly prices (7 days of week).\n\nEach field represents price for that day of week (0=Monday, 6=Sunday)."}},"securitySchemes":{"ExternalApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Third-Party API key used to authenticate external requests.\n\n**Usage:** Required for all `/api/v1/external/*` endpoints.\n**How to get:** Contact Cohost team to obtain your API key.\n**Example:** `X-API-Key: cohost_api_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT Bearer token for customer authentication.\n\n**Usage:** Required for customer-facing endpoints:\n- `/api/v1/checkout/*` - Booking preview and confirmation\n- `/api/v1/bookings/*` - Get customer bookings\n- `/api/v1/auth/me` - Get customer profile\n\n**How to get:** Customer must login via:\n- `POST /api/v1/external/customers/login` (returns `access_token`)\n- Or Auth0 Universal Login\n\n**Example:** `Authorization: Bearer eyJhbGciOiJSUzI1NiIs...`\n\n**Note:** Customer must verify email before creating bookings."}}},"security":[{"ExternalApiKey":[]}]}