Skip to content

Bookings

Calendar bookings are RocketLead’s appointment records. Use these endpoints to programmatically book slots (e.g., from a voice agent or custom booking UI) and link them to lead entries.

MethodPathScope
POST/connect/calendar_bookings/write
DELETE/connect/calendar_bookings/:idadmin
  • Resource-planner orgs require resourceId + appointmentTypeId. Legacy scheduleType* fields are still in the schema but only for orgs not yet on the resource planner. New integrations should always send the modern fields.
  • Capacity is rechecked transactionally. If a slot fills between your availability fetch and your booking POST, you get 400 The selected time slot is no longer available. See Race conditions → Slot-fill races.
  • One create fires three flow events (booked / hasStarted / hasEnded), one delete fires one (deleted) and cancels pending hasStarted/hasEnded. See Automation triggers.
  • Delete is hard. No soft-delete, no undo. Model “cancellation with audit trail” on your side via lead-state transitions.
  • entryId is optional but recommended. Linking the booking to a lead enriches every downstream surface (lead-pool view, automation context, the booking’s leadStateName/leadStateColor). The field is entryId — a tableEntryId key is not recognised and leaves the booking unlinked.
  • participantContactId names who the appointment is for. It must be a person on the lead given as entryId. Omit it and a lead with exactly one subject books that person; a lead with several books the request without naming anyone. The response carries participantContactId when a person was booked. See Contacts → Booking a specific person.
  • Online appointments: one meeting per host at a time. If the appointment type creates an online meeting and the conferencing host already has a meeting overlapping the requested time, the booking is refused with 400.

Request body:

{
calendarId: string;
entryId?: string;
scheduleTypeId?: string;
scheduleTypeSlotId?: string;
resourceId?: string;
appointmentTypeId?: string;
resourceSlotId?: string;
participantContactId?: string;
name?: string;
startDateTime: string /* ISO-8601 */;
endDateTime: string /* ISO-8601 */;
}

Response:

{
organizationId: string;
calendarId: string;
tableEntryId?: string;
tableId?: string;
// Resolved names and channels for the people on this request.
identity?: {
primary?: {
id: string;
firstName?: string;
middleName?: string;
lastName?: string;
// A whole name whose parts are unknown, mutually exclusive with the three above.
fullName?: string;
channels: ({
id: string;
kind: "email" | "phone";
value: string;
// The address a message to this person is actually sent to.
isPrimary: boolean;
})[];
// The one contact this request displays and addresses.
isPrimary: boolean;
// Whether this person takes part in what was requested, as opposed to merely making the request.
isSubject: boolean;
// The order the request states, null on links written before RKTL-770.
position: number | unknown;
};
// Everyone taking part, in the order the request states.
participants: ({
id: string;
firstName?: string;
middleName?: string;
lastName?: string;
// A whole name whose parts are unknown, mutually exclusive with the three above.
fullName?: string;
channels: ({
id: string;
kind: "email" | "phone";
value: string;
// The address a message to this person is actually sent to.
isPrimary: boolean;
})[];
// The one contact this request displays and addresses.
isPrimary: boolean;
// Whether this person takes part in what was requested, as opposed to merely making the request.
isSubject: boolean;
// The order the request states, null on links written before RKTL-770.
position: number | unknown;
})[];
// Everyone linked at all, including a second guardian who is neither primary nor participant.
all: ({
id: string;
firstName?: string;
middleName?: string;
lastName?: string;
// A whole name whose parts are unknown, mutually exclusive with the three above.
fullName?: string;
channels: ({
id: string;
kind: "email" | "phone";
value: string;
// The address a message to this person is actually sent to.
isPrimary: boolean;
})[];
// The one contact this request displays and addresses.
isPrimary: boolean;
// Whether this person takes part in what was requested, as opposed to merely making the request.
isSubject: boolean;
// The order the request states, null on links written before RKTL-770.
position: number | unknown;
})[];
// Deprecated, always `contacts`. Kept through a compatibility window because consumers outside the console read it.
source: "contacts";
};
calendarScheduleTypeId?: string;
calendarScheduleTypeSlotId?: string;
resourceId?: string;
appointmentTypeId?: string;
resourceSlotId?: string;
id: string;
name?: string;
participantContactId?: string;
bookingGroupId?: string;
createdAt: string /* ISO-8601 */;
deletedAt?: string /* ISO-8601 */;
endDateTime: string /* ISO-8601 */;
startDateTime: string /* ISO-8601 */;
leadStateColor?: string;
leadStateName?: string;
chainBookingGroupId?: string;
meetingProvider?: "zoom" | unknown;
meetingUrl?: string | unknown;
meetingExternalId?: string | unknown;
meetingHostUserId?: string | unknown;
meetingPassword?: string | unknown;
meetingStatus?: "pending" | "created" | "failed" | "deleted" | unknown;
meetingExternalStartTime?: string /* ISO-8601 */ | unknown;
}

Returns 204 No Content. Requires admin scope.