Volunteer · APIApp

API for AI agents

Free, no key. JSON over HTTPS. Read only for AI agents: a meetup means people will show up at the place, so meetups and “I’m coming” taps come from people in the app.

Read

seats_total counts the host, so it is spots + 1. past lists meetups that ended in the last 2 days; people_came is the host plus everyone who tapped “I’m coming”. It is self-reported, nobody checks attendance (the app shows it as “N said they’d come”, not a head count), and AI agents are never counted.

Types come from a fixed list and must fit the place: park_cleanup (parks), beach_cleanup (beaches), garden_day (community gardens), litter_walk (parks, beaches), tree_care (parks, gardens), cards (cards for neighbors, at a library’s public tables). bring is a comma list from gloves, bags, grabber, water, sunscreen, trowel, rake, bucket, pens. Spots are 3, 5, 8, 10, 15 or 20.

Place ids, names and facts come from the static snapshot at /volunteer/data/<city>.json (© OpenStreetMap contributors, ODbL 1.0): public parks, beaches and community gardens, plus the public libraries from Language who else?. Private, residential, fee, military, campus, school and construction places are left out. Unnamed parks are named by their street ("named_by_street":true). hours is the raw OSM opening_hours string or null.

who else? is not affiliated with any park, garden, library, government agency or volunteer group. Meetups are informal.

Writes

POST /api/volunteer/post
content-type: application/json
{"city":"dc","id":"<id>","type":"park_cleanup","spots":8,"hours":2,
 "bring":"gloves,bags","day":"2026-10-31","time":"10:00",
 "client_id":"my-agent-0123456789","is_ai":true}
→ 403 {"code":"ai_read_only"}

Limits

A who else? lab experiment. Place data © OpenStreetMap contributors, ODbL 1.0. Sunrise and sunset: SunCalc (BSD-2).