Quickstart
Bundleport is a unified travel API platform that connects you to multiple hotel providers through a single integration. Get started in minutes with our REST API or SDKs.
Prerequisites
- API Endpoint:
https://test-api.bundleport.com(sandbox) orhttps://api.bundleport.com(production) - API Key: Get your sandbox API key (
sk_test_*) from app.bundleport.com (or contact support) - cURL or your preferred HTTP client
Sandbox vs Production endpoints
Sandbox API keys (sk_test_*) only work against test-api.bundleport.com. Production keys (sk_prod_*) only work against api.bundleport.com. The examples below use the sandbox endpoint.
Step 1: Get Your API Key
- Sign up for a Bundleport account at app.bundleport.com
- Navigate to API Keys in your dashboard
- Create a new API key with Sandbox access
- Copy your API key (you'll need it for all requests)
tip
Start with sandbox keys (sk_test_*) to test without affecting real bookings. Production keys require additional verification.
Step 2: Authenticate Your Request
All Bundleport API requests require authentication via an API key in the Authorization header:
Authorization: ApiKey YOUR_API_KEY_HERE
Step 3: Make Your First API Call
- cURL
- JavaScript/TypeScript
- Python
- Java
- C#
curl -X POST https://test-api.bundleport.com/connect/hotels/v1/availability \
-H "Authorization: ApiKey YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"criteria": {
"checkIn": "2025-12-15T00:00:00Z",
"checkOut": "2025-12-17T00:00:00Z",
"occupancies": [
{
"paxes": [
{"name": "John", "surname": "Doe", "age": 35},
{"name": "Jane", "surname": "Doe", "age": 33}
]
}
],
"currency": "EUR",
"language": "en",
"nationality": "US"
},
"settings": {
"connectionCodes": ["testb-hbds-1876"]
}
}'
const response = await fetch('https://test-api.bundleport.com/connect/hotels/v1/availability', {
method: 'POST',
headers: {
'Authorization': 'ApiKey YOUR_API_KEY_HERE',
'Content-Type': 'application/json',
},
body: JSON.stringify({
criteria: {
checkIn: '2025-12-15T00:00:00Z',
checkOut: '2025-12-17T00:00:00Z',
occupancies: [
{
paxes: [
{ name: 'John', surname: 'Doe', age: 35 },
{ name: 'Jane', surname: 'Doe', age: 33 },
],
},
],
currency: 'EUR',
language: 'en',
nationality: 'US',
},
settings: {
connectionCodes: ['testb-hbds-1876'],
},
}),
});
const data = await response.json();
console.log(data);
import requests
url = "https://test-api.bundleport.com/connect/hotels/v1/availability"
headers = {
"Authorization": "ApiKey YOUR_API_KEY_HERE",
"Content-Type": "application/json"
}
payload = {
"criteria": {
"checkIn": "2025-12-15T00:00:00Z",
"checkOut": "2025-12-17T00:00:00Z",
"occupancies": [
{
"paxes": [
{"name": "John", "surname": "Doe", "age": 35},
{"name": "Jane", "surname": "Doe", "age": 33}
]
}
],
"currency": "EUR",
"language": "en",
"nationality": "US"
},
"settings": {
"connectionCodes": ["testb-hbds-1876"]
}
}
response = requests.post(url, json=payload, headers=headers)
data = response.json()
print(data)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var body = """
{
"criteria": {
"checkIn": "2025-12-15T00:00:00Z",
"checkOut": "2025-12-17T00:00:00Z",
"occupancies": [
{ "paxes": [
{"name": "John", "surname": "Doe", "age": 35},
{"name": "Jane", "surname": "Doe", "age": 33}
]}
],
"currency": "EUR",
"language": "en",
"nationality": "US"
},
"settings": { "connectionCodes": ["testb-hbds-1876"] }
}
""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://test-api.bundleport.com/connect/hotels/v1/availability"))
.header("Authorization", "ApiKey YOUR_API_KEY_HERE")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
var client = HttpClient.newHttpClient();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
var payload = new
{
criteria = new
{
checkIn = "2025-12-15T00:00:00Z",
checkOut = "2025-12-17T00:00:00Z",
occupancies = new[] {
new { paxes = new[] {
new { name = "John", surname = "Doe", age = 35 },
new { name = "Jane", surname = "Doe", age = 33 }
}}
},
currency = "EUR",
language = "en",
nationality = "US"
},
settings = new { connectionCodes = new[] { "testb-hbds-1876" } }
};
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("ApiKey", "YOUR_API_KEY_HERE");
var content = new StringContent(
JsonSerializer.Serialize(payload),
Encoding.UTF8,
"application/json");
var response = await client.PostAsync(
"https://test-api.bundleport.com/connect/hotels/v1/availability",
content);
Console.WriteLine(await response.Content.ReadAsStringAsync());
Step 4: Understand the Response
At a glance, a successful availability response tells you three things:
options— Bookable combinations of hotel, room, board, and price; each has anoptionRefIdyou pass to quote and then book.tracing— How the request behaved per configured connection (e.g. hotels returned, errors), so you can spot partial supplier failures.warnings/errors(when present) — Non-fatal issues or blocking problems; even with200 OK, always inspect these fields before showing results to customers.
Example shape:
{
"options": [
{
"optionRefId": "OPT-123456789",
"hotel": {
"code": "12345",
"name": "Example Hotel Barcelona",
"location": {
"city": "Barcelona",
"country": "ES"
}
},
"rooms": [
{
"description": "Standard Double Room",
"boardCode": "RO",
"price": {
"currency": "EUR",
"net": 150.00,
"suggested": 180.00
}
}
]
}
],
"tracing": {
"status": "OK",
"accessSpans": [
{
"access": "testb-hbds-1876",
"status": "OK",
"hotelsRequested": 10,
"hotelsReturned": 8
}
]
}
}
Next Steps
Now that you've made your first API call, explore:
- Connect Hotels Overview - Understand the complete search → quote → book journey
- Authentication Guide - Learn about API keys, scopes, and security
- REST API Reference - Browse all available endpoints
- SDKs - Use our official SDKs for faster integration
Common Issues
401 Unauthorized
- Verify your API key is correct
- Ensure the
Authorizationheader format is:ApiKey YOUR_KEY - Check that your API key has the required permissions
400 Bad Request
- Validate your request payload matches the API schema
- Check date formats (use ISO 8601:
YYYY-MM-DDTHH:MM:SSZ) - Ensure destination codes are valid (e.g., IATA codes for airports)
Rate Limits
- Default: 600 requests/minute, 15,000/hour, 250,000/day
- Limits are configurable per account; see Rate limits and your dashboard at app.bundleport.com
Need Help?
- 📚 Full API Documentation
- 💬 Contact Support
- 🐛 Report an Issue or contact support@bundleport.com