Skip to main content

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:

  • getBoards
  • getCategories
  • getHotels
  • getRooms
  • getDestinations
  • getMetadata
  • searchDestinations

Refer to the REST API reference for schema details.