Skip to main content

Command Palette

Search for a command to run...

IRS Form 990 Data Fun

Published
3 min read

I made another web site.

I know. Anyway.

I was iced in my house the other day and started looking at grant money sent to organizations in my area using https://www.usaspending.gov/. It didn’t take long to find some amounts large enough to fire up my curiosity.

I went to the IRS site to find the 990 filings of the 501(c)(3) involved.

💡
Someone is yelling THERE ARE BETTER WAYS! Yeah, you’re probably right, and I’ll get to some of those.

Let’s pretend you were interested in say, EIN 74-2481167. This page lets you search by EIN or org name

https://apps.irs.gov/app/eos/

From there you may be able to download some number of PDFs for the 990s. I did this manually for a few years and decided I’d like an easy way to view officer compensation over time.

Form 990 Data at irs.gov

We obviously have the manual method above. I was hoping for was a way to programmatically access the data for an arbitrary EIN without trying to get the data out of PDFs. A few minutes of poking around and I see they were storing data at https://registry.opendata.aws/irs990/, but stopped in 2021 to use a different system.

I saw mentions of XML data which would be perfect, but this led me to a bulk downloads page

https://www.irs.gov/charities-non-profits/form-990-series-downloads

which has CSV index files that contain entires like

RETURN_ID,FILING_TYPE,EIN,TAX_PERIOD,SUB_DATE,TAXPAYER_NAME,RETURN_TYPE,DLN,OBJECT_ID,XML_BATCH_ID
22398228,EFILE,630809530,202312,2024,WALKER COUNTY HUMANE SOCIETY,990EZ,93492022012314,202410229349201231,2024_TEOS_XML_01A
22403064,EFILE,150406405,202312,2024,ONEONTA PLAINS CEMETERY ASSOCIATION INC,990,93493023009184,202430239349300918,2024_TEOS_XML_01A
22545368,EFILE,591086812,202312,2024,INTERNATIONAL ASSOCIATION OF MACHINISTS & AEROSPACE WORKERS,990EZ,93492016002694,202440169349200269,2024_TEOS_XML_01A
22352128,EFILE,920908632,202309,2024,BEN AND EMMA FOUNDATION,990PF,93491018007244,202440189349100724,2024_TEOS_XML_01A

where the XML_BATCH_ID points to a zip of data.

Eh, that’s something, but more work than I’d really want to do to find 990s for a given EIN across all available years.

ProPublica

They have a lot of this data and already surface some of the info I want. Using our example EIN

https://projects.propublica.org/nonprofits/organizations/742481167

While they do have executive compensation, it’s by year though and not quite what I was hoping to see for showing compensation for a given title or name over time. The page does have links to download XML for individual filings.

They have an API!

https://projects.propublica.org/nonprofits/api

But after examining the response for our EIN (https://projects.propublica.org/nonprofits/api/v2/organizations/742481167.json) I wasn’t seeing a way to get the compensation from each filing.

GivingTuesday

I was losing interest until I saw this.

https://990data.givingtuesday.org/

The have an API described here https://990data.givingtuesday.org/asset-bank/

I can get all the available efiled XML data by EIN with https://990-infrastructure.gtdata.org/irs-data/efilexml?ein=742481167

excerpt

{
  "statusCode": 200,
  "headers": {
    "content-type": "application/json"
  },
  "body": {
    "query": "742481167",
    "no_results": 12,
    "results": [
      {
        "id": 3902495,
        "BuildTs": "2023-04-26 12:10:37Z",
        "DAF": "False",
        "DateSigned": "2023-03-15",
        "DocStatus": "AmendedReturn",
        "EIN": "742481167",
        "FileSha256": "9861386fe9566f7827daace852c0ac4b5f56176742dd53635e51531fb3329420",
        "FileSizeBytes": "100174",
        "FormType": "990",
        "GrossReceipts": "588330343",
        "GroupAffiliatesIncluded": null,
        "GroupExemptionNumber": null,
        "GroupReturnForAffiliates": "False",
        "IndexedOn": "2023-11-19",
        "LegalDomicileCountry": null,
        "LegalDomicileState": "TX",
        "ObjectId": "202300789349300000",
        "OrgType": "Corp",
        "OrganizationName": "SOUTHWEST KEY PROGRAMS INC",
        "ReturnTs": "2023-03-18T20:36:33-05:00",
        "ReturnVersion": "2020v4.2",
        "SubmittedOn": "2023-03-15",
        "TaxPeriod": "2021-08-31",
        "TaxPeriodBeginDate": "2020-09-01",
        "TaxPeriodEndDate": "2021-08-31",
        "TaxStatus": "501c3",
        "TaxYear": "2020",
        "TotalAssetsBkEOY": "203106056",
        "TotalExpensesCY": "545209215",
        "TotalLiabilitiesBkEOY": "75119855",
        "TotalNetAssetsBkEOY": "127986201",
        "TotalRevenueCY": "588318167",
        "URL": "https://gt990datalake-rawdata.s3.amazonaws.com/EfileData/XmlFiles/202300789349300000_public.xml",
        "Website": "WWW.SOUTHWESTKEY.ORG",
        "YearFormed": "1987",
        "ZipFile": null
      },

and the URL points to the XML with the filing data I want.

Great, What’d You Make?

https://c-three-explorer.vercel.app

ProPublica does seem to have some more recent data than GivingTuesday, but my site puts the org’s financials over time and executive compensation by name or title over time easier to quickly see.