Site payload
One call returns the studio, its rooms with their booking policy, and the site’s presentation settings.
GET /public/sites/{slug}
Section titled “GET /public/sites/{slug}”curl -s https://api.mrcharles.app/api/v1/public/sites/studio-uno-madrid| Auth | none |
| Cache | public, max-age=60 |
| Errors | 404 RESOURCE_NOT_FOUND (no such slug) · 404 SITE_NOT_LIVE (exists, not published) |
GET /public/sites/resolve?host=
Section titled “GET /public/sites/resolve?host=”Same payload, looked up by hostname — <slug>.sites.mrcharles.app or a verified custom domain.
curl -s "https://api.mrcharles.app/api/v1/public/sites/resolve?host=studiouno.com"Response
Section titled “Response”{ "studio": { … }, "rooms": [ { … } ], "site": { … }, "bookingOnline": true, "cardPayments": true, "captchaSiteKey": "0x4AAA…", "stripePublishableKey": "pk_live_…"}| Field | Type | Notes |
|---|---|---|
bookingOnline | boolean | At least one room is bookable online |
cardPayments | boolean | Card deposits available on this platform |
captchaSiteKey | string? | Turnstile site key for the hold captcha (action hold). Always present outside local development |
stripePublishableKey | string? | Present when cardPayments — use it to mount Stripe |
studio
Section titled “studio”| Field | Type | Notes |
|---|---|---|
name, slug | string | slug is the public identifier |
description, shortDescription | string, string? | |
studioType | string? | recording, rehearsal, teaching, … |
logoUrl, coverImageUrl | string? | |
addressLine1, addressLine2, city, postalCode, country | string | country is ISO 3166-1 alpha-2 |
latitude, longitude | number? | |
phone, email, website | string?, string, string? | |
timezone | string | IANA name — every date and time belongs to this zone |
isVerified | boolean | Ownership confirmed by us |
averageRating, totalReviews | number?, number | |
operatingHours | array | { dayOfWeek: 0–6 (Sun–Sat), openTime: "10:00", closeTime: "22:00", isClosed } |
socialLinks, amenities | array |
rooms[]
Section titled “rooms[]”| Field | Type | Notes |
|---|---|---|
id | uuid | Use in availability and holds |
name, description | string, string? | |
capacity | number | People |
roomType | string? | |
hourlyCents, currency | number, string | Minor units; 2500 = €25.00/h |
bookable | boolean | Only these accept online bookings |
minMinutes, maxMinutes, stepMinutes | number | Allowed durations |
paymentModes | string[] | card, on_site |
depositPercent | number | Share charged now when paying by card |
cancelNoticeHours | number | Guest self-cancellation window |
instructions | object | { es, ca, en }, shown after booking |
photos | string[] | |
equipment, facilities | array | |
pricing | object | The room’s full price list — see below |
rooms[].pricing
Section titled “rooms[].pricing”Every room has one, even with a single hourly price (one standard row). Use it to display prices; the amount a guest pays always comes from a quote or the hold.
{ "version": 3, "fromCents": 800, "toCents": 1500, "summary": { "es": "Desde 8 €/h · Solo/Dúo/Banda · Mañanas: 9 €/h", "en": "From €8/h · Solo/Duo/Band · Mornings: €9/h" }, "defaultGroupSizeId": "g_duo", "groupSizes": [ { "id": "g_solo", "label": { "es": "Solo", "en": "Solo" }, "maxPeople": 1 }, { "id": "g_duo", "label": { "es": "Dúo", "en": "Duo" }, "maxPeople": 2 }, { "id": "g_band", "label": { "es": "Banda", "en": "Band" }, "maxPeople": 6 } ], "bands": [ { "id": "b_morn", "label": { "es": "Mañanas", "en": "Mornings" }, "days": [1, 2, 3, 4, 5], "start": "10:00", "end": "15:00", "color": 0 } ], "table": { "standard": { "g_solo": 800, "g_duo": 1200, "g_band": 1500 }, "b_morn": { "g_solo": 500, "g_duo": 900, "g_band": 1200 } }, "durationDiscounts": [{ "minMinutes": 240, "percent": 10 }]}| Field | Notes |
|---|---|
fromCents, toCents | Cheapest and dearest hourly price in the table. Show “From” with fromCents |
summary | One line per language for listings |
groupSizes[] | Price tiers by group size. Empty: one price for any group — don’t ask who’s coming |
defaultGroupSizeId | The tier priced at hourlyCents; preselect it |
bands[] | Times of the week with their own prices. days are ISO weekdays (1 = Monday). An end before start runs past midnight |
table | Hourly minor units per [row][column]. Rows: standard and band ids. Columns: group ids, or any when the room has no tiers |
durationDiscounts[] | Percentage off bookings of at least minMinutes |
Send the guest’s tier as groupSizeId on the quote and the hold. Omitting it prices the default tier — exactly what older clients get.
| Field | Type | Notes |
|---|---|---|
template | string | stage or daylight |
theme | object | primary, accent, font, radius, mode, logoUrl |
sections | object | Which blocks the studio enabled |
content | object | tagline, about, bookingNote (localised), whatsapp, instagram, gallery |
legal | object | legalName, taxId, address, email, phone |
seo | object | title, description |
defaultLocale, locales | string, string[] | es · ca · en |
status | string | Always live on public responses |
customDomain | string? | |
canonicalHost | string | Where the site should live — redirect to it if you mirror content |
Localised fields are objects keyed by locale: {"es":"Locales de ensayo","ca":"Locals d'assaig"}. A missing key means “fall back to defaultLocale”.