{"code":200,"message":"Request was processed successfully!","dataset":{"source":"IRS Form 990, 990-EZ and 990-PF e-file filings (public domain)","refresh":"monthly — the IRS e-file release cycle","polled":"every 15 minutes (IRS e-file releases only; see compliance_sources for the screens)","reporting_lag":"The IRS releases e-file data 12-24 months after the activity, so every figure is dated to its fiscal year rather than to today.","basis":"Grants PAID in the fiscal year, as reported on Form 990-PF Part XV and Form 990 Schedule I — not grants approved or announced. A funder's own published figure is usually commitments MADE, so a multi-year commitment lands here across the years it pays out and the two series will not match year by year. Neither is wrong; they measure different things. Compare multi-year totals rather than single years.","version":"20260824T1203Z","generated_at":"2026-08-24 12:03:50"},"scope":{"grants":19815119,"total_amount":1817310940562,"funders":210881,"first_fiscal_year":2017,"last_fiscal_year":2026,"last_complete_fiscal_year":2023,"partial_fiscal_years":[2024,2025,2026]},"trial":{"note":"A key needs no account: POST /api/v1/agent-key, answer the three calls it arrives locked to, and it unlocks. Every year of the corpus is readable; what is small is the row cap and the budget, and the budget refills each time you answer another challenge.","mint":"https://data.useplinth.com/api/v1/agent-key","compliance_screens_included":1,"compliance_withheld_fields":["compliance.ofac_sanctions_screen.potential_matches","compliance.ofac.potential_matches","compliance.irb_screen.potential_matches","compliance.state_registration.california.registry_records","compliance.state_registration.california.ftb_records","compliance.group_exemption.parent_organizations","compliance.pub78.organization_types","compliance.bmf_financials","compliance.reliance.elements","sources"]},"compliance_sources":{"irb":{"fetched_at":"2026-08-22","revised":null,"revised_newest":null,"url":"https://www.irs.gov/irb","row_count":1456,"is_current":null,"upstream_revised":null,"upstream_checked_at":null,"publishes":"weekly","polled":"daily"},"ca_registry":{"fetched_at":"2026-08-25","revised":"2026-08-19","revised_newest":null,"url":"https://oag.ca.gov/charities/reports","row_count":557210,"is_current":true,"upstream_revised":"2026-08-19","upstream_checked_at":"2026-08-25T08:13:13+00:00","publishes":"monthly (third Wednesday)","polled":"daily"},"bmf":{"fetched_at":"2026-08-21","revised":"2026-08-10","revised_newest":null,"url":"https://www.irs.gov/charities-non-profits/exempt-organizations-business-master-file-extract-eo-bmf","row_count":1957340,"is_current":true,"upstream_revised":"2026-08-10","upstream_checked_at":"2026-08-25T14:32:27+00:00","publishes":"monthly","polled":"every 15 minutes"},"pub78":{"fetched_at":"2026-08-21","revised":"2026-08-11","revised_newest":null,"url":"https://apps.irs.gov/pub/epostcard/data-download-pub78.zip","row_count":1412318,"is_current":true,"upstream_revised":"2026-08-11","upstream_checked_at":"2026-08-25T14:32:27+00:00","publishes":"monthly","polled":"every 15 minutes"},"revocation":{"fetched_at":"2026-08-21","revised":"2026-08-11","revised_newest":null,"url":"https://apps.irs.gov/pub/epostcard/data-download-revocation.zip","row_count":1246171,"is_current":true,"upstream_revised":"2026-08-11","upstream_checked_at":"2026-08-25T14:32:27+00:00","publishes":"monthly","polled":"every 15 minutes"},"ca_ftb":{"fetched_at":"2026-08-21","revised":"2026-08-19","revised_newest":null,"url":"https://www.ftb.ca.gov/file/business/types/charities-nonprofits/Revoked-list-combined.csv","row_count":70222,"is_current":true,"upstream_revised":"2026-08-19","upstream_checked_at":"2026-08-25T14:32:27+00:00","publishes":"weekly","polled":"every 15 minutes"},"ofac":{"fetched_at":"2026-08-24","revised":"2026-08-24","revised_newest":null,"url":"https://ofac.treasury.gov/sanctions-list-service","row_count":41049,"is_current":true,"upstream_revised":"2026-08-24","upstream_checked_at":"2026-08-25T14:32:27+00:00","publishes":"irregularly, often several times a week","polled":"every 15 minutes","caveat":"We track Treasury's published sanctions files within ~15 minutes of their republication. A designation is effective before the flat files carry it, so for a screen at the moment of disbursement check sanctionssearch.ofac.treas.gov, which is the live index."}},"compliance_reports":{"format":"1.0","signing":{"algorithm":"Ed25519","key_id":"3620823ecfbf6f13","public_key":"Zp/gBby+syxnXRFATe2fMARZ2reDiG+NLRwf3I91z9s=","verify":"https://data.useplinth.com/api/v1/screening/verify","note":"A detached signature over the report data, not an X.509/PAdES PDF signature — a PDF reader shows no signature panel."}},"candid_compatibility":{"source":"Read from Candid's published documentation at developer.candid.org as of 2026-08-14. Both services read the same public source: IRS Form 990 e-file filings.","as_of":"2026-08-14","endpoints":[{"candid":"GET /grants/v1/transactions","plinth":"GET /api/v1/grants/transactions","status":"equivalent","note":"Individual grant rows. Same four-resource model."},{"candid":"GET /grants/v1/funders","plinth":"GET /api/v1/grants/funders","status":"equivalent","note":"Funder-side aggregates."},{"candid":"GET /grants/v1/recipients","plinth":"GET /api/v1/grants/recipients","status":"equivalent","note":"Recipient-side aggregates."},{"candid":"GET /grants/v1/summary","plinth":"GET /api/v1/grants/summary","status":"equivalent","note":"Totals for a filter, plus a by_year breakdown Candid has no counterpart for."},{"candid":"POST /essentials/v4","plinth":"POST /api/v1/essentials","status":"equivalent","note":"Nonprofit SEARCH. Accepts Candid's search_terms / from / size / filters / sort body shape; the filter vocabulary differs (see the essentials matrix). GET /api/essentials/{ein} remains the single-record lookup."},{"candid":"GET /premier/v4/{ein}","plinth":"GET /api/v1/premier/{ein}","status":"transformed","note":"Same concept, different depth. Filing-derived financials, geography, grantmaking, funders and (Pro) governance roster; no nonprofit-supplied profile, DEI or impact data. The response names what is absent under x_plinth.not_available."},{"candid":"GET /charitycheck/v1/{ein}","plinth":"GET /api/v1/screening/{ein}","status":"transformed","note":"Same IRS sources (BMF, Pub 78, auto-revocation), every code decoded, plus the three screens Charity Check also runs: OFAC (SDN AND Consolidated, primary AND alias names, where Candid screens the SDN list), the Internal Revenue Bulletin §170 deletion announcements, and California registration (AG Registry + FTB revoked list). `compliance.reliance` additionally carries the Rev. Proc. 2018-32 §8.01 elements element by element — including the EO BMF Extract revision date and whether it is the current one — and flags the §6.02 and §6.03 cases where reliance does not apply at all. A screen whose source is unavailable reports `not screened`, never `clear`."},{"candid":"Charity Check Bulk (≤25 EINs)","plinth":"POST /api/v1/screening/bulk","status":"plinth","note":"Same idea, 100 EINs per call rather than 25."},{"candid":"Charity Check PDF","plinth":"GET /api/v1/screening/{ein}?format=pdf","status":"transformed","note":"A one-page retainable report carrying the Rev. Proc. 2018-32 §8.01(1) elements, every screen with whether it ran, and the revision date of each source file. Rendered from the same response object the JSON route returns, so the document and the API cannot disagree. Where the IRS files conflict it names the governing section rather than picking a side — a revocation record beside a current listing is §4.06, and the report prints the dates the comparison turns on plus the steps to settle it against the determination letter, which is in no bulk extract. Every report carries an identifier, a format version and, where a signing key is configured, an Ed25519 signature; `POST /api/screening/verify` checks a retained one and is keyless. §8.01(2) puts retention on the grantor. Paid keys only."},{"candid":"Charity Check California","plinth":"GET /api/v1/screening/{ein} → state_registration.california","status":"transformed","note":"Covered, from the same two state sources: the AG's Registry of Charitable Trusts (may it solicit; is its reporting current) and the Franchise Tax Board's revoked list (has California revoked its exemption, whatever the IRS says). Returned inline on the compliance record rather than as a separate endpoint. California only — no other state registry is screened."},{"candid":"Taxonomy API (PCS)","plinth":null,"status":"unsupported","note":"PCS is Candid's proprietary taxonomy. We classify on NTEE, which is the IRS's and is public."},{"candid":null,"plinth":"POST /api/v1/sql","status":"plinth","note":"Read-only SQL over the whole warehouse."},{"candid":null,"plinth":"GET /api/v1/search","status":"plinth","note":"Name → EIN resolution, keyless and unmetered, including semantic matching."},{"candid":"Charity Check IRB screen","plinth":"GET /api/v1/screening/{ein} → irb_screen","status":"transformed","note":"Internal Revenue Bulletin §170 deletion announcements, read from the bulletins themselves. Name/city/state only — the announcements carry no EIN — so it is a name match, and `covers_through` names the newest bulletin read so a 'clear' result has a date attached. An IRB listing is a diligence flag, not a determination, and the response says so."},{"candid":null,"plinth":"POST /api/v1/screening/verify","status":"plinth","note":"Checks a retained compliance report: recomputes its identifier, verifies its signature against the published Ed25519 key, and reports whether the format version it was issued under is still current. Keyless and unmetered — confirming a filed document should not spend a screen, and the auditor doing the checking is the person least likely to hold a key. An unverifiable signature reports null, never false."}],"grant_parameters":[{"candid":"funder_id","plinth":"funder_id","status":"equivalent","note":"EIN. Any format — hyphens and missing leading zeros are normalized. Comma-separate for several."},{"candid":"recip_id","plinth":"recip_id","status":"equivalent","note":"EIN, same normalization. Comma-separate for several."},{"candid":"id_type","plinth":"id_type","status":"transformed","note":"Only `ein` is accepted; Candid's proprietary organization keys have no meaning here. Any other value is rejected with a pointer to /api/search, never silently mis-filtered."},{"candid":"year","plinth":"year","status":"equivalent","note":"Fiscal year. Comma-separated lists and `2019-2023` ranges are both accepted."},{"candid":"subject","plinth":"subject","status":"transformed","note":"SAME NAME, DIFFERENT TAXONOMY — the single most dangerous parameter in a migration. Candid's `subject` is a PCS code; ours is NTEE. We accept an NTEE major letter (`T`), a full NTEE code (`T31`), or the cause label (`Philanthropy`), and reject anything shaped like a PCS code rather than returning a plausible wrong answer."},{"candid":"location","plinth":"location","status":"transformed","note":"Candid takes a GeoNames id; we take a US state code by default, or a ZIP, city, county FIPS or country code when `geo_id_type` says so. Comma-separate for several."},{"candid":"geo_id_type","plinth":"geo_id_type","status":"transformed","note":"Candid's value is `geonameid`. Ours selects how `location` is read: state | zip | city | county_fips | country. GeoNames ids are not resolved."},{"candid":"location_type","plinth":"location_type","status":"equivalent","note":"recipient (default) | funder | area_served — the same three geographies Candid distinguishes, resolved from what the filings carry. Note the semantics of `area_served`: it selects FUNDERS whose giving reaches the place (their grant footprint, unioned with any service area we resolved from their filing and website) and returns all of their grants, including ones made elsewhere — the 'who funds work here, and what else do they do' question. For grants landing IN a place use location_type=recipient. Candid's area_served is a grant-level declared facet, so the two sets will differ; every response using it says so."},{"candid":"min_amt","plinth":"min_amt","status":"equivalent","note":"Whole dollars."},{"candid":"max_amt","plinth":"max_amt","status":"equivalent","note":"Whole dollars."},{"candid":"query","plinth":"query","status":"equivalent","note":"Free-text keyword search. Matches the grant's as-filed purpose text and the recipient name. Candid searches its own curated description field, so recall differs even though the parameter is the same."},{"candid":"sort_by","plinth":"sort_by","status":"transformed","note":"amount, year (Candid's `year_issued` is accepted as an alias), count, funder_name, funder_state, recip_name, recip_state — whichever the endpoint can order by. An unsupported field is reported, not silently swapped."},{"candid":"sort_order","plinth":"sort_order","status":"equivalent","note":"asc | desc."},{"candid":"page","plinth":"page","status":"equivalent","note":"1-based."},{"candid":"format","plinth":"format","status":"equivalent","note":"json (default) | xml, as Candid's Grants endpoints offer."},{"candid":"include_gov","plinth":"include_gov","status":"unsupported","note":"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."},{"candid":"population","plinth":null,"status":"unsupported","note":"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."},{"candid":"transaction","plinth":null,"status":"unsupported","note":"PCS transaction type. Effectively every row here is a cash grant as reported on Schedule I / Part XIV."},{"candid":"last_updated","plinth":null,"status":"unsupported","note":"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."},{"candid":"profile_levels","plinth":null,"status":"unsupported","note":"Candid/GuideStar profile participation level. Nothing equivalent exists outside Candid's own platform."},{"candid":null,"plinth":"limit","status":"plinth","note":"Page size up to 1,000, against Candid's fixed 25."},{"candid":"support","plinth":"support","status":"transformed","note":"Candid's `support` takes a PCS support-strategy CODE; ours takes a label derived from the filing's own purpose text (see supportStrategies). Same parameter NAME, different vocabulary — exactly what `transformed` means here: the caller must convert the value. Recall-oriented and openly approximate: it finds grants whose stated purpose says so, not a licensed classification."},{"candid":null,"plinth":"country","status":"plinth","note":"Recipient country for cross-border giving, as the FIPS-10-4 code the 990 foreign-address block carries (India='IN', United Kingdom='UK')."},{"candid":null,"plinth":"funder_type","status":"plinth","note":"private_foundation | public_charity | daf_or_passthrough — separates institutional money from donor-advised pass-through."},{"candid":null,"plinth":"exclude","status":"plinth","note":"Drop structurally distorting flows, comma-separated: `daf` (donor-advised and pass-through conduits), `individuals` (grants to people rather than organizations — patient assistance, scholarships, disaster relief), `related_party` (transfers inside one economic entity — an endowment trust paying its foundation, a supporting organization paying its parent). Together about half of corpus dollars — the exact share is recomputed per rebuild (pipeline/candid_compat.EXCLUDE_SHARE_OF_DOLLARS) because it moves with related_edge; it read 43.7% here while the live service answered 50.9%. Nothing is excluded by default. A total that drops them and a total that keeps them are different claims, so the caller makes it; `x_plinth.excluded` reports what each class cost against your own filter. This is the superset of `exclude_daf`, and the only way to drop the two distortions that survive it — both of which the amount-ranked caveat names."},{"candid":null,"plinth":"exclude_daf","status":"plinth","note":"Drop donor-advised-fund sponsors and other pass-through vehicles. Exactly equivalent to `exclude=daf` and folded into the same filter, kept because it is the parameter the amount-ranked caveat names and the one a caller will already have found in the docs. Reach for it whenever you rank by dollars: sponsors report enormous totals because money passes through them from individual donors, so an amount-ranked list is topped by them unless you say otherwise. Use `exclude=` when you also want the in-kind and related-entity distortions dropped."},{"candid":null,"plinth":"min_year / max_year","status":"plinth","note":"Open-ended fiscal-year bounds."},{"candid":null,"plinth":"strict","status":"plinth","note":"strict=1 turns any unsupported or unrecognized parameter into a 400 instead of a warning — the setting to use in a migration test suite so a dropped filter fails loudly. It does NOT fire on caveats (a filter we applied correctly and are being honest about, like `support` being text-derived): 400ing on those would make strict unusable, teams would switch it off, and they would stop seeing the warnings that do matter. `x_plinth.warnings` carries `severity` so you can tell them apart; `x_plinth.unsupported` lists only the fatal ones."}],"essentials_filters":[{"candid":"search_terms","plinth":"search_terms","status":"equivalent","note":"Organization name / keyword search. `mode: semantic` additionally matches on mission meaning."},{"candid":"from / size","plinth":"from / size","status":"equivalent","note":"size up to 1,000, against Candid's 25."},{"candid":"filters.geography.state","plinth":"state","status":"equivalent","note":"Two-letter code, or a comma-separated list."},{"candid":"filters.geography.city / zip","plinth":"city / zip","status":"equivalent","note":"From the BMF address."},{"candid":"filters.financials revenue / assets / expenses ranges","plinth":"min_revenue / max_revenue / min_assets / max_assets / min_expenses / max_expenses","status":"equivalent","note":"From the organization's own latest filing rather than Candid's compiled figures."},{"candid":"filters.organization.subject (PCS)","plinth":"cause / ntee","status":"transformed","note":"NTEE major group or code, not PCS."},{"candid":"filters.organization.pub78_verified","plinth":"pub78_verified","status":"equivalent","note":"Present on the current Publication 78 list."},{"candid":"filters.organization.form_types","plinth":"return_type","status":"equivalent","note":"990 | 990EZ | 990PF | 990T."},{"candid":"filters.organization.profile_level","plinth":null,"status":"unsupported","note":"Candid platform metadata."},{"candid":"filters.organization.demographics","plinth":null,"status":"unsupported","note":"Nonprofit-supplied demographic data is Candid's Demographics API."},{"candid":null,"plinth":"subsection","status":"plinth","note":"501(c) subsection code, e.g. 03."},{"candid":null,"plinth":"foundation_type","status":"plinth","note":"PC | PF | POF | SO — the IRS foundation classification."},{"candid":null,"plinth":"revoked","status":"plinth","note":"Filter on IRS automatic-revocation status."},{"candid":null,"plinth":"min_grants_paid","status":"plinth","note":"Only organizations that actually make grants at some scale."}],"support_strategies":[{"id":"general_operating","label":"General operating support","description":"Unrestricted funding for the organization's day-to-day work."},{"id":"program","label":"Program support","description":"Funding earmarked for a named program or project."},{"id":"capital","label":"Capital support","description":"Buildings, renovation, land and other capital projects."},{"id":"endowment","label":"Endowment","description":"Gifts to endowment or a permanently restricted fund."},{"id":"scholarship","label":"Scholarships and student aid","description":"Scholarships, tuition assistance and student awards."},{"id":"fellowship","label":"Fellowships and prizes","description":"Fellowships, residencies, prizes and individual awards."},{"id":"research","label":"Research","description":"Research, evaluation and study."},{"id":"capacity_building","label":"Capacity building","description":"Organizational strengthening, technical assistance, training."},{"id":"matching","label":"Matching and challenge grants","description":"Grants conditioned on funds raised elsewhere, including employee-match programs."},{"id":"emergency_relief","label":"Emergency and disaster relief","description":"Disaster response, emergency and humanitarian relief."},{"id":"equipment","label":"Equipment and technology","description":"Purchase of equipment, vehicles or technology."},{"id":"sponsorship","label":"Sponsorship and events","description":"Event sponsorship, galas, table purchases and memberships."}],"response_compat":{"default":"json","note":"By default this API returns JSON-native types: booleans are `true`/`false`. Pass `compat=<mode>` on a compliance endpoint to match another vendor's rendering. A compat mode changes REPRESENTATION only — never a value, a field name, or which organizations are returned.","modes":{"legacy_strings":{"booleans_as_strings":["conflict","in_bmf","pub78_verified","revoked","screened"],"string_case":"TitleCase","note":"Emit the shapes Candid's Essentials v4 / Premier v4 (charitycheck branch) emit, so an existing integration can point at Plinth without touching its parsing."}}}}}