API reference

Getting Started

Once you have an API key, you can make a simple request in seconds.

First request

curl "https://api.501see.app/api/v1/orgs/62-1348105" \
  -H "Authorization: Bearer YOUR_API_KEY"

Access Tiers

  • Free - Access to get organization by EIN with low rate limits.
  • Pro - Full access to every documented endpoint with increased rate limits.

Standards

Transport

  • API base URL: https://api.501see.app.
  • Responses are JSON over HTTPS.

Authentication

  • Send Authorization: Bearer YOUR_API_KEY on production requests.
  • API keys use the sk_live_ prefix.

Pagination

  • Use offset and limit on list endpoints.
  • Maximum limit is 500.
  • Paginated responses include data, total, offset, and limit.

Sorting

  • Use sort=field for ascending order.
  • Use sort=-field for descending order.
  • Each endpoint documents its supported sort keys.

Request construction

  • Put filters after ? and join them with &.
  • Repeat a parameter when the endpoint says it is repeatable.
  • Filing endpoints support preset=summary, preset=financials, preset=all, and fields=comma,separated,names.
  • fields overrides preset.

Errors

  • Errors use an { error: { code, message } } envelope.
  • Common statuses are 400, 401, 403, 404, 429, and 500.

Rate limits

  • Free - 2 requests per second.
  • Pro - 30 requests per second.

Response Schemas

These are the high-use response shapes from the public contract. The OpenAPI document contains the full schema components and examples.

PaginatedResponse<T>

Generic list envelope used by search and list endpoints. `T` is the item type, so `PaginatedResponse<OrganizationListItem>` means `data` contains organization list rows.

FieldTypeDescription
data requiredT[]Returned records for the current page.
total requiredintegerTotal number of matching records.
offset requiredintegerCurrent offset.
limit requiredintegerCurrent limit.
plan stringPresent on endpoints with plan-aware field behavior.

OrganizationListItem

Slim organization row returned by /api/v1/orgs. It is the item type inside PaginatedResponse<OrganizationListItem>, not the full Organization profile.

FieldTypeDescription
ein requiredstringEmployer Identification Number.
name requiredstringOrganization name.
city stringCity.
state stringState.
zip stringZIP code.
ntee_code stringNTEE code.
website stringWebsite URL when available.
phone stringPhone number when available.
formation_year integerFounding year.
latest_tax_period_end dateLatest filing period end date.
total_revenue number | nullLatest filing revenue.
total_expenses number | nullLatest filing expenses.
net_assets_eoy number | nullLatest filing net assets at year end.
form_type 990 | 990-EZ | 990-PFLatest filing form type.

Organization

Organization profile and latest filing-derived indicators.

FieldTypeDescription
ein requiredstringEmployer Identification Number.
name requiredstringOrganization name.
city, state, zip, country stringAddress fields.
phone, website stringContact fields when available.
formation_year, domicile_state integer/stringFormation metadata.
ntee_code, subsection stringClassification fields.
latest_tax_period_end, latest_object_id date/stringLatest filing references.
operating_reserve_months number | nullNet assets divided by monthly expenses.
revenue_growth_pct, expense_growth_pct number | nullYear-over-year growth metrics.
program_expense_pct, admin_expense_pct, fundraising_expense_pct number | nullExpense mix metrics.
contributions_pct, program_revenue_pct, investment_income_pct number | nullRevenue mix metrics.

Filing

Dynamic filing response. The returned fields depend on preset or fields.

FieldTypeDescription
object_id, ein, form_type, tax_year string/integerFiling identifiers.
tax_period_begin, tax_period_end dateTax period dates.
org_name, org_city, org_state, org_zip, org_phone, org_website string/numberOrganization fields captured on the filing.
mission stringMission text when reported.
total_revenue, total_revenue_py, total_expenses, total_expenses_py number | nullRevenue and expense totals.
contributions, program_revenue, investment_income number | nullRevenue detail fields.
grants_paid, salaries_and_wages, other_expenses number | nullExpense detail fields.
total_assets_eoy, total_liabilities_eoy, net_assets_eoy, net_assets_boy number | nullBalance sheet fields.
total_employees, total_volunteers, voting_members integer | nullPeople and governance counts.
signing_officer_name, signing_officer_title string | nullSigning officer fields.

Officer

Officer, director, trustee, or key employee from Part VII.

FieldTypeDescription
name, title stringPerson name and title.
hours_per_week number | nullReported weekly hours.
compensation, other_compensation, related_compensation, benefits, total_compensation number | nullCompensation fields.
is_officer, is_former, is_key_employee, is_highest_compensated booleanRole flags from the filing.

OfficerSearchResult

Expanded officer search row with organization context and compensation fields.

FieldTypeDescription
name, title stringPerson name and title.
org_name stringOrganization name.
ein stringOrganization EIN.
city, state stringOrganization location.
ntee_code stringOrganization NTEE code.
tax_year integerFiling tax year.
object_id stringFiling object ID.
hours_per_week number | nullReported weekly hours.
compensation, total_compensation number | nullCompensation fields.
total_revenue number | nullOrganization revenue from the latest filing.
is_officer, is_key_employee, is_highest_comp, is_trustee, is_former booleanRole flags.

GrantSearchResult

Unified grant result across Schedule I and 990-PF sources.

FieldTypeDescription
funder_ein, funder_name stringFunder identity.
recipient_name, recipient_city, recipient_state stringRecipient identity and location.
amount number | nullGrant amount.
tax_year, tax_period_begin, tax_period_end integer/dateFiling period fields.
object_id, source stringSource filing and source type.

SearchResult

Polymorphic search result row returned by /api/v1/search.

FieldTypeDescription
type requiredorg | officer | grantMatched entity type.
score requirednumberRelevance score.
record requiredobjectTyped payload for the matched entity.

Export

Asynchronous CSV export job.

FieldTypeDescription
id, account_id string/integerExport identifiers.
status pending | processing | completed | failedCurrent job status.
resource_type organizations | grants | officersExported resource type.
filters, fields object/arrayApplied filters and selected CSV fields.
row_count, file_url, file_size_bytes, error_message varies | nullCompletion output or failure details.
notify_email, expires_at, created_at, completed_at string/date-time | nullNotification and lifecycle timestamps.

ErrorResponse

Standard error envelope.

FieldTypeDescription
error.code requiredbad_request | not_found | internal_error | unauthorized | plan_required | rate_limited | unavailableMachine-readable error code.
error.message requiredstringHuman-readable error message.

Endpoints

Each endpoint below shows query parameters, response envelopes, and request and response examples together.

GET

Organizations

Search nonprofit organizations, fetch profiles, and navigate organization-level funder intelligence.

GET

/api/v1/orgs

List organizations

List and filter nonprofit organizations. Financial filters and sorts use the latest available filing.

Parameters
NameInTypeDescription
offset queryinteger, default 0, min 0Number of items to skip.
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
sort queryname | -name | state | -state | total_revenue | -total_revenue | total_expenses | -total_expenses | net_assets_eoy | -net_assets_eoySort field. Prefix with - for descending.
state querystring[]Two-letter state code. Repeat to match multiple states.
city querystringCity substring match, case-insensitive.
ntee querystringNTEE code prefix. Example: K.
subsection querystring501(c) subsection numeric suffix. Example: 03.
name querystringOrganization name search.
min_revenue querynumberMinimum latest-filing total revenue.
max_revenue querynumberMaximum latest-filing total revenue.
min_expenses querynumberMinimum latest-filing total expenses.
max_expenses querynumberMaximum latest-filing total expenses.
min_net_assets querynumberMinimum latest-filing end-of-year net assets.
max_net_assets querynumberMaximum latest-filing end-of-year net assets.
form_type query990 | 990-EZ | 990-PFLatest filing form type.
min_program_expense_pct querynumber, 0-100Minimum program expense ratio.
max_program_expense_pct querynumber, 0-100Maximum program expense ratio.
min_contributions_pct querynumber, 0-100Minimum contributions as percent of revenue.
max_contributions_pct querynumber, 0-100Maximum contributions as percent of revenue.
min_formation_year queryintegerMinimum founding year.
max_formation_year queryintegerMaximum founding year.
min_employees queryintegerMinimum employee count. Self-reported and often sparse.
max_employees queryintegerMaximum employee count.

Example request

curl "https://api.501see.app/api/v1/orgs?name=food%20bank&state=GA&min_revenue=1000000&sort=-total_revenue&limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "ein": "12-3456789",
      "name": "Atlanta Food Bank",
      "city": "Atlanta",
      "state": "GA",
      "ntee_code": "K30",
      "latest_tax_period_end": "2023-12-31",
      "total_revenue": 5000000,
      "total_expenses": 4800000,
      "net_assets_eoy": 6000000,
      "form_type": "990"
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 10,
  "plan": "free"
}
Responses
StatusSchemaDescription
200PaginatedResponse<OrganizationListItem>Paginated list of organizations.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/orgs/{ein}

Get organization by EIN

Parameters
NameInTypeDescription
ein requiredpathstring, pattern XX-XXXXXXXEmployer Identification Number. Example: 62-1348105.

Example request

curl "https://api.501see.app/api/v1/orgs/62-1348105" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "ein": "12-3456789",
  "name": "Atlanta Food Bank",
  "city": "Atlanta",
  "state": "GA",
  "website": "https://atlantafb.org",
  "formation_year": 1990,
  "latest_tax_period_end": "2023-12-31",
  "latest_object_id": "202303559349300000",
  "operating_reserve_months": 4.8,
  "program_expense_pct": 89.4,
  "contributions_pct": 78.2
}
Responses
StatusSchemaDescription
200OrganizationOrganization profile, latest filing identifiers, and derived financial ratios.
404ErrorResponseThe requested resource was not found.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

List recommended funders

Rank funders by how many similar organizations they fund, weighted by similarity score.

NameInTypeDescription
ein requiredpathstringTarget organization EIN.
limit queryinteger, default 20, min 1, max 100Maximum funders to return.

Example request

curl "https://api.501see.app/api/v1/orgs/62-1348105/recommended-funders?limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "ein": "13-1837418",
      "name": "Community Foundation of Atlanta",
      "city": "Atlanta",
      "state": "GA",
      "ntee_code": "T31",
      "orgs_funded": 18,
      "weighted_score": 12.7,
      "total_grants": 248,
      "avg_grant": 15432.11,
      "median_grant": 10000,
      "years_active": 11,
      "top_sectors": ["K", "P", "B"]
    }
  ],
  "total": 1
}
StatusSchemaDescription
200{ data: RecommendedFunder[], total: number }Ranked funders with overlap counts, weighted score, grant statistics, and top sectors.
401ErrorResponseAuthentication is missing, invalid, or required for this endpoint.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/orgs/{ein}/grants-received

List grants received

Summarize grants received from Schedule I and 990-PF Part XV sources.

Parameters
NameInTypeDescription
ein requiredpathstring, pattern XX-XXXXXXXRecipient organization EIN.
limit queryinteger, default 20, min 1, max 100Maximum grant records to include.

Example request

curl "https://api.501see.app/api/v1/orgs/62-1348105/grants-received?limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "grants": [
    {
      "funder_ein": "13-1837418",
      "funder_name": "Community Foundation of Atlanta",
      "amount": 25000,
      "purpose": "Operating support",
      "tax_year": 2023
    }
  ],
  "total_grant_count": 24,
  "total_amount": 250000,
  "funder_count": 8,
  "most_recent_year": 2024
}
Responses
StatusSchemaDescription
200GrantsReceivedSummaryRecent grants plus total count, total amount, funder count, and most recent year.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/orgs/{ein}/portfolio

Get funder giving portfolio

Precomputed foundation portfolio with yearly trends, sector mix, geography, revenue bands, and top grantees. Rebuilt monthly.

Parameters
NameInTypeDescription
ein requiredpathstringFunder EIN.

Example request

curl "https://api.501see.app/api/v1/orgs/38-1359217/portfolio"

Example response

{
  "funder_ein": "38-1359217",
  "summary": {
    "total_grants": 124,
    "total_giving": 1825000,
    "unique_recipients": 96,
    "years_active": 12
  },
  "yearly_stats": [],
  "sectors": [],
  "geography": [],
  "revenue_bands": [],
  "top_grantees": [],
  "accepts_unsolicited": true
}
Responses
StatusSchemaDescription
200FunderPortfolioPortfolio summary, yearly stats, sectors, geography, revenue bands, and top grantees.
404ErrorResponseNo portfolio data for this organization.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/orgs/{ein}/similar

List similar organizations

Find organizations similar by grant co-occurrence, NTEE code, geography, and revenue band.

Parameters
NameInTypeDescription
ein requiredpathstring, pattern XX-XXXXXXXSource organization EIN.
offset queryinteger, default 0, min 0Number of items to skip.
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
min_score querynumber, 0.0-1.0Minimum composite similarity score.
signal querygrant_cooccurrence | ntee | geography | revenue_bandLimit matches to one similarity signal.

Example response

{
  "data": [
    {
      "ein": "62-1348105",
      "name": "Atlanta Food Bank",
      "city": "Atlanta",
      "state": "GA",
      "ntee_code": "K31",
      "score": 0.93,
      "signals": {
        "grant_cooccurrence": 0.88,
        "ntee": 1,
        "geography": 1
      },
      "rank": 1
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 20
}
Responses
StatusSchemaDescription
200PaginatedResponse<SimilarOrg>Similar organizations with score, rank, and per-signal breakdown.
401ErrorResponseAuthentication is missing, invalid, or required for this endpoint.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

Filings

Read normalized 990, 990-EZ, and 990-PF filings. Filing responses are dynamic maps driven by presets or explicit fields.

GET

/api/v1/orgs/{ein}/filings

List filings for an organization

Parameters
NameInTypeDescription
ein requiredpathstring, pattern XX-XXXXXXXOrganization EIN.
offset queryinteger, default 0, min 0Number of items to skip.
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
preset querysummary | financials | all, default summaryField preset for filing responses. Ignored when fields is provided.
fields querycomma-separated stringSpecific filing fields to return. Overrides preset. Example: total_revenue,total_expenses,mission.
sort querytax_year | -tax_year | total_revenue | -total_revenue | total_expenses | -total_expenses, default -tax_yearSort field. Prefix with - for descending.
tax_year queryintegerExact tax year.
form_type query990 | 990EZ | 990PFFiling form type.

Example request

curl "https://api.501see.app/api/v1/orgs/62-1348105/filings?preset=financials&sort=-tax_year&limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "object_id": "202303559349300000",
      "ein": "62-1348105",
      "form_type": "990",
      "tax_year": 2023,
      "total_revenue": 5000000,
      "total_expenses": 4800000,
      "mission": "To reduce hunger in our community."
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 5,
  "plan": "free"
}
Responses
StatusSchemaDescription
200PaginatedResponse<Filing>Paginated filing objects with fields selected by preset or fields.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/orgs/{ein}/filings/latest

Get latest filing

Parameters
NameInTypeDescription
ein requiredpathstring, pattern XX-XXXXXXXOrganization EIN.
preset querysummary | financials | all, default summaryField preset for filing responses. Ignored when fields is provided.
fields querycomma-separated stringSpecific filing fields to return. Overrides preset. Example: total_revenue,total_expenses,mission.

Example request

curl "https://api.501see.app/api/v1/orgs/62-1348105/filings/latest?fields=tax_year,total_revenue,total_expenses,mission" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "object_id": "202303559349300000",
  "ein": "62-1348105",
  "form_type": "990",
  "tax_year": 2023,
  "total_revenue": 5000000,
  "total_expenses": 4800000,
  "mission": "To reduce hunger in our community."
}
Responses
StatusSchemaDescription
200FilingMost recent filing by tax year.
404ErrorResponseThe requested resource was not found.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/filings/{object_id}

Get filing by object ID

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
preset querysummary | financials | all, default summaryField preset for filing responses. Ignored when fields is provided.
fields querycomma-separated stringSpecific filing fields to return. Overrides preset. Example: total_revenue,total_expenses,mission.

Example response

{
  "object_id": "202303559349300000",
  "ein": "62-1348105",
  "form_type": "990",
  "tax_year": 2023,
  "mission": "To reduce hunger in our community."
}
Responses
StatusSchemaDescription
200FilingOne normalized filing object.
404ErrorResponseThe requested resource was not found.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

Officers

Search officers, directors, trustees, key employees, and compensation benchmarks.

GET

/api/v1/officers

Search officers across all filings

Defaults to paid staff with non-zero compensation. Compensation fields are plan-aware.

Parameters
NameInTypeDescription
offset queryinteger, default 0, min 0Number of items to skip.
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
sort querycompensation | -compensation | tax_year | -tax_year | name | -name, default -compensationSort field. Prefix with - for descending.
name querystringOfficer name search.
title querystringFree-text title keyword.
role querydevelopment | finance | executive | programs | operations | marketing | hr | legalCurated role group mapped from titles.
role_type querystaff | board | former | all, default staffPosition type filter.
ein querystringOrganization EIN.
state querystringOrganization state.
ntee querystringOrganization NTEE code or major-group prefix.
min_revenue querynumberMinimum organization revenue.
max_revenue querynumberMaximum organization revenue.
min_year queryintegerMinimum tax year.
max_year queryintegerMaximum tax year.
min_compensation querynumberMinimum total compensation.
max_compensation querynumberMaximum total compensation.

Example request

curl "https://api.501see.app/api/v1/officers?role=development&state=GA&min_revenue=500000&sort=-compensation" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "name": "Jordan Smith",
      "title": "Development Director",
      "org_name": "Atlanta Food Bank",
      "ein": "62-1348105",
      "city": "Atlanta",
      "state": "GA",
      "tax_year": 2023,
      "object_id": "202303559349300000",
      "compensation": 125000,
      "total_compensation": 131500,
      "total_revenue": 5000000,
      "is_officer": true,
      "is_key_employee": false,
      "is_highest_comp": false,
      "is_trustee": false,
      "is_former": false
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 50,
  "plan": "free"
}
Responses
StatusSchemaDescription
200PaginatedResponse<OfficerSearchResult>Officer search results with filing and organization context.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/filings/{object_id}/officers

List officers for a filing

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
offset queryinteger, default 0, min 0Number of items to skip.
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.

Example request

curl "https://api.501see.app/api/v1/filings/202303559349300000/officers?limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "name": "Jordan Smith",
      "title": "Development Director",
      "hours_per_week": 40,
      "compensation": 125000,
      "other_compensation": 3000,
      "related_compensation": 1500,
      "benefits": 2000,
      "is_officer": true,
      "is_former": false,
      "is_key_employee": false,
      "is_highest_compensated": false,
      "total_compensation": 131500
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 50,
  "plan": "free"
}
Responses
StatusSchemaDescription
200PaginatedResponse<Officer>Part VII officers, directors, trustees, and key employees.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/compensation-benchmark

Compensation percentile benchmarks

Parameters
NameInTypeDescription
role requiredquerystringRole group key. Example: executive, development, finance, programs.
ntee querystringNTEE major category letter.
state querystringTwo-letter US state code.
min_revenue querynumberMinimum organization revenue.
max_revenue querynumberMaximum organization revenue.

Example response

{
  "count": 124,
  "p25": 82000,
  "median": 114000,
  "p75": 156000,
  "mean": 118750
}
Responses
StatusSchemaDescription
200{ count, p25, median, p75, mean }Compensation percentile statistics for matched officer records.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

Grants

Search grants across Schedule I and 990-PF Part XV. Also list grants from individual filings.

GET

/api/v1/grants

Search grants across all filings

Parameters
NameInTypeDescription
offset queryinteger, default 0, min 0Number of items to skip.
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
sort queryamount | -amount | tax_year | -tax_year | funder_name | -funder_name | recipient_name | -recipient_name, default -amountSort field. Prefix with - for descending.
funder_ein querystringFunder EIN.
funder_name querystringFunder organization name search.
funder_ntee querystringFunder NTEE major category.
funder_state querystring[]Funder home state. Repeat for multiple states.
recipient_ntee querystringRecipient NTEE major category or full code.
recipient_ein querystringRecipient EIN.
similar_to querystringFilter to funders that also fund organizations similar to this EIN.
recipient_name querystringRecipient name search.
min_amount querynumberMinimum grant amount.
max_amount querynumberMaximum grant amount.
state querystring[]Recipient state. Repeat for multiple states.
tax_year queryintegerExact tax year.
min_year queryintegerMinimum tax year, inclusive.
max_year queryintegerMaximum tax year, inclusive.
source query990 | 990-PFGrant source.
purpose querystringFull-text search against grant purpose.
query querystringKeyword search across recipient name and grant purpose.

Example request

curl "https://api.501see.app/api/v1/grants?state=TN&min_amount=10000&source=990-PF&limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "funder_ein": "38-1359217",
      "funder_name": "Smith Family Foundation",
      "recipient_name": "Community Food Project",
      "recipient_city": "Nashville",
      "recipient_state": "TN",
      "recipient_ein": "62-1348105",
      "amount": 25000,
      "tax_year": 2023,
      "tax_period_begin": "2023-01-01",
      "tax_period_end": "2023-12-31",
      "object_id": "202303559349300000",
      "source": "990-PF",
      "purpose": "Operating support"
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 5,
  "plan": "free"
}
Responses
StatusSchemaDescription
200PaginatedResponse<GrantSearchResult>Unified grant search results with funder, recipient, amount, tax year, source, and purpose fields.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/filings/{object_id}/grants

List Schedule I grants for a filing

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
offset queryinteger, default 0, min 0Number of items to skip.
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.

Example response

{
  "data": [
    {
      "recipient_name": "Community Food Project",
      "recipient_city": "Nashville",
      "recipient_state": "TN",
      "recipient_ein": "62-1348105",
      "cash_amount": 25000,
      "purpose": "Operating support"
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 50,
  "plan": "free"
}
Responses
StatusSchemaDescription
200PaginatedResponse<Grant>Schedule I grants paid from a 990 filing.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

Private Foundations

Search private foundations, read 990-PF-specific filing data, and list Part XV grants paid.

GET

/api/v1/foundations

Search private foundations by giving behavior

Backed by precomputed monthly funder portfolio aggregations. Purpose search falls back to raw grant purpose and grantee names when needed.

Parameters
NameInTypeDescription
name querystringFoundation name keyword.
state querystringFoundation home state. Repeatable.
city querystringFoundation home city.
ntee querystringFoundation NTEE prefix. Repeatable.
funder_sector querystringNTEE major letter of sectors they fund. Repeatable.
funder_geo_state querystringStates where the foundation gives grants. Repeatable.
min_avg_grant querynumberMinimum average grant amount.
max_avg_grant querynumberMaximum average grant amount.
min_median_grant querynumberMinimum median grant amount.
max_median_grant querynumberMaximum median grant amount.
min_total_grants queryintegerMinimum total grant count.
min_years_active queryintegerMinimum years with grant activity.
min_formation_year queryintegerMinimum formation year.
max_formation_year queryintegerMaximum formation year.
min_revenue querynumberMinimum latest-year total revenue, with 990/990-PF/BMF fallback.
max_revenue querynumberMaximum latest-year total revenue, with 990/990-PF/BMF fallback.
min_expenses querynumberMinimum latest-year total expenses.
max_expenses querynumberMaximum latest-year total expenses.
min_assets querynumberMinimum latest-year total assets.
max_assets querynumberMaximum latest-year total assets.
min_net_assets querynumberMinimum latest-year net assets.
max_net_assets querynumberMaximum latest-year net assets.
purpose querystringFull-text keyword search against portfolio profile, raw grant purpose, and grantee-name text.
debug_scores querybooleanInclude lexical, semantic, and blended ranking scores.
hide_preselected querybooleanExclude funders whose latest 990-PF says contributors are preselected.
sort queryname | total_grants | avg_grant | years_active | total_giving, optional - prefixSort field.
limit queryinteger, default 25, min 1, max 500Maximum records to return.
offset queryinteger, default 0, min 0Number of records to skip.

Example request

curl "https://api.501see.app/api/v1/foundations?state=CA&funder_sector=B&min_total_grants=100&hide_preselected=true" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "ein": "38-1359217",
      "name": "Smith Family Foundation",
      "city": "San Francisco",
      "state": "CA",
      "ntee_code": "T20",
      "total_grants": 124,
      "avg_grant": 14750,
      "median_grant": 10000,
      "years_active": 12,
      "accepts_unsolicited": true
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 25,
  "plan": "free"
}
Responses
StatusSchemaDescription
200PaginatedResponse<FoundationResult>Private foundation results with portfolio fields and application-status signals.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/filings/{object_id}/pf

Get 990-PF financials for a filing

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
preset querysummary | financials | all, default summaryField preset for filing responses. Ignored when fields is provided.
fields querycomma-separated stringSpecific filing fields to return. Overrides preset. Example: total_revenue,total_expenses,mission.

Example request

curl "https://api.501see.app/api/v1/filings/202303559349300000/pf?fields=tax_year,total_revenue,total_expenses,net_assets_eoy" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "object_id": "202303559349300000",
  "ein": "38-1359217",
  "form_type": "990-PF",
  "tax_year": 2023,
  "total_revenue": 2500000,
  "total_expenses": 1800000,
  "net_assets_eoy": 12000000,
  "contributors_preselected": true
}
Responses
StatusSchemaDescription
200PFFiling990-PF-specific financial data for one filing.
404ErrorResponseThe requested resource was not found.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/filings/{object_id}/pf/grants

List Part XV foundation grants paid

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
offset queryinteger, default 0, min 0Number of items to skip.
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.

Example response

{
  "data": [
    {
      "recipient_name": "Community Food Project",
      "recipient_city": "Nashville",
      "recipient_state": "TN",
      "recipient_ein": "62-1348105",
      "amount": 25000,
      "purpose": "Operating support",
      "relationship": "independent",
      "status": "paid"
    }
  ],
  "total": 1,
  "offset": 0,
  "limit": 50,
  "plan": "free"
}
Responses
StatusSchemaDescription
200PaginatedResponse<PFGrant>990-PF Part XV grants paid.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
429ErrorResponseRate limit exceeded. Retry with backoff.
POST

Exports

Create and manage asynchronous CSV export jobs for larger result sets.

POST

/api/v1/exports

Create a CSV export job

Create an asynchronous export job. Poll GET /api/v1/exports/{id} until status is completed, then download file_url.

Request body
FieldTypeDescription
resource_type requiredorganizations | grants | officersResource to export.
filters objectSame filter parameters as the corresponding list or search endpoint.
notify_email stringOptional completion notification email.

Example request

curl "https://api.501see.app/api/v1/exports" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"resource_type":"grants","filters":{"state":"TN","min_amount":10000}}'

Example response

{
  "id": "exp_01J3NQ2Z2T7B7R3Y1QW8T8G5F2",
  "account_id": "acct_01J3NQ0G3P4V8C7H2K6W1M9D8X",
  "status": "pending",
  "resource_type": "grants",
  "filters": {
    "state": "TN",
    "min_amount": 10000
  },
  "fields": [],
  "created_at": "2026-06-03T12:00:00Z"
}
Responses
StatusSchemaDescription
202ExportExport job accepted and queued.
400ErrorResponseInvalid parameter, sort key, filter, path value, or JSON body.
401ErrorResponseAuthentication is missing, invalid, or required for this endpoint.
403ErrorResponseThe authenticated caller does not have access to this operation.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/exports

List exports

Example request

curl "https://api.501see.app/api/v1/exports" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "id": "exp_01J3NQ2Z2T7B7R3Y1QW8T8G5F2",
      "account_id": "acct_01J3NQ0G3P4V8C7H2K6W1M9D8X",
      "status": "completed",
      "resource_type": "grants",
      "row_count": 124,
      "file_url": "https://files.501see.app/exports/exp_01J3NQ2Z2T7B7R3Y1QW8T8G5F2.csv",
      "created_at": "2026-06-03T12:00:00Z",
      "completed_at": "2026-06-03T12:02:11Z"
    }
  ]
}
Responses
StatusSchemaDescription
200{ data: Export[] }Exports for the authenticated account.
401ErrorResponseAuthentication is missing, invalid, or required for this endpoint.
429ErrorResponseRate limit exceeded. Retry with backoff.
GET

/api/v1/exports/{id}

Get export job by ID

Parameters
NameInTypeDescription
id requiredpathstringExport job UUID.

Example request

curl "https://api.501see.app/api/v1/exports/exp_01J3NQ2Z2T7B7R3Y1QW8T8G5F2" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "id": "exp_01J3NQ2Z2T7B7R3Y1QW8T8G5F2",
  "account_id": "acct_01J3NQ0G3P4V8C7H2K6W1M9D8X",
  "status": "completed",
  "resource_type": "grants",
  "row_count": 124,
  "file_url": "https://files.501see.app/exports/exp_01J3NQ2Z2T7B7R3Y1QW8T8G5F2.csv",
  "created_at": "2026-06-03T12:00:00Z",
  "completed_at": "2026-06-03T12:02:11Z"
}
Responses
StatusSchemaDescription
200ExportExport job status and file details.
401ErrorResponseAuthentication is missing, invalid, or required for this endpoint.
404ErrorResponseThe requested resource was not found.
429ErrorResponseRate limit exceeded. Retry with backoff.
DELETE

/api/v1/exports/{id}

Delete export job

Parameters
NameInTypeDescription
id requiredpathstringExport job UUID.

Example request

curl -X DELETE "https://api.501see.app/api/v1/exports/exp_01J3NQ2Z2T7B7R3Y1QW8T8G5F2" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "status": "ok"
}
Responses
StatusSchemaDescription
200{ status: "ok" }Export job deleted.
401ErrorResponseAuthentication is missing, invalid, or required for this endpoint.
404ErrorResponseThe requested resource was not found.
429ErrorResponseRate limit exceeded. Retry with backoff.

Integrations

These integration surfaces are designed for both human workflows and agent workflows. Start with the OpenAPI schema when you want a formal contract, then use MCP for tool-driven automation.

OpenAPI schema

Use the OpenAPI document for code generation, SDKs, and tools that need a machine-readable contract.

Remote MCP configuration

{
  "mcpServers": {
    "501see": {
      "type": "sse",
      "url": "https://api.501see.app/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}