Skip to content

Patch multimedia and theme

PATCH
/api/managing-entity/{managingEntityIdentifier}/studio/transactional-url/{transactionalUrlIdentifier}/multimedia-theme
curl --request PATCH \
--url https://api.wink.travel/api/managing-entity/d2c8f3a9-4b1e-4c7a-9d3f-5b8a2e6c1d04/studio/transactional-url/7c9a2e5f-3d8b-4a1c-b6e2-8f0d1c4a9b3e/multimedia-theme \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Wink-Version: 2.0' \
--data '{ "multimedias": [ { "angle": null, "attribution": [], "category": "2", "descriptions": [ { "description": "Elegant lobby of The Siam Residences", "language": "en", "title": "Lobby Entrance" } ], "height": 1600, "identifier": "the-siam-residences/lobby-entrance", "isLandscape": true, "lifestyleType": null, "multimediaIdentifier": "3c6b1a5d-8e2f-4a0b-9c7d-6e4f0a8b2c51", "published": true, "sort": 10, "source": "CLOUDINARY", "type": "IMAGE", "width": 2560 } ] }'

Replaces only the selected images and the theme (null theme means no theme). Send the link’s current version as If-Match for optimistic concurrency (a stale version is rejected with 409). Requires MARKETING:WRITE.

managingEntityIdentifier
required
string

Managing entity identifier (the owner of the transactional URL)

Example

d2c8f3a9-4b1e-4c7a-9d3f-5b8a2e6c1d04
transactionalUrlIdentifier
required
string

Transactional URL identifier to update

Example

7c9a2e5f-3d8b-4a1c-b6e2-8f0d1c4a9b3e
If-Match
string

The link’s last-seen version, for optimistic concurrency. Optional; a stale value is rejected with 409. Accepts a bare version (3), a quoted entity-tag (“3”), W/“3”, or *.

Wink-Version
string
default: 2.0.0
Allowed values: 2.0

Multimedia and theme section

Media typeapplication/json

Request payload for updating the multimedia and theme of a transactional URL.

object
multimedias
Array<object>

Hero images to display on the transactional URL card

object
angle

Media angle

string

Example

-90
attribution

Whether image has attribution properties

Array<object>
object
name
required

Name of contributor

string
>= 1 characters

Example

Samuel Adams
url

URL to contributor

string format: uri

Example

https://maps.google.com/maps/contrib/111628493169070103594

Example

{
"name": "Samuel Adams",
"url": "https://maps.google.com/maps/contrib/111628493169070103594"
}
category

Supported OTA specification PIC code. See OTA geoname data

string

Example

1
descriptions

Localized media captions to give user some context about where this media was taken.

Array<object>

Foundation class for storing multi-language content (names and descriptions) with content change detection throughout the Wink Platform.

object
creator

Whether it was user or system generated.

string
default: USER
Allowed values: SYSTEM USER

Example

SYSTEM
description
required

Longer text description

string
>= 1 characters <= 2147483647 characters

Example

This is a longer description in the specified language.
hashMismatch
boolean
language
required

Indicate which language this description is written in.

string
default: en >= 2 characters <= 2 characters /^[a-z]{2}(-[A-Z]{2})?$/

Example

en
md5ContentHash

The md5 hash of the name, description and language.

string

Example

d41d8cd98f00b204e9800998ecf8427e
name
required

Use as title or short text description

string

Example

An example title

Example

{
"creator": "USER",
"description": "Spacious suite with floor-to-ceiling windows overlooking the Chao Phraya River, featuring a king-size bed, private balcony, and marble bathroom.",
"language": "en",
"md5ContentHash": "a3f1c8e2d74b60912a5c3e9b1d7f4e82",
"name": "Deluxe River View Suite"
}
height
required

Media height in pixels.

integer format: int32
>= 1

Example

1600
identifier
required

Use this identifier to communicate with Cloudinary.

string
>= 1 characters

Example

cloudinary-image-1
isLandscape

True if media width is greater or equal to height

boolean

Example

true
lifestyleType

Associate this media with a specific lifestyle type. A user searching and filtering inventory based on lifestyles can be shown relevant media first.

string
Allowed values: LIFESTYLE_HEALTH_FITNESS LIFESTYLE_RELAX LIFESTYLE_ADULT_ONLY LIFESTYLE_ADVENTURE LIFESTYLE_BUSINESS LIFESTYLE_LGBT LIFESTYLE_SINGLE_PARENT LIFESTYLE_SOLO_FEMALE LIFESTYLE_BEAUTY LIFESTYLE_FOODIE LIFESTYLE_FAMILY LIFESTYLE_ROMANCE LIFESTYLE_COUPLE LIFESTYLE_SOLO LIFESTYLE_BACKPACKER LIFESTYLE_SHOPPING LIFESTYLE_SPORTS LIFESTYLE_MOUNTAIN LIFESTYLE_BEACH LIFESTYLE_CITY LIFESTYLE_COUNTRY LIFESTYLE_CULTURE LIFESTYLE_ECO

Example

LIFESTYLE_HEALTH_FITNESS
multimediaIdentifier
required

Document identifier

string format: uuid
>= 1 characters

Example

3c6b1a5d-8e2f-4a0b-9c7d-6e4f0a8b2c51
published

Instead of deleting the media, choose to un-publish it instead for later re-use. Could be you keep seasonal images of the property.

boolean

Example

true
sort
required

Sort allows you to control how you want to sort this record in a list of media records.

integer format: int32
default: 999

Example

10
source
required

Currently ONLY using Cloudinary to store all image / video assets.

string
default: CLOUDINARY
Allowed values: YOUTUBE CLOUDINARY

Example

CLOUDINARY
type
required

Whether Cloudinary media is a VIDEO or IMAGE.

string
Allowed values: IMAGE VIDEO AUDIO RAW

Example

IMAGE
width
required

Media width in pixels.

integer format: int32
>= 1

Example

2560

Example

{
"angle": null,
"attribution": [],
"category": "2",
"descriptions": [
{
"description": "Elegant lobby of The Siam Residences",
"language": "en",
"title": "Lobby Entrance"
}
],
"height": 1600,
"identifier": "the-siam-residences/lobby-entrance",
"isLandscape": true,
"lifestyleType": null,
"multimediaIdentifier": "3c6b1a5d-8e2f-4a0b-9c7d-6e4f0a8b2c51",
"published": true,
"sort": 10,
"source": "CLOUDINARY",
"type": "IMAGE",
"width": 2560
}
theme

Visual theme controlling the appearance of the transactional URL’s banner; null for no theme

string
Allowed values: THEME_1

Example

{
"multimedias": [
{
"angle": null,
"attribution": [],
"category": "2",
"descriptions": [
{
"description": "Elegant lobby of The Siam Residences",
"language": "en",
"title": "Lobby Entrance"
}
],
"height": 1600,
"identifier": "the-siam-residences/lobby-entrance",
"isLandscape": true,
"lifestyleType": null,
"multimediaIdentifier": "3c6b1a5d-8e2f-4a0b-9c7d-6e4f0a8b2c51",
"published": true,
"sort": 10,
"source": "CLOUDINARY",
"type": "IMAGE",
"width": 2560
}
]
}

Updated transactional URL

Media typeapplication/json

A transactional URL: a hotel link an affiliate shares or embeds as a card

object
animate

When true, renders selected images as an animated GIF (requires at least 2 images)

boolean
animateDelay

Animation frame delay in milliseconds (-1 = no animation)

integer format: int32
default: -1
createdDate

Datetime this record was first created

string | null format: date-time
customizationIdentifier
required

Customization configuration identifier (controls the visual theme and styling)

string format: uuid
>= 1 characters
defaultRatePlanIdentifier

Rate plan this link focuses on; requires defaultRoomTypeIdentifier

string | null format: uuid
defaultRoomTypeIdentifier

Room type this link focuses on; null for a hotel-level link

string | null format: uuid
descriptions
required
Array<object>
>= 1 items <= 2147483647 items

Localized link title and description (one entry per language/locale)

object
creator

Whether it was user or system generated.

string
default: USER
Allowed values: SYSTEM USER
description
required

Longer text description

string
>= 1 characters <= 2147483647 characters
hashMismatch
boolean
language
required

Indicate which language this description is written in.

string
default: en >= 2 characters <= 2 characters /^[a-z]{2}(-[A-Z]{2})?$/
md5ContentHash

The md5 hash of the name, description and language.

string
name
required

Use as title or short text description

string
facebookAppId

Facebook App ID for OpenGraph metadata when the link is shared

string
id

Unique identifier for this record.

string format: uuid
keywords
Array<string>
lastUpdate

Datetime this record was last updated

string | null format: date-time
multimedias
Array<object>

Hero images to display on the transactional URL card

object
angle

Media angle

string
attribution

Whether image has attribution properties

Array<object>
object
name
required

Name of contributor

string
>= 1 characters
url

URL to contributor

string format: uri
category

Supported OTA specification PIC code. See OTA geoname data

string
descriptions

Localized media captions to give user some context about where this media was taken.

Array<object>

Foundation class for storing multi-language content (names and descriptions) with content change detection throughout the Wink Platform.

object
creator

Whether it was user or system generated.

string
default: USER
Allowed values: SYSTEM USER
description
required

Longer text description

string
>= 1 characters <= 2147483647 characters
hashMismatch
boolean
language
required

Indicate which language this description is written in.

string
default: en >= 2 characters <= 2 characters /^[a-z]{2}(-[A-Z]{2})?$/
md5ContentHash

The md5 hash of the name, description and language.

string
name
required

Use as title or short text description

string
height
required

Media height in pixels.

integer format: int32
>= 1
identifier
required

Use this identifier to communicate with Cloudinary.

string
>= 1 characters
isLandscape

True if media width is greater or equal to height

boolean
lifestyleType

Associate this media with a specific lifestyle type. A user searching and filtering inventory based on lifestyles can be shown relevant media first.

string
Allowed values: LIFESTYLE_HEALTH_FITNESS LIFESTYLE_RELAX LIFESTYLE_ADULT_ONLY LIFESTYLE_ADVENTURE LIFESTYLE_BUSINESS LIFESTYLE_LGBT LIFESTYLE_SINGLE_PARENT LIFESTYLE_SOLO_FEMALE LIFESTYLE_BEAUTY LIFESTYLE_FOODIE LIFESTYLE_FAMILY LIFESTYLE_ROMANCE LIFESTYLE_COUPLE LIFESTYLE_SOLO LIFESTYLE_BACKPACKER LIFESTYLE_SHOPPING LIFESTYLE_SPORTS LIFESTYLE_MOUNTAIN LIFESTYLE_BEACH LIFESTYLE_CITY LIFESTYLE_COUNTRY LIFESTYLE_CULTURE LIFESTYLE_ECO
multimediaIdentifier
required

Document identifier

string format: uuid
>= 1 characters
published

Instead of deleting the media, choose to un-publish it instead for later re-use. Could be you keep seasonal images of the property.

boolean
sort
required

Sort allows you to control how you want to sort this record in a list of media records.

integer format: int32
default: 999
source
required

Currently ONLY using Cloudinary to store all image / video assets.

string
default: CLOUDINARY
Allowed values: YOUTUBE CLOUDINARY
type
required

Whether Cloudinary media is a VIDEO or IMAGE.

string
Allowed values: IMAGE VIDEO AUDIO RAW
width
required

Media width in pixels.

integer format: int32
>= 1
name
required

Display name for this transactional URL (internal reference, not shown to end users)

string
>= 1 characters
ownerIdentifier
required

Managing entity (owner) of this transactional URL

string format: uuid
>= 1 characters
source
required

How this link was created. MANAGED_SOCIAL links are generated for social posts and cannot be removed

string | null
default: USER
Allowed values: USER MANAGED_SOCIAL
status
required

Current status of this transactional URL (ACTIVE, INACTIVE or REMOVED)

string
Allowed values: ACTIVE INACTIVE REMOVED
supplierIdentifier
required

Property or supplier identifier (the entity whose inventory is promoted)

string format: uuid
>= 1 characters
theme

Visual theme controlling the appearance of the transactional URL’s banner

string
Allowed values: THEME_1
twitterAccount

Twitter account handle for OpenGraph metadata when the link is shared

string
uniqueId
required

Unique identifier that generates the transactional URL slug (e.g., share.wink.travel/HBDG87f2)

string
>= 1 characters
userIdentifier

User (account) identifier; absent for links migrated from the retired sellable item entity, which has no creator user

string format: uuid
version

Optimistic-locking version. Echo this value back as an If-Match request header on a conditional update; the server responds 409 if the record changed in the meantime. Null when this projection has no backing versioned document, in which case no conditional update is possible.

integer | null format: int64

Example

{
"animate": false,
"animateDelay": 500,
"createdDate": "2026-01-14T09:30:00",
"customizationIdentifier": "8f2d4a9c-1e7b-4f3d-a5c8-9d1b6e2c0a47",
"defaultRatePlanIdentifier": "9a3c6e1d-2b8f-4d7a-b5e0-4c1f8a2d6e93",
"defaultRoomTypeIdentifier": "5b7e2c1a-9d4f-4e8b-a3c6-1f0d2e9b8a74",
"descriptions": [
{
"creator": "USER",
"description": "Spacious suite with floor-to-ceiling windows overlooking the Chao Phraya River, featuring a king-size bed, private balcony, and marble bathroom.",
"language": "en",
"md5ContentHash": "a3f1c8e2d74b60912a5c3e9b1d7f4e82",
"name": "Deluxe River View Suite"
}
],
"facebookAppId": "198273987219",
"id": "b7e4c1a2-3f5d-4e8a-9c21-6f0b5d8e3a47",
"keywords": [
"luxury"
],
"lastUpdate": "2026-02-03T16:45:12",
"multimedias": [
{
"angle": null,
"attribution": [],
"category": "2",
"descriptions": [
{
"description": "Elegant lobby of The Siam Residences",
"language": "en",
"title": "Lobby Entrance"
}
],
"height": 1600,
"identifier": "the-siam-residences/lobby-entrance",
"isLandscape": true,
"lifestyleType": null,
"multimediaIdentifier": "3c6b1a5d-8e2f-4a0b-9c7d-6e4f0a8b2c51",
"published": true,
"sort": 10,
"source": "CLOUDINARY",
"type": "IMAGE",
"width": 2560
}
],
"name": "The Siam Residences, Bangkok",
"ownerIdentifier": "d2c8f3a9-4b1e-4c7a-9d3f-5b8a2e6c1d04",
"source": "USER",
"supplierIdentifier": "7c9a2e5f-3d8b-4a1c-b6e2-8f0d1c4a9b3e",
"twitterAccount": "@thesiamresidences",
"uniqueId": "HBDG87f2",
"userIdentifier": "4a1d7c2e-5f9b-4e3a-b8c1-6d2f8a0e3c5b",
"version": 3
}

Bad Request — missing or invalid request parameter or body

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Unauthorized — authentication is required or the session has expired

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Forbidden — authenticated but lacking the required permission or scope

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Not Found — the requested resource does not exist

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Method Not Allowed — the HTTP verb is not supported on this endpoint

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Conflict — the resource was modified by someone else since you read it; re-read it and retry with the new version

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Unsupported Media Type — use application/json

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Internal Server Error — an unexpected failure occurred on the server

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}

Service Unavailable — a downstream dependency is unreachable

Media typeapplication/problem+json
object
detail
string
instance
string format: uri
properties
object
key
additional properties
status
integer format: int32
title
string
type
string format: uri

Example generated

{
"detail": "example",
"instance": "https://example.com",
"properties": {
"additionalProperty": "example"
},
"status": 1,
"title": "example",
"type": "https://example.com"
}