Version v1 · Last updated June 29, 2026

AgendaForge API Reference

This is the reference for the AgendaForge REST API (version v1) — the HTTP API that powers the Zapier and Make.com integrations. It is a server-to-server API: all requests are authenticated with an API key, send and receive JSON over HTTPS, and are scoped to a single AgendaForge organization.

It documents every endpoint the Zapier integration uses: validating the connection (GET /me), subscribing and unsubscribing webhooks for triggers (POST /hooks, DELETE /hooks/:id), pulling sample records for field mapping (GET /triggers/:event/sample), and the Create Contact action (POST /contacts).

Base URL https://acrobatic-wildcat-693.convex.site/api/v1

Authentication

Every request must include an API key. In AgendaForge, open Settings → API Tokens (or Event Settings → Integrations → Zapier), click Generate key, name it, and copy the key. It begins with afk_live_ and is shown only once.

Send the key in either header:

  • Authorization: Bearer afk_live_…
  • X-API-Key: afk_live_…

Keys are organization-wide and shared across Zapier and Make.com — a key works for both, and revoking it disconnects both. You must be an organization Owner or Admin to create or revoke a key. Keys are stored hashed and can never be displayed again after creation. A missing, invalid, or revoked key returns 401 UNAUTHENTICATED.

Example request

curl
curl https://acrobatic-wildcat-693.convex.site/api/v1/me \
  -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Conventions

  • Request and response bodies are JSON; send Content-Type: application/json on writes.
  • Timestamps are ISO-8601 strings in UTC (e.g. 2026-06-29T14:03:21.000Z).
  • IDs are opaque strings — treat them as case-sensitive tokens; do not parse them.
  • Successful responses return HTTP 200 with the resource or result body.

Errors

Errors return a non-2xx status and a JSON body of the form shown.

StatusCodeMeaning
401UNAUTHENTICATEDThe API key is missing, malformed, invalid, or revoked.
400VALIDATION_ERRORA required field is missing or invalid, an unknown event was supplied, or a referenced record (e.g. an event) is not owned by the key's organization. The message describes the problem.

Example error

json401
{
  "error": {
    "code": "UNAUTHENTICATED",
    "message": "Missing API key. Send 'Authorization: Bearer <key>'."
  }
}

Endpoints

GET /me

GEThttps://acrobatic-wildcat-693.convex.site/api/v1/me

Validates the API key and returns the organization it is scoped to. Zapier calls this to test the connection and label it with your organization's name.

Response

FieldTypeDescription
orgIdstringThe organization the key belongs to.
orgNamestringThe organization's display name.

Example request

curl
curl https://acrobatic-wildcat-693.convex.site/api/v1/me \
  -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Example response

json200 OK
{
  "orgId": "org_31Hk2QyZ8m",
  "orgName": "Acme Conferences"
}

POST /hooks

POSThttps://acrobatic-wildcat-693.convex.site/api/v1/hooks

Subscribes a webhook to a trigger event. Zapier calls this when you turn on a trigger; AgendaForge then delivers a JSON payload to targetUrl each time the event occurs. Re-subscribing the same event and URL reactivates the existing subscription rather than creating a duplicate.

Body

FieldTypeRequiredDescription
eventstringYesOne of the trigger events.
targetUrlstringYesThe http(s) URL that receives the payload.

The returned id is the subscription identifier — pass it to DELETE /hooks/:id to unsubscribe.

Example request

curl
curl -X POST https://acrobatic-wildcat-693.convex.site/api/v1/hooks \
  -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "event": "contact.added",
    "targetUrl": "https://hooks.zapier.com/hooks/standard/123456/abcdef/"
  }'

Example response

json200 OK
{
  "id": "k57h2m9q4n1p8r3s6t0v"
}

DEL /hooks/:id

DELhttps://acrobatic-wildcat-693.convex.site/api/v1/hooks/:id

Removes a webhook subscription created by POST /hooks. Zapier calls this when you turn off a trigger. The operation is idempotent — deleting an unknown or already-removed subscription still returns success.

Example request

curl
curl -X DELETE https://acrobatic-wildcat-693.convex.site/api/v1/hooks/k57h2m9q4n1p8r3s6t0v \
  -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Example response

json200 OK
{
  "success": true
}

GET /triggers/:event/sample

GEThttps://acrobatic-wildcat-693.convex.site/api/v1/triggers/:event/sample

Returns up to a few recent records for the given event so Zapier can build field mappings. The objects have the exact same shape live webhook deliveries use, so a mapping built from a sample matches real data. :event is one of the trigger events.

The resource matches the event family: contact.*Contact, sponsor.*Sponsor, session.*Session.

Example request

curl
curl https://acrobatic-wildcat-693.convex.site/api/v1/triggers/contact.added/sample \
  -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Example response — Contact sample

json200 OK
[
  {
    "id": "j97d2k5m8n1q4r7s0t3v",
    "type": "attendee",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "email": "ada@example.com",
    "company": "Analytical Engines",
    "tags": [],
    "status": "active",
    "source": "zapier",
    "createdAt": "2026-06-29T14:03:21.000Z",
    "events": []
  }
]

POST /contacts

POSThttps://acrobatic-wildcat-693.convex.site/api/v1/contacts

Creates a contact in your organization — the Create Contact action. A contact created this way also fires the contact.added trigger, so it can feed other Zaps.

Body

FieldTypeRequiredDescription
firstNamestringYesContact's first name.
lastNamestringYesContact's last name.
emailstringYesEmail address.
typestringNospeaker · sponsor · attendee · vendor · partner · exhibitor · other. Defaults to attendee.
phonestringNoPhone number.
companystringNoCompany / organization.
jobTitlestringNoJob title.

Returns the created Contact object. Missing a required field returns 400 VALIDATION_ERROR with "firstName, lastName and email are required."

Example request

curl
curl -X POST https://acrobatic-wildcat-693.convex.site/api/v1/contacts \
  -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Ada",
    "lastName": "Lovelace",
    "email": "ada@example.com",
    "type": "speaker",
    "company": "Analytical Engines"
  }'

Example response

json200 OK
{
  "id": "j97d2k5m8n1q4r7s0t3v",
  "type": "speaker",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "email": "ada@example.com",
  "phone": null,
  "company": "Analytical Engines",
  "jobTitle": null,
  "bio": null,
  "avatarUrl": null,
  "location": null,
  "website": null,
  "socialLinks": null,
  "expertiseAreas": [],
  "tags": [],
  "customFields": null,
  "source": "zapier",
  "status": "active",
  "rating": null,
  "createdAt": "2026-06-29T14:03:21.000Z",
  "events": [
    {
      "eventId": "e21m9x4k7n0q3r6s9t2v",
      "eventName": "DevConf 2026",
      "eventNumber": 4,
      "role": "speaker",
      "status": "confirmed"
    }
  ]
}

Trigger events

These are the event names accepted by POST /hooks and GET /triggers/:event/sample, and the triggers the Zapier integration exposes.

EventResourceFires when
contact.addedContactA contact is added to your organization.
contact.updatedContactA contact's details change.
contact.removedContactA contact is deleted.
sponsor.addedSponsorA sponsor is added to an event.
sponsor.updatedSponsorA sponsor's details change.
sponsor.removedSponsorA sponsor is removed.
session.addedSessionA session is added to an event.
session.updatedSessionA session's details change.
session.removedSessionA session is removed.

Object reference

These shapes are emitted identically by live webhook deliveries, the /triggers/:event/sample endpoint, and the Create Contact response. Unset fields come back as null (or an empty array for list fields).

Contact

FieldTypeDescription
idstringContact ID.
typestringspeaker · sponsor · attendee · vendor · partner · exhibitor · other.
firstNamestringFirst name.
lastNamestringLast name.
emailstringEmail address.
phonestring · nullPhone number.
companystring · nullCompany.
jobTitlestring · nullJob title.
biostring · nullBiography.
avatarUrlstring · nullAvatar image URL.
locationstring · nullLocation.
websitestring · nullPersonal website.
socialLinksobject · nullMap of platform → URL.
expertiseAreasstring[]Areas of expertise.
tagsstring[]Tags.
customFieldsobject · nullOrganization-defined custom fields.
sourcestring · nullHow the contact was created (e.g. zapier).
statusstringactive · inactive · archived.
ratingnumber · nullInternal rating.
createdAtstringISO-8601 creation timestamp.
eventsobject[]Event memberships: eventId, eventName, eventNumber, role, status.

Example object

json
{
  "id": "j97d2k5m8n1q4r7s0t3v",
  "type": "speaker",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "email": "ada@example.com",
  "phone": null,
  "company": "Analytical Engines",
  "jobTitle": null,
  "bio": null,
  "avatarUrl": null,
  "location": null,
  "website": null,
  "socialLinks": null,
  "expertiseAreas": [],
  "tags": [],
  "customFields": null,
  "source": "zapier",
  "status": "active",
  "rating": null,
  "createdAt": "2026-06-29T14:03:21.000Z",
  "events": [
    {
      "eventId": "e21m9x4k7n0q3r6s9t2v",
      "eventName": "DevConf 2026",
      "eventNumber": 4,
      "role": "speaker",
      "status": "confirmed"
    }
  ]
}

Session

FieldTypeDescription
idstringSession ID.
eventIdstringEvent the session belongs to.
eventNamestringResolved event name.
eventNumbernumber · nullSequential event number.
orgIdstringOwning organization.
titlestringSession title.
descriptionstring · nullDescription.
typestringkeynote · talk · panel · workshop · lightning · break · networking · social · placeholder · other.
statusstringSession status (e.g. draft, scheduled).
trackIdstring · nullTrack ID.
trackNamestring · nullResolved track name.
roomIdstring · nullRoom ID.
roomNamestring · nullResolved room name.
startTimestring · nullISO-8601 start time.
endTimestring · nullISO-8601 end time.
durationnumberDuration in minutes.
maxAttendeesnumber · nullCapacity.
tagsstring[]Tags.
isPublicbooleanWhether the session is public.
isTentativebooleanWhether the session is tentative.
parentSessionIdstring · nullParent session, if a sub-session.
customFieldsobject · nullCustom fields.
sourcestring · nullHow the session was created.
createdAtstringISO-8601 creation timestamp.
speakersobject[]Linked speakers: contactId, firstName, lastName, email, role, isConfirmed.

Example object

json
{
  "id": "ss72k5m8n3q6r9s2t5v8",
  "eventId": "e21m9x4k7n0q3r6s9t2v",
  "eventName": "DevConf 2026",
  "eventNumber": 4,
  "orgId": "org_31Hk2QyZ8m",
  "title": "Scaling Convex in Production",
  "description": null,
  "type": "talk",
  "status": "draft",
  "trackId": null,
  "trackName": null,
  "roomId": null,
  "roomName": null,
  "startTime": null,
  "endTime": null,
  "duration": 30,
  "maxAttendees": null,
  "tags": [],
  "isPublic": false,
  "isTentative": false,
  "parentSessionId": null,
  "customFields": null,
  "source": "api",
  "createdAt": "2026-06-29T14:06:44.000Z",
  "speakers": []
}

Support

For help with the API or the integration, contact hello@agendaforge.app.

Access request · Backstage

Get on the list.

We onboard a few teams at a time and reply personally. Tell us about your show.

We reply from the booth · No spam, ever