ConcordiaTracker developer resources
The ConcordiaTracker HTTP API, its machine-readable description, and the conventions an automated client or AI agent should follow.
Quick reference
| Resource | URL |
|---|---|
| OpenAPI 3.1 specification | https://concordiatracker.com/openapi.json |
| Machine-readable site index | https://concordiatracker.com/llms.txt |
| Sitemap | https://concordiatracker.com/sitemap.xml |
| Documentation | https://concordiatracker.com/docs/introduction |
| API reference | https://concordiatracker.com/docs/api |
| Support | concordiatracker@gmail.com |
Base URL
All endpoints live under https://concordiatracker.com/api/. Every response, including every error, is JSON.
The open endpoint
GET /api/sections needs no authentication and answers the question most worth asking a Concordia course tool: when does a course meet, where, and is there a seat.
curl -s "https://concordiatracker.com/api/sections?subject=COMP&catalog=248"
It returns every published section of that course for the terms Concordia currently lists, newest term first, with meeting times, building and room, instruction mode, and live enrolment and waitlist counts. classNumber is the value Concordia's Student Centre asks for when enrolling.
Authentication
Everything else requires a signed-in user. Send a Supabase access token:
Authorization: Bearer <supabase-access-token>
Two endpoints are internal scheduled jobs authenticated with 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 JSON shape, so one parser handles all of them:
{
"error": "Give a subject and catalog number, e.g. COMP 248.",
"code": "bad_request",
"message": "Give a subject and catalog number, e.g. COMP 248.",
"hint": "Check the request parameters against the OpenAPI schema at /openapi.json.",
"status": 400,
"docs": "https://concordiatracker.com/docs/api"
}
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.
Content negotiation
The homepage, every documentation page, and these developer pages are available as markdown. Ask for it and you will get it, with Vary: Accept set so a cache cannot hand you the wrong variant:
curl -s -H "Accept: text/markdown" https://concordiatracker.com/docs/introduction
Function calling
The specification at https://concordiatracker.com/openapi.json is OpenAPI 3.1. Every operation has a unique operationId, a description written for a caller rather than a maintainer, typed parameters, and a response schema, so it converts directly into tool definitions for an LLM function-calling runtime without hand-editing.
Rate limits and etiquette
There is no published quota on GET /api/sections, but it proxies Concordia's own directory: cache results, 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, email concordiatracker@gmail.com first.
Status
The API backs a live product and its shape is stable, but it is versioned by the specification rather than by URL. Breaking changes will be announced in the documentation before they ship.