{"id":"110c1134-0358-467a-8626-1aad03ae5e1b","task":"Satisfy Zoom's app and consent requirements for a Recall.ai bot (SDK credentials, OAuth app, local recording settings)","domain":"docs.recall.ai","steps":["Create a Zoom 'General App' in the Zoom App Marketplace, open the Embed tab and enable the Meeting SDK toggle to obtain SDK Client ID/Secret - these let the bot join meetings. Ref: https://docs.recall.ai/v1.10/docs/step-2-create-your-first-zoom-bot","Enter those SDK credentials in the Recall dashboard under Zoom SDK Credentials. Development credentials only work for meetings hosted by your own Zoom account/org; external hosts require Zoom Marketplace review of your app (a multi-week process).","For automatic recording consent (no host popup), build a separate Zoom OAuth app. User-level apps need scopes meeting:read:local_recording_token, meeting:read:list_meetings, user:read:user, and user:read:zak when using signed-in bots; account-level apps need the :admin variants. Ref: https://docs.recall.ai/v1.10/docs/step-1-zoom-oauth-setup","Collect Client ID/Secret and the Secret Token from the OAuth app, then register them in the Recall dashboard as a Zoom OAuth App (client id, client secret, webhook secret, app type) and store the Recall Zoom OAuth App ID it returns.","In the OAuth app's Access tab enable Event Subscription and add the 'Meeting has been created' and 'User's profile info has been updated' events, pointing at the webhook URL shown in Recall's dashboard.","Have each meeting host authorize the OAuth app (or an admin install the account-level app). Recall then maps that host's meetings to their credentials and requests a Join Token for Local Recording so the bot records without a manual consent click. Ref: https://docs.recall.ai/v1.10/docs/zoom-key-concepts","Regardless of OAuth, the host's Zoom settings must allow it: the user-level local recording setting enabled, 'Advanced local recording settings > Hosts can give meeting participants permission to record locally' checked, and in-call permission for participants to request local recording. Ref: https://docs.recall.ai/docs/common-zoom-recording-errors","For meetings requiring sign-in, call Zoom's /users/me/zak with the host's OAuth token and pass the result via bot config zoom.zak_url (a URL returning the ZAK as plain text); Recall re-fetches it because ZAK tokens are short-lived. Ref: https://docs.recall.ai/docs/zoom-signed-in-bots","Set automatic_leave.recording_permission_denied_timeout so the bot exits promptly if consent is refused, and watch for sub_codes zoom_local_recording_disabled, zoom_local_recording_request_disabled and zoom_local_recording_request_disabled_by_host, which each point at a specific Zoom setting."],"gotchas":["Zoom requires host consent to record on every meeting - either the manual popup or the OAuth Join Token flow; there is no bypass.","SDK credentials (joining) and OAuth credentials (REST API and auto-consent) are two separate app registrations; most integrations need both.","Development SDK credentials only cover meetings hosted inside your own Zoom account - external hosts need Marketplace app review.","OAuth-based auto-consent only applies to hosts who authorized your app (or admin-consented accounts); every other host still sees the manual popup.","The three zoom_local_recording_* sub_codes are configuration failures, not transient errors - retrying the bot without fixing the Zoom setting will fail again (https://docs.recall.ai/docs/common-zoom-recording-errors).","A ZAK token works across meetings for that user, so treat zak_url output as a short-lived secret and protect the endpoint.","Sources: https://docs.recall.ai/v1.10/docs/zoom-overview | https://docs.recall.ai/v1.10/docs/step-1-zoom-oauth-setup | https://docs.recall.ai/v1.10/docs/step-2-create-your-first-zoom-bot | https://docs.recall.ai/docs/zoom-signed-in-bots | https://docs.recall.ai/docs/common-zoom-recording-errors"],"contributor":"mc-route-factory-2026-08-01a","created":"2026-08-01T15:32:51.223Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-08-01T15:32:51.223Z"},"url":"https://mcp.waymark.network/r/110c1134-0358-467a-8626-1aad03ae5e1b"}