{"record":{"id":"5f1581044537c6a5","repo":"calcom/cal.diy","slug":"failed-to-create-video-meeting-with-ctx-integrat","errorCode":null,"errorMessage":"Failed to create video meeting with ${ctx.integrationSlug}. Please ensure the integration is properly configured.","messagePattern":"Failed to create video meeting with (.+?)\\. Please ensure the integration is properly configured\\.","errorType":"http","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"apps/api/v2/src/platform/bookings/2024-08-13/services/booking-location-integration.service.ts","lineNumber":214,"sourceCode":"        `Video integration \"${ctx.integrationSlug}\" is not connected. Please connect the integration in your settings first.`\n      );\n    }\n\n    await this.bookingVideoService.deleteOldVideoMeetingIfNeeded(ctx.existingBooking.id);\n\n    const evt = await this.calendarSyncService.buildCalEventFromBookingData(\n      ctx.booking,\n      ctx.internalLocation,\n      credential.id\n    );\n    const meetingResult = await createMeeting(credential, evt);\n\n    if (!meetingResult.createdEvent) {\n      this.logger.error(\n        `Failed to create video meeting with ${ctx.integrationSlug}`,\n        JSON.stringify({ success: meetingResult.success, type: meetingResult.type })\n      );\n      throw new BadRequestException(\n        `Failed to create video meeting with ${ctx.integrationSlug}. Please ensure the integration is properly configured.`\n      );\n    }\n\n    const createdEvent = meetingResult.createdEvent;\n    const videoCallUrl = createdEvent.url;\n    const bookingLocation = videoCallUrl || ctx.internalLocation;\n\n    const newReference = {\n      type: credential.type,\n      uid: createdEvent.id?.toString() || \"\",\n      meetingId: createdEvent.id?.toString(),\n      meetingPassword: createdEvent.password,\n      meetingUrl: createdEvent.url,\n      // only include credentialId if it's a valid ID (not 0)\n      ...(credential.id > 0 ? { credentialId: credential.id } : {}),\n    };\n","sourceCodeStart":196,"sourceCodeEnd":232,"githubUrl":"https://github.com/calcom/cal.diy/blob/176037d0afbe572f870a3c702985e7cd83fe6c0c/apps/api/v2/src/platform/bookings/2024-08-13/services/booking-location-integration.service.ts#L196-L232","documentation":"Thrown by handleVideoApiIntegration when createMeeting returns no createdEvent for a connected third-party video integration (Zoom, Webex, etc.). Unlike error 262, a credential WAS found, but the provider's API rejected the meeting creation. The service logs meetingResult.success/type before throwing to aid diagnosis.","triggerScenarios":"PATCH booking location to a connected video integration whose provider API call fails: expired/revoked OAuth token still present as a credential, provider rate limit, provider outage, or app misconfiguration (missing scopes/keys).","commonSituations":"OAuth access token expired and refresh failed silently; Zoom/Webex app credentials rotated; provider API quota hit; transient provider 5xx; the app installed but not fully configured (missing required scopes).","solutions":["Have the host reconnect the integration in Settings to refresh the OAuth tokens, then retry.","Inspect server logs for the logged JSON ({ success, type }) to identify the provider-specific failure.","Check the provider's developer dashboard/app status for errors, rate limits, or outages.","Retry once the provider-side issue clears; if persistent, switch the location to cal-video or another connected integration."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Pre-flight: refresh/validate the integration token if you manage OAuth yourself.\n// Otherwise rely on retry with backoff for transient provider failures.","typeGuard":null,"tryCatchPattern":"async function patchWithRetry(uid, slug, payload, attempts = 3) {\n  for (let i = 0; i < attempts; i++) {\n    try {\n      return await api.patch(`/v2/bookings/${uid}/location`, payload);\n    } catch (err) {\n      const transient = err.status === 400 && /properly configured/.test(err.message) && i < attempts - 1;\n      if (!transient) throw err;\n      await delay(2 ** i * 1000);\n    }\n  }\n}","preventionTips":["Keep integration OAuth tokens fresh; reconnect before expiry.","Inspect server logs for meetingResult.success/type to distinguish transient vs permanent provider failures.","Have a fallback integration (e.g. cal-video) ready when a provider API degrades."],"tags":["integration","oauth","video","provider-api"],"backgroundTag":null,"analyzedSha":"176037d0afbe572f870a3c702985e7cd83fe6c0c","analyzedAt":"2026-08-12T19:12:41.464Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}