Skip to main content

Endpoint

GET https://api.voyantcloud.com/v1/products
Retrieve a list of all travel products in your workspace. Products include tours, experiences, hotels, packages, transfers, and more.

Authentication

Authorization
string
required
Bearer token (e.g. Authorization: Bearer YOUR_API_KEY)

Query parameters

source
string
Filter by product source. Options: owned, marketplace. If omitted, returns both owned and marketplace products.
status
string
Filter by product status. Options: draft, active, archived
type
string
Filter by product type. Options: tour, experience, hotel, package, transfer, car_rental, flight
Search products by title
categoryIds
string
Comma-separated list of category IDs to filter by
tags
string
Comma-separated list of tags to filter by
locale
string
default:"en"
Locale for translated content (e.g., en, fr, de)
limit
integer
default:"50"
Maximum number of products to return (max 100)
offset
integer
default:"0"
Number of products to skip for pagination
sortBy
string
default:"updatedAt"
Sort field. Options: title, createdAt, updatedAt
sortOrder
string
default:"desc"
Sort order. Options: asc, desc

Request example

curl https://api.voyantcloud.com/v1/products \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

id
string
required
Unique product identifier (UUID)
title
string
required
Product name/title
slug
string
URL-friendly product identifier
status
string
required
Product status: draft, active, archived
type
string
Product type: tour, experience, hotel, package, transfer, etc.
duration_days
integer
Duration in days for multi-day products
currency
string
3-letter ISO currency code (e.g., EUR, USD)
location
object
Product location information
created_at
timestamp
ISO 8601 timestamp when product was created
updated_at
timestamp
ISO 8601 timestamp when product was last updated
source
string
required
Product source: owned (your workspace’s products) or marketplace (enabled provider products)
providerId
string
Provider ID (only for marketplace products)
externalProductId
string
External product ID from the provider (only for marketplace products)
{
  "data": [
    {
      "id": "prod_123abc",
      "title": "Paris City Tour",
      "status": "active",
      "type": "tour",
      "location": {
        "city": "Paris",
        "country": "FR"
      },
      "tags": ["adventure", "walking"],
      "updated_at": "2024-01-15T10:00:00Z",
      "primaryCategoryId": "cat_tours",
      "categoryIds": ["cat_tours"],
      "source": "owned"
    },
    {
      "id": "pprd_789xyz",
      "title": "Barcelona Tapas Tour",
      "status": "active",
      "type": "experience",
      "location": {
        "city": "Barcelona",
        "country": "ES"
      },
      "tags": ["food", "culture"],
      "updated_at": "2024-01-20T14:30:00Z",
      "primaryCategoryId": null,
      "categoryIds": [],
      "source": "marketplace",
      "providerId": "prvd_partner123",
      "externalProductId": "ext-tapas-001"
    }
  ],
  "meta": {
    "total": 25,
    "limit": 50,
    "offset": 0,
    "hasMore": false
  }
}

Filtering examples

Filter by source

Retrieve only your owned products:
curl "https://api.voyantcloud.com/v1/products?source=owned" \
  -H "Authorization: Bearer YOUR_API_KEY"
Retrieve only marketplace products:
curl "https://api.voyantcloud.com/v1/products?source=marketplace" \
  -H "Authorization: Bearer YOUR_API_KEY"

Filter by status

Retrieve only active products:
curl "https://api.voyantcloud.com/v1/products?status=active" \
  -H "Authorization: Bearer YOUR_API_KEY"

Filter by type

Get all tours:
curl "https://api.voyantcloud.com/v1/products?type=tour" \
  -H "Authorization: Bearer YOUR_API_KEY"

Pagination

Retrieve the next 20 products after skipping the first 20:
curl "https://api.voyantcloud.com/v1/products?limit=20&offset=20" \
  -H "Authorization: Bearer YOUR_API_KEY"

Multiple filters

Active tours only:
curl "https://api.voyantcloud.com/v1/products?status=active&type=tour" \
  -H "Authorization: Bearer YOUR_API_KEY"

Rate limits

This endpoint is rate-limited to:
  • 3,000 requests per minute
  • 30 requests per second (burst)
Cache product lists when possible to reduce API calls. Products don’t change frequently.

Use cases

Display product catalog

Fetch and display all products in your booking interface:
async function loadProductCatalog() {
  const response = await fetch("https://api.voyantcloud.com/v1/products?status=active", {
    headers: { Authorization: `Bearer ${process.env.VOYANT_API_KEY}` },
  })

  const products = await response.json()

  return products.map((product) => ({
    id: product.id,
    name: product.title,
    location: `${product.location?.city}, ${product.location?.country}`,
    duration: `${product.duration_days} day${product.duration_days > 1 ? "s" : ""}`,
  }))
}

Search products

Use the search parameter to filter products by title:
curl "https://api.voyantcloud.com/v1/products?search=paris&status=active" \
  -H "Authorization: Bearer YOUR_API_KEY"

Filter by category and tags

curl "https://api.voyantcloud.com/v1/products?categoryIds=cat_tours,cat_experiences&tags=adventure,walking" \
  -H "Authorization: Bearer YOUR_API_KEY"

Next steps