On this page and tools
Start here
Your first call
Read community resources with a developer key. About five minutes.
-
Create an account and a key
Sign in at bynefit.com/dash/login, open /dash/developers/keys and choose Create key. Give it a label (like
my-side-project) and copy the token. You will only see it once. A developer key works without a team. Pick Test for abapi_pk_test_key while you build: the same call below answers with sample entries, and anything you submit stays in a sandbox. -
Keep it secret
Put it in an environment variable named
BYNEFIT_API_KEYand never commit it. If it leaks, revoke it on the same page and make a new one. - Make the call Run this. The key is read from the environment variable.
curl https://bynefit.com/dash/api/v1/resources \
-H "Authorization: Bearer $BYNEFIT_API_KEY"const res = await fetch('https://bynefit.com/dash/api/v1/resources', {
headers: { Authorization: `Bearer ${process.env.BYNEFIT_API_KEY}` },
});
const page = await res.json();
console.log(page.data.length, page.has_more);import os
import requests
res = requests.get(
'https://bynefit.com/dash/api/v1/resources',
headers={'Authorization': f"Bearer {os.environ['BYNEFIT_API_KEY']}"},
)
page = res.json()
print(len(page['data']), page['has_more'])$ch = curl_init('https://bynefit.com/dash/api/v1/resources');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('BYNEFIT_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$page = json_decode(curl_exec($ch), true);
echo count($page['data']), ' ', var_export($page['has_more'], true);struct Page: Decodable {
let data: [Resource]
let hasMore: Bool
enum CodingKeys: String, CodingKey { case data; case hasMore = "has_more" }
}
struct Resource: Decodable { let id: String; let name: String }
let key = ProcessInfo.processInfo.environment["BYNEFIT_API_KEY"] ?? ""
var req = URLRequest(url: URL(string: "https://bynefit.com/dash/api/v1/resources")!)
req.setValue("Bearer \(key)", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: req)
let page = try JSONDecoder().decode(Page.self, from: data)You get back JSON that looks something like this:
200 OKapplication/json
{
"data": [
{
"id": "res_3f9a1c07d2b84e55",
"type": "resource",
"name": "Atlanta Community Food Bank",
"description": "Food distribution for metro Atlanta",
"category": "food",
"address": "732 Joseph E. Lowery Blvd NW, Atlanta, GA",
"phone": "(404) 892-9822",
"website": "https://www.acfb.org",
"hours": null,
"upvote_count": 4,
"go_website": "https://bynefit.com/go/r101w",
"go_phone": "https://bynefit.com/go/r101p",
"registered_on": "2026-04-21T19:45:02+00:00"
}
],
"next_cursor": "eyJjIjoiMjAyNi0wNC0yMSAxOTo0NTowMiIsImkiOjEwMX0",
"has_more": true,
"meta": {
"source": "bynefit.com",
"powered_by": "Bynefit Inc.",
"license": "Public domain — free to use with attribution",
"docs": "https://bynefit.com/docs/resources-read"
}
}
Results are returned newest first, in pages. When has_more
is true, pass next_cursor back as
?cursor= to get the next page; when it is false
(and next_cursor is null) you have everything.
Treat the cursor as an opaque string.
If it does not work
| You see | It means |
|---|---|
401 | The key is missing, wrong or revoked. Check the header and the key. |
403 test_mode_unsupported | A test key called something with no sample data. Use a live key for that call. |
400 invalid_since | The since filter is not an ISO-8601 date-time. |
400 invalid_cursor | The cursor is not one we issued. Start again without a cursor. |
429 | Too many requests. Wait for the time in Retry-After, then retry. |
Next steps
- Building with an AI agent, or about to write data? Start with Test mode.
- Read Authentication to understand how your key is checked.
- Having an AI agent read your Space? Give it an agent key: read-only, short-lived, and you can pause it in one click.
- Setting up "Sign in with Bynefit" for your own app? See OAuth 2.0 / OpenID Connect.
- Browse Resources — read for the full field list and filters.
- Want to contribute data? See Resources — submit.