Constituents API
The Constituents API is the inbound half of the Argenta integration story. Webhooks tell your systems when something changes in Argenta; this API lets your systems change Argenta — create a constituent when a form is submitted elsewhere, update contact details from your marketing platform, or look a record up before deciding what to do. It works with Zapier, Make, and any tool that can send an HTTPS request.
Get an API key
In Argenta, go to Subscription Settings → API Keys → Add API Key (team admins only) and:
- Name the key after the tool that will hold it, e.g. Zapier.
- Pick a scope — Read & write to create and update, Read only to look up and search.
- Copy the key immediately. It is shown exactly once. If it's lost, revoke it and create a new one.
A key reaches only your own account's data, every change it makes is written to your activity log (labeled Public API with the key's name), and you can revoke it at any time from the same page.
Authentication
Send the key 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 /constituents | Create a constituent. Add ?mode=upsert&matchOn=email to update the existing record instead when exactly one active constituent already has that Email1. |
PATCH /constituents/{id} | Partial update — only the fields you send change; everything else is preserved. |
GET /constituents/{id} | Fetch one constituent. |
GET /constituents?email=... | Exact-match lookup by Email1. |
GET /constituents?search=...&page=1&pageSize=25 | Search by name, email, or id — the same search the Argenta constituent list uses. Paged, max page size 100. |
Create a constituent
curl -X POST "https://app.argentasoftware.com/api/v1/constituents?mode=upsert&matchOn=email" \
-H "Authorization: Bearer argenta_sk_..." \
-H "Content-Type: application/json" \
-d '{
"FirstName": "Jane",
"LastName": "Smith",
"Email1": "[email protected]",
"Phone1": "5551234567",
"MailingAddressLine1": "1 Main St",
"MailingCity": "Jacksonville",
"MailingState": "FL",
"MailingZipCode": "32256"
}'
A create returns 201 with {"created": true, "constituent": {...}}; an upsert that
matched an existing record returns 200 with "created": false. If more than one
active constituent shares the email, upsert returns 409 and you should update one by id instead.
Individuals (FkConstituentType 1, the default) need FirstName and/or
LastName; households (2) and organizations (3) need ConstituentName.
Fields
Field names match the webhook payloads, so both directions of your integration speak one vocabulary. Writable fields:
| Field | Notes |
|---|---|
FirstName, MiddleInitial, LastName, Nickname, Salutation | Up to 50 characters each. For individuals, the display name is kept in sync from first + last automatically. |
ConstituentName | The display name; required for households and organizations. Up to 150 characters. |
FkConstituentType | 1 = Individual (default), 2 = Household, 3 = Organization. |
Email1, Email2 | Validated as email addresses. |
Phone1, Phone2, Phone3 | Cell, home, and work. 10-digit US numbers; punctuation is stripped for you. |
Website1 | Up to 500 characters. |
MailingAddressLine1, MailingAddressLine2, MailingCity, MailingState, MailingZipCode | MailingState takes a US state name or 2-letter abbreviation. |
DateOfBirth | ISO date, e.g. 1985-04-12. |
IsEmailOk, IsPhoneOk, IsTextOk, IsSolicitOk, IsActiveConstituent | Booleans. true means the contact method (or solicitation) is allowed. |
ConstituentDescription | Free-form notes about the constituent. |
An unrecognized field is rejected with 400 and the field's name, so typos never silently vanish.
Errors
Every error is JSON in one shape:
{ "error": { "code": "invalid_field", "message": "Email1 is not a valid email address.", "field": "Email1" } }
| Status | Code | Meaning |
|---|---|---|
| 401 | unauthorized | Missing, unknown, or revoked key. |
| 403 | insufficient_scope | A read-only key attempted a write. |
| 403 | record_protected | The record is locked or view-only in Argenta. |
| 404 | not_found | No such constituent in your account. |
| 409 | ambiguous_match | Upsert matched more than one record. |
| 400 | invalid_field / missing_field / unknown_field / invalid_json | The body needs fixing; the message says exactly what. |
| 429 | rate_limited | Slow down; retry after the Retry-After seconds. |
Rate limits
Limits are generous and exist to stop runaway loops, not normal use: bursts above roughly 15 requests
per second, or more than 600 requests in a minute, get 429 with a Retry-After
header. Zapier and Make stay far below this on their own.
Zapier walkthrough
The generic building blocks work today, no special Argenta app needed:
- Into Argenta: in your Zap, add a Webhooks by Zapier action → Custom Request. Method
POST, the URL above with?mode=upsert&matchOn=email, aAuthorization: Bearer argenta_sk_...header, and a JSON body mapping your trigger's fields to the field names in the table. Upsert keeps re-runs from creating duplicates. - Out of Argenta: use a Webhooks by Zapier trigger → Catch Hook, and register that hook URL under Subscription Settings → Webhooks. See the Webhooks Guide.
constituent.updated webhook. If one Zap both listens to that event and writes back
through the API, it can trigger itself. Add a filter step in Zapier (only continue when a field
actually changed) or keep the listening Zap and the writing Zap on separate concerns.