Listing In Active Market Changed¶
Sent when a listing's
in-active-market
attribute — the one the Listings endpoint serves —
changes, and once at creation for a listing that starts out false.
in-active-market: true guarantees the listing's
calendar endpoint works and automated price
refresh is on; while false the calendar may return a 400 ("not yet
clustered") and price refresh is off. Use it to learn when a listing leaves or
re-enters that ready state, instead of polling.
| Event type | listing.in_active_market_changed |
| Resource type | listing-in-active-market-changed-events |
| Triggered by | A listing's in-active-market attribute changing, in either direction — or a new listing being created with in-active-market: false |
When It Fires¶
At creation¶
A listing created outside any active market — Beyond found no pricing
cluster covering its location — fires this event immediately with
in-active-market: false. These listings need attention: their calendar may
return 400, their prices do not refresh, and they receive no
listing.created event, because that milestone marks a
listing that is fully set up and priced. For such a listing this event is
therefore the first notification you receive about it; follow the
listing.links.related URL to fetch it.
A listing created inside an active market fires nothing here — its milestone is
listing.created.
On a later change¶
The transition is rare. in-active-market turns false when Beyond removes
the listing's pricing cluster (for example after deleting a cluster with no
active replacement covering the listing's location, or because a wrong or
imprecise address moved the property outside any area Beyond covers — such as
into the ocean) or deactivates the listing's market; it turns true again when
a cluster is re-assigned in an active market, or the market activates. Internal
reshuffling that keeps the listing ready throughout — such as moving it
directly from one cluster to another — fires nothing.
While in-active-market is false the listing is still returned by the
Listings endpoint, but its calendar may return
400 and its prices stop refreshing. When the event arrives with
in-active-market: true, the calendar is available again.
A market-wide change (for example Beyond activating a market) reaches each listing on its next daily sync, so expect one event per affected listing spread over about a day rather than a single burst.
Payload¶
{
"meta": {
"type": "listing.in_active_market_changed",
"sent-at": "2026-07-16T12:05:00Z"
},
"data": {
"type": "listing-in-active-market-changed-events",
"id": "msg_01J9Z7Q1H4RM8ZW9P3D5C6B7E8",
"attributes": {
"in-active-market": true,
"changed-at": "2026-07-16T12:00:00Z",
"title": "Ocean View Retreat",
"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 |
|---|---|---|
in-active-market |
boolean | The attribute's new value — the same boolean the listing resource serves. true: the calendar endpoint works and automated price refresh is on. false: the calendar may return 400 and price refresh is off. |
changed-at |
string (RFC 3339) | UTC timestamp when the attribute changed. |
title |
string | null | The listing's title. |
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 whose attribute changed ({ "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¶
- Route on the boolean:
in-active-market: falsemeans "stop reading the calendar and stop treating previously fetched prices as current";truemeans the calendar is available again. - 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. A listing that flips more than once fires once per flip, each with a freshwebhook-id.
Known Limitations¶
- Delivery order between two events for the same listing is not guaranteed —
order them by
changed-at, or fetch the listing for its current state. - The creation event can arrive before you have seen the listing through any
other endpoint or event. Treat an unknown
listing.idas new rather than as an error.