These endpoints return the static content of the properties you can sell: descriptions, images, units, rate plans and their policies. Prices and availability are not here; use Availability for those.
| Call | Returns |
|---|---|
GET /v2/properties | Every property you can sell, paginated |
GET /v2/properties/{id} | One property |
GET /v2/properties/{property_id}/units/{id} | One unit |
GET /v2/properties/{property_id}/rate-plans/{id} | One rate plan |
GET /v2/rate-plans?ids=… | Several rate plans by ID, across properties |
GET /v2/corporate-profiles | The corporate profiles set up for your account |
Which properties you see
- Only properties you have an active contract with. Until a contract is live,
GET /propertiesdoesn't list the property andGET /properties/{id}returns403 You do not have an active partnership with this property. - Only active properties and active units. A property or unit type the hotel deactivates disappears from the response.
- Only public rate plans. Corporate negotiated rates (CNRs) are never listed on these endpoints. They appear only in Availability when you send the matching
corporate_profile_id.
Downloading your content (GET /properties)
GET /properties)| Parameter | Default | Notes |
|---|---|---|
page | 0 | Zero-based. |
limit | 10 | Maximum 50. Larger values are capped to 50. |
property_ids | — | Fetch specific properties. Repeat the parameter or comma-separate. When set, page and limit are ignored and at most 50 properties are returned; extra IDs are dropped without an error. |
locale | en | See Translations. |
{
"data": { "properties": [ { "id": "6Y1227GD", "name": "…", "units": [ … ], "rate_plans": [ … ], "…": "…" } ] },
"links": {
"first": { "method": "GET", "url": "https://api.katanox.com/v2/properties?limit=50&page=0" },
"previous": { "method": "", "url": "" },
"next": { "method": "GET", "url": "https://api.katanox.com/v2/properties?limit=50&page=1" },
"last": { "method": "GET", "url": "https://api.katanox.com/v2/properties?limit=50&page=180" }
},
"meta": { "total_properties": 9075 }
}How to page through everything: request page=0, 1, 2, … with limit=50 and stop when data.properties is empty.
- Don't stop at
links.lastor whenlinks.nextis empty; the last page can be missing from both. links.previous/links.nextare returned as{"method":"","url":""}when there is no such page.linksisnullwhen you have no properties.- Don't use
meta.total_propertiesas the number of properties you will receive. It counts the properties under your contracts, including ones that are currently inactive.
Common mistake: deleting a property from your catalogue because one sync didn't return it. A temporary problem on our side can return a short or empty page. Only remove a property after it has been missing from several consecutive syncs, and alert on a sync that returns far fewer properties than the previous one.
Keeping content fresh.
- Hotels update their content at irregular times. Refreshing your copy weekly is enough for descriptions, images and amenities.
- Rate plans change more often. A new corporate rate or promotion adds rate plans; an expired one removes them. An offer in availability can reference a
rate_plan_idyou haven't downloaded yet: use therate_plansmap in the availability response, or fetch it withGET /rate-plans?ids=.
Property
| Field | Type | Meaning |
|---|---|---|
id | string | 8-character Katanox property ID |
name, description | string | Default-language content |
address_line_1, address_line_2, postcode, city | string | |
country | string | Country name, e.g. Greece |
country_code | string | Two-letter country code, lower case, e.g. gr. Can be empty. |
location | object | { "latitude": 37.97, "longitude": 23.72 }. See Content quality. |
phone_number, email | string | The property's contact details |
currency | string | ISO 4217. All prices for this property are in this currency. |
star_rating | integer | 0 means the property has no official rating (some chains don't use stars). |
number_of_units | integer | Number of units the property has in total. Not availability. |
timezone | string | IANA name, e.g. Europe/Athens. Check-in/out times and policy deadlines are in this timezone. |
check_in_time, check_out_time | string | As the hotel provides it, e.g. 3pm, 11:00. Free text. Can be empty. |
images | array | Image. Ordered as the hotel ranks them. |
facilities | array | Facility: what the property offers. |
units | array | Unit: the unit types. |
rate_plans | array | Rate plan: the public rate plans you can sell. |
payments_metadata | object | payment_methods (CREDIT_CARD, KTX_PAYMENTS) and supported_card_brands, the card brands the property accepts. See Payments. Either list can be null. |
translations | array | Translations |
Empty strings and empty lists are returned as "" and [], not omitted.
There are no policies on the property itself. Policies belong to rate plans.
Image
| Field | Meaning |
|---|---|
url | Image URL, hosted by Katanox. Use it directly. |
tag | Featured for the main image, otherwise empty. |
width, height | Pixels |
Facilities and amenities
| Where | Field | Describes | Examples |
|---|---|---|---|
| Property | facilities | The property as a whole | Pool, restaurant, parking, 24-hour reception |
| Unit | amenities | One unit type | Air conditioning, minibar, free Wi-Fi |
| Rate plan | meals | What's included in the rate | Breakfast included |
Each facility and amenity has id, category and name.
- Parking is always a property facility (e.g.
Free Parking,Valet,Parking garage), never a unit amenity. - Wi-Fi is a unit amenity,
Free WIFI. - The full list of facility and amenity names is fixed. There is no endpoint for it; ask your account manager for the current list if you map our content to your own.
Unit
A unit is a unit type, not a physical unit.
| Field | Type | Meaning |
|---|---|---|
id | string | 8-character unit ID |
property_id | string | |
name, description | string | As the hotel names it, e.g. 2 Queen Beds, Non-Smoking. |
bed_types | array | name (e.g. Double), amount (how many of these beds), occupancy (people per bed). |
type | string | Free text, e.g. Double. |
class | string | Deprecated: will be removed in a future API version. Free text, e.g. Deluxe. |
amenities | array | See Facilities and amenities |
images | array | Image |
translations | array | Translations |
- Use
bed_types, not the name, for the bed setup. We pass unit names through as the hotel sends them and don't parse them. - Maximum occupancy is not exposed. The availability search only returns units that fit the guests you asked for (Availability → Limits).
- Some hotels expose few unit types. Some chains sell only their "best available" unit through us and assign the actual unit at check-in.
- There is no filter for unit type (twin/double) in availability. Map and filter units on your side.
Rate plan
| Field | Type | Meaning |
|---|---|---|
id | string | 8-character rate plan ID. Unique across all properties. |
property_id | string | |
name, description | string | Free text from the hotel |
rate_type | string | See Reference values |
meals | string | See Reference values |
payment_methods | array | CREDIT_CARD and/or KTX_PAYMENTS. See Payments. |
payment_modes | array | PAY_NOW and/or PAY_AT_PROPERTY |
eligible_for_loyalty_points | boolean | Whether bookings on this rate earn the guest loyalty points with the hotel chain |
cancellation_policies | array | See Cancellation → Fields |
no_show_policy | object | name, description, charge_type, amount. See Cancellation → No-show policy. |
services | array | Deprecated: will be removed in a future API version. Extras the hotel offers on this rate: id, name, description, price, pricing_unit. |
translations | array | Translations |
For booking, use the policies from availability. The policies here describe the rate plan in general. The ones that apply to a specific stay are in data.rate_plans of the availability response, and the ones that apply to a booking are stored on the reservation (Cancellation).
An empty cancellation_policies list does not mean the rate is non-refundable. It means the hotel hasn't provided the policy for that rate plan. Report it to us.
Translations
translations holds the content in other languages: locale, name, description.
nameanddescriptionon the object itself are always in the default language (usually English).- On
GET /propertiesandGET /properties/{id}, translations are only returned when you send alocaleother thanen. You then get every available translation, not only the one you asked for. - On
GET /properties/{property_id}/units/{id},localereturns only that language. - Rate plans always include every available translation.
Content quality
We pass property content through as the hotel or chain gives it to us. A few things to know:
- Coordinates come from the chain. Some chains give the street entrance rather than the building, so they can differ slightly from map services. If you find coordinates that are clearly wrong, tell us and we'll raise it with the chain.
- Two properties can share an address, for example two hotels in the same building.
- Room names follow the chain's naming. See Unit.
- Where a property comes from is not exposed. The content looks the same whichever hotel system or channel serves the property.
IDs and mapping
- Katanox IDs are unique across all chains. A hotel's own code (e.g. a chain property code) can clash with another chain's, so always store our
id. - Rate plan IDs are unique across properties, so
GET /rate-plans?ids=doesn't need a property ID. - If you need to match our properties to your own catalogue, ask your account manager for a mapping file.
Single unit, single rate plan
GET /v2/properties/{property_id}/units/{id} returns { "unit": { … } }.
GET /v2/properties/{property_id}/rate-plans/{id} returns { "rate_plan": { … } }.
| Status | Meaning |
|---|---|
403 | You do not have an active partnership with this property, or The rate plan specified is not part of the partnership (for example a corporate rate) |
404 | Unknown or malformed ID |
Several rate plans (GET /rate-plans)
GET /rate-plans)GET /v2/rate-plans?ids=6Y11JROY,P8XW5MG2
- Returns
{ "data": { "rate_plans": [ … ] } }. - Pass up to 50 IDs. Repeat
idsor comma-separate. - Rate plans you don't have access to are left out of the response without an error.
400 Rate plan ids cannot be emptywhen no ID is sent.404when none of the IDs can be returned.
Corporate profiles (GET /corporate-profiles)
GET /corporate-profiles)A corporate profile represents one company you sell corporate negotiated rates (CNRs) for. We create it when the hotel has loaded the CNR, and you send its id as corporate_profile_id in availability searches (Availability).
{ "data": [ { "id": "J0GER8X4", "name": "Acme Corp" } ], "meta": { "total": 1 } }| Parameter | Default | Notes |
|---|---|---|
page | 0 | |
limit | 50 | Maximum 50 |
- Store one
corporate_profile_idper company on your side. - With a corporate profile, some hotels return only the corporate rate, not their public rates.
- A CNR stops appearing when its contract with the hotel ends.