{"record":{"id":"e3eedc9ca176173b","repo":"calcom/cal.diy","slug":"please-provide-booking-uid-instead-of-booking-id","errorCode":null,"errorMessage":"Please provide booking uid instead of booking id.","messagePattern":"Please provide booking uid instead of booking id\\.","errorType":"http","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"apps/api/v2/src/platform/bookings/2024-04-15/controllers/bookings.controller.ts","lineNumber":246,"sourceCode":"    } catch (err) {\n      this.handleBookingErrors(err);\n    }\n    throw new InternalServerErrorException(\"Could not create booking.\");\n  }\n\n  @Post(\"/:bookingUid/cancel\")\n  async cancelBooking(\n    @Req() req: BookingRequest,\n    @Param(\"bookingUid\") bookingUid: string,\n    @Body() _body: CancelBookingInput_2024_04_15,\n    @Headers(X_CAL_CLIENT_ID) clientId?: string,\n    @Headers(X_CAL_PLATFORM_EMBED) isEmbed?: string\n  ): Promise<ApiResponse<{ bookingId: number; bookingUid: string; onlyRemovedAttendee: boolean }>> {\n    const oAuthClientId = clientId?.toString();\n    const isUidNumber = !Number.isNaN(Number(bookingUid));\n\n    if (isUidNumber) {\n      throw new BadRequestException(\"Please provide booking uid instead of booking id.\");\n    }\n\n    if (bookingUid) {\n      const { bookingInfo } = await getBookingInfo(bookingUid);\n      if (!bookingInfo) {\n        throw new NotFoundException(`Booking with UID=${bookingUid} does not exist.`);\n      }\n      if (bookingInfo.status === \"CANCELLED\") {\n        throw new BadRequestException(\n          `Can't cancel booking with uid=${bookingUid} because it has been cancelled already. Please provide uid of a booking that is not cancelled.`\n        );\n      }\n      try {\n        req.body.uid = bookingUid;\n        const bookingRequest = await this.createNextApiBookingRequest(req, oAuthClientId, undefined, isEmbed);\n        const res = await handleCancelBooking({\n          bookingData: bookingRequest.body,\n          userId: bookingRequest.userId,","sourceCodeStart":228,"sourceCodeEnd":264,"githubUrl":"https://github.com/calcom/cal.diy/blob/176037d0afbe572f870a3c702985e7cd83fe6c0c/apps/api/v2/src/platform/bookings/2024-04-15/controllers/bookings.controller.ts#L228-L264","documentation":"cancelBooking computes isUidNumber = !Number.isNaN(Number(bookingUid)); if the route param parses as a number it throws BadRequestException (HTTP 400) telling the caller to send a booking uid, not a numeric booking id. Booking uids are string identifiers; numeric ids are a different column.","triggerScenarios":"POST /:bookingUid/cancel where :bookingUid is purely numeric (e.g. '12345' — the booking id) instead of the uid string (e.g. 'a1b2c3...').","commonSituations":"Client used booking.id from a response instead of booking.uid; UI label confusion; migration from an older API that used numeric ids.","solutions":["Use booking.uid (string), not booking.id (number), in the cancel path.","Audit response mapping to surface uid as the canonical identifier.","Add a client-side guard: if /^\\d+$/.test(bookingUid) reject before sending."],"exampleFix":"// before\nawait api.cancelBooking(String(booking.id));\n// after\nawait api.cancelBooking(booking.uid);","handlingStrategy":"validation","validationCode":"function assertBookingUid(uid: string) {\n  if (typeof uid !== 'string' || /^\\d+$/.test(uid)) {\n    throw new Error('Provide booking.uid (string), not booking.id (numeric)');\n  }\n}\nassertBookingUid(bookingUid);","typeGuard":"const isBookingUidNotNumericId = (v: unknown): v is string =>\n  typeof v === 'string' && v.length > 0 && !/^\\d+$/.test(v);","tryCatchPattern":"try { await api.cancelBooking(uid); }\ncatch (e) {\n  if (e.status === 400 && /booking uid instead of booking id/.test(e.message)) {\n    // re-resolve uid from booking object and retry\n  } else throw e;\n}","preventionTips":["Always key bookings by uid, not id, in client code.","Add a unit test asserting the cancel path rejects numeric ids before send.","Label uid vs id clearly in API response mappings."],"tags":["bookings","bad-request","validation","uid","cancel"],"backgroundTag":null,"analyzedSha":"176037d0afbe572f870a3c702985e7cd83fe6c0c","analyzedAt":"2026-08-12T19:12:41.464Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}