← Back

LAHS Bell Schedule API

Los Altos High School bell schedule, as JSON.

All endpoints are public, need no authentication, accept GET requests, allow cross-origin requests, and return JSON. The base URL is https://lahs.apps.fenster.name. All times are local to the school timezone (America/Los_Angeles) and written as HH:MM in 24-hour form; dates are YYYY-MM-DD.

Endpoints

GET/api/v1/schedule

The whole materialized school year: every date from the first to the last day of school, including weekends and holidays.

curl https://lahs.apps.fenster.name/api/v1/schedule
{
  "version": 1,
  "lastUpdated": "2026-08-12T10:30:00-07:00",
  "timezone": "America/Los_Angeles",
  "start": "2025-08-13",
  "end": "2027-06-04",
  "days": {
    "2026-08-31": { ... },
    "2026-09-01": { ... }
  }
}

GET/api/v1/schedule/today

The schedule for the current date in the school timezone.

curl https://lahs.apps.fenster.name/api/v1/schedule/today

GET/api/v1/schedule/tomorrow

The schedule for the next date in the school timezone.

curl https://lahs.apps.fenster.name/api/v1/schedule/tomorrow

GET/api/v1/schedule/:date

The schedule for one date, given as YYYY-MM-DD. A date outside the school year, a weekend, or a holiday returns a day with an empty blocks array rather than an error. A malformed date returns 400.

curl https://lahs.apps.fenster.name/api/v1/schedule/2026-08-31
{
  "date": "2026-08-31",
  "dayOfWeek": 1,
  "weekTitle": "PL Week",
  "code": "A",
  "displayName": "All Periods (Monday)",
  "timezone": "America/Los_Angeles",
  "blocks": [
    {"label": "Period 1", "kind": "period", "period": 1, "start": "08:30", "end": "09:20"},
    {"label": "Period 2", "kind": "period", "period": 2, "start": "09:27", "end": "10:17"},
    {"label": "Brunch", "kind": "brunch", "start": "10:17", "end": "10:25"}
  ]
}

Fields of a day:

GET/api/v1/schedule/last-updated

When the schedule data last changed. Poll this to decide whether a cached copy of /api/v1/schedule is still current.

curl https://lahs.apps.fenster.name/api/v1/schedule/last-updated
{
  "lastUpdated": 1755019800,
  "isoString": "2026-08-12T10:30:00-07:00"
}

lastUpdated is a Unix timestamp in seconds; isoString is the same moment in ISO 8601.

Errors

Errors return a JSON body with error and message fields: 400 for a malformed date, 500 if the schedule cannot be built.