When it fires
Way sendslisting.published when a listing is published. This covers both experience listings and collection listings. When an experience is published, this event is sent alongside experience.published; when a collection is published, only listing.published is sent.
Events arrive at your endpoint as a POST request with the body { "event": "listing.published", "payload": { ... } }. When a webhook secret is set, the X-Way-Signature header carries an HMAC of the request body - see Verify signatures.
Payload
Part of the payload is shaped bylistingType. For experience listings, the experience-level fields (maxParticipantsCount, sessionDurationMinutes, partySize, healthAndSafety, provider, taxes, priceTiers, and hostedBy) are populated at the payload root and resourceGroups is null. For collection listings, those root fields are null and resourceGroups carries each resource group’s published experiences with the same fields.
| Field | Type | Description |
|---|---|---|
brand.id | string (UUID) | Unique identifier of the brand. |
brand.name | string | Display name of the brand. |
brand.tier | string | Subscription tier of the brand. |
brand.countryCode | string | Country code of the brand. |
brand.currency | string | Currency code used by the brand. |
brand.externalReferenceId | string | null | External reference identifier configured for the brand. |
title | string | null | Title of the listing. |
summary | string | null | Short summary of the listing. |
description | string | null | Full description of the listing, as HTML. |
location | object | null | Location of the listing. |
location.id | string (UUID) | Unique identifier of the location. |
location.name | string | Display name of the location. |
location.additionalInfo | string | null | Extra directions or meeting instructions. |
location.city | string | null | City of the location. |
location.state | string | null | State of the location. |
location.country | string | null | Country of the location. |
location.latitude | number | Latitude of the location. |
location.longitude | number | Longitude of the location. |
location.timezoneId | string | IANA time zone of the location. |
paymentMethods | string[] | Payment methods accepted for the listing. |
isNoHost | boolean | Whether the listing runs without a host. |
publishedAt | string (ISO 8601) | null | Timestamp when the listing was published. |
bookingAvailabilityMode | string | Booking availability mode: private, group, or non-restricted. |
category | string | null | Name of the listing’s category. |
vibes | string[] | Names of the vibes assigned to the listing. |
categoryDetails | object | null | The listing’s category, with its identifier. null when no category is set. |
categoryDetails.id | string (UUID) | Unique identifier of the category. |
categoryDetails.name | string | Name of the category. |
vibeDetails | array | Vibes assigned to the listing, each with its identifier. |
vibeDetails[].id | string (UUID) | Unique identifier of the vibe. |
vibeDetails[].name | string | Name of the vibe. |
listingId | string (UUID) | Unique identifier of the listing. |
listingType | string | Type of listing: experience or collection. |
listingTypeId | string (UUID) | null | Identifier of the underlying experience or collection. |
productLine | string | Product line of the listing: activate, host, or reserve. |
languages | string[] | Languages the listing is available in. |
publishedCount | number | Number of times the listing has been published. |
customFields | array | Custom fields configured on the listing. |
customFields[].id | string (UUID) | Unique identifier of the custom field. |
customFields[].fieldName | string | Name of the custom field. |
customFields[].value | any | Value of the custom field. |
isUnlisted | boolean | Whether the listing is hidden from public discovery. |
medias | array | Media attached to the listing. |
medias[].id | string (UUID) | Unique identifier of the media. |
medias[].type | string | Media type: image or video. |
medias[].kind | string | Media kind: gallery, cover, map, or description. |
medias[].altText | string | null | Alternative text for the media, for accessibility. null when not set. |
medias[].links | array | Available renditions of the asset at different resolutions. |
medias[].links[].type | string | Type of the media link: image or video. |
medias[].links[].url | string | URL of this rendition. |
medias[].links[].resolution | string | Resolution of this rendition. Images carry original plus the pixel widths 384, 480, 640, 750, and 1080. Videos carry the resolutions of the source asset. |
autoUnpublishAt | string (ISO 8601) | null | Timestamp when the listing will be automatically unpublished, if scheduled. |
onlineBookingCutoffHours | number | null | Number of hours before the session when online booking closes. |
experienceUrl | string | null | Public URL of the listing. |
maxParticipantsCount | number | null | Maximum number of participants per session. null for collection listings. |
sessionDurationMinutes | number | null | Duration of a session in minutes. null for collection listings. |
partySize | number | null | Party size for private bookings, when set. null for collection listings. |
healthAndSafety | string | null | Health and safety information, as HTML. null for collection listings. |
provider | string[] | null | Items provided to participants. null for collection listings. |
taxes | array | null | Taxes configured on the experience. null for collection listings. |
taxes[].id | string (UUID) | Unique identifier of the tax. |
taxes[].includedInPrice | boolean | Whether the tax is included in the advertised price. |
taxes[].percentage | number | Tax percentage, for percentage-based taxes. |
taxes[].amount | number | Tax amount, for fixed-amount taxes. |
taxes[].isHostTax | boolean | Whether the tax applies to the host, when set. |
taxes[].order | number | null | Order in which the tax is applied, when set. |
taxes[].showInAdvertisedPrice | boolean | null | Whether the tax is shown in the advertised price, when set. |
taxes[].appliesTo | string[] | null | Identifiers of the items the tax applies to, when set. |
priceTiers | array | null | Price tiers configured on the experience. null for collection listings. |
priceTiers[].id | string (UUID) | Unique identifier of the price tier. |
priceTiers[].name | string | Name of the price tier. |
priceTiers[].price | number | Price of the tier. |
priceTiers[].maxQuantity | number | Maximum quantity bookable on the tier, when set. |
hostedBy | object | null | Host assigned to the experience. null when there is no host, and for collection listings. |
hostedBy.id | string (UUID) | Unique identifier of the host. |
hostedBy.firstName | string | Host’s first name. |
hostedBy.lastName | string | Host’s last name. |
hostedBy.emailAddress | string | Email address of the host. |
hostedBy.description | string | null | Host’s bio. null when not set. |
hostedBy.allowOverlappingBookings | boolean | Whether this host can be booked for overlapping sessions. |
resourceGroups | array | null | Resource groups of a collection listing. null for experience listings. |
resourceGroups[].id | string (UUID) | Unique identifier of the resource group. |
resourceGroups[].title | string | Title of the resource group. |
resourceGroups[].description | string | Description of the resource group. |
resourceGroups[].experiences | array | Published experiences in the resource group. Each carries id, title, and the same experience-level fields as the payload root: maxParticipantsCount, sessionDurationMinutes, partySize, healthAndSafety, provider, taxes, priceTiers, and hostedBy. |
Sample
{
"event": "listing.published",
"payload": {
"brand": {
"id": "8e12bfdc-a74c-48e2-8a76-2996a359c10c",
"name": "The Seaside Hotel",
"tier": "growth",
"currency": "USD",
"countryCode": "US"
},
"title": "Cabana Rental",
"vibes": [
"Daily Resort Activities ",
"Resort Experiences "
],
"vibeDetails": [
{
"id": "2f8c1a44-90b7-4e21-9c3d-6a5e8f0b1d72",
"name": "Daily Resort Activities "
},
{
"id": "b6d9e017-3c54-4a88-812f-5e7a9c0d3b41",
"name": "Resort Experiences "
}
],
"medias": [
{
"id": "83566ef6-7450-450b-9b4d-ce86e6f9b259",
"kind": "cover",
"type": "image",
"altText": "Poolside cabana with plush daybeds",
"links": [
{
"url": "https://images.letsway.com/staging/tr:w-original/https://storage.googleapis.com/kouto-api-media/2026/6/accbde4c0064e535c67fd874a3b95d235d72465ed862dca1.jpg",
"type": "image",
"resolution": "original"
},
{
"url": "https://images.letsway.com/staging/tr:w-384/https://storage.googleapis.com/kouto-api-media/2026/6/accbde4c0064e535c67fd874a3b95d235d72465ed862dca1.jpg",
"type": "image",
"resolution": "384"
},
{
"url": "https://images.letsway.com/staging/tr:w-480/https://storage.googleapis.com/kouto-api-media/2026/6/accbde4c0064e535c67fd874a3b95d235d72465ed862dca1.jpg",
"type": "image",
"resolution": "480"
},
{
"url": "https://images.letsway.com/staging/tr:w-640/https://storage.googleapis.com/kouto-api-media/2026/6/accbde4c0064e535c67fd874a3b95d235d72465ed862dca1.jpg",
"type": "image",
"resolution": "640"
},
{
"url": "https://images.letsway.com/staging/tr:w-750/https://storage.googleapis.com/kouto-api-media/2026/6/accbde4c0064e535c67fd874a3b95d235d72465ed862dca1.jpg",
"type": "image",
"resolution": "750"
},
{
"url": "https://images.letsway.com/staging/tr:w-1080/https://storage.googleapis.com/kouto-api-media/2026/6/accbde4c0064e535c67fd874a3b95d235d72465ed862dca1.jpg",
"type": "image",
"resolution": "1080"
}
]
},
{
"id": "9711a957-521b-407d-aa19-9a30174e8db6",
"kind": "gallery",
"type": "image",
"altText": null,
"links": [
{
"url": "https://images.letsway.com/staging/tr:w-original/https://storage.googleapis.com/kouto-api-media/2026/6/accbde4c0064e535c67fd874a3b95d235d72465ed862dca1.jpg",
"type": "image",
"resolution": "original"
},
{
"url": "https://images.letsway.com/staging/tr:w-1080/https://storage.googleapis.com/kouto-api-media/2026/6/accbde4c0064e535c67fd874a3b95d235d72465ed862dca1.jpg",
"type": "image",
"resolution": "1080"
}
]
}
],
"summary": "Luxurious adult cabana & daybed rentals by the pool. Enjoy privacy, plush comforts, personal service, and gourmet treats for an ultimate relaxation experience.",
"category": null,
"categoryDetails": null,
"isNoHost": false,
"location": {
"id": "953bcdd8-2ff4-4427-97e9-4851d8db7439",
"name": "Austin, TX, USA",
"latitude": 30.267153,
"longitude": -97.7430608,
"timezoneId": "America/Chicago",
"additionalInfo": null,
"city": "Austin",
"state": "TX",
"country": "United States"
},
"languages": [
"en-US"
],
"listingId": "b8459588-c7f3-42ed-a010-d455917b676e",
"isUnlisted": false,
"description": "<p>Indulge in the epitome of poolside luxury with our combined offering of an adult cabana and daybed rental, designed for discerning guests seeking an unparalleled relaxation experience. Nestled beside a sparkling pool, our adult cabana provides a private sanctuary where comfort meets elegance. It features stylish furnishings, a personal plunge pool, and an outdoor dining area, perfect for enjoying a meal under the sky. The cabana is complemented by state-of-the-art amenities, including a high-speed Wi-Fi connection, a premium sound system, and a fully stocked mini-bar with an array of refreshing beverages.</p>",
"listingType": "collection",
"productLine": "reserve",
"publishedAt": "2025-07-11T20:57:48.970Z",
"customFields": [],
"experienceUrl": "https://embed-demo.staging.letsway.com/brands/8e12bfdc-a74c-48e2-8a76-2996a359c10c#!/e/c3789d11",
"listingTypeId": "8afaf6f6-5901-4328-8579-bb0a3b5c2f30",
"paymentMethods": [
"credit-card"
],
"publishedCount": 19,
"autoUnpublishAt": null,
"bookingAvailabilityMode": "group",
"onlineBookingCutoffHours": -1,
"maxParticipantsCount": null,
"sessionDurationMinutes": null,
"partySize": null,
"healthAndSafety": null,
"provider": null,
"taxes": null,
"priceTiers": null,
"hostedBy": null,
"resourceGroups": [
{
"id": "5f1e0f6a-9a1e-4a44-b7a4-7f3f7a1a2b3c",
"title": "Cabanas",
"description": "Private poolside cabanas",
"experiences": [
{
"id": "c3789d11-4d2a-4d6e-9f0a-1b2c3d4e5f6a",
"title": "Poolside Cabana",
"maxParticipantsCount": 8,
"sessionDurationMinutes": 480,
"partySize": null,
"healthAndSafety": "<p>Adults only.</p>",
"provider": [
"Towels",
"Bottled water"
],
"taxes": [
{
"id": "ccf8424c-2da0-41a0-87d3-ef228cf30cf9",
"percentage": 5,
"includedInPrice": false
}
],
"priceTiers": [
{
"name": "Full day",
"price": 250
}
],
"hostedBy": {
"id": "7c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
"firstName": "Maria",
"lastName": "Gonzalez",
"emailAddress": "maria.gonzalez@theseasidehotel.com",
"description": "Maria has hosted poolside experiences at The Seaside Hotel for six years.",
"allowOverlappingBookings": false
}
}
]
}
]
}
}