Public schedule feed
A club’s class times and open spots as JSON, the website embed, and booking links.
A club that shares its schedule publicly gets a read-only feed of its classes and open spots, an embed for its website, and booking links. None of these need a key, and none of them show who is booked.
The schedule feed
GET https://fencingoffice.com/api/public/classes?orgAlias=<alias>&days=<1 to 28>| Parameter | Description |
|---|---|
orgAlias (required) | The club’s short name. |
days | How many days ahead, from now. 1 to 28, default 14. |
curl "https://fencingoffice.com/api/public/classes?orgAlias=riverside&days=7"{
"organization": { "name": "Riverside Fencing Club", "imageUrl": null, "color": "#1d4ed8", "org_alias": "riverside" },
"classes": [
{
"id": "c_8Fq2",
"title": "Youth Foil",
"description": "Footwork, bladework and bouting for new fencers.",
"location": "Main strip",
"instructorName": "Coach Ana",
"timezone": "America/New_York",
"durationMinutes": 90,
"color": "#16a34a",
"ageLabel": "Ages 8 to 12",
"dropIn": false,
"waitlist": true,
"trial": false
}
],
"occurrences": [
{
"classId": "c_8Fq2",
"start": "2026-11-12T22:00:00.000Z",
"end": "2026-11-12T23:30:00.000Z",
"capacity": 16,
"spotsLeft": 3,
"waiting": 0
},
{
"classId": "c_8Fq2",
"start": "2026-11-19T22:00:00.000Z",
"end": "2026-11-19T23:30:00.000Z",
"capacity": 16,
"spotsLeft": 16,
"waiting": 0,
"opensAt": "2026-11-12T22:00:00.000Z",
"coachName": "Coach Ben"
}
]
}What the fields mean
classesare the club’s active classes, by title.timezoneis where the class meets; show times in it.dropInis true when anyone may book (drop-ins and trial classes); otherwise only members of the class’s group can.trialclasses allow one booking per person.occurrencesare the class times in the range, earliest first, withstartandendin UTC.spotsLeftis capacity minus bookings and the waitlist.waitingis how many are on the waitlist.opensAtappears when booking for that time hasn’t opened yet.coachNameappears only when a substitute coaches that time.
Errors and caching
400{ "error": "Missing club" }withoutorgAlias.404{ "error": "Club not found" }for an unknown alias, or “This club’s schedule isn’t public” when it is off.- Replies are cached for 60 seconds, so open spots can be a minute behind.
- Any website can read the feed straight from the browser: it allows every origin and sends no cookies or credentials.
From a web page
Build your own schedule on a club’s site with a few lines of JavaScript:
<section id="classes"></section>
<script>
fetch("https://fencingoffice.com/api/public/classes?orgAlias=riverside&days=7")
.then(function (res) { return res.json(); })
.then(function (schedule) {
var titles = {};
schedule.classes.forEach(function (c) { titles[c.id] = c.title; });
var list = document.getElementById("classes");
schedule.occurrences.forEach(function (o) {
var item = document.createElement("p");
var when = new Date(o.start).toLocaleString();
item.textContent = titles[o.classId] + ", " + when + ": " + o.spotsLeft + " spots left";
list.appendChild(item);
});
});
</script>Embed the schedule on a website
The same dialog gives the club this code, with its own name filled in. The script grows the frame to fit the schedule; without it the frame keeps its starting height and scrolls.
<iframe src="https://fencingoffice.com/embed/riverside" title="Riverside Fencing Club class schedule" style="width:100%;min-height:640px;border:0" loading="lazy"></iframe>
<script src="https://fencingoffice.com/embed.js" async></script>The embedded page can be framed by any site. Its Book buttons send people to the club’s booking page, where they sign in; nothing is booked inside the frame. Classes and booking calendars covers the rest of the setup.
Link to booking
Send people straight to a class time with the club’s booking page. class and start are optional and come from the feed (classes[].id and occurrences[].start):
https://fencingoffice.com/book/riverside/classes?class=c_8Fq2&start=2026-11-12T22:00:00.000ZPersonal calendar subscriptions
Each member can subscribe to their own bookings in Google, Apple or Outlook from Add to your calendar under their upcoming classes. The link is an iCal feed at /api/calendar/<token>.ics; the token is the only credential, so treat the link like a password. Resetting it there stops the old link, and an unknown or reset token answers 404.