Summary
We are integrating the Zoom Scheduler into our application using the embedded scheduling page (Embed SDK) and a Server-to-Server OAuth app. After a booking is created, we are unable to retrieve the full scheduled event details due to limitations in both the embedded postMessage payload and the Scheduler API requirements.
Our Setup
- Auth: Server-to-Server OAuth (account-level)
- Integration: Embedded Zoom Scheduler page (Embed SDK)
- Scheduler configuration
- Multiple Zoom users (hosts)
- Users can book with different team members
- Scopes enabled
scheduler:read:scheduled_event:admin
The Problem
1) Embedded Scheduler postMessage strips booking data
After a booking is completed, the embedded Scheduler page sends a postMessage to the parent window. However, most of the booking details are intentionally stripped out.
Relevant code from the embedded page:
const postFormInfoToParentPage = (formValues, bookingResponse) => {
const origin = searchParams.get('origin');
if (!origin || !window?.parent) {
return;
}
let scheduledEventData = {};
const attendee = (bookingResponse?.attendees ?? []).find(
(attendee) => attendee.email === formValues.bookerEmail
);
if (bookingResponse?.id && attendee?.id) {
scheduledEventData = {
scheduledEventId: bookingResponse.id,
attendeeId: attendee.id,
};
}
window.parent.postMessage(
{
type: 'bookingForm',
payload: {
// Only event + attendee IDs are provided
...scheduledEventData,
// Legacy fields (form values only)
...formValues,
},
},
origin,
);
};
Only the following are provided
scheduledEventIdattendeeId
Missing but needed
start_date_timeend_date_timesummarylocationexternal_location.meeting_join_url
This data does exist in bookingResponse, but it is not sent to the parent page.
2) Scheduler API requires user_id, which we don’t have
To work around this, we attempted to fetch event details using:
GET /scheduler/events/{eventId}
However
- This endpoint requires a
user_idquery parameter - Our Scheduler supports multiple hosts
- The
postMessagepayload does not include:- Host Zoom
user_id - Any identifier that can be mapped to the host
- Host Zoom
- The provided
attendeeIdis the booker, not the host
As a result
- We cannot determine which
user_idto pass - Calling the endpoint with an incorrect or missing
user_idreturns 404 Not Found - Calling it without
user_id, even with Server-to-Server OAuth and admin scopes, also returns 404
What Would Solve This
Any one of the following would unblock us:
-
Include more booking data in the embedded
postMessage- e.g.
start_date_time,end_date_time,summary,location,external_location.meeting_join_url
- e.g.
-
Include the host’s Zoom
user_idin thepostMessage-
This would allow us to call:
GET /scheduler/events/{eventId}?user_id=...
-
-
Allow account-level access for Server-to-Server OAuth apps
- Enable
GET /scheduler/events/{eventId}to work withoutuser_idwhen using admin-level S2S OAuth, similar to other Zoom APIs
- Enable
Impact
Without access to either:
- Full booking details, or
- The host’s
user_id
We cannot display a proper booking confirmation page (meeting time, host, join link, etc.). This significantly degrades the user experience.
This isn’t a hard blocker for me yet, but it does make the integration a bit awkward from a user-experience standpoint.
If anyone has run into this before or has found a workable solution, we’d love to hear how you handled it. It would also be helpful to know whether this is a known limitation or something that might improve in the future.
Thanks in advance for any pointers, and happy to share more details if that helps.