calcom/cal.diy · warning · BadRequestException

Invalid app, available apps are:

Error message

Invalid app, available apps are: 

What it means

Thrown by ConferencingService.checkAppIsValidAndConnected when appSlug is not in the CONFERENCING_APPS array. This is the pre-flight validation used by disconnectConferencingApp and setDefaultConferencingApp. Returns HTTP 400. Like error 94 the message string ends mid-sentence and the full list is in the error-cause argument.

Source

Thrown at apps/api/v2/src/modules/conferencing/services/conferencing.service.ts:92

          teamId
        );

      default:
        throw new BadRequestException(
          "Invalid conferencing app, available apps are: ",
          [ZOOM, OFFICE_365_VIDEO].join(", ")
        );
    }
  }

  async getUserDefaultConferencingApp(userId: number) {
    const user = await this.usersRepository.findById(userId);
    return userMetadata.parse(user?.metadata)?.defaultConferencingApp;
  }

  async checkAppIsValidAndConnected(user: UserWithProfile, appSlug: string) {
    if (!CONFERENCING_APPS.includes(appSlug)) {
      throw new BadRequestException("Invalid app, available apps are: ", CONFERENCING_APPS.join(", "));
    }
    const credentials = await getUsersCredentialsIncludeServiceAccountKey(user);

    const foundApp = getApps(credentials, true).filter((app) => app.slug === appSlug)[0];

    const appLocation = foundApp?.appData?.location;

    if (!foundApp || !appLocation) {
      throw new BadRequestException(`${appSlug} not connected.`);
    }
    return foundApp.credential;
  }

  async disconnectConferencingApp(user: UserWithProfile, app: string) {
    const credential = await this.checkAppIsValidAndConnected(user, app);
    return handleDeleteCredential({
      userId: user.id,
      userMetadata: user?.metadata,

View on GitHub (pinned to 176037d0af)

Solutions

  1. Source the slug from the documented CONFERENCING_APPS constant or the GET /v2/conferencing list response.
  2. Filter client-side dropdowns to only supported slugs.
  3. Read the error-cause argument to surface the actual accepted list to the user.
  4. Validate the slug against a known enum before issuing disconnect/default requests.

Example fix

// before
await api.disconnectConferencing(userInputSlug);

// after
import { CONFERENCING_APPS } from '@calcom/platform-constants';
if (!CONFERENCING_APPS.includes(userInputSlug)) {
  throw new UserError(`Unsupported conferencing app. Supported: ${CONFERENCING_APPS.join(', ')}`);
}
await api.disconnectConferencing(userInputSlug);
Defensive patterns

Strategy: type-guard

Validate before calling

import { CONFERENCING_APPS } from '@calcom/platform-constants';

function validateConferencingAppSlug(slug: string): void {
  if (!CONFERENCING_APPS.includes(slug)) {
    throw new Error(`${slug} is not a supported conferencing app. Valid: ${CONFERENCING_APPS.join(', ')}`);
  }
}

validateConferencingAppSlug(req.params.app);

Type guard

import { CONFERENCING_APPS } from '@calcom/platform-constants';

function isConferencingApp(slug: string): slug is typeof CONFERENCING_APPS[number] {
  return CONFERENCING_APPS.includes(slug);
}

Try / catch

try {
  await conferencingService.disconnectConferencingApp(user, app);
} catch (e) {
  if (e instanceof BadRequestException && /available apps are/.test(e.message)) {
    return res.status(400).json({ code: 'invalid_app', supported: CONFERENCING_APPS });
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling DELETE /v2/conferencing/{app}/disconnect or POST /v2/conferencing/{app}/default with an app slug not in CONFERENCING_APPS (e.g. 'webex', 'whereby', or a typo like 'daily').

Common situations: Client built before a slug rename; user typed a slug; integration lists third-party conferencing apps not supported by the platform API.

Related errors


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