Hi all — I’m after architectural guidance, not a fix for a specific error.
We run a class-booking platform. Instructors deliver scheduled live classes. One Zoom org account, all access via Server-to-Server OAuth. We create meetings with POST /users/{userId}/meetings, the instructor joins as host from our mobile app via the Meeting SDK using a ZAK, attendance comes from meeting.participant_joined/left webhooks, and recordings from GET /meetings/{meetingId}/recordings. Concurrent classes are far fewer than the number of instructors. Instructors are not Zoom customers — they’re users of our platform, and we don’t want their personal Zoom accounts involved at all.
Approach A — one Zoom user per instructor, with licenses rotated between them around class times via PATCH /users/{userId} (type 1 ↔ 2). We wanted these hosts on application-owned addresses on our own domain (e.g. zoom+<id>@ourdomain.com) rather than instructors’ personal emails, because personal emails cause 1005 when the instructor already has a Zoom account, and consolidation means license rotation then affects that person’s own meetings. Plus-addressed emails are accepted, but we can’t create a host that’s usable without email activation, since these aren’t real mailboxes:
action: "custCreate"→400 / 2016 No permission, please contact Zoom customer support.action: "autoCreate"→400 / 1116 Domain name doesn't match... set managed domains for your account.action: "create"→ user created but staysstatus: pending, after which bothPOST /users/{email}/meetingsandGET /users/{email}/token?type=zakreturn404 / 1001 User does not exist.
Approach B — a small pool of shared host users (host01@ourdomain.com, host02@…) sized to peak concurrency, allocating a free one per class. Instructors never become Zoom users; no API provisioning, no license rotation. This needs no special account privileges, which is partly why I’m asking — it works today, while A is blocked.
Questions:
- Which of these is the intended pattern for hosting meetings on behalf of people who aren’t Zoom users? Is a shared pool of hosts a supported design, or does the platform expect per-user provisioning?
- Is
custCreatethe sanctioned mechanism for API-only hosts (no password, can’t sign in)? What determines whether an account may use it — plan type, ISV status, something else? - Is there a meeting-scoped alternative to ZAK for the Meeting SDK? This is my main concern with B: ZAK is per user, so an instructor holding a ZAK for
host01could also start other meetings owned byhost01.start_urlfrom the create-meeting response looks meeting-scoped — is there a supported way to use a meeting-scoped host credential with the Meeting SDK, or is ZAK the only option? - When a host joins via ZAK,
participant_joinedreports the host user’s email. Since the real human differs from the host user in both approaches, is there a supported way to attribute a host participant to a specific person — e.g. an external identifier passed through the SDK and echoed back in the webhook?
Happy to share account ID or full request/response details privately.