Create
const url = 'https://api.wink.travel/api/managing-entity/d5b8a3c2-9e6f-4a1b-8d34-7c2e1f0a5b69/customization';const options = { method: 'POST', headers: { 'Wink-Version': '2.0', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: 'null'};
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://api.wink.travel/api/managing-entity/d5b8a3c2-9e6f-4a1b-8d34-7c2e1f0a5b69/customization \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Wink-Version: 2.0' \ --data nullPersists a new customization template for the managing entity and returns the created record.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”The managing entity for which to create a customization
Example
d5b8a3c2-9e6f-4a1b-8d34-7c2e1f0a5b69Header Parameters
Section titled “Header Parameters ”Request Body required
Section titled “Request Body required ”Customization template definition including look-and-feel settings, third-party integration keys and booking engine configuration options
Request payload for creating or updating a booking engine customization configuration
object
Engine configuration name
Example
Luxury Travel PortalWhether to append text to the existing booking customization page title.
Example
Hotels with BenefitsIf you want to track analytics with Google Analytics and GTM for your self-hosted booking customization, you need to import our GTM profile into your GTM container and link it with your Google Analytics account. More about that here
Example
G-ABCDEF1234If you want to track analytics and you have a GTM Container ID, enter it here.
Example
GTM-XXXXXIf you want your users to see Google Maps in your hosted booking customization, go to Google Maps and create an API key for your site.
Example
AIzaSyC5H2f7Vf6-6b2dZWfZf6-6b2dZWfZf6-6Control which currency your users see prices in initially.
Example
THBControl which language your users see text in initially.
Example
enControl which lifestyle contextx your users see initially.
Example
LIFESTYLE_HEALTH_FITNESSCustomize booking confirmation emails by adding a custom logo to your configuration.
Multimedia that contains less information than Multimedia object
object
Document identifier
Example
3c6b1a5d-8e2f-4a0b-9c7d-6e4f0a8b2c51Use this identifier to communicate with Cloudinary.
Example
cloudinary-image-1Whether Cloudinary media is a VIDEO or IMAGE.
Example
IMAGECurrently ONLY using Cloudinary to store all image / video assets.
Example
CLOUDINARYSort allows you to control how you want to sort this record in a list of media records.
Example
10Media angle
Example
-90Media width in pixels.
Example
2560Media height in pixels.
Example
1600Instead of deleting the media, choose to un-publish it instead for later re-use. Could be you keep seasonal images of the property.
Example
trueLocalized media captions to give user some context about where this media was taken.
Foundation class for storing multi-language content (names and descriptions) with content change detection throughout the Wink Platform.
object
Use as title or short text description
Example
An example titleLonger text description
Example
This is a longer description in the specified language.Indicate which language this description is written in.
Example
enWhether it was user or system generated.
Example
SYSTEMThe md5 hash of the name, description and language.
Example
d41d8cd98f00b204e9800998ecf8427eExample
{ "name": "Deluxe River View Suite", "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", "creator": "USER", "md5ContentHash": "a3f1c8e2d74b60912a5c3e9b1d7f4e82"}Associate this media with a specific lifestyle type. A user searching and filtering inventory based on lifestyles can be shown relevant media first.
Example
LIFESTYLE_HEALTH_FITNESSWhether image has attribution properties
object
URL to contributor
Example
https://maps.google.com/maps/contrib/111628493169070103594Name of contributor
Example
Samuel AdamsExample
{ "url": "https://maps.google.com/maps/contrib/111628493169070103594", "name": "Samuel Adams"}True if media width is greater or equal to height
Example
trueExample
{ "multimediaIdentifier": "3c6b1a5d-8e2f-4a0b-9c7d-6e4f0a8b2c51", "identifier": "the-siam-residences/lobby-entrance", "type": "IMAGE", "source": "CLOUDINARY", "sort": 10, "angle": null, "width": 2560, "height": 1600, "published": true, "category": "2", "descriptions": [ { "title": "Lobby Entrance", "description": "Elegant lobby of The Siam Residences", "language": "en" } ], "lifestyleType": null, "attribution": [], "isLandscape": true}If you are self-hosting our booking customization, let us know where it is hosted. Note: This url needs to be secured with SSL.
Example
https://book.thesiamresidences.com/reservationsFlag to indicate you are self-hosting our booking customization and not using our default booking customization url.
Example
trueChoose how you want our web components to look and more closely match with your own site style.
object
Primary color
Example
#dc3545Secondary color
Example
#6c757dSuccess color
Example
#28a745Danger color
Example
#dc3545Warning color
Example
#ffc107Info color
Example
#17a2b8Light color
Example
#f8f9faDark color
Example
#343a40Body color
Example
#212529Muted color
Example
#6c757dWhite color
Example
#ffffffExample
{ "primary": "#dc3545", "secondary": "#6c757d", "success": "#28a745", "danger": "#dc3545", "warning": "#ffc107", "info": "#17a2b8", "light": "#f8f9fa", "dark": "#343a40", "body": "#212529", "muted": "#6c757d", "white": "#ffffff"}Choose how you large you want our web component cards to be.
Example
VERTICALChoose how you want our web component cards laid out.
Example
INFORMATIONALChoose the card design to use on our web component cards.
Example
DEFAULTYou can control the initial itinerary date used to retrieve travel inventory prices. You can do it in one of two ways: 1. Dynamically set the date by indicating how long and how many days in advance (this field), of today’s date, you want to display prices for. 2. Set a fixed date to display prices for. Option 1 is the most shared. Option 2 is for when you want to create a new customization and apply it to a specific event that occurs on a specific date. If you don’t use either of these options, the itinerary will default to today’s date with one night stay. ONLY populate this field if you want to control the itinerary date. Also, leave startDate and endDate empty.
Example
7You can control the initial itinerary date used to retrieve travel inventory prices. You can do it in one of two ways: 1. Dynamically set the date by indicating how long (this field) and how many days in advance, of today’s date, you want to display prices for. 2. Set a fixed date to display prices for. Option 1 is the most shared. Option 2 is for when you want to create a new customization and apply it to a specific event that occurs on a specific date. If you don’t use either of these options, the itinerary will default to today’s date with one night stay. ONLY populate this field if you want to control the itinerary date. Also, leave startDate and endDate empty.
Example
3Set a fixed itinerary start date. ONLY populate this field if you want to fix the itinerary date. Also, leave numberOfAdvanceDays and numberOfStayDays empty.
Example
2026-07-15Set a fixed itinerary end date ONLY populate this field if you want to fix the itinerary date. Also, leave numberOfAdvanceDays and numberOfStayDays empty.
Example
2026-07-22Control how many adults / children will be staying and how many rooms. Defaults to: One room, two adults.
Room occupancy and guest composition for a single or multiple identical rooms
object
Number of adult guests in this room type
Example
2Child guests in this room, with age groups
Child guest with age and quantity in a room configuration
object
Count of children of this age group in the room
Example
2Age of each child in this group (years)
Example
7Example
{ "quantity": 2, "age": 7}Number of identical rooms with this configuration
Example
1Example
{ "adults": 2, "children": [ { "quantity": 2, "age": 7 } ], "quantity": 1}If true, we use numberOfAdvanceDays / numberOfStayDays properties - false, we use startDate / endDate
Example
trueIf you’ve received special promotional codes from suppliers to give to your audience, you can choose to bake these code directly into the price by entering them here.
An integrator can choose to disable outgoing emails to properties because they want to do that themselves.
Example
trueAn integrator can choose to disable outgoing emails to users because they want to do that themselves.
Example
trueAn integrator can choose to disable notifying the property’s channel manager. Note: This should ONLY be done for testing.
Example
trueAction to complete once a user clicks on the CTA button on inventory.
Example
IBE_MODALShow unavailable inventory card when inventory not currently for sale. Otherwise, it displays a normal card but without the price.
Example
falseWhether to display rankings (lifestyle, eco score and reviews) on hotel landing page.
Example
trueThis feature flag controls whether to let a user move away from the hotel landing page using search.
Example
trueTracking pixels and web beacons for analytics and conversion tracking.
Tracking pixel or web beacon configuration that fires on specified booking events for analytics and conversion tracking
object
Unique identifier for this tracking pixel
Example
f8e4b2c9-3a7d-4c1f-9e5b-2d6f1a8c4e73User-friendly name for this tracking pixel
Example
Facebook Conversion PixelType of tracking pixel delivery mechanism
Example
JAVASCRIPTTracking pixel provider
Example
FACEBOOKConsent category for GDPR/CCPA compliance
Example
MARKETINGWhether this tracking pixel is currently active
Example
trueProvider-specific pixel ID (e.g., Facebook Pixel ID, Google Ads Conversion ID)
Example
1234567890Optional access token for providers that require authentication
Example
EAABsbCS0kB4BAAI...Custom JavaScript code for CUSTOM provider type. Will be injected into the page.
Example
!function(f,b,e,v,n,t,s){/* custom pixel code */}(window, document);Custom image URL for IMAGE type pixels. Will be loaded as a 1x1 tracking pixel.
Example
https://res.cloudinary.com/wink/image/upload/v1/pixel/conversion.gifPage types where this pixel should fire. Empty list or containing ALL means fire on all pages.
Event triggers that cause this pixel to fire, with optional custom parameters.
Defines a booking funnel event that causes a tracking pixel to fire, together with optional custom key-value parameters sent with the event
object
The event type that triggers this pixel
Example
PURCHASECustom key-value parameters to include with the event
Key-value parameter passed with a tracking pixel event; values may be static strings or runtime placeholders such as {booking.total}
object
Parameter name (e.g., ‘currency’, ‘value’, ‘content_id’)
Example
currencyParameter value. Can be a static value or a placeholder like ‘{booking.total}’
Example
USDExample
{ "key": "currency", "value": "USD"}Example
{ "eventType": "PURCHASE", "parameters": [ { "key": "currency", "value": "USD" } ]}Example
{ "identifier": "f8e4b2c9-3a7d-4c1f-9e5b-2d6f1a8c4e73", "name": "Facebook Conversion Pixel", "type": "JAVASCRIPT", "provider": "FACEBOOK", "consentCategory": "MARKETING", "enabled": true, "pixelId": "1234567890", "accessToken": "EAABsbCS0kB4BAAI...", "customScript": "!function(f,b,e,v,n,t,s){/* custom pixel code */}(window, document);", "customImageUrl": "https://res.cloudinary.com/wink/image/upload/v1/pixel/conversion.gif", "triggers": [ { "eventType": "PURCHASE", "parameters": [ { "key": "currency", "value": "USD" } ] } ]}Custom font for the booking engine. Null means use the system default.
Example
{ "name": "Luxury Travel Portal", "appendToPageTitle": "Hotels with Benefits", "googleAnalyticsMeasurementId": "G-ABCDEF1234", "googleTagManagerContainerId": "GTM-XXXXX", "googleMapsAPIKey": "AIzaSyC5H2f7Vf6-6b2dZWfZf6-6b2dZWfZf6-6", "defaultCurrency": "THB", "defaultLanguage": "en", "defaultLifestyle": "LIFESTYLE_HEALTH_FITNESS", "logos": [ { "multimediaIdentifier": "3c6b1a5d-8e2f-4a0b-9c7d-6e4f0a8b2c51", "identifier": "the-siam-residences/lobby-entrance", "type": "IMAGE", "source": "CLOUDINARY", "sort": 10, "angle": null, "width": 2560, "height": 1600, "published": true, "category": "2", "descriptions": [ { "title": "Lobby Entrance", "description": "Elegant lobby of The Siam Residences", "language": "en" } ], "lifestyleType": null, "attribution": [], "isLandscape": true } ], "hostedBookingEngineUrl": "https://book.thesiamresidences.com/reservations", "selfHosted": true, "themeColors": { "primary": "#dc3545", "secondary": "#6c757d", "success": "#28a745", "danger": "#dc3545", "warning": "#ffc107", "info": "#17a2b8", "light": "#f8f9fa", "dark": "#343a40", "body": "#212529", "muted": "#6c757d", "white": "#ffffff" }, "cardLayout": "VERTICAL", "layout": "INFORMATIONAL", "cardDesign": "DEFAULT", "numberOfAdvanceDays": 7, "numberOfStayDays": 3, "startDate": "2026-07-15", "endDate": "2026-07-22", "roomConfigurations": [ { "adults": 2, "children": [ { "quantity": 2, "age": 7 } ], "quantity": 1 } ], "useDays": true, "sendBookingNotificationEmailsToProperty": true, "sendBookingNotificationEmailsToBooker": true, "sendBookingNotificationEmailsToChannelManager": true, "wcBookClickAction": "IBE_MODAL", "showUnavailableCard": false, "showRankings": true, "showSearch": true, "trackingPixels": [ { "identifier": "f8e4b2c9-3a7d-4c1f-9e5b-2d6f1a8c4e73", "name": "Facebook Conversion Pixel", "type": "JAVASCRIPT", "provider": "FACEBOOK", "consentCategory": "MARKETING", "enabled": true, "pixelId": "1234567890", "accessToken": "EAABsbCS0kB4BAAI...", "customScript": "!function(f,b,e,v,n,t,s){/* custom pixel code */}(window, document);", "customImageUrl": "https://res.cloudinary.com/wink/image/upload/v1/pixel/conversion.gif", "triggers": [ { "eventType": "PURCHASE", "parameters": [ { "key": "currency", "value": "USD" } ] } ] } ]}Responses
Section titled “ Responses ”Customization template successfully created
MongoDB document representing a booking engine customization configuration for a sales channel; stores branding, itinerary defaults, tracking pixels, and notification preferences
object
Document UUID
Datetime this record was first created
Datetime this record was last updated
Version property that shows how many times this document has been persisted. Document will not persist if the version property is less than current version property in the system. Result in an optimistic locking exception.
Engine configuration name
Whether to append text to the existing booking customization page title.
Authenticated user identifier
Engine configuration record creator identifier
Name of company owner.
Sales channel sub-type.
Indicates whether this configuration is primary. A primary configuration cannot be removed.
If you want to track analytics with Google Analytics and GTM for your self-hosted booking customization, you need to import our GTM profile into your GTM container and link it with your Google Analytics account. More about that here
If you want to track analytics and you have a GTM Container ID, enter it here.
If you want your users to see Google Maps in your hosted booking customization, go to Google Maps and create an API key for your site.
Control which currency your users see prices in initially.
Control which language your users see text in initially.
Control which lifestyle contextx your users see initially.
Customize booking confirmation emails by adding a custom logo to your configuration.
Multimedia that contains less information than Multimedia object
object
Document identifier
Use this identifier to communicate with Cloudinary.
Whether Cloudinary media is a VIDEO or IMAGE.
Currently ONLY using Cloudinary to store all image / video assets.
Sort allows you to control how you want to sort this record in a list of media records.
Media angle
Media width in pixels.
Media height in pixels.
Instead of deleting the media, choose to un-publish it instead for later re-use. Could be you keep seasonal images of the property.
Supported OTA specification PIC code. See OTA geoname data
Localized media captions to give user some context about where this media was taken.
Foundation class for storing multi-language content (names and descriptions) with content change detection throughout the Wink Platform.
object
Use as title or short text description
Longer text description
Indicate which language this description is written in.
Whether it was user or system generated.
The md5 hash of the name, description and language.
Associate this media with a specific lifestyle type. A user searching and filtering inventory based on lifestyles can be shown relevant media first.
Whether image has attribution properties
object
URL to contributor
Name of contributor
True if media width is greater or equal to height
If you are self-hosting our booking customization, let us know where it is hosted. Note: This url needs to be secured with SSL.
Flag to indicate you are self-hosting our booking customization and not using our default booking customization url.
Choose how you want our web components to look and more closely match with your own site style.
object
Primary color
Secondary color
Success color
Danger color
Warning color
Info color
Light color
Dark color
Body color
Muted color
White color
Choose how you large you want our web component cards to be.
Choose how you want our web component cards laid out.
Choose the card design to use on our web component cards.
You can control the initial itinerary date used to retrieve travel inventory prices. You can do it in one of two ways: 1. Dynamically set the date by indicating how long and how many days in advance (this field), of today’s date, you want to display prices for. 2. Set a fixed date to display prices for. Option 1 is the most shared. Option 2 is for when you want to create a new customization and apply it to a specific event that occurs on a specific date. If you don’t use either of these options, the itinerary will default to today’s date with one night stay. ONLY populate this field if you want to control the itinerary date. Also, leave startDate and endDate empty.
You can control the initial itinerary date used to retrieve travel inventory prices. You can do it in one of two ways: 1. Dynamically set the date by indicating how long (this field) and how many days in advance, of today’s date, you want to display prices for. 2. Set a fixed date to display prices for. Option 1 is the most shared. Option 2 is for when you want to create a new customization and apply it to a specific event that occurs on a specific date. If you don’t use either of these options, the itinerary will default to today’s date with one night stay. ONLY populate this field if you want to control the itinerary date. Also, leave startDate and endDate empty.
Set a fixed itinerary start date. ONLY populate this field if you want to fix the itinerary date. Also, leave numberOfAdvanceDays and numberOfStayDays empty.
Set a fixed itinerary end date ONLY populate this field if you want to fix the itinerary date. Also, leave numberOfAdvanceDays and numberOfStayDays empty.
Control how many adults / children will be staying and how many rooms. Defaults to: One room, two adults.
Room occupancy and guest composition for a single or multiple identical rooms
object
Number of adult guests in this room type
Child guests in this room, with age groups
Child guest with age and quantity in a room configuration
object
Count of children of this age group in the room
Age of each child in this group (years)
Number of identical rooms with this configuration
If true, we use numberOfAdvanceDays / numberOfStayDays properties - false, we use startDate / endDate
If you’ve received special promotional codes from suppliers to give to your audience, you can choose to bake these code directly into the price by entering them here.
An integrator can choose to disable outgoing emails to properties because they want to do that themselves.
An integrator can choose to disable outgoing emails to users because they want to do that themselves.
An integrator can choose to disable notifying the property’s channel manager. Note: This should ONLY be done for testing.
Action to complete once a user clicks on the CTA button on inventory.
Engine application location for reporting purposes.
object
GeoName identifier
GeoNameLightweight type
Name of city
Url name
Ascii name of city
Coordinate points of the city
object
GeoNames specific feature code identifying the place type (e.g. PPL=populated place, PPLC=national capital, ISL=island)
ISO 3166-1 alpha-2 country code for the country this location belongs to
IANA timezone identifier for the location
Country
object
ISO code
Country name
Country capital
Continent code
Currency code
Currency name
Country GeoNames identifier
Country sub division
object
Sub-country name
Sub-country ascii name
Sub-country GeoNames identifier
Country sub sub division
object
Official name of the county or district in its local script
ASCII-transliterated name of the county or district, safe for URLs and sorting
GeoNames.org unique identifier for this subdivision
Show unavailable inventory card when inventory not currently for sale. Otherwise, it displays a normal card but without the price.
Whether to display rankings (lifestyle, eco score and reviews) on hotel landing page.
This feature flag controls whether to let a user move away from the hotel landing page using search.
Tracking pixels and web beacons for analytics and conversion tracking.
Tracking pixel or web beacon configuration that fires on specified booking events for analytics and conversion tracking
object
Unique identifier for this tracking pixel
User-friendly name for this tracking pixel
Type of tracking pixel delivery mechanism
Tracking pixel provider
Consent category for GDPR/CCPA compliance
Whether this tracking pixel is currently active
Provider-specific pixel ID (e.g., Facebook Pixel ID, Google Ads Conversion ID)
Optional access token for providers that require authentication
Custom JavaScript code for CUSTOM provider type. Will be injected into the page.
Custom image URL for IMAGE type pixels. Will be loaded as a 1x1 tracking pixel.
Page types where this pixel should fire. Empty list or containing ALL means fire on all pages.
Event triggers that cause this pixel to fire, with optional custom parameters.
Defines a booking funnel event that causes a tracking pixel to fire, together with optional custom key-value parameters sent with the event
object
The event type that triggers this pixel
Custom key-value parameters to include with the event
Key-value parameter passed with a tracking pixel event; values may be static strings or runtime placeholders such as {booking.total}
object
Parameter name (e.g., ‘currency’, ‘value’, ‘content_id’)
Parameter value. Can be a static value or a placeholder like ‘{booking.total}’
Custom font for the booking engine. Null means use the system default.
Example
Bad Request — missing or invalid request parameter or body
object
object
Example
Unauthorized — authentication is required or the session has expired
object
object
Example
Forbidden — authenticated but lacking the required permission or scope
object
object
Example
Not Found — the requested resource does not exist
object
object
Example
Method Not Allowed — the HTTP verb is not supported on this endpoint
object
object
Example
Unsupported Media Type — use application/json
object
object
Example
Internal Server Error — an unexpected failure occurred on the server
object
object
Example
Service Unavailable — a downstream dependency is unreachable