Listing Created¶
Sent when a new listing owned by one of your users is fully set up. Use it to learn about new listings the moment they are ready, instead of polling the Listings endpoint.
| Event type | listing.created |
| Resource type | listing-created-events |
| Triggered by | A new listing finishing setup — its initial base price is computed |
When It Fires¶
A listing is not ready to price against the moment its row is created: Beyond
first clusters it, resolves its market, imports its calendar, and computes an
initial base price for it. This event fires at that last step — the first
time the listing's base price is computed — so when you receive it the listing
is fully set up and its base-price is populated.
It fires once per listing, on that first pricing. Later base-price changes
are delivered as listing.base_price_changed instead.
The webhook is delivered to the OAuth2 application that owns the listing's user
(User.owner_application). Listings owned by ordinary, non-API users have no
owning application and produce no event.
First base price, then changes
listing.created carries the listing's initial base price. To keep
tracking that value over time, subscribe to
listing.base_price_changed, which fires on every
subsequent change.
Payload¶
{
"meta": {
"type": "listing.created",
"sent-at": "2026-07-06T12:05:00Z"
},
"data": {
"type": "listing-created-events",
"id": "msg_01J9Z7Q1H4RM8ZW9P3D5C6B7E8",
"attributes": {
"created-at": "2026-07-06T12:00:00Z",
"title": "Ocean View Retreat",
"currency": "USD",
"base-price": 210,
"channel-listings": [
{ "channel": "airbnb", "channel-id": "external-listing-987" }
]
},
"relationships": {
"listing": {
"data": { "type": "listings", "id": "12345" },
"links": { "related": "https://developers.beyondpricing.com/api/v1/listings/12345/" }
},
"user": {
"data": { "type": "users", "id": "456" },
"links": { "related": "https://developers.beyondpricing.com/api/v1/users/456/" }
},
"account": {
"data": { "type": "accounts", "id": "789" },
"links": { "related": "https://developers.beyondpricing.com/api/v1/users/456/accounts/789/" }
}
}
}
}
The meta envelope is documented in the Payload
Envelope section.
data.attributes¶
| Field | Type | Description |
|---|---|---|
created-at |
string (RFC 3339) | UTC timestamp when the listing was created. |
title |
string | null | The listing's title. |
currency |
string | null | ISO 4217 currency code the listing is denominated in. |
base-price |
integer | The listing's initial base price, computed by Beyond during setup, in the listing currency — the same whole number the listing resource exposes as base-price (fractional amounts are truncated toward zero). |
channel-listings |
array of objects | The listing's active channel listings — one entry per channel the listing is syndicated to, the same channel-listings exposed on the listing resource. Empty ([]) on the rare listing with no active channel listing. Each entry has channel (the channel, e.g. airbnb, hostaway) and channel-id (the listing's identifier on the channel side, for correlating the event with your own records). |
data.relationships¶
Every relationship carries a links.related URL you can GET for the current
state of the related resource.
| Relationship | Description |
|---|---|
listing |
The Beyond Pricing master listing that was created ({ "type": "listings", "id": … }). |
user |
The user who owns the listing ({ "type": "users", "id": … }). |
account |
The managed account the listing's primary channel listing belongs to ({ "type": "accounts", "id": … }). Omitted on the rare listing with no active channel listing. |
Handling Tips¶
- Treat this as "a new listing is ready" — by the time you receive it, the
listing endpoint returns its full representation, including the
base-priceshown here. - Follow the
listing.links.relatedURL to fetch the listing's current representation rather than assuming its contents from this event. - Dedupe on
webhook-id(see idempotency) since retries re-use it. In rare re-onboarding scenarios (for example, disconnecting and reconnecting an account) a listing may be created again and re-fire; thewebhook-iddiffers, but thelistingrelationship id lets you recognize a listing you already know about.