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).
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 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/jsonon 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
200with the resource or result body.
Errors
Errors return a non-2xx status and a JSON body of the form shown.
| Status | Code | Meaning |
|---|---|---|
401 | UNAUTHENTICATED | The API key is missing, malformed, invalid, or revoked. |
400 | VALIDATION_ERROR | A 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
{
"error": {
"code": "UNAUTHENTICATED",
"message": "Missing API key. Send 'Authorization: Bearer <key>'."
}
} Endpoints
GET /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
| Field | Type | Description |
|---|---|---|
orgId | string | The organization the key belongs to. |
orgName | string | The organization's display name. |
Example request
curl https://acrobatic-wildcat-693.convex.site/api/v1/me \ -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx"
Example response
{
"orgId": "org_31Hk2QyZ8m",
"orgName": "Acme Conferences"
} POST /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
| Field | Type | Required | Description |
|---|---|---|---|
event | string | Yes | One of the trigger events. |
targetUrl | string | Yes | The 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 -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
{
"id": "k57h2m9q4n1p8r3s6t0v"
} DEL /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 -X DELETE https://acrobatic-wildcat-693.convex.site/api/v1/hooks/k57h2m9q4n1p8r3s6t0v \ -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx"
Example response
{
"success": true
} GET /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 https://acrobatic-wildcat-693.convex.site/api/v1/triggers/contact.added/sample \ -H "Authorization: Bearer afk_live_xxxxxxxxxxxxxxxxxxxxxxxx"
Example response — Contact sample
[
{
"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
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
| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | Yes | Contact's first name. |
lastName | string | Yes | Contact's last name. |
email | string | Yes | Email address. |
type | string | No | speaker · sponsor · attendee · vendor · partner · exhibitor · other. Defaults to attendee. |
phone | string | No | Phone number. |
company | string | No | Company / organization. |
jobTitle | string | No | Job title. |
Returns the created Contact object. Missing a required
field returns 400 VALIDATION_ERROR with
"firstName, lastName and email are required."
Example request
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
{
"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.
| Event | Resource | Fires when |
|---|---|---|
contact.added | Contact | A contact is added to your organization. |
contact.updated | Contact | A contact's details change. |
contact.removed | Contact | A contact is deleted. |
sponsor.added | Sponsor | A sponsor is added to an event. |
sponsor.updated | Sponsor | A sponsor's details change. |
sponsor.removed | Sponsor | A sponsor is removed. |
session.added | Session | A session is added to an event. |
session.updated | Session | A session's details change. |
session.removed | Session | A 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
| Field | Type | Description |
|---|---|---|
id | string | Contact ID. |
type | string | speaker · sponsor · attendee · vendor · partner · exhibitor · other. |
firstName | string | First name. |
lastName | string | Last name. |
email | string | Email address. |
phone | string · null | Phone number. |
company | string · null | Company. |
jobTitle | string · null | Job title. |
bio | string · null | Biography. |
avatarUrl | string · null | Avatar image URL. |
location | string · null | Location. |
website | string · null | Personal website. |
socialLinks | object · null | Map of platform → URL. |
expertiseAreas | string[] | Areas of expertise. |
tags | string[] | Tags. |
customFields | object · null | Organization-defined custom fields. |
source | string · null | How the contact was created (e.g. zapier). |
status | string | active · inactive · archived. |
rating | number · null | Internal rating. |
createdAt | string | ISO-8601 creation timestamp. |
events | object[] | Event memberships: eventId, eventName, eventNumber, role, status. |
Example object
{
"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"
}
]
} Sponsor
| Field | Type | Description |
|---|---|---|
id | string | Sponsor ID. |
eventId | string | Event the sponsor belongs to. |
orgId | string | Owning organization. |
name | string | Sponsor name. |
tierId | string · null | Sponsor tier ID. |
tierName | string · null | Resolved tier name. |
website | string · null | Sponsor website. |
description | string · null | Description. |
logoUrl | string · null | Logo URL. |
logoLightUrl | string · null | Light-variant logo URL. |
hasBooth | boolean | Whether the sponsor has a booth. |
assignedPortal | string · null | Assigned sponsor portal. |
primaryContactId | string · null | Primary contact ID. |
primaryContact | object · null | Summary: id, firstName, lastName, email, phone, company, jobTitle. |
customFields | object · null | Custom fields. |
submissionId | string · null | Source form submission, if any. |
createdAt | string | ISO-8601 creation timestamp. |
Example object
{
"id": "s84j1k5m8n2q5r8s1t4v",
"eventId": "e21m9x4k7n0q3r6s9t2v",
"orgId": "org_31Hk2QyZ8m",
"name": "Globex Corporation",
"tierId": "t10ab4c7d0e3f6g9h2j5",
"tierName": "Gold",
"website": "https://globex.example.com",
"description": null,
"logoUrl": null,
"logoLightUrl": null,
"hasBooth": true,
"assignedPortal": null,
"primaryContactId": null,
"primaryContact": null,
"customFields": null,
"submissionId": null,
"createdAt": "2026-06-29T14:05:10.000Z"
} Session
| Field | Type | Description |
|---|---|---|
id | string | Session ID. |
eventId | string | Event the session belongs to. |
eventName | string | Resolved event name. |
eventNumber | number · null | Sequential event number. |
orgId | string | Owning organization. |
title | string | Session title. |
description | string · null | Description. |
type | string | keynote · talk · panel · workshop · lightning · break · networking · social · placeholder · other. |
status | string | Session status (e.g. draft, scheduled). |
trackId | string · null | Track ID. |
trackName | string · null | Resolved track name. |
roomId | string · null | Room ID. |
roomName | string · null | Resolved room name. |
startTime | string · null | ISO-8601 start time. |
endTime | string · null | ISO-8601 end time. |
duration | number | Duration in minutes. |
maxAttendees | number · null | Capacity. |
tags | string[] | Tags. |
isPublic | boolean | Whether the session is public. |
isTentative | boolean | Whether the session is tentative. |
parentSessionId | string · null | Parent session, if a sub-session. |
customFields | object · null | Custom fields. |
source | string · null | How the session was created. |
createdAt | string | ISO-8601 creation timestamp. |
speakers | object[] | Linked speakers: contactId, firstName, lastName, email, role, isConfirmed. |
Example object
{
"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.