Scheduling
List the agendas
The active agendas of the organization: each one has its own opening hours, meeting length and team. Use the id of one to read its availability and to book. An empty list means the organization has not set up scheduling yet. Newest first. Read only and safe to repeat.
Required scope: scheduling:read.
query Parameters
limitcursorThe nextCursor of the previous page, with the same filters.
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
List the agendas › Responses
objecthasMorenextCursorCreate an agenda
Creates an active agenda with its opening hours, meeting length and buffers. The first agenda of the organization becomes the default. Add team members to the agenda before booking: an agenda without members has no free slots. 409 conflict with param slug when another agenda already uses the slug.
Required scope: scheduling:configure.
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Idempotency-KeyMakes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.
Create an agenda › Request Body
nameslugShort name of the agenda, unique in the organization: lowercase letters, numbers and hyphens. Routes take the id, never the slug.
assignmentStrategyHow a booking picks the team member who takes it.
timezoneThe time zone the opening hours are read in.
slotDurationMinutesLength of every meeting.
bufferBeforeMinutesFree minutes kept before every meeting.
bufferAfterMinutesFree minutes kept after every meeting.
minNoticeHoursHow many hours ahead a slot must start to be offered.
maxDaysAheadHow many days ahead the agenda accepts bookings.
Opening hours by day of the week, in the time zone of the agenda. A day with no ranges is closed.
defaultTitledefaultDescriptiongenerateMeetLinkCreate an agenda › Responses
objectidslugThe short name your team gave the agenda. A filter-friendly label: routes take the id, never the slug.
nametimezoneThe time zone the opening hours of the agenda are read in.
slotDurationMinutesLength of every meeting.
minNoticeHoursHow many hours ahead a slot must start to be offered. Earlier slots are not listed.
maxDaysAheadHow many days ahead the agenda accepts bookings. It caps daysAhead.
bufferBeforeMinutesFree minutes kept before every meeting.
bufferAfterMinutesFree minutes kept after every meeting.
assignmentStrategyHow a booking picks the team member who takes it.
Opening hours by day of the week, in the time zone of the agenda. A day with no ranges is closed.
defaultTitledefaultDescriptiongenerateMeetLinkWhether each meeting gets a video call link.
createdAtupdatedAtRetrieve an agenda
The agenda with its time zone, meeting length and the window in which it accepts bookings. A paused agenda answers 404. Read only and safe to repeat.
Required scope: scheduling:read.
path Parameters
id^agd_[0-9A-Za-z]{22}… · requiredThe id of the agenda (agd_…).
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Retrieve an agenda › Responses
objectidslugThe short name your team gave the agenda. A filter-friendly label: routes take the id, never the slug.
nametimezoneThe time zone the opening hours of the agenda are read in.
slotDurationMinutesLength of every meeting.
minNoticeHoursHow many hours ahead a slot must start to be offered. Earlier slots are not listed.
maxDaysAheadHow many days ahead the agenda accepts bookings. It caps daysAhead.
bufferBeforeMinutesFree minutes kept before every meeting.
bufferAfterMinutesFree minutes kept after every meeting.
assignmentStrategyHow a booking picks the team member who takes it.
Opening hours by day of the week, in the time zone of the agenda. A day with no ranges is closed.
defaultTitledefaultDescriptiongenerateMeetLinkWhether each meeting gets a video call link.
createdAtupdatedAtUpdate an agenda
Changes only the fields you send. availableHours replaces the whole week. Meetings already booked keep their time. 409 conflict with param slug when another agenda already uses the slug.
Required scope: scheduling:configure.
path Parameters
id^agd_[0-9A-Za-z]{22}… · requiredThe id of the agenda (agd_…).
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Update an agenda › Request Body optional
nameslugShort name of the agenda, unique in the organization: lowercase letters, numbers and hyphens. Routes take the id, never the slug.
assignmentStrategyHow a booking picks the team member who takes it.
timezoneThe time zone the opening hours are read in.
slotDurationMinutesLength of every meeting.
bufferBeforeMinutesFree minutes kept before every meeting.
bufferAfterMinutesFree minutes kept after every meeting.
minNoticeHoursHow many hours ahead a slot must start to be offered.
maxDaysAheadHow many days ahead the agenda accepts bookings.
Opening hours by day of the week, in the time zone of the agenda. A day with no ranges is closed.
defaultTitledefaultDescriptiongenerateMeetLinkUpdate an agenda › Responses
objectidslugThe short name your team gave the agenda. A filter-friendly label: routes take the id, never the slug.
nametimezoneThe time zone the opening hours of the agenda are read in.
slotDurationMinutesLength of every meeting.
minNoticeHoursHow many hours ahead a slot must start to be offered. Earlier slots are not listed.
maxDaysAheadHow many days ahead the agenda accepts bookings. It caps daysAhead.
bufferBeforeMinutesFree minutes kept before every meeting.
bufferAfterMinutesFree minutes kept after every meeting.
assignmentStrategyHow a booking picks the team member who takes it.
Opening hours by day of the week, in the time zone of the agenda. A day with no ranges is closed.
defaultTitledefaultDescriptiongenerateMeetLinkWhether each meeting gets a video call link.
createdAtupdatedAtList the team of an agenda
The people whose calendars make the free slots of the agenda, newest first. Each one says whether a calendar the agenda can read is connected: a person without one adds no slots. An agenda with an empty list has no free slots. Read only and safe to repeat.
Required scope: scheduling:read.
path Parameters
id^agd_[0-9A-Za-z]{22}… · requiredThe id of the agenda (agd_…).
query Parameters
limitcursorThe nextCursor of the previous page, with the same filters.
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
List the team of an agenda › Responses
objecthasMorenextCursorAdd a person to the team of an agenda
Adds an active member of the organization, who starts taking bookings from the agenda. Adding someone who is already in changes nothing and answers with their current entry: use the update route to change priority or active. The person only adds free slots once a calendar is connected. 404 not_found with param memberId when the member does not exist in the organization.
Required scope: scheduling:configure.
path Parameters
id^agd_[0-9A-Za-z]{22}… · requiredThe id of the agenda (agd_…).
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Idempotency-KeyMakes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.
Add a person to the team of an agenda › Request Body
memberId^mbr_[0-9A-Za-z]{22}… · requiredAn active member of the organization. List them with GET /v2/members.
priorityAdd a person to the team of an agenda › Responses
objectidThe same id that GET /v2/members lists.
namecalendarConnectedWhether the person has a connected calendar the agenda can read. Without one the person adds no free slots.
activeWhether the person takes bookings from this agenda. false keeps them in the agenda without offering their slots.
priorityWeight when the agenda assigns by priority: higher takes more bookings.
Remove a person from the team of an agenda
Takes the person out of the agenda only; they stay in the organization and their slots stop being offered. Meetings already booked keep their time. Removing someone who is not in the agenda does nothing.
Required scope: scheduling:configure.
path Parameters
id^agd_[0-9A-Za-z]{22}… · requiredThe id of the agenda (agd_…).
memberId^mbr_[0-9A-Za-z]{22}… · requiredThe id of the member (mbr_…).
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Remove a person from the team of an agenda › Responses
Removed.
Update a person in the team of an agenda
Changes only the fields you send. active false keeps the person in the agenda but stops offering their slots, active true brings them back. Meetings already booked keep their person. 404 not_found when the person is not in the agenda.
Required scope: scheduling:configure.
path Parameters
id^agd_[0-9A-Za-z]{22}… · requiredThe id of the agenda (agd_…).
memberId^mbr_[0-9A-Za-z]{22}… · requiredThe id of the member (mbr_…).
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Update a person in the team of an agenda › Request Body optional
priorityactiveUpdate a person in the team of an agenda › Responses
objectidThe same id that GET /v2/members lists.
namecalendarConnectedWhether the person has a connected calendar the agenda can read. Without one the person adds no free slots.
activeWhether the person takes bookings from this agenda. false keeps them in the agenda without offering their slots.
priorityWeight when the agenda assigns by priority: higher takes more bookings.
Read the free slots of an agenda
The free slots of the agenda in the next daysAhead days (7 by default, up to 60, capped by the maxDaysAhead of the agenda), nearest first. It crosses the opening hours of the agenda with the calendars of its team, the buffers and the minimum notice. It does not say whose calendar a slot comes from or what fills the busy ones. A slot is only a promise until you book it: another booking can take it first. Read only and safe to repeat.
Required scope: scheduling:read.
query Parameters
agendaIdThe agenda to look at. List them with GET /v2/scheduling/agendas.
daysAheadHow many days ahead to look. The maxDaysAhead of the agenda still caps it.
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Read the free slots of an agenda › Responses
objectagendaIdtimezoneThe free slots, nearest first. An empty list means there are none in the window asked.
List meetings
The meetings booked in the agendas of the organization, whoever booked them: this API, the dashboard or an agent. Newest booked first. Filter by agendaId, status, attendeeEmail or the range of start. Read only and safe to repeat. It carries the name, email and phone of the attendees, so it needs scheduling:read, which also reads the free slots.
Required scope: scheduling:read.
query Parameters
limitcursorThe nextCursor of the previous page, with the same filters.
agendaIdstatusattendeeEmailOnly the meetings booked for this address.
startsFromOnly meetings that start at or after this instant.
startsToOnly meetings that start before this instant.
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
List meetings › Responses
objecthasMorenextCursorBook a meeting
Books the slot that starts at start: the person assigned by the agenda gets the event in their calendar and the attendee gets the invitation with the video call link, by email. It cannot be undone, only canceled: use dryRun=true first, which runs the same checks (the agenda, the recipient allowlist, that start is a free slot) and answers 200 with the meeting as it would be created, booking and sending nothing; its id is not saved. Send an Idempotency-Key so a retry does not book twice. 409 slot_not_available if someone took the slot or start is not a slot of the availability: read it again and pick another.
Required scope: scheduling:write.
query Parameters
dryRunWhen true, the request goes through the same validation as the real one and is answered with what would happen (always 200), and nothing is saved, sent or charged. The answer has the same shape as the real one plus dryRun: true; an id in it is not saved. It does not use the Idempotency-Key.
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Idempotency-KeyMakes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.
Book a meeting › Request Body
agendaId^agd_[0-9A-Za-z]{22}… · requiredThe agenda to book in. The one you asked availability for.
start(Z|[+-]\d{2}:\d{2})$ · requiredWhen it starts, ISO 8601 with a time zone. It must be the start of a slot from the availability of the agenda.
attendeeEmail^[A-Za-z0-9!#$%&'*+/… · requiredWho is booked. The invitation goes to this address.
attendeeNameattendeePhonecompanyNameGoes into the description of the calendar event.
contextWhat the meeting is for. Goes into the description of the calendar event so whoever attends arrives knowing.
Book a meeting › Responses
dryRun=true: the meeting as it would be created; nothing is booked.
objectidagendaIdstatusscheduled is a booked meeting. canceled is closed and frees the slot.
startenddurationMinutestimezoneattendeeEmailattendeeNameattendeePhonecompanyNamecontextmeetLinkThe video call link the attendee got in the invitation.
canceledAtWhen the meeting was canceled. null if it was not.
cancelReasoncreatedAtupdatedAtdryRunPresent and true when the request had dryRun=true.
Retrieve a meeting
The meeting with its status, start, attendee and video call link. Read only and safe to repeat.
Required scope: scheduling:read.
path Parameters
id^mtg_[0-9A-Za-z]{22}… · requiredThe id of the meeting (mtg_…).
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Retrieve a meeting › Responses
objectidagendaIdstatusscheduled is a booked meeting. canceled is closed and frees the slot.
startenddurationMinutestimezoneattendeeEmailattendeeNameattendeePhonecompanyNamecontextmeetLinkThe video call link the attendee got in the invitation.
canceledAtWhen the meeting was canceled. null if it was not.
cancelReasoncreatedAtupdatedAtCancel a meeting
Deletes the event from the calendar, which tells the attendee, and frees the slot. The meeting stays readable with status canceled. It cannot be undone: book again if it was a mistake. 409 meeting_not_active if the meeting is already canceled or finished. The reason is stored with the meeting.
Required scope: scheduling:write.
path Parameters
id^mtg_[0-9A-Za-z]{22}… · requiredThe id of the meeting (mtg_…).
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Idempotency-KeyMakes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.
Cancel a meeting › Request Body optional
reasonWhy it is canceled. Stored with the meeting.
Cancel a meeting › Responses
objectidagendaIdstatusscheduled is a booked meeting. canceled is closed and frees the slot.
startenddurationMinutestimezoneattendeeEmailattendeeNameattendeePhonecompanyNamecontextmeetLinkThe video call link the attendee got in the invitation.
canceledAtWhen the meeting was canceled. null if it was not.
cancelReasoncreatedAtupdatedAtMove a meeting to another slot
Moves the same meeting, with the same person assigned, to the new start and updates the calendar event, which tells the attendee. start must be a free slot of the agenda and the person assigned must be free then: 409 slot_not_available otherwise. 409 meeting_not_active if the meeting is canceled or finished. Use dryRun=true to run the same checks and get the meeting as it would end, moving nothing.
Required scope: scheduling:write.
path Parameters
id^mtg_[0-9A-Za-z]{22}… · requiredThe id of the meeting (mtg_…).
query Parameters
dryRunWhen true, the request goes through the same validation as the real one and is answered with what would happen (always 200), and nothing is saved, sent or charged. The answer has the same shape as the real one plus dryRun: true; an id in it is not saved. It does not use the Idempotency-Key.
Headers
Lelemon-Subaccount^sub_[0-9A-Za-z]{22}…The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.
Idempotency-KeyMakes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.
Move a meeting to another slot › Request Body
start(Z|[+-]\d{2}:\d{2})$ · requiredThe new start, ISO 8601 with a time zone. It must be a free slot of the agenda and the person assigned must be free then.
Move a meeting to another slot › Responses
objectidagendaIdstatusscheduled is a booked meeting. canceled is closed and frees the slot.
startenddurationMinutestimezoneattendeeEmailattendeeNameattendeePhonecompanyNamecontextmeetLinkThe video call link the attendee got in the invitation.
canceledAtWhen the meeting was canceled. null if it was not.
cancelReasoncreatedAtupdatedAtdryRunPresent and true when the request had dryRun=true.