Skip to main content

CourseGrid Public API

Read-only. No API key. No account.

Overview

Read-only. No API key, no account, no cost. Every response is a JSON object with a top-level data (or error) field plus a meta envelope carrying the API version, an import-freshness verdict, and this disclaimer:

CourseGrid is independent. It is not affiliated with, endorsed by, or sponsored by San Diego State University or the California State University system. Data may be outdated. Confirm on the official SDSU portal before registering. CourseGrid performs no enrollment actions.

Responses are cached and rate-limited; a 429 carries X-RateLimit-* and Retry-After headers. CORS is open for GET and OPTIONS from any origin.

Machine-readable spec: /api/v1/openapi.json (OpenAPI 3.1.0).

Endpoints

GET/api/v1/terms

List terms

Every term with at least one section on file, newest first.

Responses: 200 Terms on file. · 429 Rate limit exceeded. Retry after the window named in Retry-After. · 500 An internal error occurred.
Example 200 response
{
  "data": [
    {
      "code": "2267",
      "label": "Fall 2026",
      "startsAt": "2026-08-24T00:00:00.000Z",
      "endsAt": "2026-12-12T00:00:00.000Z",
      "sectionCount": 6002,
      "isDefault": true
    }
  ],
  "meta": {
    "version": "v1",
    "freshness": {
      "verdict": "fresh",
      "lastImportAt": "2026-08-25T09:03:00.000Z"
    },
    "docs": "https://coursegrid.io/docs/api",
    "source": "San Diego State University public class search",
    "disclaimer": "CourseGrid is independent. It is not affiliated with, endorsed by, or sponsored by San Diego State University or the California State University system. Data may be outdated. Confirm on the official SDSU portal before registering. CourseGrid performs no enrollment actions."
  }
}
GET/api/v1/courses

Search courses

Courses matching the given filters, paginated. Without subject, q searches across title/subject/number, or all courses in term if no other filters are given.

  • subjectquery · string · optional

    Subject code, e.g. 'CS'. Case-insensitive.

  • termquery · string, default "2273" · optional

    Term code to filter section counts by. Defaults to the current default term.

  • qquery · string · optional

    Free-text search across course title, subject, and number.

  • numberquery · string · optional

    Course number, or a number prefix (e.g. '4' matches 400-level courses).

  • pagequery · integer, default 1 · optional

    1-indexed page number. Default 1.

  • pageSizequery · integer, default 50, max 200 · optional

    Results per page, 1-200. Default 50.

Responses: 200 A page of matching courses. · 400 A query parameter failed validation. · 429 Rate limit exceeded. Retry after the window named in Retry-After. · 500 An internal error occurred.
Example 200 response
{
  "data": [
    {
      "id": "CS-460",
      "subject": "CS",
      "number": "460",
      "code": "CS 460",
      "title": "Software Engineering",
      "units": "3",
      "description": "Algorithms for solving frequently occurring problems. Analysis techniques, divide and conquer algorithms with applications.",
      "prerequisites": {
        "text": "CS 310 with a grade of C or better",
        "confidence": "high"
      },
      "catalog": {
        "eligibility": "Not open to students with credit in CS 560.",
        "corequisites": null,
        "recommended": null,
        "geAttributes": [],
        "grading": "LTR: Letter Graded.",
        "repeatable": null,
        "maxUnits": null,
        "typicallyOffered": "Fall/Spring",
        "formerlyNumbered": "CS 560",
        "crossListedWith": [],
        "notes": "Not open to students with credit in CS 560."
      },
      "requirements": [],
      "url": "https://coursegrid.io/course/CS-460",
      "sectionCount": 3
    }
  ],
  "page": 1,
  "pageSize": 50,
  "total": 1,
  "hasMore": false,
  "meta": {
    "version": "v1",
    "freshness": {
      "verdict": "fresh",
      "lastImportAt": "2026-08-25T09:03:00.000Z"
    },
    "docs": "https://coursegrid.io/docs/api",
    "source": "San Diego State University public class search",
    "disclaimer": "CourseGrid is independent. It is not affiliated with, endorsed by, or sponsored by San Diego State University or the California State University system. Data may be outdated. Confirm on the official SDSU portal before registering. CourseGrid performs no enrollment actions."
  }
}
GET/api/v1/courses/{slug}

Get one course

One course and its sections for the given term (defaults to the newest term with sections on file).

  • slugpath · string · required

    The canonical course slug: subject and number joined with a dash, e.g. 'CS-460' or 'E-E-101'. A non-canonical spelling (e.g. 'cs460') 308-redirects to the canonical URL rather than 404ing.

  • termquery · string · optional

    Term code. Defaults to the newest term with sections on file.

Responses: 200 The course and its sections. · 308 The slug was not in canonical form; retry the request at the URL in Location. · 400 A query parameter failed validation. · 404 No course exists for this slug. · 429 Rate limit exceeded. Retry after the window named in Retry-After. · 500 An internal error occurred.
Example 200 response
{
  "data": {
    "id": "CS-460",
    "subject": "CS",
    "number": "460",
    "code": "CS 460",
    "title": "Software Engineering",
    "units": "3",
    "description": "Algorithms for solving frequently occurring problems. Analysis techniques, divide and conquer algorithms with applications.",
    "prerequisites": {
      "text": "CS 310 with a grade of C or better",
      "confidence": "high"
    },
    "catalog": {
      "eligibility": "Not open to students with credit in CS 560.",
      "corequisites": null,
      "recommended": null,
      "geAttributes": [],
      "grading": "LTR: Letter Graded.",
      "repeatable": null,
      "maxUnits": null,
      "typicallyOffered": "Fall/Spring",
      "formerlyNumbered": "CS 560",
      "crossListedWith": [],
      "notes": "Not open to students with credit in CS 560."
    },
    "requirements": [],
    "url": "https://coursegrid.io/course/CS-460",
    "sectionCount": 3,
    "sections": [
      {
        "id": "sec-1",
        "classNumber": "12345",
        "sectionCode": "01",
        "status": "OPEN",
        "statusLabel": "Open",
        "modality": "IN_PERSON",
        "modalityLabel": "In person",
        "room": "PG 242",
        "capacity": 35,
        "enrolled": 28,
        "waitlist": 0,
        "openSeats": 7,
        "meetings": [
          {
            "days": "MW",
            "daysLabel": "Mon, Wed",
            "startMin": 540,
            "endMin": 590,
            "startTime": "9:00 AM",
            "endTime": "9:50 AM",
            "building": "PSFA",
            "room": "310",
            "location": "PSFA 310"
          }
        ],
        "instructors": [
          "A. Nguyen"
        ]
      }
    ]
  },
  "meta": {
    "version": "v1",
    "freshness": {
      "verdict": "fresh",
      "lastImportAt": "2026-08-25T09:03:00.000Z"
    },
    "docs": "https://coursegrid.io/docs/api",
    "source": "San Diego State University public class search",
    "disclaimer": "CourseGrid is independent. It is not affiliated with, endorsed by, or sponsored by San Diego State University or the California State University system. Data may be outdated. Confirm on the official SDSU portal before registering. CourseGrid performs no enrollment actions."
  }
}
GET/api/v1/openapi.json

This document

The OpenAPI 3.1 document describing every endpoint under /api/v1.

Responses: 200 The OpenAPI 3.1 document. · 429 Rate limit exceeded. Retry after the window named in Retry-After.

No SDSU or CSU affiliation

CourseGrid is independent. It is not affiliated with, endorsed by, or sponsored by San Diego State University or the California State University system. Data may be outdated. Confirm on the official SDSU portal before registering. CourseGrid performs no enrollment actions.