repull 0.2.30 → 0.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/repull/api/airbnb_api.rb +2 -2
- data/lib/repull/api/billing_api.rb +68 -9
- data/lib/repull/api/booking_com_api.rb +80 -0
- data/lib/repull/api/connect_api.rb +139 -0
- data/lib/repull/api/conversations_api.rb +5 -2
- data/lib/repull/api/health_api.rb +2 -2
- data/lib/repull/api/hotels_api.rb +142 -0
- data/lib/repull/api/transactions_api.rb +109 -0
- data/lib/repull/api/workspaces_api.rb +96 -0
- data/lib/repull/configuration.rb +0 -4
- data/lib/repull/models/availability_batch_write_request.rb +30 -1
- data/lib/repull/models/availability_write_request.rb +30 -1
- data/lib/repull/models/availability_write_settings.rb +33 -4
- data/lib/repull/models/connect_provider.rb +2 -2
- data/lib/repull/models/connect_session.rb +12 -2
- data/lib/repull/models/create_billing_checkout200_response.rb +156 -0
- data/lib/repull/models/create_billing_checkout_request.rb +2 -2
- data/lib/repull/models/create_connect_session_request.rb +13 -1
- data/lib/repull/models/create_connect_session_request_workspace.rb +1 -1
- data/lib/repull/models/get_billing200_response.rb +183 -0
- data/lib/repull/models/get_billing200_response_limits.rb +160 -0
- data/lib/repull/models/get_billing200_response_used.rb +156 -0
- data/lib/repull/models/get_channel_health200_response_vrbo.rb +11 -1
- data/lib/repull/models/get_hotel200_response.rb +252 -0
- data/lib/repull/models/get_hotel200_response_room_types_inner.rb +168 -0
- data/lib/repull/models/get_usage_summary200_response.rb +10 -1
- data/lib/repull/models/get_usage_summary200_response_credits.rb +186 -0
- data/lib/repull/models/list_booking_transactions200_response.rb +158 -0
- data/lib/repull/models/list_hotels200_response.rb +158 -0
- data/lib/repull/models/list_hotels200_response_data_inner.rb +241 -0
- data/lib/repull/models/list_workspaces200_response.rb +158 -0
- data/lib/repull/models/listing.rb +50 -1
- data/lib/repull/models/listing_hotel.rb +202 -0
- data/lib/repull/models/record_account.rb +15 -5
- data/lib/repull/models/reservation.rb +45 -1
- data/lib/repull/models/reservation_message_received_payload.rb +12 -1
- data/lib/repull/models/reservation_message_sent_payload.rb +12 -1
- data/lib/repull/models/reservation_message_updated_payload.rb +12 -1
- data/lib/repull/models/reservation_webhook_object.rb +49 -5
- data/lib/repull/models/select_provider_response.rb +1 -1
- data/lib/repull/models/transaction.rb +349 -0
- data/lib/repull/models/transaction_fees.rb +176 -0
- data/lib/repull/models/transaction_payout.rb +198 -0
- data/lib/repull/models/workspace.rb +265 -0
- data/lib/repull/version.rb +1 -1
- data/lib/repull.rb +19 -0
- data/openapi/v1.json +1008 -18
- metadata +21 -2
data/openapi/v1.json
CHANGED
|
@@ -38,10 +38,6 @@
|
|
|
38
38
|
{
|
|
39
39
|
"url": "https://api.repull.dev",
|
|
40
40
|
"description": "Production"
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"url": "http://repull.localhost:3000/api/repull",
|
|
44
|
-
"description": "Local development"
|
|
45
41
|
}
|
|
46
42
|
],
|
|
47
43
|
"security": [
|
|
@@ -62,6 +58,10 @@
|
|
|
62
58
|
"name": "Reservations",
|
|
63
59
|
"description": "Query, create, update, and cancel reservations"
|
|
64
60
|
},
|
|
61
|
+
{
|
|
62
|
+
"name": "Transactions",
|
|
63
|
+
"description": "Unified transactions & payments ledger across channels \u2014 payouts, reservation charges, refunds. `booking` covers Booking.com however it was connected."
|
|
64
|
+
},
|
|
65
65
|
{
|
|
66
66
|
"name": "Availability",
|
|
67
67
|
"description": "Check and update property availability and pricing"
|
|
@@ -82,6 +82,10 @@
|
|
|
82
82
|
"name": "Connect",
|
|
83
83
|
"description": "Manage PMS/OTA connections. Supports 50+ platforms."
|
|
84
84
|
},
|
|
85
|
+
{
|
|
86
|
+
"name": "Workspaces",
|
|
87
|
+
"description": "Sub-workspaces \u2014 one per customer of yours. Open one with `POST /v1/connect` and `workspace`, then read and write its data with `X-Workspace-Id`."
|
|
88
|
+
},
|
|
85
89
|
{
|
|
86
90
|
"name": "Migrate",
|
|
87
91
|
"description": "Repull Migrate \u2014 move a property manager's data out of their old PMS: import, report, channel links, cutover."
|
|
@@ -593,6 +597,30 @@
|
|
|
593
597
|
"description": "Local check-out time for this stay, `HH:MM` on a 24-hour clock in the property's own timezone. Pair with `checkOut` to schedule the turnover clean. `null` when unknown. This is the same field `PATCH /v1/reservations/{id}` writes.",
|
|
594
598
|
"example": "10:00"
|
|
595
599
|
},
|
|
600
|
+
"guestNotes": {
|
|
601
|
+
"type": "string",
|
|
602
|
+
"nullable": true,
|
|
603
|
+
"description": "What the guest wrote with the booking, as the channel sent it. Booking.com puts the estimated arrival time and special requests here. Free text, never parsed. `null` when the guest left none.",
|
|
604
|
+
"example": "Approximate time of arrival: between 15:00 and 16:00"
|
|
605
|
+
},
|
|
606
|
+
"conversationId": {
|
|
607
|
+
"type": "string",
|
|
608
|
+
"nullable": true,
|
|
609
|
+
"description": "The conversation with this guest \u2014 pass it to `GET /v1/conversations/{id}` and `/v1/conversations/{id}/messages`. It is the same conversation from inquiry through pre-approval to the confirmed booking, and the same id the message webhooks carry, so a booking links straight to the messages that led to it. `null` when the channel has no conversation for this booking.",
|
|
610
|
+
"example": "164743"
|
|
611
|
+
},
|
|
612
|
+
"externalThreadId": {
|
|
613
|
+
"type": "string",
|
|
614
|
+
"nullable": true,
|
|
615
|
+
"description": "The channel's own id for that conversation (Airbnb thread id, Booking.com conversation id, \u2026). `null` when there is none.",
|
|
616
|
+
"example": "2680544213"
|
|
617
|
+
},
|
|
618
|
+
"inquiryId": {
|
|
619
|
+
"type": "string",
|
|
620
|
+
"nullable": true,
|
|
621
|
+
"description": "The inquiry this booking came from (`GET /v1/inquiries`), when the guest asked before booking. When an inquiry turns into a booking, `inquiry.updated` fires with `status: \"booked\"` and this reservation's id. `null` for bookings with no inquiry.",
|
|
622
|
+
"example": "25173"
|
|
623
|
+
},
|
|
596
624
|
"status": {
|
|
597
625
|
"type": "string",
|
|
598
626
|
"example": "confirmed",
|
|
@@ -1598,11 +1626,11 @@
|
|
|
1598
1626
|
},
|
|
1599
1627
|
"connectPattern": {
|
|
1600
1628
|
"type": "string",
|
|
1601
|
-
"description": "How the host is connected. `oauth`: provider-side consent screen. `credentials`: hosted form collects API keys. `activation`: push-only handshake
|
|
1629
|
+
"description": "How the host is connected. `oauth`: provider-side consent screen. `credentials`: hosted form collects API keys. `activation`: push-only handshake. `claim`: connectivity-provider designation in the channel's Extranet (Booking.com). `extranet`: the host signs in with their Booking.com Extranet user."
|
|
1602
1630
|
},
|
|
1603
1631
|
"status": {
|
|
1604
1632
|
"type": "string",
|
|
1605
|
-
"description": "Pickers should hide / disable `coming-soon` cards. `beta` cards are clickable but show a Beta pill."
|
|
1633
|
+
"description": "Pickers should hide / disable `coming-soon` cards. `beta` cards are clickable but show a Beta pill. `request-only` is a PMS Repull doesn't connect yet, listed only with `includeRequestOnly`: picking it collects the host's access details for the Repull team, and the session ends as `requested` instead of connecting."
|
|
1606
1634
|
},
|
|
1607
1635
|
"logoUrl": {
|
|
1608
1636
|
"type": "string",
|
|
@@ -1708,6 +1736,44 @@
|
|
|
1708
1736
|
}
|
|
1709
1737
|
}
|
|
1710
1738
|
},
|
|
1739
|
+
"Workspace": {
|
|
1740
|
+
"type": "object",
|
|
1741
|
+
"description": "A sub-workspace: one customer of yours, with its own connections, listings and data. Send its `workspaceId` as `X-Workspace-Id` to act on it.",
|
|
1742
|
+
"properties": {
|
|
1743
|
+
"workspaceId": {
|
|
1744
|
+
"type": "string",
|
|
1745
|
+
"example": "1204"
|
|
1746
|
+
},
|
|
1747
|
+
"name": {
|
|
1748
|
+
"type": "string",
|
|
1749
|
+
"example": "Seaside Rentals"
|
|
1750
|
+
},
|
|
1751
|
+
"externalRef": {
|
|
1752
|
+
"type": "string",
|
|
1753
|
+
"nullable": true,
|
|
1754
|
+
"description": "Your own id for this customer, as you sent it.",
|
|
1755
|
+
"example": "acct_8812"
|
|
1756
|
+
},
|
|
1757
|
+
"createdVia": {
|
|
1758
|
+
"type": "string",
|
|
1759
|
+
"nullable": true,
|
|
1760
|
+
"description": "`connect` \u2014 opened by a Connect session; `migrate` \u2014 opened by Repull Migrate."
|
|
1761
|
+
},
|
|
1762
|
+
"active": {
|
|
1763
|
+
"type": "boolean"
|
|
1764
|
+
},
|
|
1765
|
+
"createdAt": {
|
|
1766
|
+
"type": "string",
|
|
1767
|
+
"format": "date-time"
|
|
1768
|
+
}
|
|
1769
|
+
},
|
|
1770
|
+
"required": [
|
|
1771
|
+
"workspaceId",
|
|
1772
|
+
"name",
|
|
1773
|
+
"active",
|
|
1774
|
+
"createdAt"
|
|
1775
|
+
]
|
|
1776
|
+
},
|
|
1711
1777
|
"Migration": {
|
|
1712
1778
|
"type": "object",
|
|
1713
1779
|
"description": "One migration: a property manager moved through Repull Migrate, living in its own workspace.",
|
|
@@ -2038,9 +2104,13 @@
|
|
|
2038
2104
|
"type": "string",
|
|
2039
2105
|
"description": "Present only on a Repull Migrate session."
|
|
2040
2106
|
},
|
|
2107
|
+
"includeRequestOnly": {
|
|
2108
|
+
"type": "boolean",
|
|
2109
|
+
"description": "Present (`true`) when the session also lists PMSes Repull doesn't connect yet."
|
|
2110
|
+
},
|
|
2041
2111
|
"workspaceId": {
|
|
2042
2112
|
"type": "string",
|
|
2043
|
-
"description": "
|
|
2113
|
+
"description": "Present when the session lands on a sub-workspace (`workspace` or `X-Workspace-Id` on the request): the workspace the connection lands in. Read and write it with `X-Workspace-Id`; on a migrate session, track the import with `GET /v1/migrations/{workspaceId}`.",
|
|
2044
2114
|
"example": "1204"
|
|
2045
2115
|
}
|
|
2046
2116
|
},
|
|
@@ -2067,7 +2137,7 @@
|
|
|
2067
2137
|
"nextUrl": {
|
|
2068
2138
|
"type": "string",
|
|
2069
2139
|
"format": "uri",
|
|
2070
|
-
"description": "Where to send the user next \u2014 OAuth consent, credentials form, activation checklist, or
|
|
2140
|
+
"description": "Where to send the user next \u2014 OAuth consent, credentials form, activation checklist, claim form, or (for a `request-only` PMS) the request form."
|
|
2071
2141
|
}
|
|
2072
2142
|
}
|
|
2073
2143
|
},
|
|
@@ -2689,6 +2759,30 @@
|
|
|
2689
2759
|
"nullable": true,
|
|
2690
2760
|
"description": "Local check-out time, `HH:MM` on a 24-hour clock in the property's own timezone. Pair it with `checkoutDate` to schedule the turnover. `null` when unknown.",
|
|
2691
2761
|
"example": "10:00"
|
|
2762
|
+
},
|
|
2763
|
+
"guestNotes": {
|
|
2764
|
+
"type": "string",
|
|
2765
|
+
"nullable": true,
|
|
2766
|
+
"description": "What the guest wrote with the booking \u2014 on Booking.com, the estimated arrival time and special requests. Free text. `null` when there were none.",
|
|
2767
|
+
"example": "Approximate time of arrival: between 15:00 and 16:00"
|
|
2768
|
+
},
|
|
2769
|
+
"conversationId": {
|
|
2770
|
+
"type": "string",
|
|
2771
|
+
"nullable": true,
|
|
2772
|
+
"description": "The conversation with this guest \u2014 pass it to `GET /v1/conversations/{id}` and `/v1/conversations/{id}/messages`. It is the same conversation from inquiry through pre-approval to the confirmed booking, and the same id the message webhooks carry, so a booking links straight to the messages that led to it. `null` when the channel has no conversation for this booking.",
|
|
2773
|
+
"example": "164743"
|
|
2774
|
+
},
|
|
2775
|
+
"externalThreadId": {
|
|
2776
|
+
"type": "string",
|
|
2777
|
+
"nullable": true,
|
|
2778
|
+
"description": "The channel's own id for that conversation (Airbnb thread id, Booking.com conversation id, \u2026). `null` when there is none.",
|
|
2779
|
+
"example": "2680544213"
|
|
2780
|
+
},
|
|
2781
|
+
"inquiryId": {
|
|
2782
|
+
"type": "string",
|
|
2783
|
+
"nullable": true,
|
|
2784
|
+
"description": "The inquiry this booking came from (`GET /v1/inquiries`), when the guest asked before booking. When an inquiry turns into a booking, `inquiry.updated` fires with `status: \"booked\"` and this reservation's id. `null` for bookings with no inquiry.",
|
|
2785
|
+
"example": "25173"
|
|
2692
2786
|
}
|
|
2693
2787
|
}
|
|
2694
2788
|
},
|
|
@@ -2758,6 +2852,12 @@
|
|
|
2758
2852
|
"type": "object",
|
|
2759
2853
|
"description": "Payload for `reservation.message.received`. A new inbound message arrived on a reservation thread.",
|
|
2760
2854
|
"properties": {
|
|
2855
|
+
"hotelId": {
|
|
2856
|
+
"type": "string",
|
|
2857
|
+
"nullable": true,
|
|
2858
|
+
"description": "Booking.com only: the hotel (property) id of the conversation's listing. Absent on other channels. A Booking.com Extranet login can cover several hotels, so use this to route the message.",
|
|
2859
|
+
"example": "10433861"
|
|
2860
|
+
},
|
|
2761
2861
|
"reservationId": {
|
|
2762
2862
|
"type": "integer",
|
|
2763
2863
|
"example": 215906
|
|
@@ -2803,6 +2903,12 @@
|
|
|
2803
2903
|
"type": "object",
|
|
2804
2904
|
"description": "Payload for `reservation.message.sent`: a host-side message was sent on a reservation thread. Same fields as `reservation.message.received`, plus `source`.",
|
|
2805
2905
|
"properties": {
|
|
2906
|
+
"hotelId": {
|
|
2907
|
+
"type": "string",
|
|
2908
|
+
"nullable": true,
|
|
2909
|
+
"description": "Booking.com only: the hotel (property) id of the conversation's listing. Absent on other channels. A Booking.com Extranet login can cover several hotels, so use this to route the message.",
|
|
2910
|
+
"example": "10433861"
|
|
2911
|
+
},
|
|
2806
2912
|
"reservationId": {
|
|
2807
2913
|
"type": "integer",
|
|
2808
2914
|
"nullable": true,
|
|
@@ -2873,6 +2979,12 @@
|
|
|
2873
2979
|
"type": "object",
|
|
2874
2980
|
"description": "Payload for `reservation.message.updated`: a message was edited on the channel. `body` is the new text; `previousBody` what it replaced. Read receipts and reactions do not fire it.",
|
|
2875
2981
|
"properties": {
|
|
2982
|
+
"hotelId": {
|
|
2983
|
+
"type": "string",
|
|
2984
|
+
"nullable": true,
|
|
2985
|
+
"description": "Booking.com only: the hotel (property) id of the conversation's listing. Absent on other channels. A Booking.com Extranet login can cover several hotels, so use this to route the message.",
|
|
2986
|
+
"example": "10433861"
|
|
2987
|
+
},
|
|
2876
2988
|
"reservationId": {
|
|
2877
2989
|
"type": "integer",
|
|
2878
2990
|
"nullable": true,
|
|
@@ -4063,6 +4175,11 @@
|
|
|
4063
4175
|
"nullable": true,
|
|
4064
4176
|
"description": "Repull connection id (`X-Account-Id`), when the account has one. A string, like every id in API responses.",
|
|
4065
4177
|
"example": "126"
|
|
4178
|
+
},
|
|
4179
|
+
"hotelId": {
|
|
4180
|
+
"type": "string",
|
|
4181
|
+
"description": "Booking.com only: the hotel (property) id the record belongs to. On a `booking_extranet` account, `externalAccountId` is the login, which can cover several hotels.",
|
|
4182
|
+
"example": "10433861"
|
|
4066
4183
|
}
|
|
4067
4184
|
}
|
|
4068
4185
|
},
|
|
@@ -7170,6 +7287,151 @@
|
|
|
7170
7287
|
}
|
|
7171
7288
|
}
|
|
7172
7289
|
},
|
|
7290
|
+
"Transaction": {
|
|
7291
|
+
"type": "object",
|
|
7292
|
+
"description": "One row of the unified transactions & payments ledger: a payout (`isPayout: true`) or a reservation charge / refund, on any channel. `platform` is normalized \u2014 `booking` is Booking.com however the account was connected (never `booking_extranet`). For a payout, `amount` is the net the host received, `grossAmount` the guest-paid gross, and `fees` the deductions (commission, payments service fee, processing fee).",
|
|
7293
|
+
"required": [
|
|
7294
|
+
"transactionId",
|
|
7295
|
+
"platform",
|
|
7296
|
+
"isPayout",
|
|
7297
|
+
"fees",
|
|
7298
|
+
"payout"
|
|
7299
|
+
],
|
|
7300
|
+
"properties": {
|
|
7301
|
+
"transactionId": {
|
|
7302
|
+
"type": "string",
|
|
7303
|
+
"nullable": true,
|
|
7304
|
+
"description": "Stable id of the transaction (the underlying payment id). Upsert on it.",
|
|
7305
|
+
"example": "booking_payout_5463377687_bank_transfer"
|
|
7306
|
+
},
|
|
7307
|
+
"platform": {
|
|
7308
|
+
"type": "string",
|
|
7309
|
+
"nullable": true,
|
|
7310
|
+
"description": "Normalized channel: `airbnb`, `booking` (Booking.com, however connected \u2014 never `booking_extranet`), or `vrbo`.",
|
|
7311
|
+
"example": "booking"
|
|
7312
|
+
},
|
|
7313
|
+
"type": {
|
|
7314
|
+
"type": "string",
|
|
7315
|
+
"nullable": true,
|
|
7316
|
+
"description": "Transaction type: `Payout`, `Reservation`, `Refund`, \u2026",
|
|
7317
|
+
"example": "Payout"
|
|
7318
|
+
},
|
|
7319
|
+
"isPayout": {
|
|
7320
|
+
"type": "boolean",
|
|
7321
|
+
"description": "`true` when this is money that reached the host (a payout)."
|
|
7322
|
+
},
|
|
7323
|
+
"status": {
|
|
7324
|
+
"type": "string",
|
|
7325
|
+
"nullable": true,
|
|
7326
|
+
"description": "Normalized settlement status (`COMPLETED` / `UPCOMING`; the raw value passes through when it maps to neither).",
|
|
7327
|
+
"example": "COMPLETED"
|
|
7328
|
+
},
|
|
7329
|
+
"date": {
|
|
7330
|
+
"type": "string",
|
|
7331
|
+
"nullable": true,
|
|
7332
|
+
"description": "Transaction / payout date (the channel's display form or ISO).",
|
|
7333
|
+
"example": "27 Aug 2026"
|
|
7334
|
+
},
|
|
7335
|
+
"currency": {
|
|
7336
|
+
"type": "string",
|
|
7337
|
+
"nullable": true,
|
|
7338
|
+
"example": "NOK"
|
|
7339
|
+
},
|
|
7340
|
+
"amount": {
|
|
7341
|
+
"type": "number",
|
|
7342
|
+
"nullable": true,
|
|
7343
|
+
"description": "Net amount; for a payout, what the host received.",
|
|
7344
|
+
"example": 18597.12
|
|
7345
|
+
},
|
|
7346
|
+
"grossAmount": {
|
|
7347
|
+
"type": "number",
|
|
7348
|
+
"nullable": true,
|
|
7349
|
+
"description": "Guest-paid gross (payouts).",
|
|
7350
|
+
"example": 22272
|
|
7351
|
+
},
|
|
7352
|
+
"fees": {
|
|
7353
|
+
"type": "object",
|
|
7354
|
+
"required": [
|
|
7355
|
+
"commission",
|
|
7356
|
+
"serviceFee",
|
|
7357
|
+
"processingFee"
|
|
7358
|
+
],
|
|
7359
|
+
"properties": {
|
|
7360
|
+
"commission": {
|
|
7361
|
+
"type": "number",
|
|
7362
|
+
"nullable": true,
|
|
7363
|
+
"description": "Channel commission deducted.",
|
|
7364
|
+
"example": 3340.8
|
|
7365
|
+
},
|
|
7366
|
+
"serviceFee": {
|
|
7367
|
+
"type": "number",
|
|
7368
|
+
"nullable": true,
|
|
7369
|
+
"description": "Payments service fee deducted.",
|
|
7370
|
+
"example": 334.08
|
|
7371
|
+
},
|
|
7372
|
+
"processingFee": {
|
|
7373
|
+
"type": "number",
|
|
7374
|
+
"nullable": true
|
|
7375
|
+
}
|
|
7376
|
+
}
|
|
7377
|
+
},
|
|
7378
|
+
"payout": {
|
|
7379
|
+
"type": "object",
|
|
7380
|
+
"required": [
|
|
7381
|
+
"payoutId",
|
|
7382
|
+
"payoutDate",
|
|
7383
|
+
"paidOutAmount"
|
|
7384
|
+
],
|
|
7385
|
+
"properties": {
|
|
7386
|
+
"payoutId": {
|
|
7387
|
+
"type": "string",
|
|
7388
|
+
"nullable": true,
|
|
7389
|
+
"description": "Reference of the payout this row belongs to.",
|
|
7390
|
+
"example": "gkvDj0Jm9ZaA6IiO"
|
|
7391
|
+
},
|
|
7392
|
+
"payoutDate": {
|
|
7393
|
+
"type": "string",
|
|
7394
|
+
"nullable": true
|
|
7395
|
+
},
|
|
7396
|
+
"paidOutAmount": {
|
|
7397
|
+
"type": "number",
|
|
7398
|
+
"nullable": true,
|
|
7399
|
+
"description": "On a payout row: the net paid out to the host.",
|
|
7400
|
+
"example": 18597.12
|
|
7401
|
+
},
|
|
7402
|
+
"bankDestination": {
|
|
7403
|
+
"type": "string",
|
|
7404
|
+
"nullable": true,
|
|
7405
|
+
"description": "Masked destination bank account the payout was sent to (Booking.com payouts, from the statement PDF). Null on channels/rows without one.",
|
|
7406
|
+
"example": "NO***********404"
|
|
7407
|
+
},
|
|
7408
|
+
"statementUrl": {
|
|
7409
|
+
"type": "string",
|
|
7410
|
+
"nullable": true,
|
|
7411
|
+
"description": "Link to the channel's original payout statement PDF \u2014 the authoritative settlement record (Booking.com). Null when none."
|
|
7412
|
+
}
|
|
7413
|
+
}
|
|
7414
|
+
},
|
|
7415
|
+
"confirmationCode": {
|
|
7416
|
+
"type": "string",
|
|
7417
|
+
"nullable": true,
|
|
7418
|
+
"example": "5463377687"
|
|
7419
|
+
},
|
|
7420
|
+
"reservationId": {
|
|
7421
|
+
"type": "integer",
|
|
7422
|
+
"nullable": true
|
|
7423
|
+
},
|
|
7424
|
+
"listingId": {
|
|
7425
|
+
"type": "integer",
|
|
7426
|
+
"nullable": true
|
|
7427
|
+
},
|
|
7428
|
+
"syncedAt": {
|
|
7429
|
+
"type": "string",
|
|
7430
|
+
"format": "date-time",
|
|
7431
|
+
"nullable": true
|
|
7432
|
+
}
|
|
7433
|
+
}
|
|
7434
|
+
},
|
|
7173
7435
|
"AirbnbConnectionHost": {
|
|
7174
7436
|
"type": "object",
|
|
7175
7437
|
"description": "One Airbnb host record under the workspace, decorated with its most recent disconnect reason from `airbnb_host_events` (backfill events excluded).",
|
|
@@ -8811,6 +9073,38 @@
|
|
|
8811
9073
|
}
|
|
8812
9074
|
}
|
|
8813
9075
|
},
|
|
9076
|
+
"kind": {
|
|
9077
|
+
"type": "string",
|
|
9078
|
+
"description": "`room_type` when the listing sells several identical units (a hotel room type: `unitCount` > 1) or is a hotel PMS room type; `home` otherwise. See the Hotels & multi-unit guide."
|
|
9079
|
+
},
|
|
9080
|
+
"hotel": {
|
|
9081
|
+
"type": "object",
|
|
9082
|
+
"nullable": true,
|
|
9083
|
+
"description": "The hotel the listing belongs to: a hotel PMS hotel (Cloudbeds, Mews) or a Booking.com property with several room types or rooms. `null` for a standalone home. `GET /v1/hotels/{id}` lists its room types.",
|
|
9084
|
+
"properties": {
|
|
9085
|
+
"id": {
|
|
9086
|
+
"type": "string",
|
|
9087
|
+
"example": "booking:255832",
|
|
9088
|
+
"description": "A Repull hotel id, or `booking:<hotelId>` for a Booking.com property."
|
|
9089
|
+
},
|
|
9090
|
+
"name": {
|
|
9091
|
+
"type": "string",
|
|
9092
|
+
"nullable": true
|
|
9093
|
+
},
|
|
9094
|
+
"source": {
|
|
9095
|
+
"type": "string",
|
|
9096
|
+
"enum": [
|
|
9097
|
+
"pms",
|
|
9098
|
+
"booking"
|
|
9099
|
+
]
|
|
9100
|
+
}
|
|
9101
|
+
}
|
|
9102
|
+
},
|
|
9103
|
+
"unitCount": {
|
|
9104
|
+
"type": "integer",
|
|
9105
|
+
"minimum": 1,
|
|
9106
|
+
"description": "How many identical units (rooms) this listing sells: the hotel PMS rooms of the room type, the room count on Booking.com, or 1 for a home. Rooms left per night are `availableUnits` on `GET /v1/availability/{propertyId}`."
|
|
9107
|
+
},
|
|
8814
9108
|
"units": {
|
|
8815
9109
|
"type": "array",
|
|
8816
9110
|
"description": "`GET /v1/listings/{id}` only. The physical rooms under a hotel-model listing (a Mews or Cloudbeds room type); empty for a single home. Same items as `GET /v1/listings/{id}/units`.",
|
|
@@ -11255,6 +11549,11 @@
|
|
|
11255
11549
|
"maxNights": {
|
|
11256
11550
|
"type": "integer",
|
|
11257
11551
|
"minimum": 1
|
|
11552
|
+
},
|
|
11553
|
+
"availableUnits": {
|
|
11554
|
+
"type": "integer",
|
|
11555
|
+
"minimum": 0,
|
|
11556
|
+
"description": "Rooms to sell on these dates, for a listing that sells several identical rooms (`unitCount` > 1, e.g. a Booking.com room type). Up to the listing's `unitCount`. Refused with `409 managed_by_pms` on a hotel PMS room type (Cloudbeds, Mews) \u2014 its PMS owns the room count."
|
|
11258
11557
|
}
|
|
11259
11558
|
}
|
|
11260
11559
|
},
|
|
@@ -14704,6 +15003,16 @@
|
|
|
14704
15003
|
"404": {
|
|
14705
15004
|
"$ref": "#/components/responses/NotFound"
|
|
14706
15005
|
},
|
|
15006
|
+
"409": {
|
|
15007
|
+
"description": "`managed_by_pms` \u2014 `availableUnits` on a hotel PMS room type. Change rooms in the PMS.",
|
|
15008
|
+
"content": {
|
|
15009
|
+
"application/json": {
|
|
15010
|
+
"schema": {
|
|
15011
|
+
"$ref": "#/components/schemas/Error"
|
|
15012
|
+
}
|
|
15013
|
+
}
|
|
15014
|
+
}
|
|
15015
|
+
},
|
|
14707
15016
|
"422": {
|
|
14708
15017
|
"$ref": "#/components/responses/UnprocessableEntity"
|
|
14709
15018
|
}
|
|
@@ -16018,7 +16327,7 @@
|
|
|
16018
16327
|
"get": {
|
|
16019
16328
|
"operationId": "listConversations",
|
|
16020
16329
|
"summary": "List conversations",
|
|
16021
|
-
"description": "Cursor-paginated list of message threads owned by the workspace. Use `pagination.nextCursor` from one response as the `cursor` query param of the next request.\n\n`?offset=` is also accepted as a first-class alias for shallow paging (0..10000) \u2014 see the `offset` parameter below. Mutually exclusive with `cursor`.\n\nFilters: `platform` (`airbnb`|`booking`|`vrbo`|`website`|`email`), `status` (`open`|`archived` \u2014 `archived` is a stable no-op until the bit lands on `message_threads`).\n\n**Inactive listings:** conversations that belong to an inactive listing (by the thread's listing or its reservation's listing) are left out of the page and of `pagination.total`. Inactive listings keep syncing; activate the listing to use it here.",
|
|
16330
|
+
"description": "Cursor-paginated list of message threads owned by the workspace. Use `pagination.nextCursor` from one response as the `cursor` query param of the next request.\n\n`?offset=` is also accepted as a first-class alias for shallow paging (0..10000) \u2014 see the `offset` parameter below. Mutually exclusive with `cursor`.\n\nFilters: `platform` (`airbnb`|`booking`|`vrbo`|`website`|`email`), `status` (`open`|`archived` \u2014 `archived` is a stable no-op until the bit lands on `message_threads`).\n\n**Inactive listings:** conversations that belong to an inactive listing (by the thread's listing or its reservation's listing) are left out of the page and of `pagination.total`. Inactive listings keep syncing; activate the listing to use it here.\n\n**Order:** newest conversation first (by when the conversation started), unless you pass `updated_since`.\n\n**Incremental sync (`?updated_since=<ISO8601>`):** only conversations with activity (a new message or another change) at or after that instant, ordered oldest change first (`updatedAt ASC`). Walk every page with `cursor`, keeping `updated_since` on each request; the last row's `updatedAt` is your next watermark. A cursor from one kind of walk is refused on the other.",
|
|
16022
16331
|
"tags": [
|
|
16023
16332
|
"Conversations"
|
|
16024
16333
|
],
|
|
@@ -16066,6 +16375,16 @@
|
|
|
16066
16375
|
},
|
|
16067
16376
|
"description": "Restrict to threads on a single channel."
|
|
16068
16377
|
},
|
|
16378
|
+
{
|
|
16379
|
+
"name": "updated_since",
|
|
16380
|
+
"in": "query",
|
|
16381
|
+
"schema": {
|
|
16382
|
+
"type": "string",
|
|
16383
|
+
"format": "date-time"
|
|
16384
|
+
},
|
|
16385
|
+
"description": "ISO 8601 instant. Only conversations with activity at or after it, oldest change first. Keep it on every page of the walk; use the last row's `updatedAt` as the next value.",
|
|
16386
|
+
"example": "2026-10-09T18:00:00Z"
|
|
16387
|
+
},
|
|
16069
16388
|
{
|
|
16070
16389
|
"name": "status",
|
|
16071
16390
|
"in": "query",
|
|
@@ -16957,6 +17276,11 @@
|
|
|
16957
17276
|
"nullable": true,
|
|
16958
17277
|
"description": "Optional whitelist of provider IDs the picker should expose. Omit to show every channel in the registry."
|
|
16959
17278
|
},
|
|
17279
|
+
"includeRequestOnly": {
|
|
17280
|
+
"type": "boolean",
|
|
17281
|
+
"default": false,
|
|
17282
|
+
"description": "Also list PMSes Repull doesn't connect yet (`status: request-only` in `GET /v1/connect/providers?includeRequestOnly=true`), plus an Other PMS card. Picking one opens a form that collects the host's contact and access details for the Repull team and ends with \"A team member will contact you\". No connection is made: the redirect carries `status=requested&provider=<id>`, and no `connect.session.completed` webhook fires. Naming a request-only id in `allowedProviders` offers it without this flag."
|
|
17283
|
+
},
|
|
16960
17284
|
"locale": {
|
|
16961
17285
|
"type": "string",
|
|
16962
17286
|
"nullable": true,
|
|
@@ -16974,7 +17298,7 @@
|
|
|
16974
17298
|
},
|
|
16975
17299
|
"workspace": {
|
|
16976
17300
|
"type": "object",
|
|
16977
|
-
"description": "
|
|
17301
|
+
"description": "Opens a new sub-workspace for this customer of yours and lands the connection there; the response returns its `workspaceId`, which you then send as `X-Workspace-Id`. Works with both purposes: a plain `connect` keeps the normal onboarding pages. Required for `migrate` unless you send `X-Workspace-Id` to reconnect an existing one. Don't send it together with `X-Workspace-Id`.",
|
|
16978
17302
|
"properties": {
|
|
16979
17303
|
"name": {
|
|
16980
17304
|
"type": "string",
|
|
@@ -17064,6 +17388,18 @@
|
|
|
17064
17388
|
"Connect"
|
|
17065
17389
|
],
|
|
17066
17390
|
"security": [],
|
|
17391
|
+
"parameters": [
|
|
17392
|
+
{
|
|
17393
|
+
"name": "includeRequestOnly",
|
|
17394
|
+
"in": "query",
|
|
17395
|
+
"required": false,
|
|
17396
|
+
"schema": {
|
|
17397
|
+
"type": "boolean",
|
|
17398
|
+
"default": false
|
|
17399
|
+
},
|
|
17400
|
+
"description": "Also return the PMSes Repull doesn't connect yet (`status: request-only`), for a picker you render yourself for a session created with `includeRequestOnly`."
|
|
17401
|
+
}
|
|
17402
|
+
],
|
|
17067
17403
|
"responses": {
|
|
17068
17404
|
"200": {
|
|
17069
17405
|
"description": "Channel registry",
|
|
@@ -18078,7 +18414,7 @@
|
|
|
18078
18414
|
"get": {
|
|
18079
18415
|
"operationId": "getChannelHealth",
|
|
18080
18416
|
"summary": "Per-channel connectivity health",
|
|
18081
|
-
"description": "Reports reachability and auth state for one channel (`airbnb`, `booking`, `vrbo`, `plumguide`). Use it to tell \"the channel is down\" apart from \"this workspace's connection expired\". `200` when `status` is `ok`, `503` when `degraded` or `down` (the body's `status` and `message` say which and why).\n\n**`vrbo`** reports the connector's own signals in a `vrbo` block: connected accounts, accounts VRBO signed out (their bookings, messages and calendar stop until reconnected \u2014 `down`), accounts whose inbox sync is late (`degraded`), and the calendar push queue backlog and its oldest wait (`degraded` past 3 hours). Its rate is
|
|
18417
|
+
"description": "Reports reachability and auth state for one channel (`airbnb`, `booking`, `vrbo`, `plumguide`). Use it to tell \"the channel is down\" apart from \"this workspace's connection expired\". `200` when `status` is `ok`, `503` when `degraded` or `down` (the body's `status` and `message` say which and why).\n\n**`vrbo`** reports the connector's own signals in a `vrbo` block: connected accounts, accounts VRBO signed out (their bookings, messages and calendar stop until reconnected \u2014 `down`), accounts whose inbox sync is late (`degraded`), and the calendar push queue backlog and its oldest wait (`degraded` past 3 hours). Its rate is calendar pushes VRBO refused over finished ones in the last 3 hours; failures inside Repull's own connector are reported apart as `vrbo.connector_errors` and do not count (`vrbo.window_hours`; `refresh_attempts_24h` / `refresh_rejections_24h` count that window for VRBO), judged only once at least 50 pushes finished and at least 5 failed \u2014 VRBO pushes run in bursts, so a day-long window would keep reporting a problem already fixed.",
|
|
18082
18418
|
"tags": [
|
|
18083
18419
|
"Health"
|
|
18084
18420
|
],
|
|
@@ -18135,6 +18471,10 @@
|
|
|
18135
18471
|
"type": "integer",
|
|
18136
18472
|
"description": "Listings with a calendar push waiting."
|
|
18137
18473
|
},
|
|
18474
|
+
"connector_errors": {
|
|
18475
|
+
"type": "integer",
|
|
18476
|
+
"description": "Failed pushes in the window caused by Repull's own VRBO connector (a timeout, a browser session in use), not by VRBO. They are retried and never set `status`."
|
|
18477
|
+
},
|
|
18138
18478
|
"calendar_oldest_wait_minutes": {
|
|
18139
18479
|
"type": "integer"
|
|
18140
18480
|
},
|
|
@@ -18220,6 +18560,16 @@
|
|
|
18220
18560
|
"404": {
|
|
18221
18561
|
"$ref": "#/components/responses/NotFound"
|
|
18222
18562
|
},
|
|
18563
|
+
"409": {
|
|
18564
|
+
"description": "`managed_by_pms` \u2014 `availableUnits` on a hotel PMS room type. Change rooms in the PMS.",
|
|
18565
|
+
"content": {
|
|
18566
|
+
"application/json": {
|
|
18567
|
+
"schema": {
|
|
18568
|
+
"$ref": "#/components/schemas/Error"
|
|
18569
|
+
}
|
|
18570
|
+
}
|
|
18571
|
+
}
|
|
18572
|
+
},
|
|
18223
18573
|
"422": {
|
|
18224
18574
|
"$ref": "#/components/responses/UnprocessableEntity"
|
|
18225
18575
|
}
|
|
@@ -19548,7 +19898,7 @@
|
|
|
19548
19898
|
"get": {
|
|
19549
19899
|
"operationId": "get_airbnb_listing_availability",
|
|
19550
19900
|
"summary": "Get Airbnb availability",
|
|
19551
|
-
"description": "Read the per-day availability calendar for an Airbnb listing. Returns one row per day including price overrides, min-stay, and blocked status.\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.",
|
|
19901
|
+
"description": "Read the per-day availability calendar for an Airbnb listing. Returns one row per day including price overrides, min-stay, and blocked status.\n\nThe calendar is served from Repull's stored copy, refreshed by the periodic sync. A successful calendar write through `PUT .../availability` or `PUT .../pricing` (`type: \"calendar\"`) updates the stored days immediately, so reading back right after a write returns the values you published. Changes made directly on Airbnb appear after the next sync (`dataFreshness.lastSyncedAt`).\n\n**Coverage:** with `start_date` + `end_date`, `data.coverage` gives `{ from, to }`, the first and last stored date for the listing (the sync keeps about 12 months ahead). A date outside that window is not stored, so a missing date there means \"not covered\", not \"nothing set\". Request it again once `coverage.to` reaches it.\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.",
|
|
19552
19902
|
"tags": [
|
|
19553
19903
|
"Airbnb"
|
|
19554
19904
|
],
|
|
@@ -27015,10 +27365,71 @@
|
|
|
27015
27365
|
}
|
|
27016
27366
|
},
|
|
27017
27367
|
"/v1/billing": {
|
|
27368
|
+
"get": {
|
|
27369
|
+
"operationId": "get_billing",
|
|
27370
|
+
"summary": "Get plan and usage",
|
|
27371
|
+
"description": "The workspace's plan, its request limits, usage this period, and where the owner manages the plan. Same numbers as `GET /v1/usage/tier`.",
|
|
27372
|
+
"tags": [
|
|
27373
|
+
"Billing"
|
|
27374
|
+
],
|
|
27375
|
+
"responses": {
|
|
27376
|
+
"200": {
|
|
27377
|
+
"description": "Plan and usage",
|
|
27378
|
+
"content": {
|
|
27379
|
+
"application/json": {
|
|
27380
|
+
"schema": {
|
|
27381
|
+
"type": "object",
|
|
27382
|
+
"properties": {
|
|
27383
|
+
"plan": {
|
|
27384
|
+
"type": "string",
|
|
27385
|
+
"example": "starter"
|
|
27386
|
+
},
|
|
27387
|
+
"limits": {
|
|
27388
|
+
"type": "object",
|
|
27389
|
+
"properties": {
|
|
27390
|
+
"monthlyRequests": {
|
|
27391
|
+
"type": "integer",
|
|
27392
|
+
"nullable": true,
|
|
27393
|
+
"description": "null = no limit"
|
|
27394
|
+
},
|
|
27395
|
+
"dailyRequests": {
|
|
27396
|
+
"type": "integer",
|
|
27397
|
+
"nullable": true,
|
|
27398
|
+
"description": "null = no limit"
|
|
27399
|
+
}
|
|
27400
|
+
}
|
|
27401
|
+
},
|
|
27402
|
+
"used": {
|
|
27403
|
+
"type": "object",
|
|
27404
|
+
"properties": {
|
|
27405
|
+
"monthlyRequests": {
|
|
27406
|
+
"type": "integer"
|
|
27407
|
+
},
|
|
27408
|
+
"dailyRequests": {
|
|
27409
|
+
"type": "integer"
|
|
27410
|
+
}
|
|
27411
|
+
}
|
|
27412
|
+
},
|
|
27413
|
+
"resetsAt": {
|
|
27414
|
+
"type": "string",
|
|
27415
|
+
"format": "date-time"
|
|
27416
|
+
},
|
|
27417
|
+
"manageUrl": {
|
|
27418
|
+
"type": "string",
|
|
27419
|
+
"format": "uri",
|
|
27420
|
+
"example": "https://repull.dev/dashboard/settings"
|
|
27421
|
+
}
|
|
27422
|
+
}
|
|
27423
|
+
}
|
|
27424
|
+
}
|
|
27425
|
+
}
|
|
27426
|
+
}
|
|
27427
|
+
}
|
|
27428
|
+
},
|
|
27018
27429
|
"post": {
|
|
27019
27430
|
"operationId": "create_billing_checkout",
|
|
27020
|
-
"summary": "
|
|
27021
|
-
"description": "
|
|
27431
|
+
"summary": "Start an upgrade",
|
|
27432
|
+
"description": "Returns the URL where the workspace owner upgrades to Starter. Plans above Starter are set up with the Repull team and return `422 billing_error` with the next step.",
|
|
27022
27433
|
"tags": [
|
|
27023
27434
|
"Billing"
|
|
27024
27435
|
],
|
|
@@ -27031,9 +27442,7 @@
|
|
|
27031
27442
|
"plan": {
|
|
27032
27443
|
"type": "string",
|
|
27033
27444
|
"enum": [
|
|
27034
|
-
"starter"
|
|
27035
|
-
"growth",
|
|
27036
|
-
"scale"
|
|
27445
|
+
"starter"
|
|
27037
27446
|
]
|
|
27038
27447
|
}
|
|
27039
27448
|
}
|
|
@@ -27043,7 +27452,28 @@
|
|
|
27043
27452
|
},
|
|
27044
27453
|
"responses": {
|
|
27045
27454
|
"200": {
|
|
27046
|
-
"description": "
|
|
27455
|
+
"description": "Where to complete the upgrade",
|
|
27456
|
+
"content": {
|
|
27457
|
+
"application/json": {
|
|
27458
|
+
"schema": {
|
|
27459
|
+
"type": "object",
|
|
27460
|
+
"properties": {
|
|
27461
|
+
"plan": {
|
|
27462
|
+
"type": "string",
|
|
27463
|
+
"example": "starter"
|
|
27464
|
+
},
|
|
27465
|
+
"checkoutUrl": {
|
|
27466
|
+
"type": "string",
|
|
27467
|
+
"format": "uri",
|
|
27468
|
+
"example": "https://repull.dev/dashboard/settings"
|
|
27469
|
+
}
|
|
27470
|
+
}
|
|
27471
|
+
}
|
|
27472
|
+
}
|
|
27473
|
+
}
|
|
27474
|
+
},
|
|
27475
|
+
"422": {
|
|
27476
|
+
"description": "A plan that is not sold through self-serve checkout, or an unknown plan"
|
|
27047
27477
|
}
|
|
27048
27478
|
}
|
|
27049
27479
|
}
|
|
@@ -27318,6 +27748,30 @@
|
|
|
27318
27748
|
}
|
|
27319
27749
|
}
|
|
27320
27750
|
},
|
|
27751
|
+
"credits": {
|
|
27752
|
+
"type": "object",
|
|
27753
|
+
"description": "Pay-as-you-go wallet. Requests beyond your plan's monthly quota keep being served while `active`, billed at `usdPer1000Requests`. Top up at https://repull.dev/dashboard/billing.",
|
|
27754
|
+
"properties": {
|
|
27755
|
+
"balanceUsd": {
|
|
27756
|
+
"type": "number"
|
|
27757
|
+
},
|
|
27758
|
+
"active": {
|
|
27759
|
+
"type": "boolean",
|
|
27760
|
+
"description": "Positive balance and not paused \u2014 usage beyond the monthly quota is being served."
|
|
27761
|
+
},
|
|
27762
|
+
"paused": {
|
|
27763
|
+
"type": "boolean"
|
|
27764
|
+
},
|
|
27765
|
+
"usdPer1000Requests": {
|
|
27766
|
+
"type": "number",
|
|
27767
|
+
"example": 1
|
|
27768
|
+
},
|
|
27769
|
+
"requestsCovered": {
|
|
27770
|
+
"type": "integer",
|
|
27771
|
+
"description": "Requests beyond your quota the current balance pays for."
|
|
27772
|
+
}
|
|
27773
|
+
}
|
|
27774
|
+
},
|
|
27321
27775
|
"dailyResetsAt": {
|
|
27322
27776
|
"type": "string",
|
|
27323
27777
|
"format": "date-time"
|
|
@@ -36682,6 +37136,542 @@
|
|
|
36682
37136
|
}
|
|
36683
37137
|
}
|
|
36684
37138
|
}
|
|
37139
|
+
},
|
|
37140
|
+
"/v1/workspaces": {
|
|
37141
|
+
"get": {
|
|
37142
|
+
"operationId": "listWorkspaces",
|
|
37143
|
+
"summary": "List workspaces",
|
|
37144
|
+
"description": "Every sub-workspace your workspace has opened, newest first: one per customer of yours, created by `POST /v1/connect` with `workspace` (or by Repull Migrate). Read or write a workspace's data by sending its `workspaceId` as `X-Workspace-Id`. Its webhook events arrive on your own webhook endpoints, tagged with `workspaceId`. Page with `pagination.nextCursor`.",
|
|
37145
|
+
"tags": [
|
|
37146
|
+
"Workspaces"
|
|
37147
|
+
],
|
|
37148
|
+
"parameters": [
|
|
37149
|
+
{
|
|
37150
|
+
"name": "limit",
|
|
37151
|
+
"in": "query",
|
|
37152
|
+
"schema": {
|
|
37153
|
+
"type": "integer",
|
|
37154
|
+
"minimum": 1,
|
|
37155
|
+
"maximum": 100,
|
|
37156
|
+
"default": 25
|
|
37157
|
+
}
|
|
37158
|
+
},
|
|
37159
|
+
{
|
|
37160
|
+
"name": "cursor",
|
|
37161
|
+
"in": "query",
|
|
37162
|
+
"schema": {
|
|
37163
|
+
"type": "string"
|
|
37164
|
+
},
|
|
37165
|
+
"description": "`pagination.nextCursor` from the previous page."
|
|
37166
|
+
},
|
|
37167
|
+
{
|
|
37168
|
+
"name": "externalRef",
|
|
37169
|
+
"in": "query",
|
|
37170
|
+
"schema": {
|
|
37171
|
+
"type": "string"
|
|
37172
|
+
},
|
|
37173
|
+
"description": "Only the workspace you tagged with this `externalRef` (your own id for the customer)."
|
|
37174
|
+
}
|
|
37175
|
+
],
|
|
37176
|
+
"responses": {
|
|
37177
|
+
"200": {
|
|
37178
|
+
"description": "Workspaces",
|
|
37179
|
+
"content": {
|
|
37180
|
+
"application/json": {
|
|
37181
|
+
"schema": {
|
|
37182
|
+
"type": "object",
|
|
37183
|
+
"properties": {
|
|
37184
|
+
"data": {
|
|
37185
|
+
"type": "array",
|
|
37186
|
+
"items": {
|
|
37187
|
+
"$ref": "#/components/schemas/Workspace"
|
|
37188
|
+
}
|
|
37189
|
+
},
|
|
37190
|
+
"pagination": {
|
|
37191
|
+
"type": "object",
|
|
37192
|
+
"properties": {
|
|
37193
|
+
"nextCursor": {
|
|
37194
|
+
"type": "string",
|
|
37195
|
+
"nullable": true
|
|
37196
|
+
},
|
|
37197
|
+
"hasMore": {
|
|
37198
|
+
"type": "boolean"
|
|
37199
|
+
},
|
|
37200
|
+
"total": {
|
|
37201
|
+
"type": "integer"
|
|
37202
|
+
}
|
|
37203
|
+
}
|
|
37204
|
+
}
|
|
37205
|
+
}
|
|
37206
|
+
}
|
|
37207
|
+
}
|
|
37208
|
+
}
|
|
37209
|
+
},
|
|
37210
|
+
"401": {
|
|
37211
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
37212
|
+
},
|
|
37213
|
+
"422": {
|
|
37214
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
37215
|
+
},
|
|
37216
|
+
"500": {
|
|
37217
|
+
"$ref": "#/components/responses/InternalError"
|
|
37218
|
+
}
|
|
37219
|
+
}
|
|
37220
|
+
}
|
|
37221
|
+
},
|
|
37222
|
+
"/v1/hotels": {
|
|
37223
|
+
"get": {
|
|
37224
|
+
"operationId": "listHotels",
|
|
37225
|
+
"summary": "List hotels",
|
|
37226
|
+
"description": "Your workspace's hotels: hotels from a hotel PMS (Cloudbeds, Mews) and Booking.com properties with several room types or rooms. Each room type is a listing \u2014 `GET /v1/hotels/{id}` lists them with their room counts. A hotel itself is never booked: availability, prices and reservations live on its room types. See the Hotels & multi-unit guide.",
|
|
37227
|
+
"tags": [
|
|
37228
|
+
"Hotels"
|
|
37229
|
+
],
|
|
37230
|
+
"responses": {
|
|
37231
|
+
"200": {
|
|
37232
|
+
"description": "Hotels",
|
|
37233
|
+
"content": {
|
|
37234
|
+
"application/json": {
|
|
37235
|
+
"schema": {
|
|
37236
|
+
"type": "object",
|
|
37237
|
+
"properties": {
|
|
37238
|
+
"data": {
|
|
37239
|
+
"type": "array",
|
|
37240
|
+
"items": {
|
|
37241
|
+
"type": "object",
|
|
37242
|
+
"properties": {
|
|
37243
|
+
"id": {
|
|
37244
|
+
"type": "string",
|
|
37245
|
+
"example": "30910",
|
|
37246
|
+
"description": "A Repull hotel id, or `booking:<hotelId>` for a Booking.com property."
|
|
37247
|
+
},
|
|
37248
|
+
"name": {
|
|
37249
|
+
"type": "string",
|
|
37250
|
+
"nullable": true
|
|
37251
|
+
},
|
|
37252
|
+
"source": {
|
|
37253
|
+
"type": "string",
|
|
37254
|
+
"enum": [
|
|
37255
|
+
"pms",
|
|
37256
|
+
"booking"
|
|
37257
|
+
],
|
|
37258
|
+
"description": "`pms`: a hotel PMS (Cloudbeds, Mews) owns rooms and room counts. `booking`: a Booking.com property; room counts are the room count on Booking.com."
|
|
37259
|
+
},
|
|
37260
|
+
"provider": {
|
|
37261
|
+
"type": "string",
|
|
37262
|
+
"nullable": true,
|
|
37263
|
+
"example": "cloudbeds"
|
|
37264
|
+
},
|
|
37265
|
+
"city": {
|
|
37266
|
+
"type": "string",
|
|
37267
|
+
"nullable": true
|
|
37268
|
+
},
|
|
37269
|
+
"roomTypeCount": {
|
|
37270
|
+
"type": "integer"
|
|
37271
|
+
},
|
|
37272
|
+
"unitCount": {
|
|
37273
|
+
"type": "integer",
|
|
37274
|
+
"description": "Rooms across all room types."
|
|
37275
|
+
}
|
|
37276
|
+
}
|
|
37277
|
+
}
|
|
37278
|
+
},
|
|
37279
|
+
"pagination": {
|
|
37280
|
+
"type": "object",
|
|
37281
|
+
"properties": {
|
|
37282
|
+
"nextCursor": {
|
|
37283
|
+
"type": "string",
|
|
37284
|
+
"nullable": true
|
|
37285
|
+
},
|
|
37286
|
+
"hasMore": {
|
|
37287
|
+
"type": "boolean"
|
|
37288
|
+
},
|
|
37289
|
+
"total": {
|
|
37290
|
+
"type": "integer"
|
|
37291
|
+
}
|
|
37292
|
+
}
|
|
37293
|
+
}
|
|
37294
|
+
}
|
|
37295
|
+
}
|
|
37296
|
+
}
|
|
37297
|
+
}
|
|
37298
|
+
},
|
|
37299
|
+
"401": {
|
|
37300
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
37301
|
+
}
|
|
37302
|
+
}
|
|
37303
|
+
}
|
|
37304
|
+
},
|
|
37305
|
+
"/v1/hotels/{id}": {
|
|
37306
|
+
"get": {
|
|
37307
|
+
"operationId": "getHotel",
|
|
37308
|
+
"summary": "Get a hotel",
|
|
37309
|
+
"description": "One hotel with its room types. `id` is from `GET /v1/hotels`, or a listing's `hotel.id`.",
|
|
37310
|
+
"tags": [
|
|
37311
|
+
"Hotels"
|
|
37312
|
+
],
|
|
37313
|
+
"parameters": [
|
|
37314
|
+
{
|
|
37315
|
+
"name": "id",
|
|
37316
|
+
"in": "path",
|
|
37317
|
+
"required": true,
|
|
37318
|
+
"schema": {
|
|
37319
|
+
"type": "string"
|
|
37320
|
+
},
|
|
37321
|
+
"example": "booking:255832"
|
|
37322
|
+
}
|
|
37323
|
+
],
|
|
37324
|
+
"responses": {
|
|
37325
|
+
"200": {
|
|
37326
|
+
"description": "Hotel",
|
|
37327
|
+
"content": {
|
|
37328
|
+
"application/json": {
|
|
37329
|
+
"schema": {
|
|
37330
|
+
"type": "object",
|
|
37331
|
+
"properties": {
|
|
37332
|
+
"id": {
|
|
37333
|
+
"type": "string",
|
|
37334
|
+
"example": "30910",
|
|
37335
|
+
"description": "A Repull hotel id, or `booking:<hotelId>` for a Booking.com property."
|
|
37336
|
+
},
|
|
37337
|
+
"name": {
|
|
37338
|
+
"type": "string",
|
|
37339
|
+
"nullable": true
|
|
37340
|
+
},
|
|
37341
|
+
"source": {
|
|
37342
|
+
"type": "string",
|
|
37343
|
+
"enum": [
|
|
37344
|
+
"pms",
|
|
37345
|
+
"booking"
|
|
37346
|
+
],
|
|
37347
|
+
"description": "`pms`: a hotel PMS (Cloudbeds, Mews) owns rooms and room counts. `booking`: a Booking.com property; room counts are the room count on Booking.com."
|
|
37348
|
+
},
|
|
37349
|
+
"provider": {
|
|
37350
|
+
"type": "string",
|
|
37351
|
+
"nullable": true,
|
|
37352
|
+
"example": "cloudbeds"
|
|
37353
|
+
},
|
|
37354
|
+
"city": {
|
|
37355
|
+
"type": "string",
|
|
37356
|
+
"nullable": true
|
|
37357
|
+
},
|
|
37358
|
+
"roomTypeCount": {
|
|
37359
|
+
"type": "integer"
|
|
37360
|
+
},
|
|
37361
|
+
"unitCount": {
|
|
37362
|
+
"type": "integer",
|
|
37363
|
+
"description": "Rooms across all room types."
|
|
37364
|
+
},
|
|
37365
|
+
"roomTypes": {
|
|
37366
|
+
"type": "array",
|
|
37367
|
+
"items": {
|
|
37368
|
+
"type": "object",
|
|
37369
|
+
"properties": {
|
|
37370
|
+
"listingId": {
|
|
37371
|
+
"type": "string",
|
|
37372
|
+
"description": "The room type's listing id \u2014 use it with every /v1/listings, /v1/availability and /v1/reservations endpoint."
|
|
37373
|
+
},
|
|
37374
|
+
"name": {
|
|
37375
|
+
"type": "string",
|
|
37376
|
+
"nullable": true
|
|
37377
|
+
},
|
|
37378
|
+
"unitCount": {
|
|
37379
|
+
"type": "integer",
|
|
37380
|
+
"description": "Rooms of this type."
|
|
37381
|
+
}
|
|
37382
|
+
}
|
|
37383
|
+
}
|
|
37384
|
+
}
|
|
37385
|
+
}
|
|
37386
|
+
}
|
|
37387
|
+
}
|
|
37388
|
+
}
|
|
37389
|
+
},
|
|
37390
|
+
"401": {
|
|
37391
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
37392
|
+
},
|
|
37393
|
+
"404": {
|
|
37394
|
+
"$ref": "#/components/responses/NotFound"
|
|
37395
|
+
},
|
|
37396
|
+
"422": {
|
|
37397
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
37398
|
+
}
|
|
37399
|
+
}
|
|
37400
|
+
}
|
|
37401
|
+
},
|
|
37402
|
+
"/v1/connect/zeevou/callback": {
|
|
37403
|
+
"get": {
|
|
37404
|
+
"operationId": "zeevouConnectCallback",
|
|
37405
|
+
"summary": "Zeevou OAuth callback",
|
|
37406
|
+
"description": "Zeevou's OAuth redirect after the host allows or denies access on Zeevou's consent screen. It finishes the Connect session and redirects the host to the hosted Connect page. Called by the host's browser, not by integrators.",
|
|
37407
|
+
"tags": [
|
|
37408
|
+
"Connect"
|
|
37409
|
+
],
|
|
37410
|
+
"security": [],
|
|
37411
|
+
"parameters": [
|
|
37412
|
+
{
|
|
37413
|
+
"name": "code",
|
|
37414
|
+
"in": "query",
|
|
37415
|
+
"required": false,
|
|
37416
|
+
"schema": {
|
|
37417
|
+
"type": "string"
|
|
37418
|
+
},
|
|
37419
|
+
"description": "Authorization code from Zeevou."
|
|
37420
|
+
},
|
|
37421
|
+
{
|
|
37422
|
+
"name": "state",
|
|
37423
|
+
"in": "query",
|
|
37424
|
+
"required": true,
|
|
37425
|
+
"schema": {
|
|
37426
|
+
"type": "string"
|
|
37427
|
+
},
|
|
37428
|
+
"description": "The signed Connect state Repull sent to Zeevou."
|
|
37429
|
+
},
|
|
37430
|
+
{
|
|
37431
|
+
"name": "error",
|
|
37432
|
+
"in": "query",
|
|
37433
|
+
"required": false,
|
|
37434
|
+
"schema": {
|
|
37435
|
+
"type": "string"
|
|
37436
|
+
},
|
|
37437
|
+
"description": "Set by Zeevou when the host denied access (`access_denied`)."
|
|
37438
|
+
}
|
|
37439
|
+
],
|
|
37440
|
+
"responses": {
|
|
37441
|
+
"302": {
|
|
37442
|
+
"description": "Redirect to the hosted Connect page with the outcome"
|
|
37443
|
+
},
|
|
37444
|
+
"400": {
|
|
37445
|
+
"description": "The state is missing, forged or expired"
|
|
37446
|
+
}
|
|
37447
|
+
}
|
|
37448
|
+
}
|
|
37449
|
+
},
|
|
37450
|
+
"/v1/connect/rentalready/callback": {
|
|
37451
|
+
"get": {
|
|
37452
|
+
"operationId": "rentalReadyConnectCallback",
|
|
37453
|
+
"summary": "RentalReady OAuth callback",
|
|
37454
|
+
"description": "RentalReady's OAuth redirect after the host allows or denies access on RentalReady's consent screen. It finishes the Connect session and redirects the host to the hosted Connect page. Called by the host's browser, not by integrators.",
|
|
37455
|
+
"tags": [
|
|
37456
|
+
"Connect"
|
|
37457
|
+
],
|
|
37458
|
+
"security": [],
|
|
37459
|
+
"parameters": [
|
|
37460
|
+
{
|
|
37461
|
+
"name": "code",
|
|
37462
|
+
"in": "query",
|
|
37463
|
+
"required": false,
|
|
37464
|
+
"schema": {
|
|
37465
|
+
"type": "string"
|
|
37466
|
+
},
|
|
37467
|
+
"description": "Authorization code from RentalReady."
|
|
37468
|
+
},
|
|
37469
|
+
{
|
|
37470
|
+
"name": "state",
|
|
37471
|
+
"in": "query",
|
|
37472
|
+
"required": true,
|
|
37473
|
+
"schema": {
|
|
37474
|
+
"type": "string"
|
|
37475
|
+
},
|
|
37476
|
+
"description": "The signed Connect state Repull sent to RentalReady."
|
|
37477
|
+
},
|
|
37478
|
+
{
|
|
37479
|
+
"name": "error",
|
|
37480
|
+
"in": "query",
|
|
37481
|
+
"required": false,
|
|
37482
|
+
"schema": {
|
|
37483
|
+
"type": "string"
|
|
37484
|
+
},
|
|
37485
|
+
"description": "Set by RentalReady when the host denied access (`access_denied`)."
|
|
37486
|
+
}
|
|
37487
|
+
],
|
|
37488
|
+
"responses": {
|
|
37489
|
+
"302": {
|
|
37490
|
+
"description": "Redirect to the hosted Connect page with the outcome"
|
|
37491
|
+
},
|
|
37492
|
+
"400": {
|
|
37493
|
+
"description": "The state is missing, forged or expired"
|
|
37494
|
+
}
|
|
37495
|
+
}
|
|
37496
|
+
}
|
|
37497
|
+
},
|
|
37498
|
+
"/v1/channels/booking/transactions": {
|
|
37499
|
+
"get": {
|
|
37500
|
+
"operationId": "list_booking_transactions",
|
|
37501
|
+
"summary": "List Booking.com transactions (settlement ledger)",
|
|
37502
|
+
"description": "The Booking.com settlement ledger for this workspace: every payout (Payments by Booking.com \u2192 bank transfer) and reservation charge, with the gross the guest paid, Booking's commission and payments service fee, and the net paid out, each tied to its reservation. Official Connectivity-API and extranet-connected accounts are returned together as one Booking.com \u2014 there is no `booking_extranet` distinction and nothing extra to request. Cursor-paginated, newest first. (For all channels at once, use `/v1/transactions`.)",
|
|
37503
|
+
"tags": [
|
|
37504
|
+
"Booking.com"
|
|
37505
|
+
],
|
|
37506
|
+
"parameters": [
|
|
37507
|
+
{
|
|
37508
|
+
"name": "type",
|
|
37509
|
+
"in": "query",
|
|
37510
|
+
"required": false,
|
|
37511
|
+
"description": "Filter by transaction type, e.g. `Payout`, `Reservation`, `Refund`.",
|
|
37512
|
+
"schema": {
|
|
37513
|
+
"type": "string"
|
|
37514
|
+
}
|
|
37515
|
+
},
|
|
37516
|
+
{
|
|
37517
|
+
"name": "status",
|
|
37518
|
+
"in": "query",
|
|
37519
|
+
"required": false,
|
|
37520
|
+
"description": "Filter by raw status.",
|
|
37521
|
+
"schema": {
|
|
37522
|
+
"type": "string"
|
|
37523
|
+
}
|
|
37524
|
+
},
|
|
37525
|
+
{
|
|
37526
|
+
"name": "is_payout",
|
|
37527
|
+
"in": "query",
|
|
37528
|
+
"required": false,
|
|
37529
|
+
"description": "When `true`, only payout rows (money that reached the host).",
|
|
37530
|
+
"schema": {
|
|
37531
|
+
"type": "boolean"
|
|
37532
|
+
}
|
|
37533
|
+
},
|
|
37534
|
+
{
|
|
37535
|
+
"name": "limit",
|
|
37536
|
+
"in": "query",
|
|
37537
|
+
"required": false,
|
|
37538
|
+
"description": "Page size (default 100, max 500).",
|
|
37539
|
+
"schema": {
|
|
37540
|
+
"type": "integer",
|
|
37541
|
+
"minimum": 1,
|
|
37542
|
+
"maximum": 500
|
|
37543
|
+
}
|
|
37544
|
+
},
|
|
37545
|
+
{
|
|
37546
|
+
"name": "cursor",
|
|
37547
|
+
"in": "query",
|
|
37548
|
+
"required": false,
|
|
37549
|
+
"description": "Opaque pagination cursor from a previous `pagination.nextCursor`.",
|
|
37550
|
+
"schema": {
|
|
37551
|
+
"type": "string"
|
|
37552
|
+
}
|
|
37553
|
+
}
|
|
37554
|
+
],
|
|
37555
|
+
"responses": {
|
|
37556
|
+
"200": {
|
|
37557
|
+
"description": "A page of Booking.com transactions.",
|
|
37558
|
+
"content": {
|
|
37559
|
+
"application/json": {
|
|
37560
|
+
"schema": {
|
|
37561
|
+
"type": "object",
|
|
37562
|
+
"properties": {
|
|
37563
|
+
"data": {
|
|
37564
|
+
"type": "array",
|
|
37565
|
+
"items": {
|
|
37566
|
+
"$ref": "#/components/schemas/Transaction"
|
|
37567
|
+
}
|
|
37568
|
+
},
|
|
37569
|
+
"pagination": {
|
|
37570
|
+
"$ref": "#/components/schemas/CursorPagination"
|
|
37571
|
+
}
|
|
37572
|
+
}
|
|
37573
|
+
}
|
|
37574
|
+
}
|
|
37575
|
+
}
|
|
37576
|
+
}
|
|
37577
|
+
}
|
|
37578
|
+
}
|
|
37579
|
+
},
|
|
37580
|
+
"/v1/transactions": {
|
|
37581
|
+
"get": {
|
|
37582
|
+
"operationId": "list_transactions",
|
|
37583
|
+
"summary": "List transactions & payments (unified ledger)",
|
|
37584
|
+
"description": "Every channel's money in one ledger: payouts that reached the host, reservation charges, refunds and adjustments, across Airbnb, Booking.com and Vrbo. Each row carries a normalized `platform` \u2014 `booking` always means Booking.com however the account was connected (official API or extranet); there is no `booking_extranet`, and `?platform=booking` matches all of them. A payout row's `amount` is the net the host received; `grossAmount` is what the guest paid and `fees` the deductions (commission, payments service fee, processing fee). Cursor-paginated, newest first.",
|
|
37585
|
+
"tags": [
|
|
37586
|
+
"Transactions"
|
|
37587
|
+
],
|
|
37588
|
+
"parameters": [
|
|
37589
|
+
{
|
|
37590
|
+
"name": "platform",
|
|
37591
|
+
"in": "query",
|
|
37592
|
+
"required": false,
|
|
37593
|
+
"description": "Filter to one channel: `airbnb`, `booking` (Booking.com, however connected), or `vrbo`. Omit for all channels.",
|
|
37594
|
+
"schema": {
|
|
37595
|
+
"type": "string",
|
|
37596
|
+
"enum": [
|
|
37597
|
+
"airbnb",
|
|
37598
|
+
"booking",
|
|
37599
|
+
"vrbo"
|
|
37600
|
+
]
|
|
37601
|
+
}
|
|
37602
|
+
},
|
|
37603
|
+
{
|
|
37604
|
+
"name": "type",
|
|
37605
|
+
"in": "query",
|
|
37606
|
+
"required": false,
|
|
37607
|
+
"description": "Filter by transaction type, e.g. `Payout`, `Reservation`, `Refund`.",
|
|
37608
|
+
"schema": {
|
|
37609
|
+
"type": "string"
|
|
37610
|
+
}
|
|
37611
|
+
},
|
|
37612
|
+
{
|
|
37613
|
+
"name": "status",
|
|
37614
|
+
"in": "query",
|
|
37615
|
+
"required": false,
|
|
37616
|
+
"description": "Filter by raw status.",
|
|
37617
|
+
"schema": {
|
|
37618
|
+
"type": "string"
|
|
37619
|
+
}
|
|
37620
|
+
},
|
|
37621
|
+
{
|
|
37622
|
+
"name": "is_payout",
|
|
37623
|
+
"in": "query",
|
|
37624
|
+
"required": false,
|
|
37625
|
+
"description": "When `true`, only payout rows (money that reached the host).",
|
|
37626
|
+
"schema": {
|
|
37627
|
+
"type": "boolean"
|
|
37628
|
+
}
|
|
37629
|
+
},
|
|
37630
|
+
{
|
|
37631
|
+
"name": "limit",
|
|
37632
|
+
"in": "query",
|
|
37633
|
+
"required": false,
|
|
37634
|
+
"description": "Page size (default 100, max 500).",
|
|
37635
|
+
"schema": {
|
|
37636
|
+
"type": "integer",
|
|
37637
|
+
"minimum": 1,
|
|
37638
|
+
"maximum": 500
|
|
37639
|
+
}
|
|
37640
|
+
},
|
|
37641
|
+
{
|
|
37642
|
+
"name": "cursor",
|
|
37643
|
+
"in": "query",
|
|
37644
|
+
"required": false,
|
|
37645
|
+
"description": "Opaque pagination cursor from a previous `pagination.nextCursor`.",
|
|
37646
|
+
"schema": {
|
|
37647
|
+
"type": "string"
|
|
37648
|
+
}
|
|
37649
|
+
}
|
|
37650
|
+
],
|
|
37651
|
+
"responses": {
|
|
37652
|
+
"200": {
|
|
37653
|
+
"description": "A page of transactions.",
|
|
37654
|
+
"content": {
|
|
37655
|
+
"application/json": {
|
|
37656
|
+
"schema": {
|
|
37657
|
+
"type": "object",
|
|
37658
|
+
"properties": {
|
|
37659
|
+
"data": {
|
|
37660
|
+
"type": "array",
|
|
37661
|
+
"items": {
|
|
37662
|
+
"$ref": "#/components/schemas/Transaction"
|
|
37663
|
+
}
|
|
37664
|
+
},
|
|
37665
|
+
"pagination": {
|
|
37666
|
+
"$ref": "#/components/schemas/CursorPagination"
|
|
37667
|
+
}
|
|
37668
|
+
}
|
|
37669
|
+
}
|
|
37670
|
+
}
|
|
37671
|
+
}
|
|
37672
|
+
}
|
|
37673
|
+
}
|
|
37674
|
+
}
|
|
36685
37675
|
}
|
|
36686
37676
|
}
|
|
36687
37677
|
}
|