repull 0.2.34 → 0.2.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/openapi/v1.json CHANGED
@@ -110,10 +110,6 @@
110
110
  "name": "VRBO",
111
111
  "description": "VRBO channel management \u2014 listings and reservations"
112
112
  },
113
- {
114
- "name": "Plumguide",
115
- "description": "Plumguide channel management \u2014 availability, pricing, bookings"
116
- },
117
113
  {
118
114
  "name": "AI",
119
115
  "description": "AI-powered operations \u2014 guest responses, intent classification, listing generation, pricing suggestions"
@@ -190,12 +186,17 @@
190
186
  "address": {
191
187
  "type": "string",
192
188
  "nullable": true,
193
- "description": "Street address (from the listing's `street` field)."
189
+ "description": "Street line only, as stored on the listing \u2014 no unit, state or postal code. Kept for existing integrations; read `addressDetails` for the full postal address.",
190
+ "example": "2700 Northwest 2nd Avenue"
194
191
  },
195
192
  "city": {
196
193
  "type": "string",
197
194
  "nullable": true,
198
- "example": "Miami Beach"
195
+ "description": "City as stored on the listing. Kept for existing integrations; `addressDetails.city` is the resolved city.",
196
+ "example": "Miami"
197
+ },
198
+ "addressDetails": {
199
+ "$ref": "#/components/schemas/PostalAddress"
199
200
  },
200
201
  "latitude": {
201
202
  "type": "string",
@@ -254,6 +255,55 @@
254
255
  }
255
256
  }
256
257
  },
258
+ "PostalAddress": {
259
+ "type": "object",
260
+ "description": "The full postal address, unit included. Returned on every active row of `GET /v1/properties`, `GET /v1/properties/{id}`, `GET /v1/listings` and `GET /v1/listings/{id}` (on listings, these fields sit inside `address`). Each part is read from the listing first, then from the connected channels (Airbnb, Vrbo, Booking.com), so `line2` carries the apartment or unit number that tells units in the same building apart. A part nobody has stored is `null`.",
261
+ "required": [
262
+ "line1",
263
+ "line2",
264
+ "city",
265
+ "state",
266
+ "postalCode",
267
+ "countryCode"
268
+ ],
269
+ "properties": {
270
+ "line1": {
271
+ "type": "string",
272
+ "nullable": true,
273
+ "description": "Street address: number and street.",
274
+ "example": "2700 Northwest 2nd Avenue"
275
+ },
276
+ "line2": {
277
+ "type": "string",
278
+ "nullable": true,
279
+ "description": "Apartment, unit, suite or building.",
280
+ "example": "Unit 241"
281
+ },
282
+ "city": {
283
+ "type": "string",
284
+ "nullable": true,
285
+ "example": "Miami"
286
+ },
287
+ "state": {
288
+ "type": "string",
289
+ "nullable": true,
290
+ "description": "State, province or region.",
291
+ "example": "FL"
292
+ },
293
+ "postalCode": {
294
+ "type": "string",
295
+ "nullable": true,
296
+ "description": "Postal or ZIP code.",
297
+ "example": "33127"
298
+ },
299
+ "countryCode": {
300
+ "type": "string",
301
+ "nullable": true,
302
+ "description": "ISO 3166-1 alpha-2 country code.",
303
+ "example": "US"
304
+ }
305
+ }
306
+ },
257
307
  "PropertyAvailabilityDay": {
258
308
  "type": "object",
259
309
  "description": "One calendar day in the availability window.",
@@ -1294,6 +1344,15 @@
1294
1344
  "direction": {
1295
1345
  "type": "string"
1296
1346
  },
1347
+ "status": {
1348
+ "type": "string",
1349
+ "description": "Delivery state. Inbound messages are `received`. An outbound message is `sending` while it is queued to the channel, `sent` once the channel accepted it, or `failed`. Only `sent` (or `received`) means the guest can see it."
1350
+ },
1351
+ "statusReason": {
1352
+ "type": "string",
1353
+ "nullable": true,
1354
+ "description": "Why a message is still `sending` or `failed`, in plain words. `null` otherwise."
1355
+ },
1297
1356
  "senderType": {
1298
1357
  "type": "string",
1299
1358
  "nullable": true,
@@ -1342,7 +1401,9 @@
1342
1401
  },
1343
1402
  "deliveredAt": {
1344
1403
  "type": "string",
1345
- "format": "date-time"
1404
+ "format": "date-time",
1405
+ "nullable": true,
1406
+ "description": "When the message reached the channel. `null` while it is `sending` or when it `failed`."
1346
1407
  },
1347
1408
  "readAt": {
1348
1409
  "type": "string",
@@ -2246,6 +2307,11 @@
2246
2307
  ],
2247
2308
  "description": "Vrbo only."
2248
2309
  },
2310
+ "notificationEmail": {
2311
+ "type": "string",
2312
+ "nullable": true,
2313
+ "description": "Vrbo only. The address the host can add on Vrbo as a secondary email (with message and reservation notifications on) so new bookings, inquiries and messages arrive within a minute instead of at the scheduled check. Ask every host to add it: notifications are how Vrbo updates reach Repull, the scheduled check is the backup. Hosted Connect shows it on its mapping screen; show it in your own app when you create sessions with `mapping: \"api\"`."
2314
+ },
2249
2315
  "import": {
2250
2316
  "nullable": true,
2251
2317
  "allOf": [
@@ -2690,7 +2756,6 @@
2690
2756
  "listing.deleted",
2691
2757
  "listing.suspended",
2692
2758
  "listing.reactivated",
2693
- "calendar.updated",
2694
2759
  "account.created",
2695
2760
  "connect.session.completed",
2696
2761
  "account.disconnected",
@@ -3724,43 +3789,6 @@
3724
3789
  }
3725
3790
  }
3726
3791
  },
3727
- "CalendarUpdatedPayload": {
3728
- "type": "object",
3729
- "description": "Payload for `calendar.updated`. Availability or pricing for a listing was updated.",
3730
- "properties": {
3731
- "listingId": {
3732
- "type": "integer",
3733
- "example": 6250
3734
- },
3735
- "range": {
3736
- "type": "object",
3737
- "properties": {
3738
- "start": {
3739
- "type": "string",
3740
- "format": "date",
3741
- "example": "2026-06-01"
3742
- },
3743
- "end": {
3744
- "type": "string",
3745
- "format": "date",
3746
- "example": "2026-06-15"
3747
- }
3748
- }
3749
- },
3750
- "affectedDates": {
3751
- "type": "integer",
3752
- "example": 14
3753
- },
3754
- "pricingChanged": {
3755
- "type": "boolean",
3756
- "example": true
3757
- },
3758
- "availabilityChanged": {
3759
- "type": "boolean",
3760
- "example": false
3761
- }
3762
- }
3763
- },
3764
3792
  "AccountCreatedPayload": {
3765
3793
  "type": "object",
3766
3794
  "description": "Payload for `account.created`. An OAuth or API credential connection was completed by an end user.",
@@ -3807,7 +3835,7 @@
3807
3835
  "provider": {
3808
3836
  "type": "string",
3809
3837
  "nullable": true,
3810
- "description": "Channel or PMS: airbnb, booking, booking_extranet, vrbo, plumguide, hostaway, \u2026",
3838
+ "description": "Channel or PMS: airbnb, booking, booking_extranet, vrbo, hostaway, \u2026",
3811
3839
  "example": "vrbo"
3812
3840
  },
3813
3841
  "externalAccountId": {
@@ -4842,42 +4870,6 @@
4842
4870
  }
4843
4871
  }
4844
4872
  },
4845
- "CalendarUpdatedEvent": {
4846
- "type": "object",
4847
- "required": [
4848
- "event",
4849
- "eventId",
4850
- "apiVersion",
4851
- "timestamp",
4852
- "data"
4853
- ],
4854
- "properties": {
4855
- "event": {
4856
- "type": "string",
4857
- "description": "The event name. This field is `event`, not `type`."
4858
- },
4859
- "eventId": {
4860
- "type": "string",
4861
- "format": "uuid",
4862
- "description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
4863
- },
4864
- "apiVersion": {
4865
- "type": "string",
4866
- "example": "2026-04"
4867
- },
4868
- "timestamp": {
4869
- "type": "string",
4870
- "format": "date-time",
4871
- "description": "When this delivery was built."
4872
- },
4873
- "account": {
4874
- "$ref": "#/components/schemas/WebhookEventAccount"
4875
- },
4876
- "data": {
4877
- "$ref": "#/components/schemas/CalendarUpdatedPayload"
4878
- }
4879
- }
4880
- },
4881
4873
  "AccountCreatedEvent": {
4882
4874
  "type": "object",
4883
4875
  "required": [
@@ -5770,9 +5762,6 @@
5770
5762
  {
5771
5763
  "$ref": "#/components/schemas/ListingReactivatedEvent"
5772
5764
  },
5773
- {
5774
- "$ref": "#/components/schemas/CalendarUpdatedEvent"
5775
- },
5776
5765
  {
5777
5766
  "$ref": "#/components/schemas/AccountCreatedEvent"
5778
5767
  },
@@ -5845,7 +5834,6 @@
5845
5834
  "listing.deleted": "#/components/schemas/ListingDeletedEvent",
5846
5835
  "listing.suspended": "#/components/schemas/ListingSuspendedEvent",
5847
5836
  "listing.reactivated": "#/components/schemas/ListingReactivatedEvent",
5848
- "calendar.updated": "#/components/schemas/CalendarUpdatedEvent",
5849
5837
  "account.created": "#/components/schemas/AccountCreatedEvent",
5850
5838
  "connect.session.completed": "#/components/schemas/ConnectSessionCompletedEvent",
5851
5839
  "account.disconnected": "#/components/schemas/AccountDisconnectedEvent",
@@ -6160,22 +6148,6 @@
6160
6148
  }
6161
6149
  }
6162
6150
  },
6163
- "PlumguideListing": {
6164
- "type": "object",
6165
- "description": "A Plumguide listing.",
6166
- "properties": {
6167
- "id": {
6168
- "type": "string"
6169
- },
6170
- "name": {
6171
- "type": "string"
6172
- },
6173
- "status": {
6174
- "type": "string",
6175
- "nullable": true
6176
- }
6177
- }
6178
- },
6179
6151
  "AirbnbReservation": {
6180
6152
  "type": "object",
6181
6153
  "description": "An Airbnb reservation as returned by the channel API. Use `confirmationCode` to address it in Airbnb operations.",
@@ -7039,8 +7011,7 @@
7039
7011
  "example": [
7040
7012
  "airbnb",
7041
7013
  "booking",
7042
- "vrbo",
7043
- "plumguide"
7014
+ "vrbo"
7044
7015
  ]
7045
7016
  },
7046
7017
  "validParams": {
@@ -8008,20 +7979,6 @@
8008
7979
  }
8009
7980
  }
8010
7981
  },
8011
- "PlumguideListingListResponse": {
8012
- "type": "object",
8013
- "properties": {
8014
- "data": {
8015
- "type": "array",
8016
- "items": {
8017
- "$ref": "#/components/schemas/PlumguideListing"
8018
- }
8019
- },
8020
- "pagination": {
8021
- "$ref": "#/components/schemas/Pagination"
8022
- }
8023
- }
8024
- },
8025
7982
  "ListingCreateRequest": {
8026
7983
  "type": "object",
8027
7984
  "required": [
@@ -9557,14 +9514,48 @@
9557
9514
  },
9558
9515
  "address": {
9559
9516
  "type": "object",
9517
+ "description": "The listing's postal address, unit included. Each part is read from the listing first, then from the connected channels (Airbnb, Vrbo, Booking.com). On an inactive row only `city` is present.",
9560
9518
  "properties": {
9561
9519
  "street": {
9562
9520
  "type": "string",
9563
- "nullable": true
9521
+ "nullable": true,
9522
+ "description": "Street line as stored on the listing. Kept for existing integrations; same value as `line1` unless the listing has no street of its own.",
9523
+ "example": "2700 Northwest 2nd Avenue"
9524
+ },
9525
+ "line1": {
9526
+ "type": "string",
9527
+ "nullable": true,
9528
+ "description": "Street address: number and street.",
9529
+ "example": "2700 Northwest 2nd Avenue"
9530
+ },
9531
+ "line2": {
9532
+ "type": "string",
9533
+ "nullable": true,
9534
+ "description": "Apartment, unit, suite or building.",
9535
+ "example": "Unit 241"
9564
9536
  },
9565
9537
  "city": {
9566
9538
  "type": "string",
9567
- "nullable": true
9539
+ "nullable": true,
9540
+ "example": "Miami"
9541
+ },
9542
+ "state": {
9543
+ "type": "string",
9544
+ "nullable": true,
9545
+ "description": "State, province or region.",
9546
+ "example": "FL"
9547
+ },
9548
+ "postalCode": {
9549
+ "type": "string",
9550
+ "nullable": true,
9551
+ "description": "Postal or ZIP code.",
9552
+ "example": "33127"
9553
+ },
9554
+ "countryCode": {
9555
+ "type": "string",
9556
+ "nullable": true,
9557
+ "description": "ISO 3166-1 alpha-2 country code.",
9558
+ "example": "US"
9568
9559
  }
9569
9560
  }
9570
9561
  },
@@ -18279,6 +18270,15 @@
18279
18270
  "example": 24,
18280
18271
  "description": "Airbnb \u2014 how many months of past reservations the first import pulls (1\u201360). Omit it for the default window. Upcoming stays are always imported. A wider window takes longer to import, because every extra month is more stays to fetch."
18281
18272
  },
18273
+ "mapping": {
18274
+ "type": "string",
18275
+ "enum": [
18276
+ "hosted",
18277
+ "api"
18278
+ ],
18279
+ "default": "hosted",
18280
+ "description": "Where the channel's units get linked to listings. `hosted` (default): after a Vrbo or Booking.com Extranet sign-in, Connect shows a mapping step and returns to `redirectUrl` when it's confirmed. `api`: Connect skips that step and finishes right after sign-in. The connection reaches you in the `connect.session.completed` webhook (and as `connectionId` in the popup message), its handle is `vrbo:{connectionId}` or `booking_extranet:{connectionId}`; you list the units with `GET /v1/connections/{id}/units` and link them with `POST /v1/connections/{id}/mappings`. Nothing is imported until you post the mappings. Other providers ignore it."
18281
+ },
18282
18282
  "accessType": {
18283
18283
  "type": "string",
18284
18284
  "enum": [
@@ -18517,7 +18517,7 @@
18517
18517
  "post": {
18518
18518
  "operationId": "create_connection",
18519
18519
  "summary": "Connect to PMS/OTA provider",
18520
- "description": "Establish a connection to a PMS or OTA platform. Credentials vary by provider \u2014 see docs for each provider.\n\nAirbnb-specific: pass `redirectUrl` (where to send the user after consent) and optionally `accessType`. Three tiers: `read_only` grants read-only scopes; `messaging` grants read scopes plus message read/send but NOT property management, so it can coexist with another app (e.g. an existing PMS) that already holds property management on the same Airbnb account; `full_access` \u2014 the default \u2014 grants full host scopes including the exclusive property management (only one app per Airbnb account can hold it). The response returns a hosted `url` to redirect the user to.\n\nBooking.com: pass `redirectUrl` (no `accessType`). The response returns a hosted `url` \u2014 send the user there to designate FantasticStay in their Booking.com Extranet and paste their Hotel ID. Same response shape as Airbnb (`url`, `sessionId`, `expiresAt`).\n\nPlumguide passes `clientId`/`clientSecret`. PMS providers are not connected by this call: send their credentials to `POST /v1/connect/{provider}/credentials`, or start a hosted session with `POST /v1/connect`.",
18520
+ "description": "Establish a connection to a PMS or OTA platform. Credentials vary by provider \u2014 see docs for each provider.\n\nAirbnb-specific: pass `redirectUrl` (where to send the user after consent) and optionally `accessType`. Three tiers: `read_only` grants read-only scopes; `messaging` (shown to hosts as \"Messaging & reviews\") grants read scopes plus message read/send and review writes (reply to guest reviews, submit host reviews \u2014 Airbnb's `reviews_write`) but NOT property management, so it can coexist with another app (e.g. an existing PMS) that already holds property management on the same Airbnb account; `full_access` \u2014 the default \u2014 grants full host scopes including the exclusive property management (only one app per Airbnb account can hold it). The response returns a hosted `url` to redirect the user to.\n\nBooking.com: pass `redirectUrl` (no `accessType`). The response returns a hosted `url` \u2014 send the user there to select our connectivity provider in their Booking.com Extranet and paste their Hotel ID. Same response shape as Airbnb (`url`, `sessionId`, `expiresAt`).\n\nPMS providers are not connected by this call: send their credentials to `POST /v1/connect/{provider}/credentials`, or start a hosted session with `POST /v1/connect`.",
18521
18521
  "tags": [
18522
18522
  "Connect"
18523
18523
  ],
@@ -18546,7 +18546,7 @@
18546
18546
  "messaging"
18547
18547
  ],
18548
18548
  "default": "full_access",
18549
- "description": "Airbnb only \u2014 selects the OAuth scope set. 'read_only' grants read-only scopes; 'messaging' grants read scopes plus message read/send but NOT property management, so it can coexist with another app (e.g. an existing PMS) that already holds property management on the same Airbnb account; 'full_access' (default) grants full host scopes including the exclusive property management (only one app per Airbnb account can hold it). The hosted consent screen normally lets the host pick a tier; passing `accessType` explicitly fixes the tier and hides that choice, so the host can only continue with the tier you requested. Omit it to let the host choose."
18549
+ "description": "Airbnb only \u2014 selects the OAuth scope set. 'read_only' grants read-only scopes; 'messaging' (shown to hosts as \"Messaging & reviews\") grants read scopes plus message read/send and review writes (reply to guest reviews, submit host reviews \u2014 Airbnb's reviews_write) but NOT property management, so it can coexist with another app (e.g. an existing PMS) that already holds property management on the same Airbnb account; 'full_access' (default) grants full host scopes including the exclusive property management (only one app per Airbnb account can hold it). The hosted consent screen normally lets the host pick a tier; passing `accessType` explicitly fixes the tier and hides that choice, so the host can only continue with the tier you requested. Omit it to let the host choose."
18550
18550
  },
18551
18551
  "reservationHistoryMonths": {
18552
18552
  "type": "integer",
@@ -18559,14 +18559,6 @@
18559
18559
  "type": "string",
18560
18560
  "description": "Airbnb + Booking.com \u2014 your own correlation token, e.g. your user id (at most 500 characters). Echoed on the redirect back (`&state=`) and in the `connect.session.completed` webhook."
18561
18561
  },
18562
- "clientId": {
18563
- "type": "string",
18564
- "description": "Plumguide \u2014 client ID."
18565
- },
18566
- "clientSecret": {
18567
- "type": "string",
18568
- "description": "Plumguide \u2014 client secret."
18569
- },
18570
18562
  "locale": {
18571
18563
  "type": "string",
18572
18564
  "nullable": true,
@@ -19434,7 +19426,7 @@
19434
19426
  "get": {
19435
19427
  "operationId": "getChannelHealth",
19436
19428
  "summary": "Per-channel connectivity health",
19437
- "description": "Reports reachability and auth state for one channel (`airbnb`, `booking`, `vrbo`, `plumguide`). Use it to tell \"the channel is down\" apart from \"this workspace's connection expired\". `200` when `status` is `ok`, `503` when `degraded` or `down` (the body's `status` and `message` say which and why).\n\n**`vrbo`** reports the connector's own signals in a `vrbo` block: connected accounts, accounts VRBO signed out (their bookings, messages and calendar stop until reconnected \u2014 `down`), accounts whose inbox sync is late (`degraded`), and the calendar push queue backlog and its oldest wait (`degraded` past 3 hours). Its rate is calendar pushes VRBO refused over finished ones in the last 3 hours; failures inside Repull's own connector are reported apart as `vrbo.connector_errors` and do not count (`vrbo.window_hours`; `refresh_attempts_24h` / `refresh_rejections_24h` count that window for VRBO), judged only once at least 50 pushes finished and at least 5 failed \u2014 VRBO pushes run in bursts, so a day-long window would keep reporting a problem already fixed.",
19429
+ "description": "Reports reachability and auth state for one channel (`airbnb`, `booking`, `vrbo`). Use it to tell \"the channel is down\" apart from \"this workspace's connection expired\". `200` when `status` is `ok`, `503` when `degraded` or `down` (the body's `status` and `message` say which and why).\n\n**`vrbo`** reports the connector's own signals in a `vrbo` block: connected accounts, accounts VRBO signed out (their bookings, messages and calendar stop until reconnected \u2014 `down`), accounts whose inbox sync is late (`degraded`), and the calendar push queue backlog and its oldest wait (`degraded` past 3 hours). Its rate is calendar pushes VRBO refused over finished ones in the last 3 hours; failures inside Repull's own connector are reported apart as `vrbo.connector_errors` and do not count (`vrbo.window_hours`; `refresh_attempts_24h` / `refresh_rejections_24h` count that window for VRBO), judged only once at least 50 pushes finished and at least 5 failed \u2014 VRBO pushes run in bursts, so a day-long window would keep reporting a problem already fixed.",
19438
19430
  "tags": [
19439
19431
  "Health"
19440
19432
  ],
@@ -19449,8 +19441,7 @@
19449
19441
  "enum": [
19450
19442
  "airbnb",
19451
19443
  "booking",
19452
- "vrbo",
19453
- "plumguide"
19444
+ "vrbo"
19454
19445
  ]
19455
19446
  }
19456
19447
  }
@@ -19805,7 +19796,7 @@
19805
19796
  "post": {
19806
19797
  "operationId": "verifyBookingHotel",
19807
19798
  "summary": "Verify a Booking.com hotel ID for a Connect session",
19808
- "description": "Manual-paste fallback that closes the Booking.com claim flow. Call this after the customer completes Stage 1 designation in their Booking Extranet (ticking FantasticStay/Repull as their connectivity provider) and pastes their Hotel ID into the hosted picker.\n\nValidates the hotel against Booking's property API, persists the `pms_connections` row, kicks off the room import, and transitions the Connect session to `awaiting_room_mapping`.\n\nNo API key required \u2014 the `sessionId` is the capability token. Sessions in any terminal state are rejected.",
19799
+ "description": "Manual-paste fallback that closes the Booking.com claim flow. Call this after the customer completes Stage 1 designation in their Booking Extranet (selecting our connectivity provider, named on the hosted Connect page) and pastes their Hotel ID into the hosted picker.\n\nValidates the hotel against Booking's property API, persists the `pms_connections` row, kicks off the room import, and transitions the Connect session to `awaiting_room_mapping`.\n\nNo API key required \u2014 the `sessionId` is the capability token. Sessions in any terminal state are rejected.",
19809
19800
  "tags": [
19810
19801
  "Connect"
19811
19802
  ],
@@ -27386,226 +27377,6 @@
27386
27377
  }
27387
27378
  }
27388
27379
  },
27389
- "/v1/channels/plumguide/listings": {
27390
- "get": {
27391
- "operationId": "list_plumguide_listings",
27392
- "summary": "List Plumguide listings",
27393
- "description": "List Plumguide listings this workspace has access to. Plumguide is approval-based \u2014 listings appear once Plumguide has accepted them.",
27394
- "tags": [
27395
- "Plumguide"
27396
- ],
27397
- "responses": {
27398
- "200": {
27399
- "description": "Listings",
27400
- "content": {
27401
- "application/json": {
27402
- "schema": {
27403
- "$ref": "#/components/schemas/PlumguideListingListResponse"
27404
- }
27405
- }
27406
- }
27407
- }
27408
- }
27409
- }
27410
- },
27411
- "/v1/channels/plumguide/availability": {
27412
- "get": {
27413
- "operationId": "get_plumguide_availability",
27414
- "summary": "Get Plumguide availability",
27415
- "description": "Read the per-day availability calendar for a Plumguide listing. Returns the same row shape as Airbnb availability for SDK convenience.\n\nReturns `403 listing_inactive` when the listing this resolves to is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.",
27416
- "tags": [
27417
- "Plumguide"
27418
- ],
27419
- "responses": {
27420
- "200": {
27421
- "description": "Availability"
27422
- },
27423
- "403": {
27424
- "$ref": "#/components/responses/ListingInactive"
27425
- }
27426
- }
27427
- },
27428
- "put": {
27429
- "operationId": "update_plumguide_availability",
27430
- "summary": "Push availability to Plumguide",
27431
- "description": "Push per-day availability changes to Plumguide. Plumguide accepts only the next 24 months \u2014 dates beyond that are silently ignored.\n\nReturns `403 listing_inactive` when the listing this resolves to is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.",
27432
- "tags": [
27433
- "Plumguide"
27434
- ],
27435
- "responses": {
27436
- "200": {
27437
- "description": "Pushed"
27438
- },
27439
- "403": {
27440
- "$ref": "#/components/responses/ListingInactive"
27441
- }
27442
- }
27443
- }
27444
- },
27445
- "/v1/channels/plumguide/pricing": {
27446
- "get": {
27447
- "operationId": "get_plumguide_pricing",
27448
- "summary": "Get Plumguide pricing",
27449
- "description": "Read the current pricing for a Plumguide listing (base price, currency, weekend uplift).\n\nReturns `403 listing_inactive` when the listing this resolves to is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.",
27450
- "tags": [
27451
- "Plumguide"
27452
- ],
27453
- "responses": {
27454
- "200": {
27455
- "description": "Pricing"
27456
- },
27457
- "403": {
27458
- "$ref": "#/components/responses/ListingInactive"
27459
- }
27460
- }
27461
- },
27462
- "put": {
27463
- "operationId": "update_plumguide_pricing",
27464
- "summary": "Push pricing to Plumguide",
27465
- "description": "Push pricing changes to Plumguide. Plumguide rounds all prices to whole units of the listing currency \u2014 sub-unit precision is silently truncated.\n\nReturns `403 listing_inactive` when the listing this resolves to is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.",
27466
- "tags": [
27467
- "Plumguide"
27468
- ],
27469
- "responses": {
27470
- "200": {
27471
- "description": "Pushed"
27472
- },
27473
- "403": {
27474
- "$ref": "#/components/responses/ListingInactive"
27475
- }
27476
- }
27477
- }
27478
- },
27479
- "/v1/channels/plumguide/bookings": {
27480
- "get": {
27481
- "operationId": "list_plumguide_bookings",
27482
- "summary": "List Plumguide bookings",
27483
- "description": "List Plumguide bookings. Default returns all bookings; pass `listing_id` to filter to one listing, or `booking_code` to fetch a single booking.\n\nReturns `403 listing_inactive` when `listing_id` or `booking_code` resolves to an inactive listing. The unfiltered list is read straight from Plum Guide and is not filtered by listing status.",
27484
- "tags": [
27485
- "Plumguide"
27486
- ],
27487
- "parameters": [
27488
- {
27489
- "name": "listing_id",
27490
- "in": "query",
27491
- "required": false,
27492
- "schema": {
27493
- "type": "integer"
27494
- },
27495
- "description": "Filter to a single Plumguide listing."
27496
- },
27497
- {
27498
- "name": "booking_code",
27499
- "in": "query",
27500
- "required": false,
27501
- "schema": {
27502
- "type": "string"
27503
- },
27504
- "description": "Fetch a single booking by its Plumguide booking code."
27505
- }
27506
- ],
27507
- "responses": {
27508
- "200": {
27509
- "description": "Bookings"
27510
- },
27511
- "401": {
27512
- "$ref": "#/components/responses/Unauthorized"
27513
- },
27514
- "403": {
27515
- "$ref": "#/components/responses/ListingInactive"
27516
- },
27517
- "404": {
27518
- "$ref": "#/components/responses/NotFound"
27519
- },
27520
- "500": {
27521
- "$ref": "#/components/responses/InternalError"
27522
- }
27523
- }
27524
- }
27525
- },
27526
- "/v1/channels/plumguide/webhooks": {
27527
- "get": {
27528
- "operationId": "get_plumguide_webhooks",
27529
- "summary": "Get Plumguide webhook config",
27530
- "description": "Read the current Plumguide webhook configuration for this workspace.",
27531
- "tags": [
27532
- "Plumguide"
27533
- ],
27534
- "responses": {
27535
- "200": {
27536
- "description": "Webhook config"
27537
- },
27538
- "401": {
27539
- "$ref": "#/components/responses/Unauthorized"
27540
- },
27541
- "404": {
27542
- "$ref": "#/components/responses/NotFound"
27543
- },
27544
- "500": {
27545
- "$ref": "#/components/responses/InternalError"
27546
- }
27547
- }
27548
- },
27549
- "put": {
27550
- "operationId": "update_plumguide_webhooks",
27551
- "summary": "Replace Plumguide webhook config",
27552
- "description": "Replace the Plumguide webhook configuration. The body carries the full webhook config payload \u2014 this is a full replacement, not a patch.",
27553
- "tags": [
27554
- "Plumguide"
27555
- ],
27556
- "requestBody": {
27557
- "required": true,
27558
- "content": {
27559
- "application/json": {
27560
- "schema": {
27561
- "type": "object",
27562
- "additionalProperties": true,
27563
- "description": "Full Plumguide webhook config payload."
27564
- }
27565
- }
27566
- }
27567
- },
27568
- "responses": {
27569
- "200": {
27570
- "description": "Updated"
27571
- },
27572
- "400": {
27573
- "$ref": "#/components/responses/BadRequest"
27574
- },
27575
- "401": {
27576
- "$ref": "#/components/responses/Unauthorized"
27577
- },
27578
- "404": {
27579
- "$ref": "#/components/responses/NotFound"
27580
- },
27581
- "500": {
27582
- "$ref": "#/components/responses/InternalError"
27583
- }
27584
- }
27585
- },
27586
- "delete": {
27587
- "operationId": "delete_plumguide_webhooks",
27588
- "summary": "Remove Plumguide webhook config",
27589
- "description": "Delete the Plumguide webhook configuration for this workspace. Plumguide stops delivering webhooks until a new config is set.",
27590
- "tags": [
27591
- "Plumguide"
27592
- ],
27593
- "responses": {
27594
- "200": {
27595
- "description": "Deleted"
27596
- },
27597
- "401": {
27598
- "$ref": "#/components/responses/Unauthorized"
27599
- },
27600
- "404": {
27601
- "$ref": "#/components/responses/NotFound"
27602
- },
27603
- "500": {
27604
- "$ref": "#/components/responses/InternalError"
27605
- }
27606
- }
27607
- }
27608
- },
27609
27380
  "/v1/listings/{id}/pricing": {
27610
27381
  "get": {
27611
27382
  "operationId": "get_listing_pricing",
@@ -37098,6 +36869,11 @@
37098
36869
  "completed"
37099
36870
  ]
37100
36871
  },
36872
+ "notification_email": {
36873
+ "type": "string",
36874
+ "nullable": true,
36875
+ "description": "Vrbo only. Ask the host to add this address on Vrbo as a secondary email, with message and reservation notifications on. It is how new bookings, inquiries and guest messages reach Repull within a minute; without it they arrive at the next scheduled check. Hosted Connect asks for it on its mapping screen, so show it in your own flow when you map with `mapping: \"api\"`."
36876
+ },
37101
36877
  "units": {
37102
36878
  "type": "array",
37103
36879
  "items": {
@@ -37121,7 +36897,8 @@
37121
36897
  "nullable": true
37122
36898
  },
37123
36899
  "meta": {
37124
- "type": "object"
36900
+ "type": "object",
36901
+ "description": "Channel details that identify the unit. Booking.com Extranet: `hotel` (property name), `hotelId` (Booking.com property ID), `roomId` (Booking.com room ID), `city`. Vrbo: `headline`, `address`, `vrboStatus`; the Vrbo listing ID is `unit_id`."
37125
36902
  }
37126
36903
  }
37127
36904
  }