Property & Catalog
Use the catalog endpoints to read what you can sell: the property itself, its room types, live availability, the rate plans a guest may book, and add-on services. They are all read-only and need the availability:read scope.
Get the property
GET /propertyScope: availability:read
Returns the details of the property the key is bound to.
curl "$VRDN_BASE/property" -H "Authorization: Bearer $VRDN_KEY"{
"id": "4e1b7c2a-9d3f-4a6e-8b5c-0f2d7a9e3c18",
"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 | The property's id (a UUID). |
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 sale and stay 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. |
List room types
GET /room-typesScope: availability:read
Returns every room type with its merchandising data: description, occupancy, amenities, 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"],
"photos": ["https://veridien.app/files/example/deluxe-1.jpg"]
}
]
}Search availability
GET /availabilityScope: availability:read
Returns, per room type, the smallest number of rooms free on any night of the range. 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, at least 1. |
children | no | Integer, at least 0. Default 0. The party size is adults + children. |
child_ages | no | Comma-separated child ages (for example 5,7). Accepted for parity with /rates; it does not change the party size here. |
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"],
"photos": ["https://veridien.app/files/example/deluxe-1.jpg"]
}
]
}available is the number of rooms you can still book. 0 means sold out on at least one night in the range.
Search rates
GET /ratesScope: availability:read
Returns each room type with its visible rate plans and a per-night price breakdown for the range. This is the endpoint a reservation website renders.
| 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, at least 1. |
children | no | Integer, at least 0. Default 0. |
child_ages | no | Comma-separated child ages (for example 5,7). When present it is the child count and drives age-based pricing. |
guest_id | no | Unlocks guest-specific rates (local-verified, nationality, loyalty tier). |
promo_code | no | Checked against plans whose visibility rules ask for a code. Plans that need a promo code to be reserved never appear here; see Offers and promo codes. |
Visibility is enforced on the server
A rate plan can carry rules: local residents only, a nationality, a loyalty tier, a minimum stay, or a promo code. The API checks them against the request and returns only the plans the guest may book. It also leaves out plans outside their sale or stay window, or whose length-of-stay and day-of-week rules the stay does not meet. The same checks run again when you create a hold, so a plan that was never shown cannot be reserved by id.
curl "$VRDN_BASE/rates?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,
"base_occupancy": 2,
"amenities": ["Ocean view", "Private deck"],
"photos": ["https://veridien.app/files/example/deluxe-1.jpg"],
"rate_plans": [
{
"rate_plan_id": "5c1e8f4a-2b7d-4a9c-8e6f-1d3b9a5c7e02",
"name": "BAR-FLEX",
"public_name": "Flexible",
"kind": "standard",
"description": "Free cancellation until 7 days before arrival.",
"image_url": null,
"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" }
],
"inclusions": [],
"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, override when the property's revenue optimization set a daily price, 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. Each rate plan reports a full price breakdown:
| Field | Type | Notes |
|---|---|---|
name | string | The plan's internal name. |
public_name | string | The name to show guests. Falls back to name. |
kind | string | standard or promotion. |
description / image_url | string | null | Guest-facing merchandising. |
total | string | The fully priced stay, 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 one guest. |
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. |
inclusions | array | What the plan bundles: label, allocated_amount, currency, frequency, inclusion_kind (perk or credit), revenue_category, included_quantity. |
The same charge engine prices the hold, so this total always equals the total you get from POST /holds. A plan the engine cannot price is left out rather than shown at a wrong price.
List services
GET /servicesScope: availability:read
Returns the add-ons guests can book themselves (for example, an airport transfer), for a booking flow's add-ons step. Only active, guest-bookable services are returned, with their modifiers (the options and fields a guest fills in).
| Query parameter | Required | Notes |
|---|---|---|
category | no | Return only this category: transport, food_and_beverage, spa_and_wellness, activities, laundry, communication, or other. Any other value returns an empty list. |
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://veridien.app/files/example/transfer.jpg",
"short_description": "Private speedboat from the international airport.",
"currency": "USD",
"is_taxable": true,
"modifiers": []
}
]
}| Field | Type | Notes |
|---|---|---|
id | string | Service id, sent as service_id in a hold's add_ons. |
name | string | Display name. |
category | string | One of the categories above. |
provider_name | string | null | Who provides 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 fields (priced choices, date and text inputs) the guest fills in when adding it to a hold. |
To add a chosen service to a reservation, send it in the add_ons field of POST /holds.
Related pages
- Reservations: turn a rate into a hold and a confirmed reservation.
- Rate plans: how rate plans and seasonal intervals are set up in the dashboard.