Prerequisites
If you’re new to a Volunteer integration, the first three steps are typically done by the customer or their VOMO concierge — the partner integration team coordinates to receive the token. See Authentication for the full token issuance flow.
Step 1: store the token securely
Once you receive the Bearer token from the customer, store it in a secrets manager (AWS Secrets Manager, HashiCorp Vault, etc.). For local development, an environment variable is acceptable:Step 2: make the first request
The smallest useful call: list the first page of users in the customer’s account.Step 3: read the response
A successful response looks like this (truncated for readability):
For the first call, the most important field is
meta.total — it tells you how many users the customer has in total. Paired with meta.per_page, you know how many pages you’ll need to read to capture everything.
Step 4: parse and iterate
A minimal pattern for processing the response:- Follow
links.nextrather than constructing page URLs manually. The platform provides the link; use it. - Stop when
links.nextisnull. That’s the signal there are no more pages.
Step 5: handle errors
The spec is sparse on documented error responses, but partner code should still handle common failure modes:JavaScript
Step 6: try a filter
The list endpoint accepts several filter parameters. Try filtering users by name:name_like parameter does a substring match against first and last name. Other available filters on GET /users:
All parameters use
snake_case and are documented in the spec for each endpoint.
What you’ve accomplished
After this quickstart, you have:- A working API call that lists users from a customer’s VOMO account
- Confirmed the Bearer token is valid
- A pattern for iterating through paginated results
- Defensive error handling for common failure modes
- A working filter to narrow results
Common gotchas
A few things that trip up new Volunteer integrations:Forgetting the /v1/ segment
Volunteer’s base URL is https://api.vomo.org/v1 — the /v1/ is part of the path. Requests to https://api.vomo.org/users (without /v1) will fail. This differs from Raise, which has no version segment.
Assuming camelCase
createdAfter and nameLike don’t work — the parameters are created_after and name_like with underscores. The same applies to response properties: firstName doesn’t appear in the response, but first_name does.
Treating meta.total as a moving target
If new users are added between page reads, meta.total can change mid-iteration. For strict consistency, capture meta.total from the first page and use it as the iteration bound, accepting that the snapshot may not be perfectly current. For most analytics, this is acceptable.
Treating null strings as null
The spec example for links.prev and links.next shows the value as the literal string "null". The live API returns actual JSON null (no quotes). Code that checks for the string "null" will incorrectly treat all pages as having a previous and next page.
JavaScript
null, not "null". Check with === null or simple truthiness.
Tokens are per-organization
The Bearer token is scoped to a single VOMO organization. A token issued for “Wayne Foundation” can only read Wayne Foundation’s data. For multi-customer partner integrations, store one token per customer.Where to go next
Authentication
The full token issuance, storage, and rotation flow.
First API Call
A deeper walkthrough of the request/response patterns introduced here.
Pagination
The full pagination pattern with edge cases and performance considerations.
The Volunteer Data Model
What’s available beyond users — the full resource model.