Developers
API reference
ConcordiaTracker exposes a small HTTP API. Most of it backs the web app and needs a signed-in user, but one endpoint is open to anyone and is the useful one for an automated client: live section, meeting-time, and seat data for any Concordia course.
The machine-readable description lives at /openapi.json. It is OpenAPI 3.1, and every operation has a unique operationId, typed parameters, and a response schema, so it converts straight into tool definitions for an LLM function-calling runtime.
Base URL
Every endpoint is under https://concordiatracker.com/api/. Every response, including every error, is JSON.
Course sections (no authentication)
GET /api/sections?subject=COMP&catalog=248 returns every published section of that course for the terms Concordia currently lists, newest first.
subject— two to six letters, case-insensitive. For exampleCOMP.catalog— two to four digits with an optional trailing letter. For example248.
Each section carries classNumber (the value Concordia’s Student Centre asks for when you enrol), termCode, section, component, meetingTimes, building, room, instructionMode, and live enrolled, capacity, waitlisted, and waitlistCap counts. hasReserved is true when some seats are held for particular programmes, which is why an apparently open section can still refuse you.
Authentication
Everything else requires a signed-in user. Send a Supabase access token as Authorization: Bearer <token>. Two endpoints are internal scheduled jobs authenticated by a deployment secret rather than a user token; they are listed in the specification for completeness and are not callable by clients.
Errors
Every failure returns the same shape, so one parser handles all of them: error (the human message, kept for older clients), code, message, hint, status, and docs.
code is stable and safe to branch on. The values are bad_request, unauthorized, forbidden, not_found, method_not_allowed, conflict, rate_limited, not_configured, upstream_error, and internal_error.
An unknown path under /api/ returns a JSON not_found, never an HTML error page. An unknown path anywhere else on the site returns a real HTTP 404 with a short body pointing at the sitemap, llms.txt, and this reference.
Markdown content negotiation
The homepage, every documentation page, and the About, Contact, and Developers pages are available as markdown. Send Accept: text/markdown and you get markdown back, with Vary: Accept set so a shared cache cannot hand you the wrong variant.
Rate limits and etiquette
There is no published quota on the sections endpoint, but it proxies Concordia’s own directory: cache what you fetch, do not poll in a tight loop, and identify your client with a User-Agent. Ticket creation is rate limited per IP address. If you are building something that needs more than casual use, get in touch first.
For AI agents
Start from llms.txt. It carries a "when to use this" section naming the questions this site can answer well — course content, prerequisites, section times and seats, Concordia’s GPA scale, tuition rates, registrar deadlines — and states plainly what it cannot answer, namely anything about an individual student’s private record.