When to use this workflow
The three endpoints involved
Step 1: Find the Form
If you have the Form ID already, skip to Step 2. Otherwise, find it from the Forms list:JavaScript
JavaScript
Step 2: List completions
GET /forms/{id}/completions returns the Completions for that Form, paginated with the standard data/links/meta envelope:
cURL
Available filters
A reference paginate function:
JavaScript
Common list patterns
All completions of a Form (e.g., everyone who’s signed the waiver):JavaScript
JavaScript
JavaScript
created_after filter is the primary incremental sync mechanism — feed it the timestamp of the last completion you processed.
Step 3: Read responses with context
The Form Completion’sfield_responses array contains the volunteer’s answers, but each response is just { field_id, value } — without the Form’s field definitions, you don’t know what question was asked or what type of input the value represents.
The pattern: fetch the Form once, then join responses with field definitions when displaying:
JavaScript
Parsing values by field type
Different field types need different parsing:JavaScript
MULTIPLESELECT (comma-separated vs. JSON array) isn’t documented in the spec — the pattern above handles the most likely format defensively.
Caching the Form definitions
For workflows that process many completions of the same Form, cache the Form (the field definitions) so you don’t re-fetch on every completion:JavaScript
Scenario 1: Display a user’s form history
For a partner UI showing “all forms this volunteer has submitted”:JavaScript
- Limit to specific forms the user is likely to have completed (waivers, role-specific forms)
- Cache the result per user (Form history changes only when new completions arrive)
- Run nightly and cache for the next day’s display
Scenario 2: Detect waiver expiration
For organizations requiring annual waiver renewal:JavaScript
Comparing against active volunteers
A more nuanced version: only consider users who are currently active (have recent participations):JavaScript
Scenario 3: Sync completions to an external system
For partner integrations mirroring Form data into an external CRM or analytics platform:JavaScript
created_at actually seen) ensures interrupted syncs resume correctly.
Triggering follow-up workflows
For workflows that need to react to new completions (e.g., send a welcome email when a new waiver is signed):JavaScript
Scenario 4: Aggregate responses for reporting
For survey or feedback forms where you want aggregate statistics:JavaScript
Performance considerations
A few practical considerations for production-scale workloads:
See API Performance Tips for the broader patterns.
What can’t be done via the API
If a partner integration needs to push externally-collected Form data into VOMO (e.g., waivers signed through a third-party legal service), the typical path is:
- Capture the completion data externally
- Store a reference linking the external completion to the VOMO User
- Coordinate with the customer’s admin team for periodic CSV import into VOMO — or skip the VOMO sync entirely if the external system is authoritative
Where to go next
Understand Write Limitations
The reference for what can and can’t be done through the API.
Forms and Form Completions
The reference page for Form resource fields and the field-type values.
Polling and Sync
The broader change-detection pattern for incremental sync workflows.
Users
Form Completions link back to Users via user_id.