Developers
Guide

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
A key is bound to one Argenta account and carries its own acting user, both read on our side, so nothing in a request can point it at another account's records. Scope is the only other limit: a read-only key gets a 403 insufficient_scope the moment it tries to write, and a key created with a scope we do not recognize falls back to read-only rather than up. We store a SHA-256 hash and the visible prefix and nothing else, which is why the key itself can be shown once and never again. Revoking takes up to a minute to bite, because a resolved key is cached for 60 seconds.

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 scopeRead & 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 & pathWhat it does
POST /constituentsCreate 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=25Search 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:

FieldNotes
FirstName, MiddleInitial, LastName, Nickname, SalutationUp to 50 characters each. For individuals, the display name is kept in sync from first + last automatically.
ConstituentNameThe display name; required for households and organizations. Up to 150 characters.
FkConstituentType1 = Individual (default), 2 = Household, 3 = Organization.
Email1, Email2Validated as email addresses.
Phone1, Phone2, Phone3Cell, home, and work. 10-digit US numbers; punctuation is stripped for you.
Website1Up to 500 characters.
MailingAddressLine1, MailingAddressLine2, MailingCity, MailingState, MailingZipCodeMailingState takes a US state name or 2-letter abbreviation.
DateOfBirthISO date, e.g. 1985-04-12.
IsEmailOk, IsPhoneOk, IsTextOk, IsSolicitOk, IsActiveConstituentBooleans. true means the contact method (or solicitation) is allowed.
ConstituentDescriptionFree-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" } }
StatusCodeMeaning
401unauthorizedMissing, unknown, or revoked key.
403insufficient_scopeA read-only key attempted a write.
403record_protectedThe record is locked or view-only in Argenta.
404not_foundNo such constituent in your account.
409ambiguous_matchUpsert matched more than one record.
400invalid_field / missing_field / unknown_field / invalid_jsonThe body needs fixing; the message says exactly what.
429rate_limitedSlow 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, a Authorization: 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.
Avoid the loop. An update made through this API still fires your 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.
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.