API

The full collegedata.fyi corpus is exposed as a public, read-only PostgREST API at https://api.collegedata.fyi. Every page on this site is built from the same endpoints documented below.

Authentication

All requests require a Supabase anon key passed as both an apikey query parameter and an Authorization bearer header. The anon key is public and grants read-only access to the published views below.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImlzZHV3bXlndm1kb3pocHZ6YWl4Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzYxMDk3NTksImV4cCI6MjA5MTY4NTc1OX0.fYZOIHyrOWzidgc-CVxWCY5Fe9pQk12-6YjDIS6y9qs

Resources

GET /rest/v1/cds_manifesttry it →

One row per archived CDS document. Joins schools, source URLs, format detection, and extraction status.

school_idschool_namecanonical_yearsource_formatsource_urlstorage_pathextraction_statusdata_quality_flag
GET /rest/v1/cds_artifactstry it →

Extracted field values keyed by canonical CDS question number (e.g. B.101). The notes JSON column holds { values: { 'B.101': { value, value_decoded, question, section, ... } } }.

document_idkindproducernotescreated_at
GET /rest/v1/cds_documentstry it →

Raw archive table — one row per (school, sub-institution, year). Most consumers should prefer cds_manifest.

idschool_idcds_yeardetected_yearparticipation_statussource_sha256

Examples

List the most recent year for every school

curl 'https://api.collegedata.fyi/rest/v1/cds_manifest?select=school_id,school_name,canonical_year&order=canonical_year.desc&limit=10' \
  -H 'apikey: eyJhbGciOiJIUzI1NiIsInR5…' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5…'

Fetch all archived years for one school

curl 'https://api.collegedata.fyi/rest/v1/cds_manifest?school_id=eq.harvard-university&select=canonical_year,source_format,extraction_status' \
  -H 'apikey: <anon key>' \
  -H 'Authorization: Bearer <anon key>'

Fetch extracted field values for a document

The kind=eq.canonical filter selects the deterministic extractor output. To merge in the LLM fallback gap-fill, also fetch rows with producer=eq.tier4_llm_fallback and overlay the canonical values on top.

curl 'https://api.collegedata.fyi/rest/v1/cds_artifacts?document_id=eq.<uuid>&kind=eq.canonical&select=notes' \
  -H 'apikey: <anon key>' \
  -H 'Authorization: Bearer <anon key>'

JavaScript client

The same @supabase/supabase-js client this site uses works against the public API:

import { createClient } from "@supabase/supabase-js";

const supabase = createClient(
  "https://api.collegedata.fyi",
  "<anon key>"
);

const { data } = await supabase
  .from("cds_manifest")
  .select("school_name, canonical_year")
  .eq("extraction_status", "extracted")
  .limit(20);

Source documents

Original CDS files are hosted on Supabase Storage. Once you have a manifest row, build the public URL as https://api.collegedata.fyi/storage/v1/object/public/<storage_path>. Every file is content-addressed by SHA-256.

Schema and licensing

Field IDs follow the canonical 1,105-field schema derived from the CDS Initiative's 2025-26 XLSX template. The full schema is checked into the repo at schemas/. The dataset is MIT-licensed; the underlying CDS documents are owned by their respective institutions and reproduced here under their public-document status.

Found something missing or wrong? Open an issue on GitHub, or browse the school directory.