Skip to main content
Glama
Panda Federation Tools

Panda Federation Tools

Nonprofit Leads: IRS Charities & Foundations by State

nonprofit_leads_irs
Read-only

Build nonprofit and foundation lead lists from IRS Exempt Organizations data, filtered by state, cause, 501(c) type, revenue, and assets for fundraising and grant outreach.

Instructions

Build nonprofit and foundation lead lists from the official IRS Exempt Organizations Business Master File, filtered by state, city, ZIP, NTEE cause, 501(c) type, public charity vs private foundation, revenue, assets and ruling year. Unlike local_business_leads (OpenStreetMap shops) and npi_provider_lists (healthcare NPI), this is the IRS EO BMF for tax-exempt orgs. Use when you need charity or foundation prospect lists for fundraising, sponsorship, grants outreach or nonprofit CRM enrichment. Do not use for for-profit businesses (use local_business_leads or company_website_enricher) or for Form 990 full-text analysis. Parameters: states is the usual starting filter; orgType any|publicCharity|privateFoundation; only501c3 defaults true; minAssets/minRevenue and sortBy=assets|revenue|newest|name rank large prospects first; maxResults caps billed rows. In-care-of and address are what the org filed with the IRS and may be a PO box or attorney. Runs that match nothing are free. Returns per item: agentSummary, ein, name, inCareOf, street, city, state, zip, nteeCode, cause, subsection, orgType, privateFoundation, rulingYear, revenue, income, assets, sizeBand, deductible, propublicaUrl, irsUrl; plus NONPROFITS_XLSX/CSV.

Behavior: read-only; runs the Apify Actor pandadad0214/nonprofit-leads-irs (https://apify.com/pandadad0214/nonprofit-leads-irs) on your own Apify account. Price: $0.001 per nonprofit returned. Runs that find nothing are not charged per result, and spending is capped per call by run_max_charge_usd (default $0.50). run_max_items (default 50) limits items returned and fills maxResults when you leave it unset, so it also limits what is billed; setting maxResults higher can bill more than is returned. Most calls finish in 5-15 s for a few inputs; large inputs or crawls can take minutes, so raise run_timeout_secs (max 300) or shrink the input after a timeout error. Returns JSON {actor, count, items}; long text output is trimmed to whole items, with all items in structuredContent.

Input Schema

NameRequiredDescriptionDefault
citiesNoCities. Optional, exact city names, e.g. Phoenix, Tucson.
sortByNoSort by. Order before the maximum is applied. Choices: revenue = Revenue (largest first); assets = Assets (largest first); newest = Newest exemption first; name = Name A-Z.revenue
statesNoStates. 2-letter codes, up to 15 per run (one IRS file each), e.g. AZ, TX, DC.
orgTypeNoCharity or foundation. Private foundations make grants; public charities raise money. Choices: any = Any; publicCharity = Public charities; privateFoundation = Private foundations.any
minAssetsNoMinimum assets ($). Optional.
nteeCodesNoCause (NTEE codes). Optional NTEE letters or codes: A arts, B education, C environment, D animals, E health, F mental health, G diseases, P human services, L housing, O youth, S community, T grantmaking, X religion. E.g. P, B20, E22.
only501c3NoOnly 501(c)(3) charities. Off = include 501(c)(4) social welfare, (c)(6) trade associations and other exempt types.
maxResultsNoMaximum results. You pay per nonprofit returned, so this also caps the cost. Default 500.
maxRevenueNoMaximum revenue ($). Optional.
minRevenueNoMinimum revenue ($). Latest annual revenue the IRS has on file.
zipPrefixesNoZIP prefixes. Optional, e.g. 850, 85281.
nameContainsNoName contains. Optional, e.g. food bank, YMCA.
run_max_itemsNoOptional. Most results to return from this call (default from PANDA_MAX_ITEMS, 50). Also limits how many results the Actor produces and charges for, unless you set its own max field.
rulingYearFromNoExempt since year (new nonprofits). e.g. 2025 = organizations granted exemption in 2025 or later.
run_timeout_secsNoOptional. Seconds to wait for results (default from PANDA_TIMEOUT_SECS, 120; max 300).
requireFinancialsNoOnly with revenue on file. Skip tiny organizations that file the 990-N postcard.
run_max_charge_usdNoOptional. Hard spending cap for this call in USD (default from PANDA_MAX_CHARGE_USD, 0.50).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv1.5.0

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, open-world, non-destructive, non-idempotent, but the description adds real substance beyond them: per-result pricing ($0.001), a hard per-call spend cap via run_max_charge_usd, free runs on zero matches, the interaction where run_max_items fills maxResults when unset and can therefore under-bill relative to maxResults, expected latency (5-15 s typical, minutes for large inputs) and the 300 s timeout remedy. It also flags data-quality caveats (in-care-of/address may be a PO box or attorney) that an agent would otherwise misread.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then differentiators, then usage, then parameters, then runtime/pricing behavior — a logical hierarchy that lets an agent stop reading early. It is long and has minor redundancy (the free-on-no-match point is stated twice, and maxResults-as-cost-cap is repeated), which keeps it off a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter, zero-required, no-output-schema tool, the description supplies the return field list, response envelope ({actor, count, items} plus structuredContent and NONPROFITS_XLSX/CSV), cost model, and timeout behavior. An agent has everything needed to call it correctly and interpret the result without an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so 3 is the floor, and the description earns above that by adding decision guidance the schema lacks: states as 'the usual starting filter', sortBy/minAssets/minRevenue as the way to rank large prospects first, maxResults as the cost cap, and the run_max_items vs maxResults billing interaction. It also explains the field provenance for inCareOf and enumerates returned items.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: builds nonprofit/foundation lead lists from the IRS Exempt Organizations Business Master File, with the filter surface enumerated. It explicitly contrasts itself with sibling tools (local_business_leads for OSM shops, npi_provider_lists for healthcare NPIs), so an agent can disambiguate without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives positive triggers (fundraising, sponsorship, grants outreach, nonprofit CRM enrichment) and explicit exclusions with named alternatives (for-profit businesses -> local_business_leads or company_website_enricher; Form 990 full-text analysis -> not this tool). This is the when/when-not/alternative pattern at full strength.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.