The two endpoints
There are no write endpoints for Campaigns. The two endpoints are sufficient for the read-oriented integration patterns Campaigns support.
The Campaign resource
TheCampaignResource schema documents these fields:
About the campaign_name field
The campaign_name field name is unusual — it includes a redundant resource-type prefix. The audit flagged this (#10) as inconsistent with the standard convention of plain name used in other Virtuous APIs.
For partner integrations:
JavaScript
campaign_name to name in your integration’s internal representation produces consistency across CRM+, Raise, and Volunteer Campaign records.
Organization attribution
Campaigns belong to specific organizations within the family. Theorganization and organization_slug fields identify which:
There’s no
organization_id field documented on Campaigns (unlike Projects, which expose all three: organization, organization_id, organization_slug). Use organization_slug as the identifier for org-based logic.
Listing campaigns
cURL
Available filters
These mirror the filter set on
/projects (minus the Project-specific date filters). The org_slug parameter is the canonical way to filter Campaigns to specific organizations within the family.
Common list patterns
Campaigns for a specific organization:JavaScript
JavaScript
JavaScript
JavaScript
Fetching a single campaign
cURL
CampaignResource wrapped in data:
JavaScript
⚠️ Spec gap (audit #4):
GET /campaigns/{id} has empty schema: {} in the spec. The response likely includes additional fields beyond what’s in CampaignResource (such as an embedded Project list), but the exact extended shape isn’t formally specified.Campaigns and Projects
Campaigns group Projects. The relationship is captured on the Project side — each Project’sProjectResource includes a campaigns array showing which Campaigns it belongs to:
Finding Projects in a Campaign
Two approaches:
The first approach is more reliable:
JavaScript
Counting volunteers in a Campaign
A common reporting question: “how many people volunteered for this Campaign?”JavaScript
- Caching the Campaign’s project list (changes infrequently)
- Caching Project Date participants by date ID (each date’s participants don’t change after the date passes)
- Doing the aggregation offline as a reconciliation job rather than per-request
Common workflows
Campaign performance dashboard
For a “how is Campaign X doing?” dashboard:JavaScript
Cross-Campaign comparison
JavaScript
Sync Campaign list to an external system
For partner integrations mirroring Campaigns into an external CRM or reporting tool:JavaScript
updated_after filter combined with links.next pagination produces a clean incremental sync. Schedule this daily or hourly depending on the customer’s reporting cadence.
What can’t be done via the API
If partner integrations need to programmatically create or modify Campaigns, coordinate with VOMO’s admin team. The most common request — creating a per-customer Campaign from an external system — typically becomes an admin-team workflow rather than an API workflow.
See Understand Write Limitations.
A reference Campaigns client
JavaScript
campaign_name → name normalization is the key transformation — it produces a Campaign object that looks consistent with how other systems represent Campaign records.
Where to go next
Projects and Project Dates
The Projects that Campaigns group together.
Organizations and Org Family
Organizations own Campaigns within the family.
Forms and Form Completions
Forms are typically attached to Projects within Campaigns.
The Volunteer Data Model
The full data model context for Campaigns.