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.
| Method | Path | Scope |
|---|---|---|
POST | /connect/calendar_bookings/ | write |
DELETE | /connect/calendar_bookings/:id | admin |
Differentiators
Section titled “Differentiators”- Resource-planner orgs require
resourceId+appointmentTypeId. LegacyscheduleType*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.
entryIdis optional but recommended. Linking the booking to a lead enriches every downstream surface (lead-pool view, automation context, the booking’sleadStateName/leadStateColor). The field isentryId— atableEntryIdkey is not recognised and leaves the booking unlinked.participantContactIdnames who the appointment is for. It must be a person on the lead given asentryId. Omit it and a lead with exactly one subject books that person; a lead with several books the request without naming anyone. The response carriesparticipantContactIdwhen 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.
POST /connect/calendar_bookings/
Section titled “POST /connect/calendar_bookings/”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;}DELETE /connect/calendar_bookings/:id
Section titled “DELETE /connect/calendar_bookings/:id”Returns 204 No Content. Requires admin scope.
Related
Section titled “Related”- Availability — find a bookable slot before posting.
- Lookups — list calendars, resources, appointment types.
- Workflows → Book a slot after lead capture.
- Workflows → Reschedule.
- Automation triggers — three events per create.