repull 0.2.0 → 0.2.3

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.
Files changed (282) hide show
  1. checksums.yaml +4 -4
  2. data/lib/repull/api/ai_api.rb +1 -1
  3. data/lib/repull/api/airbnb_api.rb +271 -16
  4. data/lib/repull/api/atlas_api.rb +1 -1
  5. data/lib/repull/api/availability_api.rb +1 -1
  6. data/lib/repull/api/billing_api.rb +1 -1
  7. data/lib/repull/api/booking_com_api.rb +133 -1
  8. data/lib/repull/api/connect_api.rb +3 -3
  9. data/lib/repull/api/conversations_api.rb +27 -5
  10. data/lib/repull/api/guests_api.rb +14 -3
  11. data/lib/repull/api/kv_api.rb +361 -0
  12. data/lib/repull/api/listings_api.rb +26 -9
  13. data/lib/repull/api/markets_api.rb +14 -3
  14. data/lib/repull/api/plumguide_api.rb +1 -1
  15. data/lib/repull/api/pricing_api.rb +14 -3
  16. data/lib/repull/api/properties_api.rb +32 -8
  17. data/lib/repull/api/reservations_api.rb +34 -5
  18. data/lib/repull/api/reviews_api.rb +14 -3
  19. data/lib/repull/api/schema_api.rb +1 -1
  20. data/lib/repull/api/studio_api.rb +1094 -0
  21. data/lib/repull/api/system_api.rb +1 -1
  22. data/lib/repull/api/vrbo_api.rb +31 -3
  23. data/lib/repull/api/webhooks_api.rb +16 -5
  24. data/lib/repull/api_client.rb +1 -1
  25. data/lib/repull/api_error.rb +1 -1
  26. data/lib/repull/api_model_base.rb +1 -1
  27. data/lib/repull/configuration.rb +1 -1
  28. data/lib/repull/models/account_created_event.rb +217 -0
  29. data/lib/repull/models/account_created_payload.rb +185 -0
  30. data/lib/repull/models/account_disconnected_event.rb +217 -0
  31. data/lib/repull/models/account_disconnected_payload.rb +196 -0
  32. data/lib/repull/models/ai_operation.rb +1 -1
  33. data/lib/repull/models/ai_operation_completed_event.rb +217 -0
  34. data/lib/repull/models/ai_operation_completed_payload.rb +197 -0
  35. data/lib/repull/models/ai_operation_failed_event.rb +217 -0
  36. data/lib/repull/models/ai_operation_failed_payload.rb +175 -0
  37. data/lib/repull/models/ai_operation_failed_payload_error.rb +156 -0
  38. data/lib/repull/models/airbnb_connection.rb +242 -0
  39. data/lib/repull/models/airbnb_connection_accessibility_amenities_inner.rb +167 -0
  40. data/lib/repull/models/airbnb_connection_amenities_inner.rb +168 -0
  41. data/lib/repull/models/airbnb_connection_host.rb +244 -0
  42. data/lib/repull/models/airbnb_connection_response.rb +164 -0
  43. data/lib/repull/models/airbnb_connection_summary.rb +231 -0
  44. data/lib/repull/models/airbnb_data_freshness.rb +201 -0
  45. data/lib/repull/models/airbnb_listing.rb +25 -74
  46. data/lib/repull/models/airbnb_listing_list_response.rb +65 -5
  47. data/lib/repull/models/airbnb_reservation.rb +1 -1
  48. data/lib/repull/models/airbnb_reservation_list_response.rb +2 -1
  49. data/lib/repull/models/airbnb_review.rb +1 -1
  50. data/lib/repull/models/airbnb_review_list_response.rb +1 -1
  51. data/lib/repull/models/airbnb_thread.rb +1 -1
  52. data/lib/repull/models/airbnb_thread_list_response.rb +1 -1
  53. data/lib/repull/models/booking_connect_listing_option.rb +1 -1
  54. data/lib/repull/models/booking_connect_room.rb +1 -1
  55. data/lib/repull/models/booking_connect_rooms_response.rb +1 -1
  56. data/lib/repull/models/booking_conversation.rb +1 -1
  57. data/lib/repull/models/booking_conversation_list_response.rb +1 -1
  58. data/lib/repull/models/booking_pricing_rate_update.rb +1 -1
  59. data/lib/repull/models/booking_pricing_rate_update_date_range.rb +1 -1
  60. data/lib/repull/models/booking_pricing_rate_update_restrictions.rb +1 -1
  61. data/lib/repull/models/booking_pricing_response.rb +1 -1
  62. data/lib/repull/models/booking_pricing_update_request.rb +1 -1
  63. data/lib/repull/models/booking_pricing_update_response.rb +1 -1
  64. data/lib/repull/models/booking_property.rb +1 -1
  65. data/lib/repull/models/booking_property_list_response.rb +1 -1
  66. data/lib/repull/models/booking_room_mapping.rb +1 -1
  67. data/lib/repull/models/booking_verify_hotel_request.rb +1 -1
  68. data/lib/repull/models/booking_verify_hotel_response.rb +1 -1
  69. data/lib/repull/models/bulk_pricing_failure.rb +1 -1
  70. data/lib/repull/models/bulk_pricing_item.rb +1 -1
  71. data/lib/repull/models/bulk_pricing_request.rb +1 -1
  72. data/lib/repull/models/bulk_pricing_response.rb +1 -1
  73. data/lib/repull/models/calendar_day.rb +1 -1
  74. data/lib/repull/models/calendar_response.rb +1 -1
  75. data/lib/repull/models/calendar_updated_event.rb +217 -0
  76. data/lib/repull/models/calendar_updated_payload.rb +184 -0
  77. data/lib/repull/models/calendar_updated_payload_range.rb +156 -0
  78. data/lib/repull/models/clear_kv200_response.rb +147 -0
  79. data/lib/repull/models/connect_host.rb +1 -1
  80. data/lib/repull/models/connect_provider.rb +1 -1
  81. data/lib/repull/models/connect_provider_list_response.rb +1 -1
  82. data/lib/repull/models/connect_session.rb +1 -1
  83. data/lib/repull/models/connect_status.rb +1 -1
  84. data/lib/repull/models/connection.rb +1 -1
  85. data/lib/repull/models/connection_list_response.rb +1 -1
  86. data/lib/repull/models/conversation.rb +1 -1
  87. data/lib/repull/models/conversation_detail.rb +1 -1
  88. data/lib/repull/models/conversation_guest.rb +1 -1
  89. data/lib/repull/models/conversation_guest_contact.rb +1 -1
  90. data/lib/repull/models/conversation_host.rb +1 -1
  91. data/lib/repull/models/conversation_list_response.rb +1 -1
  92. data/lib/repull/models/conversation_message_attachment.rb +1 -1
  93. data/lib/repull/models/create_ai_operation200_response.rb +1 -1
  94. data/lib/repull/models/create_billing_checkout_request.rb +1 -1
  95. data/lib/repull/models/create_connect_session_request.rb +1 -1
  96. data/lib/repull/models/create_connection_request.rb +1 -1
  97. data/lib/repull/models/create_reservation_request.rb +1 -1
  98. data/lib/repull/models/create_studio_deployment201_response.rb +147 -0
  99. data/lib/repull/models/create_studio_deployment201_response_data.rb +199 -0
  100. data/lib/repull/models/create_studio_deployment_request.rb +165 -0
  101. data/lib/repull/models/create_studio_project201_response.rb +147 -0
  102. data/lib/repull/models/create_studio_project201_response_data.rb +199 -0
  103. data/lib/repull/models/create_studio_project_generation201_response.rb +147 -0
  104. data/lib/repull/models/create_studio_project_generation201_response_data.rb +165 -0
  105. data/lib/repull/models/create_studio_project_generation_request.rb +165 -0
  106. data/lib/repull/models/create_studio_project_request.rb +203 -0
  107. data/lib/repull/models/create_webhook_request.rb +2 -2
  108. data/lib/repull/models/custom_schema.rb +1 -1
  109. data/lib/repull/models/custom_schema_create.rb +1 -1
  110. data/lib/repull/models/custom_schema_create_response.rb +1 -1
  111. data/lib/repull/models/custom_schema_delete_response.rb +1 -1
  112. data/lib/repull/models/custom_schema_list_response.rb +1 -1
  113. data/lib/repull/models/custom_schema_summary.rb +1 -1
  114. data/lib/repull/models/custom_schema_update.rb +1 -1
  115. data/lib/repull/models/delete_kv200_response.rb +147 -0
  116. data/lib/repull/models/delete_studio_deployment200_response.rb +147 -0
  117. data/lib/repull/models/delete_studio_deployment200_response_data.rb +156 -0
  118. data/lib/repull/models/delete_studio_project200_response.rb +147 -0
  119. data/lib/repull/models/delete_studio_project200_response_data.rb +156 -0
  120. data/lib/repull/models/delete_studio_project_file200_response.rb +147 -0
  121. data/lib/repull/models/delete_studio_project_file200_response_data.rb +156 -0
  122. data/lib/repull/models/error.rb +1 -1
  123. data/lib/repull/models/error_error.rb +1 -1
  124. data/lib/repull/models/error_error_support.rb +1 -1
  125. data/lib/repull/models/generate_studio_completion200_response.rb +147 -0
  126. data/lib/repull/models/generate_studio_completion200_response_data.rb +224 -0
  127. data/lib/repull/models/generate_studio_completion_request.rb +305 -0
  128. data/lib/repull/models/generate_studio_completion_request_project_id.rb +105 -0
  129. data/lib/repull/models/get_health200_response.rb +1 -1
  130. data/lib/repull/models/get_studio_deployment200_response.rb +147 -0
  131. data/lib/repull/models/get_studio_project200_response.rb +147 -0
  132. data/lib/repull/models/guest.rb +1 -1
  133. data/lib/repull/models/guest_contact.rb +1 -1
  134. data/lib/repull/models/guest_flag.rb +1 -1
  135. data/lib/repull/models/guest_list_response.rb +1 -1
  136. data/lib/repull/models/guest_note.rb +1 -1
  137. data/lib/repull/models/guest_profile.rb +1 -1
  138. data/lib/repull/models/guest_reservations_summary.rb +1 -1
  139. data/lib/repull/models/list_kv200_response.rb +158 -0
  140. data/lib/repull/models/list_kv200_response_data_inner.rb +176 -0
  141. data/lib/repull/models/list_kv200_response_pagination.rb +156 -0
  142. data/lib/repull/models/list_studio_deployments200_response.rb +158 -0
  143. data/lib/repull/models/list_studio_project_files200_response.rb +149 -0
  144. data/lib/repull/models/list_studio_projects200_response.rb +149 -0
  145. data/lib/repull/models/listing.rb +36 -2
  146. data/lib/repull/models/listing_address.rb +1 -1
  147. data/lib/repull/models/listing_amenity.rb +215 -0
  148. data/lib/repull/models/listing_channel.rb +1 -1
  149. data/lib/repull/models/listing_comp.rb +1 -1
  150. data/lib/repull/models/listing_comp_nightly.rb +1 -1
  151. data/lib/repull/models/listing_comp_ratings.rb +1 -1
  152. data/lib/repull/models/listing_comps_response.rb +1 -1
  153. data/lib/repull/models/listing_content.rb +54 -13
  154. data/lib/repull/models/listing_create_request.rb +1 -1
  155. data/lib/repull/models/listing_create_response.rb +1 -1
  156. data/lib/repull/models/listing_created_event.rb +217 -0
  157. data/lib/repull/models/listing_created_payload.rb +202 -0
  158. data/lib/repull/models/listing_created_payload_address.rb +165 -0
  159. data/lib/repull/models/listing_deleted_event.rb +217 -0
  160. data/lib/repull/models/listing_deleted_payload.rb +167 -0
  161. data/lib/repull/models/listing_details.rb +374 -0
  162. data/lib/repull/models/listing_generate_content_request.rb +2 -2
  163. data/lib/repull/models/listing_generate_content_response.rb +1 -1
  164. data/lib/repull/models/listing_list_response.rb +1 -1
  165. data/lib/repull/models/listing_pricing_apply_request.rb +1 -1
  166. data/lib/repull/models/listing_pricing_apply_response.rb +1 -1
  167. data/lib/repull/models/listing_pricing_history_entry.rb +1 -1
  168. data/lib/repull/models/listing_pricing_history_response.rb +1 -1
  169. data/lib/repull/models/listing_pricing_recommendation.rb +1 -1
  170. data/lib/repull/models/listing_pricing_response.rb +1 -1
  171. data/lib/repull/models/listing_pricing_response_comp_summary.rb +1 -1
  172. data/lib/repull/models/listing_pricing_response_date_range.rb +1 -1
  173. data/lib/repull/models/listing_pricing_response_listing.rb +1 -1
  174. data/lib/repull/models/listing_pricing_strategy.rb +1 -1
  175. data/lib/repull/models/listing_pricing_strategy_input.rb +1 -1
  176. data/lib/repull/models/listing_publish_airbnb_request.rb +1 -1
  177. data/lib/repull/models/listing_publish_response.rb +1 -1
  178. data/lib/repull/models/listing_publish_status_channel.rb +1 -1
  179. data/lib/repull/models/listing_publish_status_connection.rb +180 -0
  180. data/lib/repull/models/listing_publish_status_response.rb +18 -5
  181. data/lib/repull/models/listing_quality_tier.rb +1 -1
  182. data/lib/repull/models/listing_segment.rb +1 -1
  183. data/lib/repull/models/listing_segment_recommendation.rb +1 -1
  184. data/lib/repull/models/listing_segments_response.rb +1 -1
  185. data/lib/repull/models/listing_segments_response_scope.rb +1 -1
  186. data/lib/repull/models/listing_updated_event.rb +217 -0
  187. data/lib/repull/models/listing_updated_payload.rb +169 -0
  188. data/lib/repull/models/map_connect_booking_rooms_request.rb +1 -1
  189. data/lib/repull/models/map_connect_booking_rooms_response.rb +1 -1
  190. data/lib/repull/models/market_browse_category.rb +1 -1
  191. data/lib/repull/models/market_browse_entry.rb +1 -1
  192. data/lib/repull/models/market_browse_featured.rb +1 -1
  193. data/lib/repull/models/market_browse_response.rb +1 -1
  194. data/lib/repull/models/market_calendar_day.rb +1 -1
  195. data/lib/repull/models/market_calendar_day_events_inner.rb +1 -1
  196. data/lib/repull/models/market_calendar_response.rb +1 -1
  197. data/lib/repull/models/market_detail_response.rb +1 -1
  198. data/lib/repull/models/market_detail_response_price_distribution_inner.rb +1 -1
  199. data/lib/repull/models/market_detail_response_property_type_mix_inner.rb +1 -1
  200. data/lib/repull/models/market_detail_response_supply_trend_inner.rb +1 -1
  201. data/lib/repull/models/market_detail_response_top_comps.rb +1 -1
  202. data/lib/repull/models/market_event.rb +1 -1
  203. data/lib/repull/models/market_my_listing.rb +1 -1
  204. data/lib/repull/models/market_summary.rb +1 -1
  205. data/lib/repull/models/market_top_comp.rb +1 -1
  206. data/lib/repull/models/markets_overview_response.rb +2 -2
  207. data/lib/repull/models/markets_overview_response_browse.rb +1 -1
  208. data/lib/repull/models/markets_overview_response_subscriptions.rb +1 -1
  209. data/lib/repull/models/markets_overview_response_totals.rb +1 -1
  210. data/lib/repull/models/message.rb +1 -1
  211. data/lib/repull/models/message_list_response.rb +1 -1
  212. data/lib/repull/models/pagination.rb +1 -1
  213. data/lib/repull/models/payment_completed_event.rb +217 -0
  214. data/lib/repull/models/payment_completed_payload.rb +193 -0
  215. data/lib/repull/models/payment_refunded_event.rb +217 -0
  216. data/lib/repull/models/payment_refunded_payload.rb +193 -0
  217. data/lib/repull/models/plumguide_listing.rb +1 -1
  218. data/lib/repull/models/plumguide_listing_list_response.rb +1 -1
  219. data/lib/repull/models/property.rb +17 -5
  220. data/lib/repull/models/property_list_response.rb +1 -1
  221. data/lib/repull/models/reply_booking_review200_response.rb +147 -0
  222. data/lib/repull/models/reply_booking_review_request.rb +219 -0
  223. data/lib/repull/models/repull_ping_event.rb +217 -0
  224. data/lib/repull/models/repull_ping_payload.rb +148 -0
  225. data/lib/repull/models/reservation.rb +74 -89
  226. data/lib/repull/models/reservation_cancelled_event.rb +217 -0
  227. data/lib/repull/models/reservation_cancelled_payload.rb +196 -0
  228. data/lib/repull/models/reservation_created_event.rb +218 -0
  229. data/lib/repull/models/reservation_created_payload.rb +165 -0
  230. data/lib/repull/models/reservation_financials.rb +172 -0
  231. data/lib/repull/models/reservation_list_response.rb +1 -1
  232. data/lib/repull/models/reservation_message_received_event.rb +217 -0
  233. data/lib/repull/models/reservation_message_received_payload.rb +184 -0
  234. data/lib/repull/models/reservation_message_received_payload_from.rb +157 -0
  235. data/lib/repull/models/reservation_occupancy.rb +190 -0
  236. data/lib/repull/models/reservation_primary_guest.rb +202 -0
  237. data/lib/repull/models/reservation_updated_event.rb +217 -0
  238. data/lib/repull/models/reservation_updated_payload.rb +177 -0
  239. data/lib/repull/models/reservation_webhook_object.rb +355 -0
  240. data/lib/repull/models/respond_airbnb_review_request.rb +174 -0
  241. data/lib/repull/models/review.rb +1 -1
  242. data/lib/repull/models/review_category.rb +1 -1
  243. data/lib/repull/models/review_list_response.rb +1 -1
  244. data/lib/repull/models/review_response.rb +1 -1
  245. data/lib/repull/models/rotate_webhook_secret200_response.rb +1 -1
  246. data/lib/repull/models/select_connect_provider_request.rb +1 -1
  247. data/lib/repull/models/select_provider_response.rb +1 -1
  248. data/lib/repull/models/set_kv_request.rb +180 -0
  249. data/lib/repull/models/studio_deployment.rb +207 -0
  250. data/lib/repull/models/studio_error.rb +148 -0
  251. data/lib/repull/models/studio_error_error.rb +212 -0
  252. data/lib/repull/models/studio_file.rb +188 -0
  253. data/lib/repull/models/studio_generation.rb +215 -0
  254. data/lib/repull/models/studio_project.rb +241 -0
  255. data/lib/repull/models/test_webhook_request.rb +24 -2
  256. data/lib/repull/models/update_availability_request.rb +1 -1
  257. data/lib/repull/models/update_listing_pricing_strategy200_response.rb +1 -1
  258. data/lib/repull/models/update_reservation_request.rb +1 -1
  259. data/lib/repull/models/update_studio_project_request.rb +190 -0
  260. data/lib/repull/models/update_webhook_request.rb +2 -2
  261. data/lib/repull/models/upsert_studio_project_file200_response.rb +147 -0
  262. data/lib/repull/models/upsert_studio_project_file200_response_data.rb +147 -0
  263. data/lib/repull/models/upsert_studio_project_file_request.rb +165 -0
  264. data/lib/repull/models/vrbo_listing.rb +1 -1
  265. data/lib/repull/models/vrbo_listing_list_response.rb +1 -1
  266. data/lib/repull/models/vrbo_reservation.rb +1 -1
  267. data/lib/repull/models/vrbo_reservation_list_response.rb +1 -1
  268. data/lib/repull/models/webhook_delivery.rb +25 -2
  269. data/lib/repull/models/webhook_delivery_detail.rb +26 -3
  270. data/lib/repull/models/webhook_delivery_list_response.rb +1 -1
  271. data/lib/repull/models/webhook_event.rb +82 -0
  272. data/lib/repull/models/webhook_event_catalog.rb +18 -5
  273. data/lib/repull/models/webhook_event_catalog_domains_inner.rb +2 -2
  274. data/lib/repull/models/{webhook_event_catalog_domains_inner_events_inner.rb → webhook_event_catalog_entry.rb} +28 -5
  275. data/lib/repull/models/webhook_event_type.rb +53 -0
  276. data/lib/repull/models/webhook_list_response.rb +1 -1
  277. data/lib/repull/models/webhook_subscription.rb +2 -2
  278. data/lib/repull/version.rb +2 -2
  279. data/lib/repull.rb +97 -2
  280. data/openapi/v1.json +8717 -4724
  281. data/scripts/regen.sh +1 -1
  282. metadata +99 -4
data/lib/repull.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_test_YOUR_API_KEY ``` Sandbox keys start with `sk_test_`, production with `sk_live_`. ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `pro`, `enterprise`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resets_at` fields.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_test_YOUR_API_KEY ``` Sandbox keys start with `sk_test_`, production with `sk_live_`. ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resets_at` fields.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
  Contact: ivan@vanio.ai
@@ -19,6 +19,22 @@ require 'repull/configuration'
19
19
 
20
20
  # Models
21
21
  require 'repull/models/ai_operation'
22
+ require 'repull/models/account_created_event'
23
+ require 'repull/models/account_created_payload'
24
+ require 'repull/models/account_disconnected_event'
25
+ require 'repull/models/account_disconnected_payload'
26
+ require 'repull/models/ai_operation_completed_event'
27
+ require 'repull/models/ai_operation_completed_payload'
28
+ require 'repull/models/ai_operation_failed_event'
29
+ require 'repull/models/ai_operation_failed_payload'
30
+ require 'repull/models/ai_operation_failed_payload_error'
31
+ require 'repull/models/airbnb_connection'
32
+ require 'repull/models/airbnb_connection_accessibility_amenities_inner'
33
+ require 'repull/models/airbnb_connection_amenities_inner'
34
+ require 'repull/models/airbnb_connection_host'
35
+ require 'repull/models/airbnb_connection_response'
36
+ require 'repull/models/airbnb_connection_summary'
37
+ require 'repull/models/airbnb_data_freshness'
22
38
  require 'repull/models/airbnb_listing'
23
39
  require 'repull/models/airbnb_listing_list_response'
24
40
  require 'repull/models/airbnb_reservation'
@@ -49,6 +65,10 @@ require 'repull/models/bulk_pricing_request'
49
65
  require 'repull/models/bulk_pricing_response'
50
66
  require 'repull/models/calendar_day'
51
67
  require 'repull/models/calendar_response'
68
+ require 'repull/models/calendar_updated_event'
69
+ require 'repull/models/calendar_updated_payload'
70
+ require 'repull/models/calendar_updated_payload_range'
71
+ require 'repull/models/clear_kv200_response'
52
72
  require 'repull/models/connect_host'
53
73
  require 'repull/models/connect_provider'
54
74
  require 'repull/models/connect_provider_list_response'
@@ -68,6 +88,15 @@ require 'repull/models/create_billing_checkout_request'
68
88
  require 'repull/models/create_connect_session_request'
69
89
  require 'repull/models/create_connection_request'
70
90
  require 'repull/models/create_reservation_request'
91
+ require 'repull/models/create_studio_deployment201_response'
92
+ require 'repull/models/create_studio_deployment201_response_data'
93
+ require 'repull/models/create_studio_deployment_request'
94
+ require 'repull/models/create_studio_project201_response'
95
+ require 'repull/models/create_studio_project201_response_data'
96
+ require 'repull/models/create_studio_project_generation201_response'
97
+ require 'repull/models/create_studio_project_generation201_response_data'
98
+ require 'repull/models/create_studio_project_generation_request'
99
+ require 'repull/models/create_studio_project_request'
71
100
  require 'repull/models/create_webhook_request'
72
101
  require 'repull/models/custom_schema'
73
102
  require 'repull/models/custom_schema_create'
@@ -76,10 +105,23 @@ require 'repull/models/custom_schema_delete_response'
76
105
  require 'repull/models/custom_schema_list_response'
77
106
  require 'repull/models/custom_schema_summary'
78
107
  require 'repull/models/custom_schema_update'
108
+ require 'repull/models/delete_kv200_response'
109
+ require 'repull/models/delete_studio_deployment200_response'
110
+ require 'repull/models/delete_studio_deployment200_response_data'
111
+ require 'repull/models/delete_studio_project200_response'
112
+ require 'repull/models/delete_studio_project200_response_data'
113
+ require 'repull/models/delete_studio_project_file200_response'
114
+ require 'repull/models/delete_studio_project_file200_response_data'
79
115
  require 'repull/models/error'
80
116
  require 'repull/models/error_error'
81
117
  require 'repull/models/error_error_support'
118
+ require 'repull/models/generate_studio_completion200_response'
119
+ require 'repull/models/generate_studio_completion200_response_data'
120
+ require 'repull/models/generate_studio_completion_request'
121
+ require 'repull/models/generate_studio_completion_request_project_id'
82
122
  require 'repull/models/get_health200_response'
123
+ require 'repull/models/get_studio_deployment200_response'
124
+ require 'repull/models/get_studio_project200_response'
83
125
  require 'repull/models/guest'
84
126
  require 'repull/models/guest_contact'
85
127
  require 'repull/models/guest_flag'
@@ -87,8 +129,15 @@ require 'repull/models/guest_list_response'
87
129
  require 'repull/models/guest_note'
88
130
  require 'repull/models/guest_profile'
89
131
  require 'repull/models/guest_reservations_summary'
132
+ require 'repull/models/list_kv200_response'
133
+ require 'repull/models/list_kv200_response_data_inner'
134
+ require 'repull/models/list_kv200_response_pagination'
135
+ require 'repull/models/list_studio_deployments200_response'
136
+ require 'repull/models/list_studio_project_files200_response'
137
+ require 'repull/models/list_studio_projects200_response'
90
138
  require 'repull/models/listing'
91
139
  require 'repull/models/listing_address'
140
+ require 'repull/models/listing_amenity'
92
141
  require 'repull/models/listing_channel'
93
142
  require 'repull/models/listing_comp'
94
143
  require 'repull/models/listing_comp_nightly'
@@ -97,6 +146,12 @@ require 'repull/models/listing_comps_response'
97
146
  require 'repull/models/listing_content'
98
147
  require 'repull/models/listing_create_request'
99
148
  require 'repull/models/listing_create_response'
149
+ require 'repull/models/listing_created_event'
150
+ require 'repull/models/listing_created_payload'
151
+ require 'repull/models/listing_created_payload_address'
152
+ require 'repull/models/listing_deleted_event'
153
+ require 'repull/models/listing_deleted_payload'
154
+ require 'repull/models/listing_details'
100
155
  require 'repull/models/listing_generate_content_request'
101
156
  require 'repull/models/listing_generate_content_response'
102
157
  require 'repull/models/listing_list_response'
@@ -114,12 +169,15 @@ require 'repull/models/listing_pricing_strategy_input'
114
169
  require 'repull/models/listing_publish_airbnb_request'
115
170
  require 'repull/models/listing_publish_response'
116
171
  require 'repull/models/listing_publish_status_channel'
172
+ require 'repull/models/listing_publish_status_connection'
117
173
  require 'repull/models/listing_publish_status_response'
118
174
  require 'repull/models/listing_quality_tier'
119
175
  require 'repull/models/listing_segment'
120
176
  require 'repull/models/listing_segment_recommendation'
121
177
  require 'repull/models/listing_segments_response'
122
178
  require 'repull/models/listing_segments_response_scope'
179
+ require 'repull/models/listing_updated_event'
180
+ require 'repull/models/listing_updated_payload'
123
181
  require 'repull/models/map_connect_booking_rooms_request'
124
182
  require 'repull/models/map_connect_booking_rooms_response'
125
183
  require 'repull/models/market_browse_category'
@@ -145,12 +203,34 @@ require 'repull/models/markets_overview_response_totals'
145
203
  require 'repull/models/message'
146
204
  require 'repull/models/message_list_response'
147
205
  require 'repull/models/pagination'
206
+ require 'repull/models/payment_completed_event'
207
+ require 'repull/models/payment_completed_payload'
208
+ require 'repull/models/payment_refunded_event'
209
+ require 'repull/models/payment_refunded_payload'
148
210
  require 'repull/models/plumguide_listing'
149
211
  require 'repull/models/plumguide_listing_list_response'
150
212
  require 'repull/models/property'
151
213
  require 'repull/models/property_list_response'
214
+ require 'repull/models/reply_booking_review200_response'
215
+ require 'repull/models/reply_booking_review_request'
216
+ require 'repull/models/repull_ping_event'
217
+ require 'repull/models/repull_ping_payload'
152
218
  require 'repull/models/reservation'
219
+ require 'repull/models/reservation_cancelled_event'
220
+ require 'repull/models/reservation_cancelled_payload'
221
+ require 'repull/models/reservation_created_event'
222
+ require 'repull/models/reservation_created_payload'
223
+ require 'repull/models/reservation_financials'
153
224
  require 'repull/models/reservation_list_response'
225
+ require 'repull/models/reservation_message_received_event'
226
+ require 'repull/models/reservation_message_received_payload'
227
+ require 'repull/models/reservation_message_received_payload_from'
228
+ require 'repull/models/reservation_occupancy'
229
+ require 'repull/models/reservation_primary_guest'
230
+ require 'repull/models/reservation_updated_event'
231
+ require 'repull/models/reservation_updated_payload'
232
+ require 'repull/models/reservation_webhook_object'
233
+ require 'repull/models/respond_airbnb_review_request'
154
234
  require 'repull/models/review'
155
235
  require 'repull/models/review_category'
156
236
  require 'repull/models/review_list_response'
@@ -158,11 +238,22 @@ require 'repull/models/review_response'
158
238
  require 'repull/models/rotate_webhook_secret200_response'
159
239
  require 'repull/models/select_connect_provider_request'
160
240
  require 'repull/models/select_provider_response'
241
+ require 'repull/models/set_kv_request'
242
+ require 'repull/models/studio_deployment'
243
+ require 'repull/models/studio_error'
244
+ require 'repull/models/studio_error_error'
245
+ require 'repull/models/studio_file'
246
+ require 'repull/models/studio_generation'
247
+ require 'repull/models/studio_project'
161
248
  require 'repull/models/test_webhook_request'
162
249
  require 'repull/models/update_availability_request'
163
250
  require 'repull/models/update_listing_pricing_strategy200_response'
164
251
  require 'repull/models/update_reservation_request'
252
+ require 'repull/models/update_studio_project_request'
165
253
  require 'repull/models/update_webhook_request'
254
+ require 'repull/models/upsert_studio_project_file200_response'
255
+ require 'repull/models/upsert_studio_project_file200_response_data'
256
+ require 'repull/models/upsert_studio_project_file_request'
166
257
  require 'repull/models/vrbo_listing'
167
258
  require 'repull/models/vrbo_listing_list_response'
168
259
  require 'repull/models/vrbo_reservation'
@@ -170,9 +261,11 @@ require 'repull/models/vrbo_reservation_list_response'
170
261
  require 'repull/models/webhook_delivery'
171
262
  require 'repull/models/webhook_delivery_detail'
172
263
  require 'repull/models/webhook_delivery_list_response'
264
+ require 'repull/models/webhook_event'
173
265
  require 'repull/models/webhook_event_catalog'
174
266
  require 'repull/models/webhook_event_catalog_domains_inner'
175
- require 'repull/models/webhook_event_catalog_domains_inner_events_inner'
267
+ require 'repull/models/webhook_event_catalog_entry'
268
+ require 'repull/models/webhook_event_type'
176
269
  require 'repull/models/webhook_list_response'
177
270
  require 'repull/models/webhook_subscription'
178
271
 
@@ -186,6 +279,7 @@ require 'repull/api/booking_com_api'
186
279
  require 'repull/api/connect_api'
187
280
  require 'repull/api/conversations_api'
188
281
  require 'repull/api/guests_api'
282
+ require 'repull/api/kv_api'
189
283
  require 'repull/api/listings_api'
190
284
  require 'repull/api/markets_api'
191
285
  require 'repull/api/plumguide_api'
@@ -194,6 +288,7 @@ require 'repull/api/properties_api'
194
288
  require 'repull/api/reservations_api'
195
289
  require 'repull/api/reviews_api'
196
290
  require 'repull/api/schema_api'
291
+ require 'repull/api/studio_api'
197
292
  require 'repull/api/system_api'
198
293
  require 'repull/api/vrbo_api'
199
294
  require 'repull/api/webhooks_api'