calcom/cal.diy · error · BadRequestException

Failed to create video meeting with ${ctx.integrationSlug}.

Error message

Failed to create video meeting with ${ctx.integrationSlug}. Please ensure the integration is properly configured.

What it means

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.

Source

Thrown at apps/api/v2/src/platform/bookings/2024-08-13/services/booking-location-integration.service.ts:214

        `Video integration "${ctx.integrationSlug}" is not connected. Please connect the integration in your settings first.`
      );
    }

    await this.bookingVideoService.deleteOldVideoMeetingIfNeeded(ctx.existingBooking.id);

    const evt = await this.calendarSyncService.buildCalEventFromBookingData(
      ctx.booking,
      ctx.internalLocation,
      credential.id
    );
    const meetingResult = await createMeeting(credential, evt);

    if (!meetingResult.createdEvent) {
      this.logger.error(
        `Failed to create video meeting with ${ctx.integrationSlug}`,
        JSON.stringify({ success: meetingResult.success, type: meetingResult.type })
      );
      throw new BadRequestException(
        `Failed to create video meeting with ${ctx.integrationSlug}. Please ensure the integration is properly configured.`
      );
    }

    const createdEvent = meetingResult.createdEvent;
    const videoCallUrl = createdEvent.url;
    const bookingLocation = videoCallUrl || ctx.internalLocation;

    const newReference = {
      type: credential.type,
      uid: createdEvent.id?.toString() || "",
      meetingId: createdEvent.id?.toString(),
      meetingPassword: createdEvent.password,
      meetingUrl: createdEvent.url,
      // only include credentialId if it's a valid ID (not 0)
      ...(credential.id > 0 ? { credentialId: credential.id } : {}),
    };

View on GitHub (pinned to 176037d0af)

Solutions

  1. Have the host reconnect the integration in Settings to refresh the OAuth tokens, then retry.
  2. Inspect server logs for the logged JSON ({ success, type }) to identify the provider-specific failure.
  3. Check the provider's developer dashboard/app status for errors, rate limits, or outages.
  4. Retry once the provider-side issue clears; if persistent, switch the location to cal-video or another connected integration.
Defensive patterns

Strategy: retry

Validate before calling

// Pre-flight: refresh/validate the integration token if you manage OAuth yourself.
// Otherwise rely on retry with backoff for transient provider failures.

Try / catch

async function patchWithRetry(uid, slug, payload, attempts = 3) {
  for (let i = 0; i < attempts; i++) {
    try {
      return await api.patch(`/v2/bookings/${uid}/location`, payload);
    } catch (err) {
      const transient = err.status === 400 && /properly configured/.test(err.message) && i < attempts - 1;
      if (!transient) throw err;
      await delay(2 ** i * 1000);
    }
  }
}

Prevention

When it happens

Trigger: 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).

Common situations: 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).

Related errors


AI-assisted analysis of calcom/cal.diy@176037d0af (2026-08-12). Data as JSON: /api/errors/5f1581044537c6a5. Report an issue: GitHub.