{"record":{"id":"be6a51789aa97ca7","repo":"calcom/cal.diy","slug":"zoom-app-not-found","errorCode":null,"errorMessage":"Zoom app not found","messagePattern":"Zoom app not found","errorType":"http","errorClass":"NotFoundException","httpStatus":404,"severity":"critical","filePath":"apps/api/v2/src/modules/conferencing/services/zoom-video.service.ts","lineNumber":36,"sourceCode":"\n@Injectable()\nexport class ZoomVideoService {\n  private logger = new Logger(\"ZoomVideoService\");\n  private redirectUri = `${this.config.get(\"api.url\")}/conferencing/${ZOOM}/oauth/callback`;\n\n  constructor(\n    private readonly config: ConfigService,\n    private readonly appsRepository: AppsRepository,\n    private readonly credentialsRepository: CredentialsRepository\n  ) {}\n\n  async getZoomAppKeys() {\n    const app = await this.appsRepository.getAppBySlug(ZOOM);\n\n    const { client_id, client_secret } = zoomAppKeysSchema.parse(app?.keys);\n\n    if (!client_id) {\n      throw new NotFoundException(\"Zoom app not found\");\n    }\n\n    if (!client_secret) {\n      throw new NotFoundException(\"Zoom app not found\");\n    }\n\n    return { client_id, client_secret };\n  }\n\n  async generateZoomAuthUrl(state: string) {\n    const { client_id } = await this.getZoomAppKeys();\n\n    const params = {\n      response_type: \"code\",\n      client_id,\n      redirect_uri: this.redirectUri,\n      state: state,\n    };","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/calcom/cal.diy/blob/176037d0afbe572f870a3c702985e7cd83fe6c0c/apps/api/v2/src/modules/conferencing/services/zoom-video.service.ts#L18-L54","documentation":"Thrown by ZoomVideoService.getZoomAppKeys when the ZOOM app's keys (parsed via zoomAppKeysSchema) lack a client_id. The app is fetched by appsRepository.getAppBySlug(ZOOM); a falsy client_id triggers NotFoundException (HTTP 404). Server-side configuration issue affecting any Zoom OAuth entry point.","triggerScenarios":"generateZoomAuthUrl or connectZoomApp invoked when the Zoom app row exists but its keys JSON has no usable client_id. The first `if (!client_id)` guard fires.","commonSituations":"Zoom app never configured in the App Store; app row present but client_id blank after a partial setup; wrong app slug; keys JSON shape changed but app not re-saved.","solutions":["In the admin App Store, configure the Zoom app with its client_id (Server-to-Server or OAuth app ID from Zoom Marketplace).","Verify the slug stored equals the ZOOM constant so getAppBySlug resolves correctly.","Confirm keys match zoomAppKeysSchema (client_id + client_secret required)."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const app = await appsRepository.getAppBySlug(ZOOM);\nconst keys = zoomAppKeysSchema.safeParse(app?.keys);\nif (!keys.success || !keys.data.client_id) {\n  throw new Error('Zoom app misconfigured: missing client_id.');\n}","typeGuard":"const hasZoomClientId = (k: unknown): k is { client_id: string; client_secret: string } =>\n  typeof k === 'object' && k !== null && typeof (k as any).client_id === 'string' && !!(k as any).client_id;","tryCatchPattern":null,"preventionTips":["Run a config health check for the Zoom app on deploy.","Hide the Zoom connect entry point until keys are configured.","Keep the ZOOM slug constant aligned with the stored app slug."],"tags":["conferencing","zoom","config","app-keys","not-found"],"backgroundTag":null,"analyzedSha":"176037d0afbe572f870a3c702985e7cd83fe6c0c","analyzedAt":"2026-08-12T19:12:41.464Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}