Events API
The Events API lets your own tools put an event on the calendar and keep it current: create the event when it is booked in an external system, move a date when it shifts, search what is coming up, and read who has bought tickets. It shares everything with the Constituents API, the Volunteerism API and the Donations API — the same API keys, the same base URL, the same error shape.
Authentication
Use the same key you use for the other APIs (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 /events | Create an event. EventTitle is required; everything else is optional. |
GET /events/{id} | Fetch one event, including its contact and location details. |
PATCH /events/{id} | Change one or more fields on an existing event. Send only what changes. |
GET /events?search=...&startDate=...&endDate=... | Search by title, contact or location, filtered by date range. Newest start date first. Paged, max page size 100. |
GET /events?statusId=...&eventTypeId=...&categoryId=...&seasonId=... | Filter the list by your account's own status, type, category and season lists. |
GET /event-tickets/{id} | Fetch one ticket sale. |
GET /event-tickets?eventId=...&constituentId=...&isPaidInFull=... | Ticket sales for an event or a person, filtered by paid status, purchase date range and amount range. Paged, max page size 100. |
Create an event
curl -X POST "https://app.argentasoftware.com/api/v1/events" \
-H "Authorization: Bearer argenta_sk_..." \
-H "Content-Type: application/json" \
-d '{
"EventTitle": "Fall Gala 2026",
"StartDate": "2026-10-17",
"StartTime": "18:00",
"EndDate": "2026-10-17",
"EndTime": "22:00",
"MaxGuests": 250,
"ContactName": "Dana Whitfield",
"ContactEmail": "[email protected]",
"EventLocation": "Riverside Hall",
"EventLocationCity": "Jacksonville",
"EventLocationState": "FL"
}'
You get 201 with {"created": true, "event": {...}}. Argenta builds the
event exactly as the Add Event button does: the notification templates are seeded, your team's
public form defaults are applied, and the event appears on the Events list immediately.
Update an event
Send only the fields that change. Everything you leave out is untouched.
curl -X PATCH "https://app.argentasoftware.com/api/v1/events/8814" \
-H "Authorization: Bearer argenta_sk_..." \
-H "Content-Type: application/json" \
-d '{ "StartDate": "2026-10-24", "EndDate": "2026-10-24" }'
Event fields
| Field | Type | Notes |
|---|---|---|
EventTitle | string | Required on create. 150 characters max. |
StartDate, EndDate | date | e.g. 2026-10-17. |
StartTime, EndTime | time | 18:00 or 6:00 PM. |
RegistrationOpenDateTime, RegistrationCloseDateTime | date-time | When registration opens and closes. |
MaxGuests | int | Capacity. Zero means no limit set. |
Theme | string | 500 characters max. |
WebinarLink | string | For online events. |
FkStatus, FkEventType, FkCategory, FkSeason | int | Ids from your account's own lists; null for none. Unknown ids are rejected. |
FkTimeZone | int | Id from the time zone list; null for none. |
IsPortal | bool | Whether the event shows in your portals. |
ContactName, ContactEmail, ContactPhone | string | Who to reach about the event. |
EventLocation, EventLocationAddress, EventLocationCity, EventLocationZipCode | string | Where it happens. |
EventLocationState | string | State name or two-letter abbreviation, e.g. FL or Florida. |
Reads return more than you can write. Chapter, division, department, district and precinct come
back on every event so you can see where it sits in your organization, but they are not writable
through the API. Neither are the switches that publish an event or take money for it
(IsPublic, IsTicketSales), the budget and attendance figures, the public
form design, or the lock and view-only flags. Everything else an event carries in Argenta —
sessions, guests and guest groups, seating, committees, checklists, itineraries, meal choices,
financials and waitlists — is managed in-app.
Unknown fields are rejected with 400 unknown_field rather than ignored, so a typo can
never silently drop data. A locked or view-only event returns 403 on a write and
still reads normally.
Reading ticket sales
curl "https://app.argentasoftware.com/api/v1/event-tickets?eventId=8814&isPaidInFull=true" \
-H "Authorization: Bearer argenta_sk_..."
Each row carries the purchaser, the ticket type and quantity, the gross paid, merchant fees, net
revenue and the tax-deductible portion, plus the linked donation id where the ticket generated
one. Leave eventId off to read ticket sales across every event, or pass
constituentId to read one person's purchases.
Errors
Same shape as the other APIs: an HTTP status plus a JSON body with a machine code and a human message.
| Status | Code | When |
|---|---|---|
| 400 | missing_field / invalid_field / unknown_field | The body failed validation. On a create, nothing was written — a bad field never leaves a blank event behind. |
| 401 | unauthorized | Missing, malformed, revoked, or unknown key. |
| 403 | insufficient_scope | A read-only key tried to write. |
| 403 | record_protected | The event is locked or view-only. |
| 404 | not_found | No event or ticket with that id in your account. |
| 413 | payload_too_large | Body over 64 KB. |
| 429 | rate_limited | Slow down and retry with backoff. |
Rate limits
The same per-key limits as the rest of /api/v1. Bulk loading a season of events is fine — pace it
and honor 429 responses with a backoff and it will sail through.
event.created,
event.updated, event.deleted) so you do not have to poll: we tell your
system the moment an event is added, moved, or removed, using the same field names you see here.
event.created fires once an event has been named rather than the instant the record
is created, so you never receive an untitled placeholder. See
Webhooks.