Search990 methodology

How Search990 works.

Search990 indexes over 5 million nonprofit filings and 21 million grants. It uses a semantic and keyword search hybrid, so results are based on what an organization or grant is actually about, not just whether specific words appear in the filing text.

1.97M
active nonprofits
5M+
organization records
21M+
grant records
2 Layerfewest nodes1 Layermore nodes0 Layerall nodesSearch queryNearest match
Entry point · grant purpose
General operating support for a community foundation
drag a node — it moves on every layer at once
The scale

The public nonprofit record is massive, repetitive, and hard to search directly.

Nonprofits file Form 990s with the IRS each year, disclosing mission, finances, and grants given or received. Search990 indexes over 5 million organization filings and 21 million individual grant records. Most filings use a limited, repetitive set of legal and administrative language, which makes the signal easy to bury.

Raw filings

IRS filings are public, but they were written as compliance documents, not as a discovery interface.

5M+
organization filings
21M+
grant transactions
990 / 990-PF
primary filing sources
Why keyword search does not work well here

Word overlap and organizational similarity are not the same thing.

Keyword search matches on the presence of specific words. On this dataset, that creates two failure modes: common terms return hundreds of thousands of weak matches, while specific terms can return nothing if the filing uses different language for the same activity.

Keyword query
housing grants
housing
shelter
eviction
stability
tenant
supportive
The problem is not too few matches. It is too many shallow matches and too few ways to understand which ones are actually relevant.

Common terms saturate

Words like community, youth, education, and services appear everywhere, so exact matching produces huge result sets with little intent.

Specific terms disappear

A filing may describe the right work without using the phrase a researcher typed, especially in short grant-purpose text.

Exact words are not intent

Keyword search measures overlap. Search990 needs to measure whether two organizations or grants are about similar things.

Real questions are exploratory

People often need to find what they do not already know how to name: adjacent funders, peer programs, and related grant histories.

GrantAtlas API

First, tax filings have to become machine-readable.

Our GrantAtlas data system is the ingestion and API layer underlying Search990. It processes raw IRS tax filings, primarily Form 990 and 990-PF, and converts them into structured data: organization identity, mission text, financials, donors and individual grant transactions.

Entity resolution

GrantAtlas resolves duplicate and renamed organizations so records can point to a stable funder or recipient.

Grant linking

Each grant is linked to both the funder and recipient organization, with amount, year, and purpose text preserved and directly searchable.

Queryable records

The output is a structured dataset built from filings that are otherwise unstructured PDF documents.

Semantic search

Embedding-based matching lets the database respond to meaning.

Mission statements and grant descriptions are converted into vector embeddings: numerical representations trained to capture meaning rather than exact wording. Two entries with different vocabulary can sit close together in embedding space if they describe similar activity.

Example queries
cycling every few seconds
2 Layerfewest nodes1 Layermore nodes0 Layerall nodesSearch queryNearest match
Entry point · grant purpose
General operating support for a community foundation
route: pediatric orthopedic care
Which funders have made grants supporting clubfoot early intervention and pediatric orthopedic care in low-resource settings?
Semantic search connects the query to pediatric orthopedic care, early intervention, global health delivery, and disability access.
HNSW graph search

Search at this scale needs a map, not a scan.

A direct comparison against every embedded grant and filing would be too slow for interactive search. Search990 uses a Hierarchical Navigable Small World (HNSW) graph to make the problem navigable: the query enters a sparse top layer, follows the closest useful neighbor, then drops through denser layers until it reaches the local neighborhood most likely to contain relevant records.

Layer 2long jumpsLayer 1closer regionLayer 0nearest neighborhoodentryneighborhood
1. Jump
Move quickly across the sparse top map.
2. Descend
Drop into denser layers near the query.
3. Refine
Return a focused candidate set.

Layered hierarchy

The top layer has relatively few points, so each hop can cover a large distance. Lower layers contain more of the data, so the search can refine once it is in the right region.

One entry point

A search does not begin beside the answer. It starts from an entry node and navigates through the graph, using the query embedding as its compass.

Greedy descent

At each layer, the search keeps moving to a neighbor that looks closer to the query. When no neighbor improves the position, it drops down and continues with a finer map.

Log-shaped narrowing

The route behaves like a log_k(N) search: broad jumps first, then local refinement. That is what lets Search990 zero in on a neighborhood without scanning the full corpus.

The search pipeline

The graph finds the neighborhood. The pipeline makes it useful.

The graph search is the speed layer, not the whole answer. Search990 first turns filings and grants into searchable text, embeds that text as semantic vectors, uses the graph to retrieve nearby candidates, then grounds the results back in deterministic organization and grant records.

1

Normalize

Turn tax filings and grant records into consistent searchable text and facts.

2

Embed

Represent mission and purpose language as compact semantic vectors.

3

Navigate

Use the HNSW graph to reach a small high-relevance neighborhood quickly.

4

Retrieve

Collect nearby organizations, purposes, grants, funders, and recipients.

5

Ground

Resolve candidates through deterministic Search990 and GrantAtlas API records.

Fast candidate search

The graph stage turns a massive comparison problem into a short route through nearby meanings, which keeps exploratory searches responsive.

Grounded results

After retrieval, candidates are resolved back to Search990 and GrantAtlas records so users see real organizations, grants, funders, recipients, years, and amounts.

Who this helps

Nonprofits need discovery, not just lookup.

A lookup tool helps when you already know the organization, funder, or phrase. Search990 is designed for the earlier, harder moment: when you know the problem you care about, but not the exact institutions, terms, or funding pathways around it.

Program officers

Assess a funding landscape before allocating resources or designing a new strategy.

Researchers and journalists

Trace funding relationships across a cause area without manually reading filings one by one.

Nonprofit staff

Search filing data at national scale without needing a full research team or perfect keyword vocabulary.

Impact measurement teams

Compare cross-sector funding patterns and identify where capital is flowing efficiently.

Why we made this

Public nonprofit data should be searchable by curiosity.

The nonprofit sector already contains the clues: missions, grant purposes, recipients, funders, places, amounts, and years. The hard part is making those clues discoverable when a user does not already know the exact phrase to search. Search990 exists to make that discovery layer possible: AI-enabled search for relevance, grounded by deterministic nonprofit and grant data.

Ask Search990