Pull live holiday-rental data from Young Estates.
A simple, authenticated REST API for fetching our holiday-rental listings — names, locations, bedrooms, amenities, and imagery — as clean JSON. Send a GET request, get property data back, render it anywhere.
Overview
The Young Estates Holiday Rentals API is read-only. You send an authenticated GET request and we return property data as JSON — there is nothing to write back, so it's safe to call from a build step, a cache warmer, or your server at request time.
This API returns only properties available for holiday rental. Sale listings, hidden listings, and any non-rental property are never returned by either endpoint.
There are three endpoints:
GET /wp-json/ye/v1/properties— a paginated, filterable list of rental properties.GET /wp-json/ye/v1/properties/{id}— the full detail for one property.GET /wp-json/ye/v1/properties/{id}/{field}— just one field of one property.
Owner, housekeeper, and property-manager details, financial fields, internal notes, and all pricing are excluded. The API only ever exposes public holiday-rental listing data.
Listing data changes infrequently. Cache responses on your side (15–60 minutes is plenty) and use the updated_at field to decide when to refresh. Requests are rate-limited to 120 per minute per key.
Authentication
Every request must include your API key in the X-API-Key header. Requests without a valid key receive a 401 Unauthorized.
Your API key is available in your agent dashboard at youngestates.com/agent. Sign in and open the API section to view or copy your key.
| Item | Value |
|---|---|
| Base URL | https://www.youngestates.com/wp-json/ye/v1 |
| Auth header | X-API-Key |
| Format | JSON (Content-Type: application/json) |
| Transport | HTTPS only |
X-API-Key: your-api-key-from-the-agent-dashboard
Treat the API key like a password. Call the API from your server, store the key in an environment variable or server-side config, and never expose it in browser-visible code.
Endpoints
Two routes cover the whole API: list many rentals, or fetch one in full.
List properties
Returns a paginated array of rental-property summaries. Accepts filters and pagination via query parameters.
<?php
$url = 'https://www.youngestates.com/wp-json/ye/v1/properties?city=St.+James&type=Villa&per_page=20';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-API-Key: YOUR_API_KEY'],
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
foreach ($result['data'] as $property) {
echo $property['name'] . ' — ' . $property['bedrooms'] . ' bedrooms\n';
}
Sample response (truncated to one item):
{
"data": [
{
"id": 58517,
"name": "Bluff House",
"slug": "bluff-house-stay",
"url": "https://www.youngestates.com/properties/bluff-house-stay/",
"house_type": "Villa",
"bedrooms": 8,
"bathrooms": 8,
"sleeps": 12,
"pools": 1,
"location": {
"city": "St. James",
"area": "Sandy Lane Estate",
"latitude": 13.175458,
"longitude": -59.636726
},
"categories": ["Beach and Marina", "Sandy Lane Villas"],
"thumbnail": "https://a14b7a9a.delivery.rocketcdn.me/wp-content/uploads/2024/05/DSC02355-768x512.jpg",
"updated_at": "2026-05-27T12:14:18+00:00"
}
],
"meta": {
"total": 91,
"page": 1,
"per_page": 20,
"total_pages": 5
}
}
Get a single property
Returns the full record for one rental — description, all amenities, room-by-room detail, seasonal rates, reviews, staffing, gallery, and more. Replace {id} with the numeric property ID (or its slug).
The ID for each property is listed under the Properties tab of your agent dashboard at youngestates.com/agent. You can also use the property's slug in place of the ID.
<?php
$id = 58517;
$ch = curl_init("https://www.youngestates.com/wp-json/ye/v1/properties/{$id}");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-API-Key: YOUR_API_KEY'],
]);
$property = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $property['name']; // Bluff House
echo $property['bedrooms']; // 8
$rate = $property['pricing']['rates'][0]['periods'][0]['rate_per_night'];
{
"id": 58517,
"name": "Bluff House",
"slug": "bluff-house-stay",
"url": "https://www.youngestates.com/properties/bluff-house-stay/",
"house_type": "Villa",
"bedrooms": 8,
"bathrooms": 8,
"sleeps": 12,
"pools": 1,
"location": {
"city": "St. James",
"area": "Sandy Lane Estate",
"latitude": 13.175458,
"longitude": -59.636726,
"address": "Sandy Lane Estate, St. James, Barbados"
},
"categories": ["Beach and Marina", "Sandy Lane Villas"],
"updated_at": "2026-05-27T12:14:18+00:00",
"square_footage": null,
"description": "<p>Bluff House is an exceptional beachfront villa...</p>",
"amenities": ["Media Room", "Children Welcome", "Air Conditioned Bedrooms"],
"house_rules": ["Children - All Welcome", "No Pets"],
"taxonomies": {
"area": ["Sandy Lane Estate"],
"city": ["St. James"],
"category": ["Beach and Marina", "Sandy Lane Villas"],
"internal_amenities": ["Wi-Fi", "Media Room"],
"external_amenities": ["Private Pool", "Direct Beach Access"],
"bedroom_amenities": [],
"bathroom_amenities": [],
"house_rules": [],
"fire_safety": [],
"staff": ["Chef", "Housekeeper", "Butler"]
},
"rooms": null,
"pool_size": null,
"total_guests": 12,
"security_deposit": 5000,
"bookable": false,
"check_in_out_time": "<p>Check-in 15:00 / Check-out 10:00</p>",
"additional_information": "",
"additional_house_rules": "",
"concierge": "",
"owner_review": "",
"video": "<iframe ...></iframe>",
"instagram": "",
"pricing": {
"currency": "USD",
"sale_price": null,
"long_term_monthly": null,
"rates": [
{
"bedrooms": 8,
"sleeps": 12,
"periods": [
{
"from": "15 Apr 2026",
"to": "14 Dec 2026",
"minimum_stay": 5,
"price_on_application": false,
"rate_per_night": 3630
}
]
}
]
},
"special_offer": null,
"stand_out_features": ["Beachfront", "Walk to Sandy Lane"],
"rooms_detail": [
{
"name": "Master bedroom",
"beds": "King Bed (US)",
"view": "Sea view",
"en_suite": true,
"image": "https://a14b7a9a.delivery.rocketcdn.me/wp-content/uploads/2021/07/Bluff-House-022.jpg",
"bedroom_amenities": ["Air Conditioning", "Ceiling Fan"],
"bathroom_amenities": ["Walk-in Shower"]
}
],
"reviews": [
{ "name": "The Smith Family", "review": "<p>A wonderful stay.</p>" }
],
"staff": {
"summary": "<p>Fully staffed villa.</p>",
"roles": [
{ "role": "Cook", "detail": "6 days per week", "season": "Winter & Festive", "meals_per_day": "2 consecutive Meals" }
]
},
"property_manager": {
"name": "Maureen Philips",
"bio": "<p>I have been with Young Estates since 2017...</p>",
"image": "https://a14b7a9a.delivery.rocketcdn.me/wp-content/uploads/2026/05/DSC09170-768x947.jpg"
},
"availability_feeds": ["https://www.youngowners.com/wp-content/uploads/ics/Bluff-House/bookings.ics"],
"info_sections": [
{ "title": "CONCIERGE SERVICES", "text": "<p>...</p>", "buttons": [ { "text": "MORE", "link": "https://www.youngestates.com/concierge/" } ] }
],
"related": [
{ "id": 58463, "name": "Sea Breeze", "url": "https://www.youngestates.com/properties/sea-breeze/" }
],
"images": [
"https://a14b7a9a.delivery.rocketcdn.me/wp-content/uploads/2024/05/DSC02355-1024x683.jpg",
"https://a14b7a9a.delivery.rocketcdn.me/wp-content/uploads/2024/05/DSC02360-1024x683.jpg"
]
}
Fetch a single field
Need just one piece of data? Append any field name from the Property fields table to get only that field back, wrapped under its own key. Handy for lightweight widgets or refreshing a single value.
<?php
$ch = curl_init('https://www.youngestates.com/wp-json/ye/v1/properties/58517/images');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-API-Key: YOUR_API_KEY'],
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach ($result['images'] as $src) {
echo '<img src="' . htmlspecialchars($src) . '">';
}
// GET /properties/58517/bedrooms
{ "bedrooms": 8 }
// GET /properties/58517/rooms_detail
{ "rooms_detail": [ { "name": "Master bedroom", ... } ] }
Any top-level field works: name, url, house_type, bedrooms, bathrooms, sleeps, pools, location, categories, description, amenities, house_rules, rooms, pool_size, total_guests, security_deposit, bookable, check_in_out_time, additional_information, additional_house_rules, concierge, owner_review, video, instagram, pricing, special_offer, stand_out_features, rooms_detail, reviews, staff, property_manager, availability_feeds, info_sections, related, taxonomies, images, updated_at. An unknown field returns 404.
Inside WordPress
If your site runs WordPress, wp_remote_get() is the simplest way to call the API and decode the JSON:
<?php
$response = wp_remote_get(
'https://www.youngestates.com/wp-json/ye/v1/properties?city=St.+James',
[ 'headers' => [ 'X-API-Key' => getenv('YE_API_KEY') ] ]
);
if ( is_wp_error( $response ) ) {
error_log( 'YE API error: ' . $response->get_error_message() );
return;
}
$body = json_decode( wp_remote_retrieve_body( $response ), true );
foreach ( $body['data'] as $property ) {
echo esc_html( $property['name'] );
}
Query parameters
All parameters are optional and apply to the GET /properties list endpoint. Combine them freely — they're AND-ed together.
| Param | Type | Description |
|---|---|---|
| city | string | Filter by parish / city term, e.g. St. James. |
| area | string | Filter by neighbourhood / area term, e.g. Sandy Lane Estate. |
| category | string | Filter by property category, e.g. Golf and Resort. |
| type | string | House type, e.g. Villa, Apartment. |
| bedrooms | integer | Exact number of bedrooms. |
| bedrooms_min | integer | Minimum number of bedrooms. |
| guests | integer | Minimum sleeps capacity. |
| search | string | Free-text search on name & description. |
| sort | string | name or newest. Default newest. |
| page | integer | 1-based page number. Default 1. |
| per_page | integer | Items per page, 1–100. Default 20. |
The meta block on every list response tells you total, page, per_page, and total_pages. Loop page from 1 to total_pages to walk the whole catalogue.
Property fields
Fields returned for each property. The list endpoint returns a summary; the single endpoint adds the heavier fields (address, amenities, description, images).
| Field | Type | In list? | Notes |
|---|---|---|---|
| id | integer | Yes | Unique property ID. Use it for the single endpoint. |
| name | string | Yes | Property name, e.g. "Bluff House". |
| slug | string | Yes | URL slug. Usable in place of the ID. |
| url | string | Yes | Canonical page on youngestates.com. |
| house_type | string | Yes | e.g. Villa. |
| bedrooms | integer | Yes | |
| bathrooms | number | Yes | May be a half value, e.g. 5.5. |
| sleeps | integer | Yes | Max guests. |
| pools | integer | Yes | Number of pools. |
| location | object | Yes | city, area, latitude, longitude; address on single only. |
| categories | string[] | Yes | Category taxonomy terms. |
| thumbnail | string | Yes | Single representative image (list only). |
| updated_at | string | Yes | ISO-8601 UTC timestamp of last change. Use for cache invalidation. |
| square_footage | integer|null | No | Null when not recorded. |
| description | string (HTML) | No | Long description. |
| amenities | string[] | No | Internal & external amenity names. |
| house_rules | string[] | No | House-rule terms. |
| taxonomies | object | No | Every listing taxonomy as term-name arrays: area, city, category, internal_amenities, external_amenities, bedroom_amenities, bathroom_amenities, house_rules, fire_safety, staff. |
| rooms | integer|null | No | Room count, when recorded. |
| pool_size | string|null | No | Free-text pool size. |
| total_guests | integer|null | No | Max guests. |
| security_deposit | integer|null | No | Refundable deposit (USD). |
| bookable | boolean | No | Whether instant booking is enabled. |
| check_in_out_time | string (HTML) | No | Check-in / check-out times. |
| additional_information | string (HTML) | No | Free-text notes. |
| additional_house_rules | string (HTML) | No | Extra house rules. |
| concierge | string (HTML) | No | Concierge blurb. |
| owner_review | string (HTML) | No | Owner's note. |
| video | string (HTML) | No | Video embed markup. |
| string (HTML) | No | Instagram embed markup. | |
| pricing | object | No | currency, sale_price, long_term_monthly, and a rates array of seasonal periods (from, to, minimum_stay, price_on_application, rate_per_night). |
| special_offer | object|null | No | title + body, or null. |
| stand_out_features | string[] | No | Headline features. |
| rooms_detail | object[] | No | Per-room: name, beds, view, en_suite, image, bedroom_amenities, bathroom_amenities. |
| reviews | object[] | No | Guest reviews: name + review. |
| staff | object|null | No | summary + roles (role, detail, season, meals_per_day). |
| property_manager | object|null | No | name, bio, image. Never contact details. |
| availability_feeds | string[] | No | iCal (.ics) availability feed URLs. |
| info_sections | object[] | No | Accordion: title, text, buttons. |
| related | object[] | No | Related rentals: id, name, url. |
| images | string[] | No | Full gallery. |
Fields marked (HTML) contain the same rich markup shown on the website (paragraphs, embeds, etc.). Render or sanitise them as appropriate for your site.
Errors
Errors return a non-2xx status and a JSON body with a code and a human-readable message.
{
"code": "ye_invalid_key",
"message": "Missing or invalid API key.",
"data": { "status": 401 }
}
| Status | Meaning | What to do |
|---|---|---|
| 200 | OK | Request succeeded. |
| 401 | Unauthorized | Missing or invalid X-API-Key. Check the header. |
| 404 | Not found | No rental with that ID/slug, or it isn't a published holiday rental. |
| 429 | Too many requests | Rate limit hit (120/min) — back off and retry after the window. |
| 500 | Server error | Transient on our side. Retry with backoff; contact us if it persists. |
Support
- Your API key and each property's ID are in your agent dashboard at youngestates.com/agent.
- Questions or a key rotation — email stay@youngestates.com from your registered partner address.
- For bug reports, include the request URL (minus your key), the status code, and the response body.