Sources checked 2026-08-25
How does our compliance screen work?
Before a foundation writes a cheque, it needs to know whether the organization on the other end is still a charity. Has the IRS revoked it. Is it on a sanctions list. Can a donor still deduct the gift.
The files that answer those questions are public. The IRS publishes three of them, Treasury publishes the sanctions lists, and California publishes two more. Our job is to look one EIN up in all of them at once, decode the codes a human would otherwise have to look up, and admit it when a file was missing rather than treating a gap as a clean result.
It sounds useful to say we screened an organization. That sentence hides three different situations. Some of the files join on an EIN, so a miss is a miss. Some of them publish no identifier at all, so a miss is a name that didn’t match. And some of them are simply not on disk this month. Collapsing those into one boolean is how a grantmaker disburses on a check that never ran.
Here’s a better approach: first, which files can be joined exactly? Then, of the ones that can only match a name, what can they actually say? Then: what does the response do when a file is missing?
Two kinds of file
Three IRS files already carry the EIN: the Business Master File, Publication 78, and the Auto-Revocation List. Looking an organization up in those is a join, not a guess. If the EIN is there, we have it. If it isn’t, it isn’t.
The others publish names. OFAC, the Internal Revenue Bulletin, and California’s Franchise Tax Board list carry no EIN, so they can only be matched against the organization’s primary IRS name. California’s Registry of Charitable Trusts is the in-between case: EIN where the registry has one, name otherwise.
A name screen can collide on a common name, and it can miss a grantee that operates under a name the IRS does not hold. Rev. Proc. 2018-32 §6.01 draws the same line for reliance itself: it reaches the official or recognized popular name, and no further. We treat a hit as a prompt to look, and a clear result as one signal rather than a clearance.
The three IRS files join on EIN. Status, deductibility and revocation are exact lookups, decoded from the IRS code books. An unknown code maps to null rather than a guess: a wrong foundation type on this endpoint ends a meeting, a blank is merely thin.
The name screens match a normalized form of the primary BMF name against every name the source publishes, including OFAC aliases. Punctuation is stripped because the files punctuate differently (“St. Mary’s Fund” versus “ST MARYS FUND”) and a raw match misses on the apostrophe alone.
If a file is not staged, that screen reports not screened. It never reports clear. These are seven files from four agencies on four schedules; one of them will be unavailable some month, and a caller who reads an unavailable source as a clean result disburses money on a check that never ran.
The seven files
Four agencies, seven public-domain extracts. Equal width below because the interesting split is how we join, not how large the file is.
- Exempt Organizations Business Master FileJoined on EIN
IRS. Exemption status, foundation type under §509(a), deductibility, filing requirement, affiliation, ruling date.
1,957,340 rows · oldest file revised 2026-08-10 · polled every 15 minutes · publishes monthly
- Publication 78Joined on EIN
IRS. Whether contributions to this EIN are listed as deductible.
1,412,318 rows · oldest file revised 2026-08-11 · polled every 15 minutes · publishes monthly
- Auto-Revocation ListJoined on EIN
IRS. Whether the exemption was automatically revoked under §6033(j), and whether a reinstatement date is recorded.
1,246,171 rows · oldest file revised 2026-08-11 · polled every 15 minutes · publishes monthly
- OFAC sanctions listsName only
Treasury. Whether the organization's primary IRS name appears on the SDN or Consolidated lists, including aliases.
41,049 rows · oldest file revised 2026-08-24 · polled every 15 minutes · publishes irregularly, often several times a week
- Internal Revenue BulletinName only
IRS. Whether a §170 deletion announcement has named this organization. A listing is a diligence flag, not a fail.
1,456 rows · pulled 2026-08-22 · polled daily · publishes weekly
- California Registry of Charitable TrustsEIN, then name
CA Attorney General. Whether it may solicit in California, and whether its reporting is current. EIN where the registry has one, name otherwise.
557,210 rows · oldest file revised 2026-08-19 · polled daily · publishes monthly (third Wednesday)
- California FTB revoked listName only
CA Franchise Tax Board. Whether California has revoked the state exemption, whatever the IRS says. Name and city; the list carries no EIN.
70,222 rows · oldest file revised 2026-08-19 · polled every 15 minutes · publishes weekly
Dates and row counts come from the same compliance_sources table every screen response publishes, so they move when the files move. Two sources, the IRB and the California AG registry, have no Last-Modified for a poller to ask, so they keep a daily job; the rest follow whatever cadence the table currently reports.
What each screen actually answers
Everything above is reference data. The endpoint folds it into four screens, each with its own severity, because they answer different questions and usefully disagree.
Federal status
From the BMF and Publication 78, returned as descriptions rather than raw codes: exemption subsection, foundation classification with its §509(a) paragraph, deductibility, exempt status, ruling date, filing requirement, legal form, affiliation, NTEE. Group subordinates are resolved to their central organization. The Auto-Revocation List is reported with its revocation, posting and reinstatement dates, so a reinstated organization does not read as revoked.
Where the BMF shows an active 501(c)(3) and Pub 78 does not list the EIN, that comes back as a needs-review flag with the reason, not a boolean that picks a side. The two files refresh on different schedules and do diverge. A church that never has to file is flagged by its filing requirement, so “no 990 on file” does not read as a red flag for an organization the Code never asked to file.
OFAC
Four files, not one. SDN and Consolidated, primary names and AKA/FKA/NKA aliases. Screening SDN primary names alone is how a listed entity operating under another name passes clean, and the Consolidated list (sectoral sanctions, foreign sanctions evaders) is a separate extract again. The response names which of the four it actually reached. Entity records only: a sanctioned officer or trustee is not screened here.
Internal Revenue Bulletin
The §170 “Deletions From Cumulative List of Organizations” announcements, read from the weekly bulletins. A listing is a flag for further diligence, not a fail: the IRS generally does not disallow contributions made on or before the announcement date, and the response says so rather than leaving a caller to infer severity from the fact that we reported it. covers_through names the newest bulletin actually read, so a clear result has a date attached.
California
Two state sources that answer different questions. The Attorney General’s Registry of Charitable Trusts: may it solicit here, and is its reporting Current, Delinquent, Suspended or Revoked. The Franchise Tax Board’s revoked list: has California revoked its exemption, whatever the IRS says, which is the case a grantmaker screening only the federal auto-revocation list misses.
The halves are tracked separately. One being unavailable reports partially screened rather than a clean result. Absence from the registry is reported as absence, not as an adverse finding: an organization that never operated in California is simply not there. An unrecognized status is sent for review with its raw value rather than forced into current or adverse.
When a file is missing
A screen whose source could not be read reports screened: false and status: "not screened". It never reports clear. The same rule shapes the ingest: a failed source is skipped without exporting its table, so the published copy stays visibly stale rather than being blanked.
Only the first governs whether a screen ran. A source that is readable but whose currency could not be confirmed is still screened, and its result stands. sources[*]carries the pull date, the publisher’s revision date, and is_current, so an unverified date weighs an answer rather than withdrawing it. A clear result beside is_current: null is both of those facts at once, not a contradiction.
fetched_at is when we downloaded the file. revised is when the publisher last revised it. They are different facts, and the second is the one Rev. Proc. 2018-32 §8.01(1)(b) names.
The IRS’s own checklist
Rev. Proc. 2018-32 §8.01 (it superseded 2011-33; most write-ups still cite the old one) is the IRS’s checklist for relying on EO BMF data obtained from a third party. compliance.reliance returns it element by element, with the evidence, or reports the element absent rather than substituting a date we made up.
| Element | What it requires |
|---|---|
| §8.01(1)(a) | Name, EIN, foundation status under §509(a) including supporting-organization type, and whether contributions are deductible. |
| §8.01(1)(b) | A statement that the information is from the most current update of the EO BMF Extract, and the extract's revision date. The publisher's date, established by asking the IRS host, not our download date. |
| §8.01(1)(c) | The date and time the information was provided. |
The block is scoped to the BMF, explicitly. §8 governs foundation status and deductibility and says nothing about sanctions, the IRB or state registration. Those screens are diligence we run on top; no revenue procedure makes them a safe harbour.
It also computes the cases where reliance does not apply at all, which a clean-looking BMF row will not tell you. §6.02: an organization not yet listed in either file. §6.03: a subordinate covered by a group exemption letter, regardless of how it appears in the extract. §4.02: a live auto-revocation, where grants are deductible only if made on or before the posting date, even when the BMF and Pub 78 still show an active listing because those files lag. §4.06: a revocation and a current listing at once, which turns on which came later, and where the report prints the dates it could compare and names the limb it could not.
Whether reliance is available to a given grantor also turns on facts we do not hold (§§4.01, 5.02). The report states which elements it carries. That is not a determination, and Plinth is not a law firm.
What a clear result still is not
Every response names this, as x_plinth.not_available, rather than leaving it to be discovered.
A designation is effective before OFAC republishes its flat files. We track those files every 15 minutes. For a screen at the moment of disbursement, Treasury’s own search is the source of record, and the response says so.
Sanctioned individuals are not screened. The OFAC check asks whether the organization is listed, not whether an officer, trustee or beneficial owner is.
States other than California. Forty-plus other registries are not checked here.
A determination. The report states what the public files say and when. Whether you may rely on that for a given grant is your counsel’s call.
Check it yourself
GET /api/screening/{ein} returns one JSON record. POST /api/screening/bulk runs identical logic over up to 100 EINs for one call. Both are on a paid key; every key gets a single screen with the evidence fields blanked and named in x_plinth.withheld, so a client written against the taster still works against the full record.
Source dates, row counts and the polled cadence are on /api/v1/meta, which needs no key. The Candid-shaped mapping, including what this screen covers and what it does not, is on the migration page.
Sources checked 2026-08-25. Screens are triage, not determinations. A missing source reports not screened, never clear.