repull 0.2.32 → 0.2.34
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/README.md +1 -1
- data/lib/repull/api/connections_api.rb +77 -0
- data/lib/repull/api/promotions_api.rb +574 -0
- data/lib/repull/api/resolutions_api.rb +236 -0
- data/lib/repull/api/transactions_api.rb +73 -0
- data/lib/repull/models/account_import.rb +237 -0
- data/lib/repull/models/account_import_completed_event.rb +282 -0
- data/lib/repull/models/account_import_counts.rb +193 -0
- data/lib/repull/models/account_import_failed_event.rb +282 -0
- data/lib/repull/models/account_import_finished_payload.rb +224 -0
- data/lib/repull/models/account_import_stage.rb +177 -0
- data/lib/repull/models/account_import_started_event.rb +282 -0
- data/lib/repull/models/account_import_started_payload.rb +177 -0
- data/lib/repull/models/connection.rb +16 -5
- data/lib/repull/models/list_airbnb_resolutions200_response.rb +192 -0
- data/lib/repull/models/list_connection_imports200_response.rb +158 -0
- data/lib/repull/models/listing_updated_payload.rb +2 -2
- data/lib/repull/models/promotion.rb +344 -0
- data/lib/repull/models/promotion_applies_to.rb +161 -0
- data/lib/repull/models/promotion_bulk_request.rb +236 -0
- data/lib/repull/models/promotion_bulk_response.rb +158 -0
- data/lib/repull/models/promotion_bulk_response_data_inner.rb +174 -0
- data/lib/repull/models/promotion_bulk_response_data_inner_error.rb +165 -0
- data/lib/repull/models/promotion_bulk_response_summary.rb +156 -0
- data/lib/repull/models/promotion_catalog.rb +158 -0
- data/lib/repull/models/promotion_catalog_channels_inner.rb +222 -0
- data/lib/repull/models/promotion_catalog_entry.rb +265 -0
- data/lib/repull/models/promotion_catalog_field.rb +205 -0
- data/lib/repull/models/promotion_catalog_field_options_inner.rb +156 -0
- data/lib/repull/models/promotion_catalog_response.rb +147 -0
- data/lib/repull/models/promotion_create_request.rb +258 -0
- data/lib/repull/models/promotion_delete_response.rb +147 -0
- data/lib/repull/models/promotion_delete_response_data.rb +156 -0
- data/lib/repull/models/promotion_discount.rb +191 -0
- data/lib/repull/models/promotion_input.rb +241 -0
- data/lib/repull/models/promotion_list_response.rb +170 -0
- data/lib/repull/models/promotion_refresh_response.rb +170 -0
- data/lib/repull/models/promotion_response.rb +147 -0
- data/lib/repull/models/promotion_rules.rb +290 -0
- data/lib/repull/models/promotion_rules_blackout_dates_quota.rb +156 -0
- data/lib/repull/models/promotion_rules_booking_window.rb +230 -0
- data/lib/repull/models/promotion_rules_last_minute.rb +218 -0
- data/lib/repull/models/promotion_rules_stay_window.rb +211 -0
- data/lib/repull/models/promotion_type.rb +47 -0
- data/lib/repull/models/promotion_update_request.rb +175 -0
- data/lib/repull/models/promotion_usage.rb +193 -0
- data/lib/repull/models/promotion_usage_revenue.rb +156 -0
- data/lib/repull/models/refresh_airbnb_resolutions200_response.rb +219 -0
- data/lib/repull/models/refresh_airbnb_resolutions200_response_accounts_inner.rb +200 -0
- data/lib/repull/models/refresh_airbnb_resolutions200_response_accounts_inner_error.rb +156 -0
- data/lib/repull/models/refresh_airbnb_resolutions_request.rb +192 -0
- data/lib/repull/models/reservation_money_line.rb +14 -4
- data/lib/repull/models/resolution.rb +329 -0
- data/lib/repull/models/transaction_payout.rb +17 -6
- data/lib/repull/models/webhook_event.rb +6 -0
- data/lib/repull/models/webhook_event_type.rb +4 -1
- data/lib/repull/version.rb +1 -1
- data/lib/repull.rb +47 -0
- data/openapi/v1.json +2211 -385
- data/scripts/regen.sh +1 -1
- metadata +49 -2
data/openapi/v1.json
CHANGED
|
@@ -62,6 +62,10 @@
|
|
|
62
62
|
"name": "Transactions",
|
|
63
63
|
"description": "Unified transactions & payments ledger across channels \u2014 payouts, reservation charges, refunds. `booking` covers Booking.com however it was connected."
|
|
64
64
|
},
|
|
65
|
+
{
|
|
66
|
+
"name": "Resolutions",
|
|
67
|
+
"description": "Airbnb Resolution Center cases (AirCover / damage, extra-guest, refund and change requests) \u2014 read-only visibility on open and closed resolutions. The money a resolution moved is in the transactions ledger; join on the resolution id."
|
|
68
|
+
},
|
|
65
69
|
{
|
|
66
70
|
"name": "Availability",
|
|
67
71
|
"description": "Check and update property availability and pricing"
|
|
@@ -114,6 +118,10 @@
|
|
|
114
118
|
"name": "AI",
|
|
115
119
|
"description": "AI-powered operations \u2014 guest responses, intent classification, listing generation, pricing suggestions"
|
|
116
120
|
},
|
|
121
|
+
{
|
|
122
|
+
"name": "Promotions",
|
|
123
|
+
"description": "Airbnb and Booking.com promotions on a listing, in one model: Airbnb\u2019s discount programmes (top-rated guests, mobile-only, new listing) and Booking.com deals, mobile and country rates and seasonal campaigns. Read the catalog first \u2014 it says, per channel, which types the listing can use and which fields each supports."
|
|
124
|
+
},
|
|
117
125
|
{
|
|
118
126
|
"name": "Pricing",
|
|
119
127
|
"description": "Atlas-powered pricing recommendations and per-listing strategy. Recommendations are pre-computed by the Atlas pricing model from comp data, demand signals, and event calendars; this surface lets you read them, apply or decline them, and tune the strategy that constrains the model."
|
|
@@ -444,6 +452,10 @@
|
|
|
444
452
|
"type": "number",
|
|
445
453
|
"description": "VAT charged on top of this line, when the channel splits it out separately.",
|
|
446
454
|
"example": 0
|
|
455
|
+
},
|
|
456
|
+
"promotionType": {
|
|
457
|
+
"type": "string",
|
|
458
|
+
"description": "Discount lines only: the listing promotion that produced the discount, named as in `GET /v1/listings/{id}/promotions` (Airbnb reports each applied promotion as its own line). `custom` is an Airbnb Custom promotion."
|
|
447
459
|
}
|
|
448
460
|
}
|
|
449
461
|
},
|
|
@@ -1544,6 +1556,15 @@
|
|
|
1544
1556
|
"format": "uri",
|
|
1545
1557
|
"nullable": true,
|
|
1546
1558
|
"description": "Durable link that reopens the hosted Connect flow bound to this account on the fix screen \u2014 send the host here to resolve `action`. Present only when `action.required` is true; `null` otherwise."
|
|
1559
|
+
},
|
|
1560
|
+
"import": {
|
|
1561
|
+
"allOf": [
|
|
1562
|
+
{
|
|
1563
|
+
"$ref": "#/components/schemas/AccountImport"
|
|
1564
|
+
}
|
|
1565
|
+
],
|
|
1566
|
+
"nullable": true,
|
|
1567
|
+
"description": "The account's latest import \u2014 `status: running` while the first sync (or a later one) is going, then `completed` or `failed`. `null` when no import has been recorded. The same run is announced by the `account.import.*` webhooks; the history is on `GET /v1/connections/{id}/imports`."
|
|
1547
1568
|
}
|
|
1548
1569
|
}
|
|
1549
1570
|
},
|
|
@@ -2673,6 +2694,9 @@
|
|
|
2673
2694
|
"account.created",
|
|
2674
2695
|
"connect.session.completed",
|
|
2675
2696
|
"account.disconnected",
|
|
2697
|
+
"account.import.started",
|
|
2698
|
+
"account.import.completed",
|
|
2699
|
+
"account.import.failed",
|
|
2676
2700
|
"review.created",
|
|
2677
2701
|
"review.responded",
|
|
2678
2702
|
"ai.operation.completed",
|
|
@@ -3630,7 +3654,7 @@
|
|
|
3630
3654
|
},
|
|
3631
3655
|
"ListingUpdatedPayload": {
|
|
3632
3656
|
"type": "object",
|
|
3633
|
-
"description": "Payload for `listing.updated`. Something about the listing changed on the channel \u2014 content, pricing, booking settings, house rules, availability
|
|
3657
|
+
"description": "Payload for `listing.updated`. Something about the listing changed on the channel \u2014 content, pricing, booking settings, house rules, availability, sync settings or promotions.",
|
|
3634
3658
|
"required": [
|
|
3635
3659
|
"object"
|
|
3636
3660
|
],
|
|
@@ -3640,7 +3664,7 @@
|
|
|
3640
3664
|
},
|
|
3641
3665
|
"area": {
|
|
3642
3666
|
"type": "string",
|
|
3643
|
-
"description": "Which part moved. Airbnb sends one notification per area rather than a diff, so this is the signal for what to re-read.",
|
|
3667
|
+
"description": "Which part moved. Airbnb sends one notification per area rather than a diff, so this is the signal for what to re-read. `promotions`: the listing\u2019s Airbnb or Booking.com promotions changed \u2014 re-read `GET /v1/listings/{id}/promotions`.",
|
|
3644
3668
|
"example": "content"
|
|
3645
3669
|
},
|
|
3646
3670
|
"previousAttributes": {
|
|
@@ -4890,259 +4914,528 @@
|
|
|
4890
4914
|
}
|
|
4891
4915
|
}
|
|
4892
4916
|
},
|
|
4893
|
-
"
|
|
4917
|
+
"AccountImportStage": {
|
|
4894
4918
|
"type": "object",
|
|
4895
|
-
"
|
|
4896
|
-
"event",
|
|
4897
|
-
"eventId",
|
|
4898
|
-
"apiVersion",
|
|
4899
|
-
"timestamp",
|
|
4900
|
-
"data"
|
|
4901
|
-
],
|
|
4919
|
+
"description": "One stage of an account import (e.g. `reservations`). The stage is done when `done + failed` reaches `expected`.",
|
|
4902
4920
|
"properties": {
|
|
4903
|
-
"
|
|
4904
|
-
"type": "string",
|
|
4905
|
-
"description": "The event name. This field is `event`, not `type`."
|
|
4906
|
-
},
|
|
4907
|
-
"eventId": {
|
|
4908
|
-
"type": "string",
|
|
4909
|
-
"format": "uuid",
|
|
4910
|
-
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
4911
|
-
},
|
|
4912
|
-
"apiVersion": {
|
|
4921
|
+
"name": {
|
|
4913
4922
|
"type": "string",
|
|
4914
|
-
"example": "
|
|
4923
|
+
"example": "reservations"
|
|
4915
4924
|
},
|
|
4916
|
-
"
|
|
4917
|
-
"type": "
|
|
4918
|
-
"
|
|
4919
|
-
"description": "
|
|
4925
|
+
"expected": {
|
|
4926
|
+
"type": "integer",
|
|
4927
|
+
"nullable": true,
|
|
4928
|
+
"description": "Units of work in this stage (one per page, chunk, listing or thread, depending on the channel). `null` until the stage knows its size."
|
|
4920
4929
|
},
|
|
4921
|
-
"
|
|
4922
|
-
"
|
|
4930
|
+
"done": {
|
|
4931
|
+
"type": "integer"
|
|
4923
4932
|
},
|
|
4924
|
-
"
|
|
4925
|
-
"
|
|
4933
|
+
"failed": {
|
|
4934
|
+
"type": "integer"
|
|
4926
4935
|
}
|
|
4927
4936
|
}
|
|
4928
4937
|
},
|
|
4929
|
-
"
|
|
4938
|
+
"AccountImportCounts": {
|
|
4930
4939
|
"type": "object",
|
|
4931
|
-
"
|
|
4932
|
-
"event",
|
|
4933
|
-
"eventId",
|
|
4934
|
-
"apiVersion",
|
|
4935
|
-
"timestamp",
|
|
4936
|
-
"data"
|
|
4937
|
-
],
|
|
4940
|
+
"description": "What the import brought in. A channel reports the keys it imports.",
|
|
4938
4941
|
"properties": {
|
|
4939
|
-
"
|
|
4940
|
-
"type": "
|
|
4941
|
-
"description": "The event name. This field is `event`, not `type`."
|
|
4942
|
+
"listings": {
|
|
4943
|
+
"type": "integer"
|
|
4942
4944
|
},
|
|
4943
|
-
"
|
|
4944
|
-
"type": "
|
|
4945
|
-
"format": "uuid",
|
|
4946
|
-
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
4945
|
+
"reservations": {
|
|
4946
|
+
"type": "integer"
|
|
4947
4947
|
},
|
|
4948
|
-
"
|
|
4949
|
-
"type": "
|
|
4950
|
-
"example": "2026-04"
|
|
4948
|
+
"conversations": {
|
|
4949
|
+
"type": "integer"
|
|
4951
4950
|
},
|
|
4952
|
-
"
|
|
4953
|
-
"type": "
|
|
4954
|
-
"format": "date-time",
|
|
4955
|
-
"description": "When this delivery was built."
|
|
4951
|
+
"messages": {
|
|
4952
|
+
"type": "integer"
|
|
4956
4953
|
},
|
|
4957
|
-
"
|
|
4958
|
-
"
|
|
4954
|
+
"reviews": {
|
|
4955
|
+
"type": "integer"
|
|
4959
4956
|
},
|
|
4960
|
-
"
|
|
4961
|
-
"
|
|
4957
|
+
"payments": {
|
|
4958
|
+
"type": "integer"
|
|
4962
4959
|
}
|
|
4963
4960
|
}
|
|
4964
4961
|
},
|
|
4965
|
-
"
|
|
4962
|
+
"AccountImport": {
|
|
4966
4963
|
"type": "object",
|
|
4967
|
-
"
|
|
4968
|
-
"event",
|
|
4969
|
-
"eventId",
|
|
4970
|
-
"apiVersion",
|
|
4971
|
-
"timestamp",
|
|
4972
|
-
"data"
|
|
4973
|
-
],
|
|
4964
|
+
"description": "One import run of a connected account: the first sync after connecting, a room or unit mapped later, a reconnect or a re-sync.",
|
|
4974
4965
|
"properties": {
|
|
4975
|
-
"
|
|
4976
|
-
"type": "string",
|
|
4977
|
-
"description": "The event name. This field is `event`, not `type`."
|
|
4978
|
-
},
|
|
4979
|
-
"eventId": {
|
|
4966
|
+
"id": {
|
|
4980
4967
|
"type": "string",
|
|
4981
4968
|
"format": "uuid",
|
|
4982
|
-
"description": "
|
|
4969
|
+
"description": "The import id \u2014 the `importId` on `account.import.*` webhooks."
|
|
4983
4970
|
},
|
|
4984
|
-
"
|
|
4985
|
-
"type": "string"
|
|
4986
|
-
"example": "2026-04"
|
|
4971
|
+
"status": {
|
|
4972
|
+
"type": "string"
|
|
4987
4973
|
},
|
|
4988
|
-
"
|
|
4989
|
-
"type": "string"
|
|
4990
|
-
"format": "date-time",
|
|
4991
|
-
"description": "When this delivery was built."
|
|
4974
|
+
"trigger": {
|
|
4975
|
+
"type": "string"
|
|
4992
4976
|
},
|
|
4993
|
-
"
|
|
4994
|
-
"
|
|
4977
|
+
"outcome": {
|
|
4978
|
+
"type": "string",
|
|
4979
|
+
"nullable": true,
|
|
4980
|
+
"description": "`completed` imports only: `partial` when some units failed (see `stages`)."
|
|
4995
4981
|
},
|
|
4996
|
-
"
|
|
4997
|
-
"$ref": "#/components/schemas/ReviewCreatedPayload"
|
|
4998
|
-
}
|
|
4999
|
-
}
|
|
5000
|
-
},
|
|
5001
|
-
"ReviewRespondedEvent": {
|
|
5002
|
-
"type": "object",
|
|
5003
|
-
"required": [
|
|
5004
|
-
"event",
|
|
5005
|
-
"eventId",
|
|
5006
|
-
"apiVersion",
|
|
5007
|
-
"timestamp",
|
|
5008
|
-
"data"
|
|
5009
|
-
],
|
|
5010
|
-
"properties": {
|
|
5011
|
-
"event": {
|
|
4982
|
+
"reason": {
|
|
5012
4983
|
"type": "string",
|
|
5013
|
-
"
|
|
4984
|
+
"nullable": true,
|
|
4985
|
+
"description": "`failed` imports only: why it stopped \u2014 e.g. `needs_permissions`, `duplicate_account`, `stalled`."
|
|
5014
4986
|
},
|
|
5015
|
-
"
|
|
4987
|
+
"startedAt": {
|
|
5016
4988
|
"type": "string",
|
|
5017
|
-
"format": "
|
|
5018
|
-
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
4989
|
+
"format": "date-time"
|
|
5019
4990
|
},
|
|
5020
|
-
"
|
|
4991
|
+
"lastActivityAt": {
|
|
5021
4992
|
"type": "string",
|
|
5022
|
-
"
|
|
4993
|
+
"format": "date-time"
|
|
5023
4994
|
},
|
|
5024
|
-
"
|
|
4995
|
+
"completedAt": {
|
|
5025
4996
|
"type": "string",
|
|
5026
4997
|
"format": "date-time",
|
|
5027
|
-
"
|
|
4998
|
+
"nullable": true
|
|
5028
4999
|
},
|
|
5029
|
-
"
|
|
5030
|
-
"
|
|
5000
|
+
"stages": {
|
|
5001
|
+
"type": "array",
|
|
5002
|
+
"items": {
|
|
5003
|
+
"$ref": "#/components/schemas/AccountImportStage"
|
|
5004
|
+
}
|
|
5031
5005
|
},
|
|
5032
|
-
"
|
|
5033
|
-
"$ref": "#/components/schemas/
|
|
5006
|
+
"counts": {
|
|
5007
|
+
"$ref": "#/components/schemas/AccountImportCounts"
|
|
5034
5008
|
}
|
|
5035
5009
|
}
|
|
5036
5010
|
},
|
|
5037
|
-
"
|
|
5011
|
+
"AccountImportStartedPayload": {
|
|
5038
5012
|
"type": "object",
|
|
5039
|
-
"required": [
|
|
5040
|
-
"event",
|
|
5041
|
-
"eventId",
|
|
5042
|
-
"apiVersion",
|
|
5043
|
-
"timestamp",
|
|
5044
|
-
"data"
|
|
5045
|
-
],
|
|
5046
5013
|
"properties": {
|
|
5047
|
-
"
|
|
5048
|
-
"type": "string",
|
|
5049
|
-
"description": "The event name. This field is `event`, not `type`."
|
|
5050
|
-
},
|
|
5051
|
-
"eventId": {
|
|
5014
|
+
"importId": {
|
|
5052
5015
|
"type": "string",
|
|
5053
|
-
"format": "uuid"
|
|
5054
|
-
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5016
|
+
"format": "uuid"
|
|
5055
5017
|
},
|
|
5056
|
-
"
|
|
5057
|
-
"type": "string"
|
|
5058
|
-
"example": "2026-04"
|
|
5018
|
+
"trigger": {
|
|
5019
|
+
"type": "string"
|
|
5059
5020
|
},
|
|
5060
|
-
"
|
|
5021
|
+
"startedAt": {
|
|
5061
5022
|
"type": "string",
|
|
5062
|
-
"format": "date-time"
|
|
5063
|
-
"description": "When this delivery was built."
|
|
5064
|
-
},
|
|
5065
|
-
"account": {
|
|
5066
|
-
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5023
|
+
"format": "date-time"
|
|
5067
5024
|
},
|
|
5068
|
-
"
|
|
5069
|
-
"
|
|
5025
|
+
"stages": {
|
|
5026
|
+
"type": "array",
|
|
5027
|
+
"items": {
|
|
5028
|
+
"type": "string"
|
|
5029
|
+
},
|
|
5030
|
+
"description": "The stages this import will run."
|
|
5070
5031
|
}
|
|
5071
5032
|
}
|
|
5072
5033
|
},
|
|
5073
|
-
"
|
|
5034
|
+
"AccountImportFinishedPayload": {
|
|
5074
5035
|
"type": "object",
|
|
5075
|
-
"required": [
|
|
5076
|
-
"event",
|
|
5077
|
-
"eventId",
|
|
5078
|
-
"apiVersion",
|
|
5079
|
-
"timestamp",
|
|
5080
|
-
"data"
|
|
5081
|
-
],
|
|
5082
5036
|
"properties": {
|
|
5083
|
-
"
|
|
5084
|
-
"type": "string",
|
|
5085
|
-
"description": "The event name. This field is `event`, not `type`."
|
|
5086
|
-
},
|
|
5087
|
-
"eventId": {
|
|
5088
|
-
"type": "string",
|
|
5089
|
-
"format": "uuid",
|
|
5090
|
-
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5091
|
-
},
|
|
5092
|
-
"apiVersion": {
|
|
5037
|
+
"importId": {
|
|
5093
5038
|
"type": "string",
|
|
5094
|
-
"
|
|
5039
|
+
"format": "uuid"
|
|
5095
5040
|
},
|
|
5096
|
-
"
|
|
5097
|
-
"type": "string"
|
|
5098
|
-
"format": "date-time",
|
|
5099
|
-
"description": "When this delivery was built."
|
|
5041
|
+
"trigger": {
|
|
5042
|
+
"type": "string"
|
|
5100
5043
|
},
|
|
5101
|
-
"
|
|
5102
|
-
"
|
|
5044
|
+
"status": {
|
|
5045
|
+
"type": "string"
|
|
5103
5046
|
},
|
|
5104
|
-
"
|
|
5105
|
-
"$ref": "#/components/schemas/AiOperationFailedPayload"
|
|
5106
|
-
}
|
|
5107
|
-
}
|
|
5108
|
-
},
|
|
5109
|
-
"PaymentCompletedEvent": {
|
|
5110
|
-
"type": "object",
|
|
5111
|
-
"required": [
|
|
5112
|
-
"event",
|
|
5113
|
-
"eventId",
|
|
5114
|
-
"apiVersion",
|
|
5115
|
-
"timestamp",
|
|
5116
|
-
"data"
|
|
5117
|
-
],
|
|
5118
|
-
"properties": {
|
|
5119
|
-
"event": {
|
|
5047
|
+
"outcome": {
|
|
5120
5048
|
"type": "string",
|
|
5121
|
-
"
|
|
5049
|
+
"nullable": true
|
|
5122
5050
|
},
|
|
5123
|
-
"
|
|
5051
|
+
"startedAt": {
|
|
5124
5052
|
"type": "string",
|
|
5125
|
-
"format": "
|
|
5126
|
-
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5053
|
+
"format": "date-time"
|
|
5127
5054
|
},
|
|
5128
|
-
"
|
|
5055
|
+
"completedAt": {
|
|
5129
5056
|
"type": "string",
|
|
5130
|
-
"
|
|
5057
|
+
"format": "date-time"
|
|
5131
5058
|
},
|
|
5132
|
-
"
|
|
5133
|
-
"type": "
|
|
5134
|
-
"
|
|
5135
|
-
|
|
5059
|
+
"stages": {
|
|
5060
|
+
"type": "array",
|
|
5061
|
+
"items": {
|
|
5062
|
+
"$ref": "#/components/schemas/AccountImportStage"
|
|
5063
|
+
}
|
|
5136
5064
|
},
|
|
5137
|
-
"
|
|
5138
|
-
"$ref": "#/components/schemas/
|
|
5065
|
+
"counts": {
|
|
5066
|
+
"$ref": "#/components/schemas/AccountImportCounts"
|
|
5139
5067
|
},
|
|
5140
|
-
"
|
|
5141
|
-
"
|
|
5068
|
+
"reason": {
|
|
5069
|
+
"type": "string",
|
|
5070
|
+
"nullable": true,
|
|
5071
|
+
"description": "`account.import.failed` only."
|
|
5142
5072
|
}
|
|
5143
5073
|
}
|
|
5144
5074
|
},
|
|
5145
|
-
"
|
|
5075
|
+
"AccountImportStartedEvent": {
|
|
5076
|
+
"type": "object",
|
|
5077
|
+
"required": [
|
|
5078
|
+
"event",
|
|
5079
|
+
"eventId",
|
|
5080
|
+
"apiVersion",
|
|
5081
|
+
"timestamp",
|
|
5082
|
+
"data"
|
|
5083
|
+
],
|
|
5084
|
+
"properties": {
|
|
5085
|
+
"event": {
|
|
5086
|
+
"type": "string",
|
|
5087
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5088
|
+
},
|
|
5089
|
+
"eventId": {
|
|
5090
|
+
"type": "string",
|
|
5091
|
+
"format": "uuid",
|
|
5092
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5093
|
+
},
|
|
5094
|
+
"apiVersion": {
|
|
5095
|
+
"type": "string",
|
|
5096
|
+
"example": "2026-04"
|
|
5097
|
+
},
|
|
5098
|
+
"timestamp": {
|
|
5099
|
+
"type": "string",
|
|
5100
|
+
"format": "date-time",
|
|
5101
|
+
"description": "When this delivery was built."
|
|
5102
|
+
},
|
|
5103
|
+
"account": {
|
|
5104
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5105
|
+
},
|
|
5106
|
+
"data": {
|
|
5107
|
+
"$ref": "#/components/schemas/AccountImportStartedPayload"
|
|
5108
|
+
}
|
|
5109
|
+
},
|
|
5110
|
+
"description": "An account import began."
|
|
5111
|
+
},
|
|
5112
|
+
"AccountImportCompletedEvent": {
|
|
5113
|
+
"type": "object",
|
|
5114
|
+
"required": [
|
|
5115
|
+
"event",
|
|
5116
|
+
"eventId",
|
|
5117
|
+
"apiVersion",
|
|
5118
|
+
"timestamp",
|
|
5119
|
+
"data"
|
|
5120
|
+
],
|
|
5121
|
+
"properties": {
|
|
5122
|
+
"event": {
|
|
5123
|
+
"type": "string",
|
|
5124
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5125
|
+
},
|
|
5126
|
+
"eventId": {
|
|
5127
|
+
"type": "string",
|
|
5128
|
+
"format": "uuid",
|
|
5129
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5130
|
+
},
|
|
5131
|
+
"apiVersion": {
|
|
5132
|
+
"type": "string",
|
|
5133
|
+
"example": "2026-04"
|
|
5134
|
+
},
|
|
5135
|
+
"timestamp": {
|
|
5136
|
+
"type": "string",
|
|
5137
|
+
"format": "date-time",
|
|
5138
|
+
"description": "When this delivery was built."
|
|
5139
|
+
},
|
|
5140
|
+
"account": {
|
|
5141
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5142
|
+
},
|
|
5143
|
+
"data": {
|
|
5144
|
+
"$ref": "#/components/schemas/AccountImportFinishedPayload"
|
|
5145
|
+
}
|
|
5146
|
+
},
|
|
5147
|
+
"description": "Every stage of an account import finished. Its data is readable through the API."
|
|
5148
|
+
},
|
|
5149
|
+
"AccountImportFailedEvent": {
|
|
5150
|
+
"type": "object",
|
|
5151
|
+
"required": [
|
|
5152
|
+
"event",
|
|
5153
|
+
"eventId",
|
|
5154
|
+
"apiVersion",
|
|
5155
|
+
"timestamp",
|
|
5156
|
+
"data"
|
|
5157
|
+
],
|
|
5158
|
+
"properties": {
|
|
5159
|
+
"event": {
|
|
5160
|
+
"type": "string",
|
|
5161
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5162
|
+
},
|
|
5163
|
+
"eventId": {
|
|
5164
|
+
"type": "string",
|
|
5165
|
+
"format": "uuid",
|
|
5166
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5167
|
+
},
|
|
5168
|
+
"apiVersion": {
|
|
5169
|
+
"type": "string",
|
|
5170
|
+
"example": "2026-04"
|
|
5171
|
+
},
|
|
5172
|
+
"timestamp": {
|
|
5173
|
+
"type": "string",
|
|
5174
|
+
"format": "date-time",
|
|
5175
|
+
"description": "When this delivery was built."
|
|
5176
|
+
},
|
|
5177
|
+
"account": {
|
|
5178
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5179
|
+
},
|
|
5180
|
+
"data": {
|
|
5181
|
+
"$ref": "#/components/schemas/AccountImportFinishedPayload"
|
|
5182
|
+
}
|
|
5183
|
+
},
|
|
5184
|
+
"description": "An account import stopped before finishing; `data.reason` says why."
|
|
5185
|
+
},
|
|
5186
|
+
"ConnectSessionCompletedEvent": {
|
|
5187
|
+
"type": "object",
|
|
5188
|
+
"required": [
|
|
5189
|
+
"event",
|
|
5190
|
+
"eventId",
|
|
5191
|
+
"apiVersion",
|
|
5192
|
+
"timestamp",
|
|
5193
|
+
"data"
|
|
5194
|
+
],
|
|
5195
|
+
"properties": {
|
|
5196
|
+
"event": {
|
|
5197
|
+
"type": "string",
|
|
5198
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5199
|
+
},
|
|
5200
|
+
"eventId": {
|
|
5201
|
+
"type": "string",
|
|
5202
|
+
"format": "uuid",
|
|
5203
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5204
|
+
},
|
|
5205
|
+
"apiVersion": {
|
|
5206
|
+
"type": "string",
|
|
5207
|
+
"example": "2026-04"
|
|
5208
|
+
},
|
|
5209
|
+
"timestamp": {
|
|
5210
|
+
"type": "string",
|
|
5211
|
+
"format": "date-time",
|
|
5212
|
+
"description": "When this delivery was built."
|
|
5213
|
+
},
|
|
5214
|
+
"account": {
|
|
5215
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5216
|
+
},
|
|
5217
|
+
"data": {
|
|
5218
|
+
"$ref": "#/components/schemas/ConnectSessionCompletedPayload"
|
|
5219
|
+
}
|
|
5220
|
+
}
|
|
5221
|
+
},
|
|
5222
|
+
"AccountDisconnectedEvent": {
|
|
5223
|
+
"type": "object",
|
|
5224
|
+
"required": [
|
|
5225
|
+
"event",
|
|
5226
|
+
"eventId",
|
|
5227
|
+
"apiVersion",
|
|
5228
|
+
"timestamp",
|
|
5229
|
+
"data"
|
|
5230
|
+
],
|
|
5231
|
+
"properties": {
|
|
5232
|
+
"event": {
|
|
5233
|
+
"type": "string",
|
|
5234
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5235
|
+
},
|
|
5236
|
+
"eventId": {
|
|
5237
|
+
"type": "string",
|
|
5238
|
+
"format": "uuid",
|
|
5239
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5240
|
+
},
|
|
5241
|
+
"apiVersion": {
|
|
5242
|
+
"type": "string",
|
|
5243
|
+
"example": "2026-04"
|
|
5244
|
+
},
|
|
5245
|
+
"timestamp": {
|
|
5246
|
+
"type": "string",
|
|
5247
|
+
"format": "date-time",
|
|
5248
|
+
"description": "When this delivery was built."
|
|
5249
|
+
},
|
|
5250
|
+
"account": {
|
|
5251
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5252
|
+
},
|
|
5253
|
+
"data": {
|
|
5254
|
+
"$ref": "#/components/schemas/AccountDisconnectedPayload"
|
|
5255
|
+
}
|
|
5256
|
+
}
|
|
5257
|
+
},
|
|
5258
|
+
"ReviewCreatedEvent": {
|
|
5259
|
+
"type": "object",
|
|
5260
|
+
"required": [
|
|
5261
|
+
"event",
|
|
5262
|
+
"eventId",
|
|
5263
|
+
"apiVersion",
|
|
5264
|
+
"timestamp",
|
|
5265
|
+
"data"
|
|
5266
|
+
],
|
|
5267
|
+
"properties": {
|
|
5268
|
+
"event": {
|
|
5269
|
+
"type": "string",
|
|
5270
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5271
|
+
},
|
|
5272
|
+
"eventId": {
|
|
5273
|
+
"type": "string",
|
|
5274
|
+
"format": "uuid",
|
|
5275
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5276
|
+
},
|
|
5277
|
+
"apiVersion": {
|
|
5278
|
+
"type": "string",
|
|
5279
|
+
"example": "2026-04"
|
|
5280
|
+
},
|
|
5281
|
+
"timestamp": {
|
|
5282
|
+
"type": "string",
|
|
5283
|
+
"format": "date-time",
|
|
5284
|
+
"description": "When this delivery was built."
|
|
5285
|
+
},
|
|
5286
|
+
"account": {
|
|
5287
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5288
|
+
},
|
|
5289
|
+
"data": {
|
|
5290
|
+
"$ref": "#/components/schemas/ReviewCreatedPayload"
|
|
5291
|
+
}
|
|
5292
|
+
}
|
|
5293
|
+
},
|
|
5294
|
+
"ReviewRespondedEvent": {
|
|
5295
|
+
"type": "object",
|
|
5296
|
+
"required": [
|
|
5297
|
+
"event",
|
|
5298
|
+
"eventId",
|
|
5299
|
+
"apiVersion",
|
|
5300
|
+
"timestamp",
|
|
5301
|
+
"data"
|
|
5302
|
+
],
|
|
5303
|
+
"properties": {
|
|
5304
|
+
"event": {
|
|
5305
|
+
"type": "string",
|
|
5306
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5307
|
+
},
|
|
5308
|
+
"eventId": {
|
|
5309
|
+
"type": "string",
|
|
5310
|
+
"format": "uuid",
|
|
5311
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5312
|
+
},
|
|
5313
|
+
"apiVersion": {
|
|
5314
|
+
"type": "string",
|
|
5315
|
+
"example": "2026-04"
|
|
5316
|
+
},
|
|
5317
|
+
"timestamp": {
|
|
5318
|
+
"type": "string",
|
|
5319
|
+
"format": "date-time",
|
|
5320
|
+
"description": "When this delivery was built."
|
|
5321
|
+
},
|
|
5322
|
+
"account": {
|
|
5323
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5324
|
+
},
|
|
5325
|
+
"data": {
|
|
5326
|
+
"$ref": "#/components/schemas/ReviewRespondedPayload"
|
|
5327
|
+
}
|
|
5328
|
+
}
|
|
5329
|
+
},
|
|
5330
|
+
"AiOperationCompletedEvent": {
|
|
5331
|
+
"type": "object",
|
|
5332
|
+
"required": [
|
|
5333
|
+
"event",
|
|
5334
|
+
"eventId",
|
|
5335
|
+
"apiVersion",
|
|
5336
|
+
"timestamp",
|
|
5337
|
+
"data"
|
|
5338
|
+
],
|
|
5339
|
+
"properties": {
|
|
5340
|
+
"event": {
|
|
5341
|
+
"type": "string",
|
|
5342
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5343
|
+
},
|
|
5344
|
+
"eventId": {
|
|
5345
|
+
"type": "string",
|
|
5346
|
+
"format": "uuid",
|
|
5347
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5348
|
+
},
|
|
5349
|
+
"apiVersion": {
|
|
5350
|
+
"type": "string",
|
|
5351
|
+
"example": "2026-04"
|
|
5352
|
+
},
|
|
5353
|
+
"timestamp": {
|
|
5354
|
+
"type": "string",
|
|
5355
|
+
"format": "date-time",
|
|
5356
|
+
"description": "When this delivery was built."
|
|
5357
|
+
},
|
|
5358
|
+
"account": {
|
|
5359
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5360
|
+
},
|
|
5361
|
+
"data": {
|
|
5362
|
+
"$ref": "#/components/schemas/AiOperationCompletedPayload"
|
|
5363
|
+
}
|
|
5364
|
+
}
|
|
5365
|
+
},
|
|
5366
|
+
"AiOperationFailedEvent": {
|
|
5367
|
+
"type": "object",
|
|
5368
|
+
"required": [
|
|
5369
|
+
"event",
|
|
5370
|
+
"eventId",
|
|
5371
|
+
"apiVersion",
|
|
5372
|
+
"timestamp",
|
|
5373
|
+
"data"
|
|
5374
|
+
],
|
|
5375
|
+
"properties": {
|
|
5376
|
+
"event": {
|
|
5377
|
+
"type": "string",
|
|
5378
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5379
|
+
},
|
|
5380
|
+
"eventId": {
|
|
5381
|
+
"type": "string",
|
|
5382
|
+
"format": "uuid",
|
|
5383
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5384
|
+
},
|
|
5385
|
+
"apiVersion": {
|
|
5386
|
+
"type": "string",
|
|
5387
|
+
"example": "2026-04"
|
|
5388
|
+
},
|
|
5389
|
+
"timestamp": {
|
|
5390
|
+
"type": "string",
|
|
5391
|
+
"format": "date-time",
|
|
5392
|
+
"description": "When this delivery was built."
|
|
5393
|
+
},
|
|
5394
|
+
"account": {
|
|
5395
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5396
|
+
},
|
|
5397
|
+
"data": {
|
|
5398
|
+
"$ref": "#/components/schemas/AiOperationFailedPayload"
|
|
5399
|
+
}
|
|
5400
|
+
}
|
|
5401
|
+
},
|
|
5402
|
+
"PaymentCompletedEvent": {
|
|
5403
|
+
"type": "object",
|
|
5404
|
+
"required": [
|
|
5405
|
+
"event",
|
|
5406
|
+
"eventId",
|
|
5407
|
+
"apiVersion",
|
|
5408
|
+
"timestamp",
|
|
5409
|
+
"data"
|
|
5410
|
+
],
|
|
5411
|
+
"properties": {
|
|
5412
|
+
"event": {
|
|
5413
|
+
"type": "string",
|
|
5414
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
5415
|
+
},
|
|
5416
|
+
"eventId": {
|
|
5417
|
+
"type": "string",
|
|
5418
|
+
"format": "uuid",
|
|
5419
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
5420
|
+
},
|
|
5421
|
+
"apiVersion": {
|
|
5422
|
+
"type": "string",
|
|
5423
|
+
"example": "2026-04"
|
|
5424
|
+
},
|
|
5425
|
+
"timestamp": {
|
|
5426
|
+
"type": "string",
|
|
5427
|
+
"format": "date-time",
|
|
5428
|
+
"description": "When this delivery was built."
|
|
5429
|
+
},
|
|
5430
|
+
"account": {
|
|
5431
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
5432
|
+
},
|
|
5433
|
+
"data": {
|
|
5434
|
+
"$ref": "#/components/schemas/PaymentCompletedPayload"
|
|
5435
|
+
}
|
|
5436
|
+
}
|
|
5437
|
+
},
|
|
5438
|
+
"PayoutCompletedEvent": {
|
|
5146
5439
|
"type": "object",
|
|
5147
5440
|
"required": [
|
|
5148
5441
|
"event",
|
|
@@ -5489,6 +5782,15 @@
|
|
|
5489
5782
|
{
|
|
5490
5783
|
"$ref": "#/components/schemas/AccountDisconnectedEvent"
|
|
5491
5784
|
},
|
|
5785
|
+
{
|
|
5786
|
+
"$ref": "#/components/schemas/AccountImportStartedEvent"
|
|
5787
|
+
},
|
|
5788
|
+
{
|
|
5789
|
+
"$ref": "#/components/schemas/AccountImportCompletedEvent"
|
|
5790
|
+
},
|
|
5791
|
+
{
|
|
5792
|
+
"$ref": "#/components/schemas/AccountImportFailedEvent"
|
|
5793
|
+
},
|
|
5492
5794
|
{
|
|
5493
5795
|
"$ref": "#/components/schemas/ReviewCreatedEvent"
|
|
5494
5796
|
},
|
|
@@ -5547,6 +5849,9 @@
|
|
|
5547
5849
|
"account.created": "#/components/schemas/AccountCreatedEvent",
|
|
5548
5850
|
"connect.session.completed": "#/components/schemas/ConnectSessionCompletedEvent",
|
|
5549
5851
|
"account.disconnected": "#/components/schemas/AccountDisconnectedEvent",
|
|
5852
|
+
"account.import.started": "#/components/schemas/AccountImportStartedEvent",
|
|
5853
|
+
"account.import.completed": "#/components/schemas/AccountImportCompletedEvent",
|
|
5854
|
+
"account.import.failed": "#/components/schemas/AccountImportFailedEvent",
|
|
5550
5855
|
"review.created": "#/components/schemas/ReviewCreatedEvent",
|
|
5551
5856
|
"review.responded": "#/components/schemas/ReviewRespondedEvent",
|
|
5552
5857
|
"ai.operation.completed": "#/components/schemas/AiOperationCompletedEvent",
|
|
@@ -7408,7 +7713,13 @@
|
|
|
7408
7713
|
"statementUrl": {
|
|
7409
7714
|
"type": "string",
|
|
7410
7715
|
"nullable": true,
|
|
7411
|
-
"description": "
|
|
7716
|
+
"description": "Repull-hosted download link for the original payout statement PDF (the authoritative settlement record). Add `?format=csv` for the CSV. Served by `GET /v1/transactions/{id}/statement` \u2014 no channel session needed. Null when none is stored."
|
|
7717
|
+
},
|
|
7718
|
+
"statementId": {
|
|
7719
|
+
"type": "string",
|
|
7720
|
+
"nullable": true,
|
|
7721
|
+
"description": "The channel's own numeric statement id (Booking.com, e.g. \"010747030095\"). Null when none.",
|
|
7722
|
+
"example": "010747030095"
|
|
7412
7723
|
}
|
|
7413
7724
|
}
|
|
7414
7725
|
},
|
|
@@ -7432,6 +7743,97 @@
|
|
|
7432
7743
|
}
|
|
7433
7744
|
}
|
|
7434
7745
|
},
|
|
7746
|
+
"Resolution": {
|
|
7747
|
+
"type": "object",
|
|
7748
|
+
"description": "An Airbnb Resolution Center case (AirCover / damage, extra-guest, refund or change request). Read-only \u2014 Airbnb exposes no create/evidence/status API. The money a resolution moved rides in the transactions ledger as `Resolution Payout` / `Resolution Adjustment` rows sharing the same reference; join on `resolutionId`.",
|
|
7749
|
+
"required": [
|
|
7750
|
+
"resolutionId",
|
|
7751
|
+
"status"
|
|
7752
|
+
],
|
|
7753
|
+
"properties": {
|
|
7754
|
+
"resolutionId": {
|
|
7755
|
+
"type": "string",
|
|
7756
|
+
"description": "Airbnb's resolution id \u2014 the `{id}` path value and the join key to a transaction's `reference`.",
|
|
7757
|
+
"example": "CLSF-06464054"
|
|
7758
|
+
},
|
|
7759
|
+
"confirmationCode": {
|
|
7760
|
+
"type": "string",
|
|
7761
|
+
"nullable": true,
|
|
7762
|
+
"description": "Airbnb confirmation code of the reservation the case is on.",
|
|
7763
|
+
"example": "HMZKMYCBC5"
|
|
7764
|
+
},
|
|
7765
|
+
"reservationId": {
|
|
7766
|
+
"type": "integer",
|
|
7767
|
+
"nullable": true,
|
|
7768
|
+
"description": "Repull's internal reservation id, when the reservation is in this workspace."
|
|
7769
|
+
},
|
|
7770
|
+
"listingName": {
|
|
7771
|
+
"type": "string",
|
|
7772
|
+
"nullable": true
|
|
7773
|
+
},
|
|
7774
|
+
"status": {
|
|
7775
|
+
"type": "string",
|
|
7776
|
+
"nullable": true,
|
|
7777
|
+
"description": "OPEN or CLOSED, as Airbnb reports it.",
|
|
7778
|
+
"example": "OPEN"
|
|
7779
|
+
},
|
|
7780
|
+
"reason": {
|
|
7781
|
+
"type": "string",
|
|
7782
|
+
"nullable": true,
|
|
7783
|
+
"description": "Why the resolution was opened."
|
|
7784
|
+
},
|
|
7785
|
+
"caseStatus": {
|
|
7786
|
+
"type": "string",
|
|
7787
|
+
"nullable": true,
|
|
7788
|
+
"description": "Airbnb's case-status label."
|
|
7789
|
+
},
|
|
7790
|
+
"statusText": {
|
|
7791
|
+
"type": "string",
|
|
7792
|
+
"nullable": true,
|
|
7793
|
+
"description": "Human-readable status detail."
|
|
7794
|
+
},
|
|
7795
|
+
"suggestedActionText": {
|
|
7796
|
+
"type": "string",
|
|
7797
|
+
"nullable": true,
|
|
7798
|
+
"description": "Airbnb's hint on whose turn it is to act next \u2014 track progress with it."
|
|
7799
|
+
},
|
|
7800
|
+
"customerSupportInitiated": {
|
|
7801
|
+
"type": "boolean",
|
|
7802
|
+
"nullable": true,
|
|
7803
|
+
"description": "True when Airbnb Customer Support (not the host/guest) opened the case."
|
|
7804
|
+
},
|
|
7805
|
+
"productType": {
|
|
7806
|
+
"type": "string",
|
|
7807
|
+
"nullable": true
|
|
7808
|
+
},
|
|
7809
|
+
"initiator": {
|
|
7810
|
+
"type": "object",
|
|
7811
|
+
"nullable": true,
|
|
7812
|
+
"description": "Who opened the case (id + name)."
|
|
7813
|
+
},
|
|
7814
|
+
"responder": {
|
|
7815
|
+
"type": "object",
|
|
7816
|
+
"nullable": true,
|
|
7817
|
+
"description": "Who responds (id + name)."
|
|
7818
|
+
},
|
|
7819
|
+
"createdAt": {
|
|
7820
|
+
"type": "string",
|
|
7821
|
+
"format": "date-time",
|
|
7822
|
+
"nullable": true
|
|
7823
|
+
},
|
|
7824
|
+
"updatedAt": {
|
|
7825
|
+
"type": "string",
|
|
7826
|
+
"format": "date-time",
|
|
7827
|
+
"nullable": true
|
|
7828
|
+
},
|
|
7829
|
+
"syncedAt": {
|
|
7830
|
+
"type": "string",
|
|
7831
|
+
"format": "date-time",
|
|
7832
|
+
"nullable": true,
|
|
7833
|
+
"description": "When Repull last refreshed this case from Airbnb."
|
|
7834
|
+
}
|
|
7835
|
+
}
|
|
7836
|
+
},
|
|
7435
7837
|
"AirbnbConnectionHost": {
|
|
7436
7838
|
"type": "object",
|
|
7437
7839
|
"description": "One Airbnb host record under the workspace, decorated with its most recent disconnect reason from `airbnb_host_events` (backfill events excluded).",
|
|
@@ -9298,301 +9700,919 @@
|
|
|
9298
9700
|
}
|
|
9299
9701
|
}
|
|
9300
9702
|
},
|
|
9301
|
-
"
|
|
9703
|
+
"Promotion": {
|
|
9302
9704
|
"type": "object",
|
|
9705
|
+
"description": "One promotion on one listing. Airbnb sets the discount for its promotions (`discount.setBy: channel`); Booking.com promotions belong to the property and list the rooms they cover in `appliesTo`.",
|
|
9303
9706
|
"properties": {
|
|
9707
|
+
"id": {
|
|
9708
|
+
"type": "string",
|
|
9709
|
+
"description": "Repull id of this promotion on this listing (use it in `/promotions/{promotionId}`)."
|
|
9710
|
+
},
|
|
9304
9711
|
"listingId": {
|
|
9305
9712
|
"type": "string"
|
|
9306
9713
|
},
|
|
9307
|
-
"
|
|
9714
|
+
"channel": {
|
|
9715
|
+
"type": "string"
|
|
9716
|
+
},
|
|
9717
|
+
"type": {
|
|
9718
|
+
"$ref": "#/components/schemas/PromotionType"
|
|
9719
|
+
},
|
|
9720
|
+
"channelType": {
|
|
9721
|
+
"type": "string",
|
|
9722
|
+
"description": "The channel\u2019s own name, e.g. `HIGH_RATED_GUEST_DISCOUNT`, `basic`, `campaign_getaway`."
|
|
9723
|
+
},
|
|
9724
|
+
"externalId": {
|
|
9725
|
+
"type": "string",
|
|
9726
|
+
"description": "The channel\u2019s promotion id. Booking.com may issue a new one when a promotion is changed; the Repull `id` stays the same."
|
|
9727
|
+
},
|
|
9728
|
+
"channelPropertyId": {
|
|
9729
|
+
"type": "string",
|
|
9730
|
+
"description": "Airbnb listing id, or the Booking.com property (hotel id) the promotion belongs to."
|
|
9731
|
+
},
|
|
9732
|
+
"name": {
|
|
9733
|
+
"type": "string",
|
|
9734
|
+
"nullable": true
|
|
9735
|
+
},
|
|
9736
|
+
"status": {
|
|
9737
|
+
"type": "string",
|
|
9738
|
+
"description": "`eligible`: the listing qualifies but is not enrolled (Airbnb new listing promotion). `inactive`: switched off; Booking.com keeps deactivated promotions."
|
|
9739
|
+
},
|
|
9740
|
+
"managedBy": {
|
|
9741
|
+
"type": "string",
|
|
9742
|
+
"description": "`channel`: created in the channel\u2019s own tools and read-only here (Airbnb Custom promotions)."
|
|
9743
|
+
},
|
|
9744
|
+
"managedKey": {
|
|
9745
|
+
"type": "string",
|
|
9746
|
+
"nullable": true,
|
|
9747
|
+
"description": "Set when it comes from the listing\u2019s weekly or monthly discount in its pricing settings \u2014 change those instead."
|
|
9748
|
+
},
|
|
9749
|
+
"editable": {
|
|
9750
|
+
"type": "boolean"
|
|
9751
|
+
},
|
|
9752
|
+
"removable": {
|
|
9753
|
+
"type": "boolean"
|
|
9754
|
+
},
|
|
9755
|
+
"discount": {
|
|
9308
9756
|
"type": "object",
|
|
9309
9757
|
"properties": {
|
|
9310
|
-
"
|
|
9311
|
-
"type": "
|
|
9312
|
-
"
|
|
9758
|
+
"percent": {
|
|
9759
|
+
"type": "number",
|
|
9760
|
+
"nullable": true
|
|
9313
9761
|
},
|
|
9314
|
-
"
|
|
9762
|
+
"setBy": {
|
|
9315
9763
|
"type": "string",
|
|
9316
|
-
"
|
|
9764
|
+
"enum": [
|
|
9765
|
+
"host",
|
|
9766
|
+
"channel"
|
|
9767
|
+
]
|
|
9317
9768
|
}
|
|
9318
9769
|
}
|
|
9319
9770
|
},
|
|
9320
|
-
"
|
|
9321
|
-
"
|
|
9322
|
-
|
|
9323
|
-
|
|
9771
|
+
"rules": {
|
|
9772
|
+
"$ref": "#/components/schemas/PromotionRules"
|
|
9773
|
+
},
|
|
9774
|
+
"appliesTo": {
|
|
9775
|
+
"type": "object",
|
|
9776
|
+
"nullable": true,
|
|
9777
|
+
"description": "Booking.com only. An empty `rooms` list means every room on the property.",
|
|
9778
|
+
"properties": {
|
|
9779
|
+
"rooms": {
|
|
9780
|
+
"type": "array",
|
|
9781
|
+
"items": {
|
|
9782
|
+
"type": "string"
|
|
9783
|
+
}
|
|
9784
|
+
},
|
|
9785
|
+
"ratePlans": {
|
|
9786
|
+
"type": "array",
|
|
9787
|
+
"items": {
|
|
9788
|
+
"type": "string"
|
|
9789
|
+
}
|
|
9790
|
+
}
|
|
9324
9791
|
}
|
|
9325
9792
|
},
|
|
9326
|
-
"
|
|
9793
|
+
"usage": {
|
|
9327
9794
|
"type": "object",
|
|
9328
9795
|
"nullable": true,
|
|
9329
|
-
"description": "AI-derived base-price context for the listing.",
|
|
9330
9796
|
"properties": {
|
|
9331
|
-
"
|
|
9332
|
-
"type": "
|
|
9333
|
-
"nullable": true
|
|
9797
|
+
"bookings": {
|
|
9798
|
+
"type": "integer"
|
|
9334
9799
|
},
|
|
9335
|
-
"
|
|
9800
|
+
"roomNights": {
|
|
9801
|
+
"type": "integer"
|
|
9802
|
+
},
|
|
9803
|
+
"cancellations": {
|
|
9804
|
+
"type": "integer"
|
|
9805
|
+
},
|
|
9806
|
+
"revenue": {
|
|
9336
9807
|
"type": "object",
|
|
9337
|
-
"
|
|
9338
|
-
|
|
9808
|
+
"properties": {
|
|
9809
|
+
"amount": {
|
|
9810
|
+
"type": "number"
|
|
9811
|
+
},
|
|
9812
|
+
"currency": {
|
|
9813
|
+
"type": "string"
|
|
9814
|
+
}
|
|
9815
|
+
}
|
|
9339
9816
|
},
|
|
9340
|
-
"
|
|
9817
|
+
"lastAppliedAt": {
|
|
9341
9818
|
"type": "string",
|
|
9342
|
-
"
|
|
9819
|
+
"format": "date-time",
|
|
9820
|
+
"description": "Airbnb Custom promotion: when it was last applied to a booking."
|
|
9343
9821
|
},
|
|
9344
|
-
"
|
|
9822
|
+
"lastAppliedAmount": {
|
|
9823
|
+
"type": "object",
|
|
9824
|
+
"properties": {
|
|
9825
|
+
"amount": {
|
|
9826
|
+
"type": "number"
|
|
9827
|
+
},
|
|
9828
|
+
"currency": {
|
|
9829
|
+
"type": "string"
|
|
9830
|
+
}
|
|
9831
|
+
}
|
|
9832
|
+
}
|
|
9833
|
+
}
|
|
9834
|
+
},
|
|
9835
|
+
"expiresAt": {
|
|
9836
|
+
"type": "string",
|
|
9837
|
+
"format": "date-time",
|
|
9838
|
+
"nullable": true
|
|
9839
|
+
},
|
|
9840
|
+
"syncedAt": {
|
|
9841
|
+
"type": "string",
|
|
9842
|
+
"format": "date-time"
|
|
9843
|
+
}
|
|
9844
|
+
}
|
|
9845
|
+
},
|
|
9846
|
+
"PromotionType": {
|
|
9847
|
+
"type": "string",
|
|
9848
|
+
"enum": [
|
|
9849
|
+
"new_listing",
|
|
9850
|
+
"mobile",
|
|
9851
|
+
"top_rated_guests",
|
|
9852
|
+
"deal",
|
|
9853
|
+
"last_minute",
|
|
9854
|
+
"early_booker",
|
|
9855
|
+
"country",
|
|
9856
|
+
"campaign",
|
|
9857
|
+
"custom"
|
|
9858
|
+
],
|
|
9859
|
+
"description": "The same idea on both channels shares a type: `mobile` is Airbnb\u2019s mobile-only discount or Booking.com\u2019s mobile rate; `new_listing` is Airbnb\u2019s new listing promotion or Booking.com\u2019s new property deal. `top_rated_guests` is Airbnb only; the deal, last-minute, early-booker, country and campaign types are Booking.com only; `custom` (Airbnb Custom promotion) is read-only."
|
|
9860
|
+
},
|
|
9861
|
+
"PromotionRules": {
|
|
9862
|
+
"type": "object",
|
|
9863
|
+
"description": "Which rules a type supports depends on the channel \u2014 see the catalog.",
|
|
9864
|
+
"properties": {
|
|
9865
|
+
"campaign": {
|
|
9866
|
+
"type": "string",
|
|
9867
|
+
"description": "Booking.com campaigns: `black_friday`, `getaway`, `late_escape`, `early_year`."
|
|
9868
|
+
},
|
|
9869
|
+
"audience": {
|
|
9870
|
+
"type": "string",
|
|
9871
|
+
"description": "`public`, `subscribers` (members only, at least 10%), `app`, `all` (app and mobile web), or a country id from the catalog (e.g. `united_kingdom_pos`)."
|
|
9872
|
+
},
|
|
9873
|
+
"stayWindow": {
|
|
9874
|
+
"type": "object",
|
|
9875
|
+
"properties": {
|
|
9876
|
+
"start": {
|
|
9345
9877
|
"type": "string",
|
|
9346
|
-
"
|
|
9878
|
+
"format": "date"
|
|
9347
9879
|
},
|
|
9348
|
-
"
|
|
9880
|
+
"end": {
|
|
9349
9881
|
"type": "string",
|
|
9350
|
-
"
|
|
9882
|
+
"format": "date"
|
|
9883
|
+
},
|
|
9884
|
+
"weekdays": {
|
|
9885
|
+
"type": "array",
|
|
9886
|
+
"items": {
|
|
9887
|
+
"type": "string",
|
|
9888
|
+
"enum": [
|
|
9889
|
+
"mon",
|
|
9890
|
+
"tue",
|
|
9891
|
+
"wed",
|
|
9892
|
+
"thu",
|
|
9893
|
+
"fri",
|
|
9894
|
+
"sat",
|
|
9895
|
+
"sun"
|
|
9896
|
+
]
|
|
9897
|
+
}
|
|
9898
|
+
},
|
|
9899
|
+
"excludedDates": {
|
|
9900
|
+
"type": "array",
|
|
9901
|
+
"items": {
|
|
9902
|
+
"type": "string",
|
|
9903
|
+
"format": "date"
|
|
9904
|
+
}
|
|
9905
|
+
},
|
|
9906
|
+
"additionalDates": {
|
|
9907
|
+
"type": "array",
|
|
9908
|
+
"items": {
|
|
9909
|
+
"type": "string",
|
|
9910
|
+
"format": "date"
|
|
9911
|
+
}
|
|
9351
9912
|
}
|
|
9352
9913
|
}
|
|
9353
9914
|
},
|
|
9354
|
-
"
|
|
9915
|
+
"bookingWindow": {
|
|
9355
9916
|
"type": "object",
|
|
9356
|
-
"nullable": true,
|
|
9357
|
-
"description": "5km comp aggregate (Atlas comp_listings).",
|
|
9358
9917
|
"properties": {
|
|
9359
|
-
"
|
|
9360
|
-
"type": "
|
|
9918
|
+
"start": {
|
|
9919
|
+
"type": "string",
|
|
9920
|
+
"format": "date"
|
|
9361
9921
|
},
|
|
9362
|
-
"
|
|
9363
|
-
"type": "
|
|
9364
|
-
"
|
|
9922
|
+
"end": {
|
|
9923
|
+
"type": "string",
|
|
9924
|
+
"format": "date"
|
|
9365
9925
|
},
|
|
9366
|
-
"
|
|
9367
|
-
"type": "
|
|
9368
|
-
"
|
|
9926
|
+
"startHour": {
|
|
9927
|
+
"type": "integer",
|
|
9928
|
+
"minimum": 0,
|
|
9929
|
+
"maximum": 23
|
|
9369
9930
|
},
|
|
9370
|
-
"
|
|
9371
|
-
"type": "
|
|
9372
|
-
"
|
|
9931
|
+
"endHour": {
|
|
9932
|
+
"type": "integer",
|
|
9933
|
+
"minimum": 0,
|
|
9934
|
+
"maximum": 23
|
|
9373
9935
|
}
|
|
9374
9936
|
}
|
|
9375
|
-
}
|
|
9376
|
-
|
|
9377
|
-
|
|
9378
|
-
|
|
9379
|
-
|
|
9380
|
-
|
|
9381
|
-
|
|
9382
|
-
|
|
9383
|
-
|
|
9384
|
-
|
|
9385
|
-
|
|
9937
|
+
},
|
|
9938
|
+
"lastMinute": {
|
|
9939
|
+
"type": "object",
|
|
9940
|
+
"properties": {
|
|
9941
|
+
"unit": {
|
|
9942
|
+
"type": "string",
|
|
9943
|
+
"enum": [
|
|
9944
|
+
"day",
|
|
9945
|
+
"hour"
|
|
9946
|
+
]
|
|
9947
|
+
},
|
|
9948
|
+
"value": {
|
|
9949
|
+
"type": "integer",
|
|
9950
|
+
"minimum": 1,
|
|
9951
|
+
"maximum": 1000
|
|
9952
|
+
}
|
|
9953
|
+
}
|
|
9954
|
+
},
|
|
9955
|
+
"earlyBookerDays": {
|
|
9956
|
+
"type": "integer",
|
|
9957
|
+
"minimum": 1,
|
|
9958
|
+
"maximum": 500
|
|
9959
|
+
},
|
|
9960
|
+
"minNights": {
|
|
9961
|
+
"type": "integer",
|
|
9962
|
+
"minimum": 0,
|
|
9963
|
+
"maximum": 30
|
|
9964
|
+
},
|
|
9965
|
+
"nonRefundable": {
|
|
9966
|
+
"type": "boolean"
|
|
9967
|
+
},
|
|
9968
|
+
"blackoutDates": {
|
|
9386
9969
|
"type": "array",
|
|
9387
9970
|
"items": {
|
|
9388
9971
|
"type": "string",
|
|
9389
9972
|
"format": "date"
|
|
9390
9973
|
},
|
|
9391
|
-
"description": "
|
|
9974
|
+
"description": "Airbnb \u2014 not yet available."
|
|
9392
9975
|
},
|
|
9393
|
-
"
|
|
9394
|
-
"type": "
|
|
9976
|
+
"blackoutDatesQuota": {
|
|
9977
|
+
"type": "object",
|
|
9978
|
+
"properties": {
|
|
9979
|
+
"used": {
|
|
9980
|
+
"type": "integer"
|
|
9981
|
+
},
|
|
9982
|
+
"available": {
|
|
9983
|
+
"type": "integer"
|
|
9984
|
+
}
|
|
9985
|
+
}
|
|
9395
9986
|
}
|
|
9396
9987
|
}
|
|
9397
9988
|
},
|
|
9398
|
-
"
|
|
9989
|
+
"PromotionInput": {
|
|
9399
9990
|
"type": "object",
|
|
9991
|
+
"required": [
|
|
9992
|
+
"channel",
|
|
9993
|
+
"type"
|
|
9994
|
+
],
|
|
9400
9995
|
"properties": {
|
|
9401
|
-
"
|
|
9402
|
-
"type": "
|
|
9996
|
+
"channel": {
|
|
9997
|
+
"type": "string"
|
|
9403
9998
|
},
|
|
9404
|
-
"
|
|
9405
|
-
"
|
|
9406
|
-
"nullable": true,
|
|
9407
|
-
"description": "Number of recommendations applied (apply action only)."
|
|
9999
|
+
"type": {
|
|
10000
|
+
"$ref": "#/components/schemas/PromotionType"
|
|
9408
10001
|
},
|
|
9409
|
-
"
|
|
10002
|
+
"name": {
|
|
10003
|
+
"type": "string",
|
|
10004
|
+
"description": "Booking.com only; only you see it."
|
|
10005
|
+
},
|
|
10006
|
+
"discountPercent": {
|
|
9410
10007
|
"type": "integer",
|
|
9411
|
-
"
|
|
9412
|
-
|
|
10008
|
+
"description": "Booking.com only \u2014 Airbnb sets its own rates. Limits per type are in the catalog."
|
|
10009
|
+
},
|
|
10010
|
+
"rules": {
|
|
10011
|
+
"$ref": "#/components/schemas/PromotionRules"
|
|
9413
10012
|
}
|
|
9414
10013
|
}
|
|
9415
10014
|
},
|
|
9416
|
-
"
|
|
10015
|
+
"PromotionCreateRequest": {
|
|
10016
|
+
"allOf": [
|
|
10017
|
+
{
|
|
10018
|
+
"$ref": "#/components/schemas/PromotionInput"
|
|
10019
|
+
},
|
|
10020
|
+
{
|
|
10021
|
+
"type": "object",
|
|
10022
|
+
"properties": {
|
|
10023
|
+
"hotelId": {
|
|
10024
|
+
"type": "string",
|
|
10025
|
+
"description": "Booking.com: required when the listing has a room on more than one property (see `properties` in the catalog)."
|
|
10026
|
+
}
|
|
10027
|
+
}
|
|
10028
|
+
}
|
|
10029
|
+
]
|
|
10030
|
+
},
|
|
10031
|
+
"PromotionUpdateRequest": {
|
|
9417
10032
|
"type": "object",
|
|
9418
|
-
"description": "Strategy that constrains the Atlas pricing model for one listing.",
|
|
9419
10033
|
"properties": {
|
|
9420
|
-
"
|
|
9421
|
-
"type": "string",
|
|
9422
|
-
"nullable": true
|
|
9423
|
-
},
|
|
9424
|
-
"listingId": {
|
|
9425
|
-
"type": "string"
|
|
9426
|
-
},
|
|
9427
|
-
"customerId": {
|
|
10034
|
+
"name": {
|
|
9428
10035
|
"type": "string"
|
|
9429
10036
|
},
|
|
9430
|
-
"
|
|
9431
|
-
"type": "
|
|
9432
|
-
"description": "`recommend` surfaces suggestions; `auto` applies them on the next sync."
|
|
9433
|
-
},
|
|
9434
|
-
"minPrice": {
|
|
9435
|
-
"type": "number",
|
|
9436
|
-
"nullable": true
|
|
9437
|
-
},
|
|
9438
|
-
"maxPrice": {
|
|
9439
|
-
"type": "number",
|
|
9440
|
-
"nullable": true
|
|
9441
|
-
},
|
|
9442
|
-
"maxDailyChangePct": {
|
|
9443
|
-
"type": "number",
|
|
9444
|
-
"description": "Max day-over-day swing in %.",
|
|
9445
|
-
"default": 15
|
|
9446
|
-
},
|
|
9447
|
-
"weekendMarkupPct": {
|
|
9448
|
-
"type": "number",
|
|
9449
|
-
"nullable": true,
|
|
9450
|
-
"description": "% bump applied on Fri/Sat."
|
|
9451
|
-
},
|
|
9452
|
-
"dayOfWeekMultipliers": {
|
|
9453
|
-
"type": "object",
|
|
9454
|
-
"additionalProperties": {
|
|
9455
|
-
"type": "number"
|
|
9456
|
-
},
|
|
9457
|
-
"description": "Multiplier per ISO weekday key (0..6)."
|
|
10037
|
+
"discountPercent": {
|
|
10038
|
+
"type": "integer"
|
|
9458
10039
|
},
|
|
9459
|
-
"
|
|
9460
|
-
"
|
|
9461
|
-
"nullable": true
|
|
10040
|
+
"rules": {
|
|
10041
|
+
"$ref": "#/components/schemas/PromotionRules"
|
|
9462
10042
|
},
|
|
9463
|
-
"
|
|
9464
|
-
"type": "
|
|
9465
|
-
"
|
|
10043
|
+
"confirmShared": {
|
|
10044
|
+
"type": "boolean",
|
|
10045
|
+
"description": "Required when the promotion also covers other listings\u2019 rooms \u2014 the change applies to them too."
|
|
10046
|
+
}
|
|
10047
|
+
}
|
|
10048
|
+
},
|
|
10049
|
+
"PromotionCatalogField": {
|
|
10050
|
+
"type": "object",
|
|
10051
|
+
"properties": {
|
|
10052
|
+
"supported": {
|
|
10053
|
+
"type": "boolean"
|
|
9466
10054
|
},
|
|
9467
|
-
"
|
|
9468
|
-
"type": "
|
|
9469
|
-
"
|
|
10055
|
+
"comingSoon": {
|
|
10056
|
+
"type": "boolean",
|
|
10057
|
+
"description": "Shown but not yet usable on this channel."
|
|
9470
10058
|
},
|
|
9471
|
-
"
|
|
9472
|
-
"type": "
|
|
9473
|
-
"default": "match"
|
|
10059
|
+
"required": {
|
|
10060
|
+
"type": "boolean"
|
|
9474
10061
|
},
|
|
9475
|
-
"
|
|
9476
|
-
"type": "number"
|
|
9477
|
-
"description": "Extra adjustment vs comp median (-30..+30).",
|
|
9478
|
-
"default": 0
|
|
10062
|
+
"min": {
|
|
10063
|
+
"type": "number"
|
|
9479
10064
|
},
|
|
9480
|
-
"
|
|
9481
|
-
"type": "
|
|
9482
|
-
"default": true
|
|
10065
|
+
"max": {
|
|
10066
|
+
"type": "number"
|
|
9483
10067
|
},
|
|
9484
|
-
"
|
|
10068
|
+
"fixed": {
|
|
9485
10069
|
"type": "number",
|
|
9486
|
-
"
|
|
10070
|
+
"description": "Value the channel sets (e.g. Airbnb\u2019s 15% top-rated-guests discount)."
|
|
9487
10071
|
},
|
|
9488
|
-
"
|
|
9489
|
-
"type": "
|
|
9490
|
-
"
|
|
10072
|
+
"options": {
|
|
10073
|
+
"type": "array",
|
|
10074
|
+
"items": {
|
|
10075
|
+
"type": "object",
|
|
10076
|
+
"properties": {
|
|
10077
|
+
"id": {
|
|
10078
|
+
"type": "string"
|
|
10079
|
+
},
|
|
10080
|
+
"label": {
|
|
10081
|
+
"type": "string"
|
|
10082
|
+
}
|
|
10083
|
+
}
|
|
10084
|
+
}
|
|
9491
10085
|
}
|
|
9492
10086
|
}
|
|
9493
10087
|
},
|
|
9494
|
-
"
|
|
10088
|
+
"PromotionCatalogEntry": {
|
|
9495
10089
|
"type": "object",
|
|
9496
|
-
"description": "Same shape as `ListingPricingStrategy` minus the read-only fields. Send only fields you want to change.",
|
|
9497
10090
|
"properties": {
|
|
9498
|
-
"
|
|
10091
|
+
"channel": {
|
|
9499
10092
|
"type": "string"
|
|
9500
10093
|
},
|
|
9501
|
-
"
|
|
9502
|
-
"
|
|
9503
|
-
"nullable": true
|
|
9504
|
-
},
|
|
9505
|
-
"maxPrice": {
|
|
9506
|
-
"type": "number",
|
|
9507
|
-
"nullable": true
|
|
10094
|
+
"type": {
|
|
10095
|
+
"$ref": "#/components/schemas/PromotionType"
|
|
9508
10096
|
},
|
|
9509
|
-
"
|
|
9510
|
-
"type": "
|
|
10097
|
+
"channelType": {
|
|
10098
|
+
"type": "string"
|
|
9511
10099
|
},
|
|
9512
|
-
"
|
|
9513
|
-
"type": "
|
|
9514
|
-
"nullable": true
|
|
10100
|
+
"campaign": {
|
|
10101
|
+
"type": "string"
|
|
9515
10102
|
},
|
|
9516
|
-
"
|
|
9517
|
-
"type": "
|
|
9518
|
-
"additionalProperties": {
|
|
9519
|
-
"type": "number"
|
|
9520
|
-
}
|
|
10103
|
+
"label": {
|
|
10104
|
+
"type": "string"
|
|
9521
10105
|
},
|
|
9522
|
-
"
|
|
9523
|
-
"type": "
|
|
9524
|
-
"
|
|
10106
|
+
"description": {
|
|
10107
|
+
"type": "string",
|
|
10108
|
+
"description": "One or two sentences to show hosts."
|
|
9525
10109
|
},
|
|
9526
|
-
"
|
|
9527
|
-
"type": "
|
|
9528
|
-
"
|
|
10110
|
+
"isNew": {
|
|
10111
|
+
"type": "boolean",
|
|
10112
|
+
"description": "Newly available \u2014 show a \u201cNew\u201d badge."
|
|
9529
10113
|
},
|
|
9530
|
-
"
|
|
9531
|
-
"type": "
|
|
9532
|
-
"nullable": true
|
|
10114
|
+
"available": {
|
|
10115
|
+
"type": "boolean"
|
|
9533
10116
|
},
|
|
9534
|
-
"
|
|
10117
|
+
"unavailableReason": {
|
|
9535
10118
|
"type": "string"
|
|
9536
10119
|
},
|
|
9537
|
-
"
|
|
9538
|
-
"type": "
|
|
9539
|
-
|
|
9540
|
-
"eventBoostEnabled": {
|
|
9541
|
-
"type": "boolean"
|
|
10120
|
+
"single": {
|
|
10121
|
+
"type": "boolean",
|
|
10122
|
+
"description": "Only one at a time (Airbnb types; Booking.com mobile and country rates per property)."
|
|
9542
10123
|
},
|
|
9543
|
-
"
|
|
9544
|
-
"type": "
|
|
10124
|
+
"fields": {
|
|
10125
|
+
"type": "object",
|
|
10126
|
+
"description": "Every field, supported or not, so a UI can grey out what a type does not take.",
|
|
10127
|
+
"additionalProperties": {
|
|
10128
|
+
"$ref": "#/components/schemas/PromotionCatalogField"
|
|
10129
|
+
}
|
|
9545
10130
|
}
|
|
9546
10131
|
}
|
|
9547
10132
|
},
|
|
9548
|
-
"
|
|
10133
|
+
"PromotionCatalog": {
|
|
9549
10134
|
"type": "object",
|
|
9550
|
-
"required": [
|
|
9551
|
-
"listingId",
|
|
9552
|
-
"dates"
|
|
9553
|
-
],
|
|
9554
|
-
"description": "A single (listingId, dates) pair in a bulk pricing request. The action in the parent request body applies to every date in `dates` for this listing.",
|
|
9555
10135
|
"properties": {
|
|
9556
10136
|
"listingId": {
|
|
9557
|
-
"type": "string"
|
|
9558
|
-
"example": "4118"
|
|
10137
|
+
"type": "string"
|
|
9559
10138
|
},
|
|
9560
|
-
"
|
|
10139
|
+
"channels": {
|
|
9561
10140
|
"type": "array",
|
|
9562
10141
|
"items": {
|
|
9563
|
-
"type": "
|
|
9564
|
-
"
|
|
9565
|
-
|
|
9566
|
-
|
|
9567
|
-
|
|
9568
|
-
|
|
9569
|
-
|
|
9570
|
-
|
|
10142
|
+
"type": "object",
|
|
10143
|
+
"properties": {
|
|
10144
|
+
"channel": {
|
|
10145
|
+
"type": "string",
|
|
10146
|
+
"enum": [
|
|
10147
|
+
"airbnb",
|
|
10148
|
+
"booking"
|
|
10149
|
+
]
|
|
10150
|
+
},
|
|
10151
|
+
"connected": {
|
|
10152
|
+
"type": "boolean"
|
|
10153
|
+
},
|
|
10154
|
+
"reason": {
|
|
10155
|
+
"type": "string"
|
|
10156
|
+
},
|
|
10157
|
+
"properties": {
|
|
10158
|
+
"type": "array",
|
|
10159
|
+
"items": {
|
|
10160
|
+
"type": "string"
|
|
10161
|
+
},
|
|
10162
|
+
"description": "Booking.com properties the listing has a room on."
|
|
10163
|
+
},
|
|
10164
|
+
"entries": {
|
|
10165
|
+
"type": "array",
|
|
10166
|
+
"items": {
|
|
10167
|
+
"$ref": "#/components/schemas/PromotionCatalogEntry"
|
|
10168
|
+
}
|
|
10169
|
+
}
|
|
10170
|
+
}
|
|
10171
|
+
}
|
|
9571
10172
|
}
|
|
9572
10173
|
}
|
|
9573
10174
|
},
|
|
9574
|
-
"
|
|
10175
|
+
"PromotionListResponse": {
|
|
9575
10176
|
"type": "object",
|
|
9576
|
-
"required": [
|
|
9577
|
-
"action",
|
|
9578
|
-
"items"
|
|
9579
|
-
],
|
|
9580
|
-
"description": "Body for `POST /v1/listings/pricing/bulk`. Apply or decline pending Atlas pricing recommendations across many listings in one call. Capped at 500 items per request \u2014 exceeding returns 422.",
|
|
9581
10177
|
"properties": {
|
|
9582
|
-
"
|
|
9583
|
-
"type": "string",
|
|
9584
|
-
"description": "`apply` writes the recommended price to each listing's calendar and fans out to channels (Airbnb/Booking/VRBO). `decline` marks the recommendations as `declined` so they stop surfacing."
|
|
9585
|
-
},
|
|
9586
|
-
"items": {
|
|
10178
|
+
"data": {
|
|
9587
10179
|
"type": "array",
|
|
9588
|
-
"minItems": 1,
|
|
9589
|
-
"maxItems": 500,
|
|
9590
10180
|
"items": {
|
|
9591
|
-
"$ref": "#/components/schemas/
|
|
10181
|
+
"$ref": "#/components/schemas/Promotion"
|
|
9592
10182
|
}
|
|
9593
|
-
}
|
|
9594
|
-
|
|
9595
|
-
|
|
10183
|
+
},
|
|
10184
|
+
"syncedAt": {
|
|
10185
|
+
"type": "string",
|
|
10186
|
+
"format": "date-time",
|
|
10187
|
+
"nullable": true,
|
|
10188
|
+
"description": "When the channels were last read for this listing."
|
|
10189
|
+
},
|
|
10190
|
+
"syncError": {
|
|
10191
|
+
"type": "string",
|
|
10192
|
+
"nullable": true
|
|
10193
|
+
}
|
|
10194
|
+
}
|
|
10195
|
+
},
|
|
10196
|
+
"PromotionResponse": {
|
|
10197
|
+
"type": "object",
|
|
10198
|
+
"properties": {
|
|
10199
|
+
"data": {
|
|
10200
|
+
"$ref": "#/components/schemas/Promotion"
|
|
10201
|
+
}
|
|
10202
|
+
}
|
|
10203
|
+
},
|
|
10204
|
+
"PromotionDeleteResponse": {
|
|
10205
|
+
"type": "object",
|
|
10206
|
+
"properties": {
|
|
10207
|
+
"data": {
|
|
10208
|
+
"type": "object",
|
|
10209
|
+
"properties": {
|
|
10210
|
+
"removed": {
|
|
10211
|
+
"type": "boolean"
|
|
10212
|
+
},
|
|
10213
|
+
"promotionId": {
|
|
10214
|
+
"type": "string"
|
|
10215
|
+
}
|
|
10216
|
+
}
|
|
10217
|
+
}
|
|
10218
|
+
}
|
|
10219
|
+
},
|
|
10220
|
+
"PromotionCatalogResponse": {
|
|
10221
|
+
"type": "object",
|
|
10222
|
+
"properties": {
|
|
10223
|
+
"data": {
|
|
10224
|
+
"$ref": "#/components/schemas/PromotionCatalog"
|
|
10225
|
+
}
|
|
10226
|
+
}
|
|
10227
|
+
},
|
|
10228
|
+
"PromotionRefreshResponse": {
|
|
10229
|
+
"type": "object",
|
|
10230
|
+
"properties": {
|
|
10231
|
+
"data": {
|
|
10232
|
+
"type": "array",
|
|
10233
|
+
"items": {
|
|
10234
|
+
"$ref": "#/components/schemas/Promotion"
|
|
10235
|
+
}
|
|
10236
|
+
},
|
|
10237
|
+
"syncedAt": {
|
|
10238
|
+
"type": "string",
|
|
10239
|
+
"format": "date-time",
|
|
10240
|
+
"nullable": true
|
|
10241
|
+
},
|
|
10242
|
+
"errors": {
|
|
10243
|
+
"type": "array",
|
|
10244
|
+
"items": {
|
|
10245
|
+
"type": "string"
|
|
10246
|
+
}
|
|
10247
|
+
}
|
|
10248
|
+
}
|
|
10249
|
+
},
|
|
10250
|
+
"PromotionBulkRequest": {
|
|
10251
|
+
"type": "object",
|
|
10252
|
+
"required": [
|
|
10253
|
+
"listingIds",
|
|
10254
|
+
"action",
|
|
10255
|
+
"promotion"
|
|
10256
|
+
],
|
|
10257
|
+
"properties": {
|
|
10258
|
+
"listingIds": {
|
|
10259
|
+
"type": "array",
|
|
10260
|
+
"items": {
|
|
10261
|
+
"type": "integer"
|
|
10262
|
+
},
|
|
10263
|
+
"minItems": 1,
|
|
10264
|
+
"maxItems": 100
|
|
10265
|
+
},
|
|
10266
|
+
"action": {
|
|
10267
|
+
"type": "string"
|
|
10268
|
+
},
|
|
10269
|
+
"promotion": {
|
|
10270
|
+
"$ref": "#/components/schemas/PromotionInput"
|
|
10271
|
+
}
|
|
10272
|
+
}
|
|
10273
|
+
},
|
|
10274
|
+
"PromotionBulkResponse": {
|
|
10275
|
+
"type": "object",
|
|
10276
|
+
"properties": {
|
|
10277
|
+
"data": {
|
|
10278
|
+
"type": "array",
|
|
10279
|
+
"items": {
|
|
10280
|
+
"type": "object",
|
|
10281
|
+
"properties": {
|
|
10282
|
+
"listingId": {
|
|
10283
|
+
"type": "string"
|
|
10284
|
+
},
|
|
10285
|
+
"ok": {
|
|
10286
|
+
"type": "boolean"
|
|
10287
|
+
},
|
|
10288
|
+
"promotion": {
|
|
10289
|
+
"$ref": "#/components/schemas/Promotion"
|
|
10290
|
+
},
|
|
10291
|
+
"error": {
|
|
10292
|
+
"type": "object",
|
|
10293
|
+
"properties": {
|
|
10294
|
+
"message": {
|
|
10295
|
+
"type": "string"
|
|
10296
|
+
},
|
|
10297
|
+
"code": {
|
|
10298
|
+
"type": "string"
|
|
10299
|
+
},
|
|
10300
|
+
"field": {
|
|
10301
|
+
"type": "string"
|
|
10302
|
+
}
|
|
10303
|
+
}
|
|
10304
|
+
}
|
|
10305
|
+
}
|
|
10306
|
+
}
|
|
10307
|
+
},
|
|
10308
|
+
"summary": {
|
|
10309
|
+
"type": "object",
|
|
10310
|
+
"properties": {
|
|
10311
|
+
"succeeded": {
|
|
10312
|
+
"type": "integer"
|
|
10313
|
+
},
|
|
10314
|
+
"failed": {
|
|
10315
|
+
"type": "integer"
|
|
10316
|
+
}
|
|
10317
|
+
}
|
|
10318
|
+
}
|
|
10319
|
+
}
|
|
10320
|
+
},
|
|
10321
|
+
"ListingPricingResponse": {
|
|
10322
|
+
"type": "object",
|
|
10323
|
+
"properties": {
|
|
10324
|
+
"listingId": {
|
|
10325
|
+
"type": "string"
|
|
10326
|
+
},
|
|
10327
|
+
"dateRange": {
|
|
10328
|
+
"type": "object",
|
|
10329
|
+
"properties": {
|
|
10330
|
+
"start": {
|
|
10331
|
+
"type": "string",
|
|
10332
|
+
"format": "date"
|
|
10333
|
+
},
|
|
10334
|
+
"end": {
|
|
10335
|
+
"type": "string",
|
|
10336
|
+
"format": "date"
|
|
10337
|
+
}
|
|
10338
|
+
}
|
|
10339
|
+
},
|
|
10340
|
+
"recommendations": {
|
|
10341
|
+
"type": "array",
|
|
10342
|
+
"items": {
|
|
10343
|
+
"$ref": "#/components/schemas/ListingPricingRecommendation"
|
|
10344
|
+
}
|
|
10345
|
+
},
|
|
10346
|
+
"listing": {
|
|
10347
|
+
"type": "object",
|
|
10348
|
+
"nullable": true,
|
|
10349
|
+
"description": "AI-derived base-price context for the listing.",
|
|
10350
|
+
"properties": {
|
|
10351
|
+
"aiBasePrice": {
|
|
10352
|
+
"type": "number",
|
|
10353
|
+
"nullable": true
|
|
10354
|
+
},
|
|
10355
|
+
"aiBasePriceFactors": {
|
|
10356
|
+
"type": "object",
|
|
10357
|
+
"additionalProperties": true,
|
|
10358
|
+
"nullable": true
|
|
10359
|
+
},
|
|
10360
|
+
"qualityTier": {
|
|
10361
|
+
"type": "string",
|
|
10362
|
+
"nullable": true
|
|
10363
|
+
},
|
|
10364
|
+
"segment": {
|
|
10365
|
+
"type": "string",
|
|
10366
|
+
"nullable": true
|
|
10367
|
+
},
|
|
10368
|
+
"currency": {
|
|
10369
|
+
"type": "string",
|
|
10370
|
+
"nullable": true
|
|
10371
|
+
}
|
|
10372
|
+
}
|
|
10373
|
+
},
|
|
10374
|
+
"compSummary": {
|
|
10375
|
+
"type": "object",
|
|
10376
|
+
"nullable": true,
|
|
10377
|
+
"description": "5km comp aggregate (Atlas comp_listings).",
|
|
10378
|
+
"properties": {
|
|
10379
|
+
"count": {
|
|
10380
|
+
"type": "integer"
|
|
10381
|
+
},
|
|
10382
|
+
"avgPrice": {
|
|
10383
|
+
"type": "number",
|
|
10384
|
+
"nullable": true
|
|
10385
|
+
},
|
|
10386
|
+
"minPrice": {
|
|
10387
|
+
"type": "number",
|
|
10388
|
+
"nullable": true
|
|
10389
|
+
},
|
|
10390
|
+
"maxPrice": {
|
|
10391
|
+
"type": "number",
|
|
10392
|
+
"nullable": true
|
|
10393
|
+
}
|
|
10394
|
+
}
|
|
10395
|
+
}
|
|
10396
|
+
}
|
|
10397
|
+
},
|
|
10398
|
+
"ListingPricingApplyRequest": {
|
|
10399
|
+
"type": "object",
|
|
10400
|
+
"required": [
|
|
10401
|
+
"dates",
|
|
10402
|
+
"action"
|
|
10403
|
+
],
|
|
10404
|
+
"properties": {
|
|
10405
|
+
"dates": {
|
|
10406
|
+
"type": "array",
|
|
10407
|
+
"items": {
|
|
10408
|
+
"type": "string",
|
|
10409
|
+
"format": "date"
|
|
10410
|
+
},
|
|
10411
|
+
"description": "Dates the action applies to. Must match dates that have a `pending` recommendation; others are silently skipped."
|
|
10412
|
+
},
|
|
10413
|
+
"action": {
|
|
10414
|
+
"type": "string"
|
|
10415
|
+
}
|
|
10416
|
+
}
|
|
10417
|
+
},
|
|
10418
|
+
"ListingPricingApplyResponse": {
|
|
10419
|
+
"type": "object",
|
|
10420
|
+
"properties": {
|
|
10421
|
+
"ok": {
|
|
10422
|
+
"type": "boolean"
|
|
10423
|
+
},
|
|
10424
|
+
"applied": {
|
|
10425
|
+
"type": "integer",
|
|
10426
|
+
"nullable": true,
|
|
10427
|
+
"description": "Number of recommendations applied (apply action only)."
|
|
10428
|
+
},
|
|
10429
|
+
"declined": {
|
|
10430
|
+
"type": "integer",
|
|
10431
|
+
"nullable": true,
|
|
10432
|
+
"description": "Number of dates declined (decline action only)."
|
|
10433
|
+
}
|
|
10434
|
+
}
|
|
10435
|
+
},
|
|
10436
|
+
"ListingPricingStrategy": {
|
|
10437
|
+
"type": "object",
|
|
10438
|
+
"description": "Strategy that constrains the Atlas pricing model for one listing.",
|
|
10439
|
+
"properties": {
|
|
10440
|
+
"id": {
|
|
10441
|
+
"type": "string",
|
|
10442
|
+
"nullable": true
|
|
10443
|
+
},
|
|
10444
|
+
"listingId": {
|
|
10445
|
+
"type": "string"
|
|
10446
|
+
},
|
|
10447
|
+
"customerId": {
|
|
10448
|
+
"type": "string"
|
|
10449
|
+
},
|
|
10450
|
+
"mode": {
|
|
10451
|
+
"type": "string",
|
|
10452
|
+
"description": "`recommend` surfaces suggestions; `auto` applies them on the next sync."
|
|
10453
|
+
},
|
|
10454
|
+
"minPrice": {
|
|
10455
|
+
"type": "number",
|
|
10456
|
+
"nullable": true
|
|
10457
|
+
},
|
|
10458
|
+
"maxPrice": {
|
|
10459
|
+
"type": "number",
|
|
10460
|
+
"nullable": true
|
|
10461
|
+
},
|
|
10462
|
+
"maxDailyChangePct": {
|
|
10463
|
+
"type": "number",
|
|
10464
|
+
"description": "Max day-over-day swing in %.",
|
|
10465
|
+
"default": 15
|
|
10466
|
+
},
|
|
10467
|
+
"weekendMarkupPct": {
|
|
10468
|
+
"type": "number",
|
|
10469
|
+
"nullable": true,
|
|
10470
|
+
"description": "% bump applied on Fri/Sat."
|
|
10471
|
+
},
|
|
10472
|
+
"dayOfWeekMultipliers": {
|
|
10473
|
+
"type": "object",
|
|
10474
|
+
"additionalProperties": {
|
|
10475
|
+
"type": "number"
|
|
10476
|
+
},
|
|
10477
|
+
"description": "Multiplier per ISO weekday key (0..6)."
|
|
10478
|
+
},
|
|
10479
|
+
"targetOccupancyPct": {
|
|
10480
|
+
"type": "number",
|
|
10481
|
+
"nullable": true
|
|
10482
|
+
},
|
|
10483
|
+
"targetMonthlyRevenue": {
|
|
10484
|
+
"type": "number",
|
|
10485
|
+
"nullable": true
|
|
10486
|
+
},
|
|
10487
|
+
"ownerMinMonthlyPayout": {
|
|
10488
|
+
"type": "number",
|
|
10489
|
+
"nullable": true
|
|
10490
|
+
},
|
|
10491
|
+
"compPositionTarget": {
|
|
10492
|
+
"type": "string",
|
|
10493
|
+
"default": "match"
|
|
10494
|
+
},
|
|
10495
|
+
"compAdjustPct": {
|
|
10496
|
+
"type": "number",
|
|
10497
|
+
"description": "Extra adjustment vs comp median (-30..+30).",
|
|
10498
|
+
"default": 0
|
|
10499
|
+
},
|
|
10500
|
+
"eventBoostEnabled": {
|
|
10501
|
+
"type": "boolean",
|
|
10502
|
+
"default": true
|
|
10503
|
+
},
|
|
10504
|
+
"eventBoostMaxPct": {
|
|
10505
|
+
"type": "number",
|
|
10506
|
+
"default": 30
|
|
10507
|
+
},
|
|
10508
|
+
"isDefault": {
|
|
10509
|
+
"type": "boolean",
|
|
10510
|
+
"description": "true when no row exists yet and the response is server-side defaults."
|
|
10511
|
+
}
|
|
10512
|
+
}
|
|
10513
|
+
},
|
|
10514
|
+
"ListingPricingStrategyInput": {
|
|
10515
|
+
"type": "object",
|
|
10516
|
+
"description": "Same shape as `ListingPricingStrategy` minus the read-only fields. Send only fields you want to change.",
|
|
10517
|
+
"properties": {
|
|
10518
|
+
"mode": {
|
|
10519
|
+
"type": "string"
|
|
10520
|
+
},
|
|
10521
|
+
"minPrice": {
|
|
10522
|
+
"type": "number",
|
|
10523
|
+
"nullable": true
|
|
10524
|
+
},
|
|
10525
|
+
"maxPrice": {
|
|
10526
|
+
"type": "number",
|
|
10527
|
+
"nullable": true
|
|
10528
|
+
},
|
|
10529
|
+
"maxDailyChangePct": {
|
|
10530
|
+
"type": "number"
|
|
10531
|
+
},
|
|
10532
|
+
"weekendMarkupPct": {
|
|
10533
|
+
"type": "number",
|
|
10534
|
+
"nullable": true
|
|
10535
|
+
},
|
|
10536
|
+
"dayOfWeekMultipliers": {
|
|
10537
|
+
"type": "object",
|
|
10538
|
+
"additionalProperties": {
|
|
10539
|
+
"type": "number"
|
|
10540
|
+
}
|
|
10541
|
+
},
|
|
10542
|
+
"targetOccupancyPct": {
|
|
10543
|
+
"type": "number",
|
|
10544
|
+
"nullable": true
|
|
10545
|
+
},
|
|
10546
|
+
"targetMonthlyRevenue": {
|
|
10547
|
+
"type": "number",
|
|
10548
|
+
"nullable": true
|
|
10549
|
+
},
|
|
10550
|
+
"ownerMinMonthlyPayout": {
|
|
10551
|
+
"type": "number",
|
|
10552
|
+
"nullable": true
|
|
10553
|
+
},
|
|
10554
|
+
"compPositionTarget": {
|
|
10555
|
+
"type": "string"
|
|
10556
|
+
},
|
|
10557
|
+
"compAdjustPct": {
|
|
10558
|
+
"type": "number"
|
|
10559
|
+
},
|
|
10560
|
+
"eventBoostEnabled": {
|
|
10561
|
+
"type": "boolean"
|
|
10562
|
+
},
|
|
10563
|
+
"eventBoostMaxPct": {
|
|
10564
|
+
"type": "number"
|
|
10565
|
+
}
|
|
10566
|
+
}
|
|
10567
|
+
},
|
|
10568
|
+
"BulkPricingItem": {
|
|
10569
|
+
"type": "object",
|
|
10570
|
+
"required": [
|
|
10571
|
+
"listingId",
|
|
10572
|
+
"dates"
|
|
10573
|
+
],
|
|
10574
|
+
"description": "A single (listingId, dates) pair in a bulk pricing request. The action in the parent request body applies to every date in `dates` for this listing.",
|
|
10575
|
+
"properties": {
|
|
10576
|
+
"listingId": {
|
|
10577
|
+
"type": "string",
|
|
10578
|
+
"example": "4118"
|
|
10579
|
+
},
|
|
10580
|
+
"dates": {
|
|
10581
|
+
"type": "array",
|
|
10582
|
+
"items": {
|
|
10583
|
+
"type": "string",
|
|
10584
|
+
"format": "date"
|
|
10585
|
+
},
|
|
10586
|
+
"minItems": 1,
|
|
10587
|
+
"example": [
|
|
10588
|
+
"2026-05-14",
|
|
10589
|
+
"2026-05-15"
|
|
10590
|
+
]
|
|
10591
|
+
}
|
|
10592
|
+
}
|
|
10593
|
+
},
|
|
10594
|
+
"BulkPricingRequest": {
|
|
10595
|
+
"type": "object",
|
|
10596
|
+
"required": [
|
|
10597
|
+
"action",
|
|
10598
|
+
"items"
|
|
10599
|
+
],
|
|
10600
|
+
"description": "Body for `POST /v1/listings/pricing/bulk`. Apply or decline pending Atlas pricing recommendations across many listings in one call. Capped at 500 items per request \u2014 exceeding returns 422.",
|
|
10601
|
+
"properties": {
|
|
10602
|
+
"action": {
|
|
10603
|
+
"type": "string",
|
|
10604
|
+
"description": "`apply` writes the recommended price to each listing's calendar and fans out to channels (Airbnb/Booking/VRBO). `decline` marks the recommendations as `declined` so they stop surfacing."
|
|
10605
|
+
},
|
|
10606
|
+
"items": {
|
|
10607
|
+
"type": "array",
|
|
10608
|
+
"minItems": 1,
|
|
10609
|
+
"maxItems": 500,
|
|
10610
|
+
"items": {
|
|
10611
|
+
"$ref": "#/components/schemas/BulkPricingItem"
|
|
10612
|
+
}
|
|
10613
|
+
}
|
|
10614
|
+
}
|
|
10615
|
+
},
|
|
9596
10616
|
"BulkPricingFailure": {
|
|
9597
10617
|
"type": "object",
|
|
9598
10618
|
"description": "Per-item failure entry. Per-item failures DO NOT fail the whole batch \u2014 partial-success is the norm at this scale.",
|
|
@@ -37672,6 +38692,812 @@
|
|
|
37672
38692
|
}
|
|
37673
38693
|
}
|
|
37674
38694
|
}
|
|
38695
|
+
},
|
|
38696
|
+
"/v1/transactions/{id}/statement": {
|
|
38697
|
+
"get": {
|
|
38698
|
+
"operationId": "get_transaction_statement",
|
|
38699
|
+
"summary": "Download the original payout statement",
|
|
38700
|
+
"description": "Downloads the channel's ORIGINAL payout statement \u2014 the authoritative settlement record a host reconciles against \u2014 for a payout transaction. `{id}` is the payout `transactionId` (e.g. `booking_payout_5463377687_bank_transfer`). Repull serves the stored bytes itself (no channel session), so unlike the channel's own link it never expires or leaks a session. PDF by default; pass `?format=csv` for the CSV remittance. Returns `404` when no statement was captured for the payout (e.g. an upcoming payout, or a channel that has none).",
|
|
38701
|
+
"tags": [
|
|
38702
|
+
"Transactions"
|
|
38703
|
+
],
|
|
38704
|
+
"parameters": [
|
|
38705
|
+
{
|
|
38706
|
+
"$ref": "#/components/parameters/XSchemaHeader"
|
|
38707
|
+
},
|
|
38708
|
+
{
|
|
38709
|
+
"name": "id",
|
|
38710
|
+
"in": "path",
|
|
38711
|
+
"required": true,
|
|
38712
|
+
"description": "The payout transaction id (`transactionId`).",
|
|
38713
|
+
"schema": {
|
|
38714
|
+
"type": "string"
|
|
38715
|
+
}
|
|
38716
|
+
},
|
|
38717
|
+
{
|
|
38718
|
+
"name": "format",
|
|
38719
|
+
"in": "query",
|
|
38720
|
+
"required": false,
|
|
38721
|
+
"description": "Statement format.",
|
|
38722
|
+
"schema": {
|
|
38723
|
+
"type": "string",
|
|
38724
|
+
"enum": [
|
|
38725
|
+
"pdf",
|
|
38726
|
+
"csv"
|
|
38727
|
+
],
|
|
38728
|
+
"default": "pdf"
|
|
38729
|
+
}
|
|
38730
|
+
}
|
|
38731
|
+
],
|
|
38732
|
+
"responses": {
|
|
38733
|
+
"200": {
|
|
38734
|
+
"description": "The statement file (PDF by default, or CSV).",
|
|
38735
|
+
"content": {
|
|
38736
|
+
"application/pdf": {
|
|
38737
|
+
"schema": {
|
|
38738
|
+
"type": "string",
|
|
38739
|
+
"format": "binary"
|
|
38740
|
+
}
|
|
38741
|
+
},
|
|
38742
|
+
"text/csv": {
|
|
38743
|
+
"schema": {
|
|
38744
|
+
"type": "string"
|
|
38745
|
+
}
|
|
38746
|
+
}
|
|
38747
|
+
}
|
|
38748
|
+
},
|
|
38749
|
+
"400": {
|
|
38750
|
+
"$ref": "#/components/responses/BadRequest"
|
|
38751
|
+
},
|
|
38752
|
+
"401": {
|
|
38753
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
38754
|
+
},
|
|
38755
|
+
"404": {
|
|
38756
|
+
"$ref": "#/components/responses/NotFound"
|
|
38757
|
+
},
|
|
38758
|
+
"500": {
|
|
38759
|
+
"$ref": "#/components/responses/InternalError"
|
|
38760
|
+
}
|
|
38761
|
+
}
|
|
38762
|
+
}
|
|
38763
|
+
},
|
|
38764
|
+
"/v1/channels/airbnb/resolutions": {
|
|
38765
|
+
"get": {
|
|
38766
|
+
"operationId": "list_airbnb_resolutions",
|
|
38767
|
+
"summary": "List Airbnb Resolution Center cases",
|
|
38768
|
+
"description": "The host's Airbnb Resolution Center cases (AirCover / damage, extra-guest, refund and change requests), open and closed. Served from the database; `POST` this path to refresh from Airbnb. READ-ONLY upstream \u2014 Airbnb's Resolutions API is read-only; a claim is created, evidence added and status changed only in Airbnb's Resolution Center UI, not via API. Use this for visibility and action tracking (`suggestedActionText`). The money a resolution moved is in the transactions ledger as `Resolution Payout` / `Resolution Adjustment` rows sharing the same reference \u2014 join on `resolutionId`. Cursor-paginated, newest first.",
|
|
38769
|
+
"tags": [
|
|
38770
|
+
"Resolutions"
|
|
38771
|
+
],
|
|
38772
|
+
"parameters": [
|
|
38773
|
+
{
|
|
38774
|
+
"$ref": "#/components/parameters/XSchemaHeader"
|
|
38775
|
+
},
|
|
38776
|
+
{
|
|
38777
|
+
"name": "status",
|
|
38778
|
+
"in": "query",
|
|
38779
|
+
"required": false,
|
|
38780
|
+
"description": "Filter by lifecycle: `open` (still needs action) or `closed` (settled). Omit for all.",
|
|
38781
|
+
"schema": {
|
|
38782
|
+
"type": "string",
|
|
38783
|
+
"enum": [
|
|
38784
|
+
"open",
|
|
38785
|
+
"closed"
|
|
38786
|
+
]
|
|
38787
|
+
}
|
|
38788
|
+
},
|
|
38789
|
+
{
|
|
38790
|
+
"name": "limit",
|
|
38791
|
+
"in": "query",
|
|
38792
|
+
"required": false,
|
|
38793
|
+
"description": "Page size (default 50, max 200).",
|
|
38794
|
+
"schema": {
|
|
38795
|
+
"type": "integer",
|
|
38796
|
+
"minimum": 1,
|
|
38797
|
+
"maximum": 200
|
|
38798
|
+
}
|
|
38799
|
+
},
|
|
38800
|
+
{
|
|
38801
|
+
"name": "cursor",
|
|
38802
|
+
"in": "query",
|
|
38803
|
+
"required": false,
|
|
38804
|
+
"description": "Opaque pagination cursor from a previous `pagination.nextCursor`.",
|
|
38805
|
+
"schema": {
|
|
38806
|
+
"type": "string"
|
|
38807
|
+
}
|
|
38808
|
+
}
|
|
38809
|
+
],
|
|
38810
|
+
"responses": {
|
|
38811
|
+
"200": {
|
|
38812
|
+
"description": "Resolutions",
|
|
38813
|
+
"content": {
|
|
38814
|
+
"application/json": {
|
|
38815
|
+
"schema": {
|
|
38816
|
+
"type": "object",
|
|
38817
|
+
"required": [
|
|
38818
|
+
"data",
|
|
38819
|
+
"pagination"
|
|
38820
|
+
],
|
|
38821
|
+
"properties": {
|
|
38822
|
+
"data": {
|
|
38823
|
+
"type": "array",
|
|
38824
|
+
"items": {
|
|
38825
|
+
"$ref": "#/components/schemas/Resolution"
|
|
38826
|
+
}
|
|
38827
|
+
},
|
|
38828
|
+
"pagination": {
|
|
38829
|
+
"$ref": "#/components/schemas/Pagination"
|
|
38830
|
+
}
|
|
38831
|
+
}
|
|
38832
|
+
}
|
|
38833
|
+
}
|
|
38834
|
+
}
|
|
38835
|
+
},
|
|
38836
|
+
"401": {
|
|
38837
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
38838
|
+
},
|
|
38839
|
+
"422": {
|
|
38840
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
38841
|
+
},
|
|
38842
|
+
"500": {
|
|
38843
|
+
"$ref": "#/components/responses/InternalError"
|
|
38844
|
+
}
|
|
38845
|
+
}
|
|
38846
|
+
},
|
|
38847
|
+
"post": {
|
|
38848
|
+
"operationId": "refresh_airbnb_resolutions",
|
|
38849
|
+
"summary": "Refresh Airbnb resolutions from Airbnb",
|
|
38850
|
+
"description": "Pulls the latest Resolution Center cases from Airbnb (read-only) and stores them, then read with GET. Optionally scope to one `account_id` and/or `status`.",
|
|
38851
|
+
"tags": [
|
|
38852
|
+
"Resolutions"
|
|
38853
|
+
],
|
|
38854
|
+
"parameters": [
|
|
38855
|
+
{
|
|
38856
|
+
"$ref": "#/components/parameters/XSchemaHeader"
|
|
38857
|
+
}
|
|
38858
|
+
],
|
|
38859
|
+
"requestBody": {
|
|
38860
|
+
"required": false,
|
|
38861
|
+
"content": {
|
|
38862
|
+
"application/json": {
|
|
38863
|
+
"schema": {
|
|
38864
|
+
"type": "object",
|
|
38865
|
+
"properties": {
|
|
38866
|
+
"account_id": {
|
|
38867
|
+
"type": "string",
|
|
38868
|
+
"description": "Limit the refresh to one Airbnb host id. Omit for all connected accounts."
|
|
38869
|
+
},
|
|
38870
|
+
"status": {
|
|
38871
|
+
"type": "string",
|
|
38872
|
+
"enum": [
|
|
38873
|
+
"OPEN",
|
|
38874
|
+
"CLOSED"
|
|
38875
|
+
],
|
|
38876
|
+
"description": "Limit the refresh to one lifecycle. Omit for all."
|
|
38877
|
+
}
|
|
38878
|
+
}
|
|
38879
|
+
}
|
|
38880
|
+
}
|
|
38881
|
+
}
|
|
38882
|
+
},
|
|
38883
|
+
"responses": {
|
|
38884
|
+
"200": {
|
|
38885
|
+
"description": "Refresh outcome.",
|
|
38886
|
+
"content": {
|
|
38887
|
+
"application/json": {
|
|
38888
|
+
"schema": {
|
|
38889
|
+
"type": "object",
|
|
38890
|
+
"required": [
|
|
38891
|
+
"synced",
|
|
38892
|
+
"count",
|
|
38893
|
+
"accounts"
|
|
38894
|
+
],
|
|
38895
|
+
"properties": {
|
|
38896
|
+
"synced": {
|
|
38897
|
+
"type": "boolean"
|
|
38898
|
+
},
|
|
38899
|
+
"count": {
|
|
38900
|
+
"type": "integer",
|
|
38901
|
+
"description": "Resolutions upserted across all accounts."
|
|
38902
|
+
},
|
|
38903
|
+
"accounts": {
|
|
38904
|
+
"type": "array",
|
|
38905
|
+
"items": {
|
|
38906
|
+
"type": "object",
|
|
38907
|
+
"required": [
|
|
38908
|
+
"account_id",
|
|
38909
|
+
"count"
|
|
38910
|
+
],
|
|
38911
|
+
"properties": {
|
|
38912
|
+
"account_id": {
|
|
38913
|
+
"type": "string"
|
|
38914
|
+
},
|
|
38915
|
+
"count": {
|
|
38916
|
+
"type": "integer"
|
|
38917
|
+
},
|
|
38918
|
+
"error": {
|
|
38919
|
+
"type": "object",
|
|
38920
|
+
"nullable": true,
|
|
38921
|
+
"properties": {
|
|
38922
|
+
"code": {
|
|
38923
|
+
"type": "string"
|
|
38924
|
+
},
|
|
38925
|
+
"message": {
|
|
38926
|
+
"type": "string"
|
|
38927
|
+
}
|
|
38928
|
+
}
|
|
38929
|
+
}
|
|
38930
|
+
}
|
|
38931
|
+
}
|
|
38932
|
+
}
|
|
38933
|
+
}
|
|
38934
|
+
}
|
|
38935
|
+
}
|
|
38936
|
+
}
|
|
38937
|
+
},
|
|
38938
|
+
"401": {
|
|
38939
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
38940
|
+
},
|
|
38941
|
+
"404": {
|
|
38942
|
+
"$ref": "#/components/responses/NotFound"
|
|
38943
|
+
},
|
|
38944
|
+
"422": {
|
|
38945
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
38946
|
+
},
|
|
38947
|
+
"500": {
|
|
38948
|
+
"$ref": "#/components/responses/InternalError"
|
|
38949
|
+
}
|
|
38950
|
+
}
|
|
38951
|
+
}
|
|
38952
|
+
},
|
|
38953
|
+
"/v1/channels/airbnb/resolutions/{id}": {
|
|
38954
|
+
"get": {
|
|
38955
|
+
"operationId": "get_airbnb_resolution",
|
|
38956
|
+
"summary": "Get an Airbnb Resolution Center case",
|
|
38957
|
+
"description": "One Airbnb Resolution Center case. `{id}` is the Airbnb resolution id (the `resolutionId` from the list, also a transaction's `reference`). Read-only (see the list endpoint). The amounts moved are in the transactions ledger \u2014 join `resolutionId` to a transaction's `reference`. 404 when it isn't in this workspace (POST the list endpoint to refresh first).",
|
|
38958
|
+
"tags": [
|
|
38959
|
+
"Resolutions"
|
|
38960
|
+
],
|
|
38961
|
+
"parameters": [
|
|
38962
|
+
{
|
|
38963
|
+
"$ref": "#/components/parameters/XSchemaHeader"
|
|
38964
|
+
},
|
|
38965
|
+
{
|
|
38966
|
+
"name": "id",
|
|
38967
|
+
"in": "path",
|
|
38968
|
+
"required": true,
|
|
38969
|
+
"description": "The Airbnb resolution id.",
|
|
38970
|
+
"schema": {
|
|
38971
|
+
"type": "string"
|
|
38972
|
+
}
|
|
38973
|
+
}
|
|
38974
|
+
],
|
|
38975
|
+
"responses": {
|
|
38976
|
+
"200": {
|
|
38977
|
+
"description": "Resolution",
|
|
38978
|
+
"content": {
|
|
38979
|
+
"application/json": {
|
|
38980
|
+
"schema": {
|
|
38981
|
+
"$ref": "#/components/schemas/Resolution"
|
|
38982
|
+
}
|
|
38983
|
+
}
|
|
38984
|
+
}
|
|
38985
|
+
},
|
|
38986
|
+
"401": {
|
|
38987
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
38988
|
+
},
|
|
38989
|
+
"404": {
|
|
38990
|
+
"$ref": "#/components/responses/NotFound"
|
|
38991
|
+
},
|
|
38992
|
+
"500": {
|
|
38993
|
+
"$ref": "#/components/responses/InternalError"
|
|
38994
|
+
}
|
|
38995
|
+
}
|
|
38996
|
+
}
|
|
38997
|
+
},
|
|
38998
|
+
"/v1/connections/{id}/imports": {
|
|
38999
|
+
"get": {
|
|
39000
|
+
"operationId": "listConnectionImports",
|
|
39001
|
+
"summary": "List a connection's imports",
|
|
39002
|
+
"description": "The import runs of one connected account, newest first: the first sync after connecting, a room or unit mapped later, a reconnect, a re-sync. Each run says where it stands (`running`, `completed`, `failed`), its stages and what it imported.\n\nTo know when an account's first sync is done, wait for the `account.import.completed` webhook, or poll this endpoint (or `GET /v1/connect`, whose connections carry their latest `import`) until the newest run is no longer `running`.\n\nAuth: a Repull API key, or a Connect session token (`sessionId`).",
|
|
39003
|
+
"tags": [
|
|
39004
|
+
"Connections"
|
|
39005
|
+
],
|
|
39006
|
+
"parameters": [
|
|
39007
|
+
{
|
|
39008
|
+
"name": "id",
|
|
39009
|
+
"in": "path",
|
|
39010
|
+
"required": true,
|
|
39011
|
+
"schema": {
|
|
39012
|
+
"type": "string"
|
|
39013
|
+
},
|
|
39014
|
+
"description": "Connection handle `{provider}:{externalAccountId}`, e.g. `booking_extranet:36`, `vrbo:12`, `airbnb:1234567`, `hostaway:27434` \u2014 the `provider` and `externalAccountId` of a connection on `GET /v1/connect`, or the account of an `account.*` webhook."
|
|
39015
|
+
},
|
|
39016
|
+
{
|
|
39017
|
+
"name": "limit",
|
|
39018
|
+
"in": "query",
|
|
39019
|
+
"required": false,
|
|
39020
|
+
"schema": {
|
|
39021
|
+
"type": "integer",
|
|
39022
|
+
"minimum": 1,
|
|
39023
|
+
"maximum": 100,
|
|
39024
|
+
"default": 20
|
|
39025
|
+
},
|
|
39026
|
+
"description": "How many runs to return, newest first."
|
|
39027
|
+
},
|
|
39028
|
+
{
|
|
39029
|
+
"name": "sessionId",
|
|
39030
|
+
"in": "query",
|
|
39031
|
+
"required": false,
|
|
39032
|
+
"schema": {
|
|
39033
|
+
"type": "string"
|
|
39034
|
+
},
|
|
39035
|
+
"description": "The Connect session ID (capability token)."
|
|
39036
|
+
}
|
|
39037
|
+
],
|
|
39038
|
+
"responses": {
|
|
39039
|
+
"200": {
|
|
39040
|
+
"description": "Imports, newest first. Empty when the account has none recorded.",
|
|
39041
|
+
"content": {
|
|
39042
|
+
"application/json": {
|
|
39043
|
+
"schema": {
|
|
39044
|
+
"type": "object",
|
|
39045
|
+
"properties": {
|
|
39046
|
+
"data": {
|
|
39047
|
+
"type": "array",
|
|
39048
|
+
"items": {
|
|
39049
|
+
"$ref": "#/components/schemas/AccountImport"
|
|
39050
|
+
}
|
|
39051
|
+
},
|
|
39052
|
+
"pagination": {
|
|
39053
|
+
"$ref": "#/components/schemas/Pagination"
|
|
39054
|
+
}
|
|
39055
|
+
}
|
|
39056
|
+
}
|
|
39057
|
+
}
|
|
39058
|
+
}
|
|
39059
|
+
},
|
|
39060
|
+
"400": {
|
|
39061
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39062
|
+
},
|
|
39063
|
+
"401": {
|
|
39064
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39065
|
+
}
|
|
39066
|
+
}
|
|
39067
|
+
}
|
|
39068
|
+
},
|
|
39069
|
+
"/v1/listings/promotions/bulk": {
|
|
39070
|
+
"post": {
|
|
39071
|
+
"operationId": "bulk_listing_promotions",
|
|
39072
|
+
"summary": "Add or remove a promotion on many listings",
|
|
39073
|
+
"description": "Applies one promotion to up to 100 listings \u2014 `add` it, or `remove` the listing's running promotion of that channel and type. Each listing gets its own result with the channel's reason when refused, so one refusal doesn't stop the rest. Returns `403 listing_inactive` before doing anything when any listing is inactive.",
|
|
39074
|
+
"tags": [
|
|
39075
|
+
"Promotions"
|
|
39076
|
+
],
|
|
39077
|
+
"requestBody": {
|
|
39078
|
+
"required": true,
|
|
39079
|
+
"content": {
|
|
39080
|
+
"application/json": {
|
|
39081
|
+
"schema": {
|
|
39082
|
+
"$ref": "#/components/schemas/PromotionBulkRequest"
|
|
39083
|
+
}
|
|
39084
|
+
}
|
|
39085
|
+
}
|
|
39086
|
+
},
|
|
39087
|
+
"responses": {
|
|
39088
|
+
"200": {
|
|
39089
|
+
"description": "A result per listing",
|
|
39090
|
+
"content": {
|
|
39091
|
+
"application/json": {
|
|
39092
|
+
"schema": {
|
|
39093
|
+
"$ref": "#/components/schemas/PromotionBulkResponse"
|
|
39094
|
+
}
|
|
39095
|
+
}
|
|
39096
|
+
}
|
|
39097
|
+
},
|
|
39098
|
+
"400": {
|
|
39099
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39100
|
+
},
|
|
39101
|
+
"401": {
|
|
39102
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39103
|
+
},
|
|
39104
|
+
"403": {
|
|
39105
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
39106
|
+
}
|
|
39107
|
+
}
|
|
39108
|
+
}
|
|
39109
|
+
},
|
|
39110
|
+
"/v1/listings/{id}/promotions": {
|
|
39111
|
+
"get": {
|
|
39112
|
+
"operationId": "list_listing_promotions",
|
|
39113
|
+
"summary": "List a listing's promotions",
|
|
39114
|
+
"description": "Airbnb and Booking.com promotions on the listing, in one model. Includes Airbnb promotions running or available (the new listing promotion shows as `eligible` when the listing qualifies), Airbnb Custom promotions seen on bookings (read-only \u2014 they override your prices on Airbnb), and Booking.com promotions covering the listing's room, including deactivated ones.\n\nPass `refresh=true` to re-read the channels first; otherwise the stored copy is returned (kept current by Airbnb's notifications and a sync every 30 minutes).\n\nReturns `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.",
|
|
39115
|
+
"tags": [
|
|
39116
|
+
"Promotions"
|
|
39117
|
+
],
|
|
39118
|
+
"parameters": [
|
|
39119
|
+
{
|
|
39120
|
+
"name": "id",
|
|
39121
|
+
"in": "path",
|
|
39122
|
+
"required": true,
|
|
39123
|
+
"schema": {
|
|
39124
|
+
"type": "integer"
|
|
39125
|
+
},
|
|
39126
|
+
"description": "Listing ID"
|
|
39127
|
+
},
|
|
39128
|
+
{
|
|
39129
|
+
"name": "refresh",
|
|
39130
|
+
"in": "query",
|
|
39131
|
+
"required": false,
|
|
39132
|
+
"schema": {
|
|
39133
|
+
"type": "boolean"
|
|
39134
|
+
},
|
|
39135
|
+
"description": "Re-read Airbnb and Booking.com before answering."
|
|
39136
|
+
}
|
|
39137
|
+
],
|
|
39138
|
+
"responses": {
|
|
39139
|
+
"200": {
|
|
39140
|
+
"description": "The listing's promotions",
|
|
39141
|
+
"content": {
|
|
39142
|
+
"application/json": {
|
|
39143
|
+
"schema": {
|
|
39144
|
+
"$ref": "#/components/schemas/PromotionListResponse"
|
|
39145
|
+
}
|
|
39146
|
+
}
|
|
39147
|
+
}
|
|
39148
|
+
},
|
|
39149
|
+
"400": {
|
|
39150
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39151
|
+
},
|
|
39152
|
+
"401": {
|
|
39153
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39154
|
+
},
|
|
39155
|
+
"403": {
|
|
39156
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
39157
|
+
},
|
|
39158
|
+
"404": {
|
|
39159
|
+
"$ref": "#/components/responses/NotFound"
|
|
39160
|
+
}
|
|
39161
|
+
}
|
|
39162
|
+
},
|
|
39163
|
+
"post": {
|
|
39164
|
+
"operationId": "create_listing_promotion",
|
|
39165
|
+
"summary": "Add a promotion to a listing",
|
|
39166
|
+
"description": "Adds an Airbnb or Booking.com promotion. Read `GET /v1/listings/{id}/promotions/catalog` first for the types and fields the listing's channels accept.\n\n**Airbnb:** send `channel` and `type` only (`top_rated_guests`, `mobile`, `new_listing`) \u2014 Airbnb sets the discount. **Booking.com:** a listing's promotion covers that listing's room; send `discountPercent` and the rules the type takes, and `hotelId` when the listing is on several properties.\n\nA request a channel can't take is refused with `422` and a `promotion_*` code; the message names the channel and the field and says what to do, and `channel` / `field` are set. Booking.com writes return once Booking.com shows the change (it lags its own writes by a few seconds).\n\nReturns `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.",
|
|
39167
|
+
"tags": [
|
|
39168
|
+
"Promotions"
|
|
39169
|
+
],
|
|
39170
|
+
"parameters": [
|
|
39171
|
+
{
|
|
39172
|
+
"name": "id",
|
|
39173
|
+
"in": "path",
|
|
39174
|
+
"required": true,
|
|
39175
|
+
"schema": {
|
|
39176
|
+
"type": "integer"
|
|
39177
|
+
},
|
|
39178
|
+
"description": "Listing ID"
|
|
39179
|
+
}
|
|
39180
|
+
],
|
|
39181
|
+
"requestBody": {
|
|
39182
|
+
"required": true,
|
|
39183
|
+
"content": {
|
|
39184
|
+
"application/json": {
|
|
39185
|
+
"schema": {
|
|
39186
|
+
"$ref": "#/components/schemas/PromotionCreateRequest"
|
|
39187
|
+
}
|
|
39188
|
+
}
|
|
39189
|
+
}
|
|
39190
|
+
},
|
|
39191
|
+
"responses": {
|
|
39192
|
+
"201": {
|
|
39193
|
+
"description": "The new promotion",
|
|
39194
|
+
"content": {
|
|
39195
|
+
"application/json": {
|
|
39196
|
+
"schema": {
|
|
39197
|
+
"$ref": "#/components/schemas/PromotionResponse"
|
|
39198
|
+
}
|
|
39199
|
+
}
|
|
39200
|
+
}
|
|
39201
|
+
},
|
|
39202
|
+
"400": {
|
|
39203
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39204
|
+
},
|
|
39205
|
+
"401": {
|
|
39206
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39207
|
+
},
|
|
39208
|
+
"403": {
|
|
39209
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
39210
|
+
},
|
|
39211
|
+
"404": {
|
|
39212
|
+
"$ref": "#/components/responses/NotFound"
|
|
39213
|
+
},
|
|
39214
|
+
"409": {
|
|
39215
|
+
"$ref": "#/components/responses/Conflict"
|
|
39216
|
+
},
|
|
39217
|
+
"422": {
|
|
39218
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
39219
|
+
},
|
|
39220
|
+
"502": {
|
|
39221
|
+
"description": "The channel didn't answer"
|
|
39222
|
+
}
|
|
39223
|
+
}
|
|
39224
|
+
}
|
|
39225
|
+
},
|
|
39226
|
+
"/v1/listings/{id}/promotions/catalog": {
|
|
39227
|
+
"get": {
|
|
39228
|
+
"operationId": "get_listing_promotion_catalog",
|
|
39229
|
+
"summary": "Promotion types a listing can use",
|
|
39230
|
+
"description": "Per channel: whether the listing is connected, and each promotion type with a short description for hosts, whether it is new, whether it is available to this listing (and why not), and every field \u2014 supported or not \u2014 with its limits and any value the channel fixes. Booking.com's types and limits come from the property itself; seasonal campaigns appear while Booking.com runs them.\n\nAirbnb asks partners to show newly available discounts with a \u201cNew\u201d badge and to grey out fields a discount does not support rather than hide them; `isNew` and `fields` carry what that needs.\n\nReturns `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.",
|
|
39231
|
+
"tags": [
|
|
39232
|
+
"Promotions"
|
|
39233
|
+
],
|
|
39234
|
+
"parameters": [
|
|
39235
|
+
{
|
|
39236
|
+
"name": "id",
|
|
39237
|
+
"in": "path",
|
|
39238
|
+
"required": true,
|
|
39239
|
+
"schema": {
|
|
39240
|
+
"type": "integer"
|
|
39241
|
+
},
|
|
39242
|
+
"description": "Listing ID"
|
|
39243
|
+
}
|
|
39244
|
+
],
|
|
39245
|
+
"responses": {
|
|
39246
|
+
"200": {
|
|
39247
|
+
"description": "The catalog",
|
|
39248
|
+
"content": {
|
|
39249
|
+
"application/json": {
|
|
39250
|
+
"schema": {
|
|
39251
|
+
"$ref": "#/components/schemas/PromotionCatalogResponse"
|
|
39252
|
+
}
|
|
39253
|
+
}
|
|
39254
|
+
}
|
|
39255
|
+
},
|
|
39256
|
+
"400": {
|
|
39257
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39258
|
+
},
|
|
39259
|
+
"401": {
|
|
39260
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39261
|
+
},
|
|
39262
|
+
"403": {
|
|
39263
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
39264
|
+
},
|
|
39265
|
+
"404": {
|
|
39266
|
+
"$ref": "#/components/responses/NotFound"
|
|
39267
|
+
}
|
|
39268
|
+
}
|
|
39269
|
+
}
|
|
39270
|
+
},
|
|
39271
|
+
"/v1/listings/{id}/promotions/refresh": {
|
|
39272
|
+
"post": {
|
|
39273
|
+
"operationId": "refresh_listing_promotions",
|
|
39274
|
+
"summary": "Re-read a listing's promotions now",
|
|
39275
|
+
"description": "Reads the listing's promotions from Airbnb and Booking.com and returns them. Booking.com promotions belong to the property, so the property's other listings are refreshed too. `errors` lists any channel that could not be read.\n\nReturns `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.",
|
|
39276
|
+
"tags": [
|
|
39277
|
+
"Promotions"
|
|
39278
|
+
],
|
|
39279
|
+
"parameters": [
|
|
39280
|
+
{
|
|
39281
|
+
"name": "id",
|
|
39282
|
+
"in": "path",
|
|
39283
|
+
"required": true,
|
|
39284
|
+
"schema": {
|
|
39285
|
+
"type": "integer"
|
|
39286
|
+
},
|
|
39287
|
+
"description": "Listing ID"
|
|
39288
|
+
}
|
|
39289
|
+
],
|
|
39290
|
+
"responses": {
|
|
39291
|
+
"200": {
|
|
39292
|
+
"description": "The listing's promotions after the read",
|
|
39293
|
+
"content": {
|
|
39294
|
+
"application/json": {
|
|
39295
|
+
"schema": {
|
|
39296
|
+
"$ref": "#/components/schemas/PromotionRefreshResponse"
|
|
39297
|
+
}
|
|
39298
|
+
}
|
|
39299
|
+
}
|
|
39300
|
+
},
|
|
39301
|
+
"400": {
|
|
39302
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39303
|
+
},
|
|
39304
|
+
"401": {
|
|
39305
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39306
|
+
},
|
|
39307
|
+
"403": {
|
|
39308
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
39309
|
+
},
|
|
39310
|
+
"404": {
|
|
39311
|
+
"$ref": "#/components/responses/NotFound"
|
|
39312
|
+
}
|
|
39313
|
+
}
|
|
39314
|
+
}
|
|
39315
|
+
},
|
|
39316
|
+
"/v1/listings/{id}/promotions/{promotionId}": {
|
|
39317
|
+
"get": {
|
|
39318
|
+
"operationId": "get_listing_promotion",
|
|
39319
|
+
"summary": "Get one promotion",
|
|
39320
|
+
"description": "One promotion on the listing.\n\nReturns `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.",
|
|
39321
|
+
"tags": [
|
|
39322
|
+
"Promotions"
|
|
39323
|
+
],
|
|
39324
|
+
"parameters": [
|
|
39325
|
+
{
|
|
39326
|
+
"name": "id",
|
|
39327
|
+
"in": "path",
|
|
39328
|
+
"required": true,
|
|
39329
|
+
"schema": {
|
|
39330
|
+
"type": "integer"
|
|
39331
|
+
},
|
|
39332
|
+
"description": "Listing ID"
|
|
39333
|
+
},
|
|
39334
|
+
{
|
|
39335
|
+
"name": "promotionId",
|
|
39336
|
+
"in": "path",
|
|
39337
|
+
"required": true,
|
|
39338
|
+
"schema": {
|
|
39339
|
+
"type": "integer"
|
|
39340
|
+
},
|
|
39341
|
+
"description": "Promotion ID (from the list)"
|
|
39342
|
+
}
|
|
39343
|
+
],
|
|
39344
|
+
"responses": {
|
|
39345
|
+
"200": {
|
|
39346
|
+
"description": "The promotion",
|
|
39347
|
+
"content": {
|
|
39348
|
+
"application/json": {
|
|
39349
|
+
"schema": {
|
|
39350
|
+
"$ref": "#/components/schemas/PromotionResponse"
|
|
39351
|
+
}
|
|
39352
|
+
}
|
|
39353
|
+
}
|
|
39354
|
+
},
|
|
39355
|
+
"400": {
|
|
39356
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39357
|
+
},
|
|
39358
|
+
"401": {
|
|
39359
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39360
|
+
},
|
|
39361
|
+
"403": {
|
|
39362
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
39363
|
+
},
|
|
39364
|
+
"404": {
|
|
39365
|
+
"$ref": "#/components/responses/NotFound"
|
|
39366
|
+
}
|
|
39367
|
+
}
|
|
39368
|
+
},
|
|
39369
|
+
"patch": {
|
|
39370
|
+
"operationId": "update_listing_promotion",
|
|
39371
|
+
"summary": "Change a promotion",
|
|
39372
|
+
"description": "Booking.com promotions only \u2014 Airbnb's have nothing to change. `rules`, when sent, replaces the promotion's rules whole. A promotion that also covers other listings' rooms changes for them too, so it needs `confirmShared: true` (otherwise `409 promotion_shared_promotion`). Promotions that come from the listing's weekly or monthly discount are changed in its pricing settings.\n\nA request a channel can't take is refused with `422` and a `promotion_*` code; the message names the channel and the field and says what to do, and `channel` / `field` are set. Booking.com writes return once Booking.com shows the change (it lags its own writes by a few seconds).\n\nReturns `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.",
|
|
39373
|
+
"tags": [
|
|
39374
|
+
"Promotions"
|
|
39375
|
+
],
|
|
39376
|
+
"parameters": [
|
|
39377
|
+
{
|
|
39378
|
+
"name": "id",
|
|
39379
|
+
"in": "path",
|
|
39380
|
+
"required": true,
|
|
39381
|
+
"schema": {
|
|
39382
|
+
"type": "integer"
|
|
39383
|
+
},
|
|
39384
|
+
"description": "Listing ID"
|
|
39385
|
+
},
|
|
39386
|
+
{
|
|
39387
|
+
"name": "promotionId",
|
|
39388
|
+
"in": "path",
|
|
39389
|
+
"required": true,
|
|
39390
|
+
"schema": {
|
|
39391
|
+
"type": "integer"
|
|
39392
|
+
},
|
|
39393
|
+
"description": "Promotion ID (from the list)"
|
|
39394
|
+
}
|
|
39395
|
+
],
|
|
39396
|
+
"requestBody": {
|
|
39397
|
+
"required": true,
|
|
39398
|
+
"content": {
|
|
39399
|
+
"application/json": {
|
|
39400
|
+
"schema": {
|
|
39401
|
+
"$ref": "#/components/schemas/PromotionUpdateRequest"
|
|
39402
|
+
}
|
|
39403
|
+
}
|
|
39404
|
+
}
|
|
39405
|
+
},
|
|
39406
|
+
"responses": {
|
|
39407
|
+
"200": {
|
|
39408
|
+
"description": "The changed promotion",
|
|
39409
|
+
"content": {
|
|
39410
|
+
"application/json": {
|
|
39411
|
+
"schema": {
|
|
39412
|
+
"$ref": "#/components/schemas/PromotionResponse"
|
|
39413
|
+
}
|
|
39414
|
+
}
|
|
39415
|
+
}
|
|
39416
|
+
},
|
|
39417
|
+
"400": {
|
|
39418
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39419
|
+
},
|
|
39420
|
+
"401": {
|
|
39421
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39422
|
+
},
|
|
39423
|
+
"403": {
|
|
39424
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
39425
|
+
},
|
|
39426
|
+
"404": {
|
|
39427
|
+
"$ref": "#/components/responses/NotFound"
|
|
39428
|
+
},
|
|
39429
|
+
"409": {
|
|
39430
|
+
"$ref": "#/components/responses/Conflict"
|
|
39431
|
+
},
|
|
39432
|
+
"422": {
|
|
39433
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
39434
|
+
},
|
|
39435
|
+
"502": {
|
|
39436
|
+
"description": "The channel didn't answer"
|
|
39437
|
+
}
|
|
39438
|
+
}
|
|
39439
|
+
},
|
|
39440
|
+
"delete": {
|
|
39441
|
+
"operationId": "delete_listing_promotion",
|
|
39442
|
+
"summary": "Remove a promotion from a listing",
|
|
39443
|
+
"description": "Airbnb: ends the listing's enrolment. Booking.com: takes the listing's room off the promotion \u2014 it keeps running for any other rooms it covers, and is deactivated when none are left. Airbnb Custom promotions can only be ended in Airbnb.\n\nA request a channel can't take is refused with `422` and a `promotion_*` code; the message names the channel and the field and says what to do, and `channel` / `field` are set. Booking.com writes return once Booking.com shows the change (it lags its own writes by a few seconds).\n\nReturns `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.",
|
|
39444
|
+
"tags": [
|
|
39445
|
+
"Promotions"
|
|
39446
|
+
],
|
|
39447
|
+
"parameters": [
|
|
39448
|
+
{
|
|
39449
|
+
"name": "id",
|
|
39450
|
+
"in": "path",
|
|
39451
|
+
"required": true,
|
|
39452
|
+
"schema": {
|
|
39453
|
+
"type": "integer"
|
|
39454
|
+
},
|
|
39455
|
+
"description": "Listing ID"
|
|
39456
|
+
},
|
|
39457
|
+
{
|
|
39458
|
+
"name": "promotionId",
|
|
39459
|
+
"in": "path",
|
|
39460
|
+
"required": true,
|
|
39461
|
+
"schema": {
|
|
39462
|
+
"type": "integer"
|
|
39463
|
+
},
|
|
39464
|
+
"description": "Promotion ID (from the list)"
|
|
39465
|
+
}
|
|
39466
|
+
],
|
|
39467
|
+
"responses": {
|
|
39468
|
+
"200": {
|
|
39469
|
+
"description": "Removed",
|
|
39470
|
+
"content": {
|
|
39471
|
+
"application/json": {
|
|
39472
|
+
"schema": {
|
|
39473
|
+
"$ref": "#/components/schemas/PromotionDeleteResponse"
|
|
39474
|
+
}
|
|
39475
|
+
}
|
|
39476
|
+
}
|
|
39477
|
+
},
|
|
39478
|
+
"400": {
|
|
39479
|
+
"$ref": "#/components/responses/BadRequest"
|
|
39480
|
+
},
|
|
39481
|
+
"401": {
|
|
39482
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
39483
|
+
},
|
|
39484
|
+
"403": {
|
|
39485
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
39486
|
+
},
|
|
39487
|
+
"404": {
|
|
39488
|
+
"$ref": "#/components/responses/NotFound"
|
|
39489
|
+
},
|
|
39490
|
+
"409": {
|
|
39491
|
+
"$ref": "#/components/responses/Conflict"
|
|
39492
|
+
},
|
|
39493
|
+
"422": {
|
|
39494
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
39495
|
+
},
|
|
39496
|
+
"502": {
|
|
39497
|
+
"description": "The channel didn't answer"
|
|
39498
|
+
}
|
|
39499
|
+
}
|
|
39500
|
+
}
|
|
37675
39501
|
}
|
|
37676
39502
|
}
|
|
37677
39503
|
}
|