Grants

Aggregate totals for a filter

One call for the whole shape of a filter: total dollars, grant count, distinct funders and recipients, plus a year-by-year breakdown. Cheaper than paging the rows to count them.

get/api/v1/grants/summary

Request

  • Base URL: https://data.useplinth.com
  • URL: https://data.useplinth.com/api/v1/grants/summary
  • Auth: API key in header X-API-Key

Query parameters

funder_idstring nullable
Example:381675780

EIN of the grantmaker. Any format — hyphens and missing leading zeros are normalized. Comma-separate for several.

recip_idstring nullable

EIN of the recipient organization. Same normalization as funder_id. Comma-separate for several.

id_type'ein' nullable
Example:ein

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.

yearstring nullable
Example:2023

Filing fiscal year. A single year, a comma-separated list, or a 2019-2023 range.

min_yearstring nullable

Lowest fiscal year to include (open-ended alternative to year).

max_yearstring nullable

Highest fiscal year to include.

subjectstring nullable
Example:Human Services

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).

locationstring nullable
Example:MA

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.

geo_id_type'state' | 'zip' | 'city' | 'county_fips' | 'country' nullable
Example:state

How location is interpreted: state (default) | zip | city | county_fips | country. GeoNames ids are not resolved.

location_type'recipient' | 'funder' | 'area_served' nullable
Example:recipient

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.

countrystring nullable
Example:IN

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).

querystring nullable
Example:climate resilience

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.

supportstring nullable
Example:general_operating

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.

funder_type'private_foundation' | 'public_charity' | 'daf_or_passthrough' nullable

private_foundation | public_charity | daf_or_passthrough. Separates institutional money from donor-advised pass-through.

excludestring nullable
Example:daf,individuals,related_party

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.

exclude_dafstring nullable

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).

min_amtstring nullable

Minimum grant amount, whole dollars.

max_amtstring nullable

Maximum grant amount, whole dollars.

min_match_probstring nullable
Example:0.95

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.

ein_sourcestring nullable
Example:filed

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.

jurisdictionstring nullable
Example:us

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.

strictstring nullable

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.

format'json' | 'xml' nullable
Example:json

json (default) or xml.

populationstring nullable

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.

transactionstring nullable

NOT SUPPORTED. PCS transaction type. Effectively every row here is a cash grant as reported on Schedule I / Part XIV.

include_govstring nullable

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.

last_updatedstring nullable

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.

profile_levelsstring nullable

NOT SUPPORTED. Candid/GuideStar profile participation level. Nothing equivalent exists outside Candid's own platform.

example'1' | 'trial' | 'unsupported' | 'list'

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

Totals and a per-year breakdown over the whole filter.

codeinteger
messagestring required

Changes

No recorded changes to this operation across all 1 revision of this API.