# Availability

Get realtime availability & pricing.

Prioticket provides two distinct endpoints to support accurate availability and pricing:

* Availability & Pricing Variations API – Returns detailed pricing rules and logic, ideal for advanced UI behavior or transparency in pricing explanations.
* Availability & Calculated Pricing API – Returns real-time availability and final calculated pricing, optimized for booking flows and calendar rendering.

Each serves a different purpose in the booking journey. To implement them correctly and avoid common pitfalls (e.g. mismatched prices, missing availability, performance issues), please refer to the [full documentation on GitBook](https://docs.prioticket.com/key-concepts/availability-and-capacity).

## Get Availability & Pricing Variations

> Returns detailed pricing rules, variations, and conditions for the selected product.\
> \
> Use this endpoint to understand why and how prices change, based on rules such as date-based pricing, quantity discounts, time-of-day rules, and other dynamic configurations.\
> \
> Ideal for building advanced UIs that explain pricing logic to end users or trigger specific behaviors based on rule conditions.\
> \
> 📘 \[View full documentation on GitBook]\(<https://docs.prioticket.com/key-concepts/availability-and-capacity>)<br>

````json
{"openapi":"3.0.0","info":{"title":"Distributor API Specification V3.8","version":"3.8.0"},"tags":[{"name":"Availability","description":"Get realtime availability & pricing.\n\nPrioticket provides two distinct endpoints to support accurate availability and pricing:\n- Availability & Pricing Variations API – Returns detailed pricing rules and logic, ideal for advanced UI behavior or transparency in pricing explanations.\n- Availability & Calculated Pricing API – Returns real-time availability and final calculated pricing, optimized for booking flows and calendar rendering.\n\nEach serves a different purpose in the booking journey. To implement them correctly and avoid common pitfalls (e.g. mismatched prices, missing availability, performance issues), please refer to the [full documentation on GitBook](https://docs.prioticket.com/key-concepts/availability-and-capacity).\n"}],"servers":[{"url":"https://{environment}.prioticket.com/{version}/distributor","description":"Prio environments.","variables":{"environment":{"description":"* `distributor-api` - Production server; used for real transactions.\n\n* `sandbox-distributor-api` - Sandbox server.\n\n* `staging-distributor-api` - Pre-Production server; used for testing (UAT), verification, demo and certification.\n\n* `internal-distributor-api` - Internal server; reserved for internal use.\n","default":"staging-distributor-api","enum":["distributor-api","sandbox-distributor-api","staging-distributor-api","internal-distributor-api"]},"version":{"description":"Api version.","default":"v3.8","enum":["v3.8"]}}}],"security":[{"OAuth2":["https://www.prioticketapis.com/auth/distributor/availability"]}],"components":{"securitySchemes":{"OAuth2":{"type":"oauth2","description":"OAuth2 implementation.","flows":{"clientCredentials":{"tokenUrl":"https://sandbox-distributor-api.prioticket.com/v3.8/distributor/oauth2/token","scopes":{"https://www.prioticketapis.com/auth/distributor.products.readonly":"Grants access to products.","https://www.prioticketapis.com/auth/distributor.reservations":"Grants access to reservations.","https://www.prioticketapis.com/auth/distributor.bookings":"Grants access to bookings.","https://www.prioticketapis.com/auth/distributor.bookings.details":"Grants access to booking details.","https://www.prioticketapis.com/auth/distributor/reporting":"Grants access to reporting."}}}}},"parameters":{"DistributorIDOptional":{"name":"distributor_id","in":"query","required":false,"description":"[FILTER] on `distributor_id`.","schema":{"type":"string"}},"If-Modified-Since":{"in":"header","name":"If-Modified-Since","description":"[CACHE] The `If-Modified-Since` request HTTP header makes the request conditional: the server will send back the requested resource, with a 200 status, only if it has been modified after the given date. \n\nIf the resource has not been modified since, the response will be a 304 without any body; the `Last-Modified` response header of a previous request will contain the date of last modification.\n> Note that if a single resource has changed, all records matching your request will be returned, not just those changed after the given date. This provides you with an efficient caching method.","schema":{"title":"If-Modified-Since","type":"string"}}},"headers":{"Cache-Control":{"description":"Specifies the maximum amount of time a resource will be considered fresh. Contrary to Expires, this directive is relative to the time of the request.","schema":{"type":"string"}},"Last-Modified":{"description":"The Last-Modified response HTTP header contains the date and time at which the origin server believes the resource was last modified.","schema":{"type":"string"}},"Content-Language":{"description":"The Content-Language entity header is used to describe the language(s) intended for the audience, so that it allows a user to differentiate according to the users' own preferred language.","schema":{"type":"string"}},"Content-Length":{"description":"The Content-Length entity header indicates the size of the entity-body, in bytes, sent to the recipient.","schema":{"type":"string"}},"Access-Control-Allow-Methods":{"description":"The Access-Control-Allow-Methods response header specifies the method or methods allowed when accessing the resource in response to a preflight request.","schema":{"type":"string"}},"Content-Security-Policy":{"description":"Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks.","schema":{"type":"string"}},"X-XSS-Protection":{"description":"The HTTP X-XSS-Protection response header is a feature of Internet Explorer, Chrome and Safari that stops pages from loading when they detect reflected cross-site scripting (XSS) attacks.","schema":{"type":"string"}},"X-Content-Type-Options":{"description":"The X-Content-Type-Options response HTTP header is a marker used by the server to indicate that the MIME types advertised in the Content-Type headers should not be changed and be followed.","schema":{"type":"string"}},"X-RateLimit-Limit":{"deprecated":true,"description":"Request limit per hour.","schema":{"type":"integer","deprecated":true}},"X-RateLimit-Remaining":{"description":"The number of requests left for the time window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"The UTC date/time at which the current rate limit window resets.","schema":{"type":"string"}},"Origin":{"description":"The Origin request header indicates where a fetch originates from.","schema":{"type":"string","format":"URI"}}},"schemas":{"AvailabilityVariationListResponse":{"title":"Availabilities Variation List Response","description":"Availabilities list response.","type":"object","properties":{"api_version":{"$ref":"#/components/schemas/ApiVersion"},"data":{"$ref":"#/components/schemas/AvailabilityVariationListResponseData"}},"required":["api_version","data"]},"ApiVersion":{"title":"API Version","description":"Represents the version of the service API that's served in the response.","type":"string","readOnly":true},"AvailabilityVariationListResponseData":{"title":"Availabilities Variation List Response Data","description":"Availabilities list response data.","type":"object","allOf":[{"$ref":"#/components/schemas/ReservedPaginationData"},{"type":"object","properties":{"items":{"title":"Availability Slots","description":"List of all availability slots.","type":"array","items":{"$ref":"#/components/schemas/AvailabilityVariationModel"}}}}],"required":["kind","total_items","items"]},"ReservedPaginationData":{"title":"Reserved Pagination Data","type":"object","description":"The following properties are located in the data object, and help page through a list of items.\nThe paging properties below allow for various styles of paging, including:\n+ Previous/Next paging - Allows user's to move forward and backward through a list, one page at a time. The nextLink and previousLink properties (described in the \"Reserved Property Names for Links\" section below) are used for this style of paging.\n+ Index-based paging - Allows user's to jump directly to a specific item position within a list of items. For example, to load 10 items starting at item 200, the developer may point the user to a url with the query string ?startIndex=200.\n+ Page-based paging - Allows user's to jump directly to a specific page within the items. \n\n  This is similar to index-based paging, but saves the developer the extra step of having to calculate the item index for a new page of items. For example, rather than jump to item number 200, the developer could jump to page 20. The urls during page-based paging could use the query string ?page=1 or ?page=20. The pageIndex and totalPages properties are used for this style of paging.","required":["kind","current_item_count","items_per_page","start_index","total_items","page_index","total_pages"],"properties":{"kind":{"$ref":"#/components/schemas/Kind"},"current_item_count":{"title":"Current Item Count","type":"integer","maximum":500,"minimum":0,"description":"The number of items in this result set. Should be equivalent to items.length, and is provided as a convenience property. For example, suppose a developer requests a set of search items, and asks for 10 items per page. The total set of that search has 14 total items. The first page of items will have 10 items in it, so both `items_per_page` and `current_item_count` will equal \"10\". The next page of items will have the remaining 4 items; `items_per_page` will still be \"10\", but `current_item_count` will be \"4\"."},"items_per_page":{"title":"Items Per Page","type":"integer","minimum":0,"maximum":200,"description":"The number of items in the result. This is not necessarily the size of the data.items array; if we are viewing the last page of items, the size of data.items may be less than `items_per_page`. However the size of data.items should not exceed `items_per_page`."},"start_index":{"title":"Start Index","type":"integer","minimum":1,"description":"The index of the first item in data.items. For consistency, `start_index` should be 1-based. For example, the first item in the first set of items should have a `start_index` of 1. If the user requests the next set of data, the `start_index` may be 10."},"total_items":{"title":"Total Items","type":"integer","readOnly":true,"description":"The total number of items available in this set. For example, if a user has 100 blog posts, the response may only contain 10 items, but the `total_items` would be 100.","minimum":0},"page_index":{"title":"Page Index","type":"integer","minimum":1,"description":"The index of the current page of items. For consistency, `page_index` should be 1-based. For example, the first page of items has a `page_index` of 1. `page_index` can also be calculated from the item-based paging properties: `page_index` = floor(`start_index` / `items_per_page`) + 1."},"total_pages":{"title":"Total Pages","type":"integer","minimum":0,"readOnly":true,"description":"The total number of pages in the result set. `total_pages` can also be calculated from the item-based paging properties above: `total_pages` = ceiling(`total_items` / `items_per_page`)"}}},"Kind":{"title":"Kind","description":"The kind property serves as a guide to what type of information this particular object stores.","type":"string","readOnly":true,"enum":["location","route","category","product","currency","tax","addon","availability","stock","reservation","order","promocode","promo","webhook","notification","voucher","contact","payment","credit","destination","recommendation"]},"AvailabilityVariationModel":{"title":"Availability Variation Model","type":"object","allOf":[{"$ref":"#/components/schemas/AvailabilityModel"},{"type":"object","properties":{"availability_pricing":{"title":"Availability Slot Pricing","type":"array","description":"Daily / Dynamic Pricing, only returned in case `product_daily_pricing:true` or `product_dynamic_pricing:true` for this product.\n\nPlease note that in case both are enabled, the combined difference will be returned.","items":{"$ref":"#/components/schemas/AvailabilityPrice"}}}}]},"AvailabilityModel":{"title":"Availability Slot Model","type":"object","additionalProperties":false,"description":"Information on a specific availability slot.\n> Only applicable if `product_availability:true`.","properties":{"availability_id":{"title":"Availability Slot ID","description":"The unique ID for this availability slot.","type":"string","readOnly":true},"availability_capacity_id":{"title":"Availability Slot Capacity ID","description":"Availability group / capacity identifier.","type":"string","readOnly":true},"availability_capacity_shared_id":{"title":"Availability Slot Shared Capacity ID","description":"Shared availability / capacity identifier. Only applicable if `capacity_type:SHARED / COMBINED`.","type":"string"},"availability_label":{"title":"Availability Slot Label","type":"string","description":"Optional label for this availability slot."},"availability_product_id":{"title":"Availability Slot Product ID","description":"The product linked to this availability slot.\n\n> In case you are requesting the availability for a main combi product (`product_class:COMBI`) or a cluster product (`product_class:CLUSTER`) and `sub_products_depth: > 0` all sub-product availabilities will be returned as well. ","type":"string"},"availability_admission_type":{"$ref":"#/components/schemas/ProductAdmissionType"},"availability_active":{"title":"Availability Slot Active","description":"Whether this availability slot is active (open) or not (closed). This availability cannot be booked if `availability_active:false`.","type":"boolean","default":true},"availability_duration":{"title":"Availability Slot Duration","type":"integer","description":"Duration of the timeslot in seconds"},"availability_from_date_time":{"title":"Availability Slot From Date Time","description":"The starting date and time of the activity availability slot.","type":"string","format":"date-time"},"availability_to_date_time":{"title":"Availability Slot To Date Time","description":"The till date and time of the activity availability slot.","type":"string","format":"date-time"},"availability_booking_window_start":{"title":"Availability Booking Window Start","type":"string","format":"date-time","description":"The start date-time from when this availability slot is bookable."},"availability_booking_window_end":{"title":"Availability Booking Window End","type":"string","format":"date-time","description":"The end date-time from which this availability slot is no longer bookable."},"availability_spots":{"$ref":"#/components/schemas/AvailabilitySpots"},"availability_created":{"title":"Availability Slot Created","description":"The date on which the availability slot has been created.","type":"string","format":"date-time"},"availability_modified":{"title":"Availability Slot Modified","description":"The date on which this availability slot has been modified (Capacity and Configuration).","type":"string","format":"date-time"}},"required":["availability_id","availability_active","availability_from_date_time","availability_created","availability_modified"]},"ProductAdmissionType":{"title":"Product Admission Types","type":"string","readOnly":true,"enum":["TIME_PERIOD","TIME_DATE","TIME_POINT","TIME_SLOT","TIME_OPEN"],"description":"<details>\n  <summary>**Product Admission Types**</summary>\n  \n* `TIME_PERIOD` - Customers can arrive at any time between the start (`availability_from_date_time`) and end time (`availability_to_date_time`) of the availability slot. Multiple periods in a single day should be expected.\n  Therefore a date- and timepicker should be shown.\n\n* `TIME_DATE` - Variation on `TIME_PERIOD`, whereas only a single period exists in a day. It is not required to choose between different times within a day, therefore only a datepicker is required.\n  Note that in case the slot includes midnight (two or more days), the day from which the `availability_from_date_time` originated should take precedence.\n\n* `TIME_POINT` - Customers are required to be present at the start time of the availability slot but can leave any time they want.\n* `TIME_OPEN` - Customers can arrive at any time. Availablity is not applicable.\n* `TIME_SLOT` - Customers are required to be present at the start time of the availability slot, and the service is expected to finish at the end time of the slot. </details>\n"},"AvailabilitySpots":{"title":"Availability Spots","type":"object","description":"Information over the spots that the merchant has set for this configuration.\n> Only applicable for managed (limited) capacity `product_capacity:true`.\n\n> In case of 3rd party aggregated data, not all fields will be available.","properties":{"availability_spots_total":{"title":"Availability Spots Total","description":"The total number of spots that the merchant has configured for this distributor (including those that are not available).","type":"integer"},"availability_spots_reserved":{"title":"Availability Spots Reserved","description":"The number of spots currently reserved / blocked for this availability entry. Some of these might open up in the near future (e.g. abandoned checkouts). This value is already deducted from the `availability_spots_open` parameter and can be safely ignored in capacity calculations.\n\nFormula: `availability_spots_total` - (`availability_spots_booked` + `availability_spots_reserved`) = `availability_spots_open`.","type":"integer"},"availability_spots_booked":{"title":"Availability Spots Booked","description":"The number of spots currently booked for this availability entry. These might open up in the near future (Cancellations). This value is already deducted from the `availability_spots_open` parameter and can be safely ignored in capacity calculations.\n\nFormula: `availability_spots_total` - (`availability_spots_booked` + `availability_spots_reserved`) = `availability_spots_open`.","type":"integer","multipleOf":1},"availability_spots_open":{"title":"Availability Spots Open","description":"The number of spots currently available for this availability entry.","type":"integer","multipleOf":1},"availability_spots_details":{"title":"Availability Spots Details","description":"List of available spots.","deprecated":true,"type":"array","items":{"$ref":"#/components/schemas/Spot"}}},"required":["availability_spots_open"]},"Spot":{"title":"Spot","type":"object","description":"Information on the selected spot. Only applicable if PrioSeating is being used (`product_availability_assigned:true`).\n","properties":{"spot_name":{"title":"Spot Name","type":"string","description":"Spot name.","readOnly":true},"spot_section":{"title":"Spot Section","type":"string","description":"Name of the section. Only applicable if the product has sections."},"spot_row":{"title":"Spot Row","type":"string","description":"The row the spot resides in."},"spot_number":{"title":"Spot Number","description":"The spot number.","type":"string"}},"required":["spot_state"]},"AvailabilityPrice":{"title":"Availability Price","type":"object","description":"Pricing for this specific availability entry.","deprecated":true,"properties":{"availability_pricing_variation_amount":{"title":"Availability Pricing Variation Amount","description":"The dynamic variation amount.","type":"string"},"availability_pricing_variation_percentage":{"title":"Availability Pricing Variation Percentage","description":"The dynamic variation percentage. If blank then the variation is not based on percentages.","type":"string"},"availability_pricing_variation_description":{"title":"Availability Pricing Variation Description","description":"Reason for the price variation.","type":"string"},"availability_pricing_variation_type":{"$ref":"#/components/schemas/PriceVariationType"},"availability_pricing_variation_price_type":{"$ref":"#/components/schemas/PriceVariationPriceType"},"availability_pricing_variation_commission_included":{"title":"Availability Pricing Variation Commission Included","description":"Whether the distributor commission percentage is applicable on this price variation or not.","type":"boolean"},"availability_pricing_variation_product_type_id":{"title":"Availability Pricing Variation Product Type ID","description":"The applicable product type.","type":"string"},"availability_pricing_variation_product_type_discount_included":{"title":"Availability Pricing Variation Product Type Discount Included","description":"Whether the product type discount is applicable on the price variation or not.","type":"boolean"},"availability_pricing_variation_product_type":{"$ref":"#/components/schemas/ProductType"}},"required":["availability_pricing_variation_amount"]},"PriceVariationType":{"title":"Price Variation Type","description":"<details>\n  <summary>**Price Variation Types**</summary>\n\n* `DATE_VARIATION` - Pricing based on calendar date.\n* `DATETIME_VARIATION` - Pricing based on calendar date and time.\n* `WEEKDAY_VARIATION` - Pricing based on the day of the week (e.g Monday, Tuesday). This is also called Daily pricing.\n* `CUSTOM_VARIATION` - Custom dynamic pricing. </details>\n","type":"string","enum":["DATE_VARIATION","DATETIME_VARIATION","WEEKDAY_VARIATION","CUSTOM_VARIATION"]},"PriceVariationPriceType":{"title":"Price Variation Price Type","description":"Whether this price variation applies to the sales or resale price.","type":"string","default":"SALES_PRICE","enum":["SALES_PRICE","RESALE_PRICE"]},"ProductType":{"title":"Product Type","type":"string","description":"Each product contains product types. These product types can offer aged based ticketing (such as Adult and Child), but also provide a variety of other flexible product variations such as group pricing, business and economy seating or different car configurations.\n\nBecause some products might behave different from others, each product type is categorized within a product class; a group of products that behaves similarly.\n<details>\n  <summary>**Product Types**</summary>\n\n  * Class Standard:\n    \n    Product types in the standard class are the most common and are supported by almost all systems. These types will always be age-restricted.\n    \n    Tour and experience providers have the flexibility to vary prices and apply different rules based on the age of their customers. This means they can charge full ticket prices for adults while offering discounted rates for children, or they may have specific requirements such as requiring at least one adult for every group of children booking a tour.\n    \n    During the process of checking prices and proceeding to checkout, customers should be able to select the number of individuals from each available age group for their booking.\n  \n    * `ADULT` - Adult.\n    \n    * `CHILD` - Child.\n    \n    * `SENIOR` - Senior.\n    \n    * `YOUTH` - Youth.\n        \n    * `INFANT` - Infant.\n    \n  * Class Individual:\n  \n    Product types in the individual class are less common and therefore have fewer supported systems. These types will never be age-restricted.\n    \n    * `PERSON` - Person.\n    \n    * `STUDENT` - Student.\n    \n    * `RESIDENT` - Resident.\n    \n    * `MILITARY` - Military.\n    \n    * `IMPAIRED` - Impaired.\n  \n  * Class Item:\n  \n    Product types in the item class do not refer to actual persons, instead they could, for example, be packages (Regular, Silver, Diamond), objects (Merchandise, private tours), a type of event, class identifier (Economy, Business) and much more.\n  \n    * `ITEM` - Item.\n    \n  * Class Group:\n   \n    Product types in the group class always consist of multiple persons. It can, for example, be a family of 2 Adults and 2 Childs.\n    \n    * `GROUP` - Group.\n    \n    * `FAMILY` - Family.\n    \n  * Class Custom:\n  \n    Product types in the custom class are completely dynamic and therefore require explicit mapping with external systems. They do not return as `CUSTOM`, instead they can take any form.\n    \n    * `CUSTOM` - Custom.\n    \n</details>\n","enum":["ADULT","CHILD","SENIOR","YOUTH","INFANT","PERSON","STUDENT","RESIDENT","MILITARY","IMPAIRED","ITEM","GROUP","FAMILY","CUSTOM"]},"ErrorModel":{"title":"Error Model","description":"Error model.","type":"object","readOnly":true,"properties":{"error":{"title":"Error Code","description":"The error code which occured.\n\nAs our API has over 1000+ unique error codes (grouped by HTTP status). We discourage implementing individual errors on your customer front-end interface and suggest a catch-all clause for each HTTP status code instead.\n\nErrors can be shown directly to the customer using the `error_message`, while more specific details explaining the problem will be provided in the `errors` object.\nWe recommend a combination of `error_message` and `error_reference` when communicating with the customer and API support.\n","type":"string","readOnly":true},"error_reference":{"title":"Error Reference","description":"Unique reference linked to this error.\n\nWe recommend showing this reference to the customer to allow for better issue tracking.\n","type":"string","readOnly":true},"error_message":{"title":"Error Message","description":"Customer friendly error message which can be shown on your front-end.\n","type":"string","readOnly":true},"error_description":{"title":"Error Description","description":"Human-readable ASCII [[USASCII]](https://tools.ietf.org/html/rfc6749#ref-USASCII) text providing additional information, used to assist the client developer in understanding the error that occurred.","type":"string","readOnly":true},"error_uri":{"title":"Error URI","description":"A URI identifying a human-readable web page with information about the error, used to provide the client \ndeveloper with additional information about the error.","type":"string","readOnly":true},"errors":{"title":"Error Messages","description":"Specific messages indicating one or more problems.","type":"array","readOnly":true,"items":{"title":"Error Message","description":"Specific message indicating a problem.","type":"string","readOnly":true}}},"required":["error","error_reference"]}},"responses":{"InvalidRequest":{"description":"Invalid Request\n\nThe HyperText Transfer Protocol (HTTP) 400 Bad Request response status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"AuthenticationFailed":{"description":"Authentication Failed\n\nThe access token provided is expired, revoked, malformed, or invalid for other reasons. The resource SHOULD respond with the HTTP 401 (Unauthorized) status code.  The client MAY request a new access token and retry the protected resource request.","headers":{"WWW-Authenticate":{"description":"Defines the authentication method that should be used to gain access to a resource.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"Forbidden":{"description":"Forbidden\n\nThe request requires higher privileges than provided by the access token. The resource server SHOULD respond with the HTTP 403 (Forbidden) status code and MAY include the `scope` attribute with the scope necessary to access the protected resource.","headers":{"WWW-Authenticate":{"description":"Defines the authentication method that should be used to gain access to a resource.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"MethodNotAllowed":{"description":"Method Not Allowed\n\nThe HyperText Transfer Protocol (HTTP) 405 Method Not Allowed response status code indicates that the request method is known by the server but is not supported by the target resource.\n\nA request method is not supported for the requested\n      resource; for example, a GET request on a form that\n      requires data to be presented via POST, or a PUT request\n      on a read-only resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"NotAcceptable":{"description":"Not Acceptable\n\nThe HyperText Transfer Protocol (HTTP) 406 Not Acceptable client error response code indicates that the server cannot produce a response matching the list of acceptable values defined in the request's proactive content negotiation headers, and that the server is unwilling to supply a default representation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"UnprocessableEntity":{"description":"Unprocessable Entity\n\nThe HyperText Transfer Protocol (HTTP) 422 Unprocessable Entity response status code indicates that the server understands the content type of the request entity, and the syntax of the request entity is correct, but it was unable to process the contained instructions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"LimitReached":{"description":"Too Many Requests\n\nThe HTTP 429 Too Many Requests response status code indicates the user has sent too many requests in a given amount of time (\"rate limiting\").","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"InternalServerError":{"description":"Internal Server Error\n\nThe HyperText Transfer Protocol (HTTP) 500 Internal Server Error response code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"NotImplemented":{"description":"Not Implemented\n\nThe HyperText Transfer Protocol (HTTP) 501 Not Implemented server error response code means that the server does not support the functionality required to fulfill the request.\n\nThe server either does not recognize the request method, or it lacks the ability to fulfil the request. Usually this implies future availability (e.g., a new feature of a web-service API).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"BadGateway":{"description":"Bad Gateway\n\nThe HyperText Transfer Protocol (HTTP) 502 Bad Gateway server error response code indicates that the server, while acting as a gateway or proxy, received an invalid response from the upstream server.\n\nThe HTTP 502 Bad Gateway error is exclusively returned in case of problems during communication with the supplier or third-party system. ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"ServiceUnavailable":{"description":"Service Unavailable\n\nThe HyperText Transfer Protocol (HTTP) 503 Service Unavailable server error response code indicates that the server is not ready to handle the request.\n\nThe HTTP 503 Service Unavailable error is exclusively returned in case of problems during internal communication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"GatewayTimeout":{"description":"Gateway Timeout\n\nThe HyperText Transfer Protocol (HTTP) 504 Gateway Timeout server error response code indicates that the server, while acting as a gateway or proxy, did not get a response in time from the upstream server that it needed in order to complete the request.\n\nThe HTTP 504 Gateway Timeout error is exclusively returned in case of problems during communication with the supplier or third-party system. ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}}},"paths":{"/availability":{"get":{"description":"Returns detailed pricing rules, variations, and conditions for the selected product.\n\nUse this endpoint to understand why and how prices change, based on rules such as date-based pricing, quantity discounts, time-of-day rules, and other dynamic configurations.\n\nIdeal for building advanced UIs that explain pricing logic to end users or trigger specific behaviors based on rule conditions.\n\n📘 [View full documentation on GitBook](https://docs.prioticket.com/key-concepts/availability-and-capacity)\n","summary":"Get Availability & Pricing Variations","tags":["Availability"],"operationId":"getAvailabilityVariations","parameters":[{"$ref":"#/components/parameters/DistributorIDOptional"},{"name":"product_id","in":"query","required":false,"explode":false,"style":"form","description":"[FILTER] on `product_id`.","schema":{"title":"Product IDs","type":"array","items":{"title":"Product ID","type":"string"}}},{"name":"from_date","in":"query","required":true,"description":"[FILTER] From which date availability is requested.\nIf supplied with `to_date` , then availability request is for a date range. \nIf supplied without `to_date`, then for a single date availability is requested.","schema":{"type":"string","format":"date"}},{"name":"to_date","in":"query","required":false,"description":"[FILTER] Till which date availability is requested.\nIf this is empty, availability will be searched for the given `from_date` only. ","schema":{"type":"string","format":"date"}},{"name":"include_disabled","in":"query","required":false,"description":"[FILTER] Include disabled / closed (`availability_active:false`) entries. ","schema":{"type":"boolean","default":false}},{"name":"availability_capacity_id","in":"query","required":false,"description":"[FILTER] on `availability_capacity_id`.","schema":{"type":"string"}},{"name":"spots_open_min","in":"query","required":false,"description":"[FILTER] The minimum remaining `availability_spots_open`.","schema":{"type":"integer","exclusiveMaximum":false}},{"name":"sub_products_depth","in":"query","required":false,"description":"[FILTER] The iteration depth of the included entries of the sub-products in the response. This will not apply to sub-products which have shared capacity linked to the main product.\n\nExample Setup:\n```\nProduct 101 (Main)\n  Product 201 (Sub)\n    Product 301 (Nested)\n    Product 302 (Nested)\n  Product 202 (Sub)\n    Product 401 (Nested)\n    Product 402 (Nested)\n```\n* `sub_products_depth:0` will return Product 101.\n* `sub_products_depth:1` will return Product 101, 201 and 202.\n* `sub_products_depth:2` will return Product 101, 201, 202, 301, 302, 401 and 402.","schema":{"type":"integer","default":0}},{"$ref":"#/components/parameters/If-Modified-Since"}],"responses":{"200":{"description":"Product Availability Response","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"Last-Modified":{"$ref":"#/components/headers/Last-Modified"},"Content-Language":{"$ref":"#/components/headers/Content-Language"},"Content-Length":{"$ref":"#/components/headers/Content-Length"},"Access-Control-Allow-Methods":{"$ref":"#/components/headers/Access-Control-Allow-Methods"},"Content-Security-Policy":{"$ref":"#/components/headers/Content-Security-Policy"},"X-XSS-Protection":{"$ref":"#/components/headers/X-XSS-Protection"},"X-Content-Type-Options":{"$ref":"#/components/headers/X-Content-Type-Options"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Origin":{"$ref":"#/components/headers/Origin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilityVariationListResponse"}}}},"400":{"$ref":"#/components/responses/InvalidRequest"},"401":{"$ref":"#/components/responses/AuthenticationFailed"},"403":{"$ref":"#/components/responses/Forbidden"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/LimitReached"},"500":{"$ref":"#/components/responses/InternalServerError"},"501":{"$ref":"#/components/responses/NotImplemented"},"502":{"$ref":"#/components/responses/BadGateway"},"503":{"$ref":"#/components/responses/ServiceUnavailable"},"504":{"$ref":"#/components/responses/GatewayTimeout"}}}}}}
````

## Get Availability & Calculated Pricing

> Returns up-to-date availability and pre-calculated pricing based on the selected configuration and party size.\
> \
> This endpoint provides simplified access to final pricing, ideal for rendering calendars and booking flows. For advanced use cases and detailed logic (e.g. price variations, rule-based conditions), refer to our extended documentation.\
> \
> 📘 \[View full documentation on GitBook]\(<https://docs.prioticket.com/key-concepts/availability-and-capacity>)<br>

````json
{"openapi":"3.0.0","info":{"title":"Distributor API Specification V3.8","version":"3.8.0"},"tags":[{"name":"Availability","description":"Get realtime availability & pricing.\n\nPrioticket provides two distinct endpoints to support accurate availability and pricing:\n- Availability & Pricing Variations API – Returns detailed pricing rules and logic, ideal for advanced UI behavior or transparency in pricing explanations.\n- Availability & Calculated Pricing API – Returns real-time availability and final calculated pricing, optimized for booking flows and calendar rendering.\n\nEach serves a different purpose in the booking journey. To implement them correctly and avoid common pitfalls (e.g. mismatched prices, missing availability, performance issues), please refer to the [full documentation on GitBook](https://docs.prioticket.com/key-concepts/availability-and-capacity).\n"}],"servers":[{"url":"https://{environment}.prioticket.com/{version}/distributor","description":"Prio environments.","variables":{"environment":{"description":"* `distributor-api` - Production server; used for real transactions.\n\n* `sandbox-distributor-api` - Sandbox server.\n\n* `staging-distributor-api` - Pre-Production server; used for testing (UAT), verification, demo and certification.\n\n* `internal-distributor-api` - Internal server; reserved for internal use.\n","default":"staging-distributor-api","enum":["distributor-api","sandbox-distributor-api","staging-distributor-api","internal-distributor-api"]},"version":{"description":"Api version.","default":"v3.8","enum":["v3.8"]}}}],"security":[{"OAuth2":["https://www.prioticketapis.com/auth/distributor/products"]}],"components":{"securitySchemes":{"OAuth2":{"type":"oauth2","description":"OAuth2 implementation.","flows":{"clientCredentials":{"tokenUrl":"https://sandbox-distributor-api.prioticket.com/v3.8/distributor/oauth2/token","scopes":{"https://www.prioticketapis.com/auth/distributor.products.readonly":"Grants access to products.","https://www.prioticketapis.com/auth/distributor.reservations":"Grants access to reservations.","https://www.prioticketapis.com/auth/distributor.bookings":"Grants access to bookings.","https://www.prioticketapis.com/auth/distributor.bookings.details":"Grants access to booking details.","https://www.prioticketapis.com/auth/distributor/reporting":"Grants access to reporting."}}}}},"parameters":{"DistributorIDOptional":{"name":"distributor_id","in":"query","required":false,"description":"[FILTER] on `distributor_id`.","schema":{"type":"string"}},"ItemsPerPage":{"name":"items_per_page","in":"query","required":false,"description":"[PAGING] Items Per Page - Allows user's to configure the `items_per_page` value. For example, to load 100 items per page, the developer may point the user to a url with the query string ?items_per_page=100.  \n\nThis parameter is mainly usefull to manage response times, higher values result in longer response times and therefore it is recommended to keep this value as low as possible. We do allow to adjust this value so it can be used to batch/cache/update inventory at once.  \n\nClients should anticipate that the value of this parameter may not be honored by the API, and should rely exclusively on the contents of the `items_per_page` response element in calculating actual page size.","schema":{"type":"integer","minimum":1,"maximum":200,"default":10}},"StartIndex":{"name":"start_index","in":"query","required":false,"description":"[PAGING] Index-based paging - Allows user's to jump directly to a specific item position within a list of items. For example, to load 10 items starting at item 200, the developer may point the user to a url with the query string ?start_index=200.","schema":{"type":"integer","minimum":1,"default":1,"maximum":10000}},"Page":{"name":"page","in":"query","required":false,"description":"[PAGING] Page-based paging - Allows user's to jump directly to a specific page within the items. \nThis is similar to index-based paging, but saves the developer the extra step of having to calculate the item index for a new page of items. For example, rather than jump to item number 200, the developer could jump to page 20. The urls during page-based paging could use the query string ?page=1 or ?page=20. The `page_index` and `total_pages` properties are used for this style of paging.","schema":{"type":"integer","minimum":1,"default":1}},"If-Modified-Since":{"in":"header","name":"If-Modified-Since","description":"[CACHE] The `If-Modified-Since` request HTTP header makes the request conditional: the server will send back the requested resource, with a 200 status, only if it has been modified after the given date. \n\nIf the resource has not been modified since, the response will be a 304 without any body; the `Last-Modified` response header of a previous request will contain the date of last modification.\n> Note that if a single resource has changed, all records matching your request will be returned, not just those changed after the given date. This provides you with an efficient caching method.","schema":{"title":"If-Modified-Since","type":"string"}}},"schemas":{"GetPricingRequest":{"title":"Get Pricing Request","description":"Request for availability & pricing.","type":"object","properties":{"api_version":{"$ref":"#/components/schemas/ApiVersion"},"data":{"$ref":"#/components/schemas/GetPricingRequestData"}},"required":["api_version","data"]},"ApiVersion":{"title":"API Version","description":"Represents the version of the service API that's served in the response.","type":"string","readOnly":true},"GetPricingRequestData":{"title":"Get Pricing Request Data","description":"Get pricing request data model.","type":"object","properties":{"kind":{"$ref":"#/components/schemas/Kind"},"pricing":{"$ref":"#/components/schemas/PricingRequestModel"}},"required":["kind","pricing"]},"Kind":{"title":"Kind","description":"The kind property serves as a guide to what type of information this particular object stores.","type":"string","readOnly":true,"enum":["location","route","category","product","currency","tax","addon","availability","stock","reservation","order","promocode","promo","webhook","notification","voucher","contact","payment","credit","destination","recommendation"]},"PricingRequestModel":{"title":"Pricing Request Model","description":"Pricing request model.","type":"array","items":{"properties":{"product_type_id":{"title":"Product Type ID","type":"string","description":"In case of more complex product configurations e.g. multiple ambiguous product types, the preferred option must be specified using the ID."},"product_type_count":{"title":"Product Type Count","description":"The quantity being booked for the specified product type.\n\nPlease note that the following structures are deemed semantically the same.\n```\n\"product_type_details\":[\n  {\n     \"product_type_id\":\"13725\",\n     \"product_type_count\":\"2\"\n  }\n]\n\nand\n\n\"product_type_details\":[\n  {                     \n     \"product_type_id\":\"13725\",   \n     \"product_type_count\":1   \n  },\n  {       \n     \"product_type_id\":\"13725\",    \n     \"product_type_count\":1     \n  }\n]\n```\nWe allow this 'alternative format' for 'ease-of-use'. Please note that in the order response we have no other option than to 'split' the product types, otherwise, we would not be able to send multiple codes (single `product_type_code` per pax/piece) in the response.\n","type":"integer","minimum":1,"maximum":500,"multipleOf":1}}}},"AvailabilitiesListResponse":{"title":"Availabilities List Response","description":"Availabilities list response.","type":"object","properties":{"api_version":{"$ref":"#/components/schemas/ApiVersion"},"data":{"$ref":"#/components/schemas/AvailabilitiesListResponseData"}},"required":["api_version","data"]},"AvailabilitiesListResponseData":{"title":"Availabilities List Response Data","description":"Availabilities list response data.","type":"object","allOf":[{"$ref":"#/components/schemas/ReservedPaginationData"},{"type":"object","properties":{"items":{"title":"Availability Slots","description":"List of all availability slots.","type":"array","items":{"$ref":"#/components/schemas/AvailabilityCalculatedPricingModel"}}}}],"required":["kind","total_items","items"]},"ReservedPaginationData":{"title":"Reserved Pagination Data","type":"object","description":"The following properties are located in the data object, and help page through a list of items.\nThe paging properties below allow for various styles of paging, including:\n+ Previous/Next paging - Allows user's to move forward and backward through a list, one page at a time. The nextLink and previousLink properties (described in the \"Reserved Property Names for Links\" section below) are used for this style of paging.\n+ Index-based paging - Allows user's to jump directly to a specific item position within a list of items. For example, to load 10 items starting at item 200, the developer may point the user to a url with the query string ?startIndex=200.\n+ Page-based paging - Allows user's to jump directly to a specific page within the items. \n\n  This is similar to index-based paging, but saves the developer the extra step of having to calculate the item index for a new page of items. For example, rather than jump to item number 200, the developer could jump to page 20. The urls during page-based paging could use the query string ?page=1 or ?page=20. The pageIndex and totalPages properties are used for this style of paging.","required":["kind","current_item_count","items_per_page","start_index","total_items","page_index","total_pages"],"properties":{"kind":{"$ref":"#/components/schemas/Kind"},"current_item_count":{"title":"Current Item Count","type":"integer","maximum":500,"minimum":0,"description":"The number of items in this result set. Should be equivalent to items.length, and is provided as a convenience property. For example, suppose a developer requests a set of search items, and asks for 10 items per page. The total set of that search has 14 total items. The first page of items will have 10 items in it, so both `items_per_page` and `current_item_count` will equal \"10\". The next page of items will have the remaining 4 items; `items_per_page` will still be \"10\", but `current_item_count` will be \"4\"."},"items_per_page":{"title":"Items Per Page","type":"integer","minimum":0,"maximum":200,"description":"The number of items in the result. This is not necessarily the size of the data.items array; if we are viewing the last page of items, the size of data.items may be less than `items_per_page`. However the size of data.items should not exceed `items_per_page`."},"start_index":{"title":"Start Index","type":"integer","minimum":1,"description":"The index of the first item in data.items. For consistency, `start_index` should be 1-based. For example, the first item in the first set of items should have a `start_index` of 1. If the user requests the next set of data, the `start_index` may be 10."},"total_items":{"title":"Total Items","type":"integer","readOnly":true,"description":"The total number of items available in this set. For example, if a user has 100 blog posts, the response may only contain 10 items, but the `total_items` would be 100.","minimum":0},"page_index":{"title":"Page Index","type":"integer","minimum":1,"description":"The index of the current page of items. For consistency, `page_index` should be 1-based. For example, the first page of items has a `page_index` of 1. `page_index` can also be calculated from the item-based paging properties: `page_index` = floor(`start_index` / `items_per_page`) + 1."},"total_pages":{"title":"Total Pages","type":"integer","minimum":0,"readOnly":true,"description":"The total number of pages in the result set. `total_pages` can also be calculated from the item-based paging properties above: `total_pages` = ceiling(`total_items` / `items_per_page`)"}}},"AvailabilityCalculatedPricingModel":{"title":"Availability Calculated Pricing Model","type":"object","allOf":[{"$ref":"#/components/schemas/AvailabilityModel"},{"type":"object","properties":{"availability_pricing":{"title":"Availability Slot Pricing","type":"array","description":"Daily / Dynamic Pricing, only returned in case `product_daily_pricing:true` or `product_dynamic_pricing:true` for this product.\n\nPlease note that in case both are enabled, the combined difference will be returned.","items":{"$ref":"#/components/schemas/AvailabilityCalculatedPricing"}}}}]},"AvailabilityModel":{"title":"Availability Slot Model","type":"object","additionalProperties":false,"description":"Information on a specific availability slot.\n> Only applicable if `product_availability:true`.","properties":{"availability_id":{"title":"Availability Slot ID","description":"The unique ID for this availability slot.","type":"string","readOnly":true},"availability_capacity_id":{"title":"Availability Slot Capacity ID","description":"Availability group / capacity identifier.","type":"string","readOnly":true},"availability_capacity_shared_id":{"title":"Availability Slot Shared Capacity ID","description":"Shared availability / capacity identifier. Only applicable if `capacity_type:SHARED / COMBINED`.","type":"string"},"availability_label":{"title":"Availability Slot Label","type":"string","description":"Optional label for this availability slot."},"availability_product_id":{"title":"Availability Slot Product ID","description":"The product linked to this availability slot.\n\n> In case you are requesting the availability for a main combi product (`product_class:COMBI`) or a cluster product (`product_class:CLUSTER`) and `sub_products_depth: > 0` all sub-product availabilities will be returned as well. ","type":"string"},"availability_admission_type":{"$ref":"#/components/schemas/ProductAdmissionType"},"availability_active":{"title":"Availability Slot Active","description":"Whether this availability slot is active (open) or not (closed). This availability cannot be booked if `availability_active:false`.","type":"boolean","default":true},"availability_duration":{"title":"Availability Slot Duration","type":"integer","description":"Duration of the timeslot in seconds"},"availability_from_date_time":{"title":"Availability Slot From Date Time","description":"The starting date and time of the activity availability slot.","type":"string","format":"date-time"},"availability_to_date_time":{"title":"Availability Slot To Date Time","description":"The till date and time of the activity availability slot.","type":"string","format":"date-time"},"availability_booking_window_start":{"title":"Availability Booking Window Start","type":"string","format":"date-time","description":"The start date-time from when this availability slot is bookable."},"availability_booking_window_end":{"title":"Availability Booking Window End","type":"string","format":"date-time","description":"The end date-time from which this availability slot is no longer bookable."},"availability_spots":{"$ref":"#/components/schemas/AvailabilitySpots"},"availability_created":{"title":"Availability Slot Created","description":"The date on which the availability slot has been created.","type":"string","format":"date-time"},"availability_modified":{"title":"Availability Slot Modified","description":"The date on which this availability slot has been modified (Capacity and Configuration).","type":"string","format":"date-time"}},"required":["availability_id","availability_active","availability_from_date_time","availability_created","availability_modified"]},"ProductAdmissionType":{"title":"Product Admission Types","type":"string","readOnly":true,"enum":["TIME_PERIOD","TIME_DATE","TIME_POINT","TIME_SLOT","TIME_OPEN"],"description":"<details>\n  <summary>**Product Admission Types**</summary>\n  \n* `TIME_PERIOD` - Customers can arrive at any time between the start (`availability_from_date_time`) and end time (`availability_to_date_time`) of the availability slot. Multiple periods in a single day should be expected.\n  Therefore a date- and timepicker should be shown.\n\n* `TIME_DATE` - Variation on `TIME_PERIOD`, whereas only a single period exists in a day. It is not required to choose between different times within a day, therefore only a datepicker is required.\n  Note that in case the slot includes midnight (two or more days), the day from which the `availability_from_date_time` originated should take precedence.\n\n* `TIME_POINT` - Customers are required to be present at the start time of the availability slot but can leave any time they want.\n* `TIME_OPEN` - Customers can arrive at any time. Availablity is not applicable.\n* `TIME_SLOT` - Customers are required to be present at the start time of the availability slot, and the service is expected to finish at the end time of the slot. </details>\n"},"AvailabilitySpots":{"title":"Availability Spots","type":"object","description":"Information over the spots that the merchant has set for this configuration.\n> Only applicable for managed (limited) capacity `product_capacity:true`.\n\n> In case of 3rd party aggregated data, not all fields will be available.","properties":{"availability_spots_total":{"title":"Availability Spots Total","description":"The total number of spots that the merchant has configured for this distributor (including those that are not available).","type":"integer"},"availability_spots_reserved":{"title":"Availability Spots Reserved","description":"The number of spots currently reserved / blocked for this availability entry. Some of these might open up in the near future (e.g. abandoned checkouts). This value is already deducted from the `availability_spots_open` parameter and can be safely ignored in capacity calculations.\n\nFormula: `availability_spots_total` - (`availability_spots_booked` + `availability_spots_reserved`) = `availability_spots_open`.","type":"integer"},"availability_spots_booked":{"title":"Availability Spots Booked","description":"The number of spots currently booked for this availability entry. These might open up in the near future (Cancellations). This value is already deducted from the `availability_spots_open` parameter and can be safely ignored in capacity calculations.\n\nFormula: `availability_spots_total` - (`availability_spots_booked` + `availability_spots_reserved`) = `availability_spots_open`.","type":"integer","multipleOf":1},"availability_spots_open":{"title":"Availability Spots Open","description":"The number of spots currently available for this availability entry.","type":"integer","multipleOf":1},"availability_spots_details":{"title":"Availability Spots Details","description":"List of available spots.","deprecated":true,"type":"array","items":{"$ref":"#/components/schemas/Spot"}}},"required":["availability_spots_open"]},"Spot":{"title":"Spot","type":"object","description":"Information on the selected spot. Only applicable if PrioSeating is being used (`product_availability_assigned:true`).\n","properties":{"spot_name":{"title":"Spot Name","type":"string","description":"Spot name.","readOnly":true},"spot_section":{"title":"Spot Section","type":"string","description":"Name of the section. Only applicable if the product has sections."},"spot_row":{"title":"Spot Row","type":"string","description":"The row the spot resides in."},"spot_number":{"title":"Spot Number","description":"The spot number.","type":"string"}},"required":["spot_state"]},"AvailabilityCalculatedPricing":{"title":"Availability Calculated Pricing","type":"object","description":"Calculated pricing for this specific availability entry.","properties":{"pricing_total":{"$ref":"#/components/schemas/PricingTotal"},"product_type_pricing":{"$ref":"#/components/schemas/AvailabilityProductTypePricing"}}},"PricingTotal":{"title":"Pricing Total","description":"Total pricing overview.","type":"object","properties":{"total_sales_price":{"title":"Product Type Sales Price","description":"Standard price after discount for the end-customer set by the reseller.  (`product_type_list_price` - `product_type_discount` == `product_type_sales_price`).","type":"string","readOnly":true},"total_distributor_price":{"title":"Product Type Distributor Price","description":"Total price amount paid by the distributor to the reseller.","type":"string","readOnly":true},"total_reseller_price":{"title":"Total Reseller Price","description":"Total price amount that the reseller pays to the market administrator.","type":"string"},"total_market_price":{"title":"Total Market Price","description":"Total price amount paid by the market admin to the supplier.","type":"string"},"total_supplier_price":{"title":"Product Type Supplier Price","type":"string","description":"Total cost defined by supplier.","readOnly":true},"total_taxes":{"title":"Total Taxes","description":"List of taxes. Some tax types are only visible for certain users.","type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/ProductTax"}},"total_fees":{"title":"Total Fees","description":"List of fees. Some fee types are only visible for certain users.","type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/Fee"}}}},"ProductTax":{"title":"Product Tax","description":"Applied tax.","type":"object","readOnly":true,"required":["tax_id","tax_name","tax_amount"],"properties":{"tax_id":{"title":"Tax ID","type":"string","description":"Unique identifier of this tax configuration.","readOnly":true},"tax_name":{"title":"Tax Name","description":"Name of the tax.","type":"string","readOnly":true},"tax_price_type":{"title":"Tax Price Type","description":"Price level for which this tax is applicable.","type":"string","enum":["LIST_PRICE","SALES_PRICE","DISTRIBUTOR_PRICE","RESELLER_PRICE","MARKET_PRICE","SUPPLIER_PRICE"]},"tax_amount":{"title":"Tax Amount","description":"Amount of tax.","type":"string","readOnly":true},"tax_rate":{"title":"Tax Rate","description":"Tax rate (percentage).","type":"string","readOnly":true},"tax_lines":{"$ref":"#/components/schemas/TaxLines"}}},"TaxLines":{"title":"Tax Lines","type":"object","description":"Additional tax lines.","properties":{"tax_lines_id":{"title":"Tax Lines ID","description":"Tax lines ID.","type":"string"},"tax_line_name":{"title":"Tax Line Name","description":"Name of the tax line.","type":"string"},"tax_line_type":{"title":"Tax Line Type","type":"string","description":"Tax abbreviation."},"tax_line_rate":{"title":"Tax Line Rate","type":"string","description":"Tax rate (percentage)."},"tax_line_region":{"title":"Tax Line Region","description":"Country or State of the related tax authority.","type":"string"}}},"Fee":{"title":"Fee","description":"Fee details.","type":"object","readOnly":true,"required":["fee_type","fee_amount","fee_tax_id","fee_tax_amount","fee_included","fee_refundable"],"properties":{"fee_type":{"$ref":"#/components/schemas/FeeType"},"fee_amount":{"title":"Fee Amount","description":"The applicable fee amount, can either be a surcharge or discount.","type":"string","readOnly":true},"fee_percentage":{"title":"Fee Percentage","description":"Fee percentage.","type":"string"},"fee_tax_amount":{"title":"Fee Tax Amount","description":"Amount of tax.","type":"string","readOnly":true},"fee_included":{"title":"Fee Included","description":"Whether this is an additional fee that should be listed separately and included in the `price_total` or is part of a calculation, e.g. margin breakdown (informational only). ","type":"boolean","readOnly":true}}},"FeeType":{"title":"Fee Type","readOnly":true,"description":"Type of fee.\n\nFee Type:\n  * `SERVICE` - The service fee or margin for this transaction or product.\n  * `PARTNER` - The partner fee or margin for this transaction or product.\n  * `DISTRIBUTOR` - The distributor fee or margin for this transaction or product.\n  * `AFFILIATE` - The affiliate fee or margin for this transaction or product.\n  * `RESELLER` - The reseller fee or margin for this transaction or product.\n  * `MARKET_ADMIN` - The market admin fee or margin for this transaction or product.\n  * `PLATFORM` - The platform fee or margin for this transaction or product.\n  * `PAYMENT` - The payment fee for this transaction or product.\n  * `INSURANCE` - The insurance fee for this transaction or product.\n  * `CUSTOM` - Custom fee for this transaction, product or order.","type":"string","enum":["SERVICE","PARTNER","DISTRIBUTOR","AFFILIATE","RESELLER","MARKET_ADMIN","PLATFORM","PAYMENT","INSURANCE","CUSTOM"]},"AvailabilityProductTypePricing":{"title":"Availability Product Type Pricing","description":"Availability product type pricing.","type":"array","items":{"$ref":"#/components/schemas/AvailabilityProductTypePrice"}},"AvailabilityProductTypePrice":{"title":"Availability Product Type Price","description":"Individual availability product type price.","type":"object","properties":{"product_type":{"$ref":"#/components/schemas/ProductType"},"product_type_id":{"title":"Availability Pricing Variation Product Type ID","description":"The applicable product type.","type":"string"},"product_type_price_type":{"title":"Product Type Price Type","description":"Whether the price is applicable per individual or fixed for the whole group. \nPrice Type:\n     * `INDIVIDUAL` - Depending on the booking quantity, the price increases.\n     * `GROUP` - The price for this product type is fixed regardless of how many are booked.","type":"string","readOnly":true,"enum":["INDIVIDUAL","GROUP"]},"product_type_sales_price":{"title":"Product Type Sales Price","description":"End-customer sales price. Standard price after discount for the end-customer set by the reseller. (`product_type_list_price` - `product_type_discount` == `product_type_sales_price`).","type":"string","readOnly":true},"product_type_distributor_price":{"title":"Product Type Distributor Price","description":"Price paid by the distributor to the reseller.","type":"string","readOnly":true},"product_type_reseller_price":{"title":"Product Type Reseller price","description":"Price the reseller pays to the market administrator.","type":"string"},"product_type_market_price":{"title":"Product Type Market Price","description":"Price paid by the market admin to the supplier.","type":"string"},"product_type_supplier_price":{"title":"Product Type Supplier Price","type":"string","description":"Optional internal benchmark cost defined by supplier.","readOnly":true},"product_type_quantity_min":{"title":"Product Type Quantity Min","description":"The minimum required quantity to be selected. The `product_type_count` must be equal or higher.","type":"integer","multipleOf":1,"readOnly":true},"product_type_quantity_max":{"title":"Product Type Quantity Max","description":"The maximum allowed quantity to be selected. The `product_type_count` must be equal or lower.","maximum":500,"type":"integer","multipleOf":1,"readOnly":true},"product_type_taxes":{"title":"Product Type Taxes","description":"List of taxes. Some tax types are only visible for certain users.","type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/ProductTax"}},"product_type_fees":{"title":"Product Type Fees","description":"List of fees. Some fee types are only visible for certain users.","type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/Fee"}}}},"ProductType":{"title":"Product Type","type":"string","description":"Each product contains product types. These product types can offer aged based ticketing (such as Adult and Child), but also provide a variety of other flexible product variations such as group pricing, business and economy seating or different car configurations.\n\nBecause some products might behave different from others, each product type is categorized within a product class; a group of products that behaves similarly.\n<details>\n  <summary>**Product Types**</summary>\n\n  * Class Standard:\n    \n    Product types in the standard class are the most common and are supported by almost all systems. These types will always be age-restricted.\n    \n    Tour and experience providers have the flexibility to vary prices and apply different rules based on the age of their customers. This means they can charge full ticket prices for adults while offering discounted rates for children, or they may have specific requirements such as requiring at least one adult for every group of children booking a tour.\n    \n    During the process of checking prices and proceeding to checkout, customers should be able to select the number of individuals from each available age group for their booking.\n  \n    * `ADULT` - Adult.\n    \n    * `CHILD` - Child.\n    \n    * `SENIOR` - Senior.\n    \n    * `YOUTH` - Youth.\n        \n    * `INFANT` - Infant.\n    \n  * Class Individual:\n  \n    Product types in the individual class are less common and therefore have fewer supported systems. These types will never be age-restricted.\n    \n    * `PERSON` - Person.\n    \n    * `STUDENT` - Student.\n    \n    * `RESIDENT` - Resident.\n    \n    * `MILITARY` - Military.\n    \n    * `IMPAIRED` - Impaired.\n  \n  * Class Item:\n  \n    Product types in the item class do not refer to actual persons, instead they could, for example, be packages (Regular, Silver, Diamond), objects (Merchandise, private tours), a type of event, class identifier (Economy, Business) and much more.\n  \n    * `ITEM` - Item.\n    \n  * Class Group:\n   \n    Product types in the group class always consist of multiple persons. It can, for example, be a family of 2 Adults and 2 Childs.\n    \n    * `GROUP` - Group.\n    \n    * `FAMILY` - Family.\n    \n  * Class Custom:\n  \n    Product types in the custom class are completely dynamic and therefore require explicit mapping with external systems. They do not return as `CUSTOM`, instead they can take any form.\n    \n    * `CUSTOM` - Custom.\n    \n</details>\n","enum":["ADULT","CHILD","SENIOR","YOUTH","INFANT","PERSON","STUDENT","RESIDENT","MILITARY","IMPAIRED","ITEM","GROUP","FAMILY","CUSTOM"]},"ErrorModel":{"title":"Error Model","description":"Error model.","type":"object","readOnly":true,"properties":{"error":{"title":"Error Code","description":"The error code which occured.\n\nAs our API has over 1000+ unique error codes (grouped by HTTP status). We discourage implementing individual errors on your customer front-end interface and suggest a catch-all clause for each HTTP status code instead.\n\nErrors can be shown directly to the customer using the `error_message`, while more specific details explaining the problem will be provided in the `errors` object.\nWe recommend a combination of `error_message` and `error_reference` when communicating with the customer and API support.\n","type":"string","readOnly":true},"error_reference":{"title":"Error Reference","description":"Unique reference linked to this error.\n\nWe recommend showing this reference to the customer to allow for better issue tracking.\n","type":"string","readOnly":true},"error_message":{"title":"Error Message","description":"Customer friendly error message which can be shown on your front-end.\n","type":"string","readOnly":true},"error_description":{"title":"Error Description","description":"Human-readable ASCII [[USASCII]](https://tools.ietf.org/html/rfc6749#ref-USASCII) text providing additional information, used to assist the client developer in understanding the error that occurred.","type":"string","readOnly":true},"error_uri":{"title":"Error URI","description":"A URI identifying a human-readable web page with information about the error, used to provide the client \ndeveloper with additional information about the error.","type":"string","readOnly":true},"errors":{"title":"Error Messages","description":"Specific messages indicating one or more problems.","type":"array","readOnly":true,"items":{"title":"Error Message","description":"Specific message indicating a problem.","type":"string","readOnly":true}}},"required":["error","error_reference"]}},"headers":{"Cache-Control":{"description":"Specifies the maximum amount of time a resource will be considered fresh. Contrary to Expires, this directive is relative to the time of the request.","schema":{"type":"string"}},"Last-Modified":{"description":"The Last-Modified response HTTP header contains the date and time at which the origin server believes the resource was last modified.","schema":{"type":"string"}},"Content-Language":{"description":"The Content-Language entity header is used to describe the language(s) intended for the audience, so that it allows a user to differentiate according to the users' own preferred language.","schema":{"type":"string"}},"Content-Length":{"description":"The Content-Length entity header indicates the size of the entity-body, in bytes, sent to the recipient.","schema":{"type":"string"}},"Access-Control-Allow-Methods":{"description":"The Access-Control-Allow-Methods response header specifies the method or methods allowed when accessing the resource in response to a preflight request.","schema":{"type":"string"}},"Content-Security-Policy":{"description":"Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks.","schema":{"type":"string"}},"X-XSS-Protection":{"description":"The HTTP X-XSS-Protection response header is a feature of Internet Explorer, Chrome and Safari that stops pages from loading when they detect reflected cross-site scripting (XSS) attacks.","schema":{"type":"string"}},"X-Content-Type-Options":{"description":"The X-Content-Type-Options response HTTP header is a marker used by the server to indicate that the MIME types advertised in the Content-Type headers should not be changed and be followed.","schema":{"type":"string"}},"X-RateLimit-Limit":{"deprecated":true,"description":"Request limit per hour.","schema":{"type":"integer","deprecated":true}},"X-RateLimit-Remaining":{"description":"The number of requests left for the time window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"The UTC date/time at which the current rate limit window resets.","schema":{"type":"string"}},"Origin":{"description":"The Origin request header indicates where a fetch originates from.","schema":{"type":"string","format":"URI"}}},"responses":{"InvalidRequest":{"description":"Invalid Request\n\nThe HyperText Transfer Protocol (HTTP) 400 Bad Request response status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"AuthenticationFailed":{"description":"Authentication Failed\n\nThe access token provided is expired, revoked, malformed, or invalid for other reasons. The resource SHOULD respond with the HTTP 401 (Unauthorized) status code.  The client MAY request a new access token and retry the protected resource request.","headers":{"WWW-Authenticate":{"description":"Defines the authentication method that should be used to gain access to a resource.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"Forbidden":{"description":"Forbidden\n\nThe request requires higher privileges than provided by the access token. The resource server SHOULD respond with the HTTP 403 (Forbidden) status code and MAY include the `scope` attribute with the scope necessary to access the protected resource.","headers":{"WWW-Authenticate":{"description":"Defines the authentication method that should be used to gain access to a resource.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"MethodNotAllowed":{"description":"Method Not Allowed\n\nThe HyperText Transfer Protocol (HTTP) 405 Method Not Allowed response status code indicates that the request method is known by the server but is not supported by the target resource.\n\nA request method is not supported for the requested\n      resource; for example, a GET request on a form that\n      requires data to be presented via POST, or a PUT request\n      on a read-only resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"NotAcceptable":{"description":"Not Acceptable\n\nThe HyperText Transfer Protocol (HTTP) 406 Not Acceptable client error response code indicates that the server cannot produce a response matching the list of acceptable values defined in the request's proactive content negotiation headers, and that the server is unwilling to supply a default representation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"UnprocessableEntity":{"description":"Unprocessable Entity\n\nThe HyperText Transfer Protocol (HTTP) 422 Unprocessable Entity response status code indicates that the server understands the content type of the request entity, and the syntax of the request entity is correct, but it was unable to process the contained instructions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"LimitReached":{"description":"Too Many Requests\n\nThe HTTP 429 Too Many Requests response status code indicates the user has sent too many requests in a given amount of time (\"rate limiting\").","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"InternalServerError":{"description":"Internal Server Error\n\nThe HyperText Transfer Protocol (HTTP) 500 Internal Server Error response code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"NotImplemented":{"description":"Not Implemented\n\nThe HyperText Transfer Protocol (HTTP) 501 Not Implemented server error response code means that the server does not support the functionality required to fulfill the request.\n\nThe server either does not recognize the request method, or it lacks the ability to fulfil the request. Usually this implies future availability (e.g., a new feature of a web-service API).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"BadGateway":{"description":"Bad Gateway\n\nThe HyperText Transfer Protocol (HTTP) 502 Bad Gateway server error response code indicates that the server, while acting as a gateway or proxy, received an invalid response from the upstream server.\n\nThe HTTP 502 Bad Gateway error is exclusively returned in case of problems during communication with the supplier or third-party system. ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"ServiceUnavailable":{"description":"Service Unavailable\n\nThe HyperText Transfer Protocol (HTTP) 503 Service Unavailable server error response code indicates that the server is not ready to handle the request.\n\nThe HTTP 503 Service Unavailable error is exclusively returned in case of problems during internal communication.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"GatewayTimeout":{"description":"Gateway Timeout\n\nThe HyperText Transfer Protocol (HTTP) 504 Gateway Timeout server error response code indicates that the server, while acting as a gateway or proxy, did not get a response in time from the upstream server that it needed in order to complete the request.\n\nThe HTTP 504 Gateway Timeout error is exclusively returned in case of problems during communication with the supplier or third-party system. ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}}}},"paths":{"/availability/{product_id}":{"post":{"description":"Returns up-to-date availability and pre-calculated pricing based on the selected configuration and party size.\n\nThis endpoint provides simplified access to final pricing, ideal for rendering calendars and booking flows. For advanced use cases and detailed logic (e.g. price variations, rule-based conditions), refer to our extended documentation.\n\n📘 [View full documentation on GitBook](https://docs.prioticket.com/key-concepts/availability-and-capacity)\n","summary":"Get Availability & Calculated Pricing","tags":["Availability"],"operationId":"getProductAvailabilityPricing","parameters":[{"$ref":"#/components/parameters/DistributorIDOptional"},{"name":"product_id","in":"path","required":true,"description":"Unique identifier for the product assigned by Prio.","schema":{"type":"string"}},{"name":"from_date","in":"query","required":true,"description":"[FILTER] From which date availability is requested.\nIf supplied with `to_date` , then availability request is for a date range. \nIf supplied without `to_date`, then for a single date availability is requested.","schema":{"type":"string","format":"date"}},{"name":"to_date","in":"query","required":false,"description":"[FILTER] Till which date availability is requested.\nIf this is empty, availability will be searched for the given `from_date` only. ","schema":{"type":"string","format":"date"}},{"name":"include_disabled","in":"query","required":false,"description":"[FILTER] Include disabled / closed (`availability_active:false`) entries. ","schema":{"type":"boolean","default":false}},{"name":"availability_capacity_id","in":"query","required":false,"description":"[FILTER] on `availability_capacity_id`.","schema":{"type":"string"}},{"name":"spots_open_min","in":"query","required":false,"description":"[FILTER] The minimum remaining `availability_spots_open`.","schema":{"type":"integer","exclusiveMaximum":false}},{"name":"sub_products_depth","in":"query","required":false,"description":"[FILTER] The iteration depth of the included entries of the sub-products in the response. This will not apply to sub-products which have shared capacity linked to the main product.\n\nExample Setup:\n```\nProduct 101 (Main)\n  Product 201 (Sub)\n    Product 301 (Nested)\n    Product 302 (Nested)\n  Product 202 (Sub)\n    Product 401 (Nested)\n    Product 402 (Nested)\n```\n* `sub_products_depth:0` will return Product 101.\n* `sub_products_depth:1` will return Product 101, 201 and 202.\n* `sub_products_depth:2` will return Product 101, 201, 202, 301, 302, 401 and 402.","schema":{"type":"integer","default":0}},{"name":"availability_modified","in":"query","required":false,"description":"[FILTER] Only show entries modified after the given date.\n  \n  \n  Fetch incremental updates through this endpoint.\n","schema":{"type":"string","format":"date-time"}},{"$ref":"#/components/parameters/ItemsPerPage"},{"$ref":"#/components/parameters/StartIndex"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/If-Modified-Since"}],"requestBody":{"description":"Get Pricing Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPricingRequest"}}},"required":false},"responses":{"200":{"description":"Product Availability Response","headers":{"Cache-Control":{"$ref":"#/components/headers/Cache-Control"},"Last-Modified":{"$ref":"#/components/headers/Last-Modified"},"Content-Language":{"$ref":"#/components/headers/Content-Language"},"Content-Length":{"$ref":"#/components/headers/Content-Length"},"Access-Control-Allow-Methods":{"$ref":"#/components/headers/Access-Control-Allow-Methods"},"Content-Security-Policy":{"$ref":"#/components/headers/Content-Security-Policy"},"X-XSS-Protection":{"$ref":"#/components/headers/X-XSS-Protection"},"X-Content-Type-Options":{"$ref":"#/components/headers/X-Content-Type-Options"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Origin":{"$ref":"#/components/headers/Origin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilitiesListResponse"}}}},"400":{"$ref":"#/components/responses/InvalidRequest"},"401":{"$ref":"#/components/responses/AuthenticationFailed"},"403":{"$ref":"#/components/responses/Forbidden"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"406":{"$ref":"#/components/responses/NotAcceptable"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/LimitReached"},"500":{"$ref":"#/components/responses/InternalServerError"},"501":{"$ref":"#/components/responses/NotImplemented"},"502":{"$ref":"#/components/responses/BadGateway"},"503":{"$ref":"#/components/responses/ServiceUnavailable"},"504":{"$ref":"#/components/responses/GatewayTimeout"}}}}}}
````


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.prioticket.com/endpoints/availability.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
