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.
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": { ... }
}
}
The schedule for the current date in the school timezone.
curl https://lahs.apps.fenster.name/api/v1/schedule/today
The schedule for the next date in the school timezone.
curl https://lahs.apps.fenster.name/api/v1/schedule/tomorrow
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:
date — the requested date.dayOfWeek — 0 for Sunday through 6 for Saturday.weekTitle — name of the week this day belongs to, e.g. "Finals Week".code — the day pattern code (A, B, …,
X for no school), or null on weekends.displayName — human-readable name of the day pattern.timezone — IANA timezone the block times are in.blocks — ordered periods and breaks. Each has label,
kind (period, brunch, lunch,
other), start, end, and, for classes,
a period number.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 return a JSON body with error and message fields:
400 for a malformed date, 500 if the schedule cannot be built.