Partners · API documentation
Our developments, in your platform.
A read-only API with the developments and units you see on this website: names, locations, galleries, specifications, prices and the potential returns, as the site shows them. One key per partner, JSON over HTTPS, nothing to install. The machine-readable description is at /api/v1/openapi.json.
1 · Your key
Royal Bali Group gives you a key that starts with rbg_api_. Send it with every call:
curl https://www.royalbaligroup.com/api/v1/developments \
-H "Authorization: Bearer rbg_api_…"- The key is shown to you once. Keep it on your server, never in a browser or an app.
- It lives 7 days from its last use: every accepted call extends it, so a key in use never lapses. A key unused for 7 days expires.
- Rotate it whenever you like with
POST /api/v1/token/rotate(send the current key as the bearer). The answer carries a new key; the old one keeps answering for 24 hours so you can swap without an outage. - Royal Bali Group can revoke a key at any time; a revoked or expired key gets
401.
2 · Endpoints
| Method | Path | What you get |
|---|---|---|
| GET | /api/v1/developments | Every public development. Slug, name, location, coordinates, sales and build status, completion, cover image, unit counts by status, links. |
| GET | /api/v1/developments/{slug} | One development in full. Everything the website shows: description, galleries in the stored order, amenities, features, key details, materials, nearby points, video, the Potential ROI range, the estimated nightly rate — and its units. |
| GET | /api/v1/developments/{slug}/units | The units of a development. Filters: status (available, reserved, sold, delivered), bedrooms. Paged with offset and limit (max 200). |
| GET | /api/v1/units/{id} | One unit. Number, type, status, bedrooms, bathrooms, sizes, floors, pool, furnished, ownership, price and nightly rate as { amount, currency }, payment plan, gallery, floor plan. |
| POST | /api/v1/token/rotate | Rotate your key. Send the current key as the bearer; the answer carries a new key of the same life. The old key keeps answering for 24 hours. |
Every answer wears the same envelope: api, generated_at, attribution, disclaimer and data. The list:
{
"api": "v1",
"generated_at": "2026-10-09T13:00:00.000Z",
"attribution": "Royal Bali Group",
"disclaimer": { "financial": "…", "general": "…", "labels": "…", "attribution": "Royal Bali Group" },
"data": {
"developments": [
{
"slug": "raya-residence",
"name": "Raya Residence",
"location": "Bingin, Uluwatu",
"coordinates": { "lat": -8.80, "lng": 115.12 },
"status": "construction",
"sales_status": "selling",
"construction_status": "in_progress",
"completion": "2027-03-31",
"cover_image": "https://…/raya-cover.webp",
"units": { "available": 10, "sold": 20 },
"links": { "self": "/api/v1/developments/raya-residence", "website": "https://www.royalbaligroup.com/developments/villas/raya-residence" }
}
]
}
}A unit, inside a development or on its own. Money is always { amount, currency }, taken from the unit itself:
{
"id": "6f0e…",
"development": "raya-residence",
"unit_number": "Villa 3",
"type": "villa",
"status": "available",
"visibility": "public",
"public_status": "available",
"bedrooms": 2,
"bathrooms": 2,
"build_size_m2": 204.1,
"land_size_m2": 180,
"floors": 2,
"pool": true,
"furnished": true,
"ownership": "leasehold",
"lease_end_date": "2056-12-31",
"price": { "amount": 499900, "currency": "USD" },
"estimated_nightly_rate": { "amount": 250, "currency": "USD" },
"gallery": [{ "url": "https://…/villa-3-exterior.webp" }],
"floorplan_url": "https://…/villa-3-plan.pdf"
}Filters on units: ?status=available, ?bedrooms=2; paging with offset and limit (at most 200). Galleries come in the order the site shows them.
Visibility. Every unit of a development is listed and counts in the totals and the From price. A unit whose visibility is investor or internal is not offered publicly on its own: show public_status (“internal”) where you show a single unit, never its real status.
3 · Caching and limits
- Every answer carries an
ETag. Send it back asIf-None-Matchand an unchanged answer is a304that costs you nothing to parse. - Limits per key: 60 calls a minute and 5,000 a day. Past them you get
429withRetry-After. Syncing every development once an hour is a few dozen calls. - Answers may be cached for five minutes (
Cache-Control: private, max-age=300). Prices and availability must not be cached beyond 24 hours.
4 · Errors
A problem is JSON too: { "api": "v1", "error": { "status": 404, "message": "No public development \"x\"." } }
400a filter that makes no sense ·401no usable key ·404not a public development or unit ·405anything but GET (the API is read only) ·429too fast ·409a key rotated twice.
5 · Terms of use
Using a key means you accept these. They protect the people who read what you publish.
- Labels and disclaimer. Show every financial figure with its Potential label (potential ROI, potential payback, estimated nightly rate) and this text next to it: “The financial projections, potential return on investment (ROI), payback periods, rental income estimates, occupancy rates and operational expense assumptions are estimates based on specific assumptions and market conditions at the time of publication. They are not guarantees or promises of actual returns.”
- Attribution. Name Royal Bali Group as the source of the development and unit data.
- Freshness. Do not show a price or an availability older than 24 hours; re-read before you quote.
- No resale. The feed is for your own platform; do not pass it on or sell it.
- Your key is yours. Keep it secret; tell us if it leaks and we rotate it.
Content is for informational and marketing purposes. Potential rental income projections are estimates based on assumptions and are not guarantees. Actual returns depend on market conditions, property management, occupancy rates and other factors. Investors should conduct independent due diligence.
Need a key?
Write to us through the contact page; a partner key is issued by the office and sent to you once.