{"record":{"id":"f870d1889c4285bc","repo":"calcom/cal.diy","slug":"username-is-required-for-non-team-events-please-p","errorCode":null,"errorMessage":"username is required for non-team events, please provide a valid username","messagePattern":"username is required for non-team events, please provide a valid username","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"apps/api/v2/src/modules/atoms/services/event-types-atom.service.ts","lineNumber":386,"sourceCode":"    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,\n        orgSlug,\n        this.dbRead.prisma as unknown as PrismaClient,\n        true\n      );\n","sourceCodeStart":368,"sourceCodeEnd":404,"githubUrl":"https://github.com/calcom/cal.diy/blob/176037d0afbe572f870a3c702985e7cd83fe6c0c/apps/api/v2/src/modules/atoms/services/event-types-atom.service.ts#L368-L404","documentation":"Thrown by EventTypesAtomService.getPublicEventTypeForAtoms when isTeamEvent is false or undefined and no username is provided. For non-team events, the username serves as the URL path component to look up the public event type. Without it, getPublicEvent cannot resolve the event owner and BadRequestException (HTTP 400) is thrown.","triggerScenarios":"Calling the public event-type atoms endpoint with { isTeamEvent: false } (or omitted) but no username. The client assumes a default user context but doesn't pass it. A request constructed from a URL where the username segment was empty.","commonSituations":"Anon/public booking page that lost the username context. API client that defaults to the authenticated user but doesn't translate that into a username parameter for this endpoint. Test fixture for a user event that omits username. Frontend route handler that parses the URL but finds an empty username segment.","solutions":["Provide a valid username when isTeamEvent is false or not set: include it in the query or body.","If the intent is a team event, set isTeamEvent: true and provide teamId instead.","Ensure the username corresponds to an existing user with event types."],"exampleFix":"// before: non-team event without username\nconst event = await atomsApi.getPublicEventType({\n  eventSlug: '30min'\n  // username missing, isTeamEvent omitted (falsy)\n});\n\n// after: include username for user events\nconst event = await atomsApi.getPublicEventType({\n  eventSlug: '30min',\n  username: 'john.doe'\n});","handlingStrategy":"validation","validationCode":"// Validate that username is present for non-team events\nconst validateNonTeamEventRequest = (params: {\n  isTeamEvent?: boolean;\n  username?: string;\n}): void => {\n  if (!params.isTeamEvent && !params.username) {\n    throw new Error('username is required for non-team events.');\n  }\n};","typeGuard":"type NonTeamEventRequest = { eventSlug: string; username: string; isTeamEvent?: false };\nconst isNonTeamRequest = (p: any): p is NonTeamEventRequest =>\n  p.eventSlug && typeof p.username === 'string' && (!p.isTeamEvent || p.isTeamEvent === false);","tryCatchPattern":null,"preventionTips":["Always pass the username context from the booking page URL or session when requesting non-team public events.","Use discriminated union types in the client to enforce username presence for non-team event requests.","In frontend routing, validate that the username path segment is non-empty before calling the API."],"tags":["validation","bad-request","event-types","atoms","nestjs","api-v2","input-validation"],"backgroundTag":null,"analyzedSha":"176037d0afbe572f870a3c702985e7cd83fe6c0c","analyzedAt":"2026-08-12T19:12:41.464Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}