Skip to contents

A compiled reference answers two questions: which organizations can a record be matched to, and which names and addresses does each one carry. Layers answer the first. Name and address classes answer the second; see vignette("corroborators") and vignette("sources").

Every EIN in matchdb has exactly one layer, so choosing layers is choosing a clean set of EINs. Two layers never overlap, and their union is just more EINs.

The layers

The counts are from the build of 2026-11-01 (matchdb@df7e2ce, normalizer v1-592912060053c4c3). They are the same as in the 2026-10-23 build: a new normalizer changes keys, not which EINs exist.

layer what it holds EINs
bmf_active in the newest IRS Business Master File release 1,974,830
bmf_inactive in an earlier BMF release, but not the newest: dissolved, merged, revoked or lapsed 1,723,367
approved_only approved on Form 1023-EZ but never in a BMF release the database loaded 12,581
filer_only never in the BMF, but seen in the e-file data: as a 990 filer, or as an EIN another filer reported on Schedule I or Schedule R 318,389
postcard_only known only from the 990-N e-Postcard (small organizations) 73,503
revoked_only known only from the IRS automatic-revocation list 133,572
irs527 political organizations from Form 8871 (defined; not loaded in this build) 0

An EIN gets the layer of the first source, in build order, that introduced it: the BMF, then 1023-EZ approvals, then the e-file data, then the e-Postcard, then revocations. An organization that is in the BMF and also files a 990-N is bmf_active, not postcard_only. Its e-Postcard names are still in the database, as names on a bmf_active EIN.

Layer is where an EIN came from; active is its status

layer records provenance and does not change once assigned. entity.active records status, and only bmf_active EINs are active. Keeping the two apart lets a new BMF release flip an organization’s status without rewriting where it came from.

Choosing layers

md_spec() takes the layers to include:

library(matchdb)

# the default: organizations in the current BMF
active <- md_spec(layers = "bmf_active")

# every EIN the BMF has ever listed
unified <- md_spec(layers = c("bmf_active", "bmf_inactive"))

Which to use depends on the records being matched.

  • Current records (this year’s grants, a current directory): bmf_active. The inactive tranche is nearly as large and adds little. In the 0c measurement it added 1.76M rows for −5 YES on the 1k grant benchmark, because a dissolved organization rarely receives this year’s grant and its name competes with the live one.
  • Historical records (grants from 2012, an old survey frame): add bmf_inactive, since the organization may have closed since.
  • Small organizations that never filed a full 990: consider postcard_only and revoked_only. Most organizations that lose exemption are revoked for failing to file for three years, so many are small.
  • Recipients that are not in the BMF at all, such as some government units, churches that never applied, and EINs reported by other filers: filer_only.

The published tiers use the two common choices: active-* is bmf_active, and unified-* is bmf_active plus bmf_inactive.

What a layer choice leaves out

A narrow layer choice can split a family. A chapter may be bmf_inactive while its parent is bmf_active. md_compile() reports this in its absence report: for each cluster type, how many family members the chosen layers left out. vignette("clusters") describes the families and their types.

r <- md_compile(md_spec(layers = "bmf_active"))
r$report$absence

Looking at one EIN

md_lookup() shows an EIN’s layer and everything else known about it:

md_lookup("53-0196605")
#> <md_lookup> EIN-53-0196605  AMERICAN NATIONAL RED CROSS
#>   layer bmf_active, active TRUE, NTEE P210, subsection 3
#>   names      1800 rows (dba 1, in_care_of 1, legal 2, observed 1796)
#>   ...

md_layers() returns the vocabulary. It is append-only: values are added, never renamed, so a stored layer never changes meaning.