Events
Events may be created or updated. The request and response bodies are the same in both situations.
If you don't provide an external ID when creating an event, you must store the ID that is returned in order to update. Note that we do not support partial updates for required attributes, required attributes must be supplied at all times.
Attributes
externalId
string optional
Your own event ID if you are cross-posting from another system. This must be consistent across requests and unique within your channel.
Warning
If present, this will always take precedence over our ID when updating events.
channelId
integer optional
The (numerical) channel ID to post to, if different from the primary channel ID as per authentication. This only applies to superclubs and the given channel ID must be either the super club, or one of its direct sub clubs. Aggregated clubs are not allowed.
title
string required
Title of the event in question. Note that titles do not have to be unique and we do not prevent duplication.
type
int required
This must be a valid event type ID, see event-types.
contactEmail
string required
Must be a correctly formatted, valid email address.
startedAt
DateTime required
Note
This is stored as-is and should be the event's local date and time. Our systems and app will use the given location to then convert these to a members' own timezone where applicable.
Required unless isSelfPacedCourse is true.
endedAt
DateTime required
Note
This is stored as-is and should be the event's local date and time. Our systems and app will use the given location to then convert these to a members' own timezone where applicable.
Required unless isSelfPacedCourse is true.
isVip
bool required
Whether this event requires the feature flag for event access to be set.
When set to true, members will be prompted to upgrade their membership if their feature flag
was returned as false by your SSO.
externalUrl
url optional
Must be a valid URL if provided. Must not be provided if tickets is present.
If set to null this will create a free event on our platform.
You can use the following placeholders:
~id~: the member's ID as returned by your authentication system~email~: the member's email address as returned by your authentication system~eventId~: our internal event ID~token~: the access token obtained from your SSO
As an example, https://the-dots.com?user_id=~id~&access_token=~token~ is transformed to
https://the-dots.com?user_id=1234&access_token=some_token_value before we load it.
isPaid
bool required: externalUrl is not empty
Whether this is a paid event. This is used to display the correct label in any event listings.
For on-platform events, you may omit this because we will infer this automatically.
receivesRsvpWebhooks
bool required: externalUrl is not empty
Warning
This value must be set correctly at all times.
If set to true without actually calling the endpoint, this may degrade members' experience!
Whether webhooks to confirm RSVPs are set up for this event.
If set to false, communication around the event will be geared towards members' interest in the event,
rather than them going to the event.
image
string required: on create
Must be a valid URL to an image. It may be omitted when updating an event. We assume it is a new image if provided, so it is retrieved and stored whenever it is provided.
Recommendation is using a 2:1 ratio, minimum 1400x700px.
location
string required
This must be a valid Google Places ID. This is used to display an approximate location, with address and addressDetails allowing you to display the location a textual format. The location does not have to be the exact address, but we do recommend resolving the address to a Google Place. Note that we also use the timezone from this location to display the correct start/end times to members.
description
string required
A description of the event. May contain linebreaks.
host
int required
Must be a valid Page ID, see pages.
cohosts
array
Default: []
Each value in this array must be a valid Page ID, see pages.
isSelfPacedCourse
bool optional
Default: false
Indicates a self-paced course which has no formal start or end dates/times.
isVirtual
bool optional
Default: false
Indicates a virtual (online) event.
isTicketless
bool optional
Default: false
Whether the event is ticketless, meaning people can show up at will.
capacity
int optional
Default: null
If not provided or set to 0, the event will allow unlimited registrations.
This is the total available capacity for this event (in our system).
Availability for the event will be calculated by subtracting the number of RSVPs / tickets sold;
if receivesRsvpWebhooks is enabled, only confirmed RSVPs will count towards capacity.
When updating, this value can not be set to less than the number of RSVPs already registered.
address
string optional
Default: null
May not be longer than 255 characters. Note that location is not resolved from this, as resolving addresses requires human input.
addressDetails
string optional
Default: null
This may be provided to clarify the address. For example, clarifying routes or rooms within buildings.
publishedAt
DateTime optional
Default: "now"
Note
The event's location is not taken into account for this attribute. It will always be interpreted as UTC.
This may be used to schedule events ahead of time. Has no effect on start or end dates, only on visibility. If not provided, the event will be published immediately.
ticketTypes
array optional on create
Note
This is a feature that is made available upon request, and requires a fully configured Stripe account to be connected to your channel. Once enabled, all on-platform events require ticket types to be specified (including free events!).
This feature is also mutually exclusive with externalUrl - only one may be provided.
An array of objects specifying the ticket type. After an event has been created, adding or updating ticket types must be done through their dedicated endpoints.
- string optional on update
id: the ticket ID generated by our systems. Must be present for updates ifexternalIdis not provided. - string optional
externalId: your own ticket ID if you are cross-posting from another system. This must be consistent across requests and unique within your channel. - string required
title: the title to be displayed to your members when they go to RSVP. - int required
purchaseLimit: the maximum number of tickets a member may purchase of this ticket type - bool required
requiresVipFlag: whether this ticket type is available for VIP members only -
int required
quantity: number of tickets available (inventory) of this type. May only be increased on updates.Note
The quantity for all tickets combined may exceed event capacity; this is recommended, actually.
Sales are still controlled by the event's capacity. Once the total number of tickets sold hits that capacity, additional inventory of tickets will no longer be available for purchase.
-
integer required price: Price of the ticket in the smallest denomination for the currency of the event (commonly pennies/cents)
Warning
Decimal numbers (floating point) are not accepted. The correct value for GBP 9.95 (same for USD or EUR) is 995.
Ticket types may be updated through event update requests.
currency
string required with ticketTypes
Three-letter ISO4217 code, as supported by Stripe
taxName
string required with ticketTypes
Name of the sales tax at the event's location; e.g. VAT for the UK, MwSt. for Germany, et cetera. Must be provided even for free ticketed events.
taxPercentage
int | float required with ticketTypes
Sales tax percentage at the event's location. May be provided as a decimal or integer.
Endpoints
Create (unticketed, on-platform)
POST /channels/events.create
Content-Type: application/json
Authorization: Channel <Api Key>
X-Channel: <Channel Identifier>
{
"title": "Chinese New Year Celebration",
"type": 1,
"contactEmail": "events@the-dots.com",
"startedAt": "2026-02-17 00:00",
"endedAt": "2026-02-17 03:00",
"isVip": false,
"image": "https://my-website.com/images/event-123.jpg",
"location": "ChIJuSwU55ZS8DURiqkPryBWYrk",
"description": "Chinese New Year celebration, in Beijing",
"host": 1,
"cohosts": [
2,
3
],
"isSelfPacedCourse": false,
"isVirtual": false,
"isTicketless": false,
"capacity": 100,
"address": "Tiananmen Square",
"addressDetails": "Some further details",
"publishedAt": "now"
}
Create (off-platform)
POST /channels/events.create
Content-Type: application/json
Authorization: Channel <Api Key>
X-Channel: <Channel Identifier>
{
"externalId": "event-123",
"title": "Chinese New Year Celebration",
"type": 1,
"contactEmail": "events@the-dots.com",
"startedAt": "2026-02-17 00:00",
"endedAt": "2026-02-17 03:00",
"isVip": false,
"receivesRsvpWebhooks": true,
"isPaid": false,
"externalUrl": "https://my-website.com/events/123",
"image": "https://my-website.com/images/event-123.jpg",
"location": "ChIJuSwU55ZS8DURiqkPryBWYrk",
"description": "Chinese New Year celebration, in Beijing",
"host": 1,
"cohosts": [
2,
3
],
"isSelfPacedCourse": false,
"isVirtual": false,
"isTicketless": false,
"capacity": 100,
"address": "Tiananmen Square",
"addressDetails": "Some further details",
"publishedAt": "now"
}
Create (ticketed, on-platform)
POST /channels/events.create
Content-Type: application/json
Authorization: Channel <Api Key>
X-Channel: <Channel Identifier>
{
"externalId": "event-123",
"title": "Chinese New Year Celebration",
"type": 1,
"contactEmail": "events@the-dots.com",
"startedAt": "2026-02-17 00:00",
"endedAt": "2026-02-17 03:00",
"isVip": false,
"image": "https://my-website.com/images/event-123.jpg",
"location": "ChIJuSwU55ZS8DURiqkPryBWYrk",
"description": "Chinese New Year celebration, in Beijing",
"host": 1,
"cohosts": [
2,
3
],
"isSelfPacedCourse": false,
"isVirtual": false,
"isTicketless": false,
"capacity": 100,
"address": "Tiananmen Square",
"addressDetails": "Some further details",
"publishedAt": "now",
"ticketTypes": [
{
"externalId": "ticket-100",
"title": "General Admission",
"price": 1000,
"quantity": 100,
"purchaseLimit": 3,
"requiresVipFlag": false
},
{
"externalId": "ticket-101",
"title": "VIP Free Entry",
"price": 0,
"quantity": 100,
"purchaseLimit": 1,
"requiresVipFlag": true
}
]
}
Update w/ Dots ID
POST /channels/events.update/{id}
Content-Type: application/json
Authorization: Channel <Api Key>
X-Channel: <Channel Identifier>
{
"title": "Chinese New Year Celebration",
"type": 1,
"contactEmail": "events@the-dots.com",
"startedAt": "2026-02-17 00:00",
"endedAt": "2026-02-17 03:00",
"isVip": false,
"receivesRsvpWebhooks": true,
"isPaid": false,
"externalUrl": "https://my-website.com/events/123",
"image": "https://my-website.com/images/event-123.jpg",
"location": "ChIJuSwU55ZS8DURiqkPryBWYrk",
"description": "Chinese New Year celebration, in Beijing",
"host": 1,
"cohosts": [
2,
3
],
"isSelfPacedCourse": false,
"isVirtual": false,
"isTicketless": false,
"capacity": 100,
"address": "Tiananmen Square",
"addressDetails": "Some further details",
"publishedAt": "now"
}
Update w/ external ID
POST /channels/events.update
Content-Type: application/json
Authorization: Channel <Api Key>
X-Channel: <Channel Identifier>
{
"externalId": "event-123",
"title": "Chinese New Year Celebration",
"type": 1,
"contactEmail": "events@the-dots.com",
"startedAt": "2026-02-17 00:00",
"endedAt": "2026-02-17 03:00",
"isVip": false,
"receivesRsvpWebhooks": true,
"isPaid": false,
"externalUrl": "https://my-website.com/events/123",
"image": "https://my-website.com/images/event-123.jpg",
"location": "ChIJuSwU55ZS8DURiqkPryBWYrk",
"description": "Chinese New Year celebration, in Beijing",
"host": 1,
"cohosts": [
2,
3
],
"isSelfPacedCourse": false,
"isVirtual": false,
"isTicketless": false,
"capacity": 100,
"address": "Tiananmen Square",
"addressDetails": "Some further details",
"publishedAt": "now"
}