Java SDK
Install
Gradle
dependencies {
implementation("com.bundleport.aggregator:integration-client:<version>")
implementation("com.google.protobuf:protobuf-java:3.25.3")
}
Maven
<dependency>
<groupId>com.bundleport.aggregator</groupId>
<artifactId>integration-client</artifactId>
<version>${bundleport.version}</version>
</dependency>
Initialize the client
import com.bundleport.aggregator.clients.IntegrationClientConfig;
import com.bundleport.aggregator.clients.IntegrationWebClient;
import java.time.Duration;
IntegrationClientConfig config = IntegrationClientConfig.builder()
.timeout(Duration.ofSeconds(5))
.debug(false) // Switch to true for JSON payloads
.header("Authorization", "ApiKey <your-bundleport-key>")
.build();
IntegrationWebClient client = new IntegrationWebClient(
"https://api.connect.bundleport.com",
config);
For blocking access, create a blocking client directly:
import com.bundleport.aggregator.clients.IntegrationBlockingClient;
var blockingClient = new IntegrationBlockingClient(
"https://api.connect.bundleport.com",
config);
Service calls
Reactive usage
import com.bundleport.connect.proto.SearchRequest;
import com.bundleport.connect.proto.SearchResponse;
import com.bundleport.connect.proto.QuoteRequest;
import com.bundleport.connect.proto.QuoteResponse;
import com.bundleport.connect.proto.BookRequest;
import com.bundleport.connect.proto.BookResponse;
import com.bundleport.connect.proto.CancelRequest;
import com.bundleport.connect.proto.CancelResponse;
import com.bundleport.connect.proto.BookingDetailRequest;
import com.bundleport.connect.proto.BookingDetailResponse;
import com.bundleport.connect.proto.BookingListRequest;
import com.bundleport.connect.proto.BookingListResponse;
import reactor.core.publisher.Mono;
// Search for hotels
Mono<SearchResponse> search = client.search(
SearchRequest.newBuilder()
.setStay(SearchRequest.Stay.newBuilder()
.setCheckIn("2025-02-10")
.setCheckOut("2025-02-12"))
.setSettings(SearchRequest.SettingsInput.newBuilder()
.addAccessIds("YOUR_ACCESS_ID"))
.build());
// Get a quote
Mono<QuoteResponse> quote = search.flatMap(resp ->
client.quote(
QuoteRequest.newBuilder()
.setOptionRefId(resp.getOptions(0).getOptionRefId())
.setSettings(QuoteRequest.SettingsInput.newBuilder()
.addAccessIds("YOUR_ACCESS_ID"))
.build()));
// Book the hotel
Mono<BookResponse> book = quote.flatMap(q ->
client.book(
BookRequest.newBuilder()
.setOptionRefId(q.getOptionQuote().getOptionRefId())
.setHolder(BookRequest.HolderInput.newBuilder()
.setName("Alice")
.setSurname("Doe"))
.setSettings(BookRequest.SettingsInput.newBuilder()
.addAccessIds("YOUR_ACCESS_ID"))
.build()));
Blocking usage
import com.bundleport.aggregator.clients.IntegrationBlockingClient;
import com.bundleport.aggregator.clients.IntegrationClientConfig;
import java.time.Duration;
IntegrationClientConfig config = IntegrationClientConfig.builder()
.timeout(Duration.ofSeconds(5))
.debug(false)
.header("Authorization", "ApiKey <your-bundleport-key>")
.build();
var blocking = new IntegrationBlockingClient(
"https://api.connect.bundleport.com",
config);
// Cancel a booking
var cancelResponse = blocking.cancel(
CancelRequest.newBuilder()
.setBookingReference("BND-456")
.setSettings(CancelRequest.SettingsInput.newBuilder()
.addAccessIds("YOUR_ACCESS_ID"))
.build());
// Get booking details
var detailResponse = blocking.bookingDetail(
BookingDetailRequest.newBuilder()
.setBookingReference("BND-456")
.setSettings(BookingDetailRequest.SettingsInput.newBuilder()
.addAccessIds("YOUR_ACCESS_ID"))
.build());
// List bookings
var listResponse = blocking.bookingList(
BookingListRequest.newBuilder()
.setFilters(BookingListRequest.BookingListFilters.newBuilder()
.setPageSize(50))
.setSettings(BookingListRequest.SettingsInput.newBuilder()
.addAccessIds("YOUR_ACCESS_ID"))
.build());
Additional helpers
IntegrationWebClient also exposes:
getBoardsgetCategoriesgetHotelsgetRoomsgetDestinationsgetMetadatasearchDestinations
Refer to the REST API reference for schema details.