Volunteerism API
The Volunteerism API brings the volunteerism side of Argenta to your own tools: register a constituent as a volunteer when they're approved in an external system, create volunteer tasks from a scheduling tool, assign or claim open shifts, and mark work complete. It shares everything with the Constituents API — the same API keys, the same base URL, the same error shape, and the same field vocabulary your volunteer webhooks already speak.
Authentication
Use the same key you use for the Constituents API (Subscription Settings → API Keys, team admins only), sent as a bearer token on every request:
Authorization: Bearer argenta_sk_...
The base URL is https://app.argentasoftware.com/api/v1. All requests and responses are JSON.
Endpoints
| Method & path | What it does |
|---|---|
POST /volunteers | Register a constituent as a volunteer. Find-or-create: a constituent has at most one volunteer record, so posting an already-registered constituent returns the existing record with "created": false. |
PATCH /volunteers/{id} | Partial update — status, suspension, and volunteer flags. Only the fields you send change. |
GET /volunteers/{id} | Fetch one volunteer. |
GET /volunteers?email=... | Exact-match lookup by the volunteer's email address. |
GET /volunteers?search=...&isActive=true&page=1&pageSize=25 | Search by name or email, optionally filtered to active or inactive. Paged, max page size 100. |
POST /volunteer-tasks | Create a volunteer task. VolunteerTaskTitle is required; everything else is optional. |
PATCH /volunteer-tasks/{id} | Partial update — details, schedule, contact and location, assignment. Add ?ifOpen=true when assigning to claim the task only if it is still unassigned. |
GET /volunteer-tasks/{id} | Fetch one task, including its contact and location details. |
GET /volunteer-tasks?search=...&isComplete=false&volunteerId=...&taskGroupId=... | Search and filter tasks. Paged; the response also carries TotalHours for the full filtered set. |
GET /volunteer-task-groups/{id} and GET /volunteer-task-groups?search=... | Look up task groups (read-only) — useful for creating tasks under the right group. |
Register a volunteer
A volunteer is always an existing constituent. Create or find the constituent first (the Constituents API upsert is built for exactly this), then:
curl -X POST "https://app.argentasoftware.com/api/v1/volunteers" \
-H "Authorization: Bearer argenta_sk_..." \
-H "Content-Type: application/json" \
-d '{ "FkConstituent": 424037, "IsActive": true }'
A new registration returns 201 with {"created": true, "volunteer": {...}} and
the volunteer starts active as of today unless you say otherwise. If that constituent is already a
volunteer you get 200 with "created": false and the existing record — safe to
re-run from a Zap.
Create and assign a task
curl -X POST "https://app.argentasoftware.com/api/v1/volunteer-tasks" \
-H "Authorization: Bearer argenta_sk_..." \
-H "Content-Type: application/json" \
-d '{
"VolunteerTaskTitle": "Food bank shift",
"TaskStartDateTime": "2026-08-01T09:00:00",
"TaskEndDateTime": "2026-08-01T12:00:00",
"DeliveryLocationName": "Main Warehouse",
"DeliveryLocationCity": "Jacksonville",
"DeliveryLocationState": "FL",
"FkVolunteer": 4521
}'
Assignment behaves exactly like an in-app assignment:
- Assigning (
FkVolunteer) a task that starts in the future queues the volunteer's sign-up confirmation email and a 24-hour reminder, and stampsDateAssignedif you didn't send one. Past-dated tasks never send notifications. - Reassigning writes the same reassignment audit trail the app writes. The previous volunteer is not emailed.
- Unassigning — set
"FkVolunteer": null. - Claiming an open shift —
PATCH /volunteer-tasks/{id}?ifOpen=truewithFkVolunteerassigns only if the task is still unassigned, and returns409 not_openif someone (including a public sign-up page) claimed it first. Claims are serialized with the live public sign-up flow, so a double-claim cannot happen. - Task hours are computed, not written.
NumberOfHoursis derived from the start/end pair and is read-only on the wire.
Volunteer fields
| Field | Notes |
|---|---|
FkConstituent | Required on create; immutable afterward. The constituent this volunteer record belongs to. |
IsActive | Boolean. Deactivating logs a status-log entry, like the app. InactiveDate defaults to today when you deactivate without one. |
ActiveDate, InactiveDate | ISO dates. |
IsSuspended, SuspensionStartDate, SuspensionEndDate | Suspending logs a suspension entry; the start date defaults to today when omitted. |
IsTeamMember, IsStudent, IsEligibleForRehire | Booleans. |
NumTeeShirtsNeeded | Whole number, 0–1000. |
Reads also include the volunteer's ConstituentName, Email1, and
Phone1 from the linked constituent — update those through the Constituents API.
Category, campaign, and lead-source lookups are managed in Argenta and aren't writable here.
Task fields
| Field | Notes |
|---|---|
VolunteerTaskTitle | Required on create. Up to 1500 characters. |
VolunteerTaskDescription | Free-form description. |
TaskStartDateTime, TaskEndDateTime | ISO date-times; the end can't be before the start. Together they drive the computed NumberOfHours. |
DateAssigned | ISO date; stamped automatically on a new assignment if omitted. |
FkVolunteer | The assigned volunteer's id, or null for unassigned. |
FkTaskGroup | A task group id from GET /volunteer-task-groups, or null. |
FkCategory, FkOutcome | Your team's task category / outcome ids, or null. |
IsPublic, IsComplete, IsUnfulfilled | Booleans. IsPublic controls whether the task shows on your public sign-up calendar. |
ContactName, ContactEmail, ContactPhone, ContactPhoneExtension | The task's point of contact. |
DeliveryLocationName, DeliveryLocationAddress, DeliveryLocationCity, DeliveryLocationState, DeliveryLocationZipCode | DeliveryLocationState takes a US state name or 2-letter abbreviation. |
DeliveryLocationParkingInstructions | Special instructions shown to the volunteer. |
Mileage, MileageAmount, IsAccomodations, Accomodations | Mileage as a whole number, amount in dollars. |
An unrecognized field is rejected with 400 and the field's name, so typos never silently vanish.
Errors
Same shape and codes as the Constituents API, plus one:
| Status | Code | Meaning |
|---|---|---|
| 409 | not_open | You sent ?ifOpen=true and the task was no longer unassigned. |
| 403 | record_protected | The record is locked or view-only in Argenta. |
| 401 / 403 / 404 / 400 / 429 | unauthorized / insufficient_scope / not_found / invalid_field et al. / rate_limited | See the Constituents API error table — identical here. |
Rate limits
The same per-key limits as the rest of the API — roughly 15 requests per second and 600 per minute
across all /api/v1 resources combined — with 429 and a
Retry-After header when exceeded.
volunteer.* and volunteer_task.* webhooks — an API assignment arrives as
volunteer_task.signed_up, an unassignment as volunteer_task.unassigned.
If one Zap both listens and writes back, add a filter step so it can't trigger itself.