Prerequisites
| Requirement | How to obtain |
|---|---|
| A VOMO customer account | The customer signs up at vomo.org or coordinates with their VOMO concierge |
| API access enabled for the account | Coordinate with the VOMO concierge to enable API access (this is not on by default) |
| A Bearer token | The customer’s VOMO administrator generates the token in the admin portal |
| A tool to make HTTP requests | curl, Postman, or any language with an HTTP client |
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.| Element | Description |
|---|---|
Authorization: Bearer ... | The token in the Authorization header. Required on every request. |
Accept: application/json | Optional but explicit — confirms you want JSON. The API returns JSON regardless. |
| No query parameters | Returns the first page with default page size. |
Step 3: read the response
A successful response looks like this (truncated for readability):| Field | Purpose |
|---|---|
data | The array of resources for this page. Each element is a User. |
links | URLs for navigating between pages — first, last, prev, next. The prev and next are null at the edges. |
meta | Numeric metadata about the pagination state — current page, page size, total records, etc. |
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:
| Parameter | What it filters by |
|---|---|
name_like | First or last name substring match |
email_like | Email substring match |
created_before | Users created on or before a date |
created_after | Users created on or after a date |
updated_before | Users updated on or before a date |
updated_after | Users updated on or after a date |
page | Page number (default 1) |
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.