repull 0.2.25 → 0.2.26
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.
- checksums.yaml +4 -4
- data/lib/repull/api/connect_api.rb +2 -2
- data/lib/repull/api/conversations_api.rb +3 -0
- data/lib/repull/api/properties_api.rb +3 -0
- data/lib/repull/api/reservations_api.rb +3 -0
- data/lib/repull/api/reviews_api.rb +3 -0
- data/lib/repull/api/vrbo_api.rb +4 -4
- data/lib/repull/models/connect_session_completed_event.rb +281 -0
- data/lib/repull/models/connect_session_completed_payload.rb +210 -0
- data/lib/repull/models/conversation.rb +12 -1
- data/lib/repull/models/conversation_detail.rb +12 -1
- data/lib/repull/models/create_connect_session_request.rb +1 -1
- data/lib/repull/models/create_connection_request.rb +8 -8
- data/lib/repull/models/property.rb +14 -2
- data/lib/repull/models/record_account.rb +170 -0
- data/lib/repull/models/reservation.rb +12 -1
- data/lib/repull/models/review.rb +12 -1
- data/lib/repull/models/webhook_event.rb +2 -0
- data/lib/repull/models/webhook_event_type.rb +2 -1
- data/lib/repull/version.rb +1 -1
- data/lib/repull.rb +3 -0
- data/openapi/v1.json +164 -7
- data/scripts/regen.sh +1 -1
- metadata +4 -1
|
@@ -16,6 +16,9 @@ require 'time'
|
|
|
16
16
|
module Repull
|
|
17
17
|
# A booking/reservation from a connected PMS. Identical shape between list-row (`GET /v1/reservations`) and detail (`GET /v1/reservations/{id}`) — SDK consumers can use the same type for both. The canonical (post-2026-05) shape uses nested `primaryGuest`, `occupancy`, `financials` blocks. The legacy flat fields (`guestId`, `totalPrice`, `currency`, `guestDetails`) remain populated for back-compat and are marked `deprecated` here. New consumers should read from the nested blocks; existing consumers continue to work unchanged.
|
|
18
18
|
class Reservation < ApiModelBase
|
|
19
|
+
# The connected account this reservation belongs to. List endpoint.
|
|
20
|
+
attr_accessor :account
|
|
21
|
+
|
|
19
22
|
# Internal Repull reservation ID
|
|
20
23
|
attr_accessor :id
|
|
21
24
|
|
|
@@ -91,6 +94,7 @@ module Repull
|
|
|
91
94
|
# Attribute mapping from ruby-style variable name to JSON key.
|
|
92
95
|
def self.attribute_map
|
|
93
96
|
{
|
|
97
|
+
:'account' => :'account',
|
|
94
98
|
:'id' => :'id',
|
|
95
99
|
:'listing_id' => :'listingId',
|
|
96
100
|
:'guest_id' => :'guestId',
|
|
@@ -132,6 +136,7 @@ module Repull
|
|
|
132
136
|
# Attribute type mapping.
|
|
133
137
|
def self.openapi_types
|
|
134
138
|
{
|
|
139
|
+
:'account' => :'RecordAccount',
|
|
135
140
|
:'id' => :'String',
|
|
136
141
|
:'listing_id' => :'String',
|
|
137
142
|
:'guest_id' => :'String',
|
|
@@ -163,6 +168,7 @@ module Repull
|
|
|
163
168
|
# List of attributes with nullable: true
|
|
164
169
|
def self.openapi_nullable
|
|
165
170
|
Set.new([
|
|
171
|
+
:'account',
|
|
166
172
|
:'check_in_time',
|
|
167
173
|
:'check_out_time',
|
|
168
174
|
:'source',
|
|
@@ -189,6 +195,10 @@ module Repull
|
|
|
189
195
|
h[k.to_sym] = v
|
|
190
196
|
}
|
|
191
197
|
|
|
198
|
+
if attributes.key?(:'account')
|
|
199
|
+
self.account = attributes[:'account']
|
|
200
|
+
end
|
|
201
|
+
|
|
192
202
|
if attributes.key?(:'id')
|
|
193
203
|
self.id = attributes[:'id']
|
|
194
204
|
else
|
|
@@ -448,6 +458,7 @@ module Repull
|
|
|
448
458
|
def ==(o)
|
|
449
459
|
return true if self.equal?(o)
|
|
450
460
|
self.class == o.class &&
|
|
461
|
+
account == o.account &&
|
|
451
462
|
id == o.id &&
|
|
452
463
|
listing_id == o.listing_id &&
|
|
453
464
|
guest_id == o.guest_id &&
|
|
@@ -484,7 +495,7 @@ module Repull
|
|
|
484
495
|
# Calculates hash code according to all attributes.
|
|
485
496
|
# @return [Integer] Hash code
|
|
486
497
|
def hash
|
|
487
|
-
[id, listing_id, guest_id, check_in, check_out, check_in_time, check_out_time, status, status_detail, pending_reason, respond_by, source, platform, confirmation_code, unit, primary_guest, occupancy, financials, total_price, currency, guest_details, created_at, updated_at, booked_at, guest_name].hash
|
|
498
|
+
[account, id, listing_id, guest_id, check_in, check_out, check_in_time, check_out_time, status, status_detail, pending_reason, respond_by, source, platform, confirmation_code, unit, primary_guest, occupancy, financials, total_price, currency, guest_details, created_at, updated_at, booked_at, guest_name].hash
|
|
488
499
|
end
|
|
489
500
|
|
|
490
501
|
# Builds the object from hash
|
data/lib/repull/models/review.rb
CHANGED
|
@@ -16,6 +16,9 @@ require 'time'
|
|
|
16
16
|
module Repull
|
|
17
17
|
# A guest or host review unified across channels. Returned by `GET /v1/reviews` and `GET /v1/reviews/{id}`. Includes every channel's reviews once they have been imported.
|
|
18
18
|
class Review < ApiModelBase
|
|
19
|
+
# The connected account this review belongs to. List endpoint.
|
|
20
|
+
attr_accessor :account
|
|
21
|
+
|
|
19
22
|
# Internal Repull review id — pass back to `/v1/reviews/{id}`.
|
|
20
23
|
attr_accessor :id
|
|
21
24
|
|
|
@@ -75,6 +78,7 @@ module Repull
|
|
|
75
78
|
# Attribute mapping from ruby-style variable name to JSON key.
|
|
76
79
|
def self.attribute_map
|
|
77
80
|
{
|
|
81
|
+
:'account' => :'account',
|
|
78
82
|
:'id' => :'id',
|
|
79
83
|
:'external_id' => :'externalId',
|
|
80
84
|
:'platform' => :'platform',
|
|
@@ -113,6 +117,7 @@ module Repull
|
|
|
113
117
|
# Attribute type mapping.
|
|
114
118
|
def self.openapi_types
|
|
115
119
|
{
|
|
120
|
+
:'account' => :'RecordAccount',
|
|
116
121
|
:'id' => :'String',
|
|
117
122
|
:'external_id' => :'String',
|
|
118
123
|
:'platform' => :'String',
|
|
@@ -141,6 +146,7 @@ module Repull
|
|
|
141
146
|
# List of attributes with nullable: true
|
|
142
147
|
def self.openapi_nullable
|
|
143
148
|
Set.new([
|
|
149
|
+
:'account',
|
|
144
150
|
:'platform',
|
|
145
151
|
:'listing_id',
|
|
146
152
|
:'provider_property_id',
|
|
@@ -177,6 +183,10 @@ module Repull
|
|
|
177
183
|
h[k.to_sym] = v
|
|
178
184
|
}
|
|
179
185
|
|
|
186
|
+
if attributes.key?(:'account')
|
|
187
|
+
self.account = attributes[:'account']
|
|
188
|
+
end
|
|
189
|
+
|
|
180
190
|
if attributes.key?(:'id')
|
|
181
191
|
self.id = attributes[:'id']
|
|
182
192
|
end
|
|
@@ -288,6 +298,7 @@ module Repull
|
|
|
288
298
|
def ==(o)
|
|
289
299
|
return true if self.equal?(o)
|
|
290
300
|
self.class == o.class &&
|
|
301
|
+
account == o.account &&
|
|
291
302
|
id == o.id &&
|
|
292
303
|
external_id == o.external_id &&
|
|
293
304
|
platform == o.platform &&
|
|
@@ -321,7 +332,7 @@ module Repull
|
|
|
321
332
|
# Calculates hash code according to all attributes.
|
|
322
333
|
# @return [Integer] Hash code
|
|
323
334
|
def hash
|
|
324
|
-
[id, external_id, platform, listing_id, provider_property_id, reservation_id, reservation_confirmation_code, guest_id, guest_name, guest_avatar, reviewer_role, rating, categories, public_review, private_feedback, is_reviewee_recommended, response, submitted_at, updated_at, expires_at, hidden, language].hash
|
|
335
|
+
[account, id, external_id, platform, listing_id, provider_property_id, reservation_id, reservation_confirmation_code, guest_id, guest_name, guest_avatar, reviewer_role, rating, categories, public_review, private_feedback, is_reviewee_recommended, response, submitted_at, updated_at, expires_at, hidden, language].hash
|
|
325
336
|
end
|
|
326
337
|
|
|
327
338
|
# Builds the object from hash
|
|
@@ -25,6 +25,7 @@ module Repull
|
|
|
25
25
|
:'AiOperationCompletedEvent',
|
|
26
26
|
:'AiOperationFailedEvent',
|
|
27
27
|
:'CalendarUpdatedEvent',
|
|
28
|
+
:'ConnectSessionCompletedEvent',
|
|
28
29
|
:'InquiryCreatedEvent',
|
|
29
30
|
:'InquiryUpdatedEvent',
|
|
30
31
|
:'ListingCreatedEvent',
|
|
@@ -67,6 +68,7 @@ module Repull
|
|
|
67
68
|
:'ai.operation.completed' => :'AiOperationCompletedEvent',
|
|
68
69
|
:'ai.operation.failed' => :'AiOperationFailedEvent',
|
|
69
70
|
:'calendar.updated' => :'CalendarUpdatedEvent',
|
|
71
|
+
:'connect.session.completed' => :'ConnectSessionCompletedEvent',
|
|
70
72
|
:'inquiry.created' => :'InquiryCreatedEvent',
|
|
71
73
|
:'inquiry.updated' => :'InquiryUpdatedEvent',
|
|
72
74
|
:'listing.created' => :'ListingCreatedEvent',
|
|
@@ -34,6 +34,7 @@ module Repull
|
|
|
34
34
|
LISTING_REACTIVATED = "listing.reactivated".freeze
|
|
35
35
|
CALENDAR_UPDATED = "calendar.updated".freeze
|
|
36
36
|
ACCOUNT_CREATED = "account.created".freeze
|
|
37
|
+
CONNECT_SESSION_COMPLETED = "connect.session.completed".freeze
|
|
37
38
|
ACCOUNT_DISCONNECTED = "account.disconnected".freeze
|
|
38
39
|
REVIEW_CREATED = "review.created".freeze
|
|
39
40
|
REVIEW_RESPONDED = "review.responded".freeze
|
|
@@ -48,7 +49,7 @@ module Repull
|
|
|
48
49
|
USAGE_QUOTA_WARNING = "usage.quota.warning".freeze
|
|
49
50
|
|
|
50
51
|
def self.all_vars
|
|
51
|
-
@all_vars ||= [RESERVATION_CREATED, RESERVATION_UPDATED, RESERVATION_CANCELLED, RESERVATION_MESSAGE_RECEIVED, RESERVATION_MESSAGE_SENT, RESERVATION_MESSAGE_UPDATED, RESERVATION_ALTERATION_CREATED, RESERVATION_ALTERATION_RESPONDED, RESERVATION_REQUEST_CREATED, RESERVATION_REQUEST_UPDATED, INQUIRY_CREATED, INQUIRY_UPDATED, LISTING_CREATED, LISTING_UPDATED, LISTING_DELETED, LISTING_SUSPENDED, LISTING_REACTIVATED, CALENDAR_UPDATED, ACCOUNT_CREATED, ACCOUNT_DISCONNECTED, REVIEW_CREATED, REVIEW_RESPONDED, AI_OPERATION_COMPLETED, AI_OPERATION_FAILED, PAYMENT_COMPLETED, PAYMENT_REFUNDED, PAYOUT_COMPLETED, MIGRATION_COMPLETED, MIGRATION_FAILED, REPULL_PING, USAGE_QUOTA_WARNING].freeze
|
|
52
|
+
@all_vars ||= [RESERVATION_CREATED, RESERVATION_UPDATED, RESERVATION_CANCELLED, RESERVATION_MESSAGE_RECEIVED, RESERVATION_MESSAGE_SENT, RESERVATION_MESSAGE_UPDATED, RESERVATION_ALTERATION_CREATED, RESERVATION_ALTERATION_RESPONDED, RESERVATION_REQUEST_CREATED, RESERVATION_REQUEST_UPDATED, INQUIRY_CREATED, INQUIRY_UPDATED, LISTING_CREATED, LISTING_UPDATED, LISTING_DELETED, LISTING_SUSPENDED, LISTING_REACTIVATED, CALENDAR_UPDATED, ACCOUNT_CREATED, CONNECT_SESSION_COMPLETED, ACCOUNT_DISCONNECTED, REVIEW_CREATED, REVIEW_RESPONDED, AI_OPERATION_COMPLETED, AI_OPERATION_FAILED, PAYMENT_COMPLETED, PAYMENT_REFUNDED, PAYOUT_COMPLETED, MIGRATION_COMPLETED, MIGRATION_FAILED, REPULL_PING, USAGE_QUOTA_WARNING].freeze
|
|
52
53
|
end
|
|
53
54
|
|
|
54
55
|
# Builds the enum from string
|
data/lib/repull/version.rb
CHANGED
data/lib/repull.rb
CHANGED
|
@@ -160,6 +160,8 @@ require 'repull/models/connect_host'
|
|
|
160
160
|
require 'repull/models/connect_provider'
|
|
161
161
|
require 'repull/models/connect_provider_list_response'
|
|
162
162
|
require 'repull/models/connect_session'
|
|
163
|
+
require 'repull/models/connect_session_completed_event'
|
|
164
|
+
require 'repull/models/connect_session_completed_payload'
|
|
163
165
|
require 'repull/models/connect_status'
|
|
164
166
|
require 'repull/models/connect_status_accounts_inner'
|
|
165
167
|
require 'repull/models/connection'
|
|
@@ -453,6 +455,7 @@ require 'repull/models/property_list_response'
|
|
|
453
455
|
require 'repull/models/publish_section_error'
|
|
454
456
|
require 'repull/models/quote'
|
|
455
457
|
require 'repull/models/quote_pricing'
|
|
458
|
+
require 'repull/models/record_account'
|
|
456
459
|
require 'repull/models/reorder_airbnb_listing_photos200_response'
|
|
457
460
|
require 'repull/models/reorder_airbnb_listing_photos200_response_data'
|
|
458
461
|
require 'repull/models/reorder_airbnb_listing_photos_request'
|
data/openapi/v1.json
CHANGED
|
@@ -151,8 +151,15 @@
|
|
|
151
151
|
"schemas": {
|
|
152
152
|
"Property": {
|
|
153
153
|
"type": "object",
|
|
154
|
-
"description": "A vacation rental property in your Repull workspace. Backed by the core `listings` row \u2014 enriched per-PMS fields (bedrooms, property type, provider id, etc.) live in provider-specific detail tables and are NOT returned here.\n\nField availability differs by endpoint:\n- `channels` is returned by the list endpoint (`GET /v1/properties`) only.\n- `latitude`, `longitude`, `createdAt`, and `amenities` are returned by the detail endpoint (`GET /v1/properties/{id}`) only. `amenities` requires `?include=amenities`.\n\nAn **inactive** property (`status: inactive`) appears only in the list endpoint, and only when `?status=inactive|all` asks for it. Such a row carries identity fields only \u2014 `id`, `name`, `status`, `lifecycleStatus`, `channels`, `updatedAt` \u2014 so every other field is absent until the property is activated. Every other endpoint answers `403 listing_inactive` for it.",
|
|
154
|
+
"description": "A vacation rental property in your Repull workspace. Backed by the core `listings` row \u2014 enriched per-PMS fields (bedrooms, property type, provider id, etc.) live in provider-specific detail tables and are NOT returned here.\n\nField availability differs by endpoint:\n- `channels` is returned by the list endpoint (`GET /v1/properties`) only.\n- `latitude`, `longitude`, `createdAt`, and `amenities` are returned by the detail endpoint (`GET /v1/properties/{id}`) only. `amenities` requires `?include=amenities`.\n\nAn **inactive** property (`status: inactive`) appears only in the list endpoint, and only when `?status=inactive|all` asks for it. Such a row carries identity fields only \u2014 `id`, `name`, `status`, `lifecycleStatus`, `channels`, `accounts`, `updatedAt` \u2014 so every other field is absent until the property is activated. Every other endpoint answers `403 listing_inactive` for it.",
|
|
155
155
|
"properties": {
|
|
156
|
+
"accounts": {
|
|
157
|
+
"type": "array",
|
|
158
|
+
"items": {
|
|
159
|
+
"$ref": "#/components/schemas/RecordAccount"
|
|
160
|
+
},
|
|
161
|
+
"description": "The connected account the property belongs to on each channel it is on. List endpoint."
|
|
162
|
+
},
|
|
156
163
|
"id": {
|
|
157
164
|
"type": "string",
|
|
158
165
|
"description": "Internal Repull property ID. Equal to the listing id (`listings.id`); the same integer is used as `listingId` on reservations and `propertyId` on availability."
|
|
@@ -537,6 +544,14 @@
|
|
|
537
544
|
"type": "object",
|
|
538
545
|
"description": "A booking/reservation from a connected PMS. Identical shape between list-row (`GET /v1/reservations`) and detail (`GET /v1/reservations/{id}`) \u2014 SDK consumers can use the same type for both.\n\nThe canonical (post-2026-05) shape uses nested `primaryGuest`, `occupancy`, `financials` blocks. The legacy flat fields (`guestId`, `totalPrice`, `currency`, `guestDetails`) remain populated for back-compat and are marked `deprecated` here. New consumers should read from the nested blocks; existing consumers continue to work unchanged.",
|
|
539
546
|
"properties": {
|
|
547
|
+
"account": {
|
|
548
|
+
"allOf": [
|
|
549
|
+
{
|
|
550
|
+
"$ref": "#/components/schemas/RecordAccount"
|
|
551
|
+
}
|
|
552
|
+
],
|
|
553
|
+
"description": "The connected account this reservation belongs to. List endpoint."
|
|
554
|
+
},
|
|
540
555
|
"id": {
|
|
541
556
|
"type": "string",
|
|
542
557
|
"description": "Internal Repull reservation ID"
|
|
@@ -977,6 +992,14 @@
|
|
|
977
992
|
"type": "object",
|
|
978
993
|
"description": "Channel-agnostic message thread between the host workspace and a guest. Returned by `GET /v1/conversations`. The `id` is the internal Repull thread id (integer) \u2014 pass it back as the `{id}` path param on detail / messages calls.",
|
|
979
994
|
"properties": {
|
|
995
|
+
"account": {
|
|
996
|
+
"allOf": [
|
|
997
|
+
{
|
|
998
|
+
"$ref": "#/components/schemas/RecordAccount"
|
|
999
|
+
}
|
|
1000
|
+
],
|
|
1001
|
+
"description": "The connected account this conversation belongs to. List endpoint."
|
|
1002
|
+
},
|
|
980
1003
|
"id": {
|
|
981
1004
|
"type": "string"
|
|
982
1005
|
},
|
|
@@ -1319,6 +1342,14 @@
|
|
|
1319
1342
|
"type": "object",
|
|
1320
1343
|
"description": "A guest or host review unified across channels. Returned by `GET /v1/reviews` and `GET /v1/reviews/{id}`. Includes every channel's reviews once they have been imported.",
|
|
1321
1344
|
"properties": {
|
|
1345
|
+
"account": {
|
|
1346
|
+
"allOf": [
|
|
1347
|
+
{
|
|
1348
|
+
"$ref": "#/components/schemas/RecordAccount"
|
|
1349
|
+
}
|
|
1350
|
+
],
|
|
1351
|
+
"description": "The connected account this review belongs to. List endpoint."
|
|
1352
|
+
},
|
|
1322
1353
|
"id": {
|
|
1323
1354
|
"type": "string",
|
|
1324
1355
|
"description": "Internal Repull review id \u2014 pass back to `/v1/reviews/{id}`."
|
|
@@ -2491,6 +2522,7 @@
|
|
|
2491
2522
|
"listing.reactivated",
|
|
2492
2523
|
"calendar.updated",
|
|
2493
2524
|
"account.created",
|
|
2525
|
+
"connect.session.completed",
|
|
2494
2526
|
"account.disconnected",
|
|
2495
2527
|
"review.created",
|
|
2496
2528
|
"review.responded",
|
|
@@ -3543,6 +3575,46 @@
|
|
|
3543
3575
|
}
|
|
3544
3576
|
}
|
|
3545
3577
|
},
|
|
3578
|
+
"ConnectSessionCompletedPayload": {
|
|
3579
|
+
"type": "object",
|
|
3580
|
+
"description": "Payload for `connect.session.completed`. A user finished a Connect session, on any channel or PMS. Use `state` (your token from session creation) or `sessionId` to tie the connection to your own user; the account it names is keyed the same way as every other event's `account` block.",
|
|
3581
|
+
"properties": {
|
|
3582
|
+
"sessionId": {
|
|
3583
|
+
"type": "string",
|
|
3584
|
+
"example": "cs_abc123"
|
|
3585
|
+
},
|
|
3586
|
+
"state": {
|
|
3587
|
+
"type": "string",
|
|
3588
|
+
"nullable": true,
|
|
3589
|
+
"description": "The `state` you passed when creating the session.",
|
|
3590
|
+
"example": "user_8421"
|
|
3591
|
+
},
|
|
3592
|
+
"provider": {
|
|
3593
|
+
"type": "string",
|
|
3594
|
+
"nullable": true,
|
|
3595
|
+
"description": "Channel or PMS: airbnb, booking, booking_extranet, vrbo, plumguide, hostaway, \u2026",
|
|
3596
|
+
"example": "vrbo"
|
|
3597
|
+
},
|
|
3598
|
+
"externalAccountId": {
|
|
3599
|
+
"type": "string",
|
|
3600
|
+
"nullable": true,
|
|
3601
|
+
"description": "The provider's own account id \u2014 Airbnb host id, Booking.com hotel id, Vrbo account id, or the PMS account.",
|
|
3602
|
+
"example": "36"
|
|
3603
|
+
},
|
|
3604
|
+
"connectionId": {
|
|
3605
|
+
"type": "integer",
|
|
3606
|
+
"nullable": true,
|
|
3607
|
+
"description": "Repull connection id, when the account has one (the `X-Account-Id` value)."
|
|
3608
|
+
},
|
|
3609
|
+
"purpose": {
|
|
3610
|
+
"type": "string"
|
|
3611
|
+
},
|
|
3612
|
+
"completedAt": {
|
|
3613
|
+
"type": "string",
|
|
3614
|
+
"format": "date-time"
|
|
3615
|
+
}
|
|
3616
|
+
}
|
|
3617
|
+
},
|
|
3546
3618
|
"AccountDisconnectedPayload": {
|
|
3547
3619
|
"type": "object",
|
|
3548
3620
|
"description": "Payload for `account.disconnected`. A PMS or channel connection was revoked, expired, or rejected by the upstream provider.",
|
|
@@ -3892,6 +3964,29 @@
|
|
|
3892
3964
|
}
|
|
3893
3965
|
}
|
|
3894
3966
|
},
|
|
3967
|
+
"RecordAccount": {
|
|
3968
|
+
"type": "object",
|
|
3969
|
+
"nullable": true,
|
|
3970
|
+
"description": "The connected account a record belongs to \u2014 keyed exactly like the webhook `account` block and `connect.session.completed`, so one `provider:externalAccountId` key routes reads and events to the same user. `null` when it cannot be resolved (never guessed).",
|
|
3971
|
+
"properties": {
|
|
3972
|
+
"provider": {
|
|
3973
|
+
"type": "string",
|
|
3974
|
+
"example": "airbnb",
|
|
3975
|
+
"description": "airbnb, booking, booking_extranet, vrbo, or the PMS id (hostaway, cloudbeds, \u2026)."
|
|
3976
|
+
},
|
|
3977
|
+
"externalAccountId": {
|
|
3978
|
+
"type": "string",
|
|
3979
|
+
"example": "79730216",
|
|
3980
|
+
"description": "The provider's own account id \u2014 Airbnb host id, Booking.com hotel id, Extranet login, Vrbo account, or the PMS account."
|
|
3981
|
+
},
|
|
3982
|
+
"connectionId": {
|
|
3983
|
+
"type": "string",
|
|
3984
|
+
"nullable": true,
|
|
3985
|
+
"description": "Repull connection id (`X-Account-Id`), when the account has one. A string, like every id in API responses.",
|
|
3986
|
+
"example": "126"
|
|
3987
|
+
}
|
|
3988
|
+
}
|
|
3989
|
+
},
|
|
3895
3990
|
"WebhookEventAccount": {
|
|
3896
3991
|
"type": "object",
|
|
3897
3992
|
"nullable": true,
|
|
@@ -4599,6 +4694,42 @@
|
|
|
4599
4694
|
}
|
|
4600
4695
|
}
|
|
4601
4696
|
},
|
|
4697
|
+
"ConnectSessionCompletedEvent": {
|
|
4698
|
+
"type": "object",
|
|
4699
|
+
"required": [
|
|
4700
|
+
"event",
|
|
4701
|
+
"eventId",
|
|
4702
|
+
"apiVersion",
|
|
4703
|
+
"timestamp",
|
|
4704
|
+
"data"
|
|
4705
|
+
],
|
|
4706
|
+
"properties": {
|
|
4707
|
+
"event": {
|
|
4708
|
+
"type": "string",
|
|
4709
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
4710
|
+
},
|
|
4711
|
+
"eventId": {
|
|
4712
|
+
"type": "string",
|
|
4713
|
+
"format": "uuid",
|
|
4714
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
4715
|
+
},
|
|
4716
|
+
"apiVersion": {
|
|
4717
|
+
"type": "string",
|
|
4718
|
+
"example": "2026-04"
|
|
4719
|
+
},
|
|
4720
|
+
"timestamp": {
|
|
4721
|
+
"type": "string",
|
|
4722
|
+
"format": "date-time",
|
|
4723
|
+
"description": "When this delivery was built."
|
|
4724
|
+
},
|
|
4725
|
+
"account": {
|
|
4726
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
4727
|
+
},
|
|
4728
|
+
"data": {
|
|
4729
|
+
"$ref": "#/components/schemas/ConnectSessionCompletedPayload"
|
|
4730
|
+
}
|
|
4731
|
+
}
|
|
4732
|
+
},
|
|
4602
4733
|
"AccountDisconnectedEvent": {
|
|
4603
4734
|
"type": "object",
|
|
4604
4735
|
"required": [
|
|
@@ -5156,6 +5287,9 @@
|
|
|
5156
5287
|
{
|
|
5157
5288
|
"$ref": "#/components/schemas/AccountCreatedEvent"
|
|
5158
5289
|
},
|
|
5290
|
+
{
|
|
5291
|
+
"$ref": "#/components/schemas/ConnectSessionCompletedEvent"
|
|
5292
|
+
},
|
|
5159
5293
|
{
|
|
5160
5294
|
"$ref": "#/components/schemas/AccountDisconnectedEvent"
|
|
5161
5295
|
},
|
|
@@ -5215,6 +5349,7 @@
|
|
|
5215
5349
|
"listing.reactivated": "#/components/schemas/ListingReactivatedEvent",
|
|
5216
5350
|
"calendar.updated": "#/components/schemas/CalendarUpdatedEvent",
|
|
5217
5351
|
"account.created": "#/components/schemas/AccountCreatedEvent",
|
|
5352
|
+
"connect.session.completed": "#/components/schemas/ConnectSessionCompletedEvent",
|
|
5218
5353
|
"account.disconnected": "#/components/schemas/AccountDisconnectedEvent",
|
|
5219
5354
|
"review.created": "#/components/schemas/ReviewCreatedEvent",
|
|
5220
5355
|
"review.responded": "#/components/schemas/ReviewRespondedEvent",
|
|
@@ -12935,6 +13070,16 @@
|
|
|
12935
13070
|
"example": "2026-08-01T00:00:00Z"
|
|
12936
13071
|
}
|
|
12937
13072
|
},
|
|
13073
|
+
"Account": {
|
|
13074
|
+
"name": "account",
|
|
13075
|
+
"in": "query",
|
|
13076
|
+
"required": false,
|
|
13077
|
+
"schema": {
|
|
13078
|
+
"type": "string",
|
|
13079
|
+
"example": "airbnb:79730216"
|
|
13080
|
+
},
|
|
13081
|
+
"description": "Only the records of one connected account, as `provider:externalAccountId` \u2014 the pair from a webhook `account` block, `connect.session.completed`, or `GET /v1/connect/{provider}` \u2192 `accounts`. A record belongs to an account when it is on that account's listings and on its channel (a PMS account: came in through that PMS). An account with no listings returns an empty page."
|
|
13082
|
+
},
|
|
12938
13083
|
"Offset": {
|
|
12939
13084
|
"name": "offset",
|
|
12940
13085
|
"in": "query",
|
|
@@ -13546,6 +13691,9 @@
|
|
|
13546
13691
|
"Properties"
|
|
13547
13692
|
],
|
|
13548
13693
|
"parameters": [
|
|
13694
|
+
{
|
|
13695
|
+
"$ref": "#/components/parameters/Account"
|
|
13696
|
+
},
|
|
13549
13697
|
{
|
|
13550
13698
|
"name": "limit",
|
|
13551
13699
|
"in": "query",
|
|
@@ -13816,6 +13964,9 @@
|
|
|
13816
13964
|
"Reservations"
|
|
13817
13965
|
],
|
|
13818
13966
|
"parameters": [
|
|
13967
|
+
{
|
|
13968
|
+
"$ref": "#/components/parameters/Account"
|
|
13969
|
+
},
|
|
13819
13970
|
{
|
|
13820
13971
|
"$ref": "#/components/parameters/XSchemaHeader"
|
|
13821
13972
|
},
|
|
@@ -14427,6 +14578,9 @@
|
|
|
14427
14578
|
"Conversations"
|
|
14428
14579
|
],
|
|
14429
14580
|
"parameters": [
|
|
14581
|
+
{
|
|
14582
|
+
"$ref": "#/components/parameters/Account"
|
|
14583
|
+
},
|
|
14430
14584
|
{
|
|
14431
14585
|
"$ref": "#/components/parameters/XSchemaHeader"
|
|
14432
14586
|
},
|
|
@@ -15065,6 +15219,9 @@
|
|
|
15065
15219
|
"Reviews"
|
|
15066
15220
|
],
|
|
15067
15221
|
"parameters": [
|
|
15222
|
+
{
|
|
15223
|
+
"$ref": "#/components/parameters/Account"
|
|
15224
|
+
},
|
|
15068
15225
|
{
|
|
15069
15226
|
"$ref": "#/components/parameters/XSchemaHeader"
|
|
15070
15227
|
},
|
|
@@ -15329,7 +15486,7 @@
|
|
|
15329
15486
|
"state": {
|
|
15330
15487
|
"type": "string",
|
|
15331
15488
|
"nullable": true,
|
|
15332
|
-
"description": "
|
|
15489
|
+
"description": "Your own correlation token, e.g. your user id (at most 500 characters). Echoed in this response, on the redirect back (`&state=`), in the popup message, and in the `connect.session.completed` webhook."
|
|
15333
15490
|
},
|
|
15334
15491
|
"accessType": {
|
|
15335
15492
|
"type": "string",
|
|
@@ -15552,7 +15709,7 @@
|
|
|
15552
15709
|
"post": {
|
|
15553
15710
|
"operationId": "create_connection",
|
|
15554
15711
|
"summary": "Connect to PMS/OTA provider",
|
|
15555
|
-
"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\
|
|
15712
|
+
"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`.",
|
|
15556
15713
|
"tags": [
|
|
15557
15714
|
"Connect"
|
|
15558
15715
|
],
|
|
@@ -15583,9 +15740,9 @@
|
|
|
15583
15740
|
"default": "full_access",
|
|
15584
15741
|
"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."
|
|
15585
15742
|
},
|
|
15586
|
-
"
|
|
15743
|
+
"state": {
|
|
15587
15744
|
"type": "string",
|
|
15588
|
-
"description": "
|
|
15745
|
+
"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."
|
|
15589
15746
|
},
|
|
15590
15747
|
"clientId": {
|
|
15591
15748
|
"type": "string",
|
|
@@ -24181,7 +24338,7 @@
|
|
|
24181
24338
|
"get": {
|
|
24182
24339
|
"operationId": "list_vrbo_listings",
|
|
24183
24340
|
"summary": "List VRBO listings",
|
|
24184
|
-
"description": "List
|
|
24341
|
+
"description": "List the Vrbo units linked to this workspace's listings, from the host's connected Vrbo account (host sign-in, beta).\n\nInactive listings are left out; they keep syncing and reappear once activated. Use `GET /v1/listings?status=inactive` to find them.",
|
|
24185
24342
|
"tags": [
|
|
24186
24343
|
"VRBO"
|
|
24187
24344
|
],
|
|
@@ -24203,7 +24360,7 @@
|
|
|
24203
24360
|
"get": {
|
|
24204
24361
|
"operationId": "list_vrbo_reservations",
|
|
24205
24362
|
"summary": "List VRBO reservations",
|
|
24206
|
-
"description": "Cursor-paginated list of
|
|
24363
|
+
"description": "Cursor-paginated list of Vrbo reservations imported from the host's connected Vrbo account (host sign-in, beta). The full normalised record \u2014 guest, price breakdown, policy \u2014 is on `GET /v1/reservations?platform=vrbo`. `?offset=` is accepted as a first-class alias for `?cursor=` (mutually exclusive; offset capped at 10000).\n\nReservations on inactive listings are left out (counts and cursors included); they keep syncing and reappear once the listing is activated.",
|
|
24207
24364
|
"tags": [
|
|
24208
24365
|
"VRBO"
|
|
24209
24366
|
],
|
data/scripts/regen.sh
CHANGED
|
@@ -73,7 +73,7 @@ npx --yes @openapitools/openapi-generator-cli@latest generate \
|
|
|
73
73
|
-i "$SPEC_PATH" \
|
|
74
74
|
-g ruby \
|
|
75
75
|
-o "$GEN_OUT" \
|
|
76
|
-
--additional-properties=gemName=repull,moduleName=Repull,gemVersion=0.2.
|
|
76
|
+
--additional-properties=gemName=repull,moduleName=Repull,gemVersion=0.2.26
|
|
77
77
|
|
|
78
78
|
echo "==> syncing lib/ + docs/"
|
|
79
79
|
rm -rf "$ROOT/lib/repull" "$ROOT/lib/repull.rb" "$ROOT/docs"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: repull
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.26
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ivan Nikolov
|
|
@@ -236,6 +236,8 @@ files:
|
|
|
236
236
|
- lib/repull/models/connect_provider.rb
|
|
237
237
|
- lib/repull/models/connect_provider_list_response.rb
|
|
238
238
|
- lib/repull/models/connect_session.rb
|
|
239
|
+
- lib/repull/models/connect_session_completed_event.rb
|
|
240
|
+
- lib/repull/models/connect_session_completed_payload.rb
|
|
239
241
|
- lib/repull/models/connect_status.rb
|
|
240
242
|
- lib/repull/models/connect_status_accounts_inner.rb
|
|
241
243
|
- lib/repull/models/connection.rb
|
|
@@ -529,6 +531,7 @@ files:
|
|
|
529
531
|
- lib/repull/models/publish_section_error.rb
|
|
530
532
|
- lib/repull/models/quote.rb
|
|
531
533
|
- lib/repull/models/quote_pricing.rb
|
|
534
|
+
- lib/repull/models/record_account.rb
|
|
532
535
|
- lib/repull/models/reorder_airbnb_listing_photos200_response.rb
|
|
533
536
|
- lib/repull/models/reorder_airbnb_listing_photos200_response_data.rb
|
|
534
537
|
- lib/repull/models/reorder_airbnb_listing_photos_request.rb
|