Scholarship and Grant Deadline Tracking
Watch funding-opportunity pages so deadline changes, new postings, and reopened cycles don't slip past your team.
The scenario
You run a research-development office at a university and your team chases grants across a dozen funders - NSF, NIH, private foundations, international bodies. Each funder has its own page listing open calls. Deadlines shift, new opportunities post, cycles reopen. Missing one is a six-figure mistake.
The same pattern fits high school and college counselors tracking scholarship deadlines for students, and nonprofit fundraising teams tracking foundation RFPs.
The problem
Funder websites are inconsistent. Some publish RSS, some publish nothing structured. Email digests are slow. Maintaining an internal spreadsheet of deadlines requires a person who pings sites manually - and the spreadsheet is always one update behind reality.
How Verid solves it
For funder pages that publish their calls in a structured way, a CSS selector grabs the deadline and call title cleanly. For pages where calls are listed in narrative prose ("our 2026 cycle opens June 1, with full proposals due September 12"), the prompt extractor reads the page and returns a structured deadline.
The predicate fires when any deadline or call title changes - both for genuinely new opportunities and for date shifts on existing ones.
Build the monitor
Extraction config - CSS for structured pages
{
"method": "css",
"fields": {
"latest_call_title": ".funding-call:first-child h3",
"latest_deadline": ".funding-call:first-child .deadline",
"open_calls_count": ".funding-list .count"
}
}
Extraction config - Prompt for narrative pages
{
"method": "prompt",
"prompt": "From this funder page, find the next-upcoming open call for proposals. Return: (1) the call title, (2) the application deadline as an ISO date, (3) the funding amount range as text.",
"schema": {
"call_title": "string",
"deadline": "string",
"funding_range": "string"
}
}
Predicate
{
"type": "composite",
"operator": "OR",
"conditions": [
{ "type": "field_changes", "field": "latest_call_title" },
{ "type": "field_changes", "field": "latest_deadline" }
]
}
A new call or a deadline shift on an existing call - both worth alerting on.
Create the monitor
curl -X POST https://api.verid.dev/v1/monitors \
-H "Authorization: Bearer vrd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "NSF - CISE division calls",
"url": "https://www.nsf.gov/cise/funding",
"schedule_interval_seconds": 86400,
"extract_config": {
"method": "prompt",
"prompt": "From this funder page, find the next-upcoming open call for proposals. Return: (1) the call title, (2) the application deadline as an ISO date, (3) the funding amount range as text.",
"schema": {
"call_title": "string",
"deadline": "string",
"funding_range": "string"
}
},
"diff_predicate": {
"type": "composite",
"operator": "OR",
"conditions": [
{ "type": "field_changes", "field": "call_title" },
{ "type": "field_changes", "field": "deadline" }
]
},
"deliveries": [
{ "type": "email", "to": "grants-office@example.edu" }
]
}'
SDK:
import { VeridClient } from '@verid.dev/sdk';
const client = new VeridClient({ apiKey: 'vrd_your_api_key' });
await client.monitors.create({
name: 'NSF - CISE division calls',
url: 'https://www.nsf.gov/cise/funding',
schedule_interval_seconds: 86400,
extract_config: {
method: 'prompt',
prompt:
'From this funder page, find the next-upcoming open call for proposals. Return: (1) the call title, (2) the application deadline as an ISO date, (3) the funding amount range as text.',
schema: {
call_title: 'string',
deadline: 'string',
funding_range: 'string',
},
},
diff_predicate: {
type: 'composite',
operator: 'OR',
conditions: [
{ type: 'field_changes', field: 'call_title' },
{ type: 'field_changes', field: 'deadline' },
],
},
deliveries: [{ type: 'email', to: 'grants-office@example.edu' }],
});
What the webhook delivers
{
"id": "del_01H...",
"fired_at": "2026-05-08T13:00:00Z",
"diff": {
"fields_changed": ["call_title", "deadline", "funding_range"],
"before": {
"call_title": "CISE Research Initiation Initiative (CRII)",
"deadline": "2026-08-15",
"funding_range": "$175,000 over two years"
},
"after": {
"call_title": "CISE Research Initiation Initiative (CRII) - 2027 Cycle",
"deadline": "2027-02-15",
"funding_range": "$175,000 over two years"
}
}
}
The 2026 cycle closed and the 2027 cycle just opened. Your grants office now has six months to plan submissions.
Caveats & tips
- One monitor per funder, not per call. A funder page typically lists multiple calls; your monitor tracks the page as a whole and surfaces changes. If a funder runs many parallel calls with truly independent timelines, you may want separate monitors per call URL.
- Daily interval is right. Funding cycles don't move minute-to-minute. Daily checks keep cost down and catch every meaningful update inside the same business day.
- Prompt extraction caches. If the page hasn't changed, the LLM call is skipped - Verid uses the page hash as a cache key. So watching twenty funders costs only as many LLM calls as actual page changes.
- Pair with a calendar feed. Push the webhook payload into a team calendar so the deadline shows up where everyone already looks.
Related use cases
For academic journal updates that often accompany grant cycles, see academic journal & paper updates. For government tenders and RFPs, see government contract & tender postings. For appointment-style slot tracking, see appointment & calendar slot availability.
Ship this monitor today
5 monitors free, no credit card. Set up takes about a minute.
Get started free