calcom/cal.diy · error · BadRequestException
Booking location with integration ${inputBookingLocation.int
Error message
Booking location with integration ${inputBookingLocation.integration} not valid for event type with id=${dbEventType.id}. The event type has following integrations: ${allowedIntegrations.join(", ")}, and only these integrations are allowed for booking location. What it means
Thrown by isBookingLocationWithEventTypeLocations when the booking location type is 'integration' but the specific integration slug is not among the event type's configured integrations. BadRequestException (HTTP 400). Even if the type is allowed, the exact integration (e.g. 'zoom' vs 'google-meet') must match one the organizer enabled.
Source
Thrown at apps/api/v2/src/platform/bookings/2024-08-13/services/input.service.ts:407
const isAllowed = allowedLocationTypes.includes(inputBookingLocation.type);
if (!isAllowed) {
throw new BadRequestException(
`Booking location with type ${inputBookingLocation.type} not valid for event type with id=${
dbEventType.id
}. The event type has following location types: ${allowedLocationTypes.join(
", "
)}, and only these types are allowed for booking location.`
);
}
if (inputBookingLocation.type === "integration" && "integration" in inputBookingLocation) {
const allowedIntegrations = eventTypeLocations
.filter((location) => location.type === "integration")
.map((location) => location.integration);
const isAllowedIntegration = allowedIntegrations.includes(inputBookingLocation.integration);
if (!isAllowedIntegration) {
throw new BadRequestException(
`Booking location with integration ${
inputBookingLocation.integration
} not valid for event type with id=${
dbEventType.id
}. The event type has following integrations: ${allowedIntegrations.join(
", "
)}, and only these integrations are allowed for booking location.`
);
}
}
return true;
}
async transformInputCreateRecurringBooking(
inputBooking: CreateRecurringBookingInput_2024_08_13,
eventType: EventTypeWithOwnerAndTeam,
platformClientId?: stringView on GitHub (pinned to 176037d0af)
Solutions
- Fetch the event type and pick an integration from its configured integration locations.
- Send only an integration slug that appears in the event type's locations list.
- If the organizer needs the requested integration, add it to the event type's locations in the dashboard.
- Fall back to organizersDefaultApp if you want the organizer's configured default rather than a specific integration.
Example fix
// before
location: { type:'integration', integration:'zoom' } // event type has only google-meet
// after
const et = await api.get(`/v2/event-types/${eventTypeId}`);
const allowedIntegration = et.data.locations.find(l => l.type === 'integration')?.integration;
location = { type:'integration', integration: allowedIntegration }; Defensive patterns
Strategy: validation
Validate before calling
const et = await api.get(`/v2/event-types/${eventTypeId}`);
const allowedIntegrations = et.data.locations.filter(l => l.type === 'integration').map(l => l.integration);
if (body.location?.type === 'integration' && !allowedIntegrations.includes(body.location.integration)) {
body.location.integration = allowedIntegrations[0];
} Type guard
const isAllowedIntegration = (slug: string, allowed: string[]): boolean => allowed.includes(slug);
Try / catch
try { await api.post('/v2/bookings', body); }
catch (e) {
if (e.response?.status === 400 && /integration.*not valid for event type/.test(e.response.data.message)) {
/* pick an integration listed in the error and retry */
} else throw e;
} Prevention
- Pick the integration from the event type's configured integration locations.
- Use organizersDefaultApp to defer to the organizer's default.
- Re-fetch the event type after the organizer changes conferencing apps.
When it happens
Trigger: POST /v2/bookings with { type:'integration', integration:'zoom' } where the event type only has google-meet (or cal-video) configured. The validator filters the event type's locations for type === 'integration', maps to their integration slugs, and rejects if the requested slug is not in that list.
Common situations: Defaulting to a hard-coded integration regardless of what the organizer set; organizer swapped default conferencing app after the client cached the event type; multi-integration event type where the client picks the wrong one; using an internal integration label instead of the API slug.
Related errors
- Invalid integration: ${location.integration}
- Booking location with type ${inputBookingLocation.type} not
- Can't specify 'lengthInMinutes' because event type does not
- Provided 'lengthInMinutes' is not one of the possible length
- Booking location with type ${(location as BookingInputLocati
AI-assisted analysis of calcom/cal.diy@176037d0af (2026-08-12).
Data as JSON: /api/errors/f37eaa7e57460c43.
Report an issue: GitHub.