Email Signup
Capture studio leads from landing pages with embeddable forms.
POST /api/v1/leads
{ "email": "owner@studio.com", "source": "widget" }
This page shows how another website can load your studio/member UI using either an embed script or direct API calls. Replace the example domain with your production domain.
Paste this on any external site where you want the booking widget to appear.
<div id="fitoa-widget"
data-studio-slug="iron-republic"
data-view="member"
data-theme="light"></div>
<script src="https://fitoa.nicholascabel.com/embed/fitoa-widget.js" defer></script>
Many cycling studios number their bikes. Here’s a movie-ticket-style selector + example API shape for which bikes are taken and which are open.
GET /api/classes/:classId/seats → returns a two-column layout and a list of taken bikes.
{
"classId": "cls_spin_1",
"title": "Spin Class",
"seatCount": 20,
"layout": { "rows": 10, "left": ["1","3","5","7","9","11","13","15","17","19"], "right": ["2","4","6","8","10","12","14","16","18","20"] },
"taken": ["2","7","12"],
"seats": [
{ "label": "1", "status": "open" },
{ "label": "2", "status": "taken" }
]
}
Example payload your API should return for member preview UI.
{
"studio": { "name": "Iron Republic CrossFit", "slug": "iron-republic" },
"member": { "name": "Jordan Kim", "classesRemaining": 3, "classesTotal": 10, "creditsRemaining": 6, "creditsTotal": 10 },
"classes": [
{ "id": "cls_1", "title": "Morning HIIT", "time": "7:00 AM", "instructor": "Coach Sara", "spotsLeft": 2, "signupUrl": "/register" },
{ "id": "cls_2", "title": "Yoga Flow", "time": "9:30 AM", "instructor": "Emma R.", "spotsLeft": 3, "signupUrl": "/register" }
]
}
Capture studio leads from landing pages with embeddable forms.
POST /api/v1/leads
{ "email": "owner@studio.com", "source": "widget" }
Start a hosted checkout flow for packages or memberships.
POST /api/v1/checkout/session
{ "plan": "10-pack", "memberId": "m_123" }
Display remaining classes/credits on member websites or apps.
GET /api/v1/member/credits?memberId=m_123
→ { "classesRemaining":3, "classesTotal":10 }
Scan/check-in members quickly from kiosk or front desk web pages.
POST /api/v1/checkin
{ "bookingId": "b_556", "method": "frontdesk" }
Embed class metadata, capacity, and CTA in external pages.
GET /api/v1/classes/cls_1
→ { "title":"Morning HIIT", "spotsLeft":2 }
const BASE = "https://fitoa.nicholascabel.com";
const studioSlug = "iron-republic";
const memberId = "demo-member-123";
async function loadMemberPreview() {
const res = await fetch(
`${BASE}/api/public/member-preview?studio=${studioSlug}&memberId=${memberId}`,
{ headers: { "Accept": "application/json" } }
);
const data = await res.json();
document.querySelector("#studio-name").textContent = data.studio.name;
document.querySelector("#classes-left").textContent =
`${data.member.classesRemaining}/${data.member.classesTotal} classes remain`;
document.querySelector("#credits-left").textContent =
`${data.member.creditsRemaining}/${data.member.creditsTotal} credits remain`;
}
/api/v1/member-preview.Get early access, studio tips, and launch updates.