openapi: 3.1.1 info: title: Beyond Pricing Public API version: 2.0.0 description: Bearer-protected API for third-party integrations. Supports OAuth2 client credentials and personal access tokens. Follows JSON:API specification. paths: /api/v1/compsets/: get: operationId: list_compsets description: |- List the comp sets visible to the authenticated client. **Required scope:** `compsets:read` **Pagination:** `page[number]` and `page[size]`. **Filtering:** `filter[owner]=`, `filter[listing]=`, `filter[kind]=custom|connected`. `filter[owner]` is only meaningful for full-access partner tokens; user-scoped tokens already see one user. **Sorting:** `sort=created-at` (default `-created-at`) or `sort=title`; prefix with `-` for descending. **Compound documents (sideloading):** Use the `include` query parameter to embed related resources (JSON:API compound documents). Supported: - `owner` - the user who owns the comp set - `listing` - the Beyond listing the comp set is anchored to (`null` for `custom` comp sets) **Example:** `GET /api/v1/compsets/?include=owner,listing` Each entry is a lightweight summary (counts, title, `kind`, timestamps). Fetch `GET /compsets/{id}/` for the full enriched comp set. summary: List comp sets parameters: - name: sort required: false in: query description: '[list of fields to sort by](https://jsonapi.org/format/#fetching-sorting)' schema: type: array items: type: string enum: - created-at - -created-at - title - -title explode: false - in: query name: filter[owner] schema: type: number - in: query name: filter[listing] schema: type: number - in: query name: filter[kind] schema: type: string enum: - connected - custom description: |- * `custom` - Custom * `connected` - Connected - name: page[number] required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page[size] required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: include schema: type: array items: type: string enum: - owner - listing description: include query parameter to allow the client to customize which related resources should be returned. explode: false - in: query name: fields[compsets] schema: type: array items: type: string enum: - listing-id - kind - title - member-count - created-at - updated-at - owner - listing description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Compsets security: - oauth2: - compsets:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/PaginatedCompsetSummaryList' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/compsets/{compset_id}/: get: operationId: get_compset description: |- Return one comp set by id, fully enriched. **Required scope:** `compsets:read` Returns the comp set with members enriched across Airbnb, Vrbo, and Booking.com, the comp set's headline metrics over the next 30 and 90 days, and a `performance` block comparing the listing to the aggregated compset benchmark over `start_date`..`end_date` (defaults: today → today+90d, max range 180 days). The `kind` field distinguishes `custom` and `connected` comp sets; for `custom` comp sets some `source` fields and the main-listing performance metrics are `null`. Returns **404** when no comp set with that id is visible to the client. summary: Get a comp set by id parameters: - in: path name: compset_id schema: type: integer required: true - in: query name: start_date schema: type: string description: First stay date (YYYY-MM-DD) for the performance comparison. Defaults to today. - in: query name: end_date schema: type: string description: Last stay date (YYYY-MM-DD) for the performance comparison. Defaults to today + 90 days. Range must not exceed 180 days. - in: query name: fields[compsets] schema: type: array items: type: string enum: - id - listing-id - kind - title - matched-airbnb-id - created-at - updated-at - source - members - performance description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Compsets security: - oauth2: - compsets:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/CompsetResponse' description: '' '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/: get: operationId: list_listings description: |- Retrieve a paginated list of all listings for the authenticated application. **Required scope:** `listings:read` **Pagination:** Use `page[number]` and `page[size]` query parameters. **Sorting:** Use `sort` query parameter with field names. Prefix with `-` for descending order. **Filtering:** Use `filter[field]` query parameters. **Compound documents:** Use `include` query parameter to include related resources. summary: List all listings parameters: - name: sort required: false in: query description: '[list of fields to sort by](https://jsonapi.org/format/#fetching-sorting)' schema: type: array items: type: string enum: - created-at - -created-at - title - -title - city - -city explode: false - in: query name: filter[owner] schema: type: number - in: query name: filter[enabled] schema: type: boolean - name: page[number] required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page[size] required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: include schema: type: array items: type: string enum: - owner description: include query parameter to allow the client to customize which related resources should be returned. explode: false - in: query name: fields[listings] schema: type: array items: type: string enum: - title - image - neighborhood - city - state - country - room-type - bedrooms - bathrooms - base-price - base-price-updated-at - min-price - min-price-updated-at - max-price - min-stay - extra-guest-fee - extra-guest-threshold - latitude - longitude - timezone - currency - in-active-market - enabled - address - created-at - owner - channel-listings description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Listings security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/PaginatedListingList' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/: get: operationId: get_listing description: |- Retrieve detailed information about a specific listing. **Required scope:** `listings:read` **Compound documents (sideloading):** Use the `include` query parameter to include related resources in a single request. This follows the JSON:API specification for compound documents. Supported includes: - `owner` - The user who owns the listing **Example:** `GET /api/v1/listings/123/?include=owner` summary: Retrieve a listing by ID parameters: - in: path name: listing_id schema: type: integer required: true - in: query name: include schema: type: array items: type: string enum: - owner description: include query parameter to allow the client to customize which related resources should be returned. explode: false - in: query name: fields[listings] schema: type: array items: type: string enum: - title - image - neighborhood - city - state - country - room-type - bedrooms - bathrooms - base-price - base-price-updated-at - min-price - min-price-updated-at - max-price - min-stay - extra-guest-fee - extra-guest-threshold - latitude - longitude - timezone - currency - in-active-market - enabled - address - created-at - owner - channel-listings - sync-status description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Listings security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/ListingDetailResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/activation/: patch: operationId: patch_listing_activation description: Enable or disable price syncing for a listing. summary: Update listing activation parameters: - in: path name: listing_id schema: type: integer required: true tags: - Listings requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/PatchedListingActivationRequest' required: true security: - oauth2: - listings:write - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/ListingActivationResponse' description: '' '304': description: Not modified '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable entity '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/calendar/: get: operationId: list_listing_calendar description: |- Retrieve the pricing calendar for a specific listing. **Required scope:** `reservations:read` **Currency:** Price fields are returned in the owning user's configured currency. **Date range:** Use `filter[start-date]` and `filter[end-date]` query parameters (YYYY-MM-DD, JSON:API spec). Defaults to today through today + 365 days. **Sorting:** Use `sort=date` (ascending, default) or `sort=-date`. **Pagination:** Use `page[number]` and `page[size]` query parameters. **Sparse fieldsets:** Use `fields[calendar-entries]` to select specific fields. **Example:** `GET /api/v1/listings/123/calendar/?filter[start-date]=2026-01-01&filter[end-date]=2026-06-30&sort=date` summary: Get calendar for a listing parameters: - in: path name: listing_id schema: type: integer required: true - name: page[number] required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page[size] required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: filter[start-date] schema: type: string format: date description: Start date (YYYY-MM-DD). Defaults to today in the listing's timezone. - in: query name: filter[end-date] schema: type: string format: date description: End date (YYYY-MM-DD). Defaults to today + 365 days. - in: query name: sort schema: type: string enum: - -date - date description: 'Sort calendar entries by date. Supported values: date, -date. Defaults to date.' - in: query name: fields[calendar-entries] schema: type: array items: type: string enum: - id - date - availability - price - price-posted - effective-min-price - effective-max-price - factors description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Listings security: - oauth2: - reservations:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/PaginatedCalendarEntryList' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable - invalid dates or insufficient data '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/customizations/: get: operationId: get_listing_all_customizations description: Retrieve every supported customization for a listing. summary: Get all customizations for a listing parameters: - in: path name: listing_id schema: type: integer required: true - in: query name: fields[listing-customizations] schema: type: array items: type: string enum: - base-price - extra-guest-fees - min-max-prices - min-stays - time-based-adjustments - id description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Customizations security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/ListingCustomizationsResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/customizations/base-price/: get: operationId: get_listing_base_price_customization description: Retrieve base price customization for a listing. summary: Get base price customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true - in: query name: fields[base-price-customizations] schema: type: array items: type: string enum: - base-price - id description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Customizations security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/BasePriceCustomizationResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error patch: operationId: patch_listing_base_price_customization description: Update base price customization for a listing. summary: Update base price customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true tags: - Customizations requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/PatchedBasePriceCustomizationRequest' required: true security: - oauth2: - listings:write - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/BasePriceCustomizationResponse' description: '' '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable entity '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/customizations/extra-guest-fees/: get: operationId: get_listing_extra_guest_fee_customization description: Retrieve extra guest fee customization for a listing. summary: Get extra guest fee customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true - in: query name: fields[extra-guest-fee-customizations] schema: type: array items: type: string enum: - extra-guest-fee - extra-guest-threshold - id description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Customizations security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/ExtraGuestFeeCustomizationResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error patch: operationId: patch_listing_extra_guest_fee_customization description: Update extra guest fee customization for a listing. summary: Update extra guest fee customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true tags: - Customizations requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/PatchedExtraGuestFeeCustomizationRequest' required: true security: - oauth2: - listings:write - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/ExtraGuestFeeCustomizationResponse' description: '' '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable entity '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/customizations/min-max-prices/: get: operationId: get_listing_min_max_prices_customization description: Retrieve min/max prices customization for a listing. summary: Get min/max prices customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true - in: query name: fields[min-max-price-customizations] schema: type: array items: type: string enum: - min-price - max-price - monthly-min-price - day-of-week-min-prices - seasonal-day-of-week-min-prices - seasonal-prices - seasonal-monthly-prices - id description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Customizations security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/MinMaxPricesCustomizationResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error patch: operationId: patch_listing_min_max_prices_customization description: Update min/max prices customization for a listing. summary: Update min/max prices customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true tags: - Customizations requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/PatchedMinMaxPricesCustomizationRequest' required: true security: - oauth2: - listings:write - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/MinMaxPricesCustomizationResponse' description: '' '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable entity '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/customizations/min-stays/: get: operationId: get_listing_min_stays_customization description: Retrieve min-stays customization for a listing. summary: Get min-stays customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true - in: query name: fields[min-stay-customizations] schema: type: array items: type: string enum: - min-stay - gap-fill-min-stay - seasonal-min-stays - last-minute-min-stays - day-of-week-min-stays - seasonal-day-of-week-min-stays - seasonal-gap-fill-min-stays - seasonal-time-based-min-stays - id description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Customizations security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/MinStaysCustomizationResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error patch: operationId: patch_listing_min_stays_customization description: Update min-stays customization for a listing. summary: Update min-stays customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true tags: - Customizations requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/PatchedMinStaysCustomizationRequest' required: true security: - oauth2: - listings:write - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/MinStaysCustomizationResponse' description: '' '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable entity '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/customizations/time-based-adjustments/: get: operationId: get_listing_time_based_adjustments_customization description: Retrieve time-based adjustments customization for a listing. summary: Get time-based adjustments customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true - in: query name: fields[time-based-adjustment-customizations] schema: type: array items: type: string enum: - time-based-adjustments - seasonal-time-based-adjustments - id - dynamic-time-based-adjustments description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Customizations security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/TimeBasedAdjustmentsCustomizationResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error patch: operationId: patch_listing_time_based_adjustments_customization description: Update time-based adjustments customization for a listing. summary: Update time-based adjustments customization for a listing parameters: - in: path name: listing_id schema: type: integer required: true tags: - Customizations requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/PatchedTimeBasedAdjustmentsCustomizationRequest' required: true security: - oauth2: - listings:write - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/TimeBasedAdjustmentsCustomizationResponse' description: '' '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable entity '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/recommendations/: get: operationId: list_listing_recommendations description: |- Retrieve recommendations for a specific listing. **Required scope:** `listings:read` The listing must belong to a user owned by the authenticated OAuth2 application. When no recommendations exist, the endpoint returns an empty JSON:API collection. summary: List recommendations for a listing parameters: - in: path name: listing_id schema: type: integer required: true - name: page[number] required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page[size] required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: fields[recommendations] schema: type: array items: type: string enum: - listing-id - listing-title - status - approved-at - rejected-at - expired-at - suggested-base-price - suggested-min-price - suggested-seasonal-min-price-pct - initial-base-price - initial-min-price - recommendations - category - created-at description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Listings security: - oauth2: - listings:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/PaginatedRecommendationList' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/listings/{listing_id}/refresh/: post: operationId: refresh_listing_reservations description: |- Queue an asynchronous full refresh for the specified listing. This endpoint enqueues a `sync_listing` job (listing details and availability) followed by a `sync_reservations` job for the listing's primary channel listing, then recomputes the automatic base price. It returns immediately. ## Response Codes - **202**: Listing refresh accepted and queued - **401**: Unauthorized - invalid or missing OAuth2 token - **403**: Forbidden - insufficient scope - **404**: Not found - listing not found or has no active channel listing summary: Refresh a listing (details and reservations) parameters: - in: path name: listing_id schema: type: integer required: true tags: - Listings security: - oauth2: - listings:write - personalAccessToken: [] responses: '202': description: Listing refresh accepted '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/users/: get: operationId: list_users description: |- Retrieve a paginated list of all users for the authenticated application. **Required scope:** `user:read` **Pagination:** Use `page[number]` and `page[size]` query parameters. **Sorting:** Use `sort` query parameter. Allowed: `created_at`, `-created_at`. Default: newest first (`-created_at`). **Filtering:** Use `filter[email]=` for an exact, case-insensitive match. Because email is unique this returns at most one user, and only when that user is owned by the authenticated application (otherwise the list is empty). Useful for recovering a user's `id` when only the email is known. summary: List all users parameters: - name: sort required: false in: query description: '[list of fields to sort by](https://jsonapi.org/format/#fetching-sorting)' schema: type: array items: type: string enum: - created-at - -created-at explode: false - in: query name: filter[email] schema: type: string - name: page[number] required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page[size] required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: fields[users] schema: type: array items: type: string enum: - first-name - last-name - email - locale - id - created-at - status description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Users security: - oauth2: - user:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/PaginatedUserList' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '429': description: Rate limit exceeded '500': description: Internal server error post: operationId: create_user description: |- Create a new user managed by the OAuth2 application. Users created via this endpoint are managed by the OAuth2 application and cannot login directly (password is randomly generated). The user will be associated with the OAuth2 application that created them. **Required scope:** `user:write` **Request body (JSON:API format):** ```json { "data": { "type": "users", "attributes": { "first-name": "John", "last-name": "Doe", "email": "john@example.com", "locale": "en" } } } ``` `locale` is optional and uses supported BCP 47 language tags. Defaults to `en`. summary: Create a new user tags: - Users requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/UserRequest' required: true security: - oauth2: - user:write - personalAccessToken: [] responses: '201': content: application/vnd.api+json: schema: $ref: '#/components/schemas/UserResponse' description: '' '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '409': description: Conflict - user with this email already exists '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/users/{user_id}/: get: operationId: get_user description: |- Retrieve a single user managed by the OAuth2 application. **Required scope:** `user:read` summary: Retrieve a user by ID parameters: - in: path name: user_id schema: type: integer required: true - in: query name: fields[users] schema: type: array items: type: string enum: - first-name - last-name - email - locale - id - created-at - status description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Users security: - oauth2: - user:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/UserResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error delete: operationId: delete_user description: |- Soft-delete a user managed by the OAuth2 application. This anonymizes the user's email, disables all enabled listings, removes managed accounts, and marks the user as deleted. ## Response Codes - **204**: Successfully deleted - **401**: Unauthorized - invalid or missing OAuth2 token - **403**: Forbidden - insufficient scope - **404**: Not found - user not found or not owned by this application summary: Delete a user parameters: - in: path name: user_id schema: type: integer required: true tags: - Users security: - oauth2: - user:write - personalAccessToken: [] responses: '204': description: No content '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/users/{user_id}/accounts/: get: operationId: list_accounts description: |- Return a paginated list of accounts (channel connections) for the specified user. ## Response Codes - **200**: Success - **401**: Unauthorized - invalid or missing OAuth2 token - **403**: Forbidden - insufficient scope - **404**: Not found - user not found summary: List accounts for a user parameters: - in: path name: user_id schema: type: integer required: true - name: page[number] required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page[size] required: false in: query description: Number of results to return per page. schema: type: integer tags: - Accounts security: - oauth2: - user:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/PaginatedAccountList' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error post: operationId: create_account description: |- Add a channel connection (account) for a user. Each channel requires specific credentials. ## Supported Channels and Required Credentials | Channel | Required Fields | Optional Fields | |---------|-----------------|-----------------| | `airbnb` | `email` | `password`, `device_id` | | `airbnb_partner` | `access_token` | `refresh_token`, `email` | | `avantio` | `provider_id`, `username`, `password` | - | | `barefoot_direct` | `account_id` | `web_book_reztypeid` | | `beds24` | `account_id` | - | | `best_beach` | `api_key` | - | | `booking_connect` | `email`, `password` | `device_id` | | `booking_experts` | `authorization_code` | - | | `bookingsync` | `authorization_code`, `redirect_uri` | - | | `brightside` | `subdomain`, `api_key` | - | | `ciirus` | `company_id` | `booking_id`, `booking_secret` | | `cloudbeds` | `authorization_code` | - | | `direct` | `organization_id` | - | | `elina` | `password` | - | | `escapia` | `email`, `domain`, `password`, `pm_id` | `evrn_api_user`, `evrn_api_password` | | `fantasticstay` | `api_key` | - | | `gfh` | `api_key` | - | | `guesty` | `jwt` | `booking_id`, `booking_secret` | | `homeaway` | `authorization_code` | - | | `homhero` | `reference` | - | | `homhero_staging` | `reference` | - | | `hospitable` | `authorization_code`, `client_id`, `client_secret`, `redirect_uri` | - | | `hostaway` | `client_id`, `client_secret` | - | | `hostfully` | `agency_id` | `authorization_code` | | `hosthub` | `api_key` | - | | `hostify` | `api_key` | - | | `icnea` | `account_id` | - | | `igms` | `authorization_code` | - | | `ipro` | `client_code`, `password`, `domain` | - | | `janiis` | `organization_id`, `api_key` | - | | `kigo` | `api_key` | - | | `kigo_pro` | `authorization_code` | - | | `kross_booking` | `hotel_id`, `username`, `password` | - | | `lightmaker` | `company_id` | - | | `liverez` | `username`, `password`, `security_id` | - | | `lodgable` | `client_id`, `client_password` | - | | `lodgify` | `api_key` | - | | `lodgify_partner` | `api_key` | - | | `lodgix` | `api_key` | - | | `loggia` | `email`, `api_key`, `page_id` | - | | `mews` | `access_token` | - | | `myvr` | `authorization_code` | - | | `octorate` | `authorization_code`, `redirect_uri` | - | | `opera` | `enterprise_id`, `client_id`, `hotel_id`, `client_secret`, `base_url` | - | | `ownerrez` | `authorization_code`, `redirect_uri` | - | | `real_time_rental` | `account_id` | - | | `rentalready` | `authorization_code` | - | | `rentals_united` | `email` | `password` | | `resly` | `api_key`, `property_id` | - | | `rms` | `client_id`, `client_password` | - | | `secra` | `landlord_no`, `authcode` | - | | `septeo` | `agency_id` | - | | `smoobu` | `client_id`, `api_key` | - | | `stays` | `username`, `password`, `base_url` | - | | `streamline` | `token_key`, `token_secret` | - | | `supercontrol` | `client_key` | - | | `tokeet` | `access_code`, `redirect_uri` | - | | `track` | `username`, `password`, `subdomain`, `post_key`, `post_secret` | - | | `travelmob` | `email` | `password` | | `uplisting` | `api_key` | - | | `villas365` | `account_id`, `owner_token`, `key`, `password` | - | | `vrbo` | `email` | `password` | | `vreasy` | `api_key` | - | | `vrm` | `client_code` | - | | `zeevou` | `username`, `secret` | - | | `zeevou_direct` | `authorization_code` | - | _Dynamic/custom PMS channels require `api_key` and optionally `base_url`._ ## Response Codes - **201**: Account created successfully - **400**: Validation error - invalid input data - **401**: Unauthorized - invalid or missing OAuth2 token - **403**: Forbidden - insufficient scope - **404**: Not found - user not found - **422**: Channel validation/authentication failed - **502**: Channel error (external service issue) summary: Add an account for a user parameters: - in: path name: user_id schema: type: integer required: true tags: - Accounts requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/AccountCreateRequest' examples: APIKeyChannel(Hostify): value: data: type: accounts attributes: channel: hostify credentials: api_key: your-api-key-here summary: Add an API key channel ClientID/SecretChannel(Hostaway): value: data: type: accounts attributes: channel: hostaway credentials: client_id: '12345' client_secret: abcdef123456 summary: Add a client ID/secret channel JWTChannel(Guesty): value: data: type: accounts attributes: channel: guesty credentials: jwt: your-jwt-token-here summary: Add a JWT-based channel required: true security: - oauth2: - user:write - personalAccessToken: [] responses: '201': content: application/vnd.api+json: schema: $ref: '#/components/schemas/AccountResponse' description: '' '400': description: Validation error '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable entity '429': description: Rate limit exceeded '500': description: Internal server error '502': description: Channel error /api/v1/users/{user_id}/accounts/{account_id}/: get: operationId: get_account description: |- Retrieve a single account (channel connection) for the specified user. ## Response Codes - **200**: Success - **401**: Unauthorized - invalid or missing OAuth2 token - **403**: Forbidden - insufficient scope - **404**: Not found - user or account not found summary: Get an account for a user parameters: - in: path name: user_id schema: type: integer required: true - in: path name: account_id schema: type: integer required: true tags: - Accounts security: - oauth2: - user:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/AccountResponse' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error delete: operationId: delete_account description: |- Remove a channel connection (account) for a user. This unregisters webhooks and soft-deletes the account. ## Response Codes - **204**: Successfully deleted - **401**: Unauthorized - invalid or missing OAuth2 token - **403**: Forbidden - insufficient scope - **404**: Not found - user or account not found summary: Delete an account for a user parameters: - in: path name: user_id schema: type: integer required: true - in: path name: account_id schema: type: integer required: true tags: - Accounts security: - oauth2: - user:write - personalAccessToken: [] responses: '204': description: No content '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/users/{user_id}/accounts/{account_id}/refresh/: post: operationId: refresh_account description: |- Queue a full listings and reservations refresh for the specified account. This endpoint enqueues an asynchronous `sync_all` job and returns immediately. Use `recent_sync_threshold_minutes` to control how recently synced listings are skipped. The threshold unit is minutes. When set to `0`, the refresh includes all listings. If you have registered a webhook, an `account.refreshed` event is delivered once the listing sync reaches a terminal state, so you do not have to poll. Reservations are refreshed by separate background jobs and are still in flight when that event fires. ## Response Codes - **400**: Validation error - invalid query parameter value - **202**: Refresh accepted and queued - **401**: Unauthorized - invalid or missing OAuth2 token - **403**: Forbidden - insufficient scope - **404**: Not found - user or account not found - **409**: Conflict - a refresh is already in progress; retry shortly summary: Refresh an account for a user parameters: - in: path name: user_id schema: type: integer required: true - in: path name: account_id schema: type: integer required: true - in: query name: recent_sync_threshold_minutes schema: type: integer description: Skip listings synced within the last N minutes. Defaults to 60. Set to 0 to disable this optimization and refresh all listings. tags: - Accounts security: - oauth2: - user:write - personalAccessToken: [] responses: '400': description: Validation error '202': description: Refresh accepted '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '409': description: Conflict - a refresh is already in progress for this account '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/users/{user_id}/credentials/: get: operationId: list_user_credentials description: Retrieve the credentials visible for one user. summary: List credentials for a user parameters: - in: path name: user_id schema: type: integer required: true - name: page[number] required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page[size] required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: fields[credentials] schema: type: array items: type: string enum: - created-at - last-login - credential-type - global-permissions - email description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Users security: - oauth2: - user:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/PaginatedUserCredentialList' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '429': description: Rate limit exceeded '500': description: Internal server error /api/v1/users/{user_id}/market-insights/: get: operationId: get_market_insights description: |- Retrieve aggregated market insights for a specific user. **Required scope:** `insights:read` **Filters:** Use `filter[markets]`, `filter[clusters]`, `filter[cities]`, `filter[bedrooms]`, `filter[start-date]`, `filter[end-date]`, and `filter[currency]` query parameters. **Example:** `GET /api/v1/users/42/market-insights/?filter[markets]=San Francisco&filter[currency]=USD` summary: Get market insights for a user parameters: - in: path name: user_id schema: type: integer required: true - name: page[number] required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page[size] required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: filter[markets] schema: type: string description: Comma-separated market names to filter by. At least one of filter[markets], filter[clusters], or filter[cities] is required. - in: query name: filter[clusters] schema: type: string description: Comma-separated cluster names to filter by. At least one of filter[markets], filter[clusters], or filter[cities] is required. - in: query name: filter[cities] schema: type: string description: Comma-separated city names to filter by. At least one of filter[markets], filter[clusters], or filter[cities] is required. - in: query name: filter[bedrooms] schema: type: string description: Comma-separated bedroom counts to filter by. - in: query name: filter[start-date] schema: type: string format: date description: Start date (YYYY-MM-DD) used for both check-in and booked filters. Defaults to today - 365 days. - in: query name: filter[end-date] schema: type: string format: date description: End date (YYYY-MM-DD) used for both check-in and booked filters. Defaults to today + 365 days. - in: query name: filter[currency] schema: type: string description: Currency code for prices (e.g. USD, EUR). Defaults to user's billing currency. - in: query name: fields[market-insights] schema: type: array items: type: string enum: - id - date - availability - added-listing-count - listing-count - canceled-count-by-stay-date - canceled-count-by-booked-date - canceled-count-by-canceled-date - total-count-by-stay-date - total-count-by-booked-date - checkin-date-count - volume-by-checkin-date - billable-volume-by-checkin-date - sum-lead-time - sum-stay-length - median-lead-time - median-stay-length - booked-at-count - volume-by-booked-at - billable-volume-by-booked-at - volume - week-ago-volume - year-ago-volume - two-years-ago-volume - three-years-ago-volume - four-years-ago-volume - five-years-ago-volume - six-years-ago-volume - billable-volume - year-ago-billable-volume - two-years-ago-billable-volume - three-years-ago-billable-volume - four-years-ago-billable-volume - five-years-ago-billable-volume - six-years-ago-billable-volume - occupied-days-count - week-ago-occupied-days-count - year-ago-occupied-days-count - two-years-ago-occupied-days-count - three-years-ago-occupied-days-count - four-years-ago-occupied-days-count - five-years-ago-occupied-days-count - six-years-ago-occupied-days-count - median-lead-time-one-year-ago - median-lead-time-two-years-ago - median-lead-time-three-years-ago - median-lead-time-four-years-ago - median-lead-time-five-years-ago - median-lead-time-six-years-ago - owner-nights - year-ago-owner-nights - owner-volume - year-ago-owner-volume description: endpoint return only specific fields in the response on a per-type basis by including a fields[TYPE] query parameter. explode: false tags: - Insights security: - oauth2: - user:read - insights:read - personalAccessToken: [] responses: '200': content: application/vnd.api+json: schema: $ref: '#/components/schemas/PaginatedMarketInsightsList' description: '' '401': description: Unauthorized - invalid or missing bearer token '403': description: Forbidden '404': description: Not found - resource does not exist '422': description: Unprocessable - not enough market data '429': description: Rate limit exceeded '500': description: Internal server error /o/token/: post: operationId: create_token summary: Request an OAuth2 access token description: |- Exchange client credentials for an access token. When called without extra subject fields, this endpoint issues an **application-level OAuth2 token**. Include `user_id` to obtain a **user-scoped OAuth2 token** that restricts access to a single user's resources. Include `credential_id` to further bind that token to one login credential within the user. Personal access tokens are issued separately and are not minted through `/o/token/`. Paste a `bpat_...` token directly into the **Authorize** dialog (lock icon) when you want to authenticate with a PAT. After obtaining an OAuth2 token here, copy it and paste it into the **Authorize** dialog to authenticate subsequent requests. tags: - OAuth2 security: [] requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object required: - grant_type - client_id - client_secret properties: grant_type: type: string enum: - client_credentials description: OAuth2 grant type. client_id: type: string description: Application client ID. client_secret: type: string description: Application client secret. scope: type: string description: 'Space-separated list of scopes. Available: `listings:read`, `listings:write`, `reservations:read`, `accounts:read`, `user:read`, `user:write`, `insights:read`, `compsets:read`, `neyoba:ask`.' user_id: type: integer description: Bind the token to this user's resources (user-scoped token). Required when the application enforces user-scoped tokens. credential_id: type: integer description: Optional login credential within the bound user. When omitted for a user-scoped token, the user's primary credential is used. responses: '200': description: Token issued successfully. content: application/json: schema: type: object properties: access_token: type: string description: Bearer token for API requests. token_type: type: string example: Bearer expires_in: type: integer example: 3600 description: Token lifetime in seconds. scope: type: string description: Granted scopes (space-separated). user_id: type: string description: Present only for user-scoped tokens. The ID of the bound user. credential_id: type: string description: Present when the token is bound to a specific user credential. '400': description: Invalid request (missing or invalid parameters). '401': description: Invalid client credentials. components: schemas: Account: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/AccountResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: user-id: type: integer description: ID of the user who owns this account channel: type: string description: Channel identifier (e.g., 'airbnb', 'guesty') channel-id: type: string description: Account identifier on the channel side channel-display-id: type: - string - 'null' description: Human-readable display ID label: type: string description: Human-readable channel label email: type: - string - 'null' description: Email associated with this account valid: type: boolean description: Whether the account credentials are currently valid nb-enabled-listings: type: integer readOnly: true description: Number of enabled listings in this account nb-listings: type: integer readOnly: true description: Total number of listings in this account is-pms: type: boolean readOnly: true description: Whether this channel is a property management system sync-status: allOf: - $ref: '#/components/schemas/AccountSyncStatus' readOnly: true description: Status of the account sync process started after account connection required: - id - user-id - channel - channel-id - channel-display-id - label - email - valid AccountCreateRequest: type: object properties: data: type: object required: - type additionalProperties: false properties: type: type: string description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. enum: - accounts attributes: type: object properties: channel: type: string minLength: 1 description: 'Channel identifier (e.g., ''hostify'', ''hostaway''). Supported channels: airbnb, airbnb_partner, avantio, barefoot_direct, beds24, best_beach, booking_connect, booking_experts, bookingsync, brightside, ciirus, cloudbeds, direct, elina, escapia, fake, fake_2, fake_pms, fantasticstay, gfh, guesty, homeaway, homhero, homhero_staging, hospitable, hostaway, hostfully, hosthub, hostify, icnea, igms, ipro, janiis, kigo, kigo_pro, kross_booking, lightmaker, liverez, lodgable, lodgify, lodgify_partner, lodgix, loggia, mews, myvr, octorate, opera, ownerrez, real_time_rental, rentalready, rentals_united, resly, rms, secra, septeo, smoobu, stays, streamline, supercontrol, tokeet, track, travelmob, uplisting, villas365, vrbo, vreasy, vrm, zeevou, zeevou_direct' credentials: type: object additionalProperties: {} description: Credentials for the specified channel required: - channel - credentials required: - data AccountCreatedEvent: type: object properties: meta: $ref: '#/components/schemas/_EventMeta' data: $ref: '#/components/schemas/AccountCreatedEventData' required: - data - meta AccountCreatedEventAttributes: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: status: enum: - succeeded - failed type: string description: |- Terminal outcome of the initial listing sync. 'succeeded' means every listing on the account synced without error; 'failed' means at least one listing failed, or the sync itself did not complete. * `succeeded` - succeeded * `failed` - failed completed-at: type: string format: date-time description: UTC timestamp when the sync reached its terminal state (RFC 3339) channel: type: string description: Channel the account is connected to (e.g. 'airbnb', 'hostaway'). nb-listings-synced: type: integer description: Number of listings successfully created (or, for a revived account, restored) on this account by the sync. nb-listings-failed: type: - integer - 'null' description: Number of listings the sync could not create. Always present; 0 when status='succeeded'. It is null when the sync did not run to completion (for example an infrastructure failure or a channel-wide error), so the per-listing count is unknown — in that case nb-listings-synced reports how many listings exist on the account, and status is 'failed'. error: type: - string - 'null' description: Short, human-readable failure description. Present only when status='failed'. Stable across retries of the same delivery. required: - channel - completed-at - nb-listings-failed - nb-listings-synced - status AccountCreatedEventData: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: type: type: string description: JSON:API resource type for this event id: type: string description: ULID event identifier (msg_), same as the webhook-id header. Stable across delivery retries; dedupe on it. attributes: $ref: '#/components/schemas/AccountCreatedEventAttributes' relationships: $ref: '#/components/schemas/AccountCreatedEventRelationships' required: - attributes - id - relationships - type AccountCreatedEventRelationships: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: user: $ref: '#/components/schemas/_Relationship' account: $ref: '#/components/schemas/_Relationship' required: - account - user AccountRefreshedEvent: type: object properties: meta: $ref: '#/components/schemas/_EventMeta' data: $ref: '#/components/schemas/AccountRefreshedEventData' required: - data - meta AccountRefreshedEventAttributes: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: status: enum: - succeeded - failed type: string description: |- Terminal outcome of the refresh. 'succeeded' means every listing the refresh considered synced without error; 'failed' means at least one listing failed, or the sync itself did not complete. * `succeeded` - succeeded * `failed` - failed completed-at: type: string format: date-time description: UTC timestamp when the refresh reached its terminal state (RFC 3339) channel: type: string description: Channel the account is connected to (e.g. 'airbnb', 'hostaway'). nb-listings-synced: type: integer description: Number of listings the refresh successfully re-synced. Listings skipped as recently synced are not counted, so this can be lower than the account's listing count — and 0 when everything was skipped. nb-listings-failed: type: - integer - 'null' description: Number of listings the refresh could not sync. Always present; 0 when status='succeeded'. It is null when the sync did not run to completion (for example an infrastructure failure or a channel-wide error), so the per-listing count is unknown — in that case nb-listings-synced reports how many listings exist on the account, and status is 'failed'. recent-sync-threshold-minutes: type: integer description: The threshold the refresh ran with, echoed from the request. Listings synced within this many minutes were skipped. 0 means no listing was skipped. error: type: - string - 'null' description: Short, human-readable failure description. Present only when status='failed'. Stable across retries of the same delivery. required: - channel - completed-at - nb-listings-failed - nb-listings-synced - recent-sync-threshold-minutes - status AccountRefreshedEventData: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: type: type: string description: JSON:API resource type for this event id: type: string description: ULID event identifier (msg_), same as the webhook-id header. Stable across delivery retries; dedupe on it. attributes: $ref: '#/components/schemas/AccountRefreshedEventAttributes' relationships: $ref: '#/components/schemas/AccountRefreshedEventRelationships' required: - attributes - id - relationships - type AccountRefreshedEventRelationships: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: user: $ref: '#/components/schemas/_Relationship' account: $ref: '#/components/schemas/_Relationship' required: - account - user AccountResourceTypeEnum: type: string enum: - accounts AccountResponse: type: object properties: data: $ref: '#/components/schemas/Account' required: - data AccountSyncStatus: type: object description: |- Serializer for the account sync status. Receives the full ManagedAccount instance via ``source="*"`` and derives the sync state from the pending sync job and ``listings_synced_at``. properties: state: allOf: - $ref: '#/components/schemas/StateEnum' description: |- Current sync state: queued, in_progress, completed, or unknown * `queued` - queued * `in_progress` - in_progress * `completed` - completed * `unknown` - unknown last-successful-sync-at: type: - string - 'null' format: date-time description: Timestamp of the last successful listing sync, or null if never synced required: - last-successful-sync-at - state BasePriceCustomization: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/BasePriceCustomizationTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: base-price: type: integer minimum: 10 description: Default nightly base price for the listing. Must be at least 10. required: - base-price BasePriceCustomizationNested: type: object description: Base price customization nested in the aggregate response. properties: base-price: type: integer minimum: 10 description: Default nightly base price for the listing. Must be at least 10. required: - base-price BasePriceCustomizationResponse: type: object properties: data: $ref: '#/components/schemas/BasePriceCustomization' required: - data BasePriceCustomizationTypeEnum: type: string enum: - base-price-customizations CalendarEntry: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/CalendarEntryResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: date: type: string format: date description: Calendar date availability: type: string description: Availability status (e.g., 'available', 'booked', 'blocked') price: type: integer description: Final price in minor currency units (e.g., cents) price-posted: type: - integer - 'null' description: Last price posted to the channel in minor currency units effective-min-price: type: integer description: Effective minimum price floor for the day in minor currency units. Includes user/seasonal/day-of-week minimums, the benchmark floor, and rebooking protection. The modeled price will not go below this. effective-max-price: type: - integer - 'null' description: Effective maximum price ceiling for the day in minor currency units (per-day maximum override, else the listing maximum). Null when no maximum is configured. The modeled price will not exceed this. factors: type: array items: $ref: '#/components/schemas/Factor' description: Pricing factors that contribute to the modeled price required: - date - availability - price - price-posted - effective-min-price - effective-max-price - factors CalendarEntryResourceTypeEnum: type: string enum: - calendar-entries Compset: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/TypeF0bEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: listing-id: type: - integer - 'null' description: Beyond listing id the comp set is anchored to (null for custom). kind: enum: - custom - connected type: string description: |- Comp set kind: `custom` (no Beyond listing) or `connected` (anchored to a Beyond listing). Custom comp sets have null `source.min-stay`/`base-price`/`health-score`/`market` and a null `performance.main-listing-metrics`. * `custom` - Custom * `connected` - Connected title: type: - string - 'null' description: Comp set title. matched-airbnb-id: type: - string - 'null' description: Airbnb id Beyond matched to the base listing, when available. created-at: type: - string - 'null' format: date-time description: When the comp set was created. updated-at: type: - string - 'null' format: date-time description: When the comp set was last updated. source: $ref: '#/components/schemas/CompsetSource' members: type: array items: $ref: '#/components/schemas/CompsetMember' performance: allOf: - $ref: '#/components/schemas/CompsetPerformance' description: The listing's metrics vs. the aggregated compset benchmark over `start_date`..`end_date`. required: - kind - source - members - performance CompsetMember: type: object description: One curated member of the comp set. properties: channel: type: string description: 'Source channel: `airbnb`, `vrbo`, or `bookingcom`.' channel-listing-id: type: - string - 'null' description: Channel-native listing id of the comparable property (the id in `url`); not a Beyond listing id. title: type: - string - 'null' url: type: - string - 'null' image: type: - string - 'null' bedrooms: type: - number - 'null' format: double bathrooms: type: - number - 'null' format: double description: Bathroom count (decimals denote half-baths, e.g. 1.5). room-type: type: - string - 'null' latitude: type: - number - 'null' format: double longitude: type: - number - 'null' format: double distance-km: type: - number - 'null' format: double description: Distance from the base listing in kilometers. rating: type: - number - 'null' format: double reviews-count: type: - integer - 'null' health-score: type: - number - 'null' format: double metrics: $ref: '#/components/schemas/CompsetMemberMetrics' required: - channel - channel-listing-id - metrics CompsetMemberMetrics: type: object description: Metrics for a single comp-set member over the next 30 and 90 days. properties: thirty-day-adr: type: - number - 'null' format: double description: Average booked rate (ADR), next 30 days. ninety-day-adr: type: - number - 'null' format: double description: Average booked rate (ADR), next 90 days. thirty-day-booked: type: - number - 'null' format: double description: Occupancy percentage, next 30 days. ninety-day-booked: type: - number - 'null' format: double description: Occupancy percentage, next 90 days. thirty-day-availability: type: - number - 'null' format: double description: Availability percentage, next 30 days. ninety-day-availability: type: - number - 'null' format: double description: Availability percentage, next 90 days. thirty-day-min-stays: type: - integer - 'null' description: Minimum stay, next 30 days. ninety-day-min-stays: type: - integer - 'null' description: Minimum stay, next 90 days. thirty-day-adj-occupancy: type: - number - 'null' format: double description: Adjusted occupancy percentage, next 30 days. ninety-day-adj-occupancy: type: - number - 'null' format: double description: Adjusted occupancy percentage, next 90 days. thirty-day-booked-rate: type: - number - 'null' format: double description: Booked rate, next 30 days. ninety-day-booked-rate: type: - number - 'null' format: double description: Booked rate, next 90 days. base-price: type: - number - 'null' format: double description: Average base price over the next 365 days. currency: type: - string - 'null' description: ISO currency code for the member's prices. rating: type: - number - 'null' format: double description: Aggregate guest star rating. reviews-count: type: - integer - 'null' description: Number of guest reviews. average-service-fee: type: - number - 'null' format: double description: Average service fee (Airbnb-only; null on other channels). CompsetPerformance: type: object description: Date-ranged comparison of the base listing vs. the compset benchmark. properties: start-date: type: string format: date description: First stay date in the range. end-date: type: string format: date description: Last stay date in the range. currency: type: string description: ISO currency code for the figures. main-listing-metrics: oneOf: - $ref: '#/components/schemas/CompsetPerformanceListingMetrics' - type: 'null' description: The base listing's metrics over the range. `null` for `custom` comp sets, which have no Beyond listing. aggregated-metrics: $ref: '#/components/schemas/CompsetPerformanceAggregateMetrics' required: - aggregated-metrics - currency - end-date - start-date CompsetPerformanceAggregateMetrics: type: object description: The aggregated compset benchmark over the requested date range. properties: average-posted-rate: type: - number - 'null' format: double description: Compset average posted nightly rate. occupancy: type: - number - 'null' format: double description: Compset average occupancy percentage. average-min-stay: type: - number - 'null' format: double description: Compset average minimum stay. average-booked-rate: type: - number - 'null' format: double description: Compset average booked rate (ADR). adj-occupancy: type: - number - 'null' format: double description: Compset average adjusted occupancy percentage. number-of-nearby-listings: type: - integer - 'null' description: Number of members contributing to the aggregate. CompsetPerformanceListingMetrics: type: object description: The base listing's metrics over the requested date range. properties: average-posted-rate: type: - number - 'null' format: double description: Average posted nightly rate over the range. occupancy: type: - number - 'null' format: double description: Occupancy percentage over the range. average-min-stay: type: - number - 'null' format: double description: Average minimum stay over the range. average-booked-rate: type: - number - 'null' format: double description: Average booked rate (ADR) over the range. adj-occupancy: type: - number - 'null' format: double description: Adjusted occupancy percentage over the range. CompsetResponse: type: object properties: data: $ref: '#/components/schemas/Compset' required: - data CompsetSource: type: object description: The base listing the comp set was built around. properties: bedrooms: type: - integer - 'null' bathrooms: type: - number - 'null' format: double latitude: type: - number - 'null' format: double longitude: type: - number - 'null' format: double address: type: - string - 'null' city: type: - string - 'null' state: type: - string - 'null' country: type: - string - 'null' market: type: - string - 'null' currency: type: - string - 'null' description: ISO currency code for the base listing. base-price: type: - number - 'null' format: double description: Average base price over the next 365 days. health-score: type: - integer - 'null' min-stay: type: - integer - 'null' metrics: $ref: '#/components/schemas/CompsetSourceMetrics' required: - metrics CompsetSourceMetrics: type: object description: Headline metrics for the base listing over the next 30 and 90 days. properties: thirty-day-price: type: - number - 'null' format: double description: Average posted nightly rate, next 30 days. ninety-day-price: type: - number - 'null' format: double description: Average posted nightly rate, next 90 days. thirty-day-adr: type: - number - 'null' format: double description: Average booked rate (ADR), next 30 days. ninety-day-adr: type: - number - 'null' format: double description: Average booked rate (ADR), next 90 days. thirty-day-booked: type: - number - 'null' format: double description: Occupancy percentage, next 30 days. ninety-day-booked: type: - number - 'null' format: double description: Occupancy percentage, next 90 days. thirty-day-availability: type: - number - 'null' format: double description: Availability percentage, next 30 days. ninety-day-availability: type: - number - 'null' format: double description: Availability percentage, next 90 days. thirty-day-min-stays: type: - integer - 'null' description: Minimum stay, next 30 days. ninety-day-min-stays: type: - integer - 'null' description: Minimum stay, next 90 days. rating: type: - number - 'null' format: double description: Aggregate guest star rating. reviews-count: type: - integer - 'null' description: Number of guest reviews. average-service-fee: type: - number - 'null' format: double description: Average service fee (Airbnb-only; null on other channels). CompsetSummary: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/TypeF0bEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: type: integer attributes: type: object properties: listing-id: type: - integer - 'null' readOnly: true description: Beyond listing id the comp set is anchored to (null for custom). kind: enum: - custom - connected type: string description: 'Comp set kind: `custom` or `connected`.' readOnly: true title: type: - string - 'null' readOnly: true description: Comp set name. member-count: type: integer readOnly: true description: Total number of members across channels. created-at: type: string format: date-time readOnly: true updated-at: type: string format: date-time readOnly: true relationships: type: object properties: owner: type: object properties: data: type: object properties: id: type: integer type: type: string enum: - users title: Resource Type Name description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. required: - id - type required: - data description: The identifier of the related object. title: Owner readOnly: true listing: type: object properties: data: type: object properties: id: type: integer type: type: string enum: - listings title: Resource Type Name description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. required: - id - type required: - data description: The identifier of the related object. title: Listing readOnly: true CredentialResourceTypeEnum: type: string enum: - credentials DayOfWeekMinPrice: type: object description: A nightly minimum-price override for a specific weekday. properties: weekday: allOf: - $ref: '#/components/schemas/WeekdayEnum' description: |- Day of week this override applies to. * `monday` - monday * `tuesday` - tuesday * `wednesday` - wednesday * `thursday` - thursday * `friday` - friday * `saturday` - saturday * `sunday` - sunday min-price: type: - integer - 'null' minimum: 5 description: Minimum nightly price to use on that weekday. required: - weekday DayOfWeekMinPriceRequest: type: object description: A nightly minimum-price override for a specific weekday. properties: weekday: allOf: - $ref: '#/components/schemas/WeekdayEnum' description: |- Day of week this override applies to. * `monday` - monday * `tuesday` - tuesday * `wednesday` - wednesday * `thursday` - thursday * `friday` - friday * `saturday` - saturday * `sunday` - sunday min-price: type: - integer - 'null' minimum: 5 description: Minimum nightly price to use on that weekday. required: - weekday DayOfWeekMinStay: type: object description: A minimum-stay override for a specific weekday. properties: weekday: allOf: - $ref: '#/components/schemas/WeekdayEnum' description: |- Day of week this override applies to. * `monday` - monday * `tuesday` - tuesday * `wednesday` - wednesday * `thursday` - thursday * `friday` - friday * `saturday` - saturday * `sunday` - sunday min-stay: type: - integer - 'null' minimum: 1 description: Minimum stay, in nights, to require on that weekday. required: - weekday DayOfWeekMinStayRequest: type: object description: A minimum-stay override for a specific weekday. properties: weekday: allOf: - $ref: '#/components/schemas/WeekdayEnum' description: |- Day of week this override applies to. * `monday` - monday * `tuesday` - tuesday * `wednesday` - wednesday * `thursday` - thursday * `friday` - friday * `saturday` - saturday * `sunday` - sunday min-stay: type: - integer - 'null' minimum: 1 description: Minimum stay, in nights, to require on that weekday. required: - weekday DirectionEnum: enum: - within - after type: string description: |- * `within` - within * `after` - after DynamicTimeBasedAdjustmentsRequest: type: object description: Request payload for auto-generated time-based pricing recommendations. properties: enabled: type: boolean description: Whether dynamic time-based adjustments are enabled. tier: allOf: - $ref: '#/components/schemas/TierEnum' description: |- Optimization goal for recommendations. Must be `revenue`, `occupancy`, or `rate`. * `revenue` - revenue * `occupancy` - occupancy * `rate` - rate DynamicTimeBasedAdjustmentsRequestRequest: type: object description: Request payload for auto-generated time-based pricing recommendations. properties: enabled: type: boolean description: Whether dynamic time-based adjustments are enabled. tier: allOf: - $ref: '#/components/schemas/TierEnum' description: |- Optimization goal for recommendations. Must be `revenue`, `occupancy`, or `rate`. * `revenue` - revenue * `occupancy` - occupancy * `rate` - rate ExtraGuestFeeCustomization: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/ExtraGuestFeeCustomizationResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: extra-guest-fee: type: - integer - 'null' minimum: 1 description: Per-guest fee charged once the booking exceeds the extra guest threshold. extra-guest-threshold: type: - integer - 'null' minimum: 1 description: Number of guests included before the extra guest fee applies. required: - extra-guest-fee - extra-guest-threshold ExtraGuestFeeCustomizationNested: type: object description: Extra guest fee customization nested in the aggregate response. properties: extra-guest-fee: type: - integer - 'null' minimum: 1 description: Per-guest fee charged once the booking exceeds the extra guest threshold. extra-guest-threshold: type: - integer - 'null' minimum: 1 description: Number of guests included before the extra guest fee applies. required: - extra-guest-fee - extra-guest-threshold ExtraGuestFeeCustomizationResourceTypeEnum: type: string enum: - extra-guest-fee-customizations ExtraGuestFeeCustomizationResponse: type: object properties: data: $ref: '#/components/schemas/ExtraGuestFeeCustomization' required: - data Factor: type: object description: |- Serializer for a pricing factor within a calendar entry. Factors represent the individual components that influence the final price (e.g., seasonality, day-of-week, events). properties: key: type: string description: Factor identifier (e.g., 'seasonality', 'dow', 'event') order: type: integer description: Display order of the factor ratio: type: number format: double description: Factor's contribution as a ratio (e.g., -0.19 means -19%) amount: type: integer description: This factor's contribution to the modeled price, in the same currency units as `price`. Negative values lower the price. Factors whose effect rounds to less than 1 report 0. Amounts do not necessarily sum to (price - base price) because min/max price limits and final rounding are applied between factors and are not attributed to any single factor. reason: type: - string - 'null' description: Human-readable reason for the factor (e.g., event name) event-impact: type: - string - 'null' description: 'Event impact level: ''low'', ''medium'', or ''high''. Only present for event factors.' required: - amount - key - order - ratio GapFillMinStay: type: object description: Gap-fill settings used to raise min stays around short orphan gaps. properties: enabled: type: boolean description: Whether orphan-gap min-stay protection is enabled. gaps: type: - integer - 'null' minimum: 1 description: Maximum orphan-gap length, in nights, that should trigger the rule. buffer: type: - integer - 'null' minimum: 0 description: Extra nights around the gap that still count toward the rule. GapFillMinStayRequest: type: object description: Gap-fill settings used to raise min stays around short orphan gaps. properties: enabled: type: boolean description: Whether orphan-gap min-stay protection is enabled. gaps: type: - integer - 'null' minimum: 1 description: Maximum orphan-gap length, in nights, that should trigger the rule. buffer: type: - integer - 'null' minimum: 0 description: Extra nights around the gap that still count toward the rule. Listing: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/ListingResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: type: integer attributes: type: object properties: title: type: string maxLength: 255 image: type: - string - 'null' maxLength: 1024 neighborhood: type: - string - 'null' maxLength: 256 city: type: - string - 'null' maxLength: 256 state: type: - string - 'null' maxLength: 256 country: type: - string - 'null' maxLength: 256 room-type: type: - string - 'null' maxLength: 256 bedrooms: type: - integer - 'null' maximum: 2147483647 minimum: -2147483648 bathrooms: type: - string - 'null' format: decimal pattern: ^-?\d{0,2}(?:\.\d{0,2})?$ base-price: type: integer readOnly: true base-price-updated-at: type: - string - 'null' format: date-time min-price: type: - integer - 'null' readOnly: true min-price-updated-at: type: - string - 'null' format: date-time max-price: type: - integer - 'null' readOnly: true min-stay: type: - integer - 'null' readOnly: true extra-guest-fee: type: - integer - 'null' readOnly: true extra-guest-threshold: type: - integer - 'null' readOnly: true latitude: type: - string - 'null' format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,8})?$ longitude: type: - string - 'null' format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,8})?$ timezone: type: string readOnly: true currency: type: - string - 'null' maxLength: 3 in-active-market: type: boolean readOnly: true description: 'Whether the listing is fully priceable: assigned to a pricing cluster whose market is active. False on the rare listing without a cluster — its calendar endpoint returns 400. The listing.in_active_market_changed webhook announces a priced listing''s value changing.' enabled: type: boolean readOnly: true address: type: - string - 'null' maxLength: 1024 created-at: type: string format: date-time readOnly: true channel-listings: type: array items: $ref: '#/components/schemas/ListingChannelListing' readOnly: true description: Active channel listings linked to this listing required: - title relationships: type: object properties: owner: type: object properties: data: type: object properties: id: type: integer type: type: string enum: - users title: Resource Type Name description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. required: - id - type required: - data description: The identifier of the related object. title: Owner readOnly: true ListingActivation: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/ListingActivationResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: enabled: type: boolean description: Whether price syncing is enabled for the listing. base-price: type: number format: double minimum: 10 description: Base price to apply after the activation update. min-price: type: number format: double minimum: 5 description: Minimum price to apply after the activation update. required: - enabled ListingActivationResourceTypeEnum: type: string enum: - listing-activations ListingActivationResponse: type: object properties: data: $ref: '#/components/schemas/ListingActivation' required: - data ListingBasePriceChangedEvent: type: object properties: meta: $ref: '#/components/schemas/_EventMeta' data: $ref: '#/components/schemas/ListingBasePriceChangedEventData' required: - data - meta ListingBasePriceChangedEventAttributes: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: new-base-price: type: integer description: The listing's new user-set base price, in the listing currency. A whole number — the same integer the listings endpoint exposes as base-price (fractional amounts are truncated toward zero). old-base-price: type: - integer - 'null' description: The previous base price as a whole number, or null when the listing had no base price set before this change. new-currency: type: - string - 'null' description: ISO 4217 currency code the new base price is denominated in. old-currency: type: - string - 'null' description: ISO 4217 currency code of the previous base price. Differs from new-currency only when this change is a currency re-denomination; equal to new-currency for a plain price change. changed-at: type: - string - 'null' format: date-time description: UTC timestamp when the base price changed (RFC 3339). channel-listings: type: array items: $ref: '#/components/schemas/ListingBasePriceChangedEventChannelListings' description: The listing's active channel listings — one entry per channel the listing is syndicated to, mirroring channel-listings on the listing resource. Empty on a listing with no active channel listing. enabled: type: boolean description: Whether the listing has pricing enabled. true means the price change is live; false means it is speculative — e.g. a change to the algorithm's computed starting price on a listing that is not yet enabled, or a user editing the base price before turning syncing on. change-source: enum: - user - system type: string description: |- What moved the base price. 'user' — an authenticated actor (the Partners API, the Beyond app, or an admin). 'system' — an automatic process (Beyond's algorithm computing a starting price, a scheduled auto-approved booking review, a background job). A change to the computed starting price is always 'system'. * `user` - user * `system` - system changed-by: type: - string - 'null' description: Email of the individual who made a 'user' change, when there is one to name. Null for every 'system' change, and for a 'user' change made by a machine — an app-level (client_credentials) Partners API token acts for the account as a whole, not for a person. Changes made by Beyond staff on your behalf report 'support@beyondpricing.com'. required: - change-source - changed-at - changed-by - channel-listings - enabled - new-base-price - new-currency - old-base-price - old-currency ListingBasePriceChangedEventChannelListings: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: channel: type: string description: Channel this channel listing belongs to (e.g. 'airbnb', 'hostaway'). channel-id: type: string description: The listing's identifier on the channel side — the same value exposed as channel-listings[].channel-id on the listing resource. Use it to correlate the event with your own records. required: - channel - channel-id ListingBasePriceChangedEventData: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: type: type: string description: JSON:API resource type for this event id: type: string description: ULID event identifier (msg_), same as the webhook-id header. Stable across delivery retries; dedupe on it. attributes: $ref: '#/components/schemas/ListingBasePriceChangedEventAttributes' relationships: $ref: '#/components/schemas/ListingBasePriceChangedEventRelationships' required: - attributes - id - relationships - type ListingBasePriceChangedEventRelationships: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: listing: $ref: '#/components/schemas/_Relationship' user: $ref: '#/components/schemas/_Relationship' account: $ref: '#/components/schemas/_Relationship' required: - listing - user ListingChannelListing: type: object description: Serializer for channel listings embedded in listing responses. properties: channel: type: string description: Channel identifier for the linked channel listing channel-id: type: string description: Listing identifier on the channel side required: - channel - channel-id ListingCreatedEvent: type: object properties: meta: $ref: '#/components/schemas/_EventMeta' data: $ref: '#/components/schemas/ListingCreatedEventData' required: - data - meta ListingCreatedEventAttributes: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: status: enum: - succeeded - failed type: string description: |- Outcome of the listing setup. 'succeeded' means the listing is fully set up with its initial base price computed; 'failed' means a sync attempt could not create the listing. * `succeeded` - succeeded * `failed` - failed created-at: type: - string - 'null' format: date-time description: UTC timestamp when the listing was created (RFC 3339). Null on a failed creation attempt where the listing does not exist yet. title: type: - string - 'null' description: The listing's title. currency: type: - string - 'null' description: ISO 4217 currency code the listing is denominated in. base-price: type: - integer - 'null' description: The listing's initial base price, computed by Beyond when the listing was set up, in the listing currency. A whole number — the same integer the listings endpoint exposes as base-price (fractional amounts are truncated toward zero). Null on a failed creation attempt. channel-listings: type: array items: $ref: '#/components/schemas/ListingCreatedEventChannelListings' description: The listing's active channel listings — one entry per channel the listing is syndicated to, mirroring channel-listings on the listing resource. Empty on a listing with no active channel listing. error: type: - string - 'null' description: Short, human-readable failure description. Present only when status='failed'. Stable across retries of the same delivery. required: - base-price - channel-listings - created-at - currency - status - title ListingCreatedEventChannelListings: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: channel: type: string description: Channel this channel listing belongs to (e.g. 'airbnb', 'hostaway'). channel-id: type: string description: The listing's identifier on the channel side — the same value exposed as channel-listings[].channel-id on the listing resource. Use it to correlate the event with your own records. required: - channel - channel-id ListingCreatedEventData: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: type: type: string description: JSON:API resource type for this event id: type: string description: ULID event identifier (msg_), same as the webhook-id header. Stable across delivery retries; dedupe on it. attributes: $ref: '#/components/schemas/ListingCreatedEventAttributes' relationships: $ref: '#/components/schemas/ListingCreatedEventRelationships' required: - attributes - id - relationships - type ListingCreatedEventRelationships: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: listing: $ref: '#/components/schemas/_Relationship' user: $ref: '#/components/schemas/_Relationship' account: $ref: '#/components/schemas/_Relationship' required: - user ListingCustomizationResourceTypeEnum: type: string enum: - listing-customizations ListingCustomizations: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/ListingCustomizationResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: base-price: allOf: - $ref: '#/components/schemas/BasePriceCustomizationNested' description: Base price customization, as returned by the base-price endpoint. extra-guest-fees: allOf: - $ref: '#/components/schemas/ExtraGuestFeeCustomizationNested' description: Extra guest fee customization, as returned by the extra-guest-fees endpoint. min-max-prices: allOf: - $ref: '#/components/schemas/MinMaxPricesCustomizationNested' description: Min/max prices customization, as returned by the min-max-prices endpoint. min-stays: allOf: - $ref: '#/components/schemas/MinStaysCustomizationNested' description: Min-stays customization, as returned by the min-stays endpoint. time-based-adjustments: allOf: - $ref: '#/components/schemas/TimeBasedAdjustmentsCustomizationNested' description: Time-based adjustments customization, as returned by the time-based-adjustments endpoint. ListingCustomizationsResponse: type: object properties: data: $ref: '#/components/schemas/ListingCustomizations' required: - data ListingDetail: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/ListingResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: type: integer attributes: type: object properties: title: type: string maxLength: 255 image: type: - string - 'null' maxLength: 1024 neighborhood: type: - string - 'null' maxLength: 256 city: type: - string - 'null' maxLength: 256 state: type: - string - 'null' maxLength: 256 country: type: - string - 'null' maxLength: 256 room-type: type: - string - 'null' maxLength: 256 bedrooms: type: - integer - 'null' maximum: 2147483647 minimum: -2147483648 bathrooms: type: - string - 'null' format: decimal pattern: ^-?\d{0,2}(?:\.\d{0,2})?$ base-price: type: integer readOnly: true base-price-updated-at: type: - string - 'null' format: date-time min-price: type: - integer - 'null' readOnly: true min-price-updated-at: type: - string - 'null' format: date-time max-price: type: - integer - 'null' readOnly: true min-stay: type: - integer - 'null' readOnly: true extra-guest-fee: type: - integer - 'null' readOnly: true extra-guest-threshold: type: - integer - 'null' readOnly: true latitude: type: - string - 'null' format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,8})?$ longitude: type: - string - 'null' format: decimal pattern: ^-?\d{0,4}(?:\.\d{0,8})?$ timezone: type: string readOnly: true currency: type: - string - 'null' maxLength: 3 in-active-market: type: boolean readOnly: true description: 'Whether the listing is fully priceable: assigned to a pricing cluster whose market is active. False on the rare listing without a cluster — its calendar endpoint returns 400. The listing.in_active_market_changed webhook announces a priced listing''s value changing.' enabled: type: boolean readOnly: true address: type: - string - 'null' maxLength: 1024 created-at: type: string format: date-time readOnly: true channel-listings: type: array items: $ref: '#/components/schemas/ListingChannelListing' readOnly: true description: Active channel listings linked to this listing sync-status: allOf: - $ref: '#/components/schemas/ListingSyncStatus' readOnly: true description: Status of the listing sync for the primary channel listing required: - title relationships: type: object properties: owner: type: object properties: data: type: object properties: id: type: integer type: type: string enum: - users title: Resource Type Name description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. required: - id - type required: - data description: The identifier of the related object. title: Owner readOnly: true ListingDetailResponse: type: object properties: data: $ref: '#/components/schemas/ListingDetail' required: - data ListingInActiveMarketChangedEvent: type: object properties: meta: $ref: '#/components/schemas/_EventMeta' data: $ref: '#/components/schemas/ListingInActiveMarketChangedEventData' required: - data - meta ListingInActiveMarketChangedEventAttributes: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: in-active-market: type: boolean description: 'The listing''s new in-active-market value — the same boolean the listings endpoint serves. true: the calendar endpoint works and automated price refresh is on. false: the calendar may return 400 and price refresh is off.' changed-at: type: string format: date-time description: UTC timestamp when the attribute changed (RFC 3339). Delivery order between the two directions is not guaranteed — order by this attribute, or fetch the listing for its current state. title: type: - string - 'null' description: The listing's title. channel-listings: type: array items: $ref: '#/components/schemas/ListingInActiveMarketChangedEventChannelListings' description: The listing's active channel listings — one entry per channel the listing is syndicated to, mirroring channel-listings on the listing resource. Empty on a listing with no active channel listing. required: - changed-at - channel-listings - in-active-market - title ListingInActiveMarketChangedEventChannelListings: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: channel: type: string description: Channel this channel listing belongs to (e.g. 'airbnb', 'hostaway'). channel-id: type: string description: The listing's identifier on the channel side — the same value exposed as channel-listings[].channel-id on the listing resource. Use it to correlate the event with your own records. required: - channel - channel-id ListingInActiveMarketChangedEventData: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: type: type: string description: JSON:API resource type for this event id: type: string description: ULID event identifier (msg_), same as the webhook-id header. Stable across delivery retries; dedupe on it. attributes: $ref: '#/components/schemas/ListingInActiveMarketChangedEventAttributes' relationships: $ref: '#/components/schemas/ListingInActiveMarketChangedEventRelationships' required: - attributes - id - relationships - type ListingInActiveMarketChangedEventRelationships: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: listing: $ref: '#/components/schemas/_Relationship' user: $ref: '#/components/schemas/_Relationship' account: $ref: '#/components/schemas/_Relationship' required: - listing - user ListingRefreshedEvent: type: object properties: meta: $ref: '#/components/schemas/_EventMeta' data: $ref: '#/components/schemas/ListingRefreshedEventData' required: - data - meta ListingRefreshedEventAttributes: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: status: enum: - succeeded - failed type: string description: |- Terminal outcome of the refresh chain. 'succeeded' means both the reservations sync and the ABP-C recompute completed; 'failed' means at least one step raised. * `succeeded` - succeeded * `failed` - failed completed-at: type: string format: date-time description: UTC timestamp when the terminal job finished (RFC 3339) channel: type: string description: Channel the refreshed listing belongs to (e.g. 'airbnb', 'hostaway'). channel-listing-id: type: string description: The listing's identifier on the channel side — the same value exposed as channel-listings[].channel-id on the listing resource. Use it to correlate the event with your own records. error: type: - string - 'null' description: Short, human-readable failure description. Present only when status='failed'. Stable across retries of the same delivery. required: - channel - channel-listing-id - completed-at - status ListingRefreshedEventData: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: type: type: string description: JSON:API resource type for this event id: type: string description: ULID event identifier (msg_), same as the webhook-id header. Stable across delivery retries; dedupe on it. attributes: $ref: '#/components/schemas/ListingRefreshedEventAttributes' relationships: $ref: '#/components/schemas/ListingRefreshedEventRelationships' required: - attributes - id - relationships - type ListingRefreshedEventRelationships: type: object description: |- Dasherizes field names on output and un-dasherizes on input. Apply to nested (non-resource) serializers so their keys match the top-level JSON:API dasherized format. Top-level resource serializers must NOT use this mixin (the renderer handles them). properties: listing: $ref: '#/components/schemas/_Relationship' user: $ref: '#/components/schemas/_Relationship' account: $ref: '#/components/schemas/_Relationship' required: - account - listing - user ListingResourceTypeEnum: type: string enum: - listings ListingSyncStatus: type: object description: Serializer for listing sync status based on the primary channel listing. properties: state: allOf: - $ref: '#/components/schemas/StateEnum' description: |- Current sync state: queued, in_progress, completed, or unknown * `queued` - queued * `in_progress` - in_progress * `completed` - completed * `unknown` - unknown last-successful-sync-at: type: - string - 'null' format: date-time description: Timestamp of the last successful listing sync, or null if never synced required: - last-successful-sync-at - state MarketInsightResourceTypeEnum: type: string enum: - market-insights MarketInsights: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/MarketInsightResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: date: type: string format: date description: Stay date represented by this row availability: type: integer description: Availability metric for the date added-listing-count: type: integer description: New listings added count listing-count: type: integer description: Total listings considered canceled-count-by-stay-date: type: integer description: Cancellations grouped by stay date canceled-count-by-booked-date: type: integer description: Cancellations grouped by booked date canceled-count-by-canceled-date: type: integer description: Cancellations grouped by canceled date total-count-by-stay-date: type: integer description: Total reservations grouped by stay date total-count-by-booked-date: type: integer description: Total reservations grouped by booked date checkin-date-count: type: integer description: Reservation count by check-in date volume-by-checkin-date: type: number format: double description: Gross volume grouped by check-in date billable-volume-by-checkin-date: type: number format: double description: Billable volume grouped by check-in date sum-lead-time: type: integer description: Sum of lead time across relevant reservations sum-stay-length: type: integer description: Sum of stay length across relevant reservations median-lead-time: type: number format: double description: Median lead time median-stay-length: type: number format: double description: Median stay length booked-at-count: type: integer description: Reservation count by booked date volume-by-booked-at: type: number format: double description: Gross volume grouped by booked date billable-volume-by-booked-at: type: number format: double description: Billable volume grouped by booked date volume: type: number format: double description: Current period gross volume week-ago-volume: type: number format: double description: Volume from one week ago year-ago-volume: type: number format: double description: Volume from one year ago two-years-ago-volume: type: number format: double description: Volume from two years ago three-years-ago-volume: type: number format: double description: Volume from three years ago four-years-ago-volume: type: number format: double description: Volume from four years ago five-years-ago-volume: type: number format: double description: Volume from five years ago six-years-ago-volume: type: number format: double description: Volume from six years ago billable-volume: type: number format: double description: Current period billable volume year-ago-billable-volume: type: number format: double description: Billable volume from one year ago two-years-ago-billable-volume: type: number format: double description: Billable volume from two years ago three-years-ago-billable-volume: type: number format: double description: Billable volume from three years ago four-years-ago-billable-volume: type: number format: double description: Billable volume from four years ago five-years-ago-billable-volume: type: number format: double description: Billable volume from five years ago six-years-ago-billable-volume: type: number format: double description: Billable volume from six years ago occupied-days-count: type: integer description: Current period occupied days count week-ago-occupied-days-count: type: integer description: Occupied days count from one week ago year-ago-occupied-days-count: type: integer description: Occupied days count from one year ago two-years-ago-occupied-days-count: type: integer description: Occupied days count from two years ago three-years-ago-occupied-days-count: type: integer description: Occupied days count from three years ago four-years-ago-occupied-days-count: type: integer description: Occupied days count from four years ago five-years-ago-occupied-days-count: type: integer description: Occupied days count from five years ago six-years-ago-occupied-days-count: type: integer description: Occupied days count from six years ago median-lead-time-one-year-ago: type: number format: double description: Median lead time from one year ago median-lead-time-two-years-ago: type: number format: double description: Median lead time from two years ago median-lead-time-three-years-ago: type: number format: double description: Median lead time from three years ago median-lead-time-four-years-ago: type: number format: double description: Median lead time from four years ago median-lead-time-five-years-ago: type: number format: double description: Median lead time from five years ago median-lead-time-six-years-ago: type: number format: double description: Median lead time from six years ago owner-nights: type: integer description: Current period owner nights year-ago-owner-nights: type: integer description: Owner nights from one year ago owner-volume: type: number format: double description: Current period owner volume year-ago-owner-volume: type: number format: double description: Owner volume from one year ago required: - date - availability - added-listing-count - listing-count - canceled-count-by-stay-date - canceled-count-by-booked-date - canceled-count-by-canceled-date - total-count-by-stay-date - total-count-by-booked-date - checkin-date-count - volume-by-checkin-date - billable-volume-by-checkin-date - sum-lead-time - sum-stay-length - median-lead-time - median-stay-length - booked-at-count - volume-by-booked-at - billable-volume-by-booked-at - volume - week-ago-volume - year-ago-volume - two-years-ago-volume - three-years-ago-volume - four-years-ago-volume - five-years-ago-volume - six-years-ago-volume - billable-volume - year-ago-billable-volume - two-years-ago-billable-volume - three-years-ago-billable-volume - four-years-ago-billable-volume - five-years-ago-billable-volume - six-years-ago-billable-volume - occupied-days-count - week-ago-occupied-days-count - year-ago-occupied-days-count - two-years-ago-occupied-days-count - three-years-ago-occupied-days-count - four-years-ago-occupied-days-count - five-years-ago-occupied-days-count - six-years-ago-occupied-days-count - median-lead-time-one-year-ago - median-lead-time-two-years-ago - median-lead-time-three-years-ago - median-lead-time-four-years-ago - median-lead-time-five-years-ago - median-lead-time-six-years-ago - owner-nights - year-ago-owner-nights - owner-volume - year-ago-owner-volume MinMaxPriceCustomizationResourceTypeEnum: type: string enum: - min-max-price-customizations MinMaxPricesCustomization: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/MinMaxPriceCustomizationResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: min-price: type: - number - 'null' format: double minimum: 5 description: Default minimum nightly price for the listing. max-price: type: - number - 'null' format: double description: Default maximum nightly price for the listing. monthly-min-price: type: - number - 'null' format: double minimum: 5 description: Default minimum monthly price for the listing. day-of-week-min-prices: type: array items: $ref: '#/components/schemas/DayOfWeekMinPrice' description: Year-round minimum nightly prices keyed by weekday. seasonal-day-of-week-min-prices: type: array items: $ref: '#/components/schemas/SeasonalDayOfWeekMinPrice' description: Weekday-specific nightly min prices limited to seasonal ranges. seasonal-prices: type: array items: $ref: '#/components/schemas/SeasonalPrices' description: Seasonal nightly min/max price overrides. seasonal-monthly-prices: type: array items: $ref: '#/components/schemas/SeasonalMonthlyPrices' description: Seasonal monthly min/max price overrides. MinMaxPricesCustomizationNested: type: object description: Min/max prices customization nested in the aggregate response. properties: min-price: type: - number - 'null' format: double minimum: 5 description: Default minimum nightly price for the listing. max-price: type: - number - 'null' format: double description: Default maximum nightly price for the listing. monthly-min-price: type: - number - 'null' format: double minimum: 5 description: Default minimum monthly price for the listing. day-of-week-min-prices: type: array items: $ref: '#/components/schemas/DayOfWeekMinPrice' description: Year-round minimum nightly prices keyed by weekday. seasonal-day-of-week-min-prices: type: array items: $ref: '#/components/schemas/SeasonalDayOfWeekMinPrice' description: Weekday-specific nightly min prices limited to seasonal ranges. seasonal-prices: type: array items: $ref: '#/components/schemas/SeasonalPrices' description: Seasonal nightly min/max price overrides. seasonal-monthly-prices: type: array items: $ref: '#/components/schemas/SeasonalMonthlyPrices' description: Seasonal monthly min/max price overrides. MinMaxPricesCustomizationResponse: type: object properties: data: $ref: '#/components/schemas/MinMaxPricesCustomization' required: - data MinStayCustomizationResourceTypeEnum: type: string enum: - min-stay-customizations MinStaysCustomization: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/MinStayCustomizationResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: min-stay: type: - integer - 'null' minimum: 1 description: Default minimum stay, in nights, for the listing. gap-fill-min-stay: allOf: - $ref: '#/components/schemas/GapFillMinStay' description: Year-round orphan-gap min-stay settings. seasonal-min-stays: type: array items: $ref: '#/components/schemas/SeasonalMinStay' description: Seasonal min-stay overrides keyed by date range. last-minute-min-stays: type: array items: $ref: '#/components/schemas/TimeBasedMinStay' description: Year-round lead-time min-stay rules. day-of-week-min-stays: type: array items: $ref: '#/components/schemas/DayOfWeekMinStay' description: Year-round minimum stays keyed by weekday. seasonal-day-of-week-min-stays: type: array items: $ref: '#/components/schemas/SeasonalDayOfWeekMinStay' description: Weekday-specific minimum stays limited to seasonal ranges. seasonal-gap-fill-min-stays: type: array items: $ref: '#/components/schemas/SeasonalGapFillMinStay' description: Gap-fill min-stay settings limited to seasonal ranges. seasonal-time-based-min-stays: type: array items: $ref: '#/components/schemas/SeasonalTimeBasedMinStay' description: Lead-time min-stay rules limited to seasonal ranges. MinStaysCustomizationNested: type: object description: Min-stays customization nested in the aggregate response. properties: min-stay: type: - integer - 'null' minimum: 1 description: Default minimum stay, in nights, for the listing. gap-fill-min-stay: allOf: - $ref: '#/components/schemas/GapFillMinStay' description: Year-round orphan-gap min-stay settings. seasonal-min-stays: type: array items: $ref: '#/components/schemas/SeasonalMinStay' description: Seasonal min-stay overrides keyed by date range. last-minute-min-stays: type: array items: $ref: '#/components/schemas/TimeBasedMinStay' description: Year-round lead-time min-stay rules. day-of-week-min-stays: type: array items: $ref: '#/components/schemas/DayOfWeekMinStay' description: Year-round minimum stays keyed by weekday. seasonal-day-of-week-min-stays: type: array items: $ref: '#/components/schemas/SeasonalDayOfWeekMinStay' description: Weekday-specific minimum stays limited to seasonal ranges. seasonal-gap-fill-min-stays: type: array items: $ref: '#/components/schemas/SeasonalGapFillMinStay' description: Gap-fill min-stay settings limited to seasonal ranges. seasonal-time-based-min-stays: type: array items: $ref: '#/components/schemas/SeasonalTimeBasedMinStay' description: Lead-time min-stay rules limited to seasonal ranges. MinStaysCustomizationResponse: type: object properties: data: $ref: '#/components/schemas/MinStaysCustomization' required: - data PaginatedAccountList: type: object properties: data: type: array items: $ref: '#/components/schemas/Account' links: type: object description: Pagination links for the primary data. These keys MUST be used for pagination links; each MUST be omitted or `null` when that link is unavailable. Values follow JSON:API link rules (URI string, link object, or null). https://jsonapi.org/format/#fetching-pagination https://jsonapi.org/format/#document-links properties: first: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The first page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' last: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=9 description: 'The last page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' prev: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The previous page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' next: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=3 description: 'The next page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' additionalProperties: false meta: type: object description: Non-standard meta-information. Page-number stacks often nest totals under `pagination`. JSON:API does not define these keys. Servers MAY add other `meta` members; this schema documents the usual djangorestframework-json-api shape only. https://jsonapi.org/format/#document-meta properties: pagination: type: object description: Typical page-number metadata from djangorestframework-json-api; not mandated by JSON:API. properties: count: type: integer minimum: 0 example: 42 description: Total number of resources across all pages. page: type: integer minimum: 1 example: 2 description: Current page number (1-based). pages: type: integer minimum: 0 example: 5 description: Total number of pages. additionalProperties: false additionalProperties: false required: - data PaginatedCalendarEntryList: type: object properties: data: type: array items: $ref: '#/components/schemas/CalendarEntry' links: type: object description: Pagination links for the primary data. These keys MUST be used for pagination links; each MUST be omitted or `null` when that link is unavailable. Values follow JSON:API link rules (URI string, link object, or null). https://jsonapi.org/format/#fetching-pagination https://jsonapi.org/format/#document-links properties: first: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The first page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' last: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=9 description: 'The last page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' prev: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The previous page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' next: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=3 description: 'The next page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' additionalProperties: false meta: type: object description: Non-standard meta-information. Page-number stacks often nest totals under `pagination`. JSON:API does not define these keys. Servers MAY add other `meta` members; this schema documents the usual djangorestframework-json-api shape only. https://jsonapi.org/format/#document-meta properties: pagination: type: object description: Typical page-number metadata from djangorestframework-json-api; not mandated by JSON:API. properties: count: type: integer minimum: 0 example: 42 description: Total number of resources across all pages. page: type: integer minimum: 1 example: 2 description: Current page number (1-based). pages: type: integer minimum: 0 example: 5 description: Total number of pages. additionalProperties: false additionalProperties: false required: - data PaginatedCompsetSummaryList: type: object properties: data: type: array items: $ref: '#/components/schemas/CompsetSummary' links: type: object description: Pagination links for the primary data. These keys MUST be used for pagination links; each MUST be omitted or `null` when that link is unavailable. Values follow JSON:API link rules (URI string, link object, or null). https://jsonapi.org/format/#fetching-pagination https://jsonapi.org/format/#document-links properties: first: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The first page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' last: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=9 description: 'The last page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' prev: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The previous page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' next: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=3 description: 'The next page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' additionalProperties: false meta: type: object description: Non-standard meta-information. Page-number stacks often nest totals under `pagination`. JSON:API does not define these keys. Servers MAY add other `meta` members; this schema documents the usual djangorestframework-json-api shape only. https://jsonapi.org/format/#document-meta properties: pagination: type: object description: Typical page-number metadata from djangorestframework-json-api; not mandated by JSON:API. properties: count: type: integer minimum: 0 example: 42 description: Total number of resources across all pages. page: type: integer minimum: 1 example: 2 description: Current page number (1-based). pages: type: integer minimum: 0 example: 5 description: Total number of pages. additionalProperties: false additionalProperties: false required: - data PaginatedListingList: type: object properties: data: type: array items: $ref: '#/components/schemas/Listing' links: type: object description: Pagination links for the primary data. These keys MUST be used for pagination links; each MUST be omitted or `null` when that link is unavailable. Values follow JSON:API link rules (URI string, link object, or null). https://jsonapi.org/format/#fetching-pagination https://jsonapi.org/format/#document-links properties: first: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The first page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' last: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=9 description: 'The last page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' prev: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The previous page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' next: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=3 description: 'The next page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' additionalProperties: false meta: type: object description: Non-standard meta-information. Page-number stacks often nest totals under `pagination`. JSON:API does not define these keys. Servers MAY add other `meta` members; this schema documents the usual djangorestframework-json-api shape only. https://jsonapi.org/format/#document-meta properties: pagination: type: object description: Typical page-number metadata from djangorestframework-json-api; not mandated by JSON:API. properties: count: type: integer minimum: 0 example: 42 description: Total number of resources across all pages. page: type: integer minimum: 1 example: 2 description: Current page number (1-based). pages: type: integer minimum: 0 example: 5 description: Total number of pages. additionalProperties: false additionalProperties: false required: - data PaginatedMarketInsightsList: type: object properties: data: type: array items: $ref: '#/components/schemas/MarketInsights' links: type: object description: Pagination links for the primary data. These keys MUST be used for pagination links; each MUST be omitted or `null` when that link is unavailable. Values follow JSON:API link rules (URI string, link object, or null). https://jsonapi.org/format/#fetching-pagination https://jsonapi.org/format/#document-links properties: first: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The first page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' last: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=9 description: 'The last page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' prev: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The previous page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' next: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=3 description: 'The next page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' additionalProperties: false meta: type: object description: Non-standard meta-information. Page-number stacks often nest totals under `pagination`. JSON:API does not define these keys. Servers MAY add other `meta` members; this schema documents the usual djangorestframework-json-api shape only. https://jsonapi.org/format/#document-meta properties: pagination: type: object description: Typical page-number metadata from djangorestframework-json-api; not mandated by JSON:API. properties: count: type: integer minimum: 0 example: 42 description: Total number of resources across all pages. page: type: integer minimum: 1 example: 2 description: Current page number (1-based). pages: type: integer minimum: 0 example: 5 description: Total number of pages. additionalProperties: false additionalProperties: false required: - data PaginatedRecommendationList: type: object properties: data: type: array items: $ref: '#/components/schemas/Recommendation' links: type: object description: Pagination links for the primary data. These keys MUST be used for pagination links; each MUST be omitted or `null` when that link is unavailable. Values follow JSON:API link rules (URI string, link object, or null). https://jsonapi.org/format/#fetching-pagination https://jsonapi.org/format/#document-links properties: first: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The first page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' last: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=9 description: 'The last page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' prev: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The previous page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' next: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=3 description: 'The next page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' additionalProperties: false meta: type: object description: Non-standard meta-information. Page-number stacks often nest totals under `pagination`. JSON:API does not define these keys. Servers MAY add other `meta` members; this schema documents the usual djangorestframework-json-api shape only. https://jsonapi.org/format/#document-meta properties: pagination: type: object description: Typical page-number metadata from djangorestframework-json-api; not mandated by JSON:API. properties: count: type: integer minimum: 0 example: 42 description: Total number of resources across all pages. page: type: integer minimum: 1 example: 2 description: Current page number (1-based). pages: type: integer minimum: 0 example: 5 description: Total number of pages. additionalProperties: false additionalProperties: false required: - data PaginatedUserCredentialList: type: object properties: data: type: array items: $ref: '#/components/schemas/UserCredential' links: type: object description: Pagination links for the primary data. These keys MUST be used for pagination links; each MUST be omitted or `null` when that link is unavailable. Values follow JSON:API link rules (URI string, link object, or null). https://jsonapi.org/format/#fetching-pagination https://jsonapi.org/format/#document-links properties: first: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The first page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' last: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=9 description: 'The last page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' prev: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The previous page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' next: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=3 description: 'The next page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' additionalProperties: false meta: type: object description: Non-standard meta-information. Page-number stacks often nest totals under `pagination`. JSON:API does not define these keys. Servers MAY add other `meta` members; this schema documents the usual djangorestframework-json-api shape only. https://jsonapi.org/format/#document-meta properties: pagination: type: object description: Typical page-number metadata from djangorestframework-json-api; not mandated by JSON:API. properties: count: type: integer minimum: 0 example: 42 description: Total number of resources across all pages. page: type: integer minimum: 1 example: 2 description: Current page number (1-based). pages: type: integer minimum: 0 example: 5 description: Total number of pages. additionalProperties: false additionalProperties: false required: - data PaginatedUserList: type: object properties: data: type: array items: $ref: '#/components/schemas/User' links: type: object description: Pagination links for the primary data. These keys MUST be used for pagination links; each MUST be omitted or `null` when that link is unavailable. Values follow JSON:API link rules (URI string, link object, or null). https://jsonapi.org/format/#fetching-pagination https://jsonapi.org/format/#document-links properties: first: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The first page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' last: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=9 description: 'The last page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' prev: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=1 description: 'The previous page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' next: type: - string - 'null' format: uri example: http://example.com/articles?page%5Bsize%5D=10&page%5Bnumber%5D=3 description: 'The next page of data. A JSON:API link: URI string, link object, or null. See https://jsonapi.org/format/#document-links.' additionalProperties: false meta: type: object description: Non-standard meta-information. Page-number stacks often nest totals under `pagination`. JSON:API does not define these keys. Servers MAY add other `meta` members; this schema documents the usual djangorestframework-json-api shape only. https://jsonapi.org/format/#document-meta properties: pagination: type: object description: Typical page-number metadata from djangorestframework-json-api; not mandated by JSON:API. properties: count: type: integer minimum: 0 example: 42 description: Total number of resources across all pages. page: type: integer minimum: 1 example: 2 description: Current page number (1-based). pages: type: integer minimum: 0 example: 5 description: Total number of pages. additionalProperties: false additionalProperties: false required: - data PatchedBasePriceCustomizationRequest: type: object properties: data: type: object required: - type - id additionalProperties: false properties: type: type: string description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. enum: - base-price-customizations id: {} attributes: type: object properties: base-price: type: integer minimum: 10 description: Default nightly base price for the listing. Must be at least 10. id: type: string readOnly: true minLength: 1 description: Customization resource identifier, returned as the listing ID. required: - base-price required: - data PatchedExtraGuestFeeCustomizationRequest: type: object properties: data: type: object required: - type - id additionalProperties: false properties: type: type: string description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. enum: - extra-guest-fee-customizations id: {} attributes: type: object properties: extra-guest-fee: type: - integer - 'null' minimum: 1 description: Per-guest fee charged once the booking exceeds the extra guest threshold. extra-guest-threshold: type: - integer - 'null' minimum: 1 description: Number of guests included before the extra guest fee applies. id: type: string readOnly: true minLength: 1 description: Customization resource identifier, returned as the listing ID. required: - extra-guest-fee - extra-guest-threshold required: - data PatchedListingActivationRequest: type: object properties: data: type: object required: - type - id additionalProperties: false properties: type: type: string description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. enum: - listing-activations id: {} attributes: type: object properties: id: type: integer readOnly: true enabled: type: boolean description: Whether price syncing is enabled for the listing. base-price: type: number format: double minimum: 10 description: Base price to apply after the activation update. min-price: type: number format: double minimum: 5 description: Minimum price to apply after the activation update. required: - enabled required: - data PatchedMinMaxPricesCustomizationRequest: type: object properties: data: type: object required: - type - id additionalProperties: false properties: type: type: string description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. enum: - min-max-price-customizations id: {} attributes: type: object properties: min-price: type: - number - 'null' format: double minimum: 5 description: Default minimum nightly price for the listing. max-price: type: - number - 'null' format: double description: Default maximum nightly price for the listing. monthly-min-price: type: - number - 'null' format: double minimum: 5 description: Default minimum monthly price for the listing. day-of-week-min-prices: type: array items: $ref: '#/components/schemas/DayOfWeekMinPriceRequest' description: Year-round minimum nightly prices keyed by weekday. seasonal-day-of-week-min-prices: type: array items: $ref: '#/components/schemas/SeasonalDayOfWeekMinPriceRequest' description: Weekday-specific nightly min prices limited to seasonal ranges. seasonal-prices: type: array items: $ref: '#/components/schemas/SeasonalPricesRequest' description: Seasonal nightly min/max price overrides. seasonal-monthly-prices: type: array items: $ref: '#/components/schemas/SeasonalMonthlyPricesRequest' description: Seasonal monthly min/max price overrides. id: type: string readOnly: true minLength: 1 description: Customization resource identifier, returned as the listing ID. required: - data PatchedMinStaysCustomizationRequest: type: object properties: data: type: object required: - type - id additionalProperties: false properties: type: type: string description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. enum: - min-stay-customizations id: {} attributes: type: object properties: min-stay: type: - integer - 'null' minimum: 1 description: Default minimum stay, in nights, for the listing. gap-fill-min-stay: allOf: - $ref: '#/components/schemas/GapFillMinStayRequest' description: Year-round orphan-gap min-stay settings. seasonal-min-stays: type: array items: $ref: '#/components/schemas/SeasonalMinStayRequest' description: Seasonal min-stay overrides keyed by date range. last-minute-min-stays: type: array items: $ref: '#/components/schemas/TimeBasedMinStayRequest' description: Year-round lead-time min-stay rules. day-of-week-min-stays: type: array items: $ref: '#/components/schemas/DayOfWeekMinStayRequest' description: Year-round minimum stays keyed by weekday. seasonal-day-of-week-min-stays: type: array items: $ref: '#/components/schemas/SeasonalDayOfWeekMinStayRequest' description: Weekday-specific minimum stays limited to seasonal ranges. seasonal-gap-fill-min-stays: type: array items: $ref: '#/components/schemas/SeasonalGapFillMinStayRequest' description: Gap-fill min-stay settings limited to seasonal ranges. seasonal-time-based-min-stays: type: array items: $ref: '#/components/schemas/SeasonalTimeBasedMinStayRequest' description: Lead-time min-stay rules limited to seasonal ranges. id: type: string readOnly: true minLength: 1 description: Customization resource identifier, returned as the listing ID. required: - data PatchedTimeBasedAdjustmentsCustomizationRequest: type: object properties: data: type: object required: - type - id additionalProperties: false properties: type: type: string description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. enum: - time-based-adjustment-customizations id: {} attributes: type: object properties: time-based-adjustments: type: array items: $ref: '#/components/schemas/TimeBasedAdjustmentRequest' description: Year-round lead-time price adjustments. seasonal-time-based-adjustments: type: array items: $ref: '#/components/schemas/SeasonalTimeBasedAdjustmentRequest' description: Lead-time price adjustments limited to seasonal ranges. id: type: string readOnly: true minLength: 1 description: Customization resource identifier, returned as the listing ID. dynamic-time-based-adjustments: allOf: - $ref: '#/components/schemas/DynamicTimeBasedAdjustmentsRequestRequest' description: Current dynamic recommendation settings. required: - data Recommendation: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/RecommendationResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: type: string description: Unique identifier for the recommendation. attributes: type: object properties: listing-id: type: integer readOnly: true listing-title: type: - string - 'null' description: Listing title associated with the recommendation. status: enum: - suggested - suggestion_completed - approved - rejected - expired - canceled - outdated type: string description: |- * `suggested` - Suggested * `suggestion_completed` - Suggestion_Completed * `approved` - Approved * `rejected` - Rejected * `expired` - Expired * `canceled` - Canceled * `outdated` - Outdated approved-at: type: - string - 'null' format: date-time rejected-at: type: - string - 'null' format: date-time expired-at: type: - string - 'null' format: date-time suggested-base-price: type: - integer - 'null' description: Suggested base price for the listing. suggested-min-price: type: - integer - 'null' description: Suggested minimum price for the listing. suggested-seasonal-min-price-pct: type: - number - 'null' format: double description: Suggested seasonal minimum price adjustment percentage. initial-base-price: type: - integer - 'null' description: Base price recorded when the recommendation was created. initial-min-price: type: - integer - 'null' description: Minimum price recorded when the recommendation was created. recommendations: type: - string - 'null' description: Recommendations about the listing from the booking review category: enum: - min_price - seasonal_min_price - base_price - strategy - enable_listing - gap_fill - '' - null type: - string - 'null' description: |- Category of the booking review * `min_price` - Min_Price * `seasonal_min_price` - Seasonal_Min_Price * `base_price` - Base_Price * `strategy` - Strategy * `enable_listing` - Enable_Listing * `gap_fill` - Gap_Fill created-at: type: string format: date-time readOnly: true required: - listing-title RecommendationResourceTypeEnum: type: string enum: - recommendations SeasonalDayOfWeekMinPrice: type: object description: Weekday-specific nightly minimum prices limited to a date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. min-prices: type: array items: $ref: '#/components/schemas/DayOfWeekMinPrice' description: Seven weekday entries describing the min price for each day. required: - end-date - min-prices - start-date SeasonalDayOfWeekMinPriceRequest: type: object description: Weekday-specific nightly minimum prices limited to a date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. min-prices: type: array items: $ref: '#/components/schemas/DayOfWeekMinPriceRequest' description: Seven weekday entries describing the min price for each day. required: - end-date - min-prices - start-date SeasonalDayOfWeekMinStay: type: object description: Weekday-specific minimum stays limited to a date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. min-stays: type: array items: $ref: '#/components/schemas/DayOfWeekMinStay' description: Seven weekday entries describing the min stay for each day. required: - end-date - min-stays - start-date SeasonalDayOfWeekMinStayRequest: type: object description: Weekday-specific minimum stays limited to a date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. min-stays: type: array items: $ref: '#/components/schemas/DayOfWeekMinStayRequest' description: Seven weekday entries describing the min stay for each day. required: - end-date - min-stays - start-date SeasonalGapFillMinStay: type: object description: Gap-fill min-stay settings limited to a seasonal date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. gap-fill-min-stay: allOf: - $ref: '#/components/schemas/GapFillMinStay' description: Gap-fill settings to apply within the seasonal range. required: - end-date - gap-fill-min-stay - start-date SeasonalGapFillMinStayRequest: type: object description: Gap-fill min-stay settings limited to a seasonal date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. gap-fill-min-stay: allOf: - $ref: '#/components/schemas/GapFillMinStayRequest' description: Gap-fill settings to apply within the seasonal range. required: - end-date - gap-fill-min-stay - start-date SeasonalMinStay: type: object description: A date-scoped minimum-stay override. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. rollover: type: boolean default: false description: Whether the seasonal rule repeats across the year boundary. min-stay: type: integer minimum: 1 description: Minimum required stay, in nights, for the seasonal range. min-stay-locked: type: boolean default: false description: Whether this seasonal min stay is locked against automatic changes. required: - end-date - min-stay - start-date SeasonalMinStayRequest: type: object description: A date-scoped minimum-stay override. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. rollover: type: boolean default: false description: Whether the seasonal rule repeats across the year boundary. min-stay: type: integer minimum: 1 description: Minimum required stay, in nights, for the seasonal range. min-stay-locked: type: boolean default: false description: Whether this seasonal min stay is locked against automatic changes. required: - end-date - min-stay - start-date SeasonalMonthlyPrices: type: object description: A date-scoped monthly min/max price override. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. rollover: type: boolean default: false description: Whether the seasonal rule repeats across the year boundary. monthly-min-price: type: - number - 'null' format: double minimum: 5 description: Minimum monthly price for the seasonal range. monthly-max-price: type: - number - 'null' format: double description: Maximum monthly price for the seasonal range. required: - end-date - start-date SeasonalMonthlyPricesRequest: type: object description: A date-scoped monthly min/max price override. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. rollover: type: boolean default: false description: Whether the seasonal rule repeats across the year boundary. monthly-min-price: type: - number - 'null' format: double minimum: 5 description: Minimum monthly price for the seasonal range. monthly-max-price: type: - number - 'null' format: double description: Maximum monthly price for the seasonal range. required: - end-date - start-date SeasonalPrices: type: object description: A date-scoped nightly min/max price override. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. rollover: type: boolean default: false description: Whether the seasonal rule repeats across the year boundary. min-price: type: - number - 'null' format: double minimum: 5 description: Minimum nightly price for the seasonal range. max-price: type: - number - 'null' format: double description: Maximum nightly price for the seasonal range. required: - end-date - start-date SeasonalPricesRequest: type: object description: A date-scoped nightly min/max price override. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. rollover: type: boolean default: false description: Whether the seasonal rule repeats across the year boundary. min-price: type: - number - 'null' format: double minimum: 5 description: Minimum nightly price for the seasonal range. max-price: type: - number - 'null' format: double description: Maximum nightly price for the seasonal range. required: - end-date - start-date SeasonalTimeBasedAdjustment: type: object description: Lead-time price adjustments limited to a seasonal date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. time-based-adjustments: type: array items: $ref: '#/components/schemas/TimeBasedAdjustment' description: Lead-time price adjustments that apply within the seasonal range. exclude: type: boolean default: false description: Whether this range excludes seasonal lead-time price adjustments. rollover: type: boolean default: false description: Whether the seasonal rule repeats across the year boundary. required: - end-date - start-date SeasonalTimeBasedAdjustmentRequest: type: object description: Lead-time price adjustments limited to a seasonal date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. time-based-adjustments: type: array items: $ref: '#/components/schemas/TimeBasedAdjustmentRequest' description: Lead-time price adjustments that apply within the seasonal range. exclude: type: boolean default: false description: Whether this range excludes seasonal lead-time price adjustments. rollover: type: boolean default: false description: Whether the seasonal rule repeats across the year boundary. required: - end-date - start-date SeasonalTimeBasedMinStay: type: object description: Lead-time min-stay rules limited to a seasonal date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. exclude: type: boolean default: false description: Whether this range excludes seasonal lead-time min-stay rules. time-based-min-stays: type: array items: $ref: '#/components/schemas/TimeBasedMinStay' description: Lead-time min-stay rules that apply only within the seasonal range. required: - end-date - start-date SeasonalTimeBasedMinStayRequest: type: object description: Lead-time min-stay rules limited to a seasonal date range. properties: start-date: type: string format: date description: First date the seasonal rule applies. end-date: type: string format: date description: Last date the seasonal rule applies. exclude: type: boolean default: false description: Whether this range excludes seasonal lead-time min-stay rules. time-based-min-stays: type: array items: $ref: '#/components/schemas/TimeBasedMinStayRequest' description: Lead-time min-stay rules that apply only within the seasonal range. required: - end-date - start-date StateEnum: enum: - queued - in_progress - completed - unknown type: string description: |- * `queued` - queued * `in_progress` - in_progress * `completed` - completed * `unknown` - unknown TierEnum: enum: - revenue - occupancy - rate type: string description: |- * `revenue` - revenue * `occupancy` - occupancy * `rate` - rate TimeBasedAdjustment: type: object description: A lead-time-based price adjustment rule. properties: days: type: integer minimum: 1 description: Lead-time threshold, in days, that triggers the adjustment. percentage: type: integer maximum: 100 description: Adjustment percent, where 20 means +20% and -20 means -20%. direction: allOf: - $ref: '#/components/schemas/DirectionEnum' description: |- How to count the lead-time threshold: `within` for bookings within N days, `after` for bookings N or more days away. * `within` - within * `after` - after required: - days - direction - percentage TimeBasedAdjustmentCustomizationResourceTypeEnum: type: string enum: - time-based-adjustment-customizations TimeBasedAdjustmentRequest: type: object description: A lead-time-based price adjustment rule. properties: days: type: integer minimum: 1 description: Lead-time threshold, in days, that triggers the adjustment. percentage: type: integer maximum: 100 description: Adjustment percent, where 20 means +20% and -20 means -20%. direction: allOf: - $ref: '#/components/schemas/DirectionEnum' description: |- How to count the lead-time threshold: `within` for bookings within N days, `after` for bookings N or more days away. * `within` - within * `after` - after required: - days - direction - percentage TimeBasedAdjustmentsCustomization: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/TimeBasedAdjustmentCustomizationResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: time-based-adjustments: type: array items: $ref: '#/components/schemas/TimeBasedAdjustment' description: Year-round lead-time price adjustments. seasonal-time-based-adjustments: type: array items: $ref: '#/components/schemas/SeasonalTimeBasedAdjustment' description: Lead-time price adjustments limited to seasonal ranges. dynamic-time-based-adjustments: allOf: - $ref: '#/components/schemas/DynamicTimeBasedAdjustmentsRequest' description: Current dynamic recommendation settings. TimeBasedAdjustmentsCustomizationNested: type: object description: Time-based adjustments customization nested in the aggregate response. properties: time-based-adjustments: type: array items: $ref: '#/components/schemas/TimeBasedAdjustment' description: Year-round lead-time price adjustments. seasonal-time-based-adjustments: type: array items: $ref: '#/components/schemas/SeasonalTimeBasedAdjustment' description: Lead-time price adjustments limited to seasonal ranges. dynamic-time-based-adjustments: allOf: - $ref: '#/components/schemas/DynamicTimeBasedAdjustmentsRequest' description: Current dynamic recommendation settings. TimeBasedAdjustmentsCustomizationResponse: type: object properties: data: $ref: '#/components/schemas/TimeBasedAdjustmentsCustomization' required: - data TimeBasedMinStay: type: object description: A lead-time-based minimum-stay rule. properties: days-away: type: integer minimum: 1 description: Lead-time threshold, in days, that triggers the rule. direction: allOf: - $ref: '#/components/schemas/DirectionEnum' description: |- How to count the lead-time threshold: `within` for bookings within N days, `after` for bookings N or more days away. * `within` - within * `after` - after min-stay: type: integer minimum: 1 description: Minimum stay, in nights, to require when the rule matches. required: - days-away - direction - min-stay TimeBasedMinStayRequest: type: object description: A lead-time-based minimum-stay rule. properties: days-away: type: integer minimum: 1 description: Lead-time threshold, in days, that triggers the rule. direction: allOf: - $ref: '#/components/schemas/DirectionEnum' description: |- How to count the lead-time threshold: `within` for bookings within N days, `after` for bookings N or more days away. * `within` - within * `after` - after min-stay: type: integer minimum: 1 description: Minimum stay, in nights, to require when the rule matches. required: - days-away - direction - min-stay TypeF0bEnum: type: string enum: - compsets User: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/UserResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: first-name: type: string maxLength: 150 last-name: type: string maxLength: 150 email: type: string format: email locale: enum: - en - en-GB - en-AU - en-CA - ja - fr - pt - de - es - it type: string default: en description: |- User locale as a supported BCP 47 language tag. Defaults to `en`. * `en` - en * `en-GB` - en-GB * `en-AU` - en-AU * `en-CA` - en-CA * `ja` - ja * `fr` - fr * `pt` - pt * `de` - de * `es` - es * `it` - it created-at: type: string format: date-time readOnly: true status: enum: - new - active - inactive type: string description: 'Account lifecycle state: `new` (no enabled listings yet), `active` (has enabled listings), or `inactive` (previously active, none enabled now).' readOnly: true required: - first-name - last-name - email UserCredential: type: object required: - type - id additionalProperties: false properties: type: allOf: - $ref: '#/components/schemas/CredentialResourceTypeEnum' description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. id: {} attributes: type: object properties: created-at: type: string format: date-time readOnly: true last-login: type: string format: date-time readOnly: true credential-type: type: string readOnly: true global-permissions: type: string readOnly: true email: type: - string - 'null' readOnly: true UserRequest: type: object properties: data: type: object required: - type additionalProperties: false properties: type: type: string description: The [type](https://jsonapi.org/format/#document-resource-object-identification) member is used to describe resource objects that share common attributes and relationships. enum: - users attributes: type: object properties: first-name: type: string minLength: 1 maxLength: 150 last-name: type: string minLength: 1 maxLength: 150 email: type: string format: email minLength: 1 locale: enum: - en - en-GB - en-AU - en-CA - ja - fr - pt - de - es - it type: string default: en description: |- User locale as a supported BCP 47 language tag. Defaults to `en`. * `en` - en * `en-GB` - en-GB * `en-AU` - en-AU * `en-CA` - en-CA * `ja` - ja * `fr` - fr * `pt` - pt * `de` - de * `es` - es * `it` - it id: type: integer readOnly: true created-at: type: string format: date-time readOnly: true status: enum: - new - active - inactive type: string description: 'Account lifecycle state: `new` (no enabled listings yet), `active` (has enabled listings), or `inactive` (previously active, none enabled now).' readOnly: true required: - first-name - last-name - email required: - data UserResourceTypeEnum: type: string enum: - users UserResponse: type: object properties: data: $ref: '#/components/schemas/User' required: - data WeekdayEnum: enum: - monday - tuesday - wednesday - thursday - friday - saturday - sunday type: string description: |- * `monday` - monday * `tuesday` - tuesday * `wednesday` - wednesday * `thursday` - thursday * `friday` - friday * `saturday` - saturday * `sunday` - sunday _EventMeta: type: object description: JSON:API top-level ``meta`` for partner events. properties: type: type: string description: Event type (e.g., 'listing.refreshed') sent-at: type: string format: date-time description: UTC timestamp the event envelope was assembled (RFC 3339) required: - sent-at - type _Relationship: type: object description: 'Generic JSON:API to-one relationship — ``{data: {type, id}, links?}``.' properties: data: $ref: '#/components/schemas/_RelationshipData' links: $ref: '#/components/schemas/_RelationshipLinks' required: - data _RelationshipData: type: object description: JSON:API ``relationships..data`` body — ``{type, id}``. properties: type: type: string description: JSON:API resource type id: type: string description: Resource identifier required: - id - type _RelationshipLinks: type: object description: JSON:API ``relationships..links`` body — partner follow-up URL. properties: related: type: string format: uri description: Absolute URL to GET the current state of the related resource securitySchemes: oauth2: type: oauth2 description: Use OAuth2 client credentials to mint an application token, or add `user_id` and optional `credential_id` in the Authorize dialog to request a user- or credential-scoped token. flows: clientCredentials: tokenUrl: /o/token/ refreshUrl: /o/token/ scopes: listings:read: Read listings listings:write: Modify listings reservations:read: Read reservations accounts:read: Read account information user:read: Read user information user:write: Create and modify users insights:read: Read market insights compsets:read: Read competitive set data neyoba:ask: Ask Neyoba personalAccessToken: type: http scheme: bearer bearerFormat: PersonalAccessToken description: Paste a `bpat_...` personal access token. PATs use the same Bearer header as OAuth2 tokens and must still include the runtime-required scopes for each endpoint, even though OpenAPI cannot encode scopes for non-OAuth bearer schemes. webhooks: accountCreated: post: description: |- Sent when the background listing sync that follows `POST /users/{user_id}/accounts/` reaches a terminal state — every listing on the account has been pulled from the channel and created in Beyond, or the sync failed. `succeeded` means the listings *exist*, not that they are priced. A listing becomes fully set up (base price computed) later, and each one emits its own `listing.created` event at that point. The event fires the same way whether the account was newly created or an existing, previously deleted account was revived; in the revive case the restored listings are counted in `nb-listings-synced`. Credential problems (invalid credentials, 2FA, channel outage) are reported synchronously on the `POST` response and emit no event. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe. summary: Managed account listing sync completed tags: - Webhooks requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/AccountCreatedEvent' required: true responses: '200': description: Delivery acknowledged (any 2xx). '410': description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case. accountRefreshed: post: description: |- Sent when the background listing sync started by `POST /users/{user_id}/accounts/{account_id}/refresh/` reaches a terminal state — every listing the refresh considered has been re-pulled from the channel, or the sync failed. The event covers **listings only**. Reservations are refreshed by independent background jobs that outlive this event, so they are still in flight when it is delivered. Listings synced within the last `recent-sync-threshold-minutes` are skipped and are not counted in `nb-listings-synced`. A refresh that skips every listing is still `succeeded`, with `nb-listings-synced` of 0. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe. summary: Managed account refresh completed tags: - Webhooks requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/AccountRefreshedEvent' required: true responses: '200': description: Delivery acknowledged (any 2xx). '410': description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case. listingBasePriceChanged: post: description: |- Sent whenever a listing's effective base price changes — through the Partners API or any other Beyond surface. This covers the user-set base price changing, and — while no user base price is set — the starting base price Beyond's algorithm computes from the listing's characteristics changing from one value to another. The first-ever price (null → value) is delivered as `listing.created` instead, not here. `enabled` reports whether the listing has pricing enabled: use it to tell a live price change (`enabled: true`) from a speculative one (`enabled: false`, e.g. a computed starting price on a not-yet-enabled listing). `change-source` reports what moved the price: `user` for a change made by an authenticated actor (Partners API, the Beyond app, or an admin), or `system` for one made by an automatic process (Beyond's algorithm computing a starting price, a scheduled auto-approved booking review, a background job). A change to the computed starting price is always `system`. `changed-by` names the individual behind a `user` change by email. It is null when no individual is responsible: every `system` change, and any change made by a machine — an app-level (`client_credentials`) Partners API token acts for the account as a whole, so it names no person. Changes made by Beyond staff on your behalf report `support@beyondpricing.com` rather than an internal address. The same `msg_id` is reused across delivery retries, so partners can dedupe on the `webhook-id` header. `old-base-price` is null the first time a base price is set. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe. summary: Listing base price changed tags: - Webhooks requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/ListingBasePriceChangedEvent' required: true responses: '200': description: Delivery acknowledged (any 2xx). '410': description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case. listingCreated: post: description: |- Sent when a new listing owned by one of your users is fully set up — after Beyond has computed its initial base price — and when an attempt to set one up fails. Use it to learn about new listings, and about listings that need attention before they can be created, without polling. The same `msg_id` is reused across delivery retries, so partners can dedupe on the `webhook-id` header. With `status='succeeded'` the event fires once per listing, the first time its base price is computed. With `status='failed'` it fires on every failing sync attempt — a listing whose channel setup stays broken repeats the event on each re-sync — carrying a human-readable `error`; the `listing` relationship and the listing attributes are null or omitted when the listing does not exist yet. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe. summary: Listing created tags: - Webhooks requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/ListingCreatedEvent' required: true responses: '200': description: Delivery acknowledged (any 2xx). '410': description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case. listingInActiveMarketChanged: post: description: |- Sent when a listing's `in-active-market` attribute — the one the listings endpoint serves — changes. `in-active-market: true` guarantees the listing's calendar endpoint works and automated price refresh is on; while false the calendar may return 400 ("not yet clustered") and price refresh is off. Subscribe to it to learn when a listing you already received leaves or re-enters that ready state, without polling. The transition is rare: it happens when Beyond removes or re-assigns the listing's pricing cluster, or activates/deactivates the listing's market. It fires once per flip, in either direction — `in-active-market` carries the new value. A market-wide change (e.g. Beyond activating a market) reaches each listing on its next daily sync, so expect one event per affected listing spread over about a day. There is no failure variant. The same `msg_id` is reused across delivery retries, so partners can dedupe on the `webhook-id` header. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe. summary: Listing in-active-market changed tags: - Webhooks requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/ListingInActiveMarketChangedEvent' required: true responses: '200': description: Delivery acknowledged (any 2xx). '410': description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case. listingRefreshed: post: description: |- Sent when a partner-triggered listing reservations refresh chain terminates — either both `sync_reservations` and `compute_abp_c` succeed, or any step fails. The same `msg_id` is reused across delivery retries, so partners can dedupe on the `webhook-id` header. Verify the signature before parsing the body. See the [partner webhooks guide](../webhooks.md) for the verification recipe. summary: Reservations refresh completed tags: - Webhooks requestBody: content: application/vnd.api+json: schema: $ref: '#/components/schemas/ListingRefreshedEvent' required: true responses: '200': description: Delivery acknowledged (any 2xx). '410': description: Endpoint permanently gone. Partners should respond 410 to disable redelivery; future iterations may auto-disable endpoints in this case.