ConcordiaTracker

ConcordiaTracker developer resources

The ConcordiaTracker HTTP API, its machine-readable description, and the conventions an automated client or AI agent should follow.

Quick reference

ResourceURL
OpenAPI 3.1 specificationhttps://concordiatracker.com/openapi.json
Machine-readable site indexhttps://concordiatracker.com/llms.txt
Sitemaphttps://concordiatracker.com/sitemap.xml
Documentationhttps://concordiatracker.com/docs/introduction
API referencehttps://concordiatracker.com/docs/api
Supportconcordiatracker@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.