GetProperty
const url = 'https://example.com/wink.partner.v1.Content/GetProperty';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"propertyId":"example","languageCode":"example","include":["CONTENT_SCOPE_UNSPECIFIED"],"maxMediaPerEntity":1,"knownVersion":"example","imageFormat":"example","videoFormat":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/wink.partner.v1.Content/GetProperty \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "propertyId": "example", "languageCode": "example", "include": [ "CONTENT_SCOPE_UNSPECIFIED" ], "maxMediaPerEntity": 1, "knownVersion": "example", "imageFormat": "example", "videoFormat": "example" }'Get one property by id
The single-property shape of GetProperties, for a deep link or a cache fill when you hold one
property_id and have no batch to make. Same content, same include scopes, same cache semantics.
Costs one unit — the SAME as a fifty-property GetProperties. Fetching fifty properties one at a time therefore costs fifty times what one batched call would; reach for GetProperties whenever you hold more than one id. This rpc exists for convenience, not economy.
Unlike GetProperties, an unknown id is an ERROR here rather than a per-entry status: with one property
in the response there is no batch left to keep succeeding, so NOT_FOUND is the honest answer. The
returned status is therefore only ever CONTENT_STATUS_OK or CONTENT_STATUS_NOT_MODIFIED.
Returns NOT_FOUND for an unknown id, and INVALID_ARGUMENT when property_id is blank or
max_media_per_entity is negative.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Request for GetProperty.
The single-property mirror of GetPropertiesRequest. Field names match it exactly so moving between the
two is a shape change and never a semantic one — the only differences are that property_ids becomes a
single property_id, and the known_versions map becomes the one known_version it would have held.
object
Property to fetch. Identifier comes from a search result’s property_id.
ISO 639-1 language for descriptions, e.g. “th”. English is ALWAYS returned alongside it, so a missing translation never leaves you with nothing to display. Defaults to English only.
What to include beyond the property’s basic identity. Empty means basics only.
Cap on images and videos returned per entity. Zero means no cap, which is the default.
Content you already hold: the cache_token this property’s last response carried.
Matches and the response comes back CONTENT_STATUS_NOT_MODIFIED carrying its content_version and
cache_token and nothing else — keep serving what you cached. Omit it and the property is returned in
full, which is the default.
Send back the cache_token, NOT the content_version. The same opacity rules as GetProperties apply:
do not parse it, do not build one. It covers the content AND the shape of the request that
produced it — include, max_media_per_entity, image_format and video_format among them — so
widening a scope or changing a media format correctly stops it matching rather than leaving you
permanently missing the thing you just asked for.
BILLING DOES NOT CHANGE. One unit per call whatever comes back.
IANA media type for image delivery URLs: image/jpeg (the default), image/png, image/webp, or image/* to let the CDN negotiate per client from its Accept header. Empty means image/jpeg.
An unrecognised value is rejected with INVALID_ARGUMENT rather than quietly falling back, so a typo
like “image/jpg” (not a media type) fails loudly instead of serving you JPEG while you believe you
asked for something else. Whatever is served is echoed back on MediaUrlVariant.format.
IANA media type for the PLAYABLE video delivery URLs, stream and preview: video/mp4 (the
default) or video/webm. Empty means video/mp4.
This does NOT affect poster and thumbnail. Those are still frames extracted from the video, so
they are images and follow image_format. An unrecognised value is rejected with INVALID_ARGUMENT.
Responses
Section titled “Responses”The RPC completed with gRPC status OK.
Response for GetProperty.
object
The property. Its status is CONTENT_STATUS_OK or CONTENT_STATUS_NOT_MODIFIED — an unknown id is a
NOT_FOUND error on the call itself, not a status here.
object
The property this entry describes.
Whether content was returned, and if not, why.
A stable hash of this response’s content: equal for equal content, different when anything you would
receive differs (the property, its perks, your channel’s room types and rates, the language, include
set, media cap and formats, and the media URLs). Present on CONTENT_STATUS_OK and CONTENT_STATUS_NOT_MODIFIED.
It is NOT the last_update the pricing endpoints return, and is not comparable to it. To ask us whether
your cached copy is current, send cache_token rather than this.
The scopes actually populated below. Echoed back so you can tell “not requested” from “none exist”.
Basic identity — always present when status is CONTENT_STATUS_OK.
object
Stable property identifier.
Url-safe slug.
Property name in the requested language.
Property name in its local language, when it differs.
Where the property is.
Bare latitude and longitude, not GeoJSON: this field carries only coordinates, and the surrounding JSON already tells you what kind of thing they belong to.
object
Degrees east of the prime meridian, -180 to 180.
Degrees north of the equator, -90 to 90.
Official star rating, 1-5. Zero when unrated.
Published property images, lowest sort first. Capped by max_media_per_entity when you set one.
Unpublished assets are never returned — a property that took an image down did so deliberately.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
Published property videos, same ordering and cap as images.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
ISO 4217 currency the property trades in.
Total rooms at the property.
The city this property is in, with the identifiers the destination surfaces take.
Here rather than on PropertyDetails so that it arrives on every successful Content call, whatever scopes you asked for: pivoting from a property to its city should not require paying for the full details scope. Absent when the property has no city on record.
object
GeoNames id, e.g. “1609350” for Bangkok. Pass to Search.SearchByCity.
Always set when this message is present: every property that has a city has this.
The city’s name.
NOT localized, unlike every other name on this surface. The lightweight GeoNames record this comes
from deliberately excludes alternate-name translations, so this is the canonical GeoNames name
whatever language_code you asked for. Said plainly because a caller would otherwise reasonably
assume it follows the rest of the response.
Url-safe slug. Pass to Search.RankByCity, which takes the url name rather than the GeoNames id.
EMPTY for a substantial minority of properties – 601 of 3,230 in production, about 19% – because the slug is populated separately from the GeoNames link. Check it before building a RankByCity call; an empty value here does not mean the property has no city, only that this particular handle is missing.
ISO 3166-1 alpha-2 country code of the city, e.g. “TH”.
Descriptions, address, policies, amenities, social profiles and the reservations desk’s email and phone. Present with CONTENT_SCOPE_PROPERTY_DETAILS.
object
Localized descriptions, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Postal address.
object
Street line 1.
Street line 2, when the property supplies one.
State, province or region.
Postal or ZIP code.
City name.
ISO 3166-1 alpha-2 country code, e.g. “TH”.
Country name in the requested language.
The full address pre-formatted for display, newline-free.
Property chain, when the property belongs to one.
Brand within the chain.
Setting, e.g. beachfront or city centre.
Market segment, e.g. luxury or economy.
Property type, e.g. property, hostel or resort.
Architectural style, when recorded.
Year or period built, when recorded.
Lifestyles this property is oriented toward.
Check-in, check-out, children and pet rules.
object
Local check-in time, “HH:mm”.
Local check-out time, “HH:mm”.
Whether children are accepted.
Minimum age accepted, when the property sets one.
Whether pets are accepted.
Maximum pet weight in kilograms, when limited.
How internet is provided, e.g. wired or wireless.
Where internet is available, e.g. in-room or public areas.
Whether internet is free or paid.
Whether parking is free, paid or unavailable.
How parking is accessed, e.g. valet or self.
OpenTravel HAC (Hotel Amenity) codes. Look codes up at https://wink.travel/developers/taxonomy.
OpenTravel PHY (Accessibility Feature) codes.
OpenTravel SEC (Security Feature) codes.
Mean guest review rating.
Number of guest reviews behind the rating.
Wink sustainability rating.
The property’s social network profiles, in the order the property listed them. Empty when it lists none.
A social network profile.
object
The network, as its platform name: “FACEBOOK”, “INSTAGRAM”, “SKYPE”, “TRIP_ADVISOR” and so on. An open set, so a client must tolerate a name it does not know yet.
The profile URL or the network’s own identifier for it.
How to reach the reservations desk. Unset when the property records no reservations contact.
EMAIL AND PHONE ONLY. The platform stores more than this for the desk (a contact’s name and a secondary email); none of it is published, and the message has no field it could arrive in.
object
The reservations email address. Empty when the property records none.
The reservations phone number, as the property entered it. Empty when the property records none.
On- and off-premises restaurants. Present with CONTENT_SCOPE_RESTAURANT.
A non-room inventory item: restaurant, spa, meeting room, activity, attraction, place or add-on.
These share a shape deliberately. They differ in what they mean, not in what they carry, and one message
keeps the contract small and lets a client render any of them with the same code. Where a type needs
fields the others do not, those arrive as new field numbers on this message rather than a new message –
the facts only one type has sit in the venue_details oneof below, one message per type.
At most one of restaurant, meetingRoom, attraction, place is set (protobuf oneof venue_details).
object
Stable identifier for this item.
Item name in the requested language.
Localized descriptions, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Images and videos.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
Display order within its collection, ascending.
Whether the item is on the property’s premises.
Where the item is, when it differs from the property.
Bare latitude and longitude, not GeoJSON. Absent, not zeroed, when the item sits at the property –
see PartnerContentContractMeasurementTest for how that absence is verified rather than assumed.
object
Degrees east of the prime meridian, -180 to 180.
Degrees north of the equator, -90 to 90.
Postal address, when the item has its own.
object
Street line 1.
Street line 2, when the property supplies one.
State, province or region.
Postal or ZIP code.
City name.
ISO 3166-1 alpha-2 country code, e.g. “TH”.
Country name in the requested language.
The full address pre-formatted for display, newline-free.
The lifestyle this item suits, when tagged. Singular, not a list: the platform records exactly one per item.
OpenTravel RSI (Restaurant Service/Amenity) codes. Populated only for restaurants.
OpenTravel SPA (Spa Feature) codes. Populated only for spas.
OpenTravel MRC (Meeting Room Code) codes. Populated only for meeting_rooms.
OpenTravel REC (Recreation) codes. Populated only for activities.
OpenTravel PRX (Proximity) code, e.g. “1” = On premises, “3” = Nearby. Five values, so do NOT read
it as a boolean – on_premises above is the two-way answer if that is all you need.
OpenTravel AQC (Age Qualifying) code, e.g. “3” = Under 2, “8” = Child, “1” = Over 21. An age CATEGORY, not a numeric minimum age – parsing it as a number yields nonsense for most values.
OpenTravel SEC (Security Feature) codes.
OpenTravel PHY (Accessibility Feature) codes.
Opening time, local to the property, “HH:mm”. Empty when the venue records none (spas, activities and places often do not).
Closing time, local to the property, “HH:mm”. Empty when the venue records none.
The days the venue is open. Unset when the venue records none, and ALSO unset when the venue has no days selected: the platform stores “no days selected” to mean every day, so that case is published as “not stated” rather than as a message with every day false (which would read as “never open”). When set, at least one day is true.
object
Open on Monday.
Open on Tuesday.
Open on Wednesday.
Open on Thursday.
Open on Friday.
Open on Saturday.
Open on Sunday.
Whether guests must reserve in advance. The platform stores this as a plain yes/no with no “not stated”
state, so a venue that never answered arrives as false, exactly like one that answered no. Do not read
false as “walk-ins are welcome”. The field is declared optional so a future release can leave it unset
for a venue that has not said; today it is always set.
Restaurant seating and service. Set on restaurants.
object
Total seating capacity. Unset when the property has not recorded it.
The largest party that can be seated together. Unset when the property has not recorded it.
Whether breakfast is served. False also covers “never recorded”.
Whether lunch is served. False also covers “never recorded”.
Whether dinner is served. False also covers “never recorded”.
Whether brunch is served. False also covers “never recorded”.
OpenTravel CUI (Main Cuisine) codes. Look codes up at https://wink.travel/developers/taxonomy.
OpenTravel RES (Restaurant Category) codes.
Meeting room size and format. Set on meeting_rooms.
object
How many people the room holds. 0 means not recorded.
Floor area in square meters. 0 means not recorded.
Ceiling height in meters. 0 means not recorded.
Width in meters. 0 means not recorded.
Length in meters. 0 means not recorded.
Whether the room has an irregular shape. False also covers “never recorded”.
The kind of access to the room, e.g. private or public. Untranslated text as the property entered it.
The level of the facility the room is on, as the property entered it.
OpenTravel MRF (Meeting Room Format) code.
Whether the room is dedicated to meetings rather than shared with other uses. False also covers “never recorded”.
Attraction category. Set on attractions.
object
OpenTravel ACC (Attraction Category) code.
Place category. Set on places.
object
OpenTravel REF (Reference Point Category) code.
Spas. Present with CONTENT_SCOPE_SPA.
A non-room inventory item: restaurant, spa, meeting room, activity, attraction, place or add-on.
These share a shape deliberately. They differ in what they mean, not in what they carry, and one message
keeps the contract small and lets a client render any of them with the same code. Where a type needs
fields the others do not, those arrive as new field numbers on this message rather than a new message –
the facts only one type has sit in the venue_details oneof below, one message per type.
At most one of restaurant, meetingRoom, attraction, place is set (protobuf oneof venue_details).
object
Stable identifier for this item.
Item name in the requested language.
Localized descriptions, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Images and videos.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
Display order within its collection, ascending.
Whether the item is on the property’s premises.
Where the item is, when it differs from the property.
Bare latitude and longitude, not GeoJSON. Absent, not zeroed, when the item sits at the property –
see PartnerContentContractMeasurementTest for how that absence is verified rather than assumed.
object
Degrees east of the prime meridian, -180 to 180.
Degrees north of the equator, -90 to 90.
Postal address, when the item has its own.
object
Street line 1.
Street line 2, when the property supplies one.
State, province or region.
Postal or ZIP code.
City name.
ISO 3166-1 alpha-2 country code, e.g. “TH”.
Country name in the requested language.
The full address pre-formatted for display, newline-free.
The lifestyle this item suits, when tagged. Singular, not a list: the platform records exactly one per item.
OpenTravel RSI (Restaurant Service/Amenity) codes. Populated only for restaurants.
OpenTravel SPA (Spa Feature) codes. Populated only for spas.
OpenTravel MRC (Meeting Room Code) codes. Populated only for meeting_rooms.
OpenTravel REC (Recreation) codes. Populated only for activities.
OpenTravel PRX (Proximity) code, e.g. “1” = On premises, “3” = Nearby. Five values, so do NOT read
it as a boolean – on_premises above is the two-way answer if that is all you need.
OpenTravel AQC (Age Qualifying) code, e.g. “3” = Under 2, “8” = Child, “1” = Over 21. An age CATEGORY, not a numeric minimum age – parsing it as a number yields nonsense for most values.
OpenTravel SEC (Security Feature) codes.
OpenTravel PHY (Accessibility Feature) codes.
Opening time, local to the property, “HH:mm”. Empty when the venue records none (spas, activities and places often do not).
Closing time, local to the property, “HH:mm”. Empty when the venue records none.
The days the venue is open. Unset when the venue records none, and ALSO unset when the venue has no days selected: the platform stores “no days selected” to mean every day, so that case is published as “not stated” rather than as a message with every day false (which would read as “never open”). When set, at least one day is true.
object
Open on Monday.
Open on Tuesday.
Open on Wednesday.
Open on Thursday.
Open on Friday.
Open on Saturday.
Open on Sunday.
Whether guests must reserve in advance. The platform stores this as a plain yes/no with no “not stated”
state, so a venue that never answered arrives as false, exactly like one that answered no. Do not read
false as “walk-ins are welcome”. The field is declared optional so a future release can leave it unset
for a venue that has not said; today it is always set.
Restaurant seating and service. Set on restaurants.
object
Total seating capacity. Unset when the property has not recorded it.
The largest party that can be seated together. Unset when the property has not recorded it.
Whether breakfast is served. False also covers “never recorded”.
Whether lunch is served. False also covers “never recorded”.
Whether dinner is served. False also covers “never recorded”.
Whether brunch is served. False also covers “never recorded”.
OpenTravel CUI (Main Cuisine) codes. Look codes up at https://wink.travel/developers/taxonomy.
OpenTravel RES (Restaurant Category) codes.
Meeting room size and format. Set on meeting_rooms.
object
How many people the room holds. 0 means not recorded.
Floor area in square meters. 0 means not recorded.
Ceiling height in meters. 0 means not recorded.
Width in meters. 0 means not recorded.
Length in meters. 0 means not recorded.
Whether the room has an irregular shape. False also covers “never recorded”.
The kind of access to the room, e.g. private or public. Untranslated text as the property entered it.
The level of the facility the room is on, as the property entered it.
OpenTravel MRF (Meeting Room Format) code.
Whether the room is dedicated to meetings rather than shared with other uses. False also covers “never recorded”.
Attraction category. Set on attractions.
object
OpenTravel ACC (Attraction Category) code.
Place category. Set on places.
object
OpenTravel REF (Reference Point Category) code.
Meeting rooms. Present with CONTENT_SCOPE_MEETING_ROOM.
A non-room inventory item: restaurant, spa, meeting room, activity, attraction, place or add-on.
These share a shape deliberately. They differ in what they mean, not in what they carry, and one message
keeps the contract small and lets a client render any of them with the same code. Where a type needs
fields the others do not, those arrive as new field numbers on this message rather than a new message –
the facts only one type has sit in the venue_details oneof below, one message per type.
At most one of restaurant, meetingRoom, attraction, place is set (protobuf oneof venue_details).
object
Stable identifier for this item.
Item name in the requested language.
Localized descriptions, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Images and videos.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
Display order within its collection, ascending.
Whether the item is on the property’s premises.
Where the item is, when it differs from the property.
Bare latitude and longitude, not GeoJSON. Absent, not zeroed, when the item sits at the property –
see PartnerContentContractMeasurementTest for how that absence is verified rather than assumed.
object
Degrees east of the prime meridian, -180 to 180.
Degrees north of the equator, -90 to 90.
Postal address, when the item has its own.
object
Street line 1.
Street line 2, when the property supplies one.
State, province or region.
Postal or ZIP code.
City name.
ISO 3166-1 alpha-2 country code, e.g. “TH”.
Country name in the requested language.
The full address pre-formatted for display, newline-free.
The lifestyle this item suits, when tagged. Singular, not a list: the platform records exactly one per item.
OpenTravel RSI (Restaurant Service/Amenity) codes. Populated only for restaurants.
OpenTravel SPA (Spa Feature) codes. Populated only for spas.
OpenTravel MRC (Meeting Room Code) codes. Populated only for meeting_rooms.
OpenTravel REC (Recreation) codes. Populated only for activities.
OpenTravel PRX (Proximity) code, e.g. “1” = On premises, “3” = Nearby. Five values, so do NOT read
it as a boolean – on_premises above is the two-way answer if that is all you need.
OpenTravel AQC (Age Qualifying) code, e.g. “3” = Under 2, “8” = Child, “1” = Over 21. An age CATEGORY, not a numeric minimum age – parsing it as a number yields nonsense for most values.
OpenTravel SEC (Security Feature) codes.
OpenTravel PHY (Accessibility Feature) codes.
Opening time, local to the property, “HH:mm”. Empty when the venue records none (spas, activities and places often do not).
Closing time, local to the property, “HH:mm”. Empty when the venue records none.
The days the venue is open. Unset when the venue records none, and ALSO unset when the venue has no days selected: the platform stores “no days selected” to mean every day, so that case is published as “not stated” rather than as a message with every day false (which would read as “never open”). When set, at least one day is true.
object
Open on Monday.
Open on Tuesday.
Open on Wednesday.
Open on Thursday.
Open on Friday.
Open on Saturday.
Open on Sunday.
Whether guests must reserve in advance. The platform stores this as a plain yes/no with no “not stated”
state, so a venue that never answered arrives as false, exactly like one that answered no. Do not read
false as “walk-ins are welcome”. The field is declared optional so a future release can leave it unset
for a venue that has not said; today it is always set.
Restaurant seating and service. Set on restaurants.
object
Total seating capacity. Unset when the property has not recorded it.
The largest party that can be seated together. Unset when the property has not recorded it.
Whether breakfast is served. False also covers “never recorded”.
Whether lunch is served. False also covers “never recorded”.
Whether dinner is served. False also covers “never recorded”.
Whether brunch is served. False also covers “never recorded”.
OpenTravel CUI (Main Cuisine) codes. Look codes up at https://wink.travel/developers/taxonomy.
OpenTravel RES (Restaurant Category) codes.
Meeting room size and format. Set on meeting_rooms.
object
How many people the room holds. 0 means not recorded.
Floor area in square meters. 0 means not recorded.
Ceiling height in meters. 0 means not recorded.
Width in meters. 0 means not recorded.
Length in meters. 0 means not recorded.
Whether the room has an irregular shape. False also covers “never recorded”.
The kind of access to the room, e.g. private or public. Untranslated text as the property entered it.
The level of the facility the room is on, as the property entered it.
OpenTravel MRF (Meeting Room Format) code.
Whether the room is dedicated to meetings rather than shared with other uses. False also covers “never recorded”.
Attraction category. Set on attractions.
object
OpenTravel ACC (Attraction Category) code.
Place category. Set on places.
object
OpenTravel REF (Reference Point Category) code.
Activities. Present with CONTENT_SCOPE_ACTIVITY.
A non-room inventory item: restaurant, spa, meeting room, activity, attraction, place or add-on.
These share a shape deliberately. They differ in what they mean, not in what they carry, and one message
keeps the contract small and lets a client render any of them with the same code. Where a type needs
fields the others do not, those arrive as new field numbers on this message rather than a new message –
the facts only one type has sit in the venue_details oneof below, one message per type.
At most one of restaurant, meetingRoom, attraction, place is set (protobuf oneof venue_details).
object
Stable identifier for this item.
Item name in the requested language.
Localized descriptions, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Images and videos.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
Display order within its collection, ascending.
Whether the item is on the property’s premises.
Where the item is, when it differs from the property.
Bare latitude and longitude, not GeoJSON. Absent, not zeroed, when the item sits at the property –
see PartnerContentContractMeasurementTest for how that absence is verified rather than assumed.
object
Degrees east of the prime meridian, -180 to 180.
Degrees north of the equator, -90 to 90.
Postal address, when the item has its own.
object
Street line 1.
Street line 2, when the property supplies one.
State, province or region.
Postal or ZIP code.
City name.
ISO 3166-1 alpha-2 country code, e.g. “TH”.
Country name in the requested language.
The full address pre-formatted for display, newline-free.
The lifestyle this item suits, when tagged. Singular, not a list: the platform records exactly one per item.
OpenTravel RSI (Restaurant Service/Amenity) codes. Populated only for restaurants.
OpenTravel SPA (Spa Feature) codes. Populated only for spas.
OpenTravel MRC (Meeting Room Code) codes. Populated only for meeting_rooms.
OpenTravel REC (Recreation) codes. Populated only for activities.
OpenTravel PRX (Proximity) code, e.g. “1” = On premises, “3” = Nearby. Five values, so do NOT read
it as a boolean – on_premises above is the two-way answer if that is all you need.
OpenTravel AQC (Age Qualifying) code, e.g. “3” = Under 2, “8” = Child, “1” = Over 21. An age CATEGORY, not a numeric minimum age – parsing it as a number yields nonsense for most values.
OpenTravel SEC (Security Feature) codes.
OpenTravel PHY (Accessibility Feature) codes.
Opening time, local to the property, “HH:mm”. Empty when the venue records none (spas, activities and places often do not).
Closing time, local to the property, “HH:mm”. Empty when the venue records none.
The days the venue is open. Unset when the venue records none, and ALSO unset when the venue has no days selected: the platform stores “no days selected” to mean every day, so that case is published as “not stated” rather than as a message with every day false (which would read as “never open”). When set, at least one day is true.
object
Open on Monday.
Open on Tuesday.
Open on Wednesday.
Open on Thursday.
Open on Friday.
Open on Saturday.
Open on Sunday.
Whether guests must reserve in advance. The platform stores this as a plain yes/no with no “not stated”
state, so a venue that never answered arrives as false, exactly like one that answered no. Do not read
false as “walk-ins are welcome”. The field is declared optional so a future release can leave it unset
for a venue that has not said; today it is always set.
Restaurant seating and service. Set on restaurants.
object
Total seating capacity. Unset when the property has not recorded it.
The largest party that can be seated together. Unset when the property has not recorded it.
Whether breakfast is served. False also covers “never recorded”.
Whether lunch is served. False also covers “never recorded”.
Whether dinner is served. False also covers “never recorded”.
Whether brunch is served. False also covers “never recorded”.
OpenTravel CUI (Main Cuisine) codes. Look codes up at https://wink.travel/developers/taxonomy.
OpenTravel RES (Restaurant Category) codes.
Meeting room size and format. Set on meeting_rooms.
object
How many people the room holds. 0 means not recorded.
Floor area in square meters. 0 means not recorded.
Ceiling height in meters. 0 means not recorded.
Width in meters. 0 means not recorded.
Length in meters. 0 means not recorded.
Whether the room has an irregular shape. False also covers “never recorded”.
The kind of access to the room, e.g. private or public. Untranslated text as the property entered it.
The level of the facility the room is on, as the property entered it.
OpenTravel MRF (Meeting Room Format) code.
Whether the room is dedicated to meetings rather than shared with other uses. False also covers “never recorded”.
Attraction category. Set on attractions.
object
OpenTravel ACC (Attraction Category) code.
Place category. Set on places.
object
OpenTravel REF (Reference Point Category) code.
Attractions. Present with CONTENT_SCOPE_ATTRACTION.
A non-room inventory item: restaurant, spa, meeting room, activity, attraction, place or add-on.
These share a shape deliberately. They differ in what they mean, not in what they carry, and one message
keeps the contract small and lets a client render any of them with the same code. Where a type needs
fields the others do not, those arrive as new field numbers on this message rather than a new message –
the facts only one type has sit in the venue_details oneof below, one message per type.
At most one of restaurant, meetingRoom, attraction, place is set (protobuf oneof venue_details).
object
Stable identifier for this item.
Item name in the requested language.
Localized descriptions, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Images and videos.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
Display order within its collection, ascending.
Whether the item is on the property’s premises.
Where the item is, when it differs from the property.
Bare latitude and longitude, not GeoJSON. Absent, not zeroed, when the item sits at the property –
see PartnerContentContractMeasurementTest for how that absence is verified rather than assumed.
object
Degrees east of the prime meridian, -180 to 180.
Degrees north of the equator, -90 to 90.
Postal address, when the item has its own.
object
Street line 1.
Street line 2, when the property supplies one.
State, province or region.
Postal or ZIP code.
City name.
ISO 3166-1 alpha-2 country code, e.g. “TH”.
Country name in the requested language.
The full address pre-formatted for display, newline-free.
The lifestyle this item suits, when tagged. Singular, not a list: the platform records exactly one per item.
OpenTravel RSI (Restaurant Service/Amenity) codes. Populated only for restaurants.
OpenTravel SPA (Spa Feature) codes. Populated only for spas.
OpenTravel MRC (Meeting Room Code) codes. Populated only for meeting_rooms.
OpenTravel REC (Recreation) codes. Populated only for activities.
OpenTravel PRX (Proximity) code, e.g. “1” = On premises, “3” = Nearby. Five values, so do NOT read
it as a boolean – on_premises above is the two-way answer if that is all you need.
OpenTravel AQC (Age Qualifying) code, e.g. “3” = Under 2, “8” = Child, “1” = Over 21. An age CATEGORY, not a numeric minimum age – parsing it as a number yields nonsense for most values.
OpenTravel SEC (Security Feature) codes.
OpenTravel PHY (Accessibility Feature) codes.
Opening time, local to the property, “HH:mm”. Empty when the venue records none (spas, activities and places often do not).
Closing time, local to the property, “HH:mm”. Empty when the venue records none.
The days the venue is open. Unset when the venue records none, and ALSO unset when the venue has no days selected: the platform stores “no days selected” to mean every day, so that case is published as “not stated” rather than as a message with every day false (which would read as “never open”). When set, at least one day is true.
object
Open on Monday.
Open on Tuesday.
Open on Wednesday.
Open on Thursday.
Open on Friday.
Open on Saturday.
Open on Sunday.
Whether guests must reserve in advance. The platform stores this as a plain yes/no with no “not stated”
state, so a venue that never answered arrives as false, exactly like one that answered no. Do not read
false as “walk-ins are welcome”. The field is declared optional so a future release can leave it unset
for a venue that has not said; today it is always set.
Restaurant seating and service. Set on restaurants.
object
Total seating capacity. Unset when the property has not recorded it.
The largest party that can be seated together. Unset when the property has not recorded it.
Whether breakfast is served. False also covers “never recorded”.
Whether lunch is served. False also covers “never recorded”.
Whether dinner is served. False also covers “never recorded”.
Whether brunch is served. False also covers “never recorded”.
OpenTravel CUI (Main Cuisine) codes. Look codes up at https://wink.travel/developers/taxonomy.
OpenTravel RES (Restaurant Category) codes.
Meeting room size and format. Set on meeting_rooms.
object
How many people the room holds. 0 means not recorded.
Floor area in square meters. 0 means not recorded.
Ceiling height in meters. 0 means not recorded.
Width in meters. 0 means not recorded.
Length in meters. 0 means not recorded.
Whether the room has an irregular shape. False also covers “never recorded”.
The kind of access to the room, e.g. private or public. Untranslated text as the property entered it.
The level of the facility the room is on, as the property entered it.
OpenTravel MRF (Meeting Room Format) code.
Whether the room is dedicated to meetings rather than shared with other uses. False also covers “never recorded”.
Attraction category. Set on attractions.
object
OpenTravel ACC (Attraction Category) code.
Place category. Set on places.
object
OpenTravel REF (Reference Point Category) code.
Places of interest. Present with CONTENT_SCOPE_PLACE.
A non-room inventory item: restaurant, spa, meeting room, activity, attraction, place or add-on.
These share a shape deliberately. They differ in what they mean, not in what they carry, and one message
keeps the contract small and lets a client render any of them with the same code. Where a type needs
fields the others do not, those arrive as new field numbers on this message rather than a new message –
the facts only one type has sit in the venue_details oneof below, one message per type.
At most one of restaurant, meetingRoom, attraction, place is set (protobuf oneof venue_details).
object
Stable identifier for this item.
Item name in the requested language.
Localized descriptions, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Images and videos.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
Display order within its collection, ascending.
Whether the item is on the property’s premises.
Where the item is, when it differs from the property.
Bare latitude and longitude, not GeoJSON. Absent, not zeroed, when the item sits at the property –
see PartnerContentContractMeasurementTest for how that absence is verified rather than assumed.
object
Degrees east of the prime meridian, -180 to 180.
Degrees north of the equator, -90 to 90.
Postal address, when the item has its own.
object
Street line 1.
Street line 2, when the property supplies one.
State, province or region.
Postal or ZIP code.
City name.
ISO 3166-1 alpha-2 country code, e.g. “TH”.
Country name in the requested language.
The full address pre-formatted for display, newline-free.
The lifestyle this item suits, when tagged. Singular, not a list: the platform records exactly one per item.
OpenTravel RSI (Restaurant Service/Amenity) codes. Populated only for restaurants.
OpenTravel SPA (Spa Feature) codes. Populated only for spas.
OpenTravel MRC (Meeting Room Code) codes. Populated only for meeting_rooms.
OpenTravel REC (Recreation) codes. Populated only for activities.
OpenTravel PRX (Proximity) code, e.g. “1” = On premises, “3” = Nearby. Five values, so do NOT read
it as a boolean – on_premises above is the two-way answer if that is all you need.
OpenTravel AQC (Age Qualifying) code, e.g. “3” = Under 2, “8” = Child, “1” = Over 21. An age CATEGORY, not a numeric minimum age – parsing it as a number yields nonsense for most values.
OpenTravel SEC (Security Feature) codes.
OpenTravel PHY (Accessibility Feature) codes.
Opening time, local to the property, “HH:mm”. Empty when the venue records none (spas, activities and places often do not).
Closing time, local to the property, “HH:mm”. Empty when the venue records none.
The days the venue is open. Unset when the venue records none, and ALSO unset when the venue has no days selected: the platform stores “no days selected” to mean every day, so that case is published as “not stated” rather than as a message with every day false (which would read as “never open”). When set, at least one day is true.
object
Open on Monday.
Open on Tuesday.
Open on Wednesday.
Open on Thursday.
Open on Friday.
Open on Saturday.
Open on Sunday.
Whether guests must reserve in advance. The platform stores this as a plain yes/no with no “not stated”
state, so a venue that never answered arrives as false, exactly like one that answered no. Do not read
false as “walk-ins are welcome”. The field is declared optional so a future release can leave it unset
for a venue that has not said; today it is always set.
Restaurant seating and service. Set on restaurants.
object
Total seating capacity. Unset when the property has not recorded it.
The largest party that can be seated together. Unset when the property has not recorded it.
Whether breakfast is served. False also covers “never recorded”.
Whether lunch is served. False also covers “never recorded”.
Whether dinner is served. False also covers “never recorded”.
Whether brunch is served. False also covers “never recorded”.
OpenTravel CUI (Main Cuisine) codes. Look codes up at https://wink.travel/developers/taxonomy.
OpenTravel RES (Restaurant Category) codes.
Meeting room size and format. Set on meeting_rooms.
object
How many people the room holds. 0 means not recorded.
Floor area in square meters. 0 means not recorded.
Ceiling height in meters. 0 means not recorded.
Width in meters. 0 means not recorded.
Length in meters. 0 means not recorded.
Whether the room has an irregular shape. False also covers “never recorded”.
The kind of access to the room, e.g. private or public. Untranslated text as the property entered it.
The level of the facility the room is on, as the property entered it.
OpenTravel MRF (Meeting Room Format) code.
Whether the room is dedicated to meetings rather than shared with other uses. False also covers “never recorded”.
Attraction category. Set on attractions.
object
OpenTravel ACC (Attraction Category) code.
Place category. Set on places.
object
OpenTravel REF (Reference Point Category) code.
Cancellation policies referenced by RoomRate.cancellation_policy_id. Present with
CONTENT_SCOPE_CANCELLATION_POLICY.
A cancellation policy: the deadline, and what is charged on each side of it.
Join to a pricing result through RoomRate.cancellation_policy_id. The pricing surface already tells you
whether a rate is refundable and until when; this tells you the terms behind that answer.
A policy has no name and no descriptions — it is a set of rules, not prose, and the platform stores no
localized text for one. Render it from the fields below; policy_code is the short label to show when
you have room for two characters and not a sentence.
The charge fields are enum NAMES, not free text, and the set of names is stable. Treat an unrecognised value as “charge applies, terms unknown” rather than as an error: new members are added to these ladders over time and an unknown one must not break your rendering.
object
Stable policy identifier.
Whether the stay can be cancelled without charge before the deadline. The single field to branch on.
Two-character summary: “R” refundable, “NR” non-refundable.
Days before arrival by which a free cancellation must be made. Zero means the deadline falls ON the
arrival day — read advance_cancellation_free_of_charge for the hour, which is the only place that
distinction survives. Absent on a non-refundable policy, which has no free window to count down.
The free-cancellation window as the property set it, e.g. “SEVEN_DAYS_BEFORE_ARRIVAL” or
“UNTIL_EIGHTEEN_HUNDRED_HOURS_ON_DAY_OF_ARRIVAL”. The two day-of-arrival values both report
free_cancellation_days_before = 0 and differ only here.
What a refundable policy charges when the free window has closed, e.g. “FIFTY_PERCENT”.
What is charged when the guest does not arrive at all, e.g. “SAME_AS_CANCELLATION_FEE”.
What a non-refundable policy charges on cancellation, e.g. “SEVENTY_PERCENT”.
The point after which a non-refundable policy charges more, e.g. “SEVEN_DAYS_BEFORE_ARRIVAL”.
What a non-refundable policy charges once non_refundable_deadline has passed, e.g.
“ONE_HUNDRED_PERCENT”.
Perks referenced by RoomRate.perk_ids. Present with CONTENT_SCOPE_PERK.
A perk bundled with a rate.
Lives here rather than in partner_content.proto because Search returns a deduplicated dictionary of these
alongside its rates (PropertySearchResult.perks): inlining the perk on every rate would repeat a handful of
distinct perks across every rate of every room type of every property in a search result. Inventory does NOT
return the dictionary (PropertyInventory.perks is deprecated and empty); resolve its perk_ids through
Content.
descriptions carries the display name and body together — Description has both.
object
Stable perk identifier. Matches an entry in RoomRate.perk_ids.
Localized name and description, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Whether the perk is guaranteed rather than subject to availability.
Perk tier; higher is more valuable.
Display order, ascending.
Room types the property sells, ONCE each — not repeated per rate. Present when you request
CONTENT_SCOPE_ROOM_TYPE. RoomTypeOffers.room_type_id on the pricing surfaces points here.
A bookable room type. Returned once per property in PropertyContent.room_types, never inline on a
rate; RoomTypeOffers.room_type_id points here. Only room types reachable from a master rate you can
see are ever returned by a property-scoped call.
object
Stable room type identifier. Matches RoomPrice.room_type_id on the pricing endpoints, which you can
use to group several rates for the same room.
Room name in the requested language.
Localized descriptions, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Room images and videos.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
Display order within the property, ascending.
Total guests, adults plus children.
Minimum guests required.
Maximum adults.
Maximum children.
Rooms of this type at the property.
Floor area in square metres.
Whether the room is non-smoking.
OpenTravel SEG (Segment Category) code, e.g. “4” = Deluxe, “16” = Standard. Look codes up at https://wink.travel/developers/taxonomy.
OpenTravel RVT (Room View Type) code, e.g. “11” = Ocean view, “16” = Garden view.
OpenTravel RMA (Room Amenity) codes, e.g. “2” = Air conditioning, “7” = Balcony.
OpenTravel PHY (Accessibility Feature) codes, e.g. “110” = Roll-in shower available.
OpenTravel RLT (Room Location Type) code, e.g. “1” = Away from elevator, “8” = High floor.
OpenTravel GRI (Guest Room Info) code, e.g. “44” = Bungalow, “45” = Villa, “82” = Standard.
OpenTravel ARC (Architectural Style) code, e.g. “7” = Modern, “11” = Victorian.
The bed layouts this room can be booked in, each with a stable id.
Pass the id of the one the guest chose as BookingRoomRequest.bedroom_configuration_id. A room with
one layout still returns it; send the id anyway rather than relying on the default, which is
“whichever the property happens to list first”.
One bookable bed layout for a room type.
Suppliers routinely put an entire room description in name (“Suite - 1 Bedroom, 1 Double Bed,
Non-Smoking, Balcony…”), so render from bedrooms when you want to show what a guest actually gets.
Wink’s own booking confirmations stopped trusting name for exactly that reason.
object
Stable identifier for this layout. THIS is what BookingRoomRequest.bedroom_configuration_id wants.
The property’s own label for the layout, e.g. “Master Bedroom”. Untranslated, and frequently verbose.
The bedrooms in this layout, and the beds in each.
One bedroom within a layout.
object
Which bedroom this is within the layout.
The beds in this bedroom.
A quantity of one bed type.
object
OpenTravel BED (Bed Type) code, e.g. “3” = King, “5” = Queen, “8” = Twin. Look codes up at https://wink.travel/developers/taxonomy.
How many beds of this type, at least one.
Number of bathrooms. A room that does not say defaults to 1.
OpenTravel SEC (Security Feature) codes. Codes, not display names, like
ota_phy_accessibility_features; look them up at https://wink.travel/developers/taxonomy.
Number of living rooms. A room that does not say defaults to 1.
Rollaway beds the room accepts, 0 when none.
Cribs the room accepts, 0 when none.
Adults the room’s price already covers, before any extra-adult charge.
Children the room’s price already covers, before any extra-child charge.
Floor the room is on, as the property states it. Empty when not stated.
Gender assignment, for gender-segregated rooms such as hostel dorms.
Whether the room is shared with other guests, as in a dorm bed.
Rate plans, ONCE each — not repeated per rate. Present when you request CONTENT_SCOPE_RATE_PLAN.
RoomRate.rate_plan_id on the pricing surfaces points here.
A rate plan and what it includes. Returned once per property in PropertyContent.rate_plans, never
inline on a rate; RoomRate.rate_plan_id points here. Only rate plans reachable from a master rate you
can see are ever returned by a property-scoped call.
A rate plan has no localized descriptions — name is a single untranslated label the property chose,
and language_code on your request does not affect it. What a rate plan actually carries is what it
INCLUDES, which is the meal booleans below.
object
Stable rate plan identifier. Matches RoomRate.rate_plan_id on the pricing endpoints.
Rate plan name as the property wrote it, e.g. “Best Available Rate”. Untranslated.
Whether the rate must be paid in full at booking rather than at the property.
Breakfast is included in the rate.
Brunch is included in the rate.
Lunch is included in the rate.
Dinner is included in the rate.
Everything is included except alcohol.
Everything is included, alcohol as well.
The cancellation policy governing this rate plan, when it sets one. Join to
PropertyContent.cancellation_policies or fetch it with GetCancellationPolicy.
Awards, certifications and third-party ratings the property holds. Present with
CONTENT_SCOPE_RECOGNITION; empty when the property holds none, so check included_scopes to tell that
from “not requested”. These are the property’s own recognitions, not guest reviews — those are
ListReviews. Only recognitions the provider has authorised the property to publish are returned.
One award, certification or third-party rating a property holds.
object
Stable identifier of this recognition on the property.
What kind of recognition this is, as the platform names it (for example AWARD). Treat an unrecognized
value as “some category this client does not know about yet” rather than an error.
The recognition’s type within its category (for example STAR_RATING). Same open-set rule as category.
Who granted it, for example Michelin.
The rating received, on the provider’s scale; read it together with max_rating and rating_symbol.
The top of the provider’s scale. Unset when the provider’s scale is not known.
When it was received, ISO-8601 “YYYY-MM-DD”. Empty when unknown.
True when the provider has given the property official permission to use the rating in publications and marketing. Always true here: a recognition without that permission is not returned.
The symbol the rating is expressed in, for example * or STAR. Empty when none.
Aggregate Green Index (sustainability) scores. Present with CONTENT_SCOPE_GREEN_INDEX, and unset when the
property has not answered the index even if you asked: aggregate_greendex_rating in details is just
the single overall number.
object
The property these scores belong to.
The highest possible score across all questions.
The score earned across all answered questions.
total_score over high_score, between 0 and 1.
The same three figures for each question category.
One Green Index question category’s share of the score.
object
The category, for example ENERGY or WATER. Open set: treat an unrecognized value as a category this
client does not know about yet.
The highest possible score in this category.
The score earned in this category.
total_score over high_score, between 0 and 1.
The property’s add-ons as STATIC content: what you need to render an add-on card, never its price. Present
with CONTENT_SCOPE_ADD_ON; empty when the property has none you can sell, so check included_scopes to tell
that from “not requested”.
JOIN: AncillaryOffer.add_on_id on the priced offers, and every id in RoomRate.add_on_ids, equal
AddOnContent.id here. Unpublished and switched-off add-ons, and add-ons under a venue that is switched
off, are not returned here and carry no priced offer either, so every priced add-on resolves.
This is the property’s own description of what it sells, like restaurants: it is not filtered by your
sales channel, so a returned add-on is not necessarily one your channel can sell. Whether it is comes
from the priced offers, which only carry add-ons you can.
14 held add_ons as a repeated InventoryItemContent before it was removed without being reserved, and a
reintroduced field must not reuse a retired number, so this one is 23.
One add-on’s static content: enough to render an add-on card, and nothing priced.
The priced half is AncillaryOffer on the Inventory surfaces, which names this add-on by add_on_id. Prices
are deliberately not here: they depend on the stay and on your channel, and content is the part that does
not.
object
Stable identifier. Equals AncillaryOffer.add_on_id and each entry of RoomRate.add_on_ids.
The add-on’s name, as the property wrote it. Untranslated; the localized text is in descriptions.
Localized name and description, in English plus your requested language.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
Images and videos.
One published image or video.
Key anything you cache on entity_id, the asset’s Cloudinary public id. It is stable for the life of the
asset; URLs are not — they carry transformation and delivery parameters that change without notice.
object
The asset’s Cloudinary public id: the stable identity of this image or video, and the key to use for
your own cache. It can be used to build delivery URLs yourself, e.g.
https://res.cloudinary.com/<cloud>/image/upload/<transformations>/<entity_id>; prefer the ready-made
urls where they are present, since URLs can change.
MEDIA_TYPE_IMAGE or MEDIA_TYPE_VIDEO.
Where the asset came from, e.g. the property’s own upload or a syndicated source.
Display order within its gallery, ascending.
Camera angle or shot description, when the property supplied one.
Intrinsic width in pixels.
Intrinsic height in pixels.
Localized captions.
A short piece of localized text.
The API returns descriptions already filtered to the language on your request, so you will normally see
exactly one entry per collection. language_code is still present so you can tell which language you got when
the requested one was unavailable and the property’s default was substituted.
object
Short label for this description.
The description body.
ISO 639-1 language code of name and description.
The lifestyle this asset is meant to illustrate, when tagged.
Ready-to-use delivery URLs, one per variant. Which variants are populated depends on whether the asset is an image, a Cloudinary video or an externally-hosted one — see MediaUrlSet.
object
MULTIMEDIA_KIND_IMAGE only: unscaled, best-quality delivery URL.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: large variant, max width 1920px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE only: medium variant, max width 1024px.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_IMAGE or MULTIMEDIA_KIND_VIDEO (Cloudinary): thumbnail variant, max width 320px. For video
this is a still frame extracted from the video, so its format is an image type and follows
image_format, not video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: streaming delivery URL, unscaled. Delivered as video_format,
which defaults to video/mp4.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: preview variant, max width 1280px. Delivered as video_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (Cloudinary) only: poster frame at medium width. A still EXTRACTED from the video,
so like thumbnail it is an image and follows image_format.
object
Ready-to-use delivery URL for this variant.
Maximum pixel width this variant is scaled to. Unset for variants with no resize (image “original”, video “stream”) — explicit presence so “not resized” is distinguishable from a literal 0px width.
The IANA media type this URL returns: one of image/jpeg, image/png, image/webp, image/* or video/mp4, video/webm. Feed it straight to a Content-Type header or use it to pick a decoder.
This ECHOES what was served, so it reflects the image_format and video_format you sent on the
request. Send neither and images are image/jpeg and video is video/mp4.
image/* is the one value that is not a concrete type: it means the CDN negotiates per client from the Accept header, so the same URL returns WebP, AVIF or JPEG to different callers. It is only ever returned if you asked for it. Everything else is deterministic — the same URL returns the same bytes to every client, which is what makes it safe to cache and re-serve.
MULTIMEDIA_KIND_VIDEO (YouTube) only: pass-through to the YouTube watch URL. Wink generates no variants for externally-hosted media, so no format applies and every MediaUrlVariant field above is unset.
OpenTravel PIC (Picture Category) code, e.g. “2” = Lobby view, “6” = Guest room. What the asset depicts,
which is what you want when laying out a gallery rather than dumping it in sort order. Empty when
the property never categorised the asset. Look codes up at https://wink.travel/developers/taxonomy.
What the add-on is attached to: ADD_ON for a property-level add-on, otherwise the kind of item it belongs
under (RESTAURANT, SPA, MEETING_ROOM, ACTIVITY, ATTRACTION, PLACE, GUEST_ROOM). Open set:
treat an unrecognized value as a kind this client does not know about yet.
Display order among the property’s add-ons, ascending.
True when the property requires this add-on wherever it applies. See AncillaryOffer.mandatory for what
that means when booking.
Date periods the add-on is restricted to. EMPTY MEANS NO DATE-RANGE RESTRICTION. Other availability rules (days of week, opening hours, time slots) are not published here; the priced offers are what is bookable.
A period an add-on is available in.
object
First date of the period, ISO-8601 (YYYY-MM-DD).
Last date of the period, ISO-8601 (YYYY-MM-DD).
Room types the add-on is restricted to, as RoomTypeOffers.room_type_id. EMPTY MEANS EVERY ROOM TYPE.
Rate plans the add-on is restricted to, as RoomRate.rate_plan_id. EMPTY MEANS EVERY RATE PLAN.
How many of each ancillary entity this property has. ALWAYS present, whatever you included, and the
reason the default response is useful on its own: it tells you which scopes are worth requesting for
this property before paying for the round trip. A zero means the property has none, which is
information — an empty restaurants list would not distinguish that from “you did not ask”.
object
Restaurants on and off the premises.
Spas.
Meeting and event rooms.
Activities.
Attractions.
Places of interest.
Purchasable add-ons.
Opaque token identifying THIS response for THIS property. Store it and send it back in
known_versions to skip re-fetching content that has not changed. Present on CONTENT_STATUS_OK and
CONTENT_STATUS_NOT_MODIFIED.
Derived from the same hash as content_version, so it covers the request as well as the property: your
sales channel, language_code, include, max_media_per_entity and media formats all shape the content
it is a hash of. Two callers holding the same property will hold different tokens if they asked
different questions.
Treat it as bytes. It is not a timestamp, not a hash you should reproduce, and its format may change without notice — a token we no longer recognise simply yields a full response, never an error.
Example
{ "property": { "status": "CONTENT_STATUS_UNSPECIFIED", "includedScopes": [ "CONTENT_SCOPE_UNSPECIFIED" ], "property": { "images": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "videos": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ] }, "details": { "lifestyleTypes": [ "LIFESTYLE_TYPE_UNSPECIFIED" ] }, "restaurants": [ { "multimedias": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "spas": [ { "multimedias": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "meetingRooms": [ { "multimedias": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "activities": [ { "multimedias": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "attractions": [ { "multimedias": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "places": [ { "multimedias": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "roomTypes": [ { "multimedias": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ], "bedConfigurations": [ { "bedrooms": [ { "type": "BEDROOM_TYPE_UNSPECIFIED" } ] } ], "roomGender": "ROOM_GENDER_UNSPECIFIED" } ], "addOns": [ { "multimedias": [ { "kind": "MULTIMEDIA_KIND_UNSPECIFIED", "lifestyleType": "LIFESTYLE_TYPE_UNSPECIFIED" } ] } ] }}