We use cookies for analytics and to measure our ads. Decline anytime. Terms
WHOLESALE INVENTORY API
Live wholesale pricing, real-time availability, and complete fleet specs — delivered through a single API. Build your own booking experience. Set your own margins. Own your client relationships. We handle the boats, the crews, the operations. You handle the clients.
This isn't a listing feed. This is wholesale infrastructure that turns your website into a booking engine — without owning a single vessel or managing a single crew.
See what you pay vs. what your client pays. Every yacht shows wholesale cost AND retail price — your margin is visible and yours to control.
Real-time calendar for every vessel. Single-date checks or full monthly grids — know exactly what's bookable before your client even asks.
Full specs, multiple photos, video, descriptions, capacity, location, inclusions/exclusions — everything you need to sell, in one payload.
Every booking through your API key is automatically attributed to you. Commissions tracked, performance measured, fee waivers calculated.
Jet skis, catering, photographers, DJs — upsell add-ons with wholesale pricing. Size-filtered per vessel so you only show what fits.
Every duration shows retailPricing, wholesalePricing, AND the margin object — the exact dollar spread you earn per booking.
The real superpower: You can build a completely white-label booking site. Your client never sees VCYC. They see your brand, your prices, your experience. Behind the scenes, we handle the fleet, the captains, the insurance, the fuel, the docking — everything that makes yacht charters operationally complex. You just sell.
From zero to a working fleet integration in three steps.
Subscribe at /broker/api — your key is generated automatically after checkout. It starts with vcyc_wh_.
curl https://your-domain.com/api/v1/inventory \
-H "Authorization: Bearer vcyc_wh_your_key_here"Parse the response, display yachts with your branding, show your markup as the client price. When they're ready to book, send them to the booking flow or handle it via WhatsApp/phone.
const res = await fetch("/api/v1/inventory", {
headers: { "Authorization": "Bearer vcyc_wh_your_key" }
});
const { data: yachts, addOns } = await res.json();
yachts.forEach(yacht => {
// YOUR wholesale cost (what you pay)
const cost4h = yacht.wholesalePricing.fourHour / 100;
// Retail price (what the client pays)
const retail4h = yacht.retailPricing.fourHour / 100;
// Your margin — already calculated for you
const margin4h = yacht.margin.fourHour / 100;
console.log(`${yacht.specs.length}' ${yacht.specs.builder} ${yacht.specs.model}`);
console.log(` Wholesale: ${cost4h} → Retail: ${retail4h} → You earn: ${margin4h}`);
});Every request requires a Bearer token. Your key is tied to your broker account, commission tracking, and performance metrics.
Authorization: Bearer vcyc_wh_your_api_key_herePrefix
vcyc_wh_Length
40 characters totalScope
Read-onlyServer-side only
Never expose your API key in client-side JavaScript, mobile apps, or public repos. All API calls should originate from your backend server.
One call to get the entire active fleet — wholesale pricing, retail pricing, margins, specs, images, and availability status.
/api/v1/inventorypagePage number (default: 1)
limitItems per page (default: 50, max: 100)
curl "https://your-domain.com/api/v1/inventory?page=1&limit=10" \
-H "Authorization: Bearer vcyc_wh_your_key_here"{
"data": [
{
"id": "yacht-mia-101",
"name": "Julia Valentine",
"slug": "julia-valentine",
"webId": "MIA52",
"specs": {
"builder": "Azimut",
"model": "Flybridge 52",
"length": 52,
"year": 2020,
"maxGuests": 13,
"cabins": 3,
"bathrooms": 2,
"horsepower": 1400,
"speed": 28
},
"retailPricing": {
"fourHour": 250000,
"sixHour": 320000,
"eightHour": 420000
},
"wholesalePricing": {
"fourHour": 190000,
"sixHour": 250000,
"eightHour": 330000
},
"margin": {
"fourHour": 60000,
"sixHour": 70000,
"eightHour": 90000
},
"wholesaleDepositCents": 100000,
"minGratuityPercent": 20,
"images": [
"https://storage.googleapis.com/...",
"https://storage.googleapis.com/..."
],
"coverImage": "https://storage.googleapis.com/...",
"description": "Luxury motor yacht with flybridge...",
"category": "motor_yacht",
"location": "Miami Beach Marina",
"pickupAddress": "300 Alton Rd, Miami Beach",
"inclusions": "Captain, fuel, ice, water, bluetooth",
"serviceLevel": "Monaco",
"available": true,
"exclusiveFleet": true,
"yachtAddOns": [
{
"id": "addon-1",
"name": "Jet Ski (1hr)",
"pricePerHour": 250,
"available": true
}
]
}
],
"addOns": [
{
"id": "addon-global-1",
"name": "Jet Ski Rental (1hr)",
"category": "water_sports",
"wholesalePriceCents": 35000,
"duration": "1 hour",
"popular": true,
"minYachtLength": 30,
"maxYachtLength": null
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 24,
"totalPages": 3,
"hasMore": true
},
"meta": {
"currency": "USD",
"pricesInCents": true,
"timestamp": "2026-02-25T14:30:00.000Z"
}
}Key insight: The response gives you three pricing tiers —wholesalePricing (your cost),retailPricing (suggested client price), andmargin (your earnings per booking). You can charge whatever you want — the margin field is just the spread between retail and wholesale.
Get everything about a single vessel — full specs, all images, video, add-ons specific to that yacht's size, and complete pricing.
/api/v1/inventory/:ididreqYacht ID or slug (e.g. 'julia-valentine' or 'yacht-mia-101')
curl "https://your-domain.com/api/v1/inventory/julia-valentine" \
-H "Authorization: Bearer vcyc_wh_your_key_here"{
"data": {
"id": "yacht-mia-101",
"name": "Julia Valentine",
"slug": "julia-valentine",
"specs": {
"builder": "Azimut",
"model": "Flybridge 52",
"length": 52,
"year": 2020,
"maxGuests": 13,
"cabins": 3,
"bathrooms": 2,
"horsepower": 1400,
"draft": 4.5,
"beam": 14.8,
"speed": 28
},
"retailPricing": { "fourHour": 250000, "sixHour": 320000, "eightHour": 420000 },
"wholesalePricing": { "fourHour": 190000, "sixHour": 250000, "eightHour": 330000 },
"margin": { "fourHour": 60000, "sixHour": 70000, "eightHour": 90000 },
"images": ["https://...", "https://...", "https://..."],
"coverImage": "https://...",
"videoUrl": "https://...",
"description": "Premium flybridge yacht with spacious entertaining areas...",
"location": "Miami Beach Marina",
"pickupAddress": "300 Alton Rd, Miami Beach, FL 33139",
"inclusions": "Captain, fuel, ice, water, bluetooth speakers",
"exclusions": "Food, alcohol, gratuity",
"serviceLevel": "Monaco",
"available": true,
"exclusiveFleet": true,
"hasCalendar": true,
"yachtAddOns": [
{ "id": "jetski-1", "name": "Jet Ski (1hr)", "pricePerHour": 250, "available": true },
{ "id": "paddleboard", "name": "Paddleboard", "pricePerHour": 50, "available": true }
]
},
"applicableAddOns": [
{
"id": "addon-global-1",
"name": "Jet Ski Rental",
"category": "water_sports",
"wholesalePriceCents": 35000,
"duration": "1 hour",
"popular": true
},
{
"id": "addon-global-2",
"name": "Professional Photographer",
"category": "entertainment",
"wholesalePriceCents": 45000,
"duration": "2 hours",
"popular": false
}
],
"meta": { "currency": "USD", "pricesInCents": true }
}Two add-on sources: yachtAddOns are vessel-specific (built into the yacht listing).applicableAddOns are from the global catalog, filtered by vessel size — so a jet ski won't show up for a yacht that's too small to carry one.
Check if a yacht is bookable on a specific date, or pull a full monthly grid to build an availability calendar in your app. Reflects live bookings and calendar blocks — no caching, no stale data.
/api/v1/inventory/:id/availabilityOption A — Single Date
datereqYYYY-MM-DD format
Option B — Monthly Grid
monthreqYYYY-MM format
Fast boolean check — is this yacht bookable on this date? Use this when a client picks a date.
curl "https://your-domain.com/api/v1/inventory/julia-valentine/availability?date=2026-03-15" \
-H "Authorization: Bearer vcyc_wh_your_key_here"{
"data": {
"yachtId": "yacht-mia-101",
"date": "2026-03-15",
"available": true,
"blockedSlots": 0,
"bookedSlots": 0
},
"meta": { "timestamp": "2026-02-25T14:30:00.000Z" }
}{
"data": {
"yachtId": "yacht-mia-101",
"date": "2026-03-15",
"available": false,
"blockedSlots": 0,
"bookedSlots": 1
}
}Get availability for every day in a month. Use this to build a calendar widget — green/red days, date pickers, availability heatmaps.
curl "https://your-domain.com/api/v1/inventory/julia-valentine/availability?month=2026-03" \
-H "Authorization: Bearer vcyc_wh_your_key_here"{
"data": {
"yachtId": "yacht-mia-101",
"month": "2026-03",
"grid": {
"2026-03-01": { "available": true },
"2026-03-02": { "available": true },
"2026-03-03": { "available": false },
"2026-03-04": { "available": true },
"...": "...",
"2026-03-31": { "available": true }
}
},
"meta": { "timestamp": "2026-02-25T14:30:00.000Z" }
}Pro tip: Cache the monthly grid on your end for 5-10 minutes to reduce API calls. For the final booking confirmation, always do a fresh single-date check to avoid double-booking.
Every field in the yacht object, explained. All monetary values are in US cents (divide by 100 for dollars).
idUnique yacht identifier (stable, never changes)
nameDisplay name (e.g. 'Julia Valentine')
slugURL-safe identifier — use for deep links
webIdShort fleet code (e.g. 'MIA52') — useful for quick reference
specs.builderManufacturer (Azimut, Sunseeker, Sea Ray, etc.)
specs.modelModel name
specs.lengthLength in feet
specs.yearYear built or refitted
specs.maxGuestsMaximum passenger capacity (USCG certified)
specs.cabinsNumber of sleeping cabins
specs.bathroomsNumber of heads/bathrooms
specs.horsepowerTotal engine horsepower
specs.speedCruising speed in knots
specs.draftDraft in feet
specs.beamBeam width in feet
wholesalePricingWhat you pay — keys: threeHour, fourHour, sixHour, eightHour (null if not offered)
retailPricingSuggested client price — same keys as wholesale
marginretailPricing minus wholesalePricing — your earnings per duration
wholesaleDepositCentsRequired deposit amount in cents
minGratuityPercentMinimum crew gratuity percentage (typically 20%)
imagesArray of photo URLs (high-res, CDN-served)
coverImagePrimary hero image URL
videoUrlWalkthrough or promo video URL (nullable)
descriptionMarketing description for listing pages
locationHome marina or dock location
pickupAddressClient pickup/boarding address
inclusionsWhat's included (captain, fuel, ice, etc.)
exclusionsWhat's not included (food, alcohol, gratuity)
serviceLevelService tier: Easy, Monaco, etc.
categoryVessel type: motor_yacht, center_console, catamaran, etc.
availableWhether this yacht is currently active in the fleet
exclusiveFleettrue = managed exclusively by VCYC (more reliable availability)
hasCalendartrue = real-time calendar available via /availability endpoint
Every booking that comes through your integration is automatically attributed to your broker account. No tracking codes, no manual entry, no attribution disputes.
How It Works
Performance Waiver
Shareable links: You can also share direct inventory URLs with your broker token embedded. All bookings originating from those links are automatically attributed to your account, even without API integration.
Upsell premium experiences. The fleet inventory endpoint includes a global add-on catalog with wholesale pricing. The yacht detail endpoint filters add-ons by vessel size so you only show what's applicable.
idUnique add-on identifier
nameDisplay name (e.g. 'Jet Ski Rental')
categoryCategory: water_sports, entertainment, catering, equipment, etc.
wholesalePriceCentsYour wholesale cost in cents
durationDuration description (e.g. '1 hour', '2 hours')
popularFlag for featured/popular add-ons
minYachtLengthMinimum yacht length in feet (null = no minimum)
maxYachtLengthMaximum yacht length in feet (null = no maximum)
// Wholesale add-on cost: $350 (35000 cents)
// You can mark it up however you want
const jetSki = addOns.find(a => a.category === "water_sports");
const yourPrice = jetSki.wholesalePriceCents * 1.3; // 30% markup = $455
const yourMargin = yourPrice - jetSki.wholesalePriceCents; // $105 profit100
req / min
60s
window
429
exceeded
X-RateLimit-LimitMax requests per window (100)
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when the window resets
{
"error": "Rate limit exceeded",
"message": "Maximum 100 requests per minute. Try again later.",
"retryAfter": 42
}100 req/min is generous. Cache the inventory list for 5 minutes and you'll rarely hit 10 requests. Most integrations use fewer than 50 requests per hour.
400Missing or invalid query parameters (e.g. bad date format). Check the message field.
401Missing, malformed, or invalid API key. Verify your Authorization header.
403Broker account not approved. Contact admin to activate your account.
404Yacht ID or slug doesn't match any active vessel.
429Rate limit exceeded. Respect the X-RateLimit headers and implement backoff.
500Something broke on our end. If persistent, contact support.
{
"error": "Short error code",
"message": "Human-readable explanation of what went wrong"
}/api/v1/inventoryBackward Compatible
New fields and endpoints are added without breaking existing integrations. Your code won't break.
Breaking Changes
Released under a new version (e.g., /api/v2). V1 remains active for at least 6 months after v2 launches.
Price Format
All monetary values are in US cents (integer). Divide by 100 for dollars. Currency is always USD.
Null Safety
Optional fields return null, never undefined. Always check for null before using pricing or spec fields.
Get your API key, pull the fleet, and start selling in minutes. We handle the boats — you handle the clients.