Events API
Every Events action (11) and data model (3): endpoints, scopes, input, preconditions, events and examples.
One-off events with tickets, registrations and a check-in list.
Module code happenings · 11 actions · 3 data models · 9 events. A key or token never does more here than the person behind it can; row-level security applies exactly as in the app. Scopes: happenings (everything), happenings:read (read only) or happenings:<capability>.
Resources
| Resource | Table | List and read | POST | PATCH | DELETE |
|---|---|---|---|---|---|
happening_registrations | happening_registration | /api/v1/happening_registrations | happenings.register | ||
happening_tickets | happening_ticket | /api/v1/happening_tickets | |||
happenings | happening | /api/v1/happenings | happenings.create | happenings.update |
Lists take limit (up to 200), cursor, order (e.g. -created_at), fields and q; every other query parameter is a column filter: ?status=paid, ?total[gte]=100, ?id[in]=a,b, ?x=null.
Actions
| Action | Needs | What it does |
|---|---|---|
happenings.cancel | happenings:write | Cancel the event |
happenings.cancel_registration | happenings:write | Cancel a registration |
happenings.check_in | happenings:write | Check in |
happenings.complete | happenings:write | Close the door list |
happenings.create | happenings:write | Create an event |
happenings.publish | happenings:write | Open registration |
happenings.register | happenings:write | Register a person |
happenings.register_online | happenings:write | Register online |
happenings.remove_ticket | happenings:write | Remove a ticket |
happenings.save_ticket | happenings:write | Save a ticket |
happenings.update | happenings:write | Edit an event |
happenings.cancel
Cancel the event — Cancels the event and releases every registration; the event names who was booked so they can be told.
Needs happenings:write · removes or cannot be undone · asks a person to confirm when Era runs it
https://app.getera.io/api/v1/happenings/{id}/actions/cancel- Canonical address:
POST /api/v1/actions/happenings.cancel
Input
| Field | Type | Required | Notes |
|---|---|---|---|
id | uuid | yes | Filled from the path {id} · Event · id of happening |
reason | string | Reason · max 2000 |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
happening_not_found | The event must exist. |
happening_closed | A cancelled or finished event is not changed. |
Events it publishes: happenings.cancelled
What it writes: happening (update) — Marks it cancelled; happening_registration (update) — Releases the registrations
curl -X POST https://app.getera.io/api/v1/happenings/HAPPENING_ID/actions/cancel \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"reason":"Reason"}'{
"ok": true,
"result": "…",
"events": [
"happenings.cancelled"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happenings.cancel("HAPPENING_ID", {
reason: "Reason"
})era happenings cancel HAPPENING_ID \
--reason "Reason"{
"name": "era__happenings__cancel",
"arguments": {
"id": "HAPPENING_ID",
"reason": "Reason"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 happening_not_found, happening_closed · 429 slow down
happenings.cancel_registration
Cancel a registration — Releases a person’s places.
Needs happenings:write · removes or cannot be undone · asks a person to confirm when Era runs it
https://app.getera.io/api/v1/happening_registrations/{id}/actions/cancel_registration- Canonical address:
POST /api/v1/actions/happenings.cancel_registration
Input
| Field | Type | Required | Notes |
|---|---|---|---|
id | uuid | yes | Filled from the path {id} · Registration · id of happening_registration |
reason | string | Reason · max 1000 |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
registration_not_found | The registration must exist. |
registration_not_checkable | Only a registered place is checked in or released. |
Events it publishes: happenings.registration_cancelled
What it writes: happening_registration (update) — Marks it cancelled
curl -X POST https://app.getera.io/api/v1/happening_registrations/HAPPENING_REGISTRATION_ID/actions/cancel_registration \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"reason":"Reason"}'{
"ok": true,
"result": "…",
"events": [
"happenings.registration_cancelled"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happeningRegistrations.cancelRegistration("HAPPENING_REGISTRATION_ID", {
reason: "Reason"
})era happening_registrations cancel_registration HAPPENING_REGISTRATION_ID \
--reason "Reason"{
"name": "era__happenings__cancel_registration",
"arguments": {
"id": "HAPPENING_REGISTRATION_ID",
"reason": "Reason"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 registration_not_found, registration_not_checkable · 429 slow down
happenings.check_in
Check in — Marks a registered person as arrived — from the door list, or by their door code.
Needs happenings:write · changes data
https://app.getera.io/api/v1/happening_registrations/{id}/actions/check_in- Canonical address:
POST /api/v1/actions/happenings.check_in
Input
| Field | Type | Required | Notes |
|---|---|---|---|
id | uuid | Filled from the path {id} · Registration · id of happening_registration | |
happeningId | uuid | Event · id of happening | |
code | string | Door code · max 12 |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
registration_not_found | The registration must exist. |
registration_not_checkable | Only a registered place is checked in or released. |
Events it publishes: happenings.checked_in
What it writes: happening_registration (update) — Marks it checked in
curl -X POST https://app.getera.io/api/v1/happening_registrations/HAPPENING_REGISTRATION_ID/actions/check_in \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"happeningId":"HAPPENING_ID"}'{
"ok": true,
"result": "…",
"events": [
"happenings.checked_in"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happeningRegistrations.checkIn("HAPPENING_REGISTRATION_ID", {
happeningId: "HAPPENING_ID"
})era happening_registrations check_in HAPPENING_REGISTRATION_ID \
--happening-id "HAPPENING_ID"{
"name": "era__happenings__check_in",
"arguments": {
"id": "HAPPENING_REGISTRATION_ID",
"happeningId": "HAPPENING_ID"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 registration_not_found, registration_not_checkable · 429 slow down
happenings.complete
Close the door list — Marks the event finished; whoever did not check in is recorded as not having come.
Needs happenings:write · reaches outside (sends, publishes or charges) · asks a person to confirm when Era runs it
https://app.getera.io/api/v1/happenings/{id}/actions/complete- Canonical address:
POST /api/v1/actions/happenings.complete
Input
| Field | Type | Required | Notes |
|---|---|---|---|
id | uuid | yes | Filled from the path {id} · Event · id of happening |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
happening_not_found | The event must exist. |
happening_not_published | Only a published event is closed. |
Events it publishes: happenings.completed
What it writes: happening (update) — Marks it completed; happening_registration (update) — Marks the absent as no-shows
curl -X POST https://app.getera.io/api/v1/happenings/HAPPENING_ID/actions/complete \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"happenings.completed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happenings.complete("HAPPENING_ID")era happenings complete HAPPENING_ID{
"name": "era__happenings__complete",
"arguments": {
"id": "HAPPENING_ID"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 happening_not_found, happening_not_published · 429 slow down
happenings.create
Create an event — A dated event with a number of places; add tickets, then open registration.
Needs happenings:write · changes data
https://app.getera.io/api/v1/happenings/actions/create- REST alias:
POST /api/v1/happenings - Canonical address:
POST /api/v1/actions/happenings.create
Input
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | yes | Title · max 200 |
description | string | Description · max 8000 | |
location | string | Where · max 300 | |
startsAt | date-time | yes | Starts |
endsAt | date-time | yes | Ends |
capacity | number | yes | Places · min 1 · max 100000 |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
invalid_happening_time | The end must come after the start. |
Events it publishes: happenings.created
What it writes: happening (insert) — Writes the draft event
curl -X POST https://app.getera.io/api/v1/happenings/actions/create \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"title":"Title","startsAt":"2026-11-02T09:00:00Z","endsAt":"2026-11-02T09:00:00Z","capacity":1}'{
"ok": true,
"result": "…",
"events": [
"happenings.created"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happenings.create({
title: "Title",
startsAt: "2026-11-02T09:00:00Z",
endsAt: "2026-11-02T09:00:00Z",
capacity: 1
})era happenings create \
--title "Title" \
--starts-at "2026-11-02T09:00:00Z" \
--ends-at "2026-11-02T09:00:00Z" \
--capacity 1{
"name": "era__happenings__create",
"arguments": {
"title": "Title",
"startsAt": "2026-11-02T09:00:00Z",
"endsAt": "2026-11-02T09:00:00Z",
"capacity": 1
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 invalid_happening_time · 429 slow down
happenings.publish
Open registration — Publishes a draft event so people can be registered.
Needs happenings:write · reaches outside (sends, publishes or charges)
https://app.getera.io/api/v1/happenings/{id}/actions/publish- Canonical address:
POST /api/v1/actions/happenings.publish
Input
| Field | Type | Required | Notes |
|---|---|---|---|
id | uuid | yes | Filled from the path {id} · Event · id of happening |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
happening_not_found | The event must exist. |
happening_not_draft | Only a draft is published. |
happening_needs_ticket | At least one ticket must be on sale. |
Events it publishes: happenings.published
What it writes: happening (update) — Marks it published
curl -X POST https://app.getera.io/api/v1/happenings/HAPPENING_ID/actions/publish \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"happenings.published"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happenings.publish("HAPPENING_ID")era happenings publish HAPPENING_ID{
"name": "era__happenings__publish",
"arguments": {
"id": "HAPPENING_ID"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 happening_not_found, happening_not_draft, happening_needs_ticket · 429 slow down
happenings.register
Register a person — Takes places on a ticket for a customer; the price is frozen and handed to finance by event.
Needs happenings:write · changes data
https://app.getera.io/api/v1/happening_registrations/actions/register- REST alias:
POST /api/v1/happening_registrations - Canonical address:
POST /api/v1/actions/happenings.register
Input
| Field | Type | Required | Notes |
|---|---|---|---|
happeningId | uuid | yes | Event · id of happening |
ticketId | uuid | yes | Ticket · id of happening_ticket |
customerId | uuid | yes | Person · id of customer |
quantity | number | Places · min 1 · max 50 | |
note | string | Note · max 1000 |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
happening_not_found | The event must exist. |
happening_not_open | Only a published event that has not started takes registrations. |
customer_not_found | The person must exist. |
customer_archived | An archived person is not registered. |
happening_ticket_not_found | The ticket must exist and be on sale. |
already_registered | One live registration per person per event. |
happening_full | The event and the ticket must have places left. |
Events it publishes: happenings.registered
What it writes: happening_registration (insert) — Writes the registration with its door code
curl -X POST https://app.getera.io/api/v1/happening_registrations/actions/register \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"happeningId":"HAPPENING_ID","ticketId":"HAPPENING_TICKET_ID","customerId":"CUSTOMER_ID"}'{
"ok": true,
"result": "…",
"events": [
"happenings.registered"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happeningRegistrations.create({
happeningId: "HAPPENING_ID",
ticketId: "HAPPENING_TICKET_ID",
customerId: "CUSTOMER_ID"
})era happening_registrations create \
--happening-id "HAPPENING_ID" \
--ticket-id "HAPPENING_TICKET_ID" \
--customer-id "CUSTOMER_ID"{
"name": "era__happenings__register",
"arguments": {
"happeningId": "HAPPENING_ID",
"ticketId": "HAPPENING_TICKET_ID",
"customerId": "CUSTOMER_ID"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 happening_not_found, happening_not_open, customer_not_found, customer_archived, happening_ticket_not_found, already_registered, happening_full · 429 slow down
happenings.register_online
Register online — A visitor takes places on an event ticket from the site; the price is frozen and finance charges it like any registration.
Needs happenings:write · changes data · Also callable from a published site (visitor)
/api/site/v1/{siteId}, e.g. with @getera/storefront). With an API key or a token it is refused (403 site_only).https://app.getera.io/api/v1/happening_registrations/actions/register_online- Canonical address:
POST /api/v1/actions/happenings.register_online
Input
| Field | Type | Required | Notes |
|---|---|---|---|
happeningId | uuid | yes | Event · id of happening |
ticketId | uuid | yes | Ticket · id of happening_ticket |
quantity | number | Places · min 1 · max 10 |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
guest_details_required | A guest leaves their details before registering. |
happening_full | The event and the ticket must have places left. |
Events it publishes: happenings.registered
What it writes: happening_registration (insert) — Writes the registration with its door code
Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 guest_details_required, happening_full · 429 slow down
happenings.remove_ticket
Remove a ticket — Deletes an unused ticket; one people registered on is retired instead.
Needs happenings:write · removes or cannot be undone · asks a person to confirm when Era runs it
https://app.getera.io/api/v1/happening_tickets/{id}/actions/remove_ticket- Canonical address:
POST /api/v1/actions/happenings.remove_ticket
Input
| Field | Type | Required | Notes |
|---|---|---|---|
id | uuid | yes | Filled from the path {id} · Ticket · id of happening_ticket |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
happening_ticket_not_found | The ticket must exist and be on sale. |
Events it publishes: happenings.tickets_changed
What it writes: happening_ticket (delete) — Deletes an unused ticket; happening_ticket (update) — Retires a used one
curl -X POST https://app.getera.io/api/v1/happening_tickets/HAPPENING_TICKET_ID/actions/remove_ticket \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"happenings.tickets_changed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happeningTickets.removeTicket("HAPPENING_TICKET_ID")era happening_tickets remove_ticket HAPPENING_TICKET_ID{
"name": "era__happenings__remove_ticket",
"arguments": {
"id": "HAPPENING_TICKET_ID"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 happening_ticket_not_found · 429 slow down
happenings.save_ticket
Save a ticket — A ticket type — its price, its own cap, and optionally the catalog item it is sold as.
Needs happenings:write · changes data
https://app.getera.io/api/v1/happening_tickets/{id}/actions/save_ticket- Canonical address:
POST /api/v1/actions/happenings.save_ticket
Input
| Field | Type | Required | Notes |
|---|---|---|---|
id | uuid | Filled from the path {id} · Ticket · id of happening_ticket | |
happeningId | uuid | Event · id of happening | |
name | string | Name · max 120 | |
itemVariantId | uuid | Catalog item · id of item_variant | |
priceAmount | number | Price (minor units) · min 0 | |
currency | string | Currency · max 3 | |
capacity | number | Places for this ticket · min 1 |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
happening_not_found | The event must exist. |
happening_ticket_not_found | The ticket must exist and be on sale. |
invalid_happening_ticket | A ticket needs a valid price, currency and cap. |
Events it publishes: happenings.tickets_changed
What it writes: happening_ticket (upsert) — Writes the ticket
curl -X POST https://app.getera.io/api/v1/happening_tickets/HAPPENING_TICKET_ID/actions/save_ticket \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"happeningId":"HAPPENING_ID"}'{
"ok": true,
"result": "…",
"events": [
"happenings.tickets_changed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happeningTickets.saveTicket("HAPPENING_TICKET_ID", {
happeningId: "HAPPENING_ID"
})era happening_tickets save_ticket HAPPENING_TICKET_ID \
--happening-id "HAPPENING_ID"{
"name": "era__happenings__save_ticket",
"arguments": {
"id": "HAPPENING_TICKET_ID",
"happeningId": "HAPPENING_ID"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 happening_not_found, happening_ticket_not_found, invalid_happening_ticket · 429 slow down
happenings.update
Edit an event — Changes the title, time, place or number of places.
Needs happenings:write · changes data
https://app.getera.io/api/v1/happenings/{id}/actions/update- REST alias:
PATCH /api/v1/happenings/{id} - Canonical address:
POST /api/v1/actions/happenings.update
Input
| Field | Type | Required | Notes |
|---|---|---|---|
id | uuid | yes | Filled from the path {id} · Event · id of happening |
title | string | Title · max 200 | |
description | string | Description · max 8000 | |
location | string | Where · max 300 | |
startsAt | date-time | Starts | |
endsAt | date-time | Ends | |
capacity | number | Places · min 1 · max 100000 |
Preconditions
The action is refused with 409 and one of these codes:
| Code | Refused when |
|---|---|
happening_not_found | The event must exist. |
happening_closed | A cancelled or finished event is not changed. |
invalid_happening_time | The end must come after the start. |
happening_capacity_below_taken | Places cannot drop below those taken. |
Events it publishes: happenings.updated
What it writes: happening (update) — Rewrites the event
curl -X POST https://app.getera.io/api/v1/happenings/HAPPENING_ID/actions/update \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"title":"Title"}'{
"ok": true,
"result": "…",
"events": [
"happenings.updated"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.happenings.update("HAPPENING_ID", {
title: "Title"
})era happenings update HAPPENING_ID \
--title "Title"{
"name": "era__happenings__update",
"arguments": {
"id": "HAPPENING_ID",
"title": "Title"
}
}Errors: 401 no or expired credential · 403 the credential does not hold happenings:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 happening_not_found, happening_closed, invalid_happening_time, happening_capacity_below_taken · 429 slow down
Data models
HappeningRegistration
Table happening_registration · Resource happening_registrations
GET /api/v1/happening_registrationsGET /api/v1/happening_registrations/{id}POST /api/v1/happening_registrations→happenings.register
| Column | Type | Nullable | Allowed values | References |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
happening_id | string (uuid) · uuid | happening | ||
ticket_id | string (uuid) · uuid | happening_ticket | ||
customer_id | string (uuid) · uuid | customer | ||
quantity | integer · int4 | |||
status | string · text | registered, checked_in, no_show, cancelled | ||
price_amount | string (int64) · int8 | |||
currency | string · bpchar | max 3 | ||
code | string · text | |||
note | string · text | yes | ||
checked_in_at | string (date-time) · timestamptz | yes | ||
cancelled_at | string (date-time) · timestamptz | yes | ||
cancel_reason | string · text | yes | ||
created_by_user_id | string (uuid) · uuid | yes | app_user | |
created_at | string (date-time) · timestamptz | |||
updated_at | string (date-time) · timestamptz |
Primary key: id
Checks:
CHECK ((currency ~ '^[A-Z]{3}$'::text))CHECK ((price_amount >= 0))CHECK (((quantity >= 1) AND (quantity <= 50)))
HappeningTicket
Table happening_ticket · Resource happening_tickets
GET /api/v1/happening_ticketsGET /api/v1/happening_tickets/{id}
| Column | Type | Nullable | Allowed values | References |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
happening_id | string (uuid) · uuid | happening | ||
name | string · text | |||
item_variant_id | string (uuid) · uuid | yes | item_variant | |
price_amount | string (int64) · int8 | |||
currency | string · bpchar | max 3 | ||
capacity | integer · int4 | yes | ||
position | integer · int4 | |||
retired_at | string (date-time) · timestamptz | yes | ||
created_at | string (date-time) · timestamptz | |||
updated_at | string (date-time) · timestamptz | |||
is_public | boolean · bool | yes |
Primary key: id
Checks:
CHECK (((capacity IS NULL) OR (capacity > 0)))CHECK ((currency ~ '^[A-Z]{3}$'::text))CHECK ((length(TRIM(BOTH FROM name)) > 0))CHECK ((price_amount >= 0))
Happening
Table happening · Resource happenings
GET /api/v1/happeningsGET /api/v1/happenings/{id}POST /api/v1/happenings→happenings.createPATCH /api/v1/happenings/{id}→happenings.update
| Column | Type | Nullable | Allowed values | References |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
title | string · text | |||
description | string · text | yes | ||
location | string · text | yes | ||
starts_at | string (date-time) · timestamptz | |||
ends_at | string (date-time) · timestamptz | |||
capacity | integer · int4 | |||
status | string · text | draft, published, cancelled, completed | ||
cancel_reason | string · text | yes | ||
owner_user_id | string (uuid) · uuid | yes | app_user | |
created_by_user_id | string (uuid) · uuid | yes | app_user | |
created_at | string (date-time) · timestamptz | |||
updated_at | string (date-time) · timestamptz |
Primary key: id
Checks:
CHECK ((capacity > 0))CHECK ((ends_at > starts_at))CHECK ((length(TRIM(BOTH FROM title)) > 0))
Events
Workflows and webhooks react to these events.
| Event | What happens | Payload |
|---|---|---|
happenings.cancelled | An event was cancelled and its registrations released. | id, ownerUserId, customerIds, reason |
happenings.checked_in | A person arrived at an event. | id, happeningId, customerId |
happenings.completed | An event finished. | id, noShows, title, ownerUserId, customerId, customerIds, noShowCustomerIds |
happenings.created | An event was drafted. | id, ownerUserId |
happenings.published | An event opened for registration. | id |
happenings.registered | A person took places at an event — finance charges from it. | id, happeningId, customerId, ticketId, itemVariantId, quantity, amount, currency, description, code, ownerUserId, title, startsAt |
happenings.registration_cancelled | A registration was cancelled. | id, happeningId, customerId |
happenings.tickets_changed | An event’s tickets changed. | id |
happenings.updated | An event was edited. | id |