Skip to content

Studio endpoints

All paths below are under /api/v1/studios/{studioId} and need Authorization: Bearer <accessToken> from a studio member. Call them from your server — browser CORS allows only our own apps. See Studio back office for the how-to.

EndpointRoleNotes
GET/sitememberCurrent configuration, domain state, preview URL
PUT/siteowner · managerPartial update: template, theme, sections, content, legal, seo, defaultLocale, locales
POST/site/publishowner · managerRequires a verified studio and a complete checklist
POST/site/unpublishowner · managerPublic endpoints start answering 404 SITE_NOT_LIVE
GET/site/previewowner · managerSigned URL that renders a draft
GET/site/checklistowner · manager{ items[], done, total, canPublish }
EndpointNotes
PUT/site/domain{"domain":"studiouno.com"} → returns the DNS records to create
POST/site/domain/verifyChecks the TXT record; 409 DOMAIN_UNVERIFIED means “not visible yet”
PUT /site/domain response · domainInstructions
{
"domain": "studiouno.com",
"cnameTarget": "sites.mrcharles.app",
"aRecord": "203.0.113.10",
"txtName": "_mrcharles-verify.studiouno.com",
"txtValue": "mc-verify-9f3c…"
}
EndpointNotes
GET/site/roomsEvery room with its policy and blockers[]
GET/rooms/{roomId}/booking-settingsOne room
PUT/rooms/{roomId}/booking-settingsFull replacement of the policy
PUT body
{
"onlineEnabled": true,
"minMinutes": 60,
"maxMinutes": 240,
"stepMinutes": 30,
"paymentModes": ["card", "on_site"],
"depositPercent": 30,
"cancelNoticeHours": 24,
"instructions": { "es": "Llama al timbre 2.", "en": "Ring bell 2." },
"photos": ["https://…/room-1.jpg"]
}

blockers explains why a room still is not bookable: no_price, no_hours, inactive, studio_unverified, site_not_live.

EndpointNotes
GET/site/bookings?from&to&statusDefaults: from = today, to = +14 days. status filters one state
GET/site/bookings/{bookingId}Includes the full events[] audit trail
POST/site/bookings/{bookingId}/{action}{"note":"…"} optional

Actions and their preconditions:

ActionAllowed whenEffect
mark_paidstatus confirmed or completedpaymentStatus → paid
mark_refundedpayment deposit_paid or paidpaymentStatus → refunded
no_showafter the start timestatus → no_show
completeafter the end timestatus → completed
cancelnot already finishedstatus → cancelled, note becomes the reason
notealways (note required)Appends to the audit trail

A wrong precondition answers 409 INVALID_STATE.

Studio-side responses add to the public booking shape: roomId, guestPhone, guestEmail, studioNotes, cancelledBy, cancelReason, confirmedAt, cancelledAt and events[] (actor, action, meta, createdAt).