The Events API is the core of Timeful. It lets you create availability polls (specific dates, days-of-week, or availability groups), collect responses from signed-in users or guests, and query aggregated calendar availability.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/ptshen/timeful-plus/llms.txt
Use this file to discover all available pages before exploring further.
Most event endpoints do not require authentication — guests can view and respond to events without an account. Endpoints that modify ownership (delete, duplicate, archive, calendar availabilities, decline) do require a valid session.
Create Event
ownerId is set to null (guest-created event).
On success, returns 201 Created with the new event’s IDs:
Request Body
Display name for the event (e.g.
"Team sync").Duration of the event window in hours (e.g.
1.5 for 90 minutes).Array of ISO 8601 datetime strings representing the candidate dates/slots.
Event type. One of:
"specific_dates"— poll across specific calendar dates"dow"— poll across days of the week (repeating)"group"— availability group (invites members by email)
When
true, each date in dates has a corresponding entry in times specifying the exact time window. Only applicable for specific_dates events.Parallel array to
dates containing specific start times. Required when hasSpecificTimes is true.Optional event description. Maximum 5 000 characters.
Optional location string. Maximum 500 characters.
When
true, the event becomes a sign-up form where respondents choose named blocks rather than free-form availability.Sign-up form mode string (used when
isSignUpForm is true).Array of
SignUpBlock objects { name, capacity, startDate, endDate }. Each block is assigned an _id automatically if one is not provided.When
true, the week view starts on Monday instead of Sunday. Applicable to dow events.When
true, the event owner receives an email when someone responds.When
true, respondents cannot see others’ availability until they have submitted their own.When
true, the poll collects day-level availability rather than time slots.Array of email addresses. Each address receives a reminder email to respond. Scheduled via Google Cloud Tasks.
If set to a positive integer
N, the owner receives a notification email after N responses are collected (fires once).Optional URL of an existing When2meet poll to import. When set, the event displays a link to the original When2meet page.
When
true, guests are prompted to provide their email address when responding.Time slot granularity in minutes. Defaults to
60 in this fork. Common values: 15, 30, 60.Columbia Math Department addition. Maximum number of respondents per time slot. When a slot is full, further sign-ups for that slot are rejected with a
400 listing blockedTimestamps.Array of email addresses to invite. Only used when
type is "group". Each address receives an invitation email.Get Event
abc123).
Response 200 OK: Full Event object including a responses map (keyed by user ID or guest name) with user profile info populated. Availability arrays are omitted from the responses map in this endpoint — use Get Responses to retrieve filtered availability.
Edit Event
ownerId, the caller must be that owner (returns 403 otherwise). Guest-created events (no owner) can be edited by anyone.
The request body accepts the same fields as Create Event minus creatorPosthogId. All four required fields (name, duration, dates, type) must always be sent.
Response 200 OK: No body.
Get Responses
map<userId, Response> with availability filtered to the [timeMin, timeMax] window. Useful when rendering a specific week in the availability grid.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
timeMin | ISO 8601 | ✅ | Start of the time window |
timeMax | ISO 8601 | ✅ | End of the time window |
Submit / Update Response
"guest": false) and guests ("guest": true).
true for anonymous respondents; false for signed-in users.Guest display name. Required when
guest is true.Guest email address. Optional when
guest is true and collectEmails is enabled.Array of ISO 8601 timestamps the user is available.
Array of timestamps where the user is available “if needed” (lower priority).
When
true (Availability Groups), derive availability from connected calendars. Signed-in users only.Map of
{ calendarAccountKey: [subCalendarId, ...] } specifying which sub-calendars to pull. Used with useCalendarAvailability.Map of
{ dayTimestamp: [availableTimestamps] } for manual overrides in Availability Groups.Per-response
CalendarOptions (bufferTime, workingHours) to override the user’s global settings.Array of
SignUpBlock IDs the user is signing up for. Only used when isSignUpForm is true.When
maxCapacityPerSlot is set on the event and a requested time slot is full, the server returns 400 with { "error": "Some time slots are at capacity", "blockedTimestamps": [...] }.200 OK: Returns {}.
Delete Response
true for guests; false for signed-in users.Guest name to remove. Required when
guest is true.The user ID whose response to delete. Required when
guest is false and a signed-in user is removing another user’s response (owner-only action).200 OK: Returns {}.
Rename Guest Response
The current guest name to replace.
The new display name.
200 OK: Returns {}.
Mark Remindee as Responded
Email address of the remindee to mark as responded.
200 OK: Returns {}.
Decline Invite (Availability Groups)
Requires authentication. Only valid for events with
type: "group".declined flag to true for the current user in the event’s attendees list. The user is removed from the group without deleting their existing response.
Response 200 OK: Returns {}.
Get Calendar Availabilities
Requires authentication. Only valid for events with
type: "group".{ userId: [CalendarEvent, ...] } for all group members who have opted in to calendar-based availability (useCalendarAvailability: true). Events belonging to other users have their summary redacted to "BUSY".
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
timeMin | ISO 8601 | ✅ | Start of the window |
timeMax | ISO 8601 | ✅ | End of the window |
Delete Event
Requires authentication. The caller must be the event owner.
isDeleted: true). If no such responses exist, the event and all folder associations are permanently removed.
Response 200 OK: No body.
Duplicate Event
Requires authentication. The caller must be the event owner.
Display name for the duplicated event.
When
true, all existing responses are copied to the new event.201 Created:
Archive Event
Requires authentication. The caller must be the event owner.
isArchived flag on an event. Archived events are hidden from the default event list but not deleted.
true to archive; false to unarchive.200 OK: No body.
Event Object Reference
MongoDB ObjectID of the event.
Human-readable short identifier (used in
/e/:shortId URLs).ObjectID of the owning user, or null for guest-created events.
Event display name.
Optional event description. Maximum 5,000 characters.
Optional location string. Maximum 500 characters.
"specific_dates", "dow", or "group".Duration of the polling window in hours.
Candidate dates/slots as ISO 8601 datetime strings.
When
true, each date has a corresponding entry in times specifying the exact time window.Parallel array to
dates with specific start times. Present when hasSpecificTimes is true.When
true, the event owner receives an email when someone responds.When positive, the owner receives a one-time email after this many responses are collected. Set to
-1 after the email fires.URL of a linked When2meet poll, if set.
When
true, guests are prompted to provide their email address when responding.Slot granularity in minutes (e.g.
15, 30, 60).Maximum number of respondents per time slot. When a slot is full, further sign-ups are rejected.
When
true, the event is a sign-up form where respondents choose named blocks rather than free-form availability.Sign-up form mode string (used when
isSignUpForm is true).Array of
SignUpBlock objects ({ _id, name, capacity, startDate, endDate }).Map of
{ userId/guestName: SignUpResponse } for sign-up form events.When
true, the week view starts on Monday rather than Sunday. Applicable to dow events.When
true, respondents cannot see others’ availability until they have submitted their own.When
true, the poll collects day-level availability rather than time slots.Map of
{ userId/guestName: Response }. Populated by GET /api/events/:eventId with user profile info. Availability arrays are omitted in that endpoint; use GET /api/events/:eventId/responses for filtered availability.Cached count of responses.
A
CalendarEvent object representing a scheduled meeting created from this poll, if one has been set.ID of the calendar event associated with this poll’s scheduled meeting.
Array of
Remindee objects ({ email, responded }). Each remindee receives a reminder email to respond.Array of
Attendee objects for availability group events (type: "group"). Populated on GET /api/events/:eventId.For availability group events, indicates whether the authenticated user has already submitted availability. Populated on
GET /api/user/events.Whether the event is archived (hidden from the default event list).
Whether the event is soft-deleted. Soft-deleted events retain responses but are excluded from user event listings.
Optional PostHog analytics ID for the event creator.