Property & Catalog
The catalog endpoints are read-only and describe what you can sell: the property itself, its room types, real-time availability, and the rate plans a guest is eligible to book.
GET /propertyReturns metadata for the property the key is bound to. Any authenticated key may call it.
curl "$VRDN_BASE/property" -H "Authorization: Bearer $VRDN_KEY"{
"id": "p_8f2a1c",
"slug": "sunrise-bay",
"name": "Sunrise Bay Resort",
"currency": "USD",
"timezone": "Pacific/Fiji",
"child_max_age": 12,
"infant_max_age": 2
}| Field | Type | Notes |
|---|---|---|
id | string | Property identifier. |
slug | string | URL slug. |
name | string | Display name. |
currency | string | The property's base currency (ISO 4217). |
timezone | string | IANA time zone, used for "today" in rate windows. |
child_max_age | integer | Guests at or under this age price as children. |
infant_max_age | integer | Guests at or under this age price as infants. |
GET /room-typesScope: availability:read
Every room type with its merchandising data: description, occupancy, amenities, bed configurations, and photos (primary photo first).
curl "$VRDN_BASE/room-types" -H "Authorization: Bearer $VRDN_KEY"{
"data": [
{
"id": "9b2f6c3e-8d1a-4f5b-a7c9-4e0d2b8f1a63",
"name": "Deluxe Ocean Villa",
"description": "A private villa over the lagoon.",
"max_occupancy": 3,
"currency": "USD",
"amenities": ["Ocean view", "Private deck"],
"bed_configs": [{ "id": "bc_king", "label": "1 King" }],
"photos": ["https://cdn.veridien.app/p_8f2a1c/deluxe-1.jpg"]
}
]
}GET /availabilityScope: availability:read
The minimum number of rooms available across every night of the range, per room type. Only room types whose max_occupancy fits the party are returned.
| Query parameter | Required | Notes |
|---|---|---|
check_in | yes | YYYY-MM-DD. |
check_out | yes | YYYY-MM-DD, after check_in. Stays are capped at 30 nights. |
adults | yes | Integer ≥ 1. |
children | no | Integer ≥ 0, default 0. |
child_ages | no | Comma-separated child ages (e.g. 5,7). |
curl "$VRDN_BASE/availability?check_in=2026-08-01&check_out=2026-08-04&adults=2" \
-H "Authorization: Bearer $VRDN_KEY"{
"check_in": "2026-08-01",
"check_out": "2026-08-04",
"data": [
{
"room_type_id": "9b2f6c3e-8d1a-4f5b-a7c9-4e0d2b8f1a63",
"name": "Deluxe Ocean Villa",
"description": "A private villa over the lagoon.",
"max_occupancy": 3,
"available": 4,
"currency": "USD",
"amenities": ["Ocean view", "Private deck"],
"bed_configs": [{ "id": "bc_king", "label": "1 King" }],
"photos": ["https://cdn.veridien.app/p_8f2a1c/deluxe-1.jpg"]
}
]
}available is the number you can still book. 0 means sold out for at least one night in the range.
GET /ratesScope: availability:read
Each room type with its visible rate plans and a per-night price breakdown for the range. This is the endpoint a booking engine renders.
| Query parameter | Required | Notes |
|---|---|---|
check_in | yes | YYYY-MM-DD. |
check_out | yes | YYYY-MM-DD, after check_in. |
adults | yes | Integer ≥ 1. |
children | no | Integer ≥ 0, default 0. |
child_ages | no | Comma-separated child ages (e.g. 5,7). When present it is the authoritative child count and drives age-bracket pricing. |
guest_id | no | Unlocks guest-specific rates (local-verified, loyalty-tier). |
promo_code | no | Unlocks promo-gated rates. |
Visibility is enforced server-side
Rate plans can carry rules: local-residents-only, requires a promo code, minimum stay, advance-purchase window, or a loyalty tier. The API evaluates these against the request context and returns only the plans the guest is eligible for. The same rules are re-checked when you create a hold, so a plan that was never shown cannot be booked by id.
curl "$VRDN_BASE/rates?check_in=2026-08-01&check_out=2026-08-04&adults=2&promo_code=SUMMER" \
-H "Authorization: Bearer $VRDN_KEY"{
"check_in": "2026-08-01",
"check_out": "2026-08-04",
"data": [
{
"room_type_id": "9b2f6c3e-8d1a-4f5b-a7c9-4e0d2b8f1a63",
"name": "Deluxe Ocean Villa",
"description": "A private villa over the lagoon.",
"max_occupancy": 3,
"base_occupancy": 2,
"amenities": ["Ocean view", "Private deck"],
"bed_configs": [{ "id": "bc_king", "label": "1 King" }],
"photos": ["https://cdn.veridien.app/p_8f2a1c/deluxe-1.jpg"],
"rate_plans": [
{
"rate_plan_id": "5c1e8f4a-2b7d-4a9c-8e6f-1d3b9a5c7e02",
"name": "Flexible",
"currency": "USD",
"total": "1260.00",
"room_subtotal": "1260.00",
"base_occupancy": 2,
"extra_guest_charge": "0.00",
"single_occupancy_discount": "0.00",
"extra_guest_total": "0.00",
"taxes_total": "0.00",
"tax_breakdown": [
{ "title": "GST", "amount": "135.00", "is_inclusive": true, "rate": "12", "kind": "percent" }
],
"nightly_rates": [
{ "date": "2026-08-01", "day_of_week": 6, "rate": "420.00", "source": "base_price" },
{ "date": "2026-08-02", "day_of_week": 0, "rate": "420.00", "source": "base_price" },
{ "date": "2026-08-03", "day_of_week": 1, "rate": "420.00", "source": "base_price" }
]
}
]
}
]
}Each nightly rate reports its source: interval when a seasonal interval set the price for that day, or base_price when it fell back to the plan's base price.
The room type carries base_occupancy (the number of guests included before extra-guest pricing applies) and its bed_configs. Each rate plan reports a full price breakdown:
| Field | Type | Notes |
|---|---|---|
total | string | The fully-priced stay total, including any non-inclusive taxes. This equals the hold total. |
room_subtotal | string | Sum of the nightly rates before occupancy adjustments and taxes. |
base_occupancy | integer | Guests included in the base rate; extra-guest pricing applies above this. |
extra_guest_charge | string | The plan's per-night charge for each guest beyond base_occupancy. |
single_occupancy_discount | string | Total discount applied when the party is a single occupant. |
extra_guest_total | string | Total extra-guest supplement across the stay. |
taxes_total | string | Total of non-inclusive taxes added to total. Inclusive taxes are not counted here. |
tax_breakdown | array | Per-charge lines: title, amount, is_inclusive, rate, kind. Inclusive lines are shown for transparency and do not add to total. |
Because the same charge engine prices the hold, this total always equals the total you receive from POST /holds.
GET /servicesScope: availability:read
Guest-bookable add-ons (for example, an airport transfer) for a booking engine's "Add to Your Room" step. Returns only active, guest-bookable services with their modifiers (the options and data-capture fields a guest fills in). Pass ?category= to filter by category.
| Query parameter | Required | Notes |
|---|---|---|
category | no | Return only services in this category (for example, transport). |
curl "$VRDN_BASE/services?category=transport" -H "Authorization: Bearer $VRDN_KEY"{
"data": [
{
"id": "f1c8e5a3-6b2d-4c9f-8a7e-3d0b5c2f6e94",
"name": "Airport transfer",
"category": "transport",
"provider_name": "Harbour Transfers",
"image_url": "https://cdn.veridien.app/p_8f2a1c/transfer.jpg",
"short_description": "Private speedboat from the international airport.",
"currency": "USD",
"is_taxable": true,
"modifiers": []
}
]
}| Field | Type | Notes |
|---|---|---|
id | string | Service identifier, referenced as service_id in a hold's add_ons. |
name | string | Display name. |
category | string | null | Category label used by the ?category= filter. |
provider_name | string | null | The provider fulfilling the service. |
image_url | string | null | Merchandising image. |
short_description | string | null | One-line description. |
currency | string | Pricing currency; defaults to the property's base currency. |
is_taxable | boolean | Whether taxes apply to the add-on. |
modifiers | array | The options and data-capture fields (priced selects, datetime/text inputs) the guest supplies when adding it to a hold. |
Attach a chosen service to a booking through the add_ons field on POST /holds.
- Reservations: turn a rate into a hold and a confirmed reservation.
- Rate Plans: how rate plans and seasonal intervals are configured.