AllForGood APIallforgood.org ↗
Search and retrieve volunteer opportunities from the Points of Light network. Filter by location, issue area, skills, and commitment type across thousands of listings.
What is the AllForGood API?
The AllForGood.org API provides 4 endpoints for searching and retrieving volunteer opportunities from the Points of Light global network. The search_opportunities endpoint supports full-text search across opportunity titles and descriptions, geographic proximity filtering via lat_lng and radius, and returns paginated results alongside facet counts for dimensions like presence type, issue area, and skills. Individual listing details, organization-level listings, and direct signup links are each available through dedicated endpoints.
curl -X GET 'https://api.parse.bot/scraper/495cbd4b-b6fe-472c-b766-2d09624cf903/search_opportunities?page=0&query=education&hits_per_page=5' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace allforgood-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Points of Light Engage API — find volunteer opportunities, drill into details."""
from parse_apis.points_of_light_engage_api import PointsOfLight, Presence, CommitmentType, ResourceNotFound
client = PointsOfLight()
# Search for remote education opportunities — limit= caps total items fetched.
for summary in client.opportunitysummaries.search(query="education", presence=Presence.REMOTE, limit=3):
print(summary.title, summary.organization, summary.presence)
# Drill into the first result for full details.
first = client.opportunitysummaries.search(query="tutoring", commitment_types=CommitmentType.ONGOING, limit=1).first()
if first:
detail = first.details()
print(detail.title, detail.description[:100], detail.signup_url)
# Get signup link via sub-resource (lighter than full detail fetch).
link = first.signup.get()
print(link.signup_url)
# Explore the organization's other opportunities.
org = client.organization(id=detail.organization.id)
for opp in org.opportunities(limit=3):
print(opp.title, opp.url)
# Typed error handling: catch not-found for a bad ID.
try:
client.opportunities.get(id="nonexistent-id-12345")
except ResourceNotFound as exc:
print(f"Not found: {exc}")
print("exercised: opportunitysummaries.search / details / signup.get / opportunities.get / organization.opportunities")Full-text search over volunteer opportunities with faceted filtering. Supports geographic proximity via lat_lng + radius, and categorical filters (presence, issue areas, skills, commitment types). Returns paginated results and facet counts for all filter dimensions. Each result is a summary; use get_opportunity_detail for full description and signup URL.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-based). |
| query | string | Search keyword to match against opportunity titles and descriptions. |
| radius | integer | Search radius in meters (used with lat_lng). |
| skills | string | Filter by skills/interests (comma-separated): Administrative, Advocacy, Teaching, Marketing, Business Skills, Media, Web Development, Social Media, Leadership, Nonprofit Management, Research, Data Science, Health Professional, Design, Skilled Labor, Photography, Human Resources, Event Support, Arts, Physical Labor, Technology, Legal, Writing, Caregiving, Finance, Public Speaking, Driving, Mentoring, Fundraising, Spanish Speakers, Food Service, Community Outreach, Accounting, Coaching, Facilitation, Board Service. |
| lat_lng | string | Geographic coordinates as latitude,longitude for location-based search (e.g. 40.0379,-76.3025). |
| presence | string | Filter by presence type (comma-separated): Remote, In-Person. |
| issue_areas | string | Filter by issue areas (comma-separated): Education, Health & Wellness, Community Strengthening, Arts & Culture, Children & Youth, Animals, Seniors, Hunger, Disaster Response & Recovery, Environment, STEM, Veterans & Military Families, Disabilities, Technology, Civil Rights, Family Services, Women's Issues, Literacy, Poverty, Sports & Recreation, Immigrant & Refugee Services, Public Safety, Job Training & Employment, Homelessness, COVID-19, Mentoring, Adult Education. |
| hits_per_page | integer | Number of results per page (e.g. 5, 10, 20). |
| commitment_types | string | Filter by commitment types (comma-separated): Ongoing, Event, AmeriCorps. |
{
"type": "object",
"fields": {
"page": "integer current page number",
"facets": "object with counts per filter category (presence, duration_kind, concentrated_skills, concentrated_features, concentrated_cause_areas)",
"total_hits": "integer total matching opportunities",
"total_pages": "integer total pages available",
"opportunities": "array of opportunity summaries with id, title, organization, location, presence, dates, url"
}
}About the AllForGood API
Searching Volunteer Opportunities
The search_opportunities endpoint is the main entry point. It accepts a query string for keyword matching and supports layered filtering using issue_areas (e.g. Education, Health & Wellness, Arts & Culture), skills (e.g. Teaching, Advocacy, Marketing), and presence (Remote or In-Person). Geographic searches use the lat_lng parameter as a latitude,longitude string paired with a radius in meters. Results are paginated via page and hits_per_page. The response includes total_hits, total_pages, an opportunities array with fields like id, title, organization, location, presence, and url, plus a facets object with counts across all filter dimensions.
Opportunity and Organization Detail
get_opportunity_detail retrieves the full record for a single listing by its id from search results. The response adds fields not available in search summaries: description (full text), signup_url (the external application link), coordinates (an object with lat and lng floats), and date_time. The organization object contains both the organization name and its id slug. That slug feeds directly into get_organization_opportunities, which returns all opportunities posted by the same organization — useful for browsing a nonprofit's full listing set.
Signup Links
get_signup_link is a focused endpoint that returns only the signup_url for a given opportunity id. Some opportunities do not have an external signup link, in which case the field returns an empty string. This endpoint is useful when you already hold an opportunity ID and only need to surface the registration link without fetching the full detail record.
The AllForGood API is a managed, monitored endpoint for allforgood.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when allforgood.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official allforgood.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a volunteer matching app that filters opportunities by
lat_lng,radius, andissue_areasto surface local causes - Aggregate remote-only volunteer listings using the
presence=Remotefilter acrosssearch_opportunities - Display a nonprofit's full opportunity catalog using
get_organization_opportunitieswith theorg_idfrom a detail record - Embed a direct 'Sign Up' button in a civic app by fetching
signup_urlviaget_signup_link - Populate faceted search UI using the
facetscounts returned bysearch_opportunitiesfor presence, skills, and cause area - Build a skills-based volunteer finder filtering by specific values like Teaching or Business Skills via the
skillsparameter - Track opportunity coverage across issue areas by paginating
search_opportunitiesand aggregatingconcentrated_cause_arfacet data
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does AllForGood.org have an official developer API?+
What does `search_opportunities` return beyond the listing list?+
opportunities array, the response includes a facets object with counts for each filter dimension — including presence, duration_kind, concentrated_skills, concentrated_features, and concentrated_cause_ar. These counts let you build accurate filter UIs without issuing separate queries per facet. total_hits and total_pages support pagination.Are organization profile pages or nonprofit metadata exposed?+
name and id slug within opportunity records, and get_organization_opportunities lists all opportunities for a given org. Full nonprofit profiles, contact details, and organizational metadata are not covered. You can fork it on Parse and revise to add an organization detail endpoint if that data is available at the source.What happens when an opportunity has no geographic coordinates?+
coordinates field in get_opportunity_detail returns an empty object when location coordinates are unavailable. The location field still returns a text string in those cases. For geographic search, the lat_lng and radius parameters in search_opportunities apply proximity filtering, but individual records may omit precise coordinates.