GetProperties
const url = 'https://example.com/wink.partner.v1.Content/GetProperties';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"propertyIds":["example"],"languageCode":"example","include":["CONTENT_SCOPE_UNSPECIFIED"],"maxMediaPerEntity":1,"knownVersions":{"additionalProperty":"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/GetProperties \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "propertyIds": [ "example" ], "languageCode": "example", "include": [ "CONTENT_SCOPE_UNSPECIFIED" ], "maxMediaPerEntity": 1, "knownVersions": { "additionalProperty": "example" }, "imageFormat": "example", "videoFormat": "example" }'Get static content for one or more properties
Pass up to 50 property identifiers. Every property we hold comes back with a status of
CONTENT_STATUS_OK, and unknown identifiers come back CONTENT_STATUS_NOT_FOUND — the call itself
succeeds, so a single bad identifier cannot fail the batch. A property you already hold an unchanged
copy of comes back CONTENT_STATUS_NOT_MODIFIED when you pass its token in known_versions.
Content is not restricted by your sales channel; the BOOKABLE collections are. See ContentStatus.
Billing is one unit per CALL, not per property, whatever you included. Fifty properties in one call cost what one does, so batch.
Returns INVALID_ARGUMENT when property_ids is empty, exceeds 50, or repeats an identifier, and when
known_versions holds more than 50 entries.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Request for GetProperties.
object
Properties to fetch, 1 to 50. Identifiers come 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 — you are expected to cache the full bundle. Set this when you want a lighter response for a preview surface.
Content you already hold: property identifier to the cache_token that property’s last response carried.
A property whose token still matches comes back CONTENT_STATUS_NOT_MODIFIED carrying its
content_version and cache_token and nothing else — keep serving what you cached. Anything that has
changed, and anything you did not list here, comes back in full as usual. Omit the field entirely and
every property is returned in full, which is the default.
Send back the cache_token, NOT the content_version. The token is opaque: do not parse it, do not
build one, and do not assume anything about its length or alphabet. It covers the property’s version AND
the shape of the request that produced it — your sales channel, language_code, include,
max_media_per_entity, image_format and video_format — which is precisely what makes it safe to
change a request. Ask for a scope you did not have last time, or a different media format, and the token
stops matching, so you get the full response rather than a NOT_MODIFIED that would have left you
permanently missing the thing you just asked for.
BILLING DOES NOT CHANGE. You are charged one unit per call whatever comes back, so this saves response size and processing on both ends, not money. Batching is what lowers a bill.
Entries for properties absent from property_ids are ignored, so you may keep one map and reuse it
across batches. At most 50 entries, the same bound as property_ids.
object
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 GetProperties.
object
One entry per requested property, in the order requested.
Everything requested about one property.
Populated fields depend on the include scopes you asked for. A scope you did not request is absent, not
empty — proto3 cannot distinguish “no restaurants” from “restaurants not requested” on a repeated field,
so check included_scopes rather than inferring from an empty list.
object
The property this entry describes.
Whether content was returned, and if not, why.
Version covering ALL static content for this property. The SAME value the pricing endpoints return on a
search result as last_update. Store it with your cached copy; re-fetch when a search shows a different
one. Present on CONTENT_STATUS_OK and CONTENT_STATUS_NOT_MODIFIED.
This is about the PROPERTY, so it is comparable across surfaces — but for that same reason it says
nothing about your channel, language or include set. 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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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 and contacts. 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.
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.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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.
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.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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.
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.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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.
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.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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.
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.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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.
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.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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.
Purchasable add-ons. Present with CONTENT_SCOPE_ADD_ON.
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.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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.
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 the PRICING surfaces return a deduplicated
dictionary of these alongside their rates: RoomRate.perk_ids would otherwise be unresolvable without a
second call, and 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.
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 media_id. It is stable for the life of the asset; URLs are not — they
carry transformation and delivery parameters that change without notice.
object
Stable identifier for this asset. Use this as your cache key.
Identifier of the inventory item this asset belongs to (the property, a guest room, and so on).
Named entity_id rather than identifier to match the *_id convention the rest of this surface
uses, and because “identifier” said nothing about WHOSE identifier it is.
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.
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.
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.
Unlike content_version, this covers the request as well as the property: your sales channel,
language_code, include and max_media_per_entity all feed it. Two callers holding the same property
at the same version will hold different tokens if they asked different questions, which is why the token
is per-response and the version is per-property.
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
{ "properties": [ { "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" } ], "addOns": [ { "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" } ] } ] } ] } ]}