Developers
Guide

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 & pathWhat it does
POST /eventsCreate 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.
Ticket sales are read-only through the API — by design. A ticket carries a payment, a merchant fee, a tax-deductible split and general-ledger entries. Selling, refunding, or amending a ticket happens inside Argenta so the money and the books stay in step. Use these endpoints to read sales into a dashboard or a warehouse; sell through your event's own registration form.

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

FieldTypeNotes
EventTitlestringRequired on create. 150 characters max.
StartDate, EndDatedatee.g. 2026-10-17.
StartTime, EndTimetime18:00 or 6:00 PM.
RegistrationOpenDateTime, RegistrationCloseDateTimedate-timeWhen registration opens and closes.
MaxGuestsintCapacity. Zero means no limit set.
Themestring500 characters max.
WebinarLinkstringFor online events.
FkStatus, FkEventType, FkCategory, FkSeasonintIds from your account's own lists; null for none. Unknown ids are rejected.
FkTimeZoneintId from the time zone list; null for none.
IsPortalboolWhether the event shows in your portals.
ContactName, ContactEmail, ContactPhonestringWho to reach about the event.
EventLocation, EventLocationAddress, EventLocationCity, EventLocationZipCodestringWhere it happens.
EventLocationStatestringState 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.

StatusCodeWhen
400missing_field / invalid_field / unknown_fieldThe body failed validation. On a create, nothing was written — a bad field never leaves a blank event behind.
401unauthorizedMissing, malformed, revoked, or unknown key.
403insufficient_scopeA read-only key tried to write.
403record_protectedThe event is locked or view-only.
404not_foundNo event or ticket with that id in your account.
413payload_too_largeBody over 64 KB.
429rate_limitedSlow down and retry with backoff.

Rate limits
Two limits apply, not one. Per key it is 15 requests a second and 600 a minute. There is also a per-IP limit of 40 a second and 1200 a minute, checked before we even read your key, so several keys calling from the same server share that budget. Either limit returns a 429 with a Retry-After header saying how many seconds to wait. The AI writing assistant is metered on its own separate from these: 10 requests a minute and 100 an hour for each person, and 1,000 an hour across the whole system. It also refuses text longer than 10,000 characters before any limit is counted.

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.

Pair this API with the event webhooks (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.
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.