The seven endpoints
These seven endpoints are the only write-heavy surface in the API. If your integration needs to organize Users into collections programmatically, Groups are the path.
The Group resource
TheGroupResource schema documents these fields:
⚠️ Spec gap (audit #39):
GroupResource.description reads "List of Groups" — a copy-paste error. The schema describes a single Group, not a list. The description will be corrected in a future spec revision.Parent-child group hierarchy
Groups can have parent-child relationships: Theparent_id field on each Group identifies its parent. The has_subgroups boolean tells you whether a Group is itself a parent.
This lets the customer build organizational structures that match their actual team structure — a top-level “all volunteers” Group, regional sub-groups, and event-specific crews beneath those.
For partner integrations:
Listing groups
cURL
Available filters
Note: the spec does not document
page as a parameter on /groups, but the response uses the standard data/links/meta envelope. Pagination almost certainly works the same as other list endpoints — follow links.next.
Common list patterns
Top-level Groups only:JavaScript
parent_id query parameter accepts a blank value to mean “null”, this could be done server-side; otherwise filter client-side.
Children of a specific Group:
JavaScript
JavaScript
Fetching a single group
cURL
GroupResource for the specified ID wrapped in data.
JavaScript
GET /groups/{id}/members.
Creating a group
POST /groups creates a new Group. The request body accepts:
members array in the request lets you populate the Group at creation time. Without it, the Group is created empty and you’d separately call PUT /groups/{id}/members to add members.
The moniker fields
VOMO Groups support custom monikers — display labels that override the default “member” and “subgroup” wording for that Group:
When set, these labels appear in the VOMO admin UI in place of the generic terms. Useful for organizations with established team vocabulary.
Updating a group
PUT /groups/{id} is a full replacement — submit the entire Group’s data, not just the fields you want to change.
cURL
PUT /groups/{id}:
Notice that
members is accepted on PUT /groups/{id} — meaning a single update call can change both the Group’s metadata AND its member list. This is convenient for full Group migrations.
For partial updates (modify only the description, leave everything else alone), use the GET-then-PUT pattern:
JavaScript
Deleting a group
cURL
JavaScript
Listing group members
cURL
data/links/meta envelope; each member entry is a User-shaped object.
JavaScript
Replacing group members
PUT /groups/{id}/members replaces the Group’s entire member list:
cURL
Replacement semantics
The PUT replaces the entire member list. Members not in the submitted array are removed from the Group. To add a single member to a Group without removing others, first GET the current members, then PUT the union:JavaScript
Bulk roster sync
For partner integrations syncing an external roster (e.g., a corporate volunteer program tracking who’s eligible to participate), batch operations work well:JavaScript
Common workflows
Build a Group from a query
For dynamically-built Groups (e.g., “all volunteers who participated in 2024”):JavaScript
Reflect external team structure in VOMO
For organizations with existing team structures in HR or other systems:JavaScript
Find Groups containing a specific User
There’s no direct “Groups for User” endpoint — you fetch the User’s group memberships through the User detail or by querying Groups and checking memberships:JavaScript
A reference Groups client
JavaScript
Where to go next
Users
The User resource — Group members are Users.
Organizations and Org Family
The Organization hierarchy that Groups belong to.
Manage Groups and Members
The workflow-page walkthrough for Group management patterns.
The Volunteer Data Model
The full data model context for Groups.