Grantlas API guide

API reference

Every endpoint, for whoever sets up the connection. New to the API? Start with the guide.

Basics

Base URL

https://api.grantlas.com/v1

The machine-readable description is at openapi.json (OpenAPI 3.1).

Authentication

Send your key in a header on every request: Authorization: Bearer gl_live_… (the word Bearer can be any case). Make keys in Settings → Integrations. Never put a key in a URL: any query value that starts with gl_live_ is refused with key_in_url, even a valid key, and you should revoke that key. Requests with a browser cookie are refused too.

Conventions

  • JSON, with snake_case field names.
  • One item: { data }. A list: { data, page, per_page, total, total_pages }.
  • Dates are YYYY-MM-DD. Times are ISO 8601 in UTC, like 2026-09-29T15:30:00.000Z.
  • Every record has url, its page in Grantlas.
  • Organizations, Tracker items and saved searches have ids like org_3f9a1c0e7b2d4a61, trk_8c2e5b17d94f0a3c and srch_51d7a0c9e3b86f24. Use them exactly as given. An id never changes. If you untrack something and track it again, it gets a new id. Funders and grants have number ids, the same as in their Grantlas links.
  • Errors: { error, message }, where error is one of the codes below and message is a plain sentence.
  • Query parameters you don't recognize from these pages are ignored, as in the app.

Pages

Lists take page (from 1) and per_page: up to 100 for your own data (Tracker, saved, new matches) and up to 25 for searches. Searches stop at 200 results, so page × per_page can't go past 200. In a search, total counts up to 200 and total_matching is the real number of matches.

Search order

  • sort=fit (the default): best Fit first across all results, so the first 200 are the organization's best 200.
  • sort=relevance: best keyword match first, the app's order.
  • sort=deadline (grants only): upcoming deadlines, soonest first. Grants with no deadline or a past deadline are left out.

Every search response has sort_applied: fit, fit_within_page, relevance or deadline. fit_within_page means the organization's first full analysis isn't finished: each page is sorted by Fit, but the list as a whole is in relevance order, and sort_note says so. Fit order can shift slightly between pages as new results are analyzed, so de-duplicate by id.

Fit

Funders and grants carry a fit object for the organization. Its status is one of:

scored
Analyzed. Has score (0 to 100), label (Great, Good, Okay or Bad) and a one-sentence reason.
still_scoring
Being analyzed now. Ask again in a minute.
not_scored
Not analyzed yet.
unavailable
This month's analysis allowance is used up.

fit.stale is true when the Fit is from before the organization's last profile change. Looking up or searching funders and grants analyzes what's returned, within your plan's monthly allowance, which can take a few seconds (up to about 15). Lists of your own data (Tracker, saved, new matches) show analysis already done and never start a new one.

Limits and headers

Each key can make 60 requests a minute; each account 10,000 in 24 hours, counted from the first request in that window. Responses carry X-RateLimit-Limit and X-RateLimit-Remaining (for this key, this minute). A 429 carries Retry-After, in seconds.

Errors

missing_key401
No key was sent, or not in the right form. Send Authorization: Bearer gl_live_…
invalid_key401
The key isn't valid: revoked, mistyped, or its maker left the team. Make a new one in Settings → Integrations.
key_in_url400
A key was in the URL. Revoke that key, since it may be in someone's logs, and send the new one in the header.
plan_required403
The account isn't on paid Grantlas Pro. The keys work again once it is.
read_only_key403
This key can only read. Make a key with “Read & Write” access.
org_not_found404
No organization with that id in this account. List yours with GET /v1/orgs.
not_found404
No such record, Tracker item, saved search or endpoint. Check the id or the path.
method_not_allowed405
This endpoint doesn't accept that method, for example POST to /v1/me. Check the method in the reference.
bad_request400
A parameter or the JSON body isn't right. The message says which.
invalid_field400
A Tracker field's value isn't allowed. Nothing was saved. The message names the field.
too_deep400
Search results stop at 200. Narrow the search with more filters.
funder_search_not_supported400
New matches work for grant searches only.
rate_limited429
Too many requests from this key this minute, or this account in 24 hours. Wait the seconds in Retry-After.
record_limit429
The account has looked up 1,000 funders and grants it hasn't saved or tracked in 24 hours. Saved and tracked ones still work.
cookies_not_accepted400
The request carried a browser cookie. The API takes an API key only; call it from a server or tool, not a web page.
server_error500
Something went wrong on our side. Try again in a minute.

Account

Who am IGET /v1/me

Read

The account and key you're using, and the limits that apply.

Example request
curl "https://api.grantlas.com/v1/me" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": {
    "account": {
      "plan": "pro"
    },
    "key": {
      "name": "Airtable sync",
      "prefix": "gl_live_ab12",
      "scope": "read",
      "created_at": "2026-09-01T16:00:00.000Z"
    },
    "limits": {
      "requests_per_minute_per_key": 60,
      "requests_per_day_per_account": 10000,
      "search_per_page_max": 25,
      "search_depth_max": 200,
      "list_per_page_max": 100,
      "record_lookups_per_day": 1000
    }
  }
}

List organizationsGET /v1/orgs

Read

Your organizations (a consultant's clients). Every other endpoint needs one of these ids.

Example request
curl "https://api.grantlas.com/v1/orgs" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": [
    {
      "id": "org_3f9a1c0e7b2d4a61",
      "name": "Front Range Food Partners",
      "ein": "84-2345678",
      "city": "Denver",
      "state": "CO"
    }
  ]
}

Sorted by name. Ids look like org_3f9a1c0e7b2d4a61 and never change.

Tracker

List the TrackerGET /v1/orgs/{org}/tracker

Read

The organization's Tracker, soonest deadline first. To keep another tool in sync, pass the time of your last sync as updated_since.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
stagequery · string
open (every stage before awarded or declined), closed (awarded and declined), all, or one stage. Anything else is a 400. Left out while updated_since is set, it means all.

One of: open, closed, all, researching, loi, applying, submitted, awarded, declined · Default: open

updated_sincequery · string
Only items changed at or after this date (2026-09-01) or time (2026-09-01T12:00:00Z, fractional seconds allowed), including changes made in the Grantlas app.
pagequery · integer
Page number, from 1.

Default: 1 · 1 or more

per_pagequery · integer
Items per page, 1 to 100.

Default: 25 · 1 to 100

Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/tracker" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": [
    {
      "id": "trk_8c2e5b17d94f0a3c",
      "type": "funder",
      "target_id": 90211,
      "name": "Rocky Mountain Family Trust",
      "stage": "loi",
      "stage_label": "LOI",
      "deadline": "2027-03-01",
      "amount_requested": 25000,
      "notes": "Program officer asked for a two-page LOI by email.",
      "updated_at": "2026-09-29T15:30:00.000Z",
      "url": "https://grantlas.com/funder/90211"
    }
  ],
  "page": 1,
  "per_page": 25,
  "total": 1,
  "total_pages": 1
}

Items with no deadline come last. With updated_since and no stage you get every stage, so moves to awarded or declined show up too. stage_label is the stage as the app shows it. deadline is YYYY-MM-DD. amount_requested is whole dollars. updated_at changes whenever the item changes, in the app or through the API.

Track a funder or grantPOST /v1/orgs/{org}/tracker

Read & Write

Adds a funder or grant to the Tracker at Researching and returns the new item.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
typeJSON body · string · required
funder or grant.

One of: funder, grant

idJSON body · integer · required
The funder's or grant's Grantlas id.

1 or more

Example request
curl -X POST "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/tracker" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"funder","id":90211}'
Example response · 201 Created
{
  "data": {
    "id": "trk_8c2e5b17d94f0a3c",
    "type": "funder",
    "target_id": 90211,
    "name": "Rocky Mountain Family Trust",
    "stage": "researching",
    "stage_label": "Researching",
    "deadline": null,
    "amount_requested": null,
    "notes": null,
    "updated_at": "2026-09-22T10:15:00.000Z",
    "url": "https://grantlas.com/funder/90211"
  }
}

If it's already tracked you get 200 with the existing item, and its stage isn't changed. 404 when Grantlas has no funder or grant with that id. stage_label is the stage as the app shows it. deadline is YYYY-MM-DD. amount_requested is whole dollars. updated_at changes whenever the item changes, in the app or through the API.

Update a Tracker itemPATCH /v1/orgs/{org}/tracker/{item}

Read & Write

Change any of stage, deadline, amount requested and notes. If one field is wrong, nothing is saved.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
itempath · string · required
A Tracker item id (the id of each Tracker item), like trk_8c2e5b17d94f0a3c.
stageJSON body · string
researching, loi, applying, submitted, awarded or declined.

One of: researching, loi, applying, submitted, awarded, declined

deadlineJSON body · string | null
YYYY-MM-DD, or null to clear.
amount_requestedJSON body · integer | null
Whole dollars, or null to clear.

0 or more

notesJSON body · string | null
Up to 2,000 characters, or null to clear.
Example request
curl -X PATCH "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/tracker/trk_8c2e5b17d94f0a3c" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stage":"loi","deadline":"2027-03-01","amount_requested":25000,"notes":"Program officer asked for a two-page LOI by email."}'
Example response · 200 OK
{
  "data": {
    "id": "trk_8c2e5b17d94f0a3c",
    "type": "funder",
    "target_id": 90211,
    "name": "Rocky Mountain Family Trust",
    "stage": "loi",
    "stage_label": "LOI",
    "deadline": "2027-03-01",
    "amount_requested": 25000,
    "notes": "Program officer asked for a two-page LOI by email.",
    "updated_at": "2026-09-29T15:30:00.000Z",
    "url": "https://grantlas.com/funder/90211"
  }
}

Send only the fields you want to change. stage_label is the stage as the app shows it. deadline is YYYY-MM-DD. amount_requested is whole dollars. updated_at changes whenever the item changes, in the app or through the API.

UntrackDELETE /v1/orgs/{org}/tracker/{item}

Read & Write

Removes the item from the Tracker. Its notes and dates go with it.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
itempath · string · required
A Tracker item id (the id of each Tracker item), like trk_8c2e5b17d94f0a3c.
Example request
curl -X DELETE "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/tracker/trk_8c2e5b17d94f0a3c" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"

Returns 204 No Content, with no body.

Saved

Saved funders and grantsGET /v1/orgs/{org}/saved

Read

Everything the organization has saved, newest first.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
typequery · string
funder or grant. Both when left out.

One of: funder, grant

pagequery · integer
Page number, from 1.

Default: 1 · 1 or more

per_pagequery · integer
Items per page, 1 to 100.

Default: 25 · 1 to 100

Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/saved" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": [
    {
      "type": "grant",
      "id": 55120,
      "name": "Community Food Security Innovation Grants",
      "saved_at": "2026-09-18T09:00:00.000Z",
      "fit": {
        "status": "scored",
        "score": 81,
        "label": "Good",
        "stale": false,
        "reason": "Supports community food access programs like your pantry network, at an award size you can manage."
      },
      "tracked": false,
      "url": "https://grantlas.com/grant/55120"
    }
  ],
  "page": 1,
  "per_page": 25,
  "total": 1,
  "total_pages": 1
}

fit is shown where it has already been analyzed; this list never starts an analysis. name is null once a record has left Grantlas. fit.status is scored (with score 0 to 100, label Great, Good, Okay or Bad, and a one-sentence reason), still_scoring (ask again in a minute), not_scored, or unavailable (this month's analysis allowance is used up). fit.stale is true when the fit is from before the organization's last profile change.

Deadlines

Upcoming deadlinesGET /v1/orgs/{org}/deadlines

Read

Open Tracker items with a deadline in the next N days, soonest first.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
daysquery · integer
How many days ahead to look, 1 to 365.

Default: 60 · 1 to 365

Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/deadlines" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": [
    {
      "date": "2027-03-01",
      "tracker_item_id": "trk_8c2e5b17d94f0a3c",
      "type": "funder",
      "id": 90211,
      "name": "Rocky Mountain Family Trust",
      "stage": "loi",
      "stage_label": "LOI",
      "reminders": "default",
      "url": "https://grantlas.com/funder/90211"
    }
  ]
}

reminders says which reminder emails are set for that item: default (the standard schedule), custom, or off.

Saved searches

List saved searchesGET /v1/orgs/{org}/saved-searches

Read

The organization's saved searches, newest first.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/saved-searches" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": [
    {
      "id": "srch_51d7a0c9e3b86f24",
      "name": "Food security grants for nonprofits",
      "type": "grant",
      "filters": {
        "keyword": "food security",
        "eligibilityType": "nonprofit"
      },
      "alerts": "on",
      "created_at": "2026-09-02T14:00:00.000Z",
      "new_matches_supported": true,
      "url": "https://grantlas.com/saved-searches"
    }
  ]
}

filters uses the same names as the search endpoints' filters. alerts is on or off. new_matches_supported is true for grant searches, the only kind the new-matches endpoint works with.

New matches for a saved searchGET /v1/orgs/{org}/saved-searches/{search}/matches

Read

Grants matching a saved grant search that Grantlas first saw on or after a date or time. For a daily automation, pass the time exactly 24 hours ago, so no match is sent twice.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
searchpath · string · required
A saved-search id from the list above, like srch_51d7a0c9e3b86f24.
sincequery · string · required
A date (2026-09-01, the whole day included) or a time (2026-09-01T06:00:00Z). Grants first seen at or after it are included.
pagequery · integer
Page number, from 1.

Default: 1 · 1 or more

per_pagequery · integer
Items per page, 1 to 100.

Default: 25 · 1 to 100

Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/saved-searches/srch_51d7a0c9e3b86f24/matches" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": [
    {
      "id": 55342,
      "title": "Rural Nutrition Access Partnership",
      "agency": "Department of Agriculture",
      "status": "open",
      "funding_min": 100000,
      "funding_max": 500000,
      "deadline": "2026-12-28",
      "fit": {
        "status": "scored",
        "score": 74,
        "label": "Good",
        "stale": false,
        "reason": "Funds nutrition access in rural areas, which your mobile pantry serves."
      },
      "saved": false,
      "tracked": false,
      "url": "https://grantlas.com/grant/55342"
    }
  ],
  "page": 1,
  "per_page": 25,
  "total": 1,
  "total_pages": 1
}

The organization's exclusions are applied. A funder search gets 400 funder_search_not_supported, because funder records have no posted date. fit is shown where it has already been analyzed. fit.status is scored (with score 0 to 100, label Great, Good, Okay or Bad, and a one-sentence reason), still_scoring (ask again in a minute), not_scored, or unavailable (this month's analysis allowance is used up). fit.stale is true when the fit is from before the organization's last profile change.

Funders

Search fundersGET /v1/orgs/{org}/funders

Read

Foundations and other grantmakers matching the filters, best Fit for this organization first. The organization's exclusions and hidden funders are left out.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
keywordquery · string
Words in the funder's name, mission or giving.
statequery · string
Two-letter state, e.g. CO.
cityquery · string
City.
sectorquery · string
A cause area, as in the app's Cause filter, e.g. education or human-services.
givingAreaquery · string
A giving area, as in the app's filter, e.g. health.
acceptsquery · string
1 = only funders that accept unsolicited applications.

One of: 1

cyclequery · string
year-round = funders with no deadline; dated = funders with a stated grant cycle. Either one also means they accept unsolicited applications.

One of: year-round, dated

dafquery · string
0 = leave out donor-advised funds.

One of: 0

minAssetsquery · integer
Minimum assets, dollars.

0 or more

maxAssetsquery · integer
Maximum assets, dollars.

0 or more

sortquery · string
fit = best Fit first; relevance = the app's order.

One of: fit, relevance · Default: fit

pagequery · integer
Page number, from 1.

Default: 1 · 1 or more

per_pagequery · integer
Results per page, 1 to 25. Results stop at 200, so page × per_page can't go past 200.

Default: 25 · 1 to 25

Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/funders" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": [
    {
      "id": 90211,
      "name": "Rocky Mountain Family Trust",
      "state": "CO",
      "assets": 48000000,
      "grant_size_band": "10k-50k",
      "giving_areas": [
        "human-services",
        "health"
      ],
      "accepts_unsolicited": true,
      "fit": {
        "status": "scored",
        "score": 88,
        "label": "Great",
        "stale": false,
        "reason": "Funds food security and nutrition programs along Colorado's Front Range, where you work."
      },
      "saved": false,
      "tracked": true,
      "url": "https://grantlas.com/funder/90211"
    }
  ],
  "page": 1,
  "per_page": 25,
  "total": 38,
  "total_matching": 38,
  "total_pages": 2,
  "sort_applied": "fit"
}

Results can take a few seconds while Grantlas analyzes them (up to about 15). Only the page you ask for is analyzed. Results stop at 200: total counts up to that, and total_matching is the real number of matches. sort_applied says which order you got. fit_within_page means the organization's first full analysis isn't finished yet, so results are in relevance order with each page sorted by fit, and sort_note says so. Because new results get analyzed as you page, the Fit order can shift slightly between pages: de-duplicate by id. Filter names you don't recognize from this list are ignored, as in the app. fit.status is scored (with score 0 to 100, label Great, Good, Okay or Bad, and a one-sentence reason), still_scoring (ask again in a minute), not_scored, or unavailable (this month's analysis allowance is used up). fit.stale is true when the fit is from before the organization's last profile change.

A funderGET /v1/orgs/{org}/funders/{id}

Read

One funder's full profile, with Fit and red flags for this organization.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
idpath · integer · required
The funder's Grantlas id (in every funder result).

1 or more

Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/funders/90211" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": {
    "id": 90211,
    "ein": "84-1234567",
    "name": "Rocky Mountain Family Trust",
    "city": "Denver",
    "state": "CO",
    "assets": 48000000,
    "grant_size_band": "10k-50k",
    "accepts_unsolicited": true,
    "description": "A family foundation supporting food security, health and youth programs along Colorado's Front Range.",
    "giving_areas": [
      "human-services",
      "health"
    ],
    "application_info": "Send a two-page letter of inquiry by email. Full proposals are by invitation after the letter is reviewed.",
    "submission_deadlines": "March 1 and September 1",
    "award_restrictions": "No grants to individuals or for capital campaigns.",
    "officers": [
      {
        "name": "Margaret Ellison",
        "title": "Executive Director"
      }
    ],
    "year_founded": 1987,
    "ntee_code": "T20",
    "metrics": {
      "median_grant": 30000,
      "low_grant": 5000,
      "high_grant": 150000,
      "grants_per_year": 24,
      "trend_3yr": 1.11,
      "geo_concentration": 0.92,
      "new_grantee_rate": 0.27
    },
    "giving_by_year": [
      {
        "year": 2024,
        "total": 840000,
        "count": 22
      },
      {
        "year": 2023,
        "total": 790000,
        "count": 24
      },
      {
        "year": 2022,
        "total": 760000,
        "count": 26
      }
    ],
    "fit": {
      "status": "scored",
      "score": 88,
      "label": "Great",
      "stale": false,
      "reason": "Funds food security and nutrition programs along Colorado's Front Range, where you work."
    },
    "red_flags": [],
    "saved": false,
    "tracked": true,
    "hidden": false,
    "url": "https://grantlas.com/funder/90211"
  }
}

metrics is null when Grantlas has no giving data for the funder. giving_by_year is newest first. red_flags lists plain warnings such as "Invitation only" or "Giving sharply declining", and is empty when there are none. Analyzed now if needed, within your plan's monthly allowance, which can take a few seconds. Records the organization hasn't saved or tracked count toward the limit of 1,000 lookups a day per account. fit.status is scored (with score 0 to 100, label Great, Good, Okay or Bad, and a one-sentence reason), still_scoring (ask again in a minute), not_scored, or unavailable (this month's analysis allowance is used up). fit.stale is true when the fit is from before the organization's last profile change.

Grants

Search grantsGET /v1/orgs/{org}/grants

Read

Grant opportunities matching the filters, best Fit for this organization first. The organization's exclusions are applied.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
keywordquery · string
Words in the title or description.
agencyquery · string
Funding agency, as grants.gov names it.
statusquery · string
open or closed. Both when left out.

One of: open, closed

eligibilityTypequery · string
Who can apply: nonprofit, government, education, individual or other.

One of: nonprofit, government, education, individual, other

minFundingquery · integer
Minimum award, dollars.

0 or more

maxFundingquery · integer
Maximum award, dollars.

0 or more

deadlineFromquery · string
Deadline on or after, YYYY-MM-DD.
deadlineToquery · string
Deadline on or before, YYYY-MM-DD.
sortquery · string
fit = best Fit first; relevance = the app's order; deadline = upcoming deadlines, soonest first; grants with no deadline or a past deadline are left out.

One of: fit, relevance, deadline · Default: fit

pagequery · integer
Page number, from 1.

Default: 1 · 1 or more

per_pagequery · integer
Results per page, 1 to 25. Results stop at 200, so page × per_page can't go past 200.

Default: 25 · 1 to 25

Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/grants" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": [
    {
      "id": 55120,
      "title": "Community Food Security Innovation Grants",
      "agency": "Health Resources and Services Administration",
      "status": "open",
      "funding_min": 50000,
      "funding_max": 250000,
      "deadline": "2026-11-13",
      "fit": {
        "status": "scored",
        "score": 81,
        "label": "Good",
        "stale": false,
        "reason": "Supports community food access programs like your pantry network, at an award size you can manage."
      },
      "saved": true,
      "tracked": false,
      "url": "https://grantlas.com/grant/55120"
    }
  ],
  "page": 1,
  "per_page": 25,
  "total": 12,
  "total_matching": 12,
  "total_pages": 1,
  "sort_applied": "fit"
}

sort=deadline leaves out grants with no deadline or a past deadline, which lowers total_matching. Results can take a few seconds while Grantlas analyzes them (up to about 15). Only the page you ask for is analyzed. Results stop at 200: total counts up to that, and total_matching is the real number of matches. sort_applied says which order you got. fit_within_page means the organization's first full analysis isn't finished yet, so results are in relevance order with each page sorted by fit, and sort_note says so. Because new results get analyzed as you page, the Fit order can shift slightly between pages: de-duplicate by id. Filter names you don't recognize from this list are ignored, as in the app. fit.status is scored (with score 0 to 100, label Great, Good, Okay or Bad, and a one-sentence reason), still_scoring (ask again in a minute), not_scored, or unavailable (this month's analysis allowance is used up). fit.stale is true when the fit is from before the organization's last profile change.

A grantGET /v1/orgs/{org}/grants/{id}

Read

One grant in full, with Fit and an eligibility check for this organization.

Parameters

orgpath · string · required
An organization id from GET /v1/orgs, like org_3f9a1c0e7b2d4a61.
idpath · integer · required
The grant's Grantlas id.

1 or more

Example request
curl "https://api.grantlas.com/v1/orgs/org_3f9a1c0e7b2d4a61/grants/90211" \
  -H "Authorization: Bearer $GRANTLAS_API_KEY"
Example response · 200 OK
{
  "data": {
    "id": 55120,
    "title": "Community Food Security Innovation Grants",
    "agency": "Health Resources and Services Administration",
    "status": "open",
    "opportunity_number": "HRSA-27-041",
    "funding_min": 50000,
    "funding_max": 250000,
    "deadline": "2026-11-13",
    "posted": "2026-09-19",
    "eligible_applicants": [
      "Nonprofits with 501(c)(3) status"
    ],
    "eligibility_text": "Nonprofit organizations with 501(c)(3) status that run community food programs.",
    "description": "Supports community organizations expanding emergency food access and nutrition education in underserved areas.",
    "fit": {
      "status": "scored",
      "score": 81,
      "label": "Good",
      "stale": false,
      "reason": "Supports community food access programs like your pantry network, at an award size you can manage."
    },
    "eligibility": {
      "verdict": "yes",
      "stale": false,
      "reasoning": "You're a 501(c)(3) running a food pantry network, which is who this grant is for.",
      "requirement": "501(c)(3) nonprofit with community food programs"
    },
    "saved": true,
    "tracked": false,
    "url": "https://grantlas.com/grant/55120"
  }
}

eligibility is null until the grant has been checked for this organization. Its verdict is yes, no or unclear, with the reasoning and, when there is one, the requirement it turns on. Analyzed now if needed, within your plan's monthly allowance, which can take a few seconds. Records the organization hasn't saved or tracked count toward the limit of 1,000 lookups a day per account. fit.status is scored (with score 0 to 100, label Great, Good, Okay or Bad, and a one-sentence reason), still_scoring (ask again in a minute), not_scored, or unavailable (this month's analysis allowance is used up). fit.stale is true when the fit is from before the organization's last profile change.

Grantlas API guide · Google Sheets recipe · Zapier and Make recipe