NSERC Grants API: Query Discovery Grant Data Programmatically
The Natural Sciences and Engineering Research Council (NSERC) funds natural science and engineering research across Canada. It publishes every grant it awards, but the data lives in a search portal built for one-off lookups. There is no public REST API, and the open data files change structure from year to year.
GrantData exposes this data through a clean REST API: NSERC and SSHRC research grants, normalized to a consistent schema, queryable by program, institution, department, keyword, date, and value. Coverage refreshes weekly.
Why the native NSERC portal is painful at scale
The NSERC web portal works for a single lookup. It breaks down the moment you need data systematically: for a funding dashboard, a competitive-intelligence tool, an LLM agent, or simply a spreadsheet of one institution's Discovery Grants over ten years.
NSERC portal
- No REST API, no pagination
- Open data files with column names that shift year to year
- Program and institution names not normalized
- No full-text search across descriptions
- Hard to roll up all grants for one researcher
GrantData API
- REST API, JSON responses, cursor pagination
- Normalized schema, consistent across years
- Filter by program, department, value, and date
- Full-text search via
?q= /recipient/{name}rolls up every grant for a recipient
670,000+ NSERC and SSHRC research grants. One endpoint. The Basic plan is free, 25 requests per day.
What NSERC grant data looks like in the API
Each record exposes top-level fields for fast filtering (department, recipient_name, program, value, event_date) plus a data object with the source fields. A grant record:
{
"record_id": "research_grants|nserc|RGPIN-2023-04821",
"entity_type": "research_grant",
"department": "Natural Sciences and Engineering Research Council",
"recipient_name": "University of Toronto",
"program": "Discovery Grants",
"value": 52000.00,
"event_date": "2023-04-01",
"data": {
"fiscal_year": "2023-2024",
"committee": "Evolution and Ecology",
"province": "Ontario",
"installment": 1
}
}
Query examples
NSERC Discovery Grants by keyword
curl -G "https://grantdata-canadian-government-grants-api.p.rapidapi.com/research_grant" \
--data-urlencode "program_exact=Discovery Grants" \
--data-urlencode "q=quantum" \
--data-urlencode "issued_after=2022-01-01" \
--data-urlencode "limit=20" \
-H "X-RapidAPI-Key: YOUR_API_KEY" \
-H "X-RapidAPI-Host: grantdata-canadian-government-grants-api.p.rapidapi.com"
All grants to an institution, largest first
curl -G "https://grantdata-canadian-government-grants-api.p.rapidapi.com/research_grant" \
--data-urlencode "recipient_name=University of British Columbia" \
--data-urlencode "sort_by=value" \
--data-urlencode "sort_order=desc" \
--data-urlencode "limit=50" \
-H "X-RapidAPI-Key: YOUR_API_KEY" \
-H "X-RapidAPI-Host: grantdata-canadian-government-grants-api.p.rapidapi.com"
Aggregate stats by program
The /research_grant/stats endpoint aggregates without pulling records: total by program, by institution, or by period. One call instead of thousands.
curl -G "https://grantdata-canadian-government-grants-api.p.rapidapi.com/research_grant/stats" \
--data-urlencode "group_by=program" \
--data-urlencode "sum_field=value" \
-H "X-RapidAPI-Key: YOUR_API_KEY" \
-H "X-RapidAPI-Host: grantdata-canadian-government-grants-api.p.rapidapi.com"
Program and department normalization
Source data names the same funder several ways: "NSERC", "CRSNG", "Natural Sciences and Engineering Research Council". The API normalizes these variants. Use department=NSERC and you get every record regardless of the original spelling. For a known program, program_exact=Discovery Grants is faster than a partial match.
This API is the access layer behind our NSERC analysis: the 6x gap between disciplines and 26 years and $28 billion. The same data, raw and queryable.
Frequently asked questions
/research_grant with ?program_exact=Discovery Grants for an exact match, faster than program=. Add department=NSERC to scope to NSERC only.