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

Developer Free

  • EIN lookup
  • Latest filing lookup
  • Bounded organization name search
  • Rate limit: 2 requests per second

Developer Basic

  • Full read API access
  • Organizations, filings, grants, officers, and foundation discovery
  • Funder portfolios
  • MCP access
  • Rate limit: 30 requests per second

Developer Pro

  • Everything in Developer Basic
  • Webhooks
  • Exports up to 100,000 rows
  • Rate limit: 30 requests per second

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.
  • Basic - 30 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.

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.

WebhookEndpoint

Signed webhook endpoint owned by an account. The secret is only returned on create.

FieldTypeDescription
id, public_id, account_id string/integerEndpoint identifiers.
url stringDestination URL for webhook deliveries.
secret stringWebhook signing secret returned only once on create.
active booleanWhether the endpoint receives deliveries.
subscriptions array<object>Current webhook subscriptions for this endpoint.
created_at, updated_at string/date-timeLifecycle timestamps.

WebhookDelivery

Webhook delivery outbox row and delivery history entry.

FieldTypeDescription
id, public_id, event_id, subscription_id, account_id, user_id string/integer | nullDelivery and ownership identifiers.
channel, destination, status stringDelivery channel, URL, and state.
idempotency_key, attempts string/integerRetry identity and attempt count.
next_attempt_at, last_attempt_at, delivered_at string/date-time | nullRetry and completion timestamps.
response_status, response_body, error number/string | nullLast response or failure details.
payload objectCanonical webhook payload.
created_at string/date-timeDelivery creation time.

ErrorResponse

Standard error envelope.

FieldTypeDescription
error.code requiredbad_request | not_found | internal_error | unauthorized | plan_required | developer_api_basic_required | developer_api_pro_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

Nonprofit organizations from the IRS Business Master File.

GET

/api/v1/orgs

List organizations

List and filter nonprofit organizations. Joins to the latest filing for financial sort and filter fields. Name search uses trigram similarity.

Parameters
NameInTypeDescription
offset queryinteger, default 0, min 0Number of items to skip (for pagination).
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
sort querystring, default nameSort field. Prefix with `-` for descending.
state queryarrayFilter by two-letter state code. Repeat to match multiple states.
city querystringFilter by city using a case-insensitive substring match.
ntee querystringFilter by NTEE code prefix.
subsection querystringFilter by 501(c) subsection numeric suffix, such as `03` for 501(c)(3).
name querystringSearch by organization name.
min_revenue querynumberMinimum total revenue from the latest filing.
max_revenue querynumberMaximum total revenue from the latest filing.
min_expenses querynumberMinimum total expenses from the latest filing.
max_expenses querynumberMaximum total expenses from the latest filing.
min_net_assets querynumberMinimum end-of-year net assets from the latest filing.
max_net_assets querynumberMaximum end-of-year net assets from the latest filing.
form_type querystringFilter by filing form type.
min_program_expense_pct querynumberMinimum program expense ratio from 0 to 100.
max_program_expense_pct querynumberMaximum program expense ratio from 0 to 100.
min_contributions_pct querynumberMinimum contributions as a percent of revenue from 0 to 100.
max_contributions_pct querynumberMaximum contributions as a percent of revenue from 0 to 100.
min_formation_year queryintegerMinimum founding year.
max_formation_year queryintegerMaximum founding year.
min_employees queryintegerMinimum total employees. Self-reported and often sparse.
max_employees queryintegerMaximum total employees.
mission querystringFull-text keyword search against the latest mission statement.

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
200objectPaginated list of organizations.
400ErrorResponseInvalid request parameters.
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
429ErrorResponseRate limit exceeded.
GET

/api/v1/orgs/{ein}

Get organization by EIN

Parameters
NameInTypeDescription
ein requiredpathstringEmployer Identification Number formatted as `XX-XXXXXXX`.

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 details.
401ErrorResponseAuthentication required.
404ErrorResponseResource not found.
429ErrorResponseRate limit exceeded.
GET

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

List grants received by an organization

Returns a summary of grants received by the organization from Schedule I, 990-PF Part XV, and Federal Audit Clearinghouse sources.

Parameters
NameInTypeDescription
ein requiredpathstringEmployer Identification Number formatted as `XX-XXXXXXX`.
limit queryinteger, default 20, min 1, max 100Max grants to return (1-100, default 20).

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
200GrantsReceivedSummaryGrants received summary and recent grant records.
400ErrorResponseInvalid request parameters.
GET

Filings

IRS 990/990-EZ/990-PF tax filings with dynamic field selection.

GET

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

List filings for an organization

Returns filings for the given EIN. Response fields are dynamic and driven by the `preset` or `fields` parameter.

Parameters
NameInTypeDescription
ein requiredpathstringEmployer Identification Number formatted as `XX-XXXXXXX`.
offset queryinteger, default 0, min 0Number of items to skip (for pagination).
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
preset querystring, default summaryField preset for filing responses. Ignored if `fields` is provided.
fields querystringComma-separated list of fields to return. Overrides `preset`.
sort querystring, default -tax_yearSort field. Prefix with `-` for descending.
tax_year queryintegerFilter by tax year.
form_type querystringFilter by 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
200objectPaginated list of filings with dynamic field set.
400ErrorResponseInvalid request parameters.
401ErrorResponseAuthentication required.
429ErrorResponseRate limit exceeded.
GET

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

Get latest filing for an organization

Returns the most recent filing by tax year for the given EIN.

Parameters
NameInTypeDescription
ein requiredpathstringEmployer Identification Number formatted as `XX-XXXXXXX`.
preset querystring, default summaryField preset for filing responses. Ignored if `fields` is provided.
fields querystringComma-separated list of fields to return. Overrides `preset`.

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
200FilingLatest filing.
404ErrorResponseResource not found.
GET

/api/v1/filings/{object_id}

Get filing by object ID

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
preset querystring, default summaryField preset for filing responses. Ignored if `fields` is provided.
fields querystringComma-separated list of fields to return. Overrides `preset`.

Example response

{
  "object_id": "202303559349300000",
  "ein": "62-1348105",
  "form_type": "990",
  "tax_year": 2023,
  "mission": "To reduce hunger in our community."
}
Responses
StatusSchemaDescription
200FilingFiling details.
401ErrorResponseAuthentication required.
404ErrorResponseResource not found.
429ErrorResponseRate limit exceeded.
GET

Officers

Officers, directors, trustees, and key employees (Part VII).

GET

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

List officers for a filing

Returns Part VII officers, directors, and trustees for one filing.

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
offset queryinteger, default 0, min 0Number of items to skip (for pagination).
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
200objectPaginated list of officers.
400ErrorResponseInvalid request parameters.
GET

/api/v1/officers

Search officers across all filings

Search officers by role, title, organization, year, revenue, and compensation. Defaults to paid staff with non-zero pay. Compensation fields are hidden for anonymous and free-plan callers.

Parameters
NameInTypeDescription
offset queryinteger, default 0, min 0Number of items to skip (for pagination).
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
sort querystring, default -compensationSort field. Prefix with `-` for descending.
name querystringSearch by officer name.
title querystringFree-text title keyword.
role querystringRole category mapped to curated title keywords.
role_type querystring, default staffPosition type filter.
ein querystringFilter by organization EIN.
state querystringFilter by two-letter organization state code.
ntee querystringFilter by organization 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
200objectPaginated officer search results.
400ErrorResponseInvalid request parameters.
GET

/api/v1/compensation-benchmark

Compensation percentile benchmarks by role

Returns P25, median, P75, and mean total compensation for a given role filtered by sector, state, and/or org revenue range. Data is pulled from the officer_search materialized view (paid staff on latest filings). No authentication required.

Parameters
NameInTypeDescription
role requiredquerystringRole group key (e.g. executive, development, finance, programs).
ntee querystringNTEE major category letter (e.g. B for Education, E for Health).
state querystringTwo-letter US state code.
min_revenue querynumberMinimum org revenue filter.
max_revenue querynumberMaximum org revenue filter.

Example response

{
  "count": 124,
  "p25": 82000,
  "median": 114000,
  "p75": 156000,
  "mean": 118750
}
Responses
StatusSchemaDescription
200objectCompensation benchmark statistics.
400ErrorResponseInvalid request parameters.
GET

Grants

Schedule I grants and cross-filing grant search.

GET

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

List Schedule I grants for a filing

Returns Schedule I grants paid from a 990 filing.

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
offset queryinteger, default 0, min 0Number of items to skip (for pagination).
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
200objectPaginated list of Schedule I grants.
400ErrorResponseInvalid request parameters.
GET

/api/v1/grants

Search grants across all filings

Cross-filing grant search across Schedule I, 990-PF Part XV, and related funder metadata.

Parameters
NameInTypeDescription
offset queryinteger, default 0, min 0Number of items to skip (for pagination).
limit queryinteger, default 50, min 1, max 500Maximum number of items to return.
sort querystring, default -amountSort field. Prefix with `-` for descending.
funder_ein querystringFilter by funder EIN.
funder_name querystringSearch by funder organization name.
funder_ntee querystringFilter by funder NTEE major category.
funder_state queryarrayFilter by funder home state. Repeat for multiple states.
recipient_ntee querystringFilter by recipient NTEE major category or full code.
recipient_ein querystringFilter by recipient EIN.
similar_to querystringFilter to funders that also fund orgs similar to this EIN.
recipient_name querystringSearch by recipient name.
recipient_city querystringCase-insensitive recipient city substring.
min_amount querynumberMinimum grant amount.
max_amount querynumberMaximum grant amount.
state queryarrayFilter by recipient state. Repeat for multiple states.
tax_year queryintegerFilter by exact tax year.
min_year queryintegerMinimum tax year, inclusive.
max_year queryintegerMaximum tax year, inclusive.
foundation_type querystringFilter by foundation type. Use `990-PF` for private foundations or `990` for charitable foundations.
hide_preselected querybooleanWhen true, excludes grants from funders whose latest portfolio data explicitly marks them as closed to unsolicited applications. Funders with unknown application status are kept.
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
200objectPaginated grant search results.
400ErrorResponseInvalid request parameters.
GET

/api/v1/foundation-grant-landscape

Get a limited foundation grant landscape

Returns aggregate grant-history statistics and a small representative funder preview for the public Foundation Grant Search page. This is a deliberately partial response. It does not support pagination, arbitrary filters, raw grant rows, or unrestricted identifiers. Each bounded preview item includes its public EIN so it can link to the public organization profile. No authentication is required for anonymous web use. Direct API-key callers require a paid Developer API entitlement.

Parameters
NameInTypeDescription
q querystringMission, program, recipient name, or recipient EIN to search.
state querystringOptional recipient state filter.
Responses
StatusSchemaDescription
200objectPartial foundation grant landscape.
400ErrorResponseInvalid request parameters.
429ErrorResponseRate limit exceeded.
GET

Private Foundations

990-PF specific data and Part XV grants paid.

GET

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

Get 990-PF financials for a filing

Returns 990-PF-specific financial data for one filing.

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
preset querystring, default summaryField preset for filing responses. Ignored if `fields` is provided.
fields querystringComma-separated list of fields to return. Overrides `preset`.

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
200objectPF filing data.
404ErrorResponseResource not found.
GET

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

List Part XV foundation grants paid

Returns grants paid from 990-PF Part XV.

Parameters
NameInTypeDescription
object_id requiredpathstringIRS e-file object ID.
offset queryinteger, default 0, min 0Number of items to skip (for pagination).
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
200objectPaginated list of PF grants paid.
400ErrorResponseInvalid request parameters.
POST

Exports

Asynchronous CSV exports.

POST

/api/v1/exports

Create a CSV export job

Creates an asynchronous export job for the given resource type and filters. Poll `GET /api/v1/exports/{id}` until `status=completed`, then download the file from `file_url`. Requires Developer Pro. Each export is capped at 100,000 rows. If the matching result set is larger, the export completes with the first 100,000 rows and reports the exported count in `row_count`.

Request body
FieldTypeDescription
resource_type requiredstring
filters objectSame filter params as the corresponding list/search endpoint.
notify_email stringOptional email address for completion notification.

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
400ErrorResponseInvalid request parameters.
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
429ErrorResponseRate limit exceeded.
GET

/api/v1/exports

List exports for the authenticated account

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
200objectExports for the current account
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
GET

/api/v1/exports/{id}

Get an export job by ID

Parameters
NameInTypeDescription
id requiredpathstring

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
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
404ErrorResponseResource not found.
DELETE

/api/v1/exports/{id}

Delete an export job by ID

Parameters
NameInTypeDescription
id requiredpathstring

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
200objectDeleted
401ErrorResponseAuthentication required.
404ErrorResponseResource not found.
GET

Webhooks

GET

/api/v1/webhooks

List webhook endpoints

Returns webhook endpoints for the authenticated account. Secrets are omitted after creation.

Example request

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

Example response

{
  "data": [
    {
      "public_id": "wh_01J3NQ2Z2T7B7R3Y1QW8T8G5F2",
      "account_id": 123,
      "url": "https://example.test/webhook",
      "active": true,
      "subscriptions": [
        {
          "event_type": "foundation.grant.created",
          "target_type": "funder",
          "target_key": "12-3456789",
          "active": true
        }
      ],
      "created_at": "2026-07-22T12:00:00Z",
      "updated_at": "2026-07-22T12:00:00Z"
    }
  ]
}
Responses
StatusSchemaDescription
200objectWebhook endpoints for the authenticated account.
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
429ErrorResponseRate limit exceeded.
POST

/api/v1/webhooks

Create a webhook endpoint

Creates a signed webhook endpoint. If subscriptions are omitted, the endpoint defaults to `data.refresh.completed` on the account.

Request body
FieldTypeDescription
url requiredstringHTTPS destination URL. localhost loopback HTTP is allowed in development.
subscriptions arrayWebhook subscription objects with event_type, target_type, and optional target_key.
active booleanOptional active flag.

Example request

curl -X POST "https://api.501see.app/api/v1/webhooks" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.test/webhook",
    "subscriptions": [
      {
        "event_type": "data.refresh.completed",
        "target_type": "account"
      },
      {
        "event_type": "foundation.grant.created",
        "target_type": "funder",
        "target_key": "12-3456789"
      }
    ],
    "active": true
  }'

Example response

{
  "public_id": "wh_01J3NQ2Z2T7B7R3Y1QW8T8G5F2",
  "account_id": 123,
  "url": "https://example.test/webhook",
  "secret": "whsec_9b6a0d1a2f3c4e5f6789012345678901",
  "active": true,
  "subscriptions": [
    {
      "event_type": "data.refresh.completed",
      "target_type": "account",
      "active": true
    },
    {
      "event_type": "foundation.grant.created",
      "target_type": "funder",
      "target_key": "12-3456789",
      "active": true
    }
  ],
  "created_at": "2026-07-22T12:00:00Z",
  "updated_at": "2026-07-22T12:00:00Z"
}
Responses
StatusSchemaDescription
201WebhookEndpointCreated webhook endpoint. The secret is returned only on this response.
400ErrorResponseInvalid request parameters.
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
429ErrorResponseRate limit exceeded.
PATCH

/api/v1/webhooks/{id}

Update a webhook endpoint

Update the URL, active flag, subscriptions, or any combination of those fields. At least one field is required.

Parameters
NameInTypeDescription
id requiredpathstring
Request body
FieldTypeDescription
url string
active boolean
subscriptions arrayReplaces the endpoint's subscriptions when provided. An empty array resets to the default account-level refresh subscription.

Example request

curl -X PATCH "https://api.501see.app/api/v1/webhooks/wh_01J3NQ2Z2T7B7R3Y1QW8T8G5F2" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "active": false,
    "subscriptions": [
      {
        "event_type": "data.refresh.completed",
        "target_type": "account"
      }
    ]
  }'

Example response

{
  "public_id": "wh_01J3NQ2Z2T7B7R3Y1QW8T8G5F2",
  "account_id": 123,
  "url": "https://example.test/webhook-v2",
  "active": false,
  "subscriptions": [
    {
      "event_type": "data.refresh.completed",
      "target_type": "account",
      "active": true
    }
  ],
  "created_at": "2026-07-22T12:00:00Z",
  "updated_at": "2026-07-22T12:15:00Z"
}
Responses
StatusSchemaDescription
200WebhookEndpointUpdated webhook endpoint.
400ErrorResponseInvalid request parameters.
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
404ErrorResponseResource not found.
429ErrorResponseRate limit exceeded.
DELETE

/api/v1/webhooks/{id}

Delete a webhook endpoint

Deactivates the endpoint and all webhook subscriptions attached to it.

Parameters
NameInTypeDescription
id requiredpathstring

Example request

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

Example response

{
  "status": "ok"
}
Responses
StatusSchemaDescription
200objectWebhook endpoint deactivated.
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
404ErrorResponseResource not found.
429ErrorResponseRate limit exceeded.
GET

/api/v1/webhook-deliveries

List webhook deliveries

Returns delivery history for the authenticated account. Filter by `endpoint_id` to scope to one endpoint.

Parameters
NameInTypeDescription
endpoint_id querystringOptional webhook endpoint public ID.
limit queryinteger, default 50, min 1, max 100Maximum deliveries to return.

Example request

curl "https://api.501see.app/api/v1/webhook-deliveries?endpoint_id=wh_01J3NQ2Z2T7B7R3Y1QW8T8G5F2&limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

{
  "data": [
    {
      "public_id": "ndl_01J3NQ2Z2T7B7R3Y1QW8T8G5F2",
      "channel": "webhook",
      "destination": "https://example.test/webhook",
      "status": "delivered",
      "attempts": 1,
      "payload": {
        "event_id": "evt_01J3NQ2Z2T7B7R3Y1QW8T8G5F2",
        "event_type": "foundation.grant.created"
      },
      "created_at": "2026-07-22T12:30:00Z"
    }
  ]
}
Responses
StatusSchemaDescription
200objectWebhook deliveries for the authenticated account.
400ErrorResponseInvalid request parameters.
401ErrorResponseAuthentication required.
403ErrorResponsePlan or Developer API tier is insufficient for this operation.
429ErrorResponseRate limit exceeded.
GET

MCP

GET

/mcp

Open MCP SSE session

Opens a remote MCP-over-SSE session using the same API key auth and endpoint gates as the public REST API. The exposed toolset is limited to public developer API capabilities.

Responses
StatusSchemaDescription
200objectSSE stream established.
401objectMissing or invalid API key.
403objectAPI key is valid but the requested MCP capability is not available.
429ErrorResponseRate limit exceeded.
POST

/mcp

Send MCP message

Sends an MCP message to an existing SSE session. Uses the same API key auth and endpoint gates as the public REST API.

Responses
StatusSchemaDescription
200objectMessage accepted.
401objectMissing or invalid API key.
403objectAPI key is valid but the requested MCP capability is not available.
429ErrorResponseRate limit exceeded.

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.

Postman collection

Fork the public collection into your Postman workspace to explore requests, set your API key, and make your first call.

Remote MCP configuration

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