{"record":{"id":"15de922c13c61bd1","repo":"calcom/cal.diy","slug":"unsupported-integration-integrationslug","errorCode":null,"errorMessage":"Unsupported integration: ${integrationSlug}","messagePattern":"Unsupported integration: (.+?)","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":81,"sourceCode":"    private readonly credentialService: BookingLocationCredentialService_2024_08_13\n  ) {}\n\n  async handleIntegrationLocationUpdate(\n    existingBooking: BookingForLocationUpdate,\n    inputLocation: { type: \"integration\"; integration: Integration_2024_08_13 },\n    user: ApiAuthGuardUser,\n    existingBookingHost: { organizationId: number | null } | null\n  ): Promise<BookingLocationResponse> {\n    if (!existingBookingHost) {\n      throw new NotFoundException(`No user found for booking with uid=${existingBooking.uid}`);\n    }\n\n    const integrationSlug = inputLocation.integration;\n    const internalLocation =\n      apiToInternalintegrationsMapping[integrationSlug as keyof typeof apiToInternalintegrationsMapping];\n\n    if (!internalLocation) {\n      throw new BadRequestException(`Unsupported integration: ${integrationSlug}`);\n    }\n\n    const booking = await this.bookingsRepository.getBookingByIdWithUserAndEventDetails(existingBooking.id);\n    if (!bookingHasUser(booking)) {\n      throw new NotFoundException(`Could not load booking details for uid=${existingBooking.uid}`);\n    }\n\n    const ctx: IntegrationHandlerContext = {\n      existingBooking,\n      booking,\n      integrationSlug,\n      internalLocation,\n      user,\n      existingBookingHost,\n      inputLocation,\n    };\n\n    switch (integrationSlug) {","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/calcom/cal.diy/blob/176037d0afbe572f870a3c702985e7cd83fe6c0c/apps/api/v2/src/platform/bookings/2024-08-13/services/booking-location-integration.service.ts#L63-L99","documentation":"A 400 BadRequestException thrown by BookingLocationIntegrationService_2024_08_13.handleIntegrationLocationUpdate when the provided integration slug doesn't map to any entry in apiToInternalintegrationsMapping. The mapping defines 29 supported integrations (cal-video, google-meet, zoom, office365-video, whereby-video, etc.). If the client sends an integration value not in this mapping, the lookup returns undefined.","triggerScenarios":"PATCH /v2/bookings/{bookingUid}/location with { type: 'integration', integration: '<slug>' } where <slug> is not one of the 29 supported values. Note that the input DTO validates against supportedIntegrations via @IsIn, so this error is a secondary defense — it fires if validation is bypassed or if the mapping and the supportedIntegrations array fall out of sync.","commonSituations":"Client sends a typo like 'google_meet' instead of 'google-meet', or 'ms-teams' instead of 'office365-video'. A new integration was added to supportedIntegrations but not to apiToInternalintegrationsMapping (or vice versa). The integration slug casing doesn't match. A custom integration slug was used that isn't registered.","solutions":["Check the integration value against the supported list: cal-video, google-meet, zoom, office365-video, whereby-video, whatsapp-video, webex-video, telegram-video, tandem, sylaps-video, skype-video, sirius-video, signal-video, shimmer-video, salesroom-video, roam-video, riverside-video, ping-video, mirotalk-video, jitsi, jelly-video, jelly-conferencing, huddle, facetime-video, element-call-video, eightxeight-video, discord-video, demodesk-video, campfire-video.","Use the exact slug string with correct casing and hyphens — e.g., 'google-meet' not 'Google Meet' or 'google_meet'.","If you believe the integration should be supported, verify both supportedIntegrations and apiToInternalintegrationsMapping include it — a mismatch is a code bug.","For Microsoft Teams specifically, use 'office365-video', not 'ms-teams' or 'teams'."],"exampleFix":"// before — wrong integration slug\nPATCH /v2/bookings/abc-123/location\n{ \"type\": \"integration\", \"integration\": \"ms-teams\" }\n// -> 400: Unsupported integration: ms-teams\n\n// after — correct slug\nPATCH /v2/bookings/abc-123/location\n{ \"type\": \"integration\", \"integration\": \"office365-video\" }","handlingStrategy":"validation","validationCode":"// Validate the integration slug against supported values before the API call\nconst SUPPORTED_INTEGRATIONS = [\n  'cal-video', 'google-meet', 'zoom', 'office365-video', 'whereby-video',\n  'whatsapp-video', 'webex-video', 'telegram-video', 'tandem', 'sylaps-video',\n  'skype-video', 'sirius-video', 'signal-video', 'shimmer-video', 'salesroom-video',\n  'roam-video', 'riverside-video', 'ping-video', 'mirotalk-video', 'jitsi',\n  'jelly-video', 'jelly-conferencing', 'huddle', 'facetime-video',\n  'element-call-video', 'eightxeight-video', 'discord-video', 'demodesk-video', 'campfire-video'\n];\n\nfunction validateIntegration(slug) {\n  if (!SUPPORTED_INTEGRATIONS.includes(slug)) {\n    throw new Error(`Unsupported integration '${slug}'. Use one of: ${SUPPORTED_INTEGRATIONS.join(', ')}`);\n  }\n  return slug;\n}\n\nvalidateIntegration(integrationSlug);\nawait api.updateBookingLocation(bookingUid, { type: 'integration', integration: integrationSlug });","typeGuard":null,"tryCatchPattern":"try {\n  await api.updateBookingLocation(bookingUid, { type: 'integration', integration: slug });\n} catch (err) {\n  if (err.statusCode === 400 && err.message.includes('Unsupported integration')) {\n    // Fall back to cal-video which is always available\n    await api.updateBookingLocation(bookingUid, { type: 'integration', integration: 'cal-video' });\n  } else { throw err; }\n}","preventionTips":["Use only integration slugs from the official supported list (29 values).","Note that MS Teams is 'office365-video', not 'ms-teams'.","Keep your client's integration list in sync with the API's supportedIntegrations array.","Fall back to 'cal-video' if the requested integration is unavailable or unsupported."],"tags":["validation","booking","location","integration","nestjs","config-mapping"],"backgroundTag":null,"analyzedSha":"176037d0afbe572f870a3c702985e7cd83fe6c0c","analyzedAt":"2026-08-12T19:12:41.464Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}