Skip to main content

Base URL

All API requests should be made to:
https://api.voyantcloud.com
The API is delivered via a global edge network for low-latency access worldwide.

API version

The current API version is v1. All endpoints are prefixed with /v1:
https://api.voyantcloud.com/v1/products

Request format

Headers

Include these headers in every request:
HeaderRequiredDescription
AuthorizationYesBearer YOUR_API_KEY
Content-TypeFor POST/PATCHapplication/json
AcceptOptionalapplication/json (default)
Workspace context is automatically determined from your API key. You don’t need to pass a workspace ID.
curl https://api.voyantcloud.com/v1/products \
  -H "Authorization: Bearer YOUR_API_KEY"

Request body

For POST and PATCH requests, send data as JSON:
{
  "productId": "prod_01h8z3y4x2w1v0u9t8s7r6q5p4",
  "departureId": "dept_01h9xm2n3p4q5r6s7t8v9w0x1y",
  "pax": {
    "adults": 2,
    "children": 1
  }
}

Resource identifiers

All resources use prefixed IDs that indicate the entity type:
prod_01h8z3y4x2w1v0u9t8s7r6q5p4
└──┘
prefix (prod = product)
Common prefixes: prod (product), dept (departure), book (booking), ppl (person), inv (invoice). The API validates that IDs have the correct prefix for each field. See Identifiers for the full list.

Response format

Success responses

Successful requests return JSON with appropriate HTTP status codes:
  • 200 OK - Request succeeded
  • 201 Created - Resource created successfully
  • 204 No Content - Request succeeded with no response body
{
  "id": "prod_01h8z3y4x2w1v0u9t8s7r6q5p4",
  "title": "Paris City Tour",
  "status": "active"
}

Response headers

Every response includes helpful headers:
HeaderDescription
X-Request-IDUnique request identifier for debugging
X-RateLimit-LimitMaximum requests per minute
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when limit resets
Content-TypeAlways application/json
Example response headers:
X-Request-ID: req_abc123def456
X-RateLimit-Limit: 3000
X-RateLimit-Remaining: 2988
X-RateLimit-Reset: 1704067200
Content-Type: application/json

Error responses

Errors return standard HTTP status codes with JSON error objects:
{
  "error": "Error message description"
}
See Error handling for complete error reference.

Pagination

List endpoints support pagination using query parameters:
ParameterTypeDefaultDescription
limitinteger50Items per page (max 100)
offsetinteger0Number of items to skip
curl "https://api.voyantcloud.com/v1/products?limit=20&offset=40" \
  -H "Authorization: Bearer $VOYANT_API_KEY"
{
  "data": [...],
  "pagination": {
    "total": 150,
    "limit": 20,
    "offset": 40,
    "has_more": true
  }
}
Use has_more to determine if more pages are available without calculating page numbers.

Filtering

Many list endpoints support filtering via query parameters:
# Filter products by status
/v1/products?status=active

# Filter by type
/v1/products?type=tour

# Multiple filters
/v1/products?status=active&type=tour
Available filters vary by endpoint. Check individual endpoint documentation for supported filters.

Sorting

List endpoints support sorting with the sort parameter:
# Sort by creation date (descending)
/v1/products?sort=-created_at

# Sort by title (ascending)
/v1/products?sort=title
Prefix with - for descending order, omit for ascending.

Idempotency

POST requests support idempotency using the Idempotency-Key header:
curl -X POST https://api.voyantcloud.com/v1/bookings \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: unique-key-123" \
  -H "Content-Type: application/json" \
  -d '{"productId": "prod_123"}'
Use UUIDs or unique request identifiers as idempotency keys to safely retry requests without duplicates.

Rate limiting

API requests are rate-limited per workspace: Live workspaces:
  • 3,000 requests per minute
  • 30 requests per second burst
Sandbox workspaces:
  • 100 requests per minute
  • 5 requests per second burst
Pricing is usage-based—no plan tiers or upgrades required. Rate limit information is included in response headers:
X-RateLimit-Limit: 3000
X-RateLimit-Remaining: 2988
X-RateLimit-Reset: 1704067200
When you exceed rate limits, you’ll receive a 429 Too Many Requests response:
{
  "error": "Rate limit exceeded",
  "retry_after": 30
}
Implement exponential backoff when receiving 429 responses. Excessive rate limit violations may result in temporary API access suspension.

API endpoints

Products

Manage your travel product catalog:

Bookings

Create and manage travel bookings:

Departures

Manage departure dates and pricing:

Webhooks

Receive real-time notifications for events in your workspace:
  • Booking created, updated, cancelled
  • Payment succeeded, failed, refunded
  • Product created, updated, published
  • Customer created, updated
See the Webhooks guide for event types, signature verification, and setup instructions.

Support

Need help with the API?

Documentation

You’re reading it!

Next steps

1

Authentication

Learn how to authenticate your requests with API keys
2

Quickstart

Follow the quickstart guide to make your first request
3

Explore endpoints

Browse endpoint documentation starting with Products