From 1a873dcf056e8a7fdaad940a1815ecca9369eda7 Mon Sep 17 00:00:00 2001 From: Robert Gradowski Date: Mon, 6 Jul 2026 12:10:22 +0200 Subject: [PATCH] Add support for reservations_requests endpoint --- CHANGELOG.md | 2 + lib/bookingsync/api/client.rb | 2 + .../api/client/reservations_requests.rb | 56 +++++++++++ .../api/client/reservations_requests_spec.rb | 97 +++++++++++++++++++ .../creates_a_new_reservations_request.yml | 38 ++++++++ .../deletes_given_reservations_request.yml | 38 ++++++++ ...dates_given_reservations_request_by_ID.yml | 38 ++++++++ .../returns_a_single_reservations_request.yml | 38 ++++++++ ...ons_requests_joined_from_many_requests.yml | 93 ++++++++++++++++++ .../returns_reservations_requests.yml | 47 +++++++++ 10 files changed, 449 insertions(+) create mode 100644 lib/bookingsync/api/client/reservations_requests.rb create mode 100644 spec/bookingsync/api/client/reservations_requests_spec.rb create mode 100644 spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_create_reservation_request/creates_a_new_reservations_request.yml create mode 100644 spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_delete_reservation_request/deletes_given_reservations_request.yml create mode 100644 spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_patch_reservation_request/updates_given_reservations_request_by_ID.yml create mode 100644 spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_request/returns_a_single_reservations_request.yml create mode 100644 spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_requests/pagination/with_auto_paginate_true/returns_all_reservations_requests_joined_from_many_requests.yml create mode 100644 spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_requests/returns_reservations_requests.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 009560a..11c658c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ # master +- Add support for `reservations_requests` endpoint. + ## 1.2.0 - Add support for `restore` action for `rental_urls`. diff --git a/lib/bookingsync/api/client.rb b/lib/bookingsync/api/client.rb index 04b6d66..1c9f848 100644 --- a/lib/bookingsync/api/client.rb +++ b/lib/bookingsync/api/client.rb @@ -40,6 +40,7 @@ require "bookingsync/api/client/rental_cancelation_policy_items" require "bookingsync/api/client/rentals_contents_overrides" require "bookingsync/api/client/rental_urls" +require "bookingsync/api/client/reservations_requests" require "bookingsync/api/client/review_replies" require "bookingsync/api/client/reviews" require "bookingsync/api/client/seasons" @@ -104,6 +105,7 @@ class Client include BookingSync::API::Client::RentalCancelationPolicyItems include BookingSync::API::Client::RentalsContentsOverrides include BookingSync::API::Client::RentalUrls + include BookingSync::API::Client::ReservationsRequests include BookingSync::API::Client::ReviewReplies include BookingSync::API::Client::Reviews include BookingSync::API::Client::Seasons diff --git a/lib/bookingsync/api/client/reservations_requests.rb b/lib/bookingsync/api/client/reservations_requests.rb new file mode 100644 index 0000000..34f5839 --- /dev/null +++ b/lib/bookingsync/api/client/reservations_requests.rb @@ -0,0 +1,56 @@ +module BookingSync::API + class Client + module ReservationsRequests + # List reservations requests + # + # Returns reservations requests for the current account. + # @param options [Hash] A customizable set of query options. + # @option options [Array] fields: List of fields to be fetched. + # @return [Array] Array of reservations requests. + # @see http://developers.bookingsync.com/reference/endpoints/reservations_requests/#list-reservations-requests + def reservations_requests(options = {}, &block) + paginate "reservations/requests", options, &block + end + + # Get a single reservations request + # + # @param id [BookingSync::API::Resource|Integer] Reservations request or ID + # of the reservations request. + # @param options [Hash] A customizable set of query options. + # @option options [Array] fields: List of fields to be fetched. + # @return [BookingSync::API::Resource] + def reservations_request(id, options = {}) + get("reservations/requests/#{id}", options).pop + end + + # Create a new reservations request + # + # @param options [Hash] Reservations request attributes. + # @return [BookingSync::API::Resource] Newly created reservations request. + def create_reservation_request(options = {}) + post("reservations/requests", requests: [options]).pop + end + + # Edit a reservations request + # + # @param id [BookingSync::API::Resource|Integer] Reservations request or ID of + # the reservations request to be updated. + # @param options [Hash] Reservations request attributes to be updated. + # @return [BookingSync::API::Resource] Updated reservations request on success, + # exception is raised otherwise. + def patch_reservation_request(id, options = {}) + patch("reservations/requests/#{id}", requests: [options]).pop + end + + # Delete a reservations request + # + # Soft-cancels the given reservations request. + # @param id [BookingSync::API::Resource|Integer] Reservations request or ID of + # the reservations request to be deleted. + # @return [NilClass] Returns nil on success. + def delete_reservation_request(id) + delete "reservations/requests/#{id}" + end + end + end +end diff --git a/spec/bookingsync/api/client/reservations_requests_spec.rb b/spec/bookingsync/api/client/reservations_requests_spec.rb new file mode 100644 index 0000000..7fa71ae --- /dev/null +++ b/spec/bookingsync/api/client/reservations_requests_spec.rb @@ -0,0 +1,97 @@ +require "spec_helper" + +describe BookingSync::API::Client::ReservationsRequests do + let(:client) { BookingSync::API::Client.new(test_access_token) } + + before { |ex| @casette_base_path = casette_path(casette_dir, ex.metadata) } + + describe ".reservations_requests", :vcr do + it "returns reservations requests" do + expect(client.reservations_requests).not_to be_empty + assert_requested :get, bs_url("reservations/requests") + end + + describe "pagination" do + context "with auto_paginate: true" do + it "returns all reservations requests joined from many requests" do + requests = client.reservations_requests(per_page: 2, auto_paginate: true) + expect(requests.size).to eq(4) + end + end + end + end + + describe ".reservations_request", :vcr do + let(:prefetched_reservations_request_id) { + find_resource("#{@casette_base_path}_reservations_requests/returns_reservations_requests.yml", "requests")[:id] + } + + it "returns a single reservations request" do + reservations_request = client.reservations_request(prefetched_reservations_request_id) + expect(reservations_request.id).to eq prefetched_reservations_request_id + end + end + + describe ".create_reservation_request", :vcr do + let(:attributes) do + { + conversation_id: 123, + rental_id: 456, + client_id: 789, + booking_id: 101, + expires_at: "2026-06-25T12:00:00Z", + booking_payload: { + start_date: "2026-07-01", + end_date: "2026-07-08", + adults: 2, + children: 0, + final_price: "950.00", + currency: "EUR" + } + } + end + + it "creates a new reservations request" do + client.create_reservation_request(attributes) + assert_requested :post, bs_url("reservations/requests"), + body: { requests: [attributes] }.to_json + end + + it "returns newly created reservations request" do + VCR.use_cassette("BookingSync_API_Client_ReservationsRequests/_create_reservation_request/creates_a_new_reservations_request") do + reservations_request = client.create_reservation_request(attributes) + expect(reservations_request.links.rental).to eq(456) + expect(reservations_request.expires_at).to eq(Time.parse("2026-06-25T12:00:00Z")) + end + end + end + + describe ".patch_reservation_request", :vcr do + let(:created_reservations_request_id) { + find_resource("#{@casette_base_path}_create_reservation_request/creates_a_new_reservations_request.yml", "requests")[:id] + } + + it "updates given reservations request by ID" do + client.patch_reservation_request(created_reservations_request_id, expires_at: "2026-07-01T12:00:00Z") + assert_requested :patch, bs_url("reservations/requests/#{created_reservations_request_id}"), + body: { requests: [{ expires_at: "2026-07-01T12:00:00Z" }] }.to_json + end + + it "returns updated reservations request" do + VCR.use_cassette("BookingSync_API_Client_ReservationsRequests/_patch_reservation_request/updates_given_reservations_request_by_ID") do + reservations_request = client.patch_reservation_request(created_reservations_request_id, expires_at: "2026-07-01T12:00:00Z") + expect(reservations_request).to be_kind_of(BookingSync::API::Resource) + expect(reservations_request.expires_at).to eq(Time.parse("2026-07-01T12:00:00Z")) + end + end + end + + describe ".delete_reservation_request", :vcr do + let(:reservations_request_id_to_be_deleted) { 60 } + + it "deletes given reservations request" do + expect(client.delete_reservation_request(reservations_request_id_to_be_deleted)).to be_nil + assert_requested :delete, bs_url("reservations/requests/#{reservations_request_id_to_be_deleted}") + end + end +end diff --git a/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_create_reservation_request/creates_a_new_reservations_request.yml b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_create_reservation_request/creates_a_new_reservations_request.yml new file mode 100644 index 0000000..365c8d2 --- /dev/null +++ b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_create_reservation_request/creates_a_new_reservations_request.yml @@ -0,0 +1,38 @@ +--- +http_interactions: +- request: + method: post + uri: https://www.bookingsync.com/api/v3/reservations/requests + body: + encoding: UTF-8 + string: '{"requests":[{"conversation_id":123,"rental_id":456,"client_id":789,"booking_id":101,"expires_at":"2026-06-25T12:00:00Z","booking_payload":{"start_date":"2026-07-01","end_date":"2026-07-08","adults":2,"children":0,"final_price":"950.00","currency":"EUR"}}]}' + headers: + User-Agent: + - BookingSync API gem v1.2.0 + Accept: + - application/vnd.api+json + Content-Type: + - application/vnd.api+json + Authorization: + - Bearer <> + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Connection: + - keep-alive + Keep-Alive: + - 30 + response: + status: + code: 201 + message: Created + headers: + Content-Type: + - application/vnd.api+json; charset=utf-8 + Status: + - 201 Created + body: + encoding: UTF-8 + string: '{"links":{"requests.conversation":"https://www.bookingsync.com/api/v3/inbox/conversations/{requests.conversation}","requests.rental":"https://www.bookingsync.com/api/v3/rentals/{requests.rental}","requests.client":"https://www.bookingsync.com/api/v3/clients/{requests.client}","requests.booking":"https://www.bookingsync.com/api/v3/bookings/{requests.booking}"},"requests":[{"links":{"conversation":123,"rental":456,"client":789,"booking":101},"id":60,"expires_at":"2026-06-25T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-07-01","end_date":"2026-07-08","adults":2,"children":0,"final_price":"950.00","currency":"EUR"},"created_at":"2026-07-06T10:00:00Z","updated_at":"2026-07-06T10:00:00Z"}]}' + http_version: + recorded_at: Mon, 06 Jul 2026 10:00:00 GMT +recorded_with: VCR 3.0.3 diff --git a/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_delete_reservation_request/deletes_given_reservations_request.yml b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_delete_reservation_request/deletes_given_reservations_request.yml new file mode 100644 index 0000000..e12be32 --- /dev/null +++ b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_delete_reservation_request/deletes_given_reservations_request.yml @@ -0,0 +1,38 @@ +--- +http_interactions: +- request: + method: delete + uri: https://www.bookingsync.com/api/v3/reservations/requests/60 + body: + encoding: UTF-8 + string: '' + headers: + User-Agent: + - BookingSync API gem v1.2.0 + Accept: + - application/vnd.api+json + Content-Type: + - application/vnd.api+json + Authorization: + - Bearer <> + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Connection: + - keep-alive + Keep-Alive: + - 30 + response: + status: + code: 204 + message: No Content + headers: + Content-Type: + - application/vnd.api+json; charset=utf-8 + Status: + - 204 No Content + body: + encoding: UTF-8 + string: '' + http_version: + recorded_at: Mon, 06 Jul 2026 11:00:00 GMT +recorded_with: VCR 3.0.3 diff --git a/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_patch_reservation_request/updates_given_reservations_request_by_ID.yml b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_patch_reservation_request/updates_given_reservations_request_by_ID.yml new file mode 100644 index 0000000..46dde58 --- /dev/null +++ b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_patch_reservation_request/updates_given_reservations_request_by_ID.yml @@ -0,0 +1,38 @@ +--- +http_interactions: +- request: + method: patch + uri: https://www.bookingsync.com/api/v3/reservations/requests/60 + body: + encoding: UTF-8 + string: '{"requests":[{"expires_at":"2026-07-01T12:00:00Z"}]}' + headers: + User-Agent: + - BookingSync API gem v1.2.0 + Accept: + - application/vnd.api+json + Content-Type: + - application/vnd.api+json + Authorization: + - Bearer <> + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Connection: + - keep-alive + Keep-Alive: + - 30 + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/vnd.api+json; charset=utf-8 + Status: + - 200 OK + body: + encoding: UTF-8 + string: '{"links":{"requests.conversation":"https://www.bookingsync.com/api/v3/inbox/conversations/{requests.conversation}","requests.rental":"https://www.bookingsync.com/api/v3/rentals/{requests.rental}","requests.client":"https://www.bookingsync.com/api/v3/clients/{requests.client}","requests.booking":"https://www.bookingsync.com/api/v3/bookings/{requests.booking}"},"requests":[{"links":{"conversation":123,"rental":456,"client":789,"booking":101},"id":60,"expires_at":"2026-07-01T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-07-01","end_date":"2026-07-08","adults":2,"children":0,"final_price":"950.00","currency":"EUR"},"created_at":"2026-07-06T10:00:00Z","updated_at":"2026-07-06T11:00:00Z"}]}' + http_version: + recorded_at: Mon, 06 Jul 2026 11:00:00 GMT +recorded_with: VCR 3.0.3 diff --git a/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_request/returns_a_single_reservations_request.yml b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_request/returns_a_single_reservations_request.yml new file mode 100644 index 0000000..d051ab0 --- /dev/null +++ b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_request/returns_a_single_reservations_request.yml @@ -0,0 +1,38 @@ +--- +http_interactions: +- request: + method: get + uri: https://www.bookingsync.com/api/v3/reservations/requests/55 + body: + encoding: UTF-8 + string: "{}" + headers: + User-Agent: + - BookingSync API gem v1.2.0 + Accept: + - application/vnd.api+json + Content-Type: + - application/vnd.api+json + Authorization: + - Bearer <> + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Connection: + - keep-alive + Keep-Alive: + - 30 + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/vnd.api+json; charset=utf-8 + Status: + - 200 OK + body: + encoding: UTF-8 + string: '{"links":{"requests.conversation":"https://www.bookingsync.com/api/v3/inbox/conversations/{requests.conversation}","requests.rental":"https://www.bookingsync.com/api/v3/rentals/{requests.rental}","requests.client":"https://www.bookingsync.com/api/v3/clients/{requests.client}","requests.booking":"https://www.bookingsync.com/api/v3/bookings/{requests.booking}"},"requests":[{"links":{"conversation":123,"rental":456,"client":789,"booking":101},"id":55,"expires_at":"2026-06-25T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-07-01","end_date":"2026-07-08","adults":2,"children":0,"final_price":"950.00","currency":"EUR"},"created_at":"2026-06-20T10:00:00Z","updated_at":"2026-06-20T10:00:00Z"}]}' + http_version: + recorded_at: Mon, 06 Jul 2026 10:00:00 GMT +recorded_with: VCR 3.0.3 diff --git a/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_requests/pagination/with_auto_paginate_true/returns_all_reservations_requests_joined_from_many_requests.yml b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_requests/pagination/with_auto_paginate_true/returns_all_reservations_requests_joined_from_many_requests.yml new file mode 100644 index 0000000..a7f25a3 --- /dev/null +++ b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_requests/pagination/with_auto_paginate_true/returns_all_reservations_requests_joined_from_many_requests.yml @@ -0,0 +1,93 @@ +--- +http_interactions: +- request: + method: get + uri: https://www.bookingsync.com/api/v3/reservations/requests?page=1&per_page=2 + body: + encoding: UTF-8 + string: "{}" + headers: + User-Agent: + - BookingSync API gem v1.2.0 + Accept: + - application/vnd.api+json + Content-Type: + - application/vnd.api+json + Authorization: + - Bearer <> + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Connection: + - keep-alive + Keep-Alive: + - 30 + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/vnd.api+json; charset=utf-8 + Status: + - 200 OK + Link: + - ; rel="first", + ; rel="next", + ; rel="last" + X-Total-Pages: + - '2' + X-Total-Count: + - '4' + X-Per-Page: + - '2' + body: + encoding: UTF-8 + string: '{"links":{"requests.conversation":"https://www.bookingsync.com/api/v3/inbox/conversations/{requests.conversation}","requests.rental":"https://www.bookingsync.com/api/v3/rentals/{requests.rental}","requests.client":"https://www.bookingsync.com/api/v3/clients/{requests.client}","requests.booking":"https://www.bookingsync.com/api/v3/bookings/{requests.booking}"},"requests":[{"links":{"conversation":123,"rental":456,"client":789,"booking":101},"id":55,"expires_at":"2026-06-25T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-07-01","end_date":"2026-07-08","adults":2,"children":0,"final_price":"950.00","currency":"EUR"},"created_at":"2026-06-20T10:00:00Z","updated_at":"2026-06-20T10:00:00Z"},{"links":{"conversation":124,"rental":457,"client":790,"booking":null},"id":56,"expires_at":"2026-06-26T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-08-01","end_date":"2026-08-05","adults":1,"children":0,"final_price":"400.00","currency":"EUR"},"created_at":"2026-06-21T10:00:00Z","updated_at":"2026-06-21T10:00:00Z"}]}' + http_version: + recorded_at: Mon, 06 Jul 2026 10:00:00 GMT +- request: + method: get + uri: https://www.bookingsync.com/api/v3/reservations/requests?page=2&per_page=2 + body: + encoding: UTF-8 + string: "{}" + headers: + User-Agent: + - BookingSync API gem v1.2.0 + Accept: + - application/vnd.api+json + Content-Type: + - application/vnd.api+json + Authorization: + - Bearer <> + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Connection: + - keep-alive + Keep-Alive: + - 30 + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/vnd.api+json; charset=utf-8 + Status: + - 200 OK + Link: + - ; rel="first", + ; rel="prev", + ; rel="last" + X-Total-Pages: + - '2' + X-Total-Count: + - '4' + X-Per-Page: + - '2' + body: + encoding: UTF-8 + string: '{"links":{"requests.conversation":"https://www.bookingsync.com/api/v3/inbox/conversations/{requests.conversation}","requests.rental":"https://www.bookingsync.com/api/v3/rentals/{requests.rental}","requests.client":"https://www.bookingsync.com/api/v3/clients/{requests.client}","requests.booking":"https://www.bookingsync.com/api/v3/bookings/{requests.booking}"},"requests":[{"links":{"conversation":125,"rental":458,"client":791,"booking":102},"id":57,"expires_at":"2026-06-27T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-09-01","end_date":"2026-09-04","adults":2,"children":1,"final_price":"600.00","currency":"EUR"},"created_at":"2026-06-22T10:00:00Z","updated_at":"2026-06-22T10:00:00Z"},{"links":{"conversation":126,"rental":459,"client":792,"booking":null},"id":58,"expires_at":"2026-06-28T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-10-01","end_date":"2026-10-03","adults":1,"children":0,"final_price":"300.00","currency":"EUR"},"created_at":"2026-06-23T10:00:00Z","updated_at":"2026-06-23T10:00:00Z"}]}' + http_version: + recorded_at: Mon, 06 Jul 2026 10:00:01 GMT +recorded_with: VCR 3.0.3 diff --git a/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_requests/returns_reservations_requests.yml b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_requests/returns_reservations_requests.yml new file mode 100644 index 0000000..028432c --- /dev/null +++ b/spec/fixtures/cassettes/BookingSync_API_Client_ReservationsRequests/_reservations_requests/returns_reservations_requests.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: get + uri: https://www.bookingsync.com/api/v3/reservations/requests + body: + encoding: UTF-8 + string: "{}" + headers: + User-Agent: + - BookingSync API gem v1.2.0 + Accept: + - application/vnd.api+json + Content-Type: + - application/vnd.api+json + Authorization: + - Bearer <> + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Connection: + - keep-alive + Keep-Alive: + - 30 + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/vnd.api+json; charset=utf-8 + Status: + - 200 OK + Link: + - ; rel="first", + ; rel="last" + X-Total-Pages: + - '1' + X-Total-Count: + - '2' + X-Per-Page: + - '100' + body: + encoding: UTF-8 + string: '{"links":{"requests.conversation":"https://www.bookingsync.com/api/v3/inbox/conversations/{requests.conversation}","requests.rental":"https://www.bookingsync.com/api/v3/rentals/{requests.rental}","requests.client":"https://www.bookingsync.com/api/v3/clients/{requests.client}","requests.booking":"https://www.bookingsync.com/api/v3/bookings/{requests.booking}"},"requests":[{"links":{"conversation":123,"rental":456,"client":789,"booking":101},"id":55,"expires_at":"2026-06-25T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-07-01","end_date":"2026-07-08","adults":2,"children":0,"final_price":"950.00","currency":"EUR"},"created_at":"2026-06-20T10:00:00Z","updated_at":"2026-06-20T10:00:00Z"},{"links":{"conversation":124,"rental":457,"client":790,"booking":null},"id":56,"expires_at":"2026-06-26T12:00:00Z","status":"pending","booking_payload":{"start_date":"2026-08-01","end_date":"2026-08-05","adults":1,"children":0,"final_price":"400.00","currency":"EUR"},"created_at":"2026-06-21T10:00:00Z","updated_at":"2026-06-21T10:00:00Z"}]}' + http_version: + recorded_at: Mon, 06 Jul 2026 10:00:00 GMT +recorded_with: VCR 3.0.3