curl --request POST \
--url https://attend.hackclub.com/api/v1/series/{series_id}/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event": {
"name": "Sunbeam Summer 2027",
"support_email": "sunbeam@hackclub.com"
}
}
'{
"event": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slug": "sunbeam-summer-2027",
"name": "Sunbeam Summer 2027",
"series": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slug": "<string>",
"name": "<string>"
},
"support_email": "jsmith@example.com",
"timezone": "Europe/Helsinki",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"registration_open_at": "2023-11-07T05:31:56Z",
"registration_close_at": "2023-11-07T05:31:56Z",
"venue_name": "<string>",
"location_city": "<string>",
"location_country": "<string>",
"location_address": "<string>",
"location_latitude": 123,
"location_longitude": 123,
"setup_complete": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"modules": {
"freedom_waivers_enabled": true,
"travel_enabled": true,
"visa_options_enabled": true,
"visa_application_url": "<string>",
"accommodation_enabled": true,
"roommate_preferences_enabled": true,
"guardian_invites_locked": true,
"nfc_badges_enabled": true,
"nfc_badge_write_on_checkin_enabled": true,
"groups_enabled": true
},
"hotel_scan_context_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participant_count": 120
}
}Create an event in the series
Requires a series API key. A mobile token, a global API token and an
event API key are all refused with 403 — an event has to land in a
series, and only a series key names one unambiguously.
The series is taken from the key, never from the request body. You
cannot create an event in another series by passing a different
event_series_id: a foreign value is rejected with 403 rather than
silently overridden (passing the key’s own series id or slug is fine and
redundant).
Required fields
name and support_email — exactly what the web’s new-event form
requires. support_email must be on @hackclub.com or
@events.hackclub.com: it is the from and reply-to address on every
participant and guardian email, so it has to be an address Hack Club
controls.
Everything else is optional here because it is optional on the web too:
slugis generated fromnamewhen omitted (lowercase, dashes).timezonedefaults toUTC.- Schedule, location and module fields are collected by the web’s setup wizard after creation, and may all be sent in this one call instead.
What this does not do
- Logo and banner are not accepted. Upload them from the event’s dashboard; multipart uploads are out of scope for this endpoint.
- Setup is not marked complete. Like the web’s create step, the new
event is a draft (
setup_complete: false) until someone finishes the setup wizard — which is also where waiver templates are configured. Registration should not be opened before that. - Waiver / DocuSeal templates are not settable here.
Side effects
The key’s owner is given an explicit event_admin role on the new
event, mirroring what the web does for the series member who creates
one. The creation is written to the audit log, attributed to the key’s
owner with the key’s name in the metadata.
curl --request POST \
--url https://attend.hackclub.com/api/v1/series/{series_id}/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event": {
"name": "Sunbeam Summer 2027",
"support_email": "sunbeam@hackclub.com"
}
}
'{
"event": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slug": "sunbeam-summer-2027",
"name": "Sunbeam Summer 2027",
"series": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"slug": "<string>",
"name": "<string>"
},
"support_email": "jsmith@example.com",
"timezone": "Europe/Helsinki",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"registration_open_at": "2023-11-07T05:31:56Z",
"registration_close_at": "2023-11-07T05:31:56Z",
"venue_name": "<string>",
"location_city": "<string>",
"location_country": "<string>",
"location_address": "<string>",
"location_latitude": 123,
"location_longitude": 123,
"setup_complete": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"modules": {
"freedom_waivers_enabled": true,
"travel_enabled": true,
"visa_options_enabled": true,
"visa_application_url": "<string>",
"accommodation_enabled": true,
"roommate_preferences_enabled": true,
"guardian_invites_locked": true,
"nfc_badges_enabled": true,
"nfc_badge_write_on_checkin_enabled": true,
"groups_enabled": true
},
"hotel_scan_context_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participant_count": 120
}
}Authorizations
Mobile token, global API token, series API key, or event API key. See Authentication above for which endpoints each one reaches.
Path Parameters
Series UUID, series slug, or the literal current — the series the calling series API key belongs to. current is only valid for a series API key.
Body
Every event field this API can write — the same set as the web's event settings form plus its setup wizard, minus the series (decided by the key), the logo/banner (uploaded from the dashboard) and the DocuSeal waiver templates (configured in the setup wizard).
Show child attributes
Show child attributes
Response
Event created, in the key's own series.
Show child attributes
Show child attributes
Was this page helpful?