Self-serve API access to 2M+ tax-exempt organizations, 16M+ grants, and 12M+ officers. Human-readable field names, a full OpenAPI spec, and structured responses designed for both traditional integrations and AI agents.
Three steps to your first API call.
Sign up. No credit card required.
API access requires a Pro plan. Go to Settings to create an API key once you're on Pro. Keys use the format sk_live_... and can be viewed or revoked anytime.
# Search for nonprofits in Georgia with "food" in the name
curl "https://api.501see.app/api/v1/orgs?name=food&state=GA&limit=3" \
-H "Authorization: Bearer YOUR_API_KEY"# Get the latest filing for Dollywood Foundation
curl "https://api.501see.app/api/v1/orgs/62-1348105/filings/latest?preset=financials"# Search grants awarded to organizations in Tennessee
curl "https://api.501see.app/api/v1/grants?state=TN&min_amount=10000&limit=5"# Full-text search across orgs, officers, and grants
curl "https://api.501see.app/api/v1/search?q=dolly+parton"Pass your API key in the Authorization header.
Authorization: Bearer YOUR_API_KEY Read access to org names, filing structure, and grant relationships. Dollar amounts (compensation, grant amounts) are blurred. Rate limited to 2 req/s.
Full access: dollar amounts visible, bulk export, 30 req/s. API keys are available on the Pro plan. See pricing.
Every field has a human-readable name. No need to memorize IRS column codes.
f9_01_rev_tot_cytotal_revenueControl how much data you get back from filing endpoints.
| Preset | Fields | Use case |
|---|---|---|
summary | ~30 | Default. Key financials, identity, mission. |
financials | ~90 | Summary + Part VIII/IX/X detail lines. |
all | All | Every registered field. |
Or cherry-pick: ?fields=total_revenue,mission,total_employees
Offset-based. Every list response includes total, offset, and limit.
?offset=0&limit=50 # default
?offset=50&limit=50 # next page
# max limit: 500Prefix with - for descending.
?sort=total_revenue # ascending
?sort=-total_revenue # descendingEvery response envelope includes a plan field indicating your access level: anonymous, free, or your paid plan name. Dollar-amount fields are only present for paid plans.
All endpoints are read-only. Base URL: https://api.501see.app
| Method | Path | Description | Auth |
|---|---|---|---|
| GET | /api/v1/orgs | List & filter organizations | Optional |
| GET | /api/v1/orgs/{ein} | Get organization by EIN | Optional |
| GET | /api/v1/orgs/{ein}/filings | List filings for an org | Optional |
| GET | /api/v1/orgs/{ein}/filings/latest | Latest filing for an org | Optional |
| GET | /api/v1/filings/{object_id} | Get filing by object ID | Optional |
| GET | /api/v1/filings/{object_id}/officers | Officers for a filing | Optional |
| GET | /api/v1/filings/{object_id}/grants | Schedule I grants for a filing | Optional |
| GET | /api/v1/filings/{object_id}/pf | 990-PF financials | Optional |
| GET | /api/v1/filings/{object_id}/pf/grants | Foundation grants paid | Optional |
| GET | /api/v1/grants | Search grants across all filings | Optional |
| GET | /api/v1/officers | Search officers across all filings | Optional |
| GET | /api/v1/search | Full-text search (orgs, officers, grants) | Optional |
For full parameter details, see the OpenAPI spec.
| Plan | Steady rate | Burst | Limiting |
|---|---|---|---|
| Anonymous (no key) | 2 req/s | 10 | IP-based |
| Pro | 30 req/s | 50 | Account-based |
Exceeding your rate limit returns HTTP 429:
{"error": {"code": "rate_limit_exceeded", "message": "rate limit exceeded"}}The full API is described by an OpenAPI 3.1 spec. Use it to generate client libraries, import into Postman, or feed directly to an LLM as a tool definition.
Interactive API explorer coming soon.
Download OpenAPI SpecConnect your own AI subscription to nonprofit data. Use your existing Claude, ChatGPT, or any tool-use-capable model. 501(see) is the data source, you bring the brain.
501(see) ships an MCP server that gives AI tools direct access to nonprofit data. Add it to Claude Desktop, Claude Code, Cursor, or any MCP-compatible client.
| Tool | Description |
|---|---|
search | Full-text search across orgs, officers, and grants |
list_organizations | Filter by name, state, NTEE code, revenue range |
get_organization | Lookup a single org by EIN |
get_latest_filing | Financials, mission, employees for any org |
search_grants | Find grants by recipient, funder, amount, geography |
list_officers | Officers and compensation for a filing |
Add to your MCP client configuration:
{
"mcpServers": {
"501see": {
"command": "501see-mcp",
"env": {
"FIVEOHONE_API_KEY": "your-api-key"
}
}
}
}MCP server distribution details coming soon.
Define 501(see) API calls as tools in your LLM application. The model decides when to call them based on the user's question.
import anthropic, httpx
client = anthropic.Anthropic()
API_KEY = "your-501see-api-key"
BASE = "https://api.501see.app"
tools = [{
"name": "search_nonprofits",
"description": "Search nonprofit organizations by name, state, or revenue",
"input_schema": {
"type": "object",
"properties": {
"name": {"type": "string", "description": "Org name (fuzzy match)"},
"state": {"type": "string", "description": "Two-letter state code"},
"min_revenue": {"type": "number", "description": "Minimum annual revenue"},
},
},
}]
def handle_tool_call(name, input):
if name == "search_nonprofits":
params = {k: v for k, v in input.items() if v is not None}
r = httpx.get(f"{BASE}/api/v1/orgs", params=params,
headers={"Authorization": f"Bearer {API_KEY}"})
return r.text
# The model calls search_nonprofits when a user asks about nonprofits
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=[{"role": "user",
"content": "Find food banks in Georgia with over $1M revenue"}],
)"Find foundations that fund environmental nonprofits in the Pacific Northwest with grants over $50K"
"Pull the latest financials for this organization and summarize anything unusual"
"Build a list of arts nonprofits in Georgia with over $1M revenue"