An orientation to the Volunteer API — what VOMO is, what the API exposes, what makes it distinct from the other Virtuous APIs, and what partner integrations typically use it for.
The Volunteer API (commonly referred to internally as the VOMO API) gives partner integrations programmatic access to a customer’s volunteer management data in VOMO — their Users, Projects, Groups, Campaigns, Organizations, Forms, and Certificates. It’s the third of the three Virtuous APIs, alongside CRM+ and Raise, and it’s the most distinct of the three in conventions, scope, and design.This page covers what the API is for, how it differs from the other two Virtuous APIs, and what partner integrations typically build against it.
Volunteer uses snake_case everywhere — query parameters (name_like, created_before, updated_after) and response properties (first_name, last_name, created_at, user_status). This is consistent throughout the API but differs from CRM+ (PascalCase) and Raise (mixed PascalCase on /list, camelCase on /query).For partners building integrations against multiple Virtuous APIs:
CRM+ and Raise use { list, total } and { items, total } envelopes respectively. Volunteer uses a richer Laravel-style envelope with three top-level fields:
The links field provides direct URLs for paging navigation — partners can follow links.next rather than constructing URLs manually. See Pagination for the full pattern.
Unlike CRM+ and Raise (which both have webhook subscription APIs), Volunteer has no webhook surface at all. Partner integrations that need to react to changes in Volunteer data must poll — typically by querying with the updated_after filter on resources that support it.This shapes the integration architecture significantly. The “Webhooks and Events” group in the CRM+ and Raise docs is replaced by Polling and Sync in the Volunteer docs.
The API is dominated by GET endpoints. The write endpoints that do exist:
Resource
Write operations
Users
POST /users (create or update — upsert behavior)
Groups
POST /groups, PUT /groups/{id}, DELETE /groups/{id}, PUT /groups/{id}/members
Projects
POST /projects, PUT /projects/{id}
Most notably, there’s no write endpoint for Participations. Partners can read participation records (returned nested on User and Project Date responses) but cannot create or modify them through the API. Partners who need to record participations programmatically must coordinate with VOMO’s admin team for an alternative path.See Understand Write Limitations for the complete picture.
Volunteer’s path includes a /v1/ segment: https://api.vomo.org/v1/users. This is different from Raise (which is unversioned) and CRM+ (which uses unversioned /api/ paths). The presence of /v1/ suggests a future /v2/ may exist someday and existing integrations would have a migration path.For now, all integrations use /v1/. See Versioning and Backward Compatibility.
What partner integrations build against the Volunteer API
Common partner integration patterns:
Integration type
What it does
Reporting and BI
Pulls volunteer engagement metrics into dashboards, BI tools, or data warehouses
Donor-volunteer crossover analytics
Identifies donors who also volunteer (and vice versa) by syncing with CRM+
External CRM sync
Mirrors Volunteer’s User and Participation data into a generic CRM for unified stewardship
Communications platforms
Uses Volunteer data to segment volunteers by activity for email or SMS outreach
Compliance and certifications
Tracks training completion via Certificates for organizations with regulated programs
Custom reporting
Builds organization-specific reports (volunteer hours per Project, retention metrics, etc.)
Most of these are read-heavy. Volunteer’s API surface is well-suited to feeding data outward into other systems.What the API is not typically used for:
Recording new participations — no write endpoint exists
Managing volunteer scheduling — Project Dates are read-only; scheduling happens in the VOMO admin UI
Volunteer self-service — the API isn’t designed for direct exposure to volunteers; build a partner-controlled portal layer instead
A quick reference for partners building against multiple APIs:
Convention
CRM+
Raise
Volunteer
Base URL
https://api.virtuoussoftware.com
https://prod-api.raisedonors.com
https://api.vomo.org/v1
Versioning
No /v1/ segment
No /v1/ segment
/v1/ segment in URL
Auth
Bearer JWT
Bearer JWT
Bearer JWT
Param casing
PascalCase
PascalCase on /list, camelCase on /query
snake_case
Property casing
PascalCase
camelCase
snake_case
Pagination envelope
{ list, total }
{ items, total }
{ data, links, meta }
Pagination model
Skip / Take offsets
skip / take offsets
page numbers
Webhooks
Yes (8 endpoints)
Yes (8 endpoints)
None
Write endpoints
Many
Many
Few (Users, Groups, Projects)
The three APIs were built by different teams at different times (some pre-acquisition by Virtuous). The differences reflect those histories. The v2 platform overhaul is expected to reconcile many of these inconsistencies, but until then, integrations target each API on its own terms.
The Volunteer OpenAPI spec has several gaps the documentation team is aware of and that partner integrations should know about:
Gap
Implication
17 of 20 endpoints document no error responses
The spec says nothing about 401, 403, 404, or 500. Defensive coding is essential.
Empty schema: {} on several endpoints
The Organization endpoints, several Campaign endpoints, and others have no formal response shape — only inline examples.
Schema description copy-paste errors
CampaignResource says “A VOMO Project”; ParticipationResource says “List of Groups”; others have similar issues.
hours field type mismatch
Typed as integer in spec but returns fractional values (e.g., 4.00) from the live API. Code should expect a number, not an integer.
Resource naming inconsistency
The same resource appears as “certificate”, “certification”, and “certifications” in different places. Live API uses /certificates path.
Placeholder field descriptions
PUT /projects/{id} has many fields with "Update Project" as the description (placeholder text left in).
PATCH not supported
Updates require full-record PUT. No partial-update support.
These are documented inline on the relevant reference pages with <Warning> callouts. Until the spec is updated, the patterns on this page describe what to expect from the live API.