Developers
Guide

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 & pathWhat it does
POST /volunteersRegister 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=25Search by name or email, optionally filtered to active or inactive. Paged, max page size 100.
POST /volunteer-tasksCreate 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 stamps DateAssigned if 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 shiftPATCH /volunteer-tasks/{id}?ifOpen=true with FkVolunteer assigns only if the task is still unassigned, and returns 409 not_open if 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. NumberOfHours is derived from the start/end pair and is read-only on the wire.

Volunteer fields

FieldNotes
FkConstituentRequired on create; immutable afterward. The constituent this volunteer record belongs to.
IsActiveBoolean. Deactivating logs a status-log entry, like the app. InactiveDate defaults to today when you deactivate without one.
ActiveDate, InactiveDateISO dates.
IsSuspended, SuspensionStartDate, SuspensionEndDateSuspending logs a suspension entry; the start date defaults to today when omitted.
IsTeamMember, IsStudent, IsEligibleForRehireBooleans.
NumTeeShirtsNeededWhole 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

FieldNotes
VolunteerTaskTitleRequired on create. Up to 1500 characters.
VolunteerTaskDescriptionFree-form description.
TaskStartDateTime, TaskEndDateTimeISO date-times; the end can't be before the start. Together they drive the computed NumberOfHours.
DateAssignedISO date; stamped automatically on a new assignment if omitted.
FkVolunteerThe assigned volunteer's id, or null for unassigned.
FkTaskGroupA task group id from GET /volunteer-task-groups, or null.
FkCategory, FkOutcomeYour team's task category / outcome ids, or null.
IsPublic, IsComplete, IsUnfulfilledBooleans. IsPublic controls whether the task shows on your public sign-up calendar.
ContactName, ContactEmail, ContactPhone, ContactPhoneExtensionThe task's point of contact.
DeliveryLocationName, DeliveryLocationAddress, DeliveryLocationCity, DeliveryLocationState, DeliveryLocationZipCodeDeliveryLocationState takes a US state name or 2-letter abbreviation.
DeliveryLocationParkingInstructionsSpecial instructions shown to the volunteer.
Mileage, MileageAmount, IsAccomodations, AccomodationsMileage 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:

StatusCodeMeaning
409not_openYou sent ?ifOpen=true and the task was no longer unassigned.
403record_protectedThe record is locked or view-only in Argenta.
401 / 403 / 404 / 400 / 429unauthorized / insufficient_scope / not_found / invalid_field et al. / rate_limitedSee 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.

Avoid the loop. Writes through this API still fire your 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.
Reconnecting…

Whoops!

You've Encountered An Error

Something went wrong on our end. Don't worry, our development team has already been notified, and we'll get it fixed as soon as we can.

Please avoid repeating the same action for now. A quick reload usually gets you going again.