The structured dataset behind The Grant Map
57,000+ home improvement grant, rebate, and forgivable-loan records across 2,200+ US cities, all 50 states and DC. That is about 23,000 distinct programs, roughly 19,000 of them local to a single city, plus the federal and state layer pre-mapped to every city. Every record is structured, categorized, bilingual (English and Spanish descriptions and amount labels; program names stay in English), and carries link-health provenance. Delivered over a simple REST API with key auth.
See tiers & buy →Try it now with no key: /api/sample (one full city) · /api/dataset/health (live coverage and link-health) · /openapi.json
What's inside
Per record: name, administering agency, dollar amounts and labels, eligibility type, income requirements, special populations (seniors, veterans, disabled), project types, funding status, deadlines, application URL and phone, plus Spanish translations of the descriptions and amount labels on every record (program names stay in their official English form). Each record also carries a freshness object: when we last checked its official link, whether that link resolved, and a confidence tier.
How we keep it current
Every official program URL is link-checked weekly; each record reports the date it was last checked and its link status, so you can filter to the live ones. Federal program amounts are normalized to the current fiscal year and enforced deterministically. Cities are re-verified on a rotating schedule, and a change-feed (/api/changes) records what each verification pass flips. We publish our own measured link-health numbers at /api/dataset/health: nothing hidden.
Bilingual, end to end
Every program description and amount label ships in English and Spanish on every record. Program names stay in their official English form (so they match the agency's own paperwork), and the dataset exposes the Spanish fields as description_es, maxAmountLabel_es, and the rest. We have not seen this depth of Spanish coverage in a comparable dataset. For lenders, counselors, and nonprofits serving low-income and immigrant homeowners, that is a built-in advantage you would otherwise pay to translate and maintain twice.
The API
JSON over HTTPS, authenticated with an X-Api-Key header. The city and program endpoints are the same ones our own site runs on, so they are exercised by real traffic every day. Full machine-readable contract: /openapi.json (OpenAPI 3.1) and /api/dataset/schema (JSON Schema for one record).
| Endpoint | Returns |
|---|---|
GET /api/sample | One full city, no key required, for evaluation |
GET /api/dataset/health | Live coverage counts and our own measured link-health, public |
GET /api/cities | Every covered city with population, location, and metadata |
GET /api/cities/counts | Cities with per-city program counts and the dataset total |
GET /api/programs/{city} | Every program for a city, filterable by category, eligibility, and project type |
GET /api/programs/{city}/{programId} | One program, full detail |
GET /api/programs/national | The deduped federal and state layer as a single canonical list |
GET /api/changes?since= | Change-feed: new programs, status flips, deadlines, and dead-link retirements |
curl -H "X-Api-Key: tgm_your_key" \ "https://www.thegrantmap.com/api/programs/des-moines"
Sample program record
{
"id": "investdsm-block-challenge",
"name": "Invest DSM Block Challenge Grant",
"source": "Invest DSM",
"maxAmount": 2500,
"maxAmountLabel": "Up to $2,500 per property",
"maxAmountLabel_es": "Hasta $2,500 por propiedad",
"matchRate": "50-75%",
"eligibilityType": ["homeowner"],
"incomeRequirement": "any",
"projectTypes": ["exterior", "windows"],
"fundingStatus": "available",
"deadline": "Monthly, last business day of each month",
"description": "5 to 19 households on the same block unlock matching
grants. 50% standard match, 75% if income-qualified.",
"description_es": "De 5 a 19 hogares en el mismo bloque desbloquean
subvenciones de contrapartida...",
"url": "https://investdsm.org/programs/block-challenge-grant/",
"phone": "515-221-8410",
"category": "home-repair",
"freshness": {
"linkStatus": "live",
"lastChecked": "2026-06-10",
"confidence": "link-verified"
}
}
The freshness object is our independent signal, separate from the program's own fundingStatus. For apply-now experiences, require freshness.linkStatus != "dead" and always surface the official url as the authority. The confidence tier tells you how much to lean on any one record, highest first: source-verified when we fetched the official page and a judge confirmed the program and its stated dollar amount (the confirming quote and the page amount are stored on the record as sourceEvidence and sourceVerifiedAmount); federal-canonical for normalized federal and state programs (the trustworthy core, maintained by hand); link-verified when the official link is live AND points at a specific program page; link-resolves-unverified when the official link works but is a generic agency landing page that does not itself confirm this program or its dollar amount; and unverified when the link is dead, bot-blocked, or unchecked. We do not pretend a live homepage proves a program.
Why license this instead of building it
The coverage nobody else has
DSIRE covers energy incentives. We cover the rest: roof and structural repair, accessibility, lead and healthy-homes, disaster mitigation, senior and veteran programs, property tax relief, plus the energy layer too. City, county, state, utility, and federal, in one schema.
White-label it
The data lives inside your product. Your users check grant eligibility in your loan flow, your counselor screen, your home dashboard, and never leave your platform. thegrantmap.com is the proof the data works, not a competitor for your users.
The build you skip
Compiling this corpus meant researching thousands of municipal, county, utility, and agency sources, normalizing every record to one schema, translating everything to Spanish, and wiring weekly change detection. That is a year of someone's job. The license is a rounding error against that.
Access tiers
Paid tiers check out online and your API key arrives by email within a minute of payment. No sales call required. Evaluating for a commercial use case? The lowest-risk path is the 3-month pilot below: embed the data, see it work in your own funnel, then convert to annual with the $1,500 credited.
| Tier | Rate limits | Pricing | Get started |
|---|---|---|---|
| Evaluation | 60 requests/min, 2,000/day | Free for 30 days, no card | Request a free key |
| Nonprofit / academic | 120 requests/min, 20,000/day | $2,000 per year ($1,500 charter rate for the first 15 nonprofit licensees, grandfathered) | |
| Commercial | 600 requests/min, 200,000/day | $9,000 per year ($6,000 charter rate for the first 15 commercial licensees, grandfathered). Annual prepay. |
The 3-month pilot is $1,500, credited toward the annual license if you convert within 30 days of pilot end: the recommended way to start commercial. Rate limits are soft caps: sustained overage starts an upgrade conversation, never a surprise invoice. Bulk flat-file delivery (a versioned, checksummed NDJSON snapshot) is available to licensees on request for teams that prefer a file to live API calls.
Checkout
You will finish payment on Stripe's secure checkout. Your API key is emailed to the address below the moment payment clears.
What we promise, and what we don't
Sourcing and freshness, stated plainly
Programs are compiled from official federal, state, county, city, and utility sources and normalized into one schema. The corpus is assembled with LLM-assisted enrichment and human review, not hand-entered, so treat it as a discovery layer, not a verified system of record. Every official URL is link-checked weekly and each record reports its link status and last-checked date in the freshness object; federal amounts are normalized to the current fiscal year. Programs open and close between cycles, so for apply-now flows filter on freshness.linkStatus != "dead" as well as fundingStatus, and always defer to the official URL.
Accuracy and reliance
Dollar figures and deadlines can lag statute or budget changes, and AI-assisted records can carry errors, which is why every record exposes a confidence tier and the official program URL. Your product must surface that official source to end users and treat it as authoritative for final eligibility and amounts. This is a discovery and routing layer, not a grant processor, and not legal or financial advice.
We measure this and publish it rather than asking you to take our word. In our most recent random, stratified 300-record fact-accuracy audit of the non-federal layer (June 2026), an independent check against each program's official page confirmed the program and its stated dollar amount in 14% of records, found a material discrepancy in 4%, and for the remaining records the official page was a general agency page that did not restate the figure (so it could neither confirm nor contradict). In other words, very little of the local layer is demonstrably wrong, but most amounts cannot be confirmed from the link alone, which is exactly why the official URL is authoritative and the federal layer (maintained separately) is the trustworthy core. The live breakdown is at /api/dataset/health.
We are not leaving it there. We now run a source-verification pass on a weekly rotation that fetches each non-federal program's official page, confirms the program and its dollar amount against it, and stamps the record so you can filter to the trustworthy slice with freshness.confidence == "source-verified". Amount corrections are reviewed against the page before they land, never auto-written, and every correction shows up in the /api/changes feed. As of the latest run, 7.4% of non-federal records are source-verified, and that share grows every week. The live number is published under sourceVerification at /api/dataset/health.
Continuity you can count on
Every annual license carries a written continuity commitment: 90 days notice before any shutdown, a pro-rata refund of the unused term, and a final full data snapshot that is yours to keep. The data survives the vendor. Availability target is 99.5% monthly on a best-effort basis (no penalty clause), and a keyed request that we cannot validate during an outage is served, not refused, so you never hard-fail on our infrastructure. No personal data flows through the API in either direction: it serves public-domain program data only, so there is nothing to audit.
License terms
Licenses cover use inside your product or service. Reselling or redistributing the raw dataset is not included (white-label and reseller arrangements are a separate agreement). Attribution ("Program data by The Grant Map") is required on user-facing surfaces. Full terms in our Terms, section 15.
Free evaluation key, or a custom deal
Want the free 30-day evaluation key, a white-label or reseller arrangement, or anything the tiers above don't cover? Tell us who you are and what you are building. Evaluation keys usually go out within one business day.