List individual grants
Individual grant rows — funder, recipient, amount, fiscal year, cause and the purpose text as filed. The graph traverses both ways: funder_id for everything a foundation funded, recip_id for every funder behind a nonprofit.
Request
- Base URL: https://data.useplinth.com
- URL: https://data.useplinth.com/api/v1/grants/transactions
- Auth: API key in header X-API-Key
Query parameters
EIN of the grantmaker. Any format — hyphens and missing leading zeros are normalized. Comma-separate for several.
EIN of the recipient organization. Same normalization as funder_id. Comma-separate for several.
Accepted for Candid compatibility. Only ein is valid — Candid's proprietary organization keys mean nothing here, so any other value is a 400 pointing at /api/search rather than a silently wrong filter.
Filing fiscal year. A single year, a comma-separated list, or a 2019-2023 range.
Lowest fiscal year to include (open-ended alternative to year).
Highest fiscal year to include.
Cause area of the RECIPIENT. Accepts an NTEE major-group letter (T), a full NTEE code (T31) or a cause label (Philanthropy); comma-separate for several. NOT a Candid PCS code — a PCS-shaped value is rejected rather than silently matching nothing. Only grants resolved to an EIN carry a classification, so this filter excludes unmatched grant lines (~33% of dollars).
Place filter. Whose place it is comes from location_type, which defaults to the RECIPIENT — so on /grants/funders, location=MA returns funders that gave TO Massachusetts, not funders based there (which is why a Seattle foundation can appear). Set location_type=funder for the other reading. How the value itself is read comes from geo_id_type (default: two-letter US state). Comma-separate for several.
How location is interpreted: state (default) | zip | city | county_fips | country. GeoNames ids are not resolved.
Whose geography location refers to: recipient (default) | funder | area_served. area_served means the funder demonstrably gives there — see the response note for exactly what it covers.
Recipient country for cross-border giving, as the FIPS-10-4 code the 990 foreign-address block carries (IN=India, UK=United Kingdom — NOT ISO).
Free-text keyword search over the grant's as-filed purpose text and the recipient's name. ⚠️ Purpose coverage varies sharply between filers — many report none at all, and for those funders this is a recipient-name search only, which a caller searching for a THEME will read as a real absence. Every response says so in x_plinth.warnings; check description on the rows to see which you got. Requires a narrowing filter — one of year, funder_id, recip_id, location, country, subject, funder_type or an amount range. There is no text index behind this, so an unnarrowed search reads every purpose string in the corpus and times out; narrowed, it typically returns in a few seconds. Sending it alone is a 400, immediately, rather than a timeout later.
Support strategy, derived from the filing's own purpose wording (general_operating, program, capital, endowment, scholarship, fellowship, research, capacity_building, matching, emergency_relief, equipment, sponsorship). Approximate by construction — it finds grants that SAY so.
private_foundation | public_charity | daf_or_passthrough. Separates institutional money from donor-advised pass-through.
Drop structurally distorting flows, comma-separated: daf | individuals | related_party. Nothing is excluded by default — together these are 50.9% of corpus dollars, so a total that omits them and a total that keeps them are different claims and the caller has to be the one making it. On /grants/summary, x_plinth.excluded prices each class against your own filter.
Set to 1/true to drop donor-advised-fund sponsors and other pass-through vehicles. Reach for this whenever you rank by dollars. DAF sponsors (Fidelity Charitable, Schwab Charitable, National Philanthropic Trust and similar) report enormous grant totals because money passes through them from individual donors — so any amount-ranked list is topped by them unless you say otherwise, which answers a different question from 'which foundations give the most'. Exactly equivalent to exclude=daf, and kept because the amount-ranked caveat names it; exclude= additionally drops the two distortions that survive it (grants to individuals, and transfers inside one economic entity).
Minimum grant amount, whole dollars.
Maximum grant amount, whole dollars.
Keep only rows whose recipient EIN carries x_plinth.match_prob at or above this value (0 to 1). Rows with no recipient EIN carry no probability and are excluded. ⚠️ Model-resolved rows top out near 0.965 (isotonic calibration only emits values it observed), so a threshold above that drops every model row while keeping the rule-resolved ones: it reads as a confidence cut and acts as a provenance filter, and the response says so in x_plinth.warnings. For provenance, say so with ein_source.
Keep only rows whose recipient EIN came from these resolution rules, comma-separated. Strongest first, with each rule's measured held-out precision: filed (0.995), override_human (0.99), override_keyerror (0.98), name (0.97), registry-dominant (0.97), fuzzy (0.961), override_llm (0.95), address (0.944), registry (0.944), zip (0.934), street (0.834), model (per-row, see match_prob). filed is the filer-stated subset, the one to use for anything load-bearing. Rows with no recipient EIN are excluded.
Filing jurisdiction of the GRANT: us (default) | ca. Never mixed — amounts stay in the currency the filing was made in and are never converted, so every total is a single-jurisdiction total. x_plinth.dataset names the source, licence and currency behind the answer. Distinct from country, which is where the RECIPIENT sits.
Set to 1/true to turn any unsupported or unusable parameter into a 400 instead of a warning. Use it in a migration test suite so a dropped filter fails loudly.
json (default) or xml.
NOT SUPPORTED. PCS population (who a grant benefits) is Candid-only classification work; 990 filings do not carry it and we do not infer it. Approximate with subject plus query, and expect lower precision.
NOT SUPPORTED. PCS transaction type. Effectively every row here is a cash grant as reported on Schedule I / Part XIV.
NOT SUPPORTED. There are no government grantmakers to include or exclude: this corpus is built from Form 990 filings, and government agencies do not file them. include_gov=false is therefore already the state of the data. Use /api/premier gov_funding, or the gov_funding_* tables over /api/sql, for money flowing FROM government.
NOT SUPPORTED. No per-row change timestamp. The dataset is versioned as a whole — read x_plinth.dataset on any response, or GET /api/meta, and re-sync when the build stamp moves.
NOT SUPPORTED. Candid/GuideStar profile participation level. Nothing equivalent exists outside Candid's own platform.
1-based page number. Default 1.
Maximum rows to return.
Sort field. amount and count are available everywhere; the name/geography fields vary by endpoint. An unavailable field is reported in x_plinth.warnings, never silently swapped.
asc or desc. Default desc.
Return a canned example instead of querying the corpus. Needs no API key and is not metered. 1 is the plain success case; list enumerates what each named case demonstrates. The organizations in an example are invented — only the shape is real.
Response
Grant lines matching the filter.
Changes
No recorded changes to this operation across all 1 revision of this API.