{"record":{"id":"3181f0ba6c0872d1","repo":"calcom/cal.diy","slug":"teamid-is-required-for-team-events-please-provide","errorCode":null,"errorMessage":"teamId is required for team events, please provide a valid teamId","messagePattern":"teamId is required for team events, please provide a valid teamId","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"apps/api/v2/src/modules/atoms/services/event-types-atom.service.ts","lineNumber":381,"sourceCode":"  async getPublicEventTypeForAtoms({\n    username,\n    eventSlug,\n    isTeamEvent,\n    orgId,\n    teamId,\n  }: {\n    username?: string;\n    eventSlug: string;\n    isTeamEvent?: boolean;\n    orgId?: number;\n    teamId?: number;\n  }): Promise<PublicEventType> {\n    const orgSlug = orgId ? await this.getTeamSlug(orgId) : null;\n\n    let usernameOrTeamSlug: string | null = null;\n    if (isTeamEvent) {\n      if (!teamId) {\n        throw new BadRequestException(\"teamId is required for team events, please provide a valid teamId\");\n      }\n      usernameOrTeamSlug = await this.getTeamSlug(teamId);\n    } else {\n      if (!username) {\n        throw new BadRequestException(\n          \"username is required for non-team events, please provide a valid username\"\n        );\n      }\n      usernameOrTeamSlug = username;\n    }\n\n    usernameOrTeamSlug = usernameOrTeamSlug.toLowerCase();\n\n    try {\n      let event = await getPublicEvent(\n        usernameOrTeamSlug,\n        eventSlug,\n        isTeamEvent,","sourceCodeStart":363,"sourceCodeEnd":399,"githubUrl":"https://github.com/calcom/cal.diy/blob/176037d0afbe572f870a3c702985e7cd83fe6c0c/apps/api/v2/src/modules/atoms/services/event-types-atom.service.ts#L363-L399","documentation":"Thrown by EventTypesAtomService.getPublicEventTypeForAtoms when isTeamEvent is truthy but no teamId is provided. The method requires a teamId to resolve the team slug (via getTeamSlug) which serves as the URL path component for public team event types. Without it, the team slug cannot be determined and the public event lookup cannot proceed, so BadRequestException (HTTP 400) is thrown.","triggerScenarios":"Calling the public event-type atoms endpoint with { isTeamEvent: true } but omitting teamId from the query or body. The client sets isTeamEvent based on a flag but doesn't pass the team context. A form that defaults isTeamEvent to true without requiring teamId.","commonSituations":"Frontend toggle for 'team event' that doesn't validate teamId presence. API client SDK that makes teamId optional without server-side enforcement note. Copy-paste from a user-event request template that forgot to add teamId when switching to team mode. Test fixture with isTeamEvent: true but teamId missing.","solutions":["Provide a valid teamId when isTeamEvent is true: include it in the query string or request body.","Add client-side validation: if isTeamEvent is checked, require teamId before allowing submission.","If you don't have a teamId, set isTeamEvent to false and provide a username instead (non-team event path)."],"exampleFix":"// before: team event requested without teamId\nconst event = await atomsApi.getPublicEventType({\n  eventSlug: '30min',\n  isTeamEvent: true\n  // teamId missing\n});\n\n// after: include teamId for team events\nconst event = await atomsApi.getPublicEventType({\n  eventSlug: '30min',\n  isTeamEvent: true,\n  teamId: 42\n});","handlingStrategy":"validation","validationCode":"// Validate that teamId is present when isTeamEvent is true\nconst validatePublicEventRequest = (params: {\n  eventSlug: string;\n  isTeamEvent?: boolean;\n  teamId?: number;\n  username?: string;\n}): void => {\n  if (params.isTeamEvent && !params.teamId) {\n    throw new Error('teamId is required when isTeamEvent is true.');\n  }\n  if (!params.isTeamEvent && !params.username) {\n    throw new Error('username is required when isTeamEvent is false or omitted.');\n  }\n  if (!params.eventSlug) {\n    throw new Error('eventSlug is required.');\n  }\n};","typeGuard":"type PublicEventRequest =\n  | { eventSlug: string; isTeamEvent: true; teamId: number; username?: string; orgId?: number }\n  | { eventSlug: string; isTeamEvent?: false; username: string; teamId?: number; orgId?: number };\n\nconst isValidRequest = (p: any): p is PublicEventRequest =>\n  p.eventSlug && (p.isTeamEvent ? typeof p.teamId === 'number' : typeof p.username === 'string');","tryCatchPattern":null,"preventionTips":["Use a discriminated union type in the client to make omitting teamId a compile-time error when isTeamEvent is true.","Add form validation that requires teamId when the team-event toggle is enabled.","Document the isTeamEvent/teamId/username relationship clearly in API client documentation."],"tags":["validation","bad-request","team","event-types","atoms","nestjs","api-v2","input-validation"],"backgroundTag":null,"analyzedSha":"176037d0afbe572f870a3c702985e7cd83fe6c0c","analyzedAt":"2026-08-12T19:12:41.464Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}