repull 0.2.26 → 0.2.27
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/airbnb_api.rb +38 -23
- data/lib/repull/api/booking_com_api.rb +9 -2
- data/lib/repull/api/connect_api.rb +4 -4
- data/lib/repull/api/listings_api.rb +2 -2
- data/lib/repull/api/properties_api.rb +2 -2
- data/lib/repull/api/reservations_api.rb +93 -6
- data/lib/repull/api/vrbo_api.rb +9 -2
- data/lib/repull/models/airbnb_listing.rb +13 -2
- data/lib/repull/models/airbnb_listing_details_write_request.rb +109 -5
- data/lib/repull/models/airbnb_listing_details_write_request_check_in_option.rb +1 -1
- data/lib/repull/models/airbnb_permits_write_request_permits_inner.rb +2 -2
- data/lib/repull/models/airbnb_pricing_write_request.rb +30 -2
- data/lib/repull/models/airbnb_pricing_write_request_fees_inner.rb +291 -0
- data/lib/repull/models/booking_property_listings_inner.rb +57 -1
- data/lib/repull/models/cancel_reservation200_response.rb +1 -1
- data/lib/repull/models/connect_status.rb +35 -4
- data/lib/repull/models/connect_status_capabilities.rb +148 -0
- data/lib/repull/models/connection.rb +28 -5
- data/lib/repull/models/connection_action.rb +188 -0
- data/lib/repull/models/create_connect_session_request.rb +39 -1
- data/lib/repull/models/create_connection_request.rb +39 -1
- data/lib/repull/models/error_error.rb +13 -1
- data/lib/repull/models/{cancel_reservation200_response_pms.rb → error_error_listings_inner.rb} +36 -30
- data/lib/repull/models/get_booking_extranet_login_status200_response.rb +2 -1
- data/lib/repull/models/list_listing_units200_response.rb +2 -1
- data/lib/repull/models/listing.rb +23 -2
- data/lib/repull/models/listing_capabilities.rb +148 -0
- data/lib/repull/models/property.rb +14 -3
- data/lib/repull/models/reservation_capabilities.rb +230 -0
- data/lib/repull/models/reservation_create_request.rb +172 -33
- data/lib/repull/models/reservation_create_response.rb +6 -6
- data/lib/repull/models/reservation_create_response_unit.rb +1 -1
- data/lib/repull/models/{reservation_create_response_pms.rb → reservation_pms_outcome.rb} +38 -8
- data/lib/repull/models/reservation_pms_outcome_quote.rb +168 -0
- data/lib/repull/models/{cancel_reservation200_response_pms_errors_inner.rb → reservation_pms_section_error.rb} +16 -16
- data/lib/repull/models/reservation_quote_request.rb +312 -0
- data/lib/repull/models/reservation_quote_response.rb +228 -0
- data/lib/repull/models/reservation_quote_response_breakdown.rb +175 -0
- data/lib/repull/models/reservation_update_response.rb +16 -6
- data/lib/repull/models/submit_smoobu_credentials_request.rb +2 -5
- data/lib/repull/models/submit_smoobu_credentials_request_credentials.rb +193 -0
- data/lib/repull/models/update_airbnb_checkin_guide200_response.rb +147 -0
- data/lib/repull/models/update_airbnb_checkin_guide200_response_data.rb +177 -0
- data/lib/repull/models/{airbnb_permits_write_request_permits_inner_answers_value.rb → update_airbnb_checkin_guide200_response_data_steps_inner.rb} +24 -43
- data/lib/repull/models/update_airbnb_checkin_guide_request.rb +186 -0
- data/lib/repull/models/update_airbnb_checkin_guide_request_steps_inner.rb +182 -0
- data/lib/repull/version.rb +1 -1
- data/lib/repull.rb +18 -4
- data/openapi/v1.json +2059 -335
- data/scripts/regen.sh +1 -1
- metadata +20 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7e8fbc23eb3c3a2167a88f127699dcb1e2e3c8d7e8560b326a0c1fd34119089f
|
|
4
|
+
data.tar.gz: dc06a931b4c2a1aeb5d18c33ec90783980926bdd10280655d99e0de42b2ea64f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0b81eee51bf0a9c4eebeaa63626cd8cd1d3f177cdd3e70a90da91f12f3f8fadd8b5347c46911b42e958303cce7bcc22c79f4b99da6fd7ca8d57c04787419919f
|
|
7
|
+
data.tar.gz: 640e651cf434400925d6cc435b9994fdd41526fa14f4a3dcdacf607d4d2b24da1a89aa0cfbccfedd9e22b9e6c132cb47124122db297dd4c084d231a4911d0180
|
|
@@ -2177,8 +2177,9 @@ module Repull
|
|
|
2177
2177
|
end
|
|
2178
2178
|
|
|
2179
2179
|
# List Airbnb listings
|
|
2180
|
-
# List every Airbnb listing this workspace has access to via the connected Airbnb account. **Pure DB read — never calls Airbnb upstream.** The connect flow is what populates the local cache; the API serves what's already there. Customers with a disconnected host still see their last-synced data, with the top-level `dataFreshness` envelope flagging the staleness and pointing at the reconnect URL. Pass `?include=amenities` to enrich each connection with its locally-cached amenity set. Returns `null` per connection when the cache is empty. Pass `?include=thumbnail` to add `thumbnailUrl` to each listing — one extra column on the query that already runs, so a selection screen renders from a single request instead of one call per listing. `null` when the listing has no thumbnail stored. Combine comma-separated, e.g. `?include=amenities,thumbnail`. **Can this listing be written to?** Every connection carries `syncCategory` — Airbnb's own per-listing API sync decision (`sync_all`, `sync_rates_and_availability`, or `none`) — and `writable`, which is `false` exactly when that category is `none`. Airbnb authorises sync one listing at a time, so a connected account can still hold listings Airbnb refuses every write to; a write to one of those returns `403 listing_not_api_connected` before anything is sent, and reconnecting the account does not change it (the host must switch the listing on in Airbnb). Check `writable` here before a portfolio-wide push instead of discovering it one 403 at a time. Inactive listings are left out; they
|
|
2180
|
+
# List every Airbnb listing this workspace has access to via the connected Airbnb account. **Pure DB read — never calls Airbnb upstream.** The connect flow is what populates the local cache; the API serves what's already there. Customers with a disconnected host still see their last-synced data, with the top-level `dataFreshness` envelope flagging the staleness and pointing at the reconnect URL. Pass `?include=amenities` to enrich each connection with its locally-cached amenity set. Returns `null` per connection when the cache is empty. Pass `?include=thumbnail` to add `thumbnailUrl` to each listing — one extra column on the query that already runs, so a selection screen renders from a single request instead of one call per listing. `null` when the listing has no thumbnail stored. Combine comma-separated, e.g. `?include=amenities,thumbnail`. **Can this listing be written to?** Every connection carries `syncCategory` — Airbnb's own per-listing API sync decision (`sync_all`, `sync_rates_and_availability`, or `none`) — and `writable`, which is `false` exactly when that category is `none`. Airbnb authorises sync one listing at a time, so a connected account can still hold listings Airbnb refuses every write to; a write to one of those returns `403 listing_not_api_connected` before anything is sent, and reconnecting the account does not change it (the host must switch the listing on in Airbnb). Check `writable` here before a portfolio-wide push instead of discovering it one 403 at a time. Inactive listings are left out unless `?status=inactive|all` asks for them; they then come back with identity fields only — `listingId`, `name`, `city`, `status`, `inactiveReason` (`plan_limit`, `unlisted_on_airbnb` or `deactivated`) and each connection's ids and account — so you can show the user what to activate. They keep syncing and are complete again once activated. **Several Airbnb accounts?** A workspace can connect more than one. By default this returns every connected account's rows; pass `?account_id=<airbnb host id>` to scope to one. Every row carries `accountId` + `accountName` either way, and `dataFreshness.accounts[]` reports each account's freshness separately, so one disconnected host no longer marks the whole response stale.
|
|
2181
2181
|
# @param [Hash] opts the optional parameters
|
|
2182
|
+
# @option opts [String] :status `active` (default) leaves inactive listings out. `inactive` returns only them and `all` returns both. An inactive listing comes back with identity fields only (ids, `name`, `city`, `status`, `inactiveReason`, its account), which is enough to show what can be activated. Every row carries `status`. (default to 'active')
|
|
2182
2183
|
# @option opts [String] :account_id Scope the response to ONE connected Airbnb account. The value is the Airbnb host id — the same `accounts[].externalAccountId` that `GET /v1/connect/airbnb` returns and `DELETE /v1/connect/airbnb?accountId=` accepts. A workspace can connect several Airbnb accounts. Omit this and you get every account's rows (the default, unchanged). Every row carries `accountId` + `accountName` either way, so you can group without a second call. An id that is not connected to THIS workspace returns `404 not_found` with your own ids in `valid_values` — we do not distinguish \"no such host\" from \"someone else's host\", because confirming the latter would leak another workspace's account. Note this is NOT the `X-Account-Id` header, which carries a connection id and cannot tell two Airbnb hosts apart.
|
|
2183
2184
|
# @option opts [String] :include Comma-separated expansions. Currently supported: `amenities` (adds `amenities` and `accessibility_amenities` arrays to each connection, sourced from the local `listings_airbnb_amenities` cache) and `thumbnail` (adds `thumbnailUrl` to each listing). Unknown values return 422 with a `valid_values` envelope.
|
|
2184
2185
|
# @return [AirbnbListingListResponse]
|
|
@@ -2188,8 +2189,9 @@ module Repull
|
|
|
2188
2189
|
end
|
|
2189
2190
|
|
|
2190
2191
|
# List Airbnb listings
|
|
2191
|
-
# List every Airbnb listing this workspace has access to via the connected Airbnb account. **Pure DB read — never calls Airbnb upstream.** The connect flow is what populates the local cache; the API serves what's already there. Customers with a disconnected host still see their last-synced data, with the top-level `dataFreshness` envelope flagging the staleness and pointing at the reconnect URL. Pass `?include=amenities` to enrich each connection with its locally-cached amenity set. Returns `null` per connection when the cache is empty. Pass `?include=thumbnail` to add `thumbnailUrl` to each listing — one extra column on the query that already runs, so a selection screen renders from a single request instead of one call per listing. `null` when the listing has no thumbnail stored. Combine comma-separated, e.g. `?include=amenities,thumbnail`. **Can this listing be written to?** Every connection carries `syncCategory` — Airbnb's own per-listing API sync decision (`sync_all`, `sync_rates_and_availability`, or `none`) — and `writable`, which is `false` exactly when that category is `none`. Airbnb authorises sync one listing at a time, so a connected account can still hold listings Airbnb refuses every write to; a write to one of those returns `403 listing_not_api_connected` before anything is sent, and reconnecting the account does not change it (the host must switch the listing on in Airbnb). Check `writable` here before a portfolio-wide push instead of discovering it one 403 at a time. Inactive listings are left out; they
|
|
2192
|
+
# List every Airbnb listing this workspace has access to via the connected Airbnb account. **Pure DB read — never calls Airbnb upstream.** The connect flow is what populates the local cache; the API serves what's already there. Customers with a disconnected host still see their last-synced data, with the top-level `dataFreshness` envelope flagging the staleness and pointing at the reconnect URL. Pass `?include=amenities` to enrich each connection with its locally-cached amenity set. Returns `null` per connection when the cache is empty. Pass `?include=thumbnail` to add `thumbnailUrl` to each listing — one extra column on the query that already runs, so a selection screen renders from a single request instead of one call per listing. `null` when the listing has no thumbnail stored. Combine comma-separated, e.g. `?include=amenities,thumbnail`. **Can this listing be written to?** Every connection carries `syncCategory` — Airbnb's own per-listing API sync decision (`sync_all`, `sync_rates_and_availability`, or `none`) — and `writable`, which is `false` exactly when that category is `none`. Airbnb authorises sync one listing at a time, so a connected account can still hold listings Airbnb refuses every write to; a write to one of those returns `403 listing_not_api_connected` before anything is sent, and reconnecting the account does not change it (the host must switch the listing on in Airbnb). Check `writable` here before a portfolio-wide push instead of discovering it one 403 at a time. Inactive listings are left out unless `?status=inactive|all` asks for them; they then come back with identity fields only — `listingId`, `name`, `city`, `status`, `inactiveReason` (`plan_limit`, `unlisted_on_airbnb` or `deactivated`) and each connection's ids and account — so you can show the user what to activate. They keep syncing and are complete again once activated. **Several Airbnb accounts?** A workspace can connect more than one. By default this returns every connected account's rows; pass `?account_id=<airbnb host id>` to scope to one. Every row carries `accountId` + `accountName` either way, and `dataFreshness.accounts[]` reports each account's freshness separately, so one disconnected host no longer marks the whole response stale.
|
|
2192
2193
|
# @param [Hash] opts the optional parameters
|
|
2194
|
+
# @option opts [String] :status `active` (default) leaves inactive listings out. `inactive` returns only them and `all` returns both. An inactive listing comes back with identity fields only (ids, `name`, `city`, `status`, `inactiveReason`, its account), which is enough to show what can be activated. Every row carries `status`. (default to 'active')
|
|
2193
2195
|
# @option opts [String] :account_id Scope the response to ONE connected Airbnb account. The value is the Airbnb host id — the same `accounts[].externalAccountId` that `GET /v1/connect/airbnb` returns and `DELETE /v1/connect/airbnb?accountId=` accepts. A workspace can connect several Airbnb accounts. Omit this and you get every account's rows (the default, unchanged). Every row carries `accountId` + `accountName` either way, so you can group without a second call. An id that is not connected to THIS workspace returns `404 not_found` with your own ids in `valid_values` — we do not distinguish \"no such host\" from \"someone else's host\", because confirming the latter would leak another workspace's account. Note this is NOT the `X-Account-Id` header, which carries a connection id and cannot tell two Airbnb hosts apart.
|
|
2194
2196
|
# @option opts [String] :include Comma-separated expansions. Currently supported: `amenities` (adds `amenities` and `accessibility_amenities` arrays to each connection, sourced from the local `listings_airbnb_amenities` cache) and `thumbnail` (adds `thumbnailUrl` to each listing). Unknown values return 422 with a `valid_values` envelope.
|
|
2195
2197
|
# @return [Array<(AirbnbListingListResponse, Integer, Hash)>] AirbnbListingListResponse data, response status code and response headers
|
|
@@ -2197,11 +2199,16 @@ module Repull
|
|
|
2197
2199
|
if @api_client.config.debugging
|
|
2198
2200
|
@api_client.config.logger.debug 'Calling API: AirbnbApi.list_airbnb_listings ...'
|
|
2199
2201
|
end
|
|
2202
|
+
allowable_values = ["active", "inactive", "all"]
|
|
2203
|
+
if @api_client.config.client_side_validation && opts[:'status'] && !allowable_values.include?(opts[:'status'])
|
|
2204
|
+
fail ArgumentError, "invalid value for \"status\", must be one of #{allowable_values}"
|
|
2205
|
+
end
|
|
2200
2206
|
# resource path
|
|
2201
2207
|
local_var_path = '/v1/channels/airbnb/listings'
|
|
2202
2208
|
|
|
2203
2209
|
# query parameters
|
|
2204
2210
|
query_params = opts[:query_params] || {}
|
|
2211
|
+
query_params[:'status'] = opts[:'status'] if !opts[:'status'].nil?
|
|
2205
2212
|
query_params[:'account_id'] = opts[:'account_id'] if !opts[:'account_id'].nil?
|
|
2206
2213
|
query_params[:'include'] = opts[:'include'] if !opts[:'include'].nil?
|
|
2207
2214
|
|
|
@@ -3190,24 +3197,24 @@ module Repull
|
|
|
3190
3197
|
return data, status_code, headers
|
|
3191
3198
|
end
|
|
3192
3199
|
|
|
3193
|
-
#
|
|
3194
|
-
#
|
|
3200
|
+
# Replace the steps of an Airbnb check-in guide
|
|
3201
|
+
# Write the check-in guide guests see before arrival: an ordered list of text steps. **Replaces** every existing step, so send the whole guide; `{\"steps\": []}` removes them all. The response is the guide re-read from Airbnb after the write. If the listing has no guide yet, one is created in `locale` (default: the existing guide's, else `en`). Safe on failure: the new steps are created before the old ones are removed, and if a create fails the steps this call added are removed again, so the guide is never left emptier than it was. Text steps only. Steps with photos need Airbnb's media upload and are not supported here yet. For the other arrival details use `PUT /v1/channels/airbnb/listings/{id}/details`: `check_in_option.instruction` (arrival instructions), `house_manual`, `directions`, `wifi_network`, `wifi_password`. Returns `403 listing_inactive` when the listing is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.
|
|
3195
3202
|
# @param id [String] Repull listing id (numeric string).
|
|
3203
|
+
# @param update_airbnb_checkin_guide_request [UpdateAirbnbCheckinGuideRequest]
|
|
3196
3204
|
# @param [Hash] opts the optional parameters
|
|
3197
|
-
# @
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
nil
|
|
3205
|
+
# @return [UpdateAirbnbCheckinGuide200Response]
|
|
3206
|
+
def update_airbnb_checkin_guide(id, update_airbnb_checkin_guide_request, opts = {})
|
|
3207
|
+
data, _status_code, _headers = update_airbnb_checkin_guide_with_http_info(id, update_airbnb_checkin_guide_request, opts)
|
|
3208
|
+
data
|
|
3202
3209
|
end
|
|
3203
3210
|
|
|
3204
|
-
#
|
|
3205
|
-
#
|
|
3211
|
+
# Replace the steps of an Airbnb check-in guide
|
|
3212
|
+
# Write the check-in guide guests see before arrival: an ordered list of text steps. **Replaces** every existing step, so send the whole guide; `{\"steps\": []}` removes them all. The response is the guide re-read from Airbnb after the write. If the listing has no guide yet, one is created in `locale` (default: the existing guide's, else `en`). Safe on failure: the new steps are created before the old ones are removed, and if a create fails the steps this call added are removed again, so the guide is never left emptier than it was. Text steps only. Steps with photos need Airbnb's media upload and are not supported here yet. For the other arrival details use `PUT /v1/channels/airbnb/listings/{id}/details`: `check_in_option.instruction` (arrival instructions), `house_manual`, `directions`, `wifi_network`, `wifi_password`. Returns `403 listing_inactive` when the listing is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.
|
|
3206
3213
|
# @param id [String] Repull listing id (numeric string).
|
|
3214
|
+
# @param update_airbnb_checkin_guide_request [UpdateAirbnbCheckinGuideRequest]
|
|
3207
3215
|
# @param [Hash] opts the optional parameters
|
|
3208
|
-
# @
|
|
3209
|
-
|
|
3210
|
-
def update_airbnb_checkin_guide_with_http_info(id, opts = {})
|
|
3216
|
+
# @return [Array<(UpdateAirbnbCheckinGuide200Response, Integer, Hash)>] UpdateAirbnbCheckinGuide200Response data, response status code and response headers
|
|
3217
|
+
def update_airbnb_checkin_guide_with_http_info(id, update_airbnb_checkin_guide_request, opts = {})
|
|
3211
3218
|
if @api_client.config.debugging
|
|
3212
3219
|
@api_client.config.logger.debug 'Calling API: AirbnbApi.update_airbnb_checkin_guide ...'
|
|
3213
3220
|
end
|
|
@@ -3215,26 +3222,34 @@ module Repull
|
|
|
3215
3222
|
if @api_client.config.client_side_validation && id.nil?
|
|
3216
3223
|
fail ArgumentError, "Missing the required parameter 'id' when calling AirbnbApi.update_airbnb_checkin_guide"
|
|
3217
3224
|
end
|
|
3225
|
+
# verify the required parameter 'update_airbnb_checkin_guide_request' is set
|
|
3226
|
+
if @api_client.config.client_side_validation && update_airbnb_checkin_guide_request.nil?
|
|
3227
|
+
fail ArgumentError, "Missing the required parameter 'update_airbnb_checkin_guide_request' when calling AirbnbApi.update_airbnb_checkin_guide"
|
|
3228
|
+
end
|
|
3218
3229
|
# resource path
|
|
3219
3230
|
local_var_path = '/v1/channels/airbnb/listings/{id}/checkin-guide'.sub('{id}', CGI.escape(id.to_s))
|
|
3220
3231
|
|
|
3221
3232
|
# query parameters
|
|
3222
3233
|
query_params = opts[:query_params] || {}
|
|
3223
|
-
query_params[:'locale'] = opts[:'locale'] if !opts[:'locale'].nil?
|
|
3224
3234
|
|
|
3225
3235
|
# header parameters
|
|
3226
3236
|
header_params = opts[:header_params] || {}
|
|
3227
3237
|
# HTTP header 'Accept' (if needed)
|
|
3228
3238
|
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
3239
|
+
# HTTP header 'Content-Type'
|
|
3240
|
+
content_type = @api_client.select_header_content_type(['application/json'])
|
|
3241
|
+
if !content_type.nil?
|
|
3242
|
+
header_params['Content-Type'] = content_type
|
|
3243
|
+
end
|
|
3229
3244
|
|
|
3230
3245
|
# form parameters
|
|
3231
3246
|
form_params = opts[:form_params] || {}
|
|
3232
3247
|
|
|
3233
3248
|
# http body (model)
|
|
3234
|
-
post_body = opts[:debug_body]
|
|
3249
|
+
post_body = opts[:debug_body] || @api_client.object_to_http_body(update_airbnb_checkin_guide_request)
|
|
3235
3250
|
|
|
3236
3251
|
# return_type
|
|
3237
|
-
return_type = opts[:debug_return_type]
|
|
3252
|
+
return_type = opts[:debug_return_type] || 'UpdateAirbnbCheckinGuide200Response'
|
|
3238
3253
|
|
|
3239
3254
|
# auth_names
|
|
3240
3255
|
auth_names = opts[:debug_auth_names] || ['bearerAuth']
|
|
@@ -3485,8 +3500,8 @@ module Repull
|
|
|
3485
3500
|
return data, status_code, headers
|
|
3486
3501
|
end
|
|
3487
3502
|
|
|
3488
|
-
# Update property type,
|
|
3489
|
-
# Change what kind of property the Airbnb listing is, when its quiet hours are,
|
|
3503
|
+
# Update property type, quiet hours, check-in method, house manual, directions or Wi-Fi
|
|
3504
|
+
# Change what kind of property the Airbnb listing is, when its quiet hours are, how the guest gets in (`check_in_option.instruction` is the arrival instructions), the house manual, directions to the property, or the Wi-Fi network and password. Partial: only the fields you send are written. At least one required; an unknown field is refused by name rather than dropped. This is the UPDATE path for fields that previously had none. `POST /v1/listings` accepts a `propertyType` when a listing is CREATED and nothing could change it afterwards, so a listing mis-typed at import stayed mis-typed; the check-in method was mirrored and never exposed at all. **A 200 does not by itself mean the change was applied.** `property_type_category`, `property_type_group`, `check_in_option`, `house_manual`, `directions`, `wifi_network` and `wifi_password` are among the attributes Airbnb locks on some listings: the write returns 200, and Airbnb applies nothing for the locked ones. The response reports `blockedFields` — the fields YOU sent that Airbnb dropped — and `blockedFields: []` is what a landed write looks like. `GET …/details` reports the same list as `lockedFields` so you can check first. Canonical property type (the value Repull keeps and republishes) is set with `PUT /v1/listings/{id}/content` under `details`; this endpoint writes straight to Airbnb. Send `Idempotency-Key` to make a retry safe.
|
|
3490
3505
|
# @param id [String] Repull listing id (numeric string).
|
|
3491
3506
|
# @param airbnb_listing_details_write_request [AirbnbListingDetailsWriteRequest]
|
|
3492
3507
|
# @param [Hash] opts the optional parameters
|
|
@@ -3497,8 +3512,8 @@ module Repull
|
|
|
3497
3512
|
data
|
|
3498
3513
|
end
|
|
3499
3514
|
|
|
3500
|
-
# Update property type,
|
|
3501
|
-
# Change what kind of property the Airbnb listing is, when its quiet hours are,
|
|
3515
|
+
# Update property type, quiet hours, check-in method, house manual, directions or Wi-Fi
|
|
3516
|
+
# Change what kind of property the Airbnb listing is, when its quiet hours are, how the guest gets in (`check_in_option.instruction` is the arrival instructions), the house manual, directions to the property, or the Wi-Fi network and password. Partial: only the fields you send are written. At least one required; an unknown field is refused by name rather than dropped. This is the UPDATE path for fields that previously had none. `POST /v1/listings` accepts a `propertyType` when a listing is CREATED and nothing could change it afterwards, so a listing mis-typed at import stayed mis-typed; the check-in method was mirrored and never exposed at all. **A 200 does not by itself mean the change was applied.** `property_type_category`, `property_type_group`, `check_in_option`, `house_manual`, `directions`, `wifi_network` and `wifi_password` are among the attributes Airbnb locks on some listings: the write returns 200, and Airbnb applies nothing for the locked ones. The response reports `blockedFields` — the fields YOU sent that Airbnb dropped — and `blockedFields: []` is what a landed write looks like. `GET …/details` reports the same list as `lockedFields` so you can check first. Canonical property type (the value Repull keeps and republishes) is set with `PUT /v1/listings/{id}/content` under `details`; this endpoint writes straight to Airbnb. Send `Idempotency-Key` to make a retry safe.
|
|
3502
3517
|
# @param id [String] Repull listing id (numeric string).
|
|
3503
3518
|
# @param airbnb_listing_details_write_request [AirbnbListingDetailsWriteRequest]
|
|
3504
3519
|
# @param [Hash] opts the optional parameters
|
|
@@ -3567,7 +3582,7 @@ module Repull
|
|
|
3567
3582
|
end
|
|
3568
3583
|
|
|
3569
3584
|
# Answer Airbnb permit questions
|
|
3570
|
-
# Answer the regulatory permit questions for a listing — the licence or registration number a city requires to keep the listing up. Read the questions first with `GET …/permits?source=live`. For each permit, pick one of its `flows[]` and send its `slug` as `flow_slug`; key every answer by the question's `answer_key`, and let the question's `type` decide the value field
|
|
3585
|
+
# Answer the regulatory permit questions for a listing — the licence or registration number a city requires to keep the listing up. Read the questions first with `GET …/permits?source=live`. For each permit, pick one of its `flows[]` and send its `slug` as `flow_slug`; key every answer by the question's `answer_key`, and let the question's `type` decide the value field — `<type>_value`: `text_value`, `attestation_value`, `radio_value`, `dropdown_value`, `email_value`, `future_date_value`, `file_upload_value`, and so on. Answers are forwarded verbatim — nothing is defaulted or inferred, because a wrong licence number can take a listing down in a regulated city. Send `Idempotency-Key`: a timeout here leaves you unable to tell \"never arrived\" from \"arrived, response lost\", and this is a compliance filing. Airbnb refusing the answers (an unknown `answer_key`, a malformed licence number) is `422 airbnb_rejected` carrying Airbnb's own reason. An expired or revoked Airbnb connection is `403 connection_reauth_required`. **Changing and removing answers.** Airbnb has no call that deletes or withdraws a submitted registration, so neither does Repull, and at least one permit is required. To change an answer Airbnb marks `answer_editable`, submit the flow again with the new answers — the latest submission replaces the previous one. When a submission fails with status `failed_recoverable`, fix it and submit again; `failed` cannot be resubmitted. Hosts can also manage this at airbnb.com/verify-listing/{listing_id}.
|
|
3571
3586
|
# @param id [String] Repull listing id (numeric string).
|
|
3572
3587
|
# @param airbnb_permits_write_request [AirbnbPermitsWriteRequest]
|
|
3573
3588
|
# @param [Hash] opts the optional parameters
|
|
@@ -3579,7 +3594,7 @@ module Repull
|
|
|
3579
3594
|
end
|
|
3580
3595
|
|
|
3581
3596
|
# Answer Airbnb permit questions
|
|
3582
|
-
# Answer the regulatory permit questions for a listing — the licence or registration number a city requires to keep the listing up. Read the questions first with `GET …/permits?source=live`. For each permit, pick one of its `flows[]` and send its `slug` as `flow_slug`; key every answer by the question's `answer_key`, and let the question's `type` decide the value field
|
|
3597
|
+
# Answer the regulatory permit questions for a listing — the licence or registration number a city requires to keep the listing up. Read the questions first with `GET …/permits?source=live`. For each permit, pick one of its `flows[]` and send its `slug` as `flow_slug`; key every answer by the question's `answer_key`, and let the question's `type` decide the value field — `<type>_value`: `text_value`, `attestation_value`, `radio_value`, `dropdown_value`, `email_value`, `future_date_value`, `file_upload_value`, and so on. Answers are forwarded verbatim — nothing is defaulted or inferred, because a wrong licence number can take a listing down in a regulated city. Send `Idempotency-Key`: a timeout here leaves you unable to tell \"never arrived\" from \"arrived, response lost\", and this is a compliance filing. Airbnb refusing the answers (an unknown `answer_key`, a malformed licence number) is `422 airbnb_rejected` carrying Airbnb's own reason. An expired or revoked Airbnb connection is `403 connection_reauth_required`. **Changing and removing answers.** Airbnb has no call that deletes or withdraws a submitted registration, so neither does Repull, and at least one permit is required. To change an answer Airbnb marks `answer_editable`, submit the flow again with the new answers — the latest submission replaces the previous one. When a submission fails with status `failed_recoverable`, fix it and submit again; `failed` cannot be resubmitted. Hosts can also manage this at airbnb.com/verify-listing/{listing_id}.
|
|
3583
3598
|
# @param id [String] Repull listing id (numeric string).
|
|
3584
3599
|
# @param airbnb_permits_write_request [AirbnbPermitsWriteRequest]
|
|
3585
3600
|
# @param [Hash] opts the optional parameters
|
|
@@ -784,8 +784,9 @@ module Repull
|
|
|
784
784
|
end
|
|
785
785
|
|
|
786
786
|
# List Booking.com properties
|
|
787
|
-
# List every Booking.com property this workspace holds. Each property is returned ONCE, with the Repull listings mapped under it. A Booking.com property is a building; its rooms are what guests book, and each room is mapped to one Repull listing — so one property routinely carries many listings. `listings[].roomBookingId` is the Booking.com room id an ARI write takes. A property whose rooms are not mapped yet is still listed, with `mappingStatus: \"unmapped\"` and an empty `listings` array. That is a real mid-onboarding state, not an error: finish `POST /v1/connect/booking/map-rooms` and the listings appear. Such a property used to be dropped silently, which made a mapped-but-unreadable workspace indistinguishable from one with no Booking connection at all. Inactive listings are left out of `listings
|
|
787
|
+
# List every Booking.com property this workspace holds. Each property is returned ONCE, with the Repull listings mapped under it. A Booking.com property is a building; its rooms are what guests book, and each room is mapped to one Repull listing — so one property routinely carries many listings. `listings[].roomBookingId` is the Booking.com room id an ARI write takes. A property whose rooms are not mapped yet is still listed, with `mappingStatus: \"unmapped\"` and an empty `listings` array. That is a real mid-onboarding state, not an error: finish `POST /v1/connect/booking/map-rooms` and the listings appear. Such a property used to be dropped silently, which made a mapped-but-unreadable workspace indistinguishable from one with no Booking connection at all. Inactive listings are left out of `listings` unless `?status=inactive|all` asks for them; they then appear with identity fields only (`listingId`, `name`, `city`, `status`, `inactiveReason`, room). `mappingStatus` counts every mapped listing, inactive ones included, so a property whose listings are all inactive is still `mapped`.
|
|
788
788
|
# @param [Hash] opts the optional parameters
|
|
789
|
+
# @option opts [String] :status `active` (default) leaves inactive listings out. `inactive` returns only them and `all` returns both. An inactive listing comes back with identity fields only (ids, `name`, `city`, `status`, `inactiveReason`, its account), which is enough to show what can be activated. Every row carries `status`. (default to 'active')
|
|
789
790
|
# @return [Array<BookingProperty>]
|
|
790
791
|
def list_booking_properties(opts = {})
|
|
791
792
|
data, _status_code, _headers = list_booking_properties_with_http_info(opts)
|
|
@@ -793,18 +794,24 @@ module Repull
|
|
|
793
794
|
end
|
|
794
795
|
|
|
795
796
|
# List Booking.com properties
|
|
796
|
-
# List every Booking.com property this workspace holds. Each property is returned ONCE, with the Repull listings mapped under it. A Booking.com property is a building; its rooms are what guests book, and each room is mapped to one Repull listing — so one property routinely carries many listings. `listings[].roomBookingId` is the Booking.com room id an ARI write takes. A property whose rooms are not mapped yet is still listed, with `mappingStatus: \"unmapped\"` and an empty `listings` array. That is a real mid-onboarding state, not an error: finish `POST /v1/connect/booking/map-rooms` and the listings appear. Such a property used to be dropped silently, which made a mapped-but-unreadable workspace indistinguishable from one with no Booking connection at all. Inactive listings are left out of `listings`
|
|
797
|
+
# List every Booking.com property this workspace holds. Each property is returned ONCE, with the Repull listings mapped under it. A Booking.com property is a building; its rooms are what guests book, and each room is mapped to one Repull listing — so one property routinely carries many listings. `listings[].roomBookingId` is the Booking.com room id an ARI write takes. A property whose rooms are not mapped yet is still listed, with `mappingStatus: \"unmapped\"` and an empty `listings` array. That is a real mid-onboarding state, not an error: finish `POST /v1/connect/booking/map-rooms` and the listings appear. Such a property used to be dropped silently, which made a mapped-but-unreadable workspace indistinguishable from one with no Booking connection at all. Inactive listings are left out of `listings` unless `?status=inactive|all` asks for them; they then appear with identity fields only (`listingId`, `name`, `city`, `status`, `inactiveReason`, room). `mappingStatus` counts every mapped listing, inactive ones included, so a property whose listings are all inactive is still `mapped`.
|
|
797
798
|
# @param [Hash] opts the optional parameters
|
|
799
|
+
# @option opts [String] :status `active` (default) leaves inactive listings out. `inactive` returns only them and `all` returns both. An inactive listing comes back with identity fields only (ids, `name`, `city`, `status`, `inactiveReason`, its account), which is enough to show what can be activated. Every row carries `status`. (default to 'active')
|
|
798
800
|
# @return [Array<(Array<BookingProperty>, Integer, Hash)>] Array<BookingProperty> data, response status code and response headers
|
|
799
801
|
def list_booking_properties_with_http_info(opts = {})
|
|
800
802
|
if @api_client.config.debugging
|
|
801
803
|
@api_client.config.logger.debug 'Calling API: BookingComApi.list_booking_properties ...'
|
|
802
804
|
end
|
|
805
|
+
allowable_values = ["active", "inactive", "all"]
|
|
806
|
+
if @api_client.config.client_side_validation && opts[:'status'] && !allowable_values.include?(opts[:'status'])
|
|
807
|
+
fail ArgumentError, "invalid value for \"status\", must be one of #{allowable_values}"
|
|
808
|
+
end
|
|
803
809
|
# resource path
|
|
804
810
|
local_var_path = '/v1/channels/booking/properties'
|
|
805
811
|
|
|
806
812
|
# query parameters
|
|
807
813
|
query_params = opts[:query_params] || {}
|
|
814
|
+
query_params[:'status'] = opts[:'status'] if !opts[:'status'].nil?
|
|
808
815
|
|
|
809
816
|
# header parameters
|
|
810
817
|
header_params = opts[:header_params] || {}
|
|
@@ -806,7 +806,7 @@ module Repull
|
|
|
806
806
|
end
|
|
807
807
|
|
|
808
808
|
# List PMS/OTA connections
|
|
809
|
-
# Returns
|
|
809
|
+
# Returns every PMS and OTA connection in the workspace, each with its `status`. **Spot connections that need attention.** A connection whose `status` is not `active` may need the host to do something before it works — most commonly a Booking.com Extranet connection where the invited user was granted only partial access (`status: \"needs_permissions\"`). A Smoobu connection still on a legacy single API key carries `action.reason: \"reauth_required\"` while its `status` is `active`: Smoobu stops accepting those keys on October 31, 2026, and `fixUrl` opens the form for a new API key + secret (the connection id stays the same). These connections carry two extra fields: - `action` — `{ required: true, reason, message }`. `reason` is a stable machine code (e.g. `needs_permissions`); `message` is a host-facing one-liner describing what to do. - `fixUrl` — a durable link that reopens the hosted Connect flow **bound to that account, on the fix screen** (e.g. \"grant full access\" + a Re-check button). It is safe to store and show in your own dashboard. **Self-serve repair:** when `action.required` is true, surface a \"Fix\" button that opens `fixUrl` in a new tab (or embed it). The host resolves the issue (e.g. grants the user full access in Booking.com) and clicks Re-check; the import finishes on its own and the connection flips back to `active` — no re-invite, no support ticket. Poll this endpoint (or read it after the host returns) to confirm `action` has cleared.
|
|
810
810
|
# @param [Hash] opts the optional parameters
|
|
811
811
|
# @return [ConnectionListResponse]
|
|
812
812
|
def list_connections(opts = {})
|
|
@@ -815,7 +815,7 @@ module Repull
|
|
|
815
815
|
end
|
|
816
816
|
|
|
817
817
|
# List PMS/OTA connections
|
|
818
|
-
# Returns
|
|
818
|
+
# Returns every PMS and OTA connection in the workspace, each with its `status`. **Spot connections that need attention.** A connection whose `status` is not `active` may need the host to do something before it works — most commonly a Booking.com Extranet connection where the invited user was granted only partial access (`status: \"needs_permissions\"`). A Smoobu connection still on a legacy single API key carries `action.reason: \"reauth_required\"` while its `status` is `active`: Smoobu stops accepting those keys on October 31, 2026, and `fixUrl` opens the form for a new API key + secret (the connection id stays the same). These connections carry two extra fields: - `action` — `{ required: true, reason, message }`. `reason` is a stable machine code (e.g. `needs_permissions`); `message` is a host-facing one-liner describing what to do. - `fixUrl` — a durable link that reopens the hosted Connect flow **bound to that account, on the fix screen** (e.g. \"grant full access\" + a Re-check button). It is safe to store and show in your own dashboard. **Self-serve repair:** when `action.required` is true, surface a \"Fix\" button that opens `fixUrl` in a new tab (or embed it). The host resolves the issue (e.g. grants the user full access in Booking.com) and clicks Re-check; the import finishes on its own and the connection flips back to `active` — no re-invite, no support ticket. Poll this endpoint (or read it after the host returns) to confirm `action` has cleared.
|
|
819
819
|
# @param [Hash] opts the optional parameters
|
|
820
820
|
# @return [Array<(ConnectionListResponse, Integer, Hash)>] ConnectionListResponse data, response status code and response headers
|
|
821
821
|
def list_connections_with_http_info(opts = {})
|
|
@@ -1830,7 +1830,7 @@ module Repull
|
|
|
1830
1830
|
end
|
|
1831
1831
|
|
|
1832
1832
|
# Submit Smoobu credentials for a Connect session
|
|
1833
|
-
# Completes a credentials-pattern connection for Smoobu
|
|
1833
|
+
# Completes a credentials-pattern connection for Smoobu with an HMAC API key + API secret, created in Smoobu → Settings → Advanced → API Keys (Create API Key, then Generate Secret — the secret is shown only once). Smoobu retires single legacy API keys on October 31, 2026, so `apiSecret` is required; a request with only `apiKey` returns `invalid_params`. Reconnecting replaces the stored credentials on the workspace's existing Smoobu connection — the `pmsConnectionId` stays the same. The credentials are validated against Smoobu before anything is persisted, so an invalid pair returns `invalid_credentials` rather than creating a dead connection. On success the `pms_connections` row is written and the Connect session moves to its terminal state. No API key required when called with a `sessionId` — the session is the capability token.
|
|
1834
1834
|
# @param submit_smoobu_credentials_request [SubmitSmoobuCredentialsRequest]
|
|
1835
1835
|
# @param [Hash] opts the optional parameters
|
|
1836
1836
|
# @return [SubmitBeds24Credentials200Response]
|
|
@@ -1840,7 +1840,7 @@ module Repull
|
|
|
1840
1840
|
end
|
|
1841
1841
|
|
|
1842
1842
|
# Submit Smoobu credentials for a Connect session
|
|
1843
|
-
# Completes a credentials-pattern connection for Smoobu
|
|
1843
|
+
# Completes a credentials-pattern connection for Smoobu with an HMAC API key + API secret, created in Smoobu → Settings → Advanced → API Keys (Create API Key, then Generate Secret — the secret is shown only once). Smoobu retires single legacy API keys on October 31, 2026, so `apiSecret` is required; a request with only `apiKey` returns `invalid_params`. Reconnecting replaces the stored credentials on the workspace's existing Smoobu connection — the `pmsConnectionId` stays the same. The credentials are validated against Smoobu before anything is persisted, so an invalid pair returns `invalid_credentials` rather than creating a dead connection. On success the `pms_connections` row is written and the Connect session moves to its terminal state. No API key required when called with a `sessionId` — the session is the capability token.
|
|
1844
1844
|
# @param submit_smoobu_credentials_request [SubmitSmoobuCredentialsRequest]
|
|
1845
1845
|
# @param [Hash] opts the optional parameters
|
|
1846
1846
|
# @return [Array<(SubmitBeds24Credentials200Response, Integer, Hash)>] SubmitBeds24Credentials200Response data, response status code and response headers
|
|
@@ -760,7 +760,7 @@ module Repull
|
|
|
760
760
|
# @option opts [Integer] :offset First-class alias for cursor-based pagination. Mutually exclusive with `cursor` — passing both returns 422. Accepts integers in `[0, 10000]`; deeper walks must use `cursor` (constant per-page cost). The response always includes `pagination.nextCursor` so consumers can switch from offset → cursor mid-walk for deep pagination without re-keying. (default to 0)
|
|
761
761
|
# @option opts [Integer] :limit Max items per page. Hard cap is 100. (default to 20)
|
|
762
762
|
# @option opts [String] :q Case-insensitive substring search on name, street, or city.
|
|
763
|
-
# @option opts [String] :status Filter by listing status. Defaults to `active`. Pass `inactive` to list the listings you can activate, `archived` for archived ones, or `all` for every status. Inactive listings are returned with identity fields only — `id`, `name`, `status` and `channels` — and never with
|
|
763
|
+
# @option opts [String] :status Filter by listing status. Defaults to `active`. Pass `inactive` to list the listings you can activate, `archived` for archived ones, or `all` for every status. Inactive listings are returned with identity fields only — `id`, `name`, `status`, `inactiveReason` (`plan_limit`, `unlisted_on_airbnb` or `deactivated`), `address.city` and `channels` — and never with the street, `content` or `details`; activate one to see the rest. The only field you can add to an inactive row is `thumbnailUrl`, via `?include=thumbnail`. (default to 'active')
|
|
764
764
|
# @option opts [String] :channel Restrict to listings published on the given channel (`airbnb`, `booking`, `vrbo`, etc.). Joins through `listing_platform_links` and matches active links only.
|
|
765
765
|
# @option opts [String] :include Comma-separated optional expansions. Currently supported: `content`, `details`, `thumbnail`. `thumbnail` guarantees `thumbnailUrl` on every row and is the only expansion that applies to inactive listings. Unknown values return 422 with a `valid_values` envelope. (Note: `amenities` is not yet supported on the list endpoint — use the detail endpoint to fetch amenity rows for a single listing.)
|
|
766
766
|
# @return [ListingListResponse]
|
|
@@ -777,7 +777,7 @@ module Repull
|
|
|
777
777
|
# @option opts [Integer] :offset First-class alias for cursor-based pagination. Mutually exclusive with `cursor` — passing both returns 422. Accepts integers in `[0, 10000]`; deeper walks must use `cursor` (constant per-page cost). The response always includes `pagination.nextCursor` so consumers can switch from offset → cursor mid-walk for deep pagination without re-keying. (default to 0)
|
|
778
778
|
# @option opts [Integer] :limit Max items per page. Hard cap is 100. (default to 20)
|
|
779
779
|
# @option opts [String] :q Case-insensitive substring search on name, street, or city.
|
|
780
|
-
# @option opts [String] :status Filter by listing status. Defaults to `active`. Pass `inactive` to list the listings you can activate, `archived` for archived ones, or `all` for every status. Inactive listings are returned with identity fields only — `id`, `name`, `status` and `channels` — and never with
|
|
780
|
+
# @option opts [String] :status Filter by listing status. Defaults to `active`. Pass `inactive` to list the listings you can activate, `archived` for archived ones, or `all` for every status. Inactive listings are returned with identity fields only — `id`, `name`, `status`, `inactiveReason` (`plan_limit`, `unlisted_on_airbnb` or `deactivated`), `address.city` and `channels` — and never with the street, `content` or `details`; activate one to see the rest. The only field you can add to an inactive row is `thumbnailUrl`, via `?include=thumbnail`. (default to 'active')
|
|
781
781
|
# @option opts [String] :channel Restrict to listings published on the given channel (`airbnb`, `booking`, `vrbo`, etc.). Joins through `listing_platform_links` and matches active links only.
|
|
782
782
|
# @option opts [String] :include Comma-separated optional expansions. Currently supported: `content`, `details`, `thumbnail`. `thumbnail` guarantees `thumbnailUrl` on every row and is the only expansion that applies to inactive listings. Unknown values return 422 with a `valid_values` envelope. (Note: `amenities` is not yet supported on the list endpoint — use the detail endpoint to fetch amenity rows for a single listing.)
|
|
783
783
|
# @return [Array<(ListingListResponse, Integer, Hash)>] ListingListResponse data, response status code and response headers
|
|
@@ -97,7 +97,7 @@ module Repull
|
|
|
97
97
|
# @option opts [String] :cursor Opaque cursor returned in the previous response's `pagination.nextCursor`. Omit to fetch the first page.
|
|
98
98
|
# @option opts [Integer] :offset First-class alias for cursor-based pagination. Mutually exclusive with `cursor` — passing both returns 422. Accepts integers in `[0, 10000]`; deeper walks must use `cursor` (constant per-page cost). The response always includes `pagination.nextCursor` so consumers can switch from offset → cursor mid-walk for deep pagination without re-keying. (default to 0)
|
|
99
99
|
# @option opts [String] :q Case-insensitive substring search on name, street, or city.
|
|
100
|
-
# @option opts [String] :status Filter by status. Default returns active only; pass `inactive` to invert or `all` to include both. Inactive properties carry identity fields only — `id`, `name`, `status`, `lifecycleStatus`, `channels` and `updatedAt` — never `address`
|
|
100
|
+
# @option opts [String] :status Filter by status. Default returns active only; pass `inactive` to invert or `all` to include both. Inactive properties carry identity fields only — `id`, `name`, `city`, `status`, `inactiveReason` (`plan_limit`, `unlisted_on_airbnb` or `deactivated`), `lifecycleStatus`, `channels` and `updatedAt` — never `address` or `currency`. (default to 'active')
|
|
101
101
|
# @option opts [String] :lifecycle_status Filter by lifecycle status (e.g. `live`, `draft`, `archived`). Pass `all` to disable the filter.
|
|
102
102
|
# @option opts [String] :channel Filter to properties with an active link on the given OTA/channel (airbnb, booking, vrbo). Omit to include every channel. Each property also returns a `channels` array listing the OTAs it is published on.
|
|
103
103
|
# @option opts [Time] :updated_since Incremental sync: return only records whose `updatedAt` is at or after this instant. This is the only filter on record **mutation** time — every `check_*` filter targets guest **stay** dates. **Accepted formats.** ISO 8601, with `Z` or a numeric offset — both work: - `2026-08-01T00:00:00Z` - `2026-08-01T00:00:00.123Z` - `2026-08-01T00:00:00+00:00` - `2026-08-01T02:30:00-07:00` (offset colon optional: `-0700`) - `2026-08-01T00:00` (seconds optional) - `2026-08-01T00:00:00` — no zone designator, interpreted as **UTC** - `2026-08-01` — date only, means midnight UTC Anything else returns 422 `invalid_params` naming the field; the value is never silently ignored. **Ordering changes when you pass this.** Results are ordered `updatedAt ASC, id ASC` (instead of the endpoint default) and the cursor keys on the same pair. That is required for correctness: under the default ordering a record amended mid-walk can move behind the cursor and never be emitted — which is exactly the event you are polling for. Ascending mutation time is monotonic with the cursor, so anything touched during a walk resurfaces later in it or on the next poll. **Cursors are not interchangeable between the two orderings.** Keep `updated_since` on every page of an incremental walk; replaying a cursor from the other ordering returns 422 rather than a page that silently skips rows. **Watermark.** The bound is inclusive (`updatedAt >= value`), so the last row of the final page is the watermark for the next poll — re-polling with it re-emits that row. Delivery is at-least-once; upsert by `id`.
|
|
@@ -116,7 +116,7 @@ module Repull
|
|
|
116
116
|
# @option opts [String] :cursor Opaque cursor returned in the previous response's `pagination.nextCursor`. Omit to fetch the first page.
|
|
117
117
|
# @option opts [Integer] :offset First-class alias for cursor-based pagination. Mutually exclusive with `cursor` — passing both returns 422. Accepts integers in `[0, 10000]`; deeper walks must use `cursor` (constant per-page cost). The response always includes `pagination.nextCursor` so consumers can switch from offset → cursor mid-walk for deep pagination without re-keying. (default to 0)
|
|
118
118
|
# @option opts [String] :q Case-insensitive substring search on name, street, or city.
|
|
119
|
-
# @option opts [String] :status Filter by status. Default returns active only; pass `inactive` to invert or `all` to include both. Inactive properties carry identity fields only — `id`, `name`, `status`, `lifecycleStatus`, `channels` and `updatedAt` — never `address`
|
|
119
|
+
# @option opts [String] :status Filter by status. Default returns active only; pass `inactive` to invert or `all` to include both. Inactive properties carry identity fields only — `id`, `name`, `city`, `status`, `inactiveReason` (`plan_limit`, `unlisted_on_airbnb` or `deactivated`), `lifecycleStatus`, `channels` and `updatedAt` — never `address` or `currency`. (default to 'active')
|
|
120
120
|
# @option opts [String] :lifecycle_status Filter by lifecycle status (e.g. `live`, `draft`, `archived`). Pass `all` to disable the filter.
|
|
121
121
|
# @option opts [String] :channel Filter to properties with an active link on the given OTA/channel (airbnb, booking, vrbo). Omit to include every channel. Each property also returns a `channels` array listing the OTAs it is published on.
|
|
122
122
|
# @option opts [Time] :updated_since Incremental sync: return only records whose `updatedAt` is at or after this instant. This is the only filter on record **mutation** time — every `check_*` filter targets guest **stay** dates. **Accepted formats.** ISO 8601, with `Z` or a numeric offset — both work: - `2026-08-01T00:00:00Z` - `2026-08-01T00:00:00.123Z` - `2026-08-01T00:00:00+00:00` - `2026-08-01T02:30:00-07:00` (offset colon optional: `-0700`) - `2026-08-01T00:00` (seconds optional) - `2026-08-01T00:00:00` — no zone designator, interpreted as **UTC** - `2026-08-01` — date only, means midnight UTC Anything else returns 422 `invalid_params` naming the field; the value is never silently ignored. **Ordering changes when you pass this.** Results are ordered `updatedAt ASC, id ASC` (instead of the endpoint default) and the cursor keys on the same pair. That is required for correctness: under the default ordering a record amended mid-walk can move behind the cursor and never be emitted — which is exactly the event you are polling for. Ascending mutation time is monotonic with the cursor, so anything touched during a walk resurfaces later in it or on the next poll. **Cursors are not interchangeable between the two orderings.** Keep `updated_since` on every page of an incremental walk; replaying a cursor from the other ordering returns 422 rather than a page that silently skips rows. **Watermark.** The bound is inclusive (`updatedAt >= value`), so the last row of the final page is the watermark for the next poll — re-polling with it re-emits that row. Delivery is at-least-once; upsert by `id`.
|