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>
ParameterDescription
orgAlias (required)The club’s short name.
daysHow 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

  • classes are the club’s active classes, by title. timezone is where the class meets; show times in it.
  • dropIn is true when anyone may book (drop-ins and trial classes); otherwise only members of the class’s group can. trial classes allow one booking per person.
  • occurrences are the class times in the range, earliest first, with start and end in UTC.
  • spotsLeft is capacity minus bookings and the waitlist. waiting is how many are on the waitlist.
  • opensAt appears when booking for that time hasn’t opened yet. coachName appears only when a substitute coaches that time.

Errors and caching

  • 400 { "error": "Missing club" } without orgAlias.
  • 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.

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.000Z

Personal 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.