Smart grant opportunity matching for nonprofits, research labs, and anyone chronically buried under grants.gov.
Describe your organization's mission → get daily or weekly alerts for matching federal funding opportunities. No API key needed.
| Feature | Details |
|---|---|
| Mission profile | Describe your org once — keywords, focus areas, eligibility |
| Smart matching | Scores every open opportunity against your mission |
| New-only alerts | Remembers what you've seen; only surfaces fresh matches |
| Slack alerts | Posts rich blocks to any Slack channel via incoming webhook |
| Webhook alerts | Fires a JSON payload to any HTTP endpoint |
| Email alerts | Sends via SMTP (Gmail, Sendgrid, etc.) |
| CLI | Pipe-friendly --json output for scripting and cron jobs |
All data comes from the free, public grants.gov search API — no registration required.
pip install grant-radar
# Create your mission profile
grant-radar init \
--name "Ocean Trust" \
--mission "protecting ocean ecosystems and marine biodiversity" \
--keywords "ocean,marine,coral,coastal,fisheries" \
--org-type nonprofit
# Scan for matching opportunities
grant-radar scan
# Send new matches to Slack
grant-radar scan --slack https://hooks.slack.com/services/...
# Send to any webhook (Zapier, Make, n8n, etc.)
grant-radar scan --webhook https://your-endpoint.com/grants
# Pipe JSON output to jq, scripts, etc.
grant-radar scan --json | jq '.[].title'Create or update your mission profile.
grant-radar init \
--name "Sunrise Health Clinic" \
--mission "expanding primary healthcare access in rural communities" \
--keywords "rural health,community clinic,FQHC,underserved" \
--org-type nonprofitOrg types: nonprofit · university · government · tribal · small_business · individual · any
The profile is saved at ~/.grant-radar/profile.json. Pass --profile <path> to use a different location (useful for managing multiple profiles).
Search grants.gov and surface new matches.
# Default: print to terminal, only new opportunities
grant-radar scan
# Include previously seen opportunities
grant-radar scan --all
# Tune the match threshold (0–1, default 0.05)
grant-radar scan --threshold 0.1
# Send to Slack
grant-radar scan --slack $SLACK_WEBHOOK_URL
# Send JSON webhook
grant-radar scan --webhook https://n8n.example.com/webhook/grants
# Machine-readable output
grant-radar scan --jsonAd-hoc search without a profile.
grant-radar search "rural broadband"
grant-radar search "maternal health equity" --rows 20 --jsonPrint the current profile and its extracted search terms.
0 8 * * * /usr/local/bin/grant-radar scan --slack $SLACK_WEBHOOK_URLon:
schedule:
- cron: "0 8 * * *"
jobs:
scan:
runs-on: ubuntu-latest
steps:
- run: pip install grant-radar
- run: grant-radar scan --slack ${{ secrets.SLACK_WEBHOOK_URL }}
env:
HOME: /rootgrant-radar scan --profile ~/.grant-radar/health.json --store ~/.grant-radar/health-seen.json --slack $HEALTH_TEAM_WEBHOOK
grant-radar scan --profile ~/.grant-radar/env.json --store ~/.grant-radar/env-seen.json --slack $ENV_TEAM_WEBHOOK- The mission text and keywords are tokenized into search terms.
- Each term is searched independently against grants.gov (parallel requests).
- Results are deduplicated by opportunity ID.
- Each opportunity is scored by how many of your terms appear in its title and agency name.
- Results are ranked by score, filtered by threshold, and filtered to only new IDs (not in
seen.json).
No LLM, no embeddings — fast, offline-capable, deterministic. If you want semantic matching, you can preprocess the mission with an LLM to expand keywords before running init.
git clone https://github.com/stark256-spec/grant-radar
cd grant-radar
pip install -e ".[dev]"
pytest tests/ -vgrants.gov — the official U.S. federal grants portal. Free, public, no API key required.
MIT