diff --git a/apps/api/v2/package.json b/apps/api/v2/package.json index c7d8abaab28e5c..cb06e1768779dd 100644 --- a/apps/api/v2/package.json +++ b/apps/api/v2/package.json @@ -38,7 +38,7 @@ "@axiomhq/winston": "^1.2.0", "@calcom/platform-constants": "*", "@calcom/platform-enums": "*", - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.291", + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.294", "@calcom/platform-types": "*", "@calcom/platform-utils": "*", "@calcom/prisma": "*", diff --git a/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.e2e-spec.ts b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.e2e-spec.ts new file mode 100644 index 00000000000000..ab91f87c5884d3 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.e2e-spec.ts @@ -0,0 +1,178 @@ +import { bootstrap } from "@/app"; +import { AppModule } from "@/app.module"; +import { HttpExceptionFilter } from "@/filters/http-exception.filter"; +import { PrismaExceptionFilter } from "@/filters/prisma-exception.filter"; +import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard"; +import { TokensModule } from "@/modules/tokens/tokens.module"; +import { UsersModule } from "@/modules/users/users.module"; +import { INestApplication } from "@nestjs/common"; +import { NestExpressApplication } from "@nestjs/platform-express"; +import { Test } from "@nestjs/testing"; +import * as request from "supertest"; + +import { SUCCESS_STATUS } from "@calcom/platform-constants"; +import { CreatePrivateLinkInput } from "@calcom/platform-types"; + +import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; +import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture"; +import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; +import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture"; +import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture"; +import { withApiAuth } from "test/utils/withApiAuth"; +import { randomString } from "test/utils/randomString"; + +describe("Event Types Private Links Endpoints", () => { + let app: INestApplication; + + let oAuthClient: any; + let organization: any; + let userRepositoryFixture: UserRepositoryFixture; + let teamRepositoryFixture: TeamRepositoryFixture; + let eventTypesRepositoryFixture: EventTypesRepositoryFixture; + let oauthClientRepositoryFixture: OAuthClientRepositoryFixture; + let user: any; + let eventType: any; + + const userEmail = `private-links-user-${randomString()}@api.com`; + + beforeAll(async () => { + const moduleRef = await withApiAuth( + userEmail, + Test.createTestingModule({ + providers: [PrismaExceptionFilter, HttpExceptionFilter], + imports: [AppModule, UsersModule, EventTypesModule_2024_06_14, TokensModule], + }) + ) + .overrideGuard(PermissionsGuard) + .useValue({ + canActivate: () => true, + }) + .compile(); + + app = moduleRef.createNestApplication(); + bootstrap(app as NestExpressApplication); + + oauthClientRepositoryFixture = new OAuthClientRepositoryFixture(moduleRef); + userRepositoryFixture = new UserRepositoryFixture(moduleRef); + teamRepositoryFixture = new TeamRepositoryFixture(moduleRef); + eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef); + + organization = await teamRepositoryFixture.create({ + name: `private-links-organization-${randomString()}`, + slug: `private-links-org-slug-${randomString()}`, + }); + oAuthClient = await createOAuthClient(organization.id); + user = await userRepositoryFixture.create({ + email: userEmail, + name: `private-links-user-${randomString()}`, + username: `private-links-user-${randomString()}`, + }); + + // create an event type owned by user + eventType = await eventTypesRepositoryFixture.create( + { + title: `private-links-event-type-${randomString()}`, + slug: `private-links-event-type-${randomString()}`, + length: 30, + locations: [], + }, + user.id + ); + + await app.init(); + }); + + async function createOAuthClient(organizationId: number) { + const data = { + logo: "logo-url", + name: "name", + redirectUris: ["redirect-uri"], + permissions: 32, + }; + const secret = "secret"; + + const client = await oauthClientRepositoryFixture.create(organizationId, data, secret); + return client; + } + + it("POST /v2/event-types/:eventTypeId/private-links - create private link", async () => { + const body: CreatePrivateLinkInput = { + expiresAt: undefined, + maxUsageCount: 5, + }; + + const response = await request(app.getHttpServer()) + .post(`/api/v2/event-types/${eventType.id}/private-links`) + .set("Authorization", `Bearer whatever`) + .send(body) + .expect(201); + + expect(response.body.status).toBe(SUCCESS_STATUS); + expect(response.body.data.linkId).toBeDefined(); + expect(response.body.data.maxUsageCount).toBe(5); + expect(response.body.data.usageCount).toBeDefined(); + }); + + it("GET /v2/event-types/:eventTypeId/private-links - list private links", async () => { + const response = await request(app.getHttpServer()) + .get(`/api/v2/event-types/${eventType.id}/private-links`) + .set("Authorization", `Bearer whatever`) + .expect(200); + + expect(response.body.status).toBe(SUCCESS_STATUS); + expect(Array.isArray(response.body.data)).toBe(true); + expect(response.body.data.length).toBeGreaterThanOrEqual(1); + }); + + it("PATCH /v2/event-types/:eventTypeId/private-links/:linkId - update private link", async () => { + // create a link first + const createResp = await request(app.getHttpServer()) + .post(`/api/v2/event-types/${eventType.id}/private-links`) + .set("Authorization", `Bearer whatever`) + .send({ maxUsageCount: 3 }) + .expect(201); + + const linkId = createResp.body.data.linkId; + + const response = await request(app.getHttpServer()) + .patch(`/api/v2/event-types/${eventType.id}/private-links/${linkId}`) + .set("Authorization", `Bearer whatever`) + .send({ maxUsageCount: 10 }) + .expect(200); + + expect(response.body.status).toBe(SUCCESS_STATUS); + expect(response.body.data.maxUsageCount).toBe(10); + }); + + it("DELETE /v2/event-types/:eventTypeId/private-links/:linkId - delete private link", async () => { + // create a link to delete + const createResp = await request(app.getHttpServer()) + .post(`/api/v2/event-types/${eventType.id}/private-links`) + .set("Authorization", `Bearer whatever`) + .send({ maxUsageCount: 2 }) + .expect(201); + + const linkId = createResp.body.data.linkId; + + const response = await request(app.getHttpServer()) + .delete(`/api/v2/event-types/${eventType.id}/private-links/${linkId}`) + .set("Authorization", `Bearer whatever`) + .expect(200); + + expect(response.body.status).toBe(SUCCESS_STATUS); + expect(response.body.data.linkId).toBe(linkId); + }); + + afterAll(async () => { + // cleanup created entities + try { + if (eventType?.id) { + const repo = new EventTypesRepositoryFixture((app as any).select(AppModule)); + await repo.delete(eventType.id); + } + } catch {} + await app.close(); + }); +}); + + diff --git a/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts new file mode 100644 index 00000000000000..cd770676665988 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts @@ -0,0 +1,123 @@ +import { API_KEY_OR_ACCESS_TOKEN_HEADER } from "@/lib/docs/headers"; +import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; +import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator"; +import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; +import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard"; +import { EventTypeOwnershipGuard } from "@/modules/event-types/guards/event-type-ownership.guard"; +import { + Body, + Controller, + Delete, + Get, + Param, + ParseIntPipe, + Patch, + Post, + UseGuards, +} from "@nestjs/common"; +import { ApiHeader, ApiOperation, ApiTags as DocsTags, OmitType } from "@nestjs/swagger"; + +import { + EVENT_TYPE_READ, + EVENT_TYPE_WRITE, + SUCCESS_STATUS, +} from "@calcom/platform-constants"; +import { + CreatePrivateLinkInput, + CreatePrivateLinkOutput, + DeletePrivateLinkOutput, + GetPrivateLinksOutput, + UpdatePrivateLinkInput, + UpdatePrivateLinkOutput, +} from "@calcom/platform-types"; + +import { PrivateLinksService } from "../services/private-links.service"; + +class UpdatePrivateLinkBody extends OmitType(UpdatePrivateLinkInput, ["linkId"] as const) {} + +@Controller({ + path: "/v2/event-types/:eventTypeId/private-links", +}) +@UseGuards(PermissionsGuard) +@DocsTags("Event Types Private Links") +export class EventTypesPrivateLinksController { + constructor(private readonly privateLinksService: PrivateLinksService) {} + + @Post("/") + @Permissions([EVENT_TYPE_WRITE]) + @UseGuards(ApiAuthGuard, EventTypeOwnershipGuard) + @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) + @ApiOperation({ summary: "Create a private link for an event type" }) + async createPrivateLink( + @Param("eventTypeId", ParseIntPipe) eventTypeId: number, + @Body() body: CreatePrivateLinkInput, + @GetUser("id") userId: number + ): Promise { + const privateLink = await this.privateLinksService.createPrivateLink(eventTypeId, userId, body); + + return { + status: SUCCESS_STATUS, + data: privateLink, + }; + } + + @Get("/") + @Permissions([EVENT_TYPE_READ]) + @UseGuards(ApiAuthGuard, EventTypeOwnershipGuard) + @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) + @ApiOperation({ summary: "Get all private links for an event type" }) + async getPrivateLinks( + @Param("eventTypeId", ParseIntPipe) eventTypeId: number, + @GetUser("id") userId: number + ): Promise { + const privateLinks = await this.privateLinksService.getPrivateLinks(eventTypeId, userId); + + return { + status: SUCCESS_STATUS, + data: privateLinks, + }; + } + + @Patch("/:linkId") + @Permissions([EVENT_TYPE_WRITE]) + @UseGuards(ApiAuthGuard, EventTypeOwnershipGuard) + @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) + @ApiOperation({ summary: "Update a private link for an event type" }) + async updatePrivateLink( + @Param("eventTypeId", ParseIntPipe) eventTypeId: number, + @Param("linkId") linkId: string, + @Body() body: UpdatePrivateLinkBody, + @GetUser("id") userId: number + ): Promise { + const updateInput = { ...body, linkId }; + const privateLink = await this.privateLinksService.updatePrivateLink(eventTypeId, userId, updateInput); + + return { + status: SUCCESS_STATUS, + data: privateLink, + }; + } + + @Delete("/:linkId") + @Permissions([EVENT_TYPE_WRITE]) + @UseGuards(ApiAuthGuard, EventTypeOwnershipGuard) + @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) + @ApiOperation({ summary: "Delete a private link for an event type" }) + async deletePrivateLink( + @Param("eventTypeId", ParseIntPipe) eventTypeId: number, + @Param("linkId") linkId: string, + @GetUser("id") userId: number + ): Promise { + await this.privateLinksService.deletePrivateLink(eventTypeId, userId, linkId); + + return { + status: SUCCESS_STATUS, + data: { + linkId, + message: "Private link deleted successfully", + }, + }; + } +} + + diff --git a/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts new file mode 100644 index 00000000000000..4b9643fc76e062 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts @@ -0,0 +1,27 @@ +import { Module } from "@nestjs/common"; +import { TokensModule } from "@/modules/tokens/tokens.module"; +import { OAuthClientModule } from "@/modules/oauth-clients/oauth-client.module"; +import { PrismaModule } from "@/modules/prisma/prisma.module"; +import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; +import { EventTypeOwnershipGuard } from "@/modules/event-types/guards/event-type-ownership.guard"; + +import { EventTypesPrivateLinksController } from "./controllers/event-types-private-links.controller"; +import { PrivateLinksInputService } from "./services/private-links-input.service"; +import { PrivateLinksOutputService } from "./services/private-links-output.service"; +import { PrivateLinksService } from "./services/private-links.service"; +import { PrivateLinksRepository } from "./private-links.repository"; + +@Module({ + imports: [TokensModule, OAuthClientModule, PrismaModule, EventTypesModule_2024_06_14], + controllers: [EventTypesPrivateLinksController], + providers: [ + PrivateLinksService, + PrivateLinksInputService, + PrivateLinksOutputService, + PrivateLinksRepository, + EventTypeOwnershipGuard, + ], +}) +export class EventTypesPrivateLinksModule {} + + diff --git a/apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts b/apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts new file mode 100644 index 00000000000000..4f6dde61b11176 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts @@ -0,0 +1,54 @@ +import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; +import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; +import { Injectable } from "@nestjs/common"; + +@Injectable() +export class PrivateLinksRepository { + constructor(private readonly dbRead: PrismaReadService, private readonly dbWrite: PrismaWriteService) {} + + async listByEventTypeId(eventTypeId: number) { + return this.dbRead.prisma.hashedLink.findMany({ + where: { eventTypeId }, + select: { link: true, expiresAt: true, maxUsageCount: true, usageCount: true }, + }); + } + + async findWithEventTypeDetails(linkId: string) { + return this.dbRead.prisma.hashedLink.findUnique({ + where: { link: linkId }, + select: { + link: true, + expiresAt: true, + maxUsageCount: true, + usageCount: true, + }, + }); + } + + async create(eventTypeId: number, link: { link: string; expiresAt: Date | null; maxUsageCount?: number | null }) { + return this.dbWrite.prisma.hashedLink.create({ + data: { + eventTypeId, + link: link.link, + expiresAt: link.expiresAt, + ...(typeof link.maxUsageCount === "number" ? { maxUsageCount: link.maxUsageCount } : {}), + }, + }); + } + + async update(eventTypeId: number, link: { link: string; expiresAt: Date | null; maxUsageCount?: number | null }) { + return this.dbWrite.prisma.hashedLink.updateMany({ + where: { eventTypeId, link: link.link }, + data: { + expiresAt: link.expiresAt, + ...(typeof link.maxUsageCount === "number" ? { maxUsageCount: link.maxUsageCount } : {}), + }, + }); + } + + async delete(eventTypeId: number, linkId: string) { + return this.dbWrite.prisma.hashedLink.deleteMany({ where: { eventTypeId, link: linkId } }); + } +} + + diff --git a/apps/api/v2/src/ee/event-types-private-links/services/private-links-input.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links-input.service.ts new file mode 100644 index 00000000000000..28e3a2bc61f491 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/services/private-links-input.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from "@nestjs/common"; + +import { CreatePrivateLinkInput, UpdatePrivateLinkInput } from "@calcom/platform-types"; + +@Injectable() +export class PrivateLinksInputService { + constructor() {} + + transformCreateInput(input: CreatePrivateLinkInput): CreatePrivateLinkInput { + const hasExpires = input.expiresAt !== undefined && input.expiresAt !== null; + const hasMaxCount = typeof input.maxUsageCount === "number"; + + if (!hasExpires && !hasMaxCount) { + throw new Error("Either expiresAt or maxUsageCount must be provided"); + } + + if (hasExpires && hasMaxCount) { + throw new Error("Provide only one of expiresAt or maxUsageCount"); + } + + return { + expiresAt: input.expiresAt, + maxUsageCount: input.maxUsageCount ?? (hasMaxCount ? input.maxUsageCount : undefined), + }; + } + + transformUpdateInput(input: UpdatePrivateLinkInput): UpdatePrivateLinkInput { + return { + linkId: input.linkId, + expiresAt: input.expiresAt, + maxUsageCount: input.maxUsageCount, + }; + } +} diff --git a/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts new file mode 100644 index 00000000000000..35ce974f53bbcd --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from "@nestjs/common"; +import { plainToClass } from "class-transformer"; + +export type PrivateLinkData = { + id: string; + eventTypeId: number; + isExpired: boolean; + bookingUrl: string; + expiresAt?: Date | null; + maxUsageCount?: number | null; + usageCount?: number; +}; +import { PrivateLinkOutput, TimeBasedPrivateLinkOutput, UsageBasedPrivateLinkOutput } from "@calcom/platform-types"; + +@Injectable() +export class PrivateLinksOutputService { + constructor() {} + + transformToOutput(data: PrivateLinkData): PrivateLinkOutput { + const baseData = { + linkId: data.id.toString(), + eventTypeId: data.eventTypeId, + isExpired: data.isExpired, + bookingUrl: data.bookingUrl, + }; + + if (data.expiresAt !== null && data.expiresAt !== undefined) { + return plainToClass(TimeBasedPrivateLinkOutput, { ...baseData, expiresAt: data.expiresAt }); + } + + return plainToClass(UsageBasedPrivateLinkOutput, { + ...baseData, + maxUsageCount: data.maxUsageCount || 0, + usageCount: data.usageCount || 0, + }); + } + + transformArrayToOutput(data: PrivateLinkData[]): PrivateLinkOutput[] { + return data.map((item) => this.transformToOutput(item)); + } +} + + diff --git a/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts new file mode 100644 index 00000000000000..a9bd77582846d4 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts @@ -0,0 +1,128 @@ +import { Injectable, NotFoundException, BadRequestException } from "@nestjs/common"; + +import { generateHashedLink, isLinkExpired } from "@calcom/platform-libraries/private-links"; +import { CreatePrivateLinkInput, PrivateLinkOutput, UpdatePrivateLinkInput } from "@calcom/platform-types"; + +import { PrivateLinksInputService } from "@/ee/event-types-private-links/services/private-links-input.service"; +import { + PrivateLinksOutputService, + type PrivateLinkData, +} from "@/ee/event-types-private-links/services/private-links-output.service"; +import { PrivateLinksRepository } from "@/ee/event-types-private-links/private-links.repository"; + +@Injectable() +export class PrivateLinksService { + constructor( + private readonly inputService: PrivateLinksInputService, + private readonly outputService: PrivateLinksOutputService, + private readonly repo: PrivateLinksRepository + ) {} + + async createPrivateLink( + eventTypeId: number, + userId: number, + input: CreatePrivateLinkInput + ): Promise { + try { + const transformedInput = this.inputService.transformCreateInput(input); + const created = await this.repo.create(eventTypeId, { + link: generateHashedLink(userId), + expiresAt: transformedInput.expiresAt ?? null, + maxUsageCount: transformedInput.maxUsageCount ?? null, + }); + const mapped: PrivateLinkData = { + id: created.link, + eventTypeId, + isExpired: isLinkExpired(created as any), + bookingUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL || "https://cal.com"}/d/${created.link}`, + expiresAt: created.expiresAt ?? null, + maxUsageCount: (created as any).maxUsageCount ?? null, + usageCount: (created as any).usageCount ?? 0, + }; + return this.outputService.transformToOutput(mapped); + } catch (error) { + if (error instanceof Error) { + throw new BadRequestException(error.message); + } + throw new BadRequestException("Failed to create private link"); + } + } + + async getPrivateLinks(eventTypeId: number, userId: number): Promise { + try { + const links = await this.repo.listByEventTypeId(eventTypeId); + const mapped: PrivateLinkData[] = links.map((l) => ({ + id: l.link, + eventTypeId, + isExpired: isLinkExpired(l as any), + bookingUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL || "https://cal.com"}/d/${l.link}`, + expiresAt: l.expiresAt ?? null, + maxUsageCount: l.maxUsageCount ?? null, + usageCount: l.usageCount ?? 0, + })); + return this.outputService.transformArrayToOutput(mapped); + } catch (error) { + if (error instanceof Error) { + throw new BadRequestException(error.message); + } + throw new BadRequestException("Failed to get private links"); + } + } + + async updatePrivateLink( + eventTypeId: number, + userId: number, + input: UpdatePrivateLinkInput + ): Promise { + try { + const transformedInput = this.inputService.transformUpdateInput(input); + const updatedResult = await this.repo.update(eventTypeId, { + link: transformedInput.linkId, + expiresAt: transformedInput.expiresAt ?? null, + maxUsageCount: transformedInput.maxUsageCount ?? null, + }); + if (!updatedResult || (updatedResult as any).count === 0) { + throw new NotFoundException("Updated link not found"); + } + const updated = await this.repo.findWithEventTypeDetails(transformedInput.linkId); + if (!updated) throw new NotFoundException("Updated link not found"); + const mapped: PrivateLinkData = { + id: updated.link, + eventTypeId, + isExpired: isLinkExpired(updated as any), + bookingUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL || "https://cal.com"}/d/${updated.link}`, + expiresAt: updated.expiresAt ?? null, + maxUsageCount: updated.maxUsageCount ?? null, + usageCount: updated.usageCount ?? 0, + }; + return this.outputService.transformToOutput(mapped); + } catch (error) { + if (error instanceof Error) { + if (error.message.includes("not found")) { + throw new NotFoundException(error.message); + } + throw new BadRequestException(error.message); + } + throw new BadRequestException("Failed to update private link"); + } + } + + async deletePrivateLink(eventTypeId: number, userId: number, linkId: string): Promise { + try { + const { count } = await this.repo.delete(eventTypeId, linkId); + if (count === 0) { + throw new NotFoundException("Deleted link not found"); + } + } catch (error) { + if (error instanceof Error) { + if (error.message.includes("not found")) { + throw new NotFoundException(error.message); + } + throw new BadRequestException(error.message); + } + throw new BadRequestException("Failed to delete private link"); + } + } +} + + diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types.controller.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types.controller.ts index a9ac0d78ad4415..0a7eaf9f46a432 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types.controller.ts +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types.controller.ts @@ -6,6 +6,7 @@ import { UpdateEventTypeOutput_2024_06_14 } from "@/ee/event-types/event-types_2 import { EventTypeResponseTransformPipe } from "@/ee/event-types/event-types_2024_06_14/pipes/event-type-response.transformer"; import { EventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/event-types.service"; import { InputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/input-event-types.service"; + import { VERSION_2024_06_14_VALUE } from "@/lib/api-versions"; import { API_KEY_OR_ACCESS_TOKEN_HEADER } from "@/lib/docs/headers"; import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; @@ -41,6 +42,7 @@ import { GetEventTypesQuery_2024_06_14, CreateEventTypeInput_2024_06_14, EventTypeOutput_2024_06_14, + } from "@calcom/platform-types"; @Controller({ diff --git a/apps/api/v2/src/ee/platform-endpoints-module.ts b/apps/api/v2/src/ee/platform-endpoints-module.ts index 2185ef80a0c652..2f47ce64a2d631 100644 --- a/apps/api/v2/src/ee/platform-endpoints-module.ts +++ b/apps/api/v2/src/ee/platform-endpoints-module.ts @@ -14,6 +14,7 @@ import { SlotsModule_2024_09_04 } from "@/modules/slots/slots-2024-09-04/slots.m import { TeamsEventTypesModule } from "@/modules/teams/event-types/teams-event-types.module"; import { TeamsMembershipsModule } from "@/modules/teams/memberships/teams-memberships.module"; import { TeamsModule } from "@/modules/teams/teams/teams.module"; +import { EventTypesPrivateLinksModule } from "@/ee/event-types-private-links/event-types-private-links.module"; import type { MiddlewareConsumer, NestModule } from "@nestjs/common"; import { Module } from "@nestjs/common"; @@ -35,6 +36,7 @@ import { Module } from "@nestjs/common"; SlotsModule_2024_09_04, TeamsModule, RoutingFormsModule, + EventTypesPrivateLinksModule, ], }) export class PlatformEndpointsModule implements NestModule { diff --git a/apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts b/apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts new file mode 100644 index 00000000000000..ea6a01cc85ff76 --- /dev/null +++ b/apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts @@ -0,0 +1,44 @@ +import { EventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/event-types.service"; +import { ApiAuthGuardUser } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; +import { + BadRequestException, + CanActivate, + ExecutionContext, + ForbiddenException, + Injectable, + NotFoundException, +} from "@nestjs/common"; +import { Request } from "express"; + +@Injectable() +export class EventTypeOwnershipGuard implements CanActivate { + constructor(private readonly eventTypesService: EventTypesService_2024_06_14) {} + + async canActivate(context: ExecutionContext): Promise { + const request = context.switchToHttp().getRequest(); + const user = request.user as ApiAuthGuardUser | undefined; + const eventTypeIdParam = request.params?.eventTypeId; + + if (!user) { + throw new ForbiddenException("EventTypeOwnershipGuard - No user associated with the request."); + } + + if (!eventTypeIdParam) { + throw new BadRequestException("Missing eventTypeId param."); + } + + const eventTypeId = Number(eventTypeIdParam); + if (!Number.isInteger(eventTypeId) || eventTypeId <= 0) { + throw new BadRequestException("Invalid eventTypeId param."); + } + const eventType = await this.eventTypesService.getUserEventType(user.id, eventTypeId); + if (!eventType) { + // Mirrors EventTypesService behavior: NotFound when not owned or not present + throw new NotFoundException(`Event type with id ${eventTypeId} not found`); + } + + return true; + } +} + + diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 8fa97692b50f1c..2719e583f006b6 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -9893,6 +9893,198 @@ ] } }, + "/v2/event-types/{eventTypeId}/private-links": { + "post": { + "operationId": "EventTypesPrivateLinksController_createPrivateLink", + "summary": "Create a private link for an event type", + "parameters": [ + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePrivateLinkInput" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePrivateLinkOutput" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] + }, + "get": { + "operationId": "EventTypesPrivateLinksController_getPrivateLinks", + "summary": "Get all private links for an event type", + "parameters": [ + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetPrivateLinksOutput" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] + } + }, + "/v2/event-types/{eventTypeId}/private-links/{linkId}": { + "patch": { + "operationId": "EventTypesPrivateLinksController_updatePrivateLink", + "summary": "Update a private link for an event type", + "parameters": [ + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "linkId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePrivateLinkBody" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePrivateLinkOutput" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] + }, + "delete": { + "operationId": "EventTypesPrivateLinksController_deletePrivateLink", + "summary": "Delete a private link for an event type", + "parameters": [ + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "linkId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeletePrivateLinkOutput" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] + } + }, "/v2/organizations/{orgId}/organizations": { "post": { "operationId": "OrganizationsOrganizationsController_createOrganization", @@ -21856,7 +22048,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ] }, "recipient": { @@ -22218,7 +22411,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_address", "description": "Action to perform, send an email to a specific email address", @@ -22303,7 +22497,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_attendee", "description": "Action to perform, send an email to the attendees of the event", @@ -22379,7 +22574,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_host", "description": "Action to perform, send an email to the host of the event", @@ -22474,7 +22670,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_attendee", "description": "Action to perform", @@ -22543,7 +22740,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_number", "description": "Action to perform, send a text message via whatsapp to a specific phone number", @@ -22621,7 +22819,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "sms_number", "description": "Action to perform, send a text message to a specific phone number", @@ -22699,7 +22898,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "sms_attendee", "description": "Action to perform, send a text message to the phone numbers of the attendees", @@ -22888,7 +23088,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_address", "description": "Action to perform, send an email to a specific email address", @@ -22978,7 +23179,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_attendee", "description": "Action to perform, send an email to the attendees of the event", @@ -23059,7 +23261,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_host", "description": "Action to perform, send an email to the host of the event", @@ -23140,7 +23343,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "sms_attendee", "description": "Action to perform, send a text message to the phone numbers of the attendees", @@ -23218,7 +23422,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_number", "description": "Action to perform, send a text message via whatsapp to a specific phone number", @@ -23301,7 +23506,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_attendee", "description": "Action to perform", @@ -23375,7 +23581,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "sms_number", "description": "Action to perform, send a text message to a specific phone number", @@ -28012,6 +28219,230 @@ "data" ] }, + "CreatePrivateLinkInput": { + "type": "object", + "properties": { + "expiresAt": { + "type": "string", + "description": "Expiration date for time-based links", + "format": "date-time", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times the link can be used. If omitted and expiresAt is not provided, defaults to 1 (one time use).", + "example": 10, + "minimum": 1, + "default": 1 + } + } + }, + "TimeBasedPrivateLinkOutput": { + "type": "object", + "properties": { + "linkId": { + "type": "string", + "description": "The private link ID", + "example": "abc123def456" + }, + "eventTypeId": { + "type": "number", + "description": "Event type ID this link belongs to", + "example": 123 + }, + "isExpired": { + "type": "boolean", + "description": "Whether the link is currently expired", + "example": false + }, + "bookingUrl": { + "type": "string", + "description": "Full booking URL for this private link", + "format": "uri", + "example": "https://cal.com/d/abc123def456/30min" + }, + "expiresAt": { + "type": "string", + "description": "Expiration date for this time-based link", + "format": "date-time", + "example": "2025-12-31T23:59:59.000Z" + } + }, + "required": [ + "linkId", + "eventTypeId", + "isExpired", + "bookingUrl", + "expiresAt" + ] + }, + "UsageBasedPrivateLinkOutput": { + "type": "object", + "properties": { + "linkId": { + "type": "string", + "description": "The private link ID", + "example": "abc123def456" + }, + "eventTypeId": { + "type": "number", + "description": "Event type ID this link belongs to", + "example": 123 + }, + "isExpired": { + "type": "boolean", + "description": "Whether the link is currently expired", + "example": false + }, + "bookingUrl": { + "type": "string", + "description": "Full booking URL for this private link", + "format": "uri", + "example": "https://cal.com/d/abc123def456/30min" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times this link can be used", + "example": 10 + }, + "usageCount": { + "type": "number", + "description": "Current usage count for this link", + "example": 3 + } + }, + "required": [ + "linkId", + "eventTypeId", + "isExpired", + "bookingUrl", + "maxUsageCount", + "usageCount" + ] + }, + "CreatePrivateLinkOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Created private link data (either time-based or usage-based)", + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "GetPrivateLinksOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "type": "array", + "description": "Array of private links for the event type (mix of time-based and usage-based)", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" + } + ] + } + } + }, + "required": [ + "status", + "data" + ] + }, + "UpdatePrivateLinkBody": { + "type": "object", + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "New expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "New maximum number of times the link can be used", + "example": 10, + "minimum": 1 + } + } + }, + "UpdatePrivateLinkOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Updated private link data (either time-based or usage-based)", + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "DeletePrivateLinkOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "type": "object", + "description": "Deleted link information", + "properties": { + "linkId": { + "type": "string", + "example": "abc123def456" + }, + "message": { + "type": "string", + "example": "Private link deleted successfully" + } + } + } + }, + "required": [ + "status", + "data" + ] + }, "UserWebhookOutputDto": { "type": "object", "properties": { diff --git a/apps/api/v2/tsconfig.json b/apps/api/v2/tsconfig.json index 8460e8e22c5a8e..283477e629dcf5 100644 --- a/apps/api/v2/tsconfig.json +++ b/apps/api/v2/tsconfig.json @@ -27,7 +27,8 @@ "@calcom/platform-libraries/workflows": ["../../../packages/platform/libraries/workflows.ts"], "@calcom/platform-libraries/conferencing": ["../../../packages/platform/libraries/conferencing.ts"], "@calcom/platform-libraries/repositories": ["../../../packages/platform/libraries/repositories.ts"], - "@calcom/platform-libraries/bookings": ["../../../packages/platform/libraries/bookings.ts"] + "@calcom/platform-libraries/bookings": ["../../../packages/platform/libraries/bookings.ts"], + "@calcom/platform-libraries/private-links": ["../../../packages/platform/libraries/private-links.ts"] }, "incremental": true, "skipLibCheck": true, diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index 3e061b63defc12..2719e583f006b6 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -69,7 +69,9 @@ } } }, - "tags": ["Platform / Managed Users"] + "tags": [ + "Platform / Managed Users" + ] }, "post": { "operationId": "OAuthClientUsersController_createUser", @@ -115,7 +117,9 @@ } } }, - "tags": ["Platform / Managed Users"] + "tags": [ + "Platform / Managed Users" + ] } }, "/v2/oauth-clients/{clientId}/users/{userId}": { @@ -161,7 +165,9 @@ } } }, - "tags": ["Platform / Managed Users"] + "tags": [ + "Platform / Managed Users" + ] }, "patch": { "operationId": "OAuthClientUsersController_updateUser", @@ -215,7 +221,9 @@ } } }, - "tags": ["Platform / Managed Users"] + "tags": [ + "Platform / Managed Users" + ] }, "delete": { "operationId": "OAuthClientUsersController_deleteUser", @@ -259,7 +267,9 @@ } } }, - "tags": ["Platform / Managed Users"] + "tags": [ + "Platform / Managed Users" + ] } }, "/v2/oauth-clients/{clientId}/users/{userId}/force-refresh": { @@ -306,7 +316,9 @@ } } }, - "tags": ["Platform / Managed Users"] + "tags": [ + "Platform / Managed Users" + ] } }, "/v2/oauth/{clientId}/refresh": { @@ -355,7 +367,9 @@ } } }, - "tags": ["Platform / Managed Users"] + "tags": [ + "Platform / Managed Users" + ] } }, "/v2/oauth-clients/{clientId}/webhooks": { @@ -403,7 +417,9 @@ } } }, - "tags": ["Platform / Webhooks"] + "tags": [ + "Platform / Webhooks" + ] }, "get": { "operationId": "OAuthClientWebhooksController_getOAuthClientWebhooks", @@ -464,7 +480,9 @@ } } }, - "tags": ["Platform / Webhooks"] + "tags": [ + "Platform / Webhooks" + ] }, "delete": { "operationId": "OAuthClientWebhooksController_deleteAllOAuthClientWebhooks", @@ -500,7 +518,9 @@ } } }, - "tags": ["Platform / Webhooks"] + "tags": [ + "Platform / Webhooks" + ] } }, "/v2/oauth-clients/{clientId}/webhooks/{webhookId}": { @@ -548,7 +568,9 @@ } } }, - "tags": ["Platform / Webhooks"] + "tags": [ + "Platform / Webhooks" + ] }, "get": { "operationId": "OAuthClientWebhooksController_getOAuthClientWebhook", @@ -576,7 +598,9 @@ } } }, - "tags": ["Platform / Webhooks"] + "tags": [ + "Platform / Webhooks" + ] }, "delete": { "operationId": "OAuthClientWebhooksController_deleteOAuthClientWebhook", @@ -604,7 +628,9 @@ } } }, - "tags": ["Platform / Webhooks"] + "tags": [ + "Platform / Webhooks" + ] } }, "/v2/organizations/{orgId}/attributes": { @@ -667,7 +693,9 @@ } } }, - "tags": ["Orgs / Attributes"] + "tags": [ + "Orgs / Attributes" + ] }, "post": { "operationId": "OrganizationsAttributesController_createOrganizationAttribute", @@ -713,7 +741,9 @@ } } }, - "tags": ["Orgs / Attributes"] + "tags": [ + "Orgs / Attributes" + ] } }, "/v2/organizations/{orgId}/attributes/{attributeId}": { @@ -759,7 +789,9 @@ } } }, - "tags": ["Orgs / Attributes"] + "tags": [ + "Orgs / Attributes" + ] }, "patch": { "operationId": "OrganizationsAttributesController_updateOrganizationAttribute", @@ -813,7 +845,9 @@ } } }, - "tags": ["Orgs / Attributes"] + "tags": [ + "Orgs / Attributes" + ] }, "delete": { "operationId": "OrganizationsAttributesController_deleteOrganizationAttribute", @@ -857,7 +891,9 @@ } } }, - "tags": ["Orgs / Attributes"] + "tags": [ + "Orgs / Attributes" + ] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options": { @@ -913,7 +949,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] }, "get": { "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptions", @@ -957,7 +995,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options/{optionId}": { @@ -1011,7 +1051,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] }, "patch": { "operationId": "OrganizationsAttributesOptionsController_updateOrganizationAttributeOption", @@ -1073,7 +1115,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options/assigned": { @@ -1163,7 +1207,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] } }, "/v2/organizations/{orgId}/attributes/slugs/{attributeSlug}/options/assigned": { @@ -1253,7 +1299,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] } }, "/v2/organizations/{orgId}/attributes/options/{userId}": { @@ -1309,7 +1357,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] }, "get": { "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptionsForUser", @@ -1353,7 +1403,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] } }, "/v2/organizations/{orgId}/attributes/options/{userId}/{attributeOptionId}": { @@ -1407,7 +1459,9 @@ } } }, - "tags": ["Orgs / Attributes / Options"] + "tags": [ + "Orgs / Attributes / Options" + ] } }, "/v2/organizations/{orgId}/bookings": { @@ -1452,7 +1506,13 @@ "type": "array", "items": { "type": "string", - "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] + "enum": [ + "upcoming", + "recurring", + "past", + "cancelled", + "unconfirmed" + ] } } }, @@ -1593,7 +1653,10 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -1604,7 +1667,10 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -1615,7 +1681,10 @@ "description": "Sort results by their creation time (when booking was made) in ascending or descending order.", "example": "?sortCreated=asc OR ?sortCreated=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -1626,7 +1695,10 @@ "description": "Sort results by their updated time (for example when booking status changes) in ascending or descending order.", "example": "?sortUpdated=asc OR ?sortUpdated=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -1683,7 +1755,9 @@ } } }, - "tags": ["Orgs / Bookings"] + "tags": [ + "Orgs / Bookings" + ] } }, "/v2/organizations/{orgId}/delegation-credentials": { @@ -1749,7 +1823,9 @@ } } }, - "tags": ["Orgs / Delegation Credentials"] + "tags": [ + "Orgs / Delegation Credentials" + ] } }, "/v2/organizations/{orgId}/delegation-credentials/{credentialId}": { @@ -1823,7 +1899,9 @@ } } }, - "tags": ["Orgs / Delegation Credentials"] + "tags": [ + "Orgs / Delegation Credentials" + ] } }, "/v2/organizations/{orgId}/memberships": { @@ -1904,7 +1982,9 @@ } } }, - "tags": ["Orgs / Memberships"] + "tags": [ + "Orgs / Memberships" + ] }, "post": { "operationId": "OrganizationsMembershipsController_createMembership", @@ -1968,7 +2048,9 @@ } } }, - "tags": ["Orgs / Memberships"] + "tags": [ + "Orgs / Memberships" + ] } }, "/v2/organizations/{orgId}/memberships/{membershipId}": { @@ -2032,7 +2114,9 @@ } } }, - "tags": ["Orgs / Memberships"] + "tags": [ + "Orgs / Memberships" + ] }, "delete": { "operationId": "OrganizationsMembershipsController_deleteMembership", @@ -2094,7 +2178,9 @@ } } }, - "tags": ["Orgs / Memberships"] + "tags": [ + "Orgs / Memberships" + ] }, "patch": { "operationId": "OrganizationsMembershipsController_updateMembership", @@ -2166,7 +2252,9 @@ } } }, - "tags": ["Orgs / Memberships"] + "tags": [ + "Orgs / Memberships" + ] } }, "/v2/organizations/{orgId}/routing-forms": { @@ -2215,7 +2303,10 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -2225,7 +2316,10 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -2304,7 +2398,9 @@ } } }, - "tags": ["Orgs / Routing forms"] + "tags": [ + "Orgs / Routing forms" + ] } }, "/v2/organizations/{orgId}/routing-forms/{routingFormId}/responses": { @@ -2361,7 +2457,10 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -2371,7 +2470,10 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -2437,7 +2539,9 @@ } } }, - "tags": ["Orgs / Routing forms"] + "tags": [ + "Orgs / Routing forms" + ] }, "post": { "operationId": "OrganizationsRoutingFormsResponsesController_createRoutingFormResponse", @@ -2515,7 +2619,10 @@ "description": "Format of slot times in response. Use 'range' to get start and end times.", "example": "range", "schema": { - "enum": ["range", "time"], + "enum": [ + "range", + "time" + ], "type": "string" } }, @@ -2552,7 +2659,9 @@ } } }, - "tags": ["Orgs / Routing forms"] + "tags": [ + "Orgs / Routing forms" + ] } }, "/v2/organizations/{orgId}/routing-forms/{routingFormId}/responses/{responseId}": { @@ -2616,7 +2725,9 @@ } } }, - "tags": ["Orgs / Routing forms"] + "tags": [ + "Orgs / Routing forms" + ] } }, "/v2/organizations/{orgId}/schedules": { @@ -2697,7 +2808,9 @@ } } }, - "tags": ["Orgs / Schedules"] + "tags": [ + "Orgs / Schedules" + ] } }, "/v2/organizations/{orgId}/teams": { @@ -2778,7 +2891,9 @@ } } }, - "tags": ["Orgs / Teams"] + "tags": [ + "Orgs / Teams" + ] }, "post": { "operationId": "OrganizationsTeamsController_createTeam", @@ -2842,7 +2957,9 @@ } } }, - "tags": ["Orgs / Teams"] + "tags": [ + "Orgs / Teams" + ] } }, "/v2/organizations/{orgId}/teams/me": { @@ -2923,7 +3040,9 @@ } } }, - "tags": ["Orgs / Teams"] + "tags": [ + "Orgs / Teams" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}": { @@ -2971,7 +3090,9 @@ } } }, - "tags": ["Orgs / Teams"] + "tags": [ + "Orgs / Teams" + ] }, "delete": { "operationId": "OrganizationsTeamsController_deleteTeam", @@ -3033,7 +3154,9 @@ } } }, - "tags": ["Orgs / Teams"] + "tags": [ + "Orgs / Teams" + ] }, "patch": { "operationId": "OrganizationsTeamsController_updateTeam", @@ -3105,7 +3228,9 @@ } } }, - "tags": ["Orgs / Teams"] + "tags": [ + "Orgs / Teams" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/bookings": { @@ -3150,7 +3275,13 @@ "type": "array", "items": { "type": "string", - "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] + "enum": [ + "upcoming", + "recurring", + "past", + "cancelled", + "unconfirmed" + ] } } }, @@ -3221,7 +3352,10 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -3232,7 +3366,10 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -3243,7 +3380,10 @@ "description": "Sort results by their creation time (when booking was made) in ascending or descending order.", "example": "?sortCreated=asc OR ?sortCreated=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -3299,7 +3439,9 @@ } } }, - "tags": ["Orgs / Teams / Bookings"] + "tags": [ + "Orgs / Teams / Bookings" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/bookings/{bookingUid}/references": { @@ -3373,7 +3515,9 @@ } } }, - "tags": ["Orgs / Teams / Bookings"] + "tags": [ + "Orgs / Teams / Bookings" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/connect": { @@ -3403,7 +3547,9 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["google-meet"], + "enum": [ + "google-meet" + ], "type": "string" } } @@ -3420,7 +3566,9 @@ } } }, - "tags": ["Orgs / Teams / Conferencing"] + "tags": [ + "Orgs / Teams / Conferencing" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/oauth/auth-url": { @@ -3458,7 +3606,10 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["zoom", "msteams"], + "enum": [ + "zoom", + "msteams" + ], "type": "string" } }, @@ -3491,7 +3642,9 @@ } } }, - "tags": ["Orgs / Teams / Conferencing"] + "tags": [ + "Orgs / Teams / Conferencing" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing": { @@ -3520,7 +3673,9 @@ } } }, - "tags": ["Orgs / Teams / Conferencing"] + "tags": [ + "Orgs / Teams / Conferencing" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/default": { @@ -3542,7 +3697,12 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["google-meet", "zoom", "msteams", "daily-video"], + "enum": [ + "google-meet", + "zoom", + "msteams", + "daily-video" + ], "type": "string" } } @@ -3559,7 +3719,9 @@ } } }, - "tags": ["Orgs / Teams / Conferencing"] + "tags": [ + "Orgs / Teams / Conferencing" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/default": { @@ -3581,7 +3743,12 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["google-meet", "zoom", "msteams", "daily-video"], + "enum": [ + "google-meet", + "zoom", + "msteams", + "daily-video" + ], "type": "string" } } @@ -3598,7 +3765,9 @@ } } }, - "tags": ["Orgs / Teams / Conferencing"] + "tags": [ + "Orgs / Teams / Conferencing" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/disconnect": { @@ -3620,7 +3789,11 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["google-meet", "zoom", "msteams"], + "enum": [ + "google-meet", + "zoom", + "msteams" + ], "type": "string" } } @@ -3637,7 +3810,9 @@ } } }, - "tags": ["Orgs / Teams / Conferencing"] + "tags": [ + "Orgs / Teams / Conferencing" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/oauth/callback": { @@ -3691,7 +3866,9 @@ "description": "" } }, - "tags": ["Orgs / Teams / Conferencing"] + "tags": [ + "Orgs / Teams / Conferencing" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types": { @@ -3765,7 +3942,9 @@ } } }, - "tags": ["Orgs / Teams / Event Types"] + "tags": [ + "Orgs / Teams / Event Types" + ] }, "get": { "operationId": "OrganizationsEventTypesController_getTeamEventTypes", @@ -3837,7 +4016,9 @@ } } }, - "tags": ["Orgs / Teams / Event Types"] + "tags": [ + "Orgs / Teams / Event Types" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types/{eventTypeId}": { @@ -3901,7 +4082,9 @@ } } }, - "tags": ["Orgs / Teams / Event Types"] + "tags": [ + "Orgs / Teams / Event Types" + ] }, "patch": { "operationId": "OrganizationsEventTypesController_updateTeamEventType", @@ -3973,7 +4156,9 @@ } } }, - "tags": ["Orgs / Teams / Event Types"] + "tags": [ + "Orgs / Teams / Event Types" + ] }, "delete": { "operationId": "OrganizationsEventTypesController_deleteTeamEventType", @@ -4035,7 +4220,9 @@ } } }, - "tags": ["Orgs / Teams / Event Types"] + "tags": [ + "Orgs / Teams / Event Types" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types/{eventTypeId}/create-phone-call": { @@ -4109,7 +4296,9 @@ } } }, - "tags": ["Orgs / Teams / Event Types"] + "tags": [ + "Orgs / Teams / Event Types" + ] } }, "/v2/organizations/{orgId}/teams/event-types": { @@ -4190,7 +4379,9 @@ } } }, - "tags": ["Orgs / Teams / Event Types"] + "tags": [ + "Orgs / Teams / Event Types" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/memberships": { @@ -4279,7 +4470,9 @@ } } }, - "tags": ["Orgs / Teams / Memberships"] + "tags": [ + "Orgs / Teams / Memberships" + ] }, "post": { "operationId": "OrganizationsTeamsMembershipsController_createOrgTeamMembership", @@ -4351,7 +4544,9 @@ } } }, - "tags": ["Orgs / Teams / Memberships"] + "tags": [ + "Orgs / Teams / Memberships" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/memberships/{membershipId}": { @@ -4423,7 +4618,9 @@ } } }, - "tags": ["Orgs / Teams / Memberships"] + "tags": [ + "Orgs / Teams / Memberships" + ] }, "delete": { "operationId": "OrganizationsTeamsMembershipsController_deleteOrgTeamMembership", @@ -4493,7 +4690,9 @@ } } }, - "tags": ["Orgs / Teams / Memberships"] + "tags": [ + "Orgs / Teams / Memberships" + ] }, "patch": { "operationId": "OrganizationsTeamsMembershipsController_updateOrgTeamMembership", @@ -4573,7 +4772,9 @@ } } }, - "tags": ["Orgs / Teams / Memberships"] + "tags": [ + "Orgs / Teams / Memberships" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms": { @@ -4630,7 +4831,10 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -4640,7 +4844,10 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -4706,7 +4913,9 @@ } } }, - "tags": ["Orgs / Teams / Routing forms"] + "tags": [ + "Orgs / Teams / Routing forms" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routingFormId}/responses": { @@ -4771,7 +4980,10 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -4781,7 +4993,10 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -4847,7 +5062,9 @@ } } }, - "tags": ["Orgs / Teams / Routing forms / Responses"] + "tags": [ + "Orgs / Teams / Routing forms / Responses" + ] }, "post": { "operationId": "OrganizationsTeamsRoutingFormsResponsesController_createRoutingFormResponse", @@ -4933,7 +5150,10 @@ "description": "Format of slot times in response. Use 'range' to get start and end times.", "example": "range", "schema": { - "enum": ["range", "time"], + "enum": [ + "range", + "time" + ], "type": "string" } }, @@ -4970,7 +5190,9 @@ } } }, - "tags": ["Orgs / Teams / Routing forms / Responses"] + "tags": [ + "Orgs / Teams / Routing forms / Responses" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routingFormId}/responses/{responseId}": { @@ -5034,7 +5256,9 @@ } } }, - "tags": ["Orgs / Teams / Routing forms / Responses"] + "tags": [ + "Orgs / Teams / Routing forms / Responses" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/connect": { @@ -5095,7 +5319,9 @@ } } }, - "tags": ["Orgs / Teams / Stripe"] + "tags": [ + "Orgs / Teams / Stripe" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/check": { @@ -5124,7 +5350,9 @@ } } }, - "tags": ["Orgs / Teams / Stripe"] + "tags": [ + "Orgs / Teams / Stripe" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/save": { @@ -5169,7 +5397,9 @@ } } }, - "tags": ["Orgs / Teams / Stripe"] + "tags": [ + "Orgs / Teams / Stripe" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/users/{userId}/schedules": { @@ -5225,7 +5455,9 @@ } } }, - "tags": ["Orgs / Teams / Users / Schedules"] + "tags": [ + "Orgs / Teams / Users / Schedules" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/workflows": { @@ -5314,7 +5546,9 @@ } } }, - "tags": ["Orgs / Teams / Workflows"] + "tags": [ + "Orgs / Teams / Workflows" + ] }, "post": { "operationId": "OrganizationTeamWorkflowsController_createWorkflow", @@ -5378,7 +5612,9 @@ } } }, - "tags": ["Orgs / Teams / Workflows"] + "tags": [ + "Orgs / Teams / Workflows" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/workflows/{workflowId}": { @@ -5442,7 +5678,9 @@ } } }, - "tags": ["Orgs / Teams / Workflows"] + "tags": [ + "Orgs / Teams / Workflows" + ] }, "patch": { "operationId": "OrganizationTeamWorkflowsController_updateWorkflow", @@ -5514,7 +5752,9 @@ } } }, - "tags": ["Orgs / Teams / Workflows"] + "tags": [ + "Orgs / Teams / Workflows" + ] }, "delete": { "operationId": "OrganizationTeamWorkflowsController_deleteWorkflow", @@ -5569,7 +5809,9 @@ "description": "" } }, - "tags": ["Orgs / Teams / Workflows"] + "tags": [ + "Orgs / Teams / Workflows" + ] } }, "/v2/organizations/{orgId}/users": { @@ -5668,7 +5910,11 @@ "example": "NONE", "schema": { "default": "AND", - "enum": ["OR", "AND", "NONE"], + "enum": [ + "OR", + "AND", + "NONE" + ], "type": "string" } }, @@ -5698,7 +5944,9 @@ } } }, - "tags": ["Orgs / Users"] + "tags": [ + "Orgs / Users" + ] }, "post": { "operationId": "OrganizationsUsersController_createOrganizationUser", @@ -5754,7 +6002,9 @@ } } }, - "tags": ["Orgs / Users"] + "tags": [ + "Orgs / Users" + ] } }, "/v2/organizations/{orgId}/users/{userId}": { @@ -5828,7 +6078,9 @@ } } }, - "tags": ["Orgs / Users"] + "tags": [ + "Orgs / Users" + ] }, "delete": { "operationId": "OrganizationsUsersController_deleteOrganizationUser", @@ -5890,7 +6142,9 @@ } } }, - "tags": ["Orgs / Users"] + "tags": [ + "Orgs / Users" + ] } }, "/v2/organizations/{orgId}/users/{userId}/bookings": { @@ -5951,7 +6205,13 @@ "type": "array", "items": { "type": "string", - "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] + "enum": [ + "upcoming", + "recurring", + "past", + "cancelled", + "unconfirmed" + ] } } }, @@ -6092,7 +6352,10 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -6103,7 +6366,10 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -6114,7 +6380,10 @@ "description": "Sort results by their creation time (when booking was made) in ascending or descending order.", "example": "?sortCreated=asc OR ?sortCreated=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -6125,7 +6394,10 @@ "description": "Sort results by their updated time (for example when booking status changes) in ascending or descending order.", "example": "?sortUpdated=asc OR ?sortUpdated=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -6157,7 +6429,9 @@ "description": "" } }, - "tags": ["Orgs / Users / Bookings"] + "tags": [ + "Orgs / Users / Bookings" + ] } }, "/v2/organizations/{orgId}/users/{userId}/ooo": { @@ -6232,7 +6506,10 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -6243,7 +6520,10 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } } @@ -6253,7 +6533,9 @@ "description": "" } }, - "tags": ["Orgs / Users / OOO"] + "tags": [ + "Orgs / Users / OOO" + ] }, "post": { "operationId": "OrganizationsUsersOOOController_createOrganizationUserOOO", @@ -6310,7 +6592,9 @@ "description": "" } }, - "tags": ["Orgs / Users / OOO"] + "tags": [ + "Orgs / Users / OOO" + ] } }, "/v2/organizations/{orgId}/users/{userId}/ooo/{oooId}": { @@ -6377,7 +6661,9 @@ "description": "" } }, - "tags": ["Orgs / Users / OOO"] + "tags": [ + "Orgs / Users / OOO" + ] }, "delete": { "operationId": "OrganizationsUsersOOOController_deleteOrganizationUserOOO", @@ -6424,7 +6710,9 @@ "description": "" } }, - "tags": ["Orgs / Users / OOO"] + "tags": [ + "Orgs / Users / OOO" + ] } }, "/v2/organizations/{orgId}/ooo": { @@ -6499,7 +6787,10 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -6510,7 +6801,10 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -6530,7 +6824,9 @@ "description": "" } }, - "tags": ["Orgs / Users / OOO"] + "tags": [ + "Orgs / Users / OOO" + ] } }, "/v2/organizations/{orgId}/users/{userId}/schedules": { @@ -6596,7 +6892,9 @@ } } }, - "tags": ["Orgs / Users / Schedules"] + "tags": [ + "Orgs / Users / Schedules" + ] }, "get": { "operationId": "OrganizationsSchedulesController_getUserSchedules", @@ -6650,7 +6948,9 @@ } } }, - "tags": ["Orgs / Users / Schedules"] + "tags": [ + "Orgs / Users / Schedules" + ] } }, "/v2/organizations/{orgId}/users/{userId}/schedules/{scheduleId}": { @@ -6714,7 +7014,9 @@ } } }, - "tags": ["Orgs / Users / Schedules"] + "tags": [ + "Orgs / Users / Schedules" + ] }, "patch": { "operationId": "OrganizationsSchedulesController_updateUserSchedule", @@ -6786,7 +7088,9 @@ } } }, - "tags": ["Orgs / Users / Schedules"] + "tags": [ + "Orgs / Users / Schedules" + ] }, "delete": { "operationId": "OrganizationsSchedulesController_deleteUserSchedule", @@ -6848,7 +7152,9 @@ } } }, - "tags": ["Orgs / Users / Schedules"] + "tags": [ + "Orgs / Users / Schedules" + ] } }, "/v2/organizations/{orgId}/webhooks": { @@ -6929,7 +7235,9 @@ } } }, - "tags": ["Orgs / Webhooks"] + "tags": [ + "Orgs / Webhooks" + ] }, "post": { "operationId": "OrganizationsWebhooksController_createOrganizationWebhook", @@ -6993,7 +7301,9 @@ } } }, - "tags": ["Orgs / Webhooks"] + "tags": [ + "Orgs / Webhooks" + ] } }, "/v2/organizations/{orgId}/webhooks/{webhookId}": { @@ -7049,7 +7359,9 @@ } } }, - "tags": ["Orgs / Webhooks"] + "tags": [ + "Orgs / Webhooks" + ] }, "delete": { "operationId": "OrganizationsWebhooksController_deleteWebhook", @@ -7103,7 +7415,9 @@ } } }, - "tags": ["Orgs / Webhooks"] + "tags": [ + "Orgs / Webhooks" + ] }, "patch": { "operationId": "OrganizationsWebhooksController_updateOrgWebhook", @@ -7167,7 +7481,9 @@ } } }, - "tags": ["Orgs / Webhooks"] + "tags": [ + "Orgs / Webhooks" + ] } }, "/v2/api-keys/refresh": { @@ -7208,7 +7524,9 @@ } } }, - "tags": ["Api Keys"] + "tags": [ + "Api Keys" + ] } }, "/v2/bookings": { @@ -7261,7 +7579,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] }, "get": { "operationId": "BookingsController_2024_08_13_getBookings", @@ -7287,7 +7607,13 @@ "type": "array", "items": { "type": "string", - "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] + "enum": [ + "upcoming", + "recurring", + "past", + "cancelled", + "unconfirmed" + ] } } }, @@ -7428,7 +7754,10 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -7439,7 +7768,10 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -7450,7 +7782,10 @@ "description": "Sort results by their creation time (when booking was made) in ascending or descending order.", "example": "?sortCreated=asc OR ?sortCreated=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -7461,7 +7796,10 @@ "description": "Sort results by their updated time (for example when booking status changes) in ascending or descending order.", "example": "?sortUpdated=asc OR ?sortUpdated=desc", "schema": { - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "type": "string" } }, @@ -7509,7 +7847,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}": { @@ -7549,7 +7889,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/recordings": { @@ -7589,7 +7931,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/transcripts": { @@ -7629,7 +7973,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/reschedule": { @@ -7687,7 +8033,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/cancel": { @@ -7745,7 +8093,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/mark-absent": { @@ -7804,7 +8154,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/reassign": { @@ -7853,7 +8205,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/reassign/{userId}": { @@ -7920,7 +8274,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/confirm": { @@ -7969,7 +8325,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/decline": { @@ -8028,7 +8386,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/calendar-links": { @@ -8077,7 +8437,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/bookings/{bookingUid}/references": { @@ -8143,7 +8505,9 @@ } } }, - "tags": ["Bookings"] + "tags": [ + "Bookings" + ] } }, "/v2/calendars/{calendar}/event/{eventUid}": { @@ -8157,7 +8521,9 @@ "required": true, "in": "path", "schema": { - "enum": ["google"], + "enum": [ + "google" + ], "type": "string" } }, @@ -8192,7 +8558,9 @@ } } }, - "tags": ["Cal Unified Calendars"] + "tags": [ + "Cal Unified Calendars" + ] } }, "/v2/calendars/ics-feed/save": { @@ -8232,7 +8600,9 @@ } } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/calendars/ics-feed/check": { @@ -8262,7 +8632,9 @@ } } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/calendars/busy-times": { @@ -8339,7 +8711,9 @@ } } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/calendars": { @@ -8369,7 +8743,9 @@ } } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/calendars/{calendar}/connect": { @@ -8391,7 +8767,10 @@ "required": true, "in": "path", "schema": { - "enum": ["office365", "google"], + "enum": [ + "office365", + "google" + ], "type": "string" } }, @@ -8425,7 +8804,9 @@ } } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/calendars/{calendar}/save": { @@ -8454,7 +8835,10 @@ "required": true, "in": "path", "schema": { - "enum": ["office365", "google"], + "enum": [ + "office365", + "google" + ], "type": "string" } } @@ -8464,7 +8848,9 @@ "description": "" } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/calendars/{calendar}/credentials": { @@ -8477,7 +8863,9 @@ "required": true, "in": "path", "schema": { - "enum": ["apple"], + "enum": [ + "apple" + ], "type": "string" } }, @@ -8506,7 +8894,9 @@ "description": "" } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/calendars/{calendar}/check": { @@ -8519,7 +8909,11 @@ "required": true, "in": "path", "schema": { - "enum": ["apple", "google", "office365"], + "enum": [ + "apple", + "google", + "office365" + ], "type": "string" } }, @@ -8545,7 +8939,9 @@ } } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/calendars/{calendar}/disconnect": { @@ -8558,7 +8954,11 @@ "required": true, "in": "path", "schema": { - "enum": ["apple", "google", "office365"], + "enum": [ + "apple", + "google", + "office365" + ], "type": "string" } }, @@ -8594,7 +8994,9 @@ } } }, - "tags": ["Calendars"] + "tags": [ + "Calendars" + ] } }, "/v2/conferencing/{app}/connect": { @@ -8608,7 +9010,9 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["google-meet"], + "enum": [ + "google-meet" + ], "type": "string" } }, @@ -8634,7 +9038,9 @@ } } }, - "tags": ["Conferencing"] + "tags": [ + "Conferencing" + ] } }, "/v2/conferencing/{app}/oauth/auth-url": { @@ -8657,7 +9063,10 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["zoom", "msteams"], + "enum": [ + "zoom", + "msteams" + ], "type": "string" } }, @@ -8690,7 +9099,9 @@ } } }, - "tags": ["Conferencing"] + "tags": [ + "Conferencing" + ] } }, "/v2/conferencing/{app}/oauth/callback": { @@ -8712,7 +9123,10 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["zoom", "msteams"], + "enum": [ + "zoom", + "msteams" + ], "type": "string" } }, @@ -8730,7 +9144,9 @@ "description": "" } }, - "tags": ["Conferencing"] + "tags": [ + "Conferencing" + ] } }, "/v2/conferencing": { @@ -8760,7 +9176,9 @@ } } }, - "tags": ["Conferencing"] + "tags": [ + "Conferencing" + ] } }, "/v2/conferencing/{app}/default": { @@ -8774,7 +9192,12 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["google-meet", "zoom", "msteams", "daily-video"], + "enum": [ + "google-meet", + "zoom", + "msteams", + "daily-video" + ], "type": "string" } }, @@ -8800,7 +9223,9 @@ } } }, - "tags": ["Conferencing"] + "tags": [ + "Conferencing" + ] } }, "/v2/conferencing/default": { @@ -8830,7 +9255,9 @@ } } }, - "tags": ["Conferencing"] + "tags": [ + "Conferencing" + ] } }, "/v2/conferencing/{app}/disconnect": { @@ -8844,7 +9271,11 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": ["google-meet", "zoom", "msteams"], + "enum": [ + "google-meet", + "zoom", + "msteams" + ], "type": "string" } }, @@ -8870,7 +9301,9 @@ } } }, - "tags": ["Conferencing"] + "tags": [ + "Conferencing" + ] } }, "/v2/destination-calendars": { @@ -8910,7 +9343,9 @@ } } }, - "tags": ["Destination Calendars"] + "tags": [ + "Destination Calendars" + ] } }, "/v2/event-types": { @@ -8960,7 +9395,9 @@ } } }, - "tags": ["Event Types"] + "tags": [ + "Event Types" + ] }, "get": { "operationId": "EventTypesController_2024_06_14_getEventTypes", @@ -9034,7 +9471,9 @@ } } }, - "tags": ["Event Types"] + "tags": [ + "Event Types" + ] } }, "/v2/event-types/{eventTypeId}": { @@ -9082,7 +9521,9 @@ } } }, - "tags": ["Event Types"] + "tags": [ + "Event Types" + ] }, "patch": { "operationId": "EventTypesController_2024_06_14_updateEventType", @@ -9138,7 +9579,9 @@ } } }, - "tags": ["Event Types"] + "tags": [ + "Event Types" + ] }, "delete": { "operationId": "EventTypesController_2024_06_14_deleteEventType", @@ -9184,7 +9627,9 @@ } } }, - "tags": ["Event Types"] + "tags": [ + "Event Types" + ] } }, "/v2/event-types/{eventTypeId}/webhooks": { @@ -9232,7 +9677,9 @@ } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types / Webhooks" + ] }, "get": { "operationId": "EventTypeWebhooksController_getEventTypeWebhooks", @@ -9293,7 +9740,9 @@ } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types / Webhooks" + ] }, "delete": { "operationId": "EventTypeWebhooksController_deleteAllEventTypeWebhooks", @@ -9329,7 +9778,9 @@ } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types / Webhooks" + ] } }, "/v2/event-types/{eventTypeId}/webhooks/{webhookId}": { @@ -9377,7 +9828,9 @@ } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types / Webhooks" + ] }, "get": { "operationId": "EventTypeWebhooksController_getEventTypeWebhook", @@ -9405,7 +9858,9 @@ } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types / Webhooks" + ] }, "delete": { "operationId": "EventTypeWebhooksController_deleteEventTypeWebhook", @@ -9433,28 +9888,222 @@ } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types / Webhooks" + ] } }, - "/v2/organizations/{orgId}/organizations": { + "/v2/event-types/{eventTypeId}/private-links": { "post": { - "operationId": "OrganizationsOrganizationsController_createOrganization", - "summary": "Create an organization within an organization", - "description": "Requires the user to have at least the 'ORG_ADMIN' role within the organization. Additionally, for platform, the plan must be 'SCALE' or higher to access this endpoint.", + "operationId": "EventTypesPrivateLinksController_createPrivateLink", + "summary": "Create a private link for an event type", "parameters": [ { - "name": "x-cal-secret-key", - "in": "header", - "description": "For platform customers - OAuth client secret key", - "required": false, + "name": "eventTypeId", + "required": true, + "in": "path", "schema": { - "type": "string" + "type": "number" } }, { - "name": "x-cal-client-id", + "name": "Authorization", "in": "header", - "description": "For platform customers - OAuth client ID", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePrivateLinkInput" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePrivateLinkOutput" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] + }, + "get": { + "operationId": "EventTypesPrivateLinksController_getPrivateLinks", + "summary": "Get all private links for an event type", + "parameters": [ + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetPrivateLinksOutput" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] + } + }, + "/v2/event-types/{eventTypeId}/private-links/{linkId}": { + "patch": { + "operationId": "EventTypesPrivateLinksController_updatePrivateLink", + "summary": "Update a private link for an event type", + "parameters": [ + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "linkId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePrivateLinkBody" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePrivateLinkOutput" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] + }, + "delete": { + "operationId": "EventTypesPrivateLinksController_deletePrivateLink", + "summary": "Delete a private link for an event type", + "parameters": [ + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "linkId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeletePrivateLinkOutput" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] + } + }, + "/v2/organizations/{orgId}/organizations": { + "post": { + "operationId": "OrganizationsOrganizationsController_createOrganization", + "summary": "Create an organization within an organization", + "description": "Requires the user to have at least the 'ORG_ADMIN' role within the organization. Additionally, for platform, the plan must be 'SCALE' or higher to access this endpoint.", + "parameters": [ + { + "name": "x-cal-secret-key", + "in": "header", + "description": "For platform customers - OAuth client secret key", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "x-cal-client-id", + "in": "header", + "description": "For platform customers - OAuth client ID", "required": false, "schema": { "type": "string" @@ -9491,7 +10140,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "get": { "operationId": "OrganizationsOrganizationsController_getOrganizations", @@ -9592,7 +10243,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] } }, "/v2/organizations/{orgId}/organizations/{managedOrganizationId}": { @@ -9640,7 +10293,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "patch": { "operationId": "OrganizationsOrganizationsController_updateOrganization", @@ -9704,7 +10359,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "delete": { "operationId": "OrganizationsOrganizationsController_deleteOrganization", @@ -9750,7 +10407,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] } }, "/v2/me": { @@ -9780,7 +10439,9 @@ } } }, - "tags": ["Me"] + "tags": [ + "Me" + ] }, "patch": { "operationId": "MeController_updateMe", @@ -9818,7 +10479,9 @@ } } }, - "tags": ["Me"] + "tags": [ + "Me" + ] } }, "/v2/oauth-clients": { @@ -9858,7 +10521,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "get": { "operationId": "OAuthClientsController_getOAuthClients", @@ -9886,7 +10551,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] } }, "/v2/oauth-clients/{clientId}": { @@ -9924,7 +10591,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "patch": { "operationId": "OAuthClientsController_updateOAuthClient", @@ -9970,7 +10639,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "delete": { "operationId": "OAuthClientsController_deleteOAuthClient", @@ -10006,7 +10677,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -10047,7 +10720,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -10088,7 +10763,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -10137,7 +10814,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -10186,7 +10865,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails": { @@ -10249,7 +10930,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones": { @@ -10312,7 +10995,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/{id}": { @@ -10358,7 +11043,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/{id}": { @@ -10404,7 +11091,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/routing-forms/{routingFormId}/calculate-slots": { @@ -10469,7 +11158,10 @@ "description": "Format of slot times in response. Use 'range' to get start and end times.", "example": "range", "schema": { - "enum": ["range", "time"], + "enum": [ + "range", + "time" + ], "type": "string" } }, @@ -10504,7 +11196,9 @@ } } }, - "tags": ["Routing forms"] + "tags": [ + "Routing forms" + ] } }, "/v2/schedules": { @@ -10555,7 +11249,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "get": { "operationId": "SchedulesController_2024_06_11_getSchedules", @@ -10594,7 +11290,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/schedules/default": { @@ -10635,7 +11333,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/schedules/{scheduleId}": { @@ -10683,7 +11383,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "patch": { "operationId": "SchedulesController_2024_06_11_updateSchedule", @@ -10739,7 +11441,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "delete": { "operationId": "SchedulesController_2024_06_11_deleteSchedule", @@ -10785,7 +11489,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/selected-calendars": { @@ -10825,7 +11531,9 @@ } } }, - "tags": ["Selected Calendars"] + "tags": [ + "Selected Calendars" + ] }, "delete": { "operationId": "SelectedCalendarsController_deleteSelectedCalendar", @@ -10885,7 +11593,9 @@ } } }, - "tags": ["Selected Calendars"] + "tags": [ + "Selected Calendars" + ] } }, "/v2/slots": { @@ -11088,7 +11798,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/slots/reservations": { @@ -11148,7 +11860,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/slots/reservations/{uid}": { @@ -11187,7 +11901,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] }, "patch": { "operationId": "SlotsController_2024_09_04_updateReservedSlot", @@ -11234,7 +11950,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] }, "delete": { "operationId": "SlotsController_2024_09_04_deleteReservedSlot", @@ -11274,7 +11992,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/stripe/connect": { @@ -11304,7 +12024,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/stripe/save": { @@ -11341,7 +12063,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/stripe/check": { @@ -11371,7 +12095,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/teams": { @@ -11411,7 +12137,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "get": { "operationId": "TeamsController_getTeams", @@ -11439,7 +12167,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] } }, "/v2/teams/{teamId}": { @@ -11477,7 +12207,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "patch": { "operationId": "TeamsController_updateTeam", @@ -11523,7 +12255,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "delete": { "operationId": "TeamsController_deleteTeam", @@ -11559,7 +12293,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] } }, "/v2/teams/{teamId}/event-types": { @@ -11607,7 +12343,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "get": { "operationId": "TeamsEventTypesController_getTeamEventTypes", @@ -11652,7 +12390,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}": { @@ -11698,7 +12438,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "patch": { "operationId": "TeamsEventTypesController_updateTeamEventType", @@ -11752,7 +12494,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "delete": { "operationId": "TeamsEventTypesController_deleteTeamEventType", @@ -11796,7 +12540,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}/create-phone-call": { @@ -11852,7 +12598,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/memberships": { @@ -11900,7 +12648,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "get": { "operationId": "TeamsMembershipsController_getTeamMemberships", @@ -11961,7 +12711,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] } }, "/v2/teams/{teamId}/memberships/{membershipId}": { @@ -12007,7 +12759,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "patch": { "operationId": "TeamsMembershipsController_updateTeamMembership", @@ -12061,7 +12815,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "delete": { "operationId": "TeamsMembershipsController_deleteTeamMembership", @@ -12105,7 +12861,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -12146,7 +12904,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -12187,7 +12947,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -12236,7 +12998,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -12285,7 +13049,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails": { @@ -12348,7 +13114,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones": { @@ -12411,7 +13179,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/{id}": { @@ -12457,7 +13227,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/{id}": { @@ -12503,7 +13275,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/verified-resources/emails/verification-code/request": { @@ -12544,7 +13318,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/verification-code/request": { @@ -12585,7 +13361,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails/verification-code/verify": { @@ -12626,7 +13404,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/verification-code/verify": { @@ -12667,7 +13447,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails": { @@ -12722,7 +13504,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones": { @@ -12777,7 +13561,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails/{id}": { @@ -12815,7 +13601,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/{id}": { @@ -12853,7 +13641,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/webhooks": { @@ -12893,7 +13683,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "get": { "operationId": "WebhooksController_getWebhooks", @@ -12947,7 +13739,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] } }, "/v2/webhooks/{webhookId}": { @@ -12995,7 +13789,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "get": { "operationId": "WebhooksController_getWebhook", @@ -13023,7 +13819,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "delete": { "operationId": "WebhooksController_deleteWebhook", @@ -13059,7 +13857,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] } } }, @@ -13202,7 +14002,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -13211,7 +14014,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateManagedUserInput": { "type": "object", @@ -13227,15 +14033,26 @@ }, "timeFormat": { "type": "number", - "enum": [12, 24], + "enum": [ + 12, + 24 + ], "example": 12, "description": "Must be a number 12 or 24" }, "weekStart": { "type": "string", "example": "Monday", - "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] - }, + "enum": [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" + ] + }, "timeZone": { "type": "string", "example": "America/New_York", @@ -13308,7 +14125,10 @@ } } }, - "required": ["email", "name"] + "required": [ + "email", + "name" + ] }, "CreateManagedUserData": { "type": "object", @@ -13331,7 +14151,13 @@ "type": "number" } }, - "required": ["accessToken", "refreshToken", "user", "accessTokenExpiresAt", "refreshTokenExpiresAt"] + "required": [ + "accessToken", + "refreshToken", + "user", + "accessTokenExpiresAt", + "refreshTokenExpiresAt" + ] }, "CreateManagedUserOutput": { "type": "object", @@ -13339,7 +14165,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/CreateManagedUserData" @@ -13348,7 +14177,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetManagedUserOutput": { "type": "object", @@ -13356,13 +14188,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ManagedUserOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateManagedUserInput": { "type": "object", @@ -13375,7 +14213,10 @@ }, "timeFormat": { "type": "number", - "enum": [12, 24], + "enum": [ + 12, + 24 + ], "example": 12, "description": "Must be 12 or 24" }, @@ -13384,7 +14225,15 @@ }, "weekStart": { "type": "string", - "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + "enum": [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" + ], "example": "Monday" }, "timeZone": { @@ -13476,7 +14325,12 @@ "type": "number" } }, - "required": ["accessToken", "refreshToken", "accessTokenExpiresAt", "refreshTokenExpiresAt"] + "required": [ + "accessToken", + "refreshToken", + "accessTokenExpiresAt", + "refreshTokenExpiresAt" + ] }, "KeysResponseDto": { "type": "object", @@ -13484,13 +14338,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/KeysDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOAuthClientInput": { "type": "object", @@ -13550,7 +14410,11 @@ "description": "If true and if managed user has calendar connected, calendar events will be created. Disable it if you manually create calendar events. Default to true." } }, - "required": ["name", "redirectUris", "permissions"] + "required": [ + "name", + "redirectUris", + "permissions" + ] }, "CreateOAuthClientOutput": { "type": "object", @@ -13564,14 +14428,20 @@ "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoib2F1dGgtY2xpZW50Iiwi" } }, - "required": ["clientId", "clientSecret"] + "required": [ + "clientId", + "clientSecret" + ] }, "CreateOAuthClientResponseDto": { "type": "object", "properties": { "status": { "type": "string", - "enum": ["success", "error"], + "enum": [ + "success", + "error" + ], "example": "success" }, "data": { @@ -13586,7 +14456,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "PlatformOAuthClientDto": { "type": "object", @@ -13621,14 +14494,19 @@ "PROFILE_WRITE" ] }, - "example": ["BOOKING_READ", "BOOKING_WRITE"] + "example": [ + "BOOKING_READ", + "BOOKING_WRITE" + ] }, "logo": { "type": "object", "example": "https://example.com/logo.png" }, "redirectUris": { - "example": ["https://example.com/callback"], + "example": [ + "https://example.com/callback" + ], "type": "array", "items": { "type": "string" @@ -13689,7 +14567,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -13698,7 +14579,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetOAuthClientResponseDto": { "type": "object", @@ -13706,13 +14590,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/PlatformOAuthClientDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateOAuthClientInput": { "type": "object", @@ -13759,7 +14649,9 @@ "description": "Managed user's refresh token." } }, - "required": ["refreshToken"] + "required": [ + "refreshToken" + ] }, "RefreshApiKeyInput": { "type": "object", @@ -13785,7 +14677,9 @@ "type": "string" } }, - "required": ["apiKey"] + "required": [ + "apiKey" + ] }, "RefreshApiKeyOutput": { "type": "object", @@ -13793,31 +14687,48 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ApiKeyOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "BookerLayouts_2024_06_14": { "type": "object", "properties": { "defaultLayout": { "type": "string", - "enum": ["month", "week", "column"] + "enum": [ + "month", + "week", + "column" + ] }, "enabledLayouts": { "type": "array", "description": "Array of valid layouts - month, week or column", "items": { "type": "string", - "enum": ["month", "week", "column"] + "enum": [ + "month", + "week", + "column" + ] } } }, - "required": ["defaultLayout", "enabledLayouts"] + "required": [ + "defaultLayout", + "enabledLayouts" + ] }, "EventTypeColor_2024_06_14": { "type": "object", @@ -13833,7 +14744,10 @@ "example": "#fafafa" } }, - "required": ["lightThemeHex", "darkThemeHex"] + "required": [ + "lightThemeHex", + "darkThemeHex" + ] }, "DestinationCalendar_2024_06_14": { "type": "object", @@ -13847,7 +14761,10 @@ "description": "The external ID of the destination calendar. Refer to the /api/v2/calendars endpoint to retrieve the external IDs of your connected calendars." } }, - "required": ["integration", "externalId"] + "required": [ + "integration", + "externalId" + ] }, "InputAddressLocation_2024_06_14": { "type": "object", @@ -13865,7 +14782,11 @@ "type": "boolean" } }, - "required": ["type", "address", "public"] + "required": [ + "type", + "address", + "public" + ] }, "InputLinkLocation_2024_06_14": { "type": "object", @@ -13883,7 +14804,11 @@ "type": "boolean" } }, - "required": ["type", "link", "public"] + "required": [ + "type", + "link", + "public" + ] }, "InputIntegrationLocation_2024_06_14": { "type": "object", @@ -13896,10 +14821,18 @@ "integration": { "type": "string", "example": "cal-video", - "enum": ["cal-video", "google-meet", "office365-video", "zoom"] + "enum": [ + "cal-video", + "google-meet", + "office365-video", + "zoom" + ] } }, - "required": ["type", "integration"] + "required": [ + "type", + "integration" + ] }, "InputPhoneLocation_2024_06_14": { "type": "object", @@ -13917,7 +14850,11 @@ "type": "boolean" } }, - "required": ["type", "phone", "public"] + "required": [ + "type", + "phone", + "public" + ] }, "PhoneFieldInput_2024_06_14": { "type": "object", @@ -13950,7 +14887,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "placeholder", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "placeholder", + "hidden" + ] }, "AddressFieldInput_2024_06_14": { "type": "object", @@ -13985,7 +14929,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "placeholder", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "placeholder", + "hidden" + ] }, "TextFieldInput_2024_06_14": { "type": "object", @@ -14020,7 +14971,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "placeholder", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "placeholder", + "hidden" + ] }, "NumberFieldInput_2024_06_14": { "type": "object", @@ -14055,7 +15013,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "placeholder", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "placeholder", + "hidden" + ] }, "TextAreaFieldInput_2024_06_14": { "type": "object", @@ -14090,7 +15055,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "placeholder", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "placeholder", + "hidden" + ] }, "SelectFieldInput_2024_06_14": { "type": "object", @@ -14117,7 +15089,10 @@ "example": "Select..." }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -14132,7 +15107,15 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "placeholder", "options", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "placeholder", + "options", + "hidden" + ] }, "MultiSelectFieldInput_2024_06_14": { "type": "object", @@ -14155,7 +15138,10 @@ "type": "boolean" }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -14170,7 +15156,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "options", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "options", + "hidden" + ] }, "MultiEmailFieldInput_2024_06_14": { "type": "object", @@ -14205,7 +15198,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "placeholder", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "placeholder", + "hidden" + ] }, "CheckboxGroupFieldInput_2024_06_14": { "type": "object", @@ -14228,7 +15228,10 @@ "type": "boolean" }, "options": { - "example": ["Checkbox 1", "Checkbox 2"], + "example": [ + "Checkbox 1", + "Checkbox 2" + ], "type": "array", "items": { "type": "string" @@ -14243,7 +15246,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "options", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "options", + "hidden" + ] }, "RadioGroupFieldInput_2024_06_14": { "type": "object", @@ -14266,7 +15276,10 @@ "type": "boolean" }, "options": { - "example": ["Radio 1", "Radio 2"], + "example": [ + "Radio 1", + "Radio 2" + ], "type": "array", "items": { "type": "string" @@ -14281,7 +15294,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "options", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "options", + "hidden" + ] }, "BooleanFieldInput_2024_06_14": { "type": "object", @@ -14312,7 +15332,13 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden" + ] }, "UrlFieldInput_2024_06_14": { "type": "object", @@ -14347,14 +15373,25 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": ["type", "slug", "label", "required", "placeholder", "hidden"] + "required": [ + "type", + "slug", + "label", + "required", + "placeholder", + "hidden" + ] }, "BusinessDaysWindow_2024_06_14": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["businessDays", "calendarDays", "range"], + "enum": [ + "businessDays", + "calendarDays", + "range" + ], "description": "Whether the window should be business days, calendar days or a range of dates" }, "value": { @@ -14368,14 +15405,21 @@ "description": "\n Determines the behavior of the booking window:\n - If **true**, the window is rolling. This means the number of available days will always be equal the specified 'value' \n and adjust dynamically as bookings are made. For example, if 'value' is 3 and availability is only on Mondays, \n a booker attempting to schedule on November 10 will see slots on November 11, 18, and 25. As one of these days \n becomes fully booked, a new day (e.g., December 2) will open up to ensure 3 available days are always visible.\n - If **false**, the window is fixed. This means the booking window only considers the next 'value' days from the\n moment someone is trying to book. For example, if 'value' is 3, availability is only on Mondays, and the current \n date is November 10, the booker will only see slots on November 11 because the window is restricted to the next \n 3 calendar days (November 10–12).\n " } }, - "required": ["type", "value"] + "required": [ + "type", + "value" + ] }, "CalendarDaysWindow_2024_06_14": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["businessDays", "calendarDays", "range"], + "enum": [ + "businessDays", + "calendarDays", + "range" + ], "description": "Whether the window should be business days, calendar days or a range of dates" }, "value": { @@ -14389,18 +15433,28 @@ "description": "\n Determines the behavior of the booking window:\n - If **true**, the window is rolling. This means the number of available days will always be equal the specified 'value' \n and adjust dynamically as bookings are made. For example, if 'value' is 3 and availability is only on Mondays, \n a booker attempting to schedule on November 10 will see slots on November 11, 18, and 25. As one of these days \n becomes fully booked, a new day (e.g., December 2) will open up to ensure 3 available days are always visible.\n - If **false**, the window is fixed. This means the booking window only considers the next 'value' days from the\n moment someone is trying to book. For example, if 'value' is 3, availability is only on Mondays, and the current \n date is November 10, the booker will only see slots on November 11 because the window is restricted to the next \n 3 calendar days (November 10–12).\n " } }, - "required": ["type", "value"] + "required": [ + "type", + "value" + ] }, "RangeWindow_2024_06_14": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["businessDays", "calendarDays", "range"], + "enum": [ + "businessDays", + "calendarDays", + "range" + ], "description": "Whether the window should be business days, calendar days or a range of dates" }, "value": { - "example": ["2030-09-05", "2030-09-09"], + "example": [ + "2030-09-05", + "2030-09-09" + ], "description": "Date range for when this event can be booked.", "type": "array", "items": { @@ -14408,7 +15462,10 @@ } } }, - "required": ["type", "value"] + "required": [ + "type", + "value" + ] }, "BaseBookingLimitsCount_2024_06_14": { "type": "object", @@ -14449,7 +15506,9 @@ "default": false } }, - "required": ["disabled"] + "required": [ + "disabled" + ] }, "BaseBookingLimitsDuration_2024_06_14": { "type": "object", @@ -14491,10 +15550,18 @@ }, "frequency": { "type": "string", - "enum": ["yearly", "monthly", "weekly"] + "enum": [ + "yearly", + "monthly", + "weekly" + ] } }, - "required": ["interval", "occurrences", "frequency"] + "required": [ + "interval", + "occurrences", + "frequency" + ] }, "NoticeThreshold_2024_06_14": { "type": "object", @@ -14510,7 +15577,10 @@ "example": 30 } }, - "required": ["unit", "count"] + "required": [ + "unit", + "count" + ] }, "BaseConfirmationPolicy_2024_06_14": { "type": "object", @@ -14518,7 +15588,10 @@ "type": { "type": "string", "description": "The policy that determines when confirmation is required", - "enum": ["always", "time"], + "enum": [ + "always", + "time" + ], "example": "always" }, "noticeThreshold": { @@ -14534,7 +15607,10 @@ "description": "Unconfirmed bookings still block calendar slots." } }, - "required": ["type", "blockUnconfirmedBookingsInBooker"] + "required": [ + "type", + "blockUnconfirmedBookingsInBooker" + ] }, "Seats_2024_06_14": { "type": "object", @@ -14555,7 +15631,11 @@ "example": true } }, - "required": ["seatsPerTimeSlot", "showAttendeeInfo", "showAvailabilityCount"] + "required": [ + "seatsPerTimeSlot", + "showAttendeeInfo", + "showAvailabilityCount" + ] }, "InputAttendeeAddressLocation_2024_06_14": { "type": "object", @@ -14566,7 +15646,9 @@ "description": "only allowed value for type is `attendeeAddress`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "InputAttendeePhoneLocation_2024_06_14": { "type": "object", @@ -14577,7 +15659,9 @@ "description": "only allowed value for type is `attendeePhone`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "InputAttendeeDefinedLocation_2024_06_14": { "type": "object", @@ -14588,7 +15672,9 @@ "description": "only allowed value for type is `attendeeDefined`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "NameDefaultFieldInput_2024_06_14": { "type": "object", @@ -14609,7 +15695,11 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&name=bob`, the name field will be prefilled with this value and disabled. In case of Booker atom need to pass 'name' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{name: 'bob'}}`. See guide https://cal.com/docs/platform/guides/booking-fields" } }, - "required": ["type", "label", "placeholder"] + "required": [ + "type", + "label", + "placeholder" + ] }, "EmailDefaultFieldInput_2024_06_14": { "type": "object", @@ -14638,7 +15728,11 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&email=bob@gmail.com`, the email field will be prefilled with this value and disabled. In case of Booker atom need to pass 'email' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{email: 'bob@gmail.com'}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": ["type", "label", "placeholder"] + "required": [ + "type", + "label", + "placeholder" + ] }, "TitleDefaultFieldInput_2024_06_14": { "type": "object", @@ -14666,7 +15760,9 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&title=journey`, the title field will be prefilled with this value and disabled. In case of Booker atom need to pass 'title' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{title: 'very important meeting'}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": ["slug"] + "required": [ + "slug" + ] }, "LocationDefaultFieldInput_2024_06_14": { "type": "object", @@ -14680,7 +15776,9 @@ "type": "string" } }, - "required": ["slug"] + "required": [ + "slug" + ] }, "NotesDefaultFieldInput_2024_06_14": { "type": "object", @@ -14708,7 +15806,9 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `¬es=journey`, the notes field will be prefilled with this value and disabled. In case of Booker atom need to pass 'notes' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{notes: 'bring notebook and paper'}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": ["slug"] + "required": [ + "slug" + ] }, "GuestsDefaultFieldInput_2024_06_14": { "type": "object", @@ -14736,7 +15836,9 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&guests=bob@cal.com`, the guests field will be prefilled with this value and disabled. In case of Booker atom need to pass 'guests' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{guests: ['bob@gmail.com', 'alice@gmail.com']}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": ["slug"] + "required": [ + "slug" + ] }, "RescheduleReasonDefaultFieldInput_2024_06_14": { "type": "object", @@ -14764,7 +15866,9 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&rescheduleReason=travel`, the rescheduleReason field will be prefilled with this value and disabled. In case of Booker atom need to pass 'rescheduleReason' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{rescheduleReason: 'bob'}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": ["slug"] + "required": [ + "slug" + ] }, "InputOrganizersDefaultApp_2024_06_14": { "type": "object", @@ -14775,7 +15879,9 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "CalVideoSettings": { "type": "object", @@ -14806,7 +15912,11 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [15, 30, 60], + "example": [ + 15, + 30, + 60 + ], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -15075,7 +16185,11 @@ } } }, - "required": ["lengthInMinutes", "title", "slug"] + "required": [ + "lengthInMinutes", + "title", + "slug" + ] }, "OutputAddressLocation_2024_06_14": { "type": "object", @@ -15104,7 +16218,11 @@ "type": "boolean" } }, - "required": ["type", "address", "public"] + "required": [ + "type", + "address", + "public" + ] }, "OutputLinkLocation_2024_06_14": { "type": "object", @@ -15132,7 +16250,11 @@ "type": "boolean" } }, - "required": ["type", "link", "public"] + "required": [ + "type", + "link", + "public" + ] }, "OutputIntegrationLocation_2024_06_14": { "type": "object", @@ -15198,7 +16320,10 @@ "description": "Credential ID associated with the integration" } }, - "required": ["type", "integration"] + "required": [ + "type", + "integration" + ] }, "OutputPhoneLocation_2024_06_14": { "type": "object", @@ -15226,7 +16351,11 @@ "type": "boolean" } }, - "required": ["type", "phone", "public"] + "required": [ + "type", + "phone", + "public" + ] }, "OutputOrganizersDefaultAppLocation_2024_06_14": { "type": "object", @@ -15249,7 +16378,9 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OutputUnknownLocation_2024_06_14": { "type": "object", @@ -15275,7 +16406,10 @@ "type": "string" } }, - "required": ["type", "location"] + "required": [ + "type", + "location" + ] }, "EmailDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15332,7 +16466,11 @@ "default": "email" } }, - "required": ["type", "isDefault", "slug"] + "required": [ + "type", + "isDefault", + "slug" + ] }, "NameDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15383,7 +16521,12 @@ "type": "boolean" } }, - "required": ["type", "isDefault", "slug", "required"] + "required": [ + "type", + "isDefault", + "slug", + "required" + ] }, "LocationDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15414,14 +16557,26 @@ "type": "string" } }, - "required": ["isDefault", "slug", "type", "required", "hidden"] + "required": [ + "isDefault", + "slug", + "type", + "required", + "hidden" + ] }, "RescheduleReasonDefaultFieldOutput_2024_06_14": { "type": "object", "properties": { "slug": { "type": "string", - "enum": ["title", "location", "notes", "guests", "rescheduleReason"], + "enum": [ + "title", + "location", + "notes", + "guests", + "rescheduleReason" + ], "example": "rescheduleReason", "description": "only allowed value for type is `rescheduleReason`", "default": "rescheduleReason" @@ -15454,14 +16609,24 @@ "default": "textarea" } }, - "required": ["slug", "isDefault", "type"] + "required": [ + "slug", + "isDefault", + "type" + ] }, "TitleDefaultFieldOutput_2024_06_14": { "type": "object", "properties": { "slug": { "type": "string", - "enum": ["title", "location", "notes", "guests", "rescheduleReason"], + "enum": [ + "title", + "location", + "notes", + "guests", + "rescheduleReason" + ], "example": "title", "description": "only allowed value for type is `title`", "default": "title" @@ -15494,14 +16659,24 @@ "default": "text" } }, - "required": ["slug", "isDefault", "type"] + "required": [ + "slug", + "isDefault", + "type" + ] }, "NotesDefaultFieldOutput_2024_06_14": { "type": "object", "properties": { "slug": { "type": "string", - "enum": ["title", "location", "notes", "guests", "rescheduleReason"], + "enum": [ + "title", + "location", + "notes", + "guests", + "rescheduleReason" + ], "example": "notes", "description": "only allowed value for type is `notes`", "default": "notes" @@ -15534,14 +16709,24 @@ "default": "textarea" } }, - "required": ["slug", "isDefault", "type"] - }, - "GuestsDefaultFieldOutput_2024_06_14": { + "required": [ + "slug", + "isDefault", + "type" + ] + }, + "GuestsDefaultFieldOutput_2024_06_14": { "type": "object", "properties": { "slug": { "type": "string", - "enum": ["title", "location", "notes", "guests", "rescheduleReason"], + "enum": [ + "title", + "location", + "notes", + "guests", + "rescheduleReason" + ], "example": "guests", "description": "only allowed value for type is `guests`", "default": "guests" @@ -15574,7 +16759,11 @@ "default": "multiemail" } }, - "required": ["slug", "isDefault", "type"] + "required": [ + "slug", + "isDefault", + "type" + ] }, "AddressFieldOutput_2024_06_14": { "type": "object", @@ -15631,7 +16820,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "BooleanFieldOutput_2024_06_14": { "type": "object", @@ -15684,7 +16880,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "CheckboxGroupFieldOutput_2024_06_14": { "type": "object", @@ -15723,7 +16926,10 @@ "type": "boolean" }, "options": { - "example": ["Checkbox 1", "Checkbox 2"], + "example": [ + "Checkbox 1", + "Checkbox 2" + ], "type": "array", "items": { "type": "string" @@ -15744,7 +16950,15 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "options", + "hidden", + "isDefault" + ] }, "MultiEmailFieldOutput_2024_06_14": { "type": "object", @@ -15801,7 +17015,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "MultiSelectFieldOutput_2024_06_14": { "type": "object", @@ -15840,7 +17061,10 @@ "type": "boolean" }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -15861,7 +17085,15 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "options", + "hidden", + "isDefault" + ] }, "UrlFieldOutput_2024_06_14": { "type": "object", @@ -15918,7 +17150,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "NumberFieldOutput_2024_06_14": { "type": "object", @@ -15975,7 +17214,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "PhoneFieldOutput_2024_06_14": { "type": "object", @@ -16030,7 +17276,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "RadioGroupFieldOutput_2024_06_14": { "type": "object", @@ -16069,7 +17322,10 @@ "type": "boolean" }, "options": { - "example": ["Radio 1", "Radio 2"], + "example": [ + "Radio 1", + "Radio 2" + ], "type": "array", "items": { "type": "string" @@ -16090,7 +17346,15 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "options", + "hidden", + "isDefault" + ] }, "SelectFieldOutput_2024_06_14": { "type": "object", @@ -16133,7 +17397,10 @@ "example": "Select..." }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -16154,7 +17421,15 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "options", + "hidden", + "isDefault" + ] }, "TextAreaFieldOutput_2024_06_14": { "type": "object", @@ -16211,7 +17486,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "TextFieldOutput_2024_06_14": { "type": "object", @@ -16268,7 +17550,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "EventTypeOutput_2024_06_14": { "type": "object", @@ -16282,7 +17571,11 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [15, 30, 60], + "example": [ + 15, + 30, + 60 + ], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -16562,21 +17855,30 @@ "properties": { "status": { "type": "string", - "enum": ["success", "error"], + "enum": [ + "success", + "error" + ], "example": "success" }, "data": { "$ref": "#/components/schemas/EventTypeOutput_2024_06_14" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetEventTypeOutput_2024_06_14": { "type": "object", "properties": { "status": { "type": "string", - "enum": ["success", "error"], + "enum": [ + "success", + "error" + ], "example": "success" }, "data": { @@ -16588,14 +17890,20 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetEventTypesOutput_2024_06_14": { "type": "object", "properties": { "status": { "type": "string", - "enum": ["success", "error"], + "enum": [ + "success", + "error" + ], "example": "success" }, "data": { @@ -16605,7 +17913,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateEventTypeInput_2024_06_14": { "type": "object", @@ -16615,7 +17926,11 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [15, 30, 60], + "example": [ + 15, + 30, + 60 + ], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -16887,14 +18202,20 @@ "properties": { "status": { "type": "string", - "enum": ["success", "error"], + "enum": [ + "success", + "error" + ], "example": "success" }, "data": { "$ref": "#/components/schemas/EventTypeOutput_2024_06_14" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteData_2024_06_14": { "type": "object", @@ -16915,21 +18236,32 @@ "type": "string" } }, - "required": ["id", "lengthInMinutes", "title", "slug"] + "required": [ + "id", + "lengthInMinutes", + "title", + "slug" + ] }, "DeleteEventTypeOutput_2024_06_14": { "type": "object", "properties": { "status": { "type": "string", - "enum": ["success", "error"], + "enum": [ + "success", + "error" + ], "example": "success" }, "data": { "$ref": "#/components/schemas/DeleteData_2024_06_14" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "SelectedCalendarsInputDto": { "type": "object", @@ -16947,7 +18279,11 @@ "type": "string" } }, - "required": ["integration", "externalId", "credentialId"] + "required": [ + "integration", + "externalId", + "credentialId" + ] }, "SelectedCalendarOutputDto": { "type": "object", @@ -16966,7 +18302,12 @@ "nullable": true } }, - "required": ["userId", "integration", "externalId", "credentialId"] + "required": [ + "userId", + "integration", + "externalId", + "credentialId" + ] }, "SelectedCalendarOutputResponseDto": { "type": "object", @@ -16974,13 +18315,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/SelectedCalendarOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgTeamOutputDto": { "type": "object", @@ -17056,7 +18403,11 @@ "default": "Sunday" } }, - "required": ["id", "name", "isOrganization"] + "required": [ + "id", + "name", + "isOrganization" + ] }, "OrgTeamsOutputResponseDto": { "type": "object", @@ -17064,7 +18415,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17073,7 +18427,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgMeTeamsOutputResponseDto": { "type": "object", @@ -17081,7 +18438,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17090,7 +18450,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgTeamOutputResponseDto": { "type": "object", @@ -17098,13 +18461,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OrgTeamOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateOrgTeamDto": { "type": "object", @@ -17269,19 +18638,40 @@ "description": "If you are a platform customer, don't pass 'false', because then team creator won't be able to create team event types." } }, - "required": ["name"] + "required": [ + "name" + ] }, "ScheduleAvailabilityInput_2024_06_11": { "type": "object", "properties": { "days": { "type": "array", - "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], - "example": ["Monday", "Tuesday"], + "enum": [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" + ], + "example": [ + "Monday", + "Tuesday" + ], "description": "Array of days when schedule is active.", "items": { "type": "string", - "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] + "enum": [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" + ] } }, "startTime": { @@ -17297,7 +18687,11 @@ "description": "endTime must be a valid time in format HH:MM e.g. 15:00" } }, - "required": ["days", "startTime", "endTime"] + "required": [ + "days", + "startTime", + "endTime" + ] }, "ScheduleOverrideInput_2024_06_11": { "type": "object", @@ -17319,7 +18713,11 @@ "description": "endTime must be a valid time in format HH:MM e.g. 13:00" } }, - "required": ["date", "startTime", "endTime"] + "required": [ + "date", + "startTime", + "endTime" + ] }, "ScheduleOutput_2024_06_11": { "type": "object", @@ -17343,12 +18741,18 @@ "availability": { "example": [ { - "days": ["Monday", "Tuesday"], + "days": [ + "Monday", + "Tuesday" + ], "startTime": "17:00", "endTime": "19:00" }, { - "days": ["Wednesday", "Thursday"], + "days": [ + "Wednesday", + "Thursday" + ], "startTime": "16:00", "endTime": "20:00" } @@ -17376,7 +18780,15 @@ } } }, - "required": ["id", "ownerId", "name", "timeZone", "availability", "isDefault", "overrides"] + "required": [ + "id", + "ownerId", + "name", + "timeZone", + "availability", + "isDefault", + "overrides" + ] }, "GetSchedulesOutput_2024_06_11": { "type": "object", @@ -17384,7 +18796,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17396,7 +18811,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateScheduleInput_2024_06_11": { "type": "object", @@ -17414,12 +18832,18 @@ "description": "Each object contains days and times when the user is available. If not passed, the default availability is Monday to Friday from 09:00 to 17:00.", "example": [ { - "days": ["Monday", "Tuesday"], + "days": [ + "Monday", + "Tuesday" + ], "startTime": "17:00", "endTime": "19:00" }, { - "days": ["Wednesday", "Thursday"], + "days": [ + "Wednesday", + "Thursday" + ], "startTime": "16:00", "endTime": "20:00" } @@ -17449,7 +18873,11 @@ } } }, - "required": ["name", "timeZone", "isDefault"] + "required": [ + "name", + "timeZone", + "isDefault" + ] }, "CreateScheduleOutput_2024_06_11": { "type": "object", @@ -17457,13 +18885,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetScheduleOutput_2024_06_11": { "type": "object", @@ -17471,7 +18905,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -17485,7 +18922,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateScheduleInput_2024_06_11": { "type": "object", @@ -17501,7 +18941,10 @@ "availability": { "example": [ { - "days": ["Monday", "Tuesday"], + "days": [ + "Monday", + "Tuesday" + ], "startTime": "09:00", "endTime": "10:00" } @@ -17536,7 +18979,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" @@ -17545,7 +18991,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteScheduleOutput_2024_06_11": { "type": "object", @@ -17553,10 +19002,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "ProfileOutput": { "type": "object", @@ -17583,7 +19037,11 @@ "example": "john_doe" } }, - "required": ["id", "organizationId", "userId"] + "required": [ + "id", + "organizationId", + "userId" + ] }, "GetOrgUsersWithProfileOutput": { "type": "object", @@ -17725,7 +19183,15 @@ ] } }, - "required": ["id", "email", "timeZone", "weekStart", "hideBranding", "createdDate", "profile"] + "required": [ + "id", + "email", + "timeZone", + "weekStart", + "hideBranding", + "createdDate", + "profile" + ] }, "GetOrganizationUsersResponseDTO": { "type": "object", @@ -17733,7 +19199,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17742,7 +19211,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOrganizationUserInput": { "type": "object", @@ -17832,14 +19304,20 @@ "organizationRole": { "type": "string", "default": "MEMBER", - "enum": ["MEMBER", "ADMIN", "OWNER"] + "enum": [ + "MEMBER", + "ADMIN", + "OWNER" + ] }, "autoAccept": { "type": "boolean", "default": true } }, - "required": ["email"] + "required": [ + "email" + ] }, "GetOrganizationUserOutput": { "type": "object", @@ -17847,13 +19325,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/GetOrgUsersWithProfileOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateOrganizationUserInput": { "type": "object", @@ -17869,7 +19353,10 @@ "type": "string" } }, - "required": ["id", "name"] + "required": [ + "id", + "name" + ] }, "TextAttribute": { "type": "object", @@ -17890,7 +19377,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "NumberAttribute": { "type": "object", @@ -17911,7 +19404,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "SingleSelectAttribute": { "type": "object", @@ -17932,7 +19431,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "MultiSelectAttributeOption": { "type": "object", @@ -17944,7 +19449,10 @@ "type": "string" } }, - "required": ["optionId", "option"] + "required": [ + "optionId", + "option" + ] }, "MultiSelectAttribute": { "type": "object", @@ -17965,7 +19473,12 @@ } } }, - "required": ["id", "name", "type", "options"] + "required": [ + "id", + "name", + "type", + "options" + ] }, "MembershipUserOutputDto": { "type": "object", @@ -17992,7 +19505,9 @@ } } }, - "required": ["email"] + "required": [ + "email" + ] }, "OrganizationMembershipOutput": { "type": "object", @@ -18011,7 +19526,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -18039,7 +19558,15 @@ } } }, - "required": ["id", "userId", "teamId", "accepted", "role", "user", "attributes"] + "required": [ + "id", + "userId", + "teamId", + "accepted", + "role", + "user", + "attributes" + ] }, "GetAllOrgMemberships": { "type": "object", @@ -18047,13 +19574,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOrgMembershipDto": { "type": "object", @@ -18068,7 +19601,11 @@ "role": { "type": "string", "default": "MEMBER", - "enum": ["MEMBER", "OWNER", "ADMIN"], + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ], "description": "If you are platform customer then managed users should only have MEMBER role." }, "disableImpersonation": { @@ -18076,7 +19613,10 @@ "default": false } }, - "required": ["userId", "role"] + "required": [ + "userId", + "role" + ] }, "CreateOrgMembershipOutput": { "type": "object", @@ -18084,13 +19624,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetOrgMembership": { "type": "object", @@ -18098,13 +19644,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteOrgMembership": { "type": "object", @@ -18112,13 +19664,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateOrgMembershipDto": { "type": "object", @@ -18128,7 +19686,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -18141,13 +19703,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "Host": { "type": "object", @@ -18162,10 +19730,18 @@ }, "priority": { "type": "string", - "enum": ["lowest", "low", "medium", "high", "highest"] + "enum": [ + "lowest", + "low", + "medium", + "high", + "highest" + ] } }, - "required": ["userId"] + "required": [ + "userId" + ] }, "CreateTeamEventTypeInput_2024_06_14": { "type": "object", @@ -18175,7 +19751,11 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [15, 30, 60], + "example": [ + 15, + 30, + 60 + ], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -18416,7 +19996,11 @@ }, "schedulingType": { "type": "string", - "enum": ["collective", "roundRobin", "managed"], + "enum": [ + "collective", + "roundRobin", + "managed" + ], "example": "collective", "description": "The scheduling type for the team event - collective, roundRobin or managed." }, @@ -18464,7 +20048,12 @@ } } }, - "required": ["lengthInMinutes", "title", "slug", "schedulingType"] + "required": [ + "lengthInMinutes", + "title", + "slug", + "schedulingType" + ] }, "CreateTeamEventTypeOutput": { "type": "object", @@ -18472,7 +20061,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -18488,7 +20080,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamEventTypeResponseHost": { "type": "object", @@ -18505,7 +20100,13 @@ "priority": { "type": "string", "default": "medium", - "enum": ["lowest", "low", "medium", "high", "highest"] + "enum": [ + "lowest", + "low", + "medium", + "high", + "highest" + ] }, "name": { "type": "string", @@ -18521,7 +20122,11 @@ "example": "https://cal.com/api/avatar/d95949bc-ccb1-400f-acf6-045c51a16856.png" } }, - "required": ["userId", "name", "username"] + "required": [ + "userId", + "name", + "username" + ] }, "EventTypeTeam": { "type": "object", @@ -18554,7 +20159,9 @@ "type": "string" } }, - "required": ["id"] + "required": [ + "id" + ] }, "TeamEventTypeOutput_2024_06_14": { "type": "object", @@ -18569,7 +20176,11 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [15, 30, 60], + "example": [ + 15, + 30, + 60 + ], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -18840,7 +20451,11 @@ }, "schedulingType": { "type": "string", - "enum": ["roundRobin", "collective", "managed"] + "enum": [ + "roundRobin", + "collective", + "managed" + ] }, "team": { "$ref": "#/components/schemas/EventTypeTeam" @@ -18876,13 +20491,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamEventTypeOutput_2024_06_14" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreatePhoneCallInput": { "type": "object", @@ -18908,7 +20529,10 @@ }, "templateType": { "default": "CUSTOM_TEMPLATE", - "enum": ["CHECK_IN_APPOINTMENT", "CUSTOM_TEMPLATE"], + "enum": [ + "CHECK_IN_APPOINTMENT", + "CUSTOM_TEMPLATE" + ], "type": "string", "description": "Template type" }, @@ -18937,7 +20561,13 @@ "description": "General prompt" } }, - "required": ["yourPhoneNumber", "numberToCall", "calApiKey", "enabled", "templateType"] + "required": [ + "yourPhoneNumber", + "numberToCall", + "calApiKey", + "enabled", + "templateType" + ] }, "Data": { "type": "object", @@ -18949,7 +20579,9 @@ "type": "string" } }, - "required": ["callId"] + "required": [ + "callId" + ] }, "CreatePhoneCallOutput": { "type": "object", @@ -18957,13 +20589,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/Data" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetTeamEventTypesOutput": { "type": "object", @@ -18971,7 +20609,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -18980,7 +20621,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateTeamEventTypeInput_2024_06_14": { "type": "object", @@ -18990,7 +20634,11 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [15, 30, 60], + "example": [ + 15, + 30, + 60 + ], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -19276,7 +20924,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -19292,7 +20943,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteTeamEventTypeOutput": { "type": "object", @@ -19300,13 +20954,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamMembershipOutput": { "type": "object", @@ -19325,7 +20985,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -19334,7 +20998,14 @@ "$ref": "#/components/schemas/MembershipUserOutputDto" } }, - "required": ["id", "userId", "teamId", "accepted", "role", "user"] + "required": [ + "id", + "userId", + "teamId", + "accepted", + "role", + "user" + ] }, "OrgTeamMembershipsOutputResponseDto": { "type": "object", @@ -19342,7 +21013,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19351,7 +21025,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgTeamMembershipOutputResponseDto": { "type": "object", @@ -19359,13 +21036,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateOrgTeamMembershipDto": { "type": "object", @@ -19375,7 +21058,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -19395,14 +21082,21 @@ "role": { "type": "string", "default": "MEMBER", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean", "default": false } }, - "required": ["userId", "role"] + "required": [ + "userId", + "role" + ] }, "Attribute": { "type": "object", @@ -19420,7 +21114,12 @@ "type": { "type": "string", "description": "The type of the attribute", - "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] + "enum": [ + "TEXT", + "NUMBER", + "SINGLE_SELECT", + "MULTI_SELECT" + ] }, "name": { "type": "string", @@ -19443,7 +21142,14 @@ "example": true } }, - "required": ["id", "teamId", "type", "name", "slug", "enabled"] + "required": [ + "id", + "teamId", + "type", + "name", + "slug", + "enabled" + ] }, "GetOrganizationAttributesOutput": { "type": "object", @@ -19451,7 +21157,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19460,7 +21169,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetSingleAttributeOutput": { "type": "object", @@ -19468,7 +21180,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -19479,7 +21194,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOrganizationAttributeOptionInput": { "type": "object", @@ -19491,7 +21209,10 @@ "type": "string" } }, - "required": ["value", "slug"] + "required": [ + "value", + "slug" + ] }, "CreateOrganizationAttributeInput": { "type": "object", @@ -19504,7 +21225,12 @@ }, "type": { "type": "string", - "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] + "enum": [ + "TEXT", + "NUMBER", + "SINGLE_SELECT", + "MULTI_SELECT" + ] }, "options": { "type": "array", @@ -19516,7 +21242,12 @@ "type": "boolean" } }, - "required": ["name", "slug", "type", "options"] + "required": [ + "name", + "slug", + "type", + "options" + ] }, "CreateOrganizationAttributesOutput": { "type": "object", @@ -19524,13 +21255,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/Attribute" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateOrganizationAttributeInput": { "type": "object", @@ -19543,7 +21280,12 @@ }, "type": { "type": "string", - "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] + "enum": [ + "TEXT", + "NUMBER", + "SINGLE_SELECT", + "MULTI_SELECT" + ] }, "enabled": { "type": "boolean" @@ -19556,13 +21298,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/Attribute" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteOrganizationAttributesOutput": { "type": "object", @@ -19570,13 +21318,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/Attribute" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OptionOutput": { "type": "object", @@ -19602,7 +21356,12 @@ "example": "option-slug" } }, - "required": ["id", "attributeId", "value", "slug"] + "required": [ + "id", + "attributeId", + "value", + "slug" + ] }, "CreateAttributeOptionOutput": { "type": "object", @@ -19610,13 +21369,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OptionOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteAttributeOptionOutput": { "type": "object", @@ -19624,13 +21389,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OptionOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateOrganizationAttributeOptionInput": { "type": "object", @@ -19649,13 +21420,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OptionOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetAllAttributeOptionOutput": { "type": "object", @@ -19663,7 +21440,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19672,7 +21452,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "AssignedOptionOutput": { "type": "object", @@ -19699,14 +21482,23 @@ }, "assignedUserIds": { "description": "Ids of the users assigned to the attribute option.", - "example": [124, 224], + "example": [ + 124, + 224 + ], "type": "array", "items": { "type": "string" } } }, - "required": ["id", "attributeId", "value", "slug", "assignedUserIds"] + "required": [ + "id", + "attributeId", + "value", + "slug", + "assignedUserIds" + ] }, "GetAllAttributeAssignedOptionOutput": { "type": "object", @@ -19714,7 +21506,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19723,7 +21518,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "AssignOrganizationAttributeOptionToUserInput": { "type": "object", @@ -19738,7 +21536,9 @@ "type": "string" } }, - "required": ["attributeId"] + "required": [ + "attributeId" + ] }, "AssignOptionUserOutputData": { "type": "object", @@ -19756,7 +21556,11 @@ "description": "The value of the option" } }, - "required": ["id", "memberId", "attributeOptionId"] + "required": [ + "id", + "memberId", + "attributeOptionId" + ] }, "AssignOptionUserOutput": { "type": "object", @@ -19764,13 +21568,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/AssignOptionUserOutputData" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UnassignOptionUserOutput": { "type": "object", @@ -19778,13 +21588,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/AssignOptionUserOutputData" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetOptionUserOutputData": { "type": "object", @@ -19806,7 +21622,12 @@ "description": "The slug of the option" } }, - "required": ["id", "attributeId", "value", "slug"] + "required": [ + "id", + "attributeId", + "value", + "slug" + ] }, "GetOptionUserOutput": { "type": "object", @@ -19814,7 +21635,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19823,7 +21647,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamWebhookOutputDto": { "type": "object", @@ -19855,7 +21682,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "teamId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "teamId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "TeamWebhooksOutputResponseDto": { "type": "object", @@ -19863,7 +21697,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19872,7 +21709,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateWebhookInputDto": { "type": "object", @@ -19925,7 +21765,11 @@ "type": "string" } }, - "required": ["active", "subscriberUrl", "triggers"] + "required": [ + "active", + "subscriberUrl", + "triggers" + ] }, "TeamWebhookOutputResponseDto": { "type": "object", @@ -19933,13 +21777,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamWebhookOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateWebhookInputDto": { "type": "object", @@ -20022,10 +21872,19 @@ "type": "string", "description": "the reason for the out of office entry, if applicable", "example": "vacation", - "enum": ["unspecified", "vacation", "travel", "sick", "public_holiday"] + "enum": [ + "unspecified", + "vacation", + "travel", + "sick", + "public_holiday" + ] } }, - "required": ["start", "end"] + "required": [ + "start", + "end" + ] }, "UpdateOutOfOfficeEntryDto": { "type": "object", @@ -20056,7 +21915,13 @@ "type": "string", "description": "the reason for the out of office entry, if applicable", "example": "vacation", - "enum": ["unspecified", "vacation", "travel", "sick", "public_holiday"] + "enum": [ + "unspecified", + "vacation", + "travel", + "sick", + "public_holiday" + ] } } }, @@ -20071,7 +21936,10 @@ }, "activeOnEventTypeIds": { "description": "List of Event Type IDs the workflow is specifically active on (if not active on all)", - "example": [698191, 698192], + "example": [ + 698191, + 698192 + ], "type": "array", "items": { "type": "number" @@ -20091,10 +21959,17 @@ "type": "string", "description": "Unit for the offset time", "example": "hour", - "enum": ["hour", "minute", "day"] + "enum": [ + "hour", + "minute", + "day" + ] } }, - "required": ["value", "unit"] + "required": [ + "value", + "unit" + ] }, "WorkflowTriggerOutputDto": { "type": "object", @@ -20122,7 +21997,9 @@ ] } }, - "required": ["type"] + "required": [ + "type" + ] }, "WorkflowMessageOutputDto": { "type": "object", @@ -20143,7 +22020,9 @@ "example": "Reminder for {EVENT_NAME}." } }, - "required": ["subject"] + "required": [ + "subject" + ] }, "WorkflowStepOutputDto": { "type": "object", @@ -20169,14 +22048,20 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ] }, "recipient": { "type": "string", "description": "Intended recipient type", "example": "const", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "email": { "type": "string", @@ -20191,7 +22076,14 @@ "type": "string", "description": "Template type used", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "includeCalendarEvent": { "type": "object", @@ -20213,15 +22105,23 @@ ] } }, - "required": ["id", "stepNumber", "action", "recipient", "template", "sender", "message"] - }, - "WorkflowOutput": { - "type": "object", - "properties": { - "id": { - "type": "number", - "description": "Unique identifier of the workflow", - "example": 101 + "required": [ + "id", + "stepNumber", + "action", + "recipient", + "template", + "sender", + "message" + ] + }, + "WorkflowOutput": { + "type": "object", + "properties": { + "id": { + "type": "number", + "description": "Unique identifier of the workflow", + "example": 101 }, "name": { "type": "string", @@ -20272,7 +22172,13 @@ "example": "2024-05-12T11:30:00.000Z" } }, - "required": ["id", "name", "activation", "trigger", "steps"] + "required": [ + "id", + "name", + "activation", + "trigger", + "steps" + ] }, "GetWorkflowsOutput": { "type": "object", @@ -20281,7 +22187,10 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "description": "List of workflows", @@ -20291,7 +22200,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetWorkflowOutput": { "type": "object", @@ -20300,7 +22212,10 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "description": "workflow", @@ -20310,7 +22225,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "WorkflowTriggerOffsetDto": { "type": "object", @@ -20326,7 +22244,10 @@ "example": "hour" } }, - "required": ["value", "unit"] + "required": [ + "value", + "unit" + ] }, "OnBeforeEventTriggerDto": { "type": "object", @@ -20346,7 +22267,10 @@ "example": "beforeEvent" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnAfterEventTriggerDto": { "type": "object", @@ -20366,7 +22290,10 @@ "example": "afterEvent" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnCancelTriggerDto": { "type": "object", @@ -20377,7 +22304,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnCreationTriggerDto": { "type": "object", @@ -20388,7 +22317,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnRescheduleTriggerDto": { "type": "object", @@ -20399,7 +22330,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnAfterCalVideoGuestsNoShowTriggerDto": { "type": "object", @@ -20419,7 +22352,10 @@ "example": "afterGuestsCalVideoNoShow" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnAfterCalVideoHostsNoShowTriggerDto": { "type": "object", @@ -20439,7 +22375,10 @@ "example": "afterHostsCalVideoNoShow" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "HtmlWorkflowMessageDto": { "type": "object", @@ -20455,7 +22394,10 @@ "example": "

This is a reminder from {ORGANIZER} of {EVENT_NAME} to {ATTENDEE} starting here {LOCATION} {MEETING_URL} at {START_TIME_h:mma} {TIMEZONE}.

" } }, - "required": ["subject", "html"] + "required": [ + "subject", + "html" + ] }, "WorkflowEmailAddressStepDto": { "type": "object", @@ -20469,7 +22411,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_address", "description": "Action to perform, send an email to a specific email address", @@ -20484,13 +22427,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -20542,7 +22497,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_attendee", "description": "Action to perform, send an email to the attendees of the event", @@ -20557,13 +22513,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -20606,7 +22574,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_host", "description": "Action to perform, send an email to the host of the event", @@ -20621,13 +22590,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -20672,7 +22653,10 @@ "example": "This is a reminder message from {ORGANIZER} of {EVENT_NAME} to {ATTENDEE} starting here {LOCATION} {MEETING_URL} at {START_TIME_h:mma} {TIMEZONE}." } }, - "required": ["subject", "text"] + "required": [ + "subject", + "text" + ] }, "WorkflowPhoneWhatsAppAttendeeStepDto": { "type": "object", @@ -20686,7 +22670,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_attendee", "description": "Action to perform", @@ -20701,13 +22686,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -20722,7 +22719,14 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "WorkflowPhoneWhatsAppNumberStepDto": { "type": "object", @@ -20736,7 +22740,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_number", "description": "Action to perform, send a text message via whatsapp to a specific phone number", @@ -20751,13 +22756,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -20780,7 +22797,15 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "WorkflowPhoneNumberStepDto": { "type": "object", @@ -20794,7 +22819,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "sms_number", "description": "Action to perform, send a text message to a specific phone number", @@ -20809,13 +22835,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -20838,7 +22876,15 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "WorkflowPhoneAttendeeStepDto": { "type": "object", @@ -20852,7 +22898,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "sms_attendee", "description": "Action to perform, send a text message to the phone numbers of the attendees", @@ -20867,13 +22914,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -20892,7 +22951,14 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "BaseWorkflowTriggerDto": { "type": "object", @@ -20902,7 +22968,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "WorkflowActivationDto": { "type": "object", @@ -20916,14 +22984,18 @@ "activeOnEventTypeIds": { "default": [], "description": "List of event-types IDs the workflow applies to, required if isActiveOnAllEventTypes is false", - "example": [698191], + "example": [ + 698191 + ], "type": "array", "items": { "type": "number" } } }, - "required": ["isActiveOnAllEventTypes"] + "required": [ + "isActiveOnAllEventTypes" + ] }, "CreateWorkflowDto": { "type": "object", @@ -20997,7 +23069,12 @@ } } }, - "required": ["name", "activation", "trigger", "steps"] + "required": [ + "name", + "activation", + "trigger", + "steps" + ] }, "UpdateEmailAddressWorkflowStepDto": { "type": "object", @@ -21011,7 +23088,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_address", "description": "Action to perform, send an email to a specific email address", @@ -21026,13 +23104,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -21089,7 +23179,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_attendee", "description": "Action to perform, send an email to the attendees of the event", @@ -21104,13 +23195,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -21158,7 +23261,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "email_host", "description": "Action to perform, send an email to the host of the event", @@ -21173,13 +23277,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -21227,7 +23343,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "sms_attendee", "description": "Action to perform, send a text message to the phone numbers of the attendees", @@ -21242,13 +23359,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -21272,7 +23401,14 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "UpdatePhoneWhatsAppNumberWorkflowStepDto": { "type": "object", @@ -21286,7 +23422,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_number", "description": "Action to perform, send a text message via whatsapp to a specific phone number", @@ -21301,13 +23438,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -21335,7 +23484,15 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "UpdateWhatsAppAttendeePhoneWorkflowStepDto": { "type": "object", @@ -21349,7 +23506,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_attendee", "description": "Action to perform", @@ -21364,13 +23522,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -21390,7 +23560,14 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "UpdatePhoneNumberWorkflowStepDto": { "type": "object", @@ -21404,7 +23581,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "sms_number", "description": "Action to perform, send a text message to a specific phone number", @@ -21419,13 +23597,25 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] + "enum": [ + "reminder", + "custom", + "rescheduled", + "completed", + "rating", + "cancelled" + ] }, "sender": { "type": "string", @@ -21453,7 +23643,15 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "UpdateWorkflowDto": { "type": "object", @@ -21535,7 +23733,9 @@ "type": "string" } }, - "required": ["authUrl"] + "required": [ + "authUrl" + ] }, "StripConnectOutputResponseDto": { "type": "object", @@ -21543,13 +23743,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/StripConnectOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "StripCredentialsSaveOutputResponseDto": { "type": "object", @@ -21558,7 +23764,9 @@ "type": "string" } }, - "required": ["url"] + "required": [ + "url" + ] }, "StripCredentialsCheckOutputResponseDto": { "type": "object", @@ -21568,7 +23776,9 @@ "example": "success" } }, - "required": ["status"] + "required": [ + "status" + ] }, "GetDefaultScheduleOutput_2024_06_11": { "type": "object", @@ -21576,13 +23786,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateTeamInput": { "type": "object", @@ -21666,7 +23882,9 @@ "description": "If you are a platform customer, don't pass 'false', because then team creator won't be able to create team event types." } }, - "required": ["name"] + "required": [ + "name" + ] }, "CreateTeamOutput": { "type": "object", @@ -21674,7 +23892,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -21688,7 +23909,10 @@ "description": "Either an Output object or a TeamOutputDto." } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamOutputDto": { "type": "object", @@ -21764,7 +23988,11 @@ "default": "Sunday" } }, - "required": ["id", "name", "isOrganization"] + "required": [ + "id", + "name", + "isOrganization" + ] }, "GetTeamOutput": { "type": "object", @@ -21772,13 +24000,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetTeamsOutput": { "type": "object", @@ -21786,7 +24020,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -21795,7 +24032,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateTeamOutput": { "type": "object", @@ -21803,13 +24043,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "ConferencingAppsOutputDto": { "type": "object", @@ -21834,20 +24080,30 @@ "description": "Whether if the connection is working or not." } }, - "required": ["id", "type", "userId"] + "required": [ + "id", + "type", + "userId" + ] }, "ConferencingAppOutputResponseDto": { "type": "object", "properties": { "status": { "type": "string", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ConferencingAppsOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetConferencingAppsOauthUrlResponseDto": { "type": "object", @@ -21855,17 +24111,25 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "ConferencingAppsOutputResponseDto": { "type": "object", "properties": { "status": { "type": "string", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -21874,7 +24138,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "SetDefaultConferencingAppOutputResponseDto": { "type": "object", @@ -21882,10 +24149,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "DefaultConferencingAppsOutputDto": { "type": "object", @@ -21904,13 +24176,18 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/DefaultConferencingAppsOutputDto" } }, - "required": ["status"] + "required": [ + "status" + ] }, "DisconnectConferencingAppOutputResponseDto": { "type": "object", @@ -21918,10 +24195,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "GoogleServiceAccountKeyInput": { "type": "object", @@ -21936,7 +24218,11 @@ "type": "string" } }, - "required": ["private_key", "client_email", "client_id"] + "required": [ + "private_key", + "client_email", + "client_id" + ] }, "CreateDelegationCredentialInput": { "type": "object", @@ -21961,7 +24247,11 @@ } } }, - "required": ["workspacePlatformSlug", "domain", "serviceAccountKey"] + "required": [ + "workspacePlatformSlug", + "domain", + "serviceAccountKey" + ] }, "WorkspacePlatformDto": { "type": "object", @@ -21973,7 +24263,10 @@ "type": "string" } }, - "required": ["name", "slug"] + "required": [ + "name", + "slug" + ] }, "DelegationCredentialOutput": { "type": "object", @@ -22018,13 +24311,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/DelegationCredentialOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateDelegationCredentialInput": { "type": "object", @@ -22053,20 +24352,29 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/DelegationCredentialOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateIcsFeedInputDto": { "type": "object", "properties": { "urls": { "type": "array", - "example": ["https://cal.com/ics/feed.ics", "http://cal.com/ics/feed.ics"], + "example": [ + "https://cal.com/ics/feed.ics", + "http://cal.com/ics/feed.ics" + ], "description": "An array of ICS URLs", "items": { "type": "string", @@ -22080,7 +24388,9 @@ "description": "Whether to allowing writing to the calendar or not" } }, - "required": ["urls"] + "required": [ + "urls" + ] }, "CreateIcsFeedOutput": { "type": "object", @@ -22120,7 +24430,14 @@ "description": "Whether the calendar credentials are valid or not" } }, - "required": ["id", "type", "userId", "teamId", "appId", "invalid"] + "required": [ + "id", + "type", + "userId", + "teamId", + "appId", + "invalid" + ] }, "CreateIcsFeedOutputResponseDto": { "type": "object", @@ -22128,13 +24445,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/CreateIcsFeedOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "BusyTimesOutput": { "type": "object", @@ -22152,7 +24475,10 @@ "nullable": true } }, - "required": ["start", "end"] + "required": [ + "start", + "end" + ] }, "GetBusyTimesOutput": { "type": "object", @@ -22160,7 +24486,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -22169,7 +24498,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "Integration": { "type": "object", @@ -22278,7 +24610,13 @@ "nullable": true } }, - "required": ["externalId", "primary", "readOnly", "isSelected", "credentialId"] + "required": [ + "externalId", + "primary", + "readOnly", + "isSelected", + "credentialId" + ] }, "Calendar": { "type": "object", @@ -22313,7 +24651,12 @@ "nullable": true } }, - "required": ["externalId", "readOnly", "isSelected", "credentialId"] + "required": [ + "externalId", + "readOnly", + "isSelected", + "credentialId" + ] }, "ConnectedCalendar": { "type": "object", @@ -22338,7 +24681,10 @@ } } }, - "required": ["integration", "credentialId"] + "required": [ + "integration", + "credentialId" + ] }, "DestinationCalendar": { "type": "object", @@ -22412,7 +24758,10 @@ "$ref": "#/components/schemas/DestinationCalendar" } }, - "required": ["connectedCalendars", "destinationCalendar"] + "required": [ + "connectedCalendars", + "destinationCalendar" + ] }, "ConnectedCalendarsOutput": { "type": "object", @@ -22420,13 +24769,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ConnectedCalendarsData" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateCalendarCredentialsInput": { "type": "object", @@ -22438,7 +24793,10 @@ "type": "string" } }, - "required": ["username", "password"] + "required": [ + "username", + "password" + ] }, "DeleteCalendarCredentialsInputBodyDto": { "type": "object", @@ -22449,7 +24807,9 @@ "description": "Credential ID of the calendar to delete, as returned by the /calendars endpoint" } }, - "required": ["id"] + "required": [ + "id" + ] }, "DeletedCalendarCredentialsOutputDto": { "type": "object", @@ -22477,7 +24837,14 @@ "nullable": true } }, - "required": ["id", "type", "userId", "teamId", "appId", "invalid"] + "required": [ + "id", + "type", + "userId", + "teamId", + "appId", + "invalid" + ] }, "DeletedCalendarCredentialsOutputResponseDto": { "type": "object", @@ -22485,13 +24852,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/DeletedCalendarCredentialsOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOrganizationInput": { "type": "object", @@ -22527,7 +24900,9 @@ } } }, - "required": ["name"] + "required": [ + "name" + ] }, "ManagedOrganizationWithApiKeyOutput": { "type": "object", @@ -22552,7 +24927,11 @@ "type": "string" } }, - "required": ["id", "name", "apiKey"] + "required": [ + "id", + "name", + "apiKey" + ] }, "CreateManagedOrganizationOutput": { "type": "object", @@ -22560,13 +24939,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ManagedOrganizationWithApiKeyOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "ManagedOrganizationOutput": { "type": "object", @@ -22588,7 +24973,10 @@ } } }, - "required": ["id", "name"] + "required": [ + "id", + "name" + ] }, "GetManagedOrganizationOutput": { "type": "object", @@ -22596,13 +24984,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ManagedOrganizationOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "PaginationMetaDto": { "type": "object", @@ -22670,7 +25064,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -22682,7 +25079,11 @@ "$ref": "#/components/schemas/PaginationMetaDto" } }, - "required": ["status", "data", "pagination"] + "required": [ + "status", + "data", + "pagination" + ] }, "UpdateOrganizationInput": { "type": "object", @@ -22731,7 +25132,14 @@ "type": "string" } }, - "required": ["id", "formId", "formFillerId", "routedToBookingUid", "response", "createdAt"] + "required": [ + "id", + "formId", + "formFillerId", + "routedToBookingUid", + "response", + "createdAt" + ] }, "GetRoutingFormResponsesOutput": { "type": "object", @@ -22739,13 +25147,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/RoutingFormResponseOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "Routing": { "type": "object", @@ -22764,7 +25178,10 @@ }, "teamMemberIds": { "description": "Array of team member IDs that were routed to handle this booking.", - "example": [101, 102], + "example": [ + 101, + 102 + ], "type": "array", "items": { "type": "number" @@ -22791,7 +25208,9 @@ "example": "Account" } }, - "required": ["teamMemberIds"] + "required": [ + "teamMemberIds" + ] }, "CreateRoutingFormResponseOutputData": { "type": "object", @@ -22806,7 +25225,10 @@ "example": { "eventTypeId": 123, "routing": { - "teamMemberIds": [101, 102], + "teamMemberIds": [ + 101, + 102 + ], "teamMemberEmail": "john.doe@example.com", "skipContactOwner": true } @@ -22845,13 +25267,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/CreateRoutingFormResponseOutputData" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateRoutingFormResponseInput": { "type": "object", @@ -22868,13 +25296,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/RoutingFormResponseOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "RoutingFormOutput": { "type": "object", @@ -22950,7 +25384,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -22959,7 +25396,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "SlotsOutput_2024_09_04": { "type": "object", @@ -22986,7 +25426,10 @@ ] } }, - "required": ["eventTypeId", "slots"] + "required": [ + "eventTypeId", + "slots" + ] }, "ResponseSlotsOutput": { "type": "object", @@ -22994,13 +25437,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ResponseSlotsOutputData" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "ReserveSlotInput_2024_09_04": { "type": "object", @@ -23026,7 +25475,10 @@ "description": "ONLY for authenticated requests with api key, access token or OAuth credentials (ID + secret).\n \n For how many minutes the slot should be reserved - for this long time noone else can book this event type at `start` time. If not provided, defaults to 5 minutes." } }, - "required": ["eventTypeId", "slotStart"] + "required": [ + "eventTypeId", + "slotStart" + ] }, "ReserveSlotOutput_2024_09_04": { "type": "object", @@ -23083,13 +25535,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ReserveSlotOutput_2024_09_04" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetReservedSlotOutput_2024_09_04": { "type": "object", @@ -23097,7 +25555,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -23108,7 +25569,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "MeOrgOutput": { "type": "object", @@ -23120,7 +25584,10 @@ "type": "number" } }, - "required": ["isPlatform", "id"] + "required": [ + "isPlatform", + "id" + ] }, "MeOutput": { "type": "object", @@ -23172,13 +25639,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/MeOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateMeOutput": { "type": "object", @@ -23186,13 +25659,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/MeOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "BookingInputAddressLocation_2024_08_13": { "type": "object", @@ -23203,7 +25682,9 @@ "description": "only allowed value for type is `address` - it refers to address defined by the organizer." } }, - "required": ["type"] + "required": [ + "type" + ] }, "BookingInputAttendeeAddressLocation_2024_08_13": { "type": "object", @@ -23218,7 +25699,10 @@ "example": "123 Example St, City, Country" } }, - "required": ["type", "address"] + "required": [ + "type", + "address" + ] }, "BookingInputAttendeeDefinedLocation_2024_08_13": { "type": "object", @@ -23233,7 +25717,10 @@ "example": "321 Example St, City, Country" } }, - "required": ["type", "location"] + "required": [ + "type", + "location" + ] }, "BookingInputAttendeePhoneLocation_2024_08_13": { "type": "object", @@ -23248,7 +25735,10 @@ "example": "+37120993151" } }, - "required": ["type", "phone"] + "required": [ + "type", + "phone" + ] }, "BookingInputIntegrationLocation_2024_08_13": { "type": "object", @@ -23294,7 +25784,10 @@ ] } }, - "required": ["type", "integration"] + "required": [ + "type", + "integration" + ] }, "BookingInputLinkLocation_2024_08_13": { "type": "object", @@ -23305,7 +25798,9 @@ "description": "only allowed value for type is `link` - it refers to link defined by the organizer." } }, - "required": ["type"] + "required": [ + "type" + ] }, "BookingInputPhoneLocation_2024_08_13": { "type": "object", @@ -23316,7 +25811,9 @@ "description": "only allowed value for type is `phone` - it refers to phone defined by the organizer." } }, - "required": ["type"] + "required": [ + "type" + ] }, "BookingInputOrganizersDefaultAppLocation_2024_08_13": { "type": "object", @@ -23327,7 +25824,9 @@ "description": "only available for team event types and the only allowed value for type is `organizersDefaultApp` - it refers to the default app defined by the organizer." } }, - "required": ["type"] + "required": [ + "type" + ] }, "ValidateBookingLocation_2024_08_13": { "type": "object", @@ -23408,7 +25907,10 @@ "default": "en" } }, - "required": ["name", "timeZone"] + "required": [ + "name", + "timeZone" + ] }, "CreateBookingInput_2024_08_13": { "type": "object", @@ -23460,7 +25962,10 @@ }, "guests": { "description": "An optional list of guest emails attending the event.", - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -23517,7 +26022,10 @@ "description": "Routing information from routing forms that determined the booking assignment. Both responseId and teamMemberIds are required if provided.", "example": { "responseId": 123, - "teamMemberIds": [101, 102] + "teamMemberIds": [ + 101, + 102 + ] }, "allOf": [ { @@ -23526,7 +26034,10 @@ ] } }, - "required": ["start", "attendee"] + "required": [ + "start", + "attendee" + ] }, "CreateInstantBookingInput_2024_08_13": { "type": "object", @@ -23578,7 +26089,10 @@ }, "guests": { "description": "An optional list of guest emails attending the event.", - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -23635,7 +26149,10 @@ "description": "Routing information from routing forms that determined the booking assignment. Both responseId and teamMemberIds are required if provided.", "example": { "responseId": 123, - "teamMemberIds": [101, 102] + "teamMemberIds": [ + 101, + 102 + ] }, "allOf": [ { @@ -23649,7 +26166,11 @@ "example": true } }, - "required": ["start", "attendee", "instant"] + "required": [ + "start", + "attendee", + "instant" + ] }, "CreateRecurringBookingInput_2024_08_13": { "type": "object", @@ -23701,7 +26222,10 @@ }, "guests": { "description": "An optional list of guest emails attending the event.", - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -23758,7 +26282,10 @@ "description": "Routing information from routing forms that determined the booking assignment. Both responseId and teamMemberIds are required if provided.", "example": { "responseId": 123, - "teamMemberIds": [101, 102] + "teamMemberIds": [ + 101, + 102 + ] }, "allOf": [ { @@ -23772,7 +26299,10 @@ "example": 5 } }, - "required": ["start", "attendee"] + "required": [ + "start", + "attendee" + ] }, "BookingHost": { "type": "object", @@ -23798,7 +26328,13 @@ "example": "America/Los_Angeles" } }, - "required": ["id", "name", "email", "username", "timeZone"] + "required": [ + "id", + "name", + "email", + "username", + "timeZone" + ] }, "EventType": { "type": "object", @@ -23812,7 +26348,10 @@ "example": "some-event" } }, - "required": ["id", "slug"] + "required": [ + "id", + "slug" + ] }, "BookingAttendee": { "type": "object", @@ -23887,7 +26426,12 @@ "example": "+1234567890" } }, - "required": ["name", "email", "timeZone", "absent"] + "required": [ + "name", + "email", + "timeZone", + "absent" + ] }, "BookingOutput_2024_08_13": { "type": "object", @@ -23916,7 +26460,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24010,7 +26559,10 @@ } }, "guests": { - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -24071,7 +26623,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24165,7 +26722,10 @@ } }, "guests": { - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -24294,7 +26854,14 @@ } } }, - "required": ["name", "email", "timeZone", "absent", "seatUid", "bookingFieldsResponses"] + "required": [ + "name", + "email", + "timeZone", + "absent", + "seatUid", + "bookingFieldsResponses" + ] }, "CreateSeatedBookingOutput_2024_08_13": { "type": "object", @@ -24323,7 +26890,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24468,7 +27040,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24597,7 +27174,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -24623,7 +27203,10 @@ "description": "Booking data, which can be either a BookingOutput object or an array of RecurringBookingOutput objects" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetSeatedBookingOutput_2024_08_13": { "type": "object", @@ -24652,7 +27235,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24792,7 +27380,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24916,7 +27509,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -24951,8 +27547,11 @@ "type": "object" } }, - "required": ["status", "data"] - }, + "required": [ + "status", + "data" + ] + }, "RecordingItem": { "type": "object", "properties": { @@ -24995,7 +27594,14 @@ "example": "Error message" } }, - "required": ["id", "roomName", "startTs", "status", "duration", "shareToken"] + "required": [ + "id", + "roomName", + "startTs", + "status", + "duration", + "shareToken" + ] }, "GetBookingRecordingsOutput": { "type": "object", @@ -25003,7 +27609,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "error": { "type": "object" @@ -25015,7 +27624,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetBookingTranscriptsOutput": { "type": "object", @@ -25023,10 +27635,16 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { - "example": ["https://transcript1.com", "https://transcript2.com"], + "example": [ + "https://transcript1.com", + "https://transcript2.com" + ], "type": "array", "items": { "type": "string" @@ -25036,7 +27654,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetBookingsOutput_2024_08_13": { "type": "object", @@ -25044,7 +27665,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25073,7 +27697,11 @@ "type": "object" } }, - "required": ["status", "data", "pagination"] + "required": [ + "status", + "data", + "pagination" + ] }, "RescheduleBookingInput_2024_08_13": { "type": "object", @@ -25093,7 +27721,9 @@ "description": "Reason for rescheduling the booking" } }, - "required": ["start"] + "required": [ + "start" + ] }, "RescheduleSeatedBookingInput_2024_08_13": { "type": "object", @@ -25113,7 +27743,10 @@ "description": "Uid of the specific seat within booking." } }, - "required": ["start", "seatUid"] + "required": [ + "start", + "seatUid" + ] }, "RescheduleBookingOutput_2024_08_13": { "type": "object", @@ -25121,7 +27754,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25141,7 +27777,10 @@ "description": "Booking data, which can be either a BookingOutput object or a RecurringBookingOutput object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CancelBookingInput_2024_08_13": { "type": "object", @@ -25165,7 +27804,9 @@ "description": "Uid of the specific seat within booking." } }, - "required": ["seatUid"] + "required": [ + "seatUid" + ] }, "CancelBookingOutput_2024_08_13": { "type": "object", @@ -25173,7 +27814,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25205,7 +27849,10 @@ "description": "Booking data, which can be either a BookingOutput object, a RecurringBookingOutput object, or an array of RecurringBookingOutput objects" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "MarkAbsentAttendee": { "type": "object", @@ -25217,7 +27864,10 @@ "type": "boolean" } }, - "required": ["email", "absent"] + "required": [ + "email", + "absent" + ] }, "MarkAbsentBookingInput_2024_08_13": { "type": "object", @@ -25241,7 +27891,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25255,7 +27908,10 @@ "description": "Booking data, which can be either a BookingOutput object or a RecurringBookingOutput object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "ReassignedToDto": { "type": "object", @@ -25273,7 +27929,11 @@ "example": "john.doe@example.com" } }, - "required": ["id", "name", "email"] + "required": [ + "id", + "name", + "email" + ] }, "ReassignBookingOutput_2024_08_13": { "type": "object", @@ -25281,7 +27941,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25297,7 +27960,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "ReassignToUserBookingInput_2024_08_13": { "type": "object", @@ -25331,7 +27997,10 @@ "description": "The link to the calendar" } }, - "required": ["label", "link"] + "required": [ + "label", + "link" + ] }, "CalendarLinksOutput_2024_08_13": { "type": "object", @@ -25349,7 +28018,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "BookingReference": { "type": "object", @@ -25372,7 +28044,12 @@ "description": "The id of the booking reference" } }, - "required": ["type", "eventUid", "destinationCalendarId", "id"] + "required": [ + "type", + "eventUid", + "destinationCalendarId", + "id" + ] }, "BookingReferencesOutput_2024_08_13": { "type": "object", @@ -25390,7 +28067,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateTeamMembershipInput": { "type": "object", @@ -25405,14 +28085,20 @@ "role": { "type": "string", "default": "MEMBER", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean", "default": false } }, - "required": ["userId"] + "required": [ + "userId" + ] }, "CreateTeamMembershipOutput": { "type": "object", @@ -25420,13 +28106,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetTeamMembershipOutput": { "type": "object", @@ -25434,13 +28126,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetTeamMembershipsOutput": { "type": "object", @@ -25448,13 +28146,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateTeamMembershipInput": { "type": "object", @@ -25464,7 +28168,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -25477,13 +28185,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteTeamMembershipOutput": { "type": "object", @@ -25491,13 +28205,243 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] + }, + "CreatePrivateLinkInput": { + "type": "object", + "properties": { + "expiresAt": { + "type": "string", + "description": "Expiration date for time-based links", + "format": "date-time", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times the link can be used. If omitted and expiresAt is not provided, defaults to 1 (one time use).", + "example": 10, + "minimum": 1, + "default": 1 + } + } + }, + "TimeBasedPrivateLinkOutput": { + "type": "object", + "properties": { + "linkId": { + "type": "string", + "description": "The private link ID", + "example": "abc123def456" + }, + "eventTypeId": { + "type": "number", + "description": "Event type ID this link belongs to", + "example": 123 + }, + "isExpired": { + "type": "boolean", + "description": "Whether the link is currently expired", + "example": false + }, + "bookingUrl": { + "type": "string", + "description": "Full booking URL for this private link", + "format": "uri", + "example": "https://cal.com/d/abc123def456/30min" + }, + "expiresAt": { + "type": "string", + "description": "Expiration date for this time-based link", + "format": "date-time", + "example": "2025-12-31T23:59:59.000Z" + } + }, + "required": [ + "linkId", + "eventTypeId", + "isExpired", + "bookingUrl", + "expiresAt" + ] + }, + "UsageBasedPrivateLinkOutput": { + "type": "object", + "properties": { + "linkId": { + "type": "string", + "description": "The private link ID", + "example": "abc123def456" + }, + "eventTypeId": { + "type": "number", + "description": "Event type ID this link belongs to", + "example": 123 + }, + "isExpired": { + "type": "boolean", + "description": "Whether the link is currently expired", + "example": false + }, + "bookingUrl": { + "type": "string", + "description": "Full booking URL for this private link", + "format": "uri", + "example": "https://cal.com/d/abc123def456/30min" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times this link can be used", + "example": 10 + }, + "usageCount": { + "type": "number", + "description": "Current usage count for this link", + "example": 3 + } + }, + "required": [ + "linkId", + "eventTypeId", + "isExpired", + "bookingUrl", + "maxUsageCount", + "usageCount" + ] + }, + "CreatePrivateLinkOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Created private link data (either time-based or usage-based)", + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "GetPrivateLinksOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "type": "array", + "description": "Array of private links for the event type (mix of time-based and usage-based)", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" + } + ] + } + } + }, + "required": [ + "status", + "data" + ] + }, + "UpdatePrivateLinkBody": { + "type": "object", + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "New expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "New maximum number of times the link can be used", + "example": 10, + "minimum": 1 + } + } + }, + "UpdatePrivateLinkOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Updated private link data (either time-based or usage-based)", + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "DeletePrivateLinkOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "type": "object", + "description": "Deleted link information", + "properties": { + "linkId": { + "type": "string", + "example": "abc123def456" + }, + "message": { + "type": "string", + "example": "Private link deleted successfully" + } + } + } + }, + "required": [ + "status", + "data" + ] }, "UserWebhookOutputDto": { "type": "object", @@ -25529,7 +28473,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "userId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "userId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "UserWebhookOutputResponseDto": { "type": "object", @@ -25537,13 +28488,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/UserWebhookOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UserWebhooksOutputResponseDto": { "type": "object", @@ -25551,7 +28508,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25560,7 +28520,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "EventTypeWebhookOutputDto": { "type": "object", @@ -25592,7 +28555,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "eventTypeId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "eventTypeId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "EventTypeWebhookOutputResponseDto": { "type": "object", @@ -25600,13 +28570,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/EventTypeWebhookOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "EventTypeWebhooksOutputResponseDto": { "type": "object", @@ -25614,7 +28590,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25623,7 +28602,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteManyWebhooksOutputResponseDto": { "type": "object", @@ -25631,13 +28613,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "string" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OAuthClientWebhookOutputDto": { "type": "object", @@ -25669,7 +28657,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "oAuthClientId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "oAuthClientId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "OAuthClientWebhookOutputResponseDto": { "type": "object", @@ -25677,13 +28672,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/OAuthClientWebhookOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OAuthClientWebhooksOutputResponseDto": { "type": "object", @@ -25691,7 +28692,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25700,7 +28704,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DestinationCalendarsInputBodyDto": { "type": "object", @@ -25709,7 +28716,11 @@ "type": "string", "example": "apple_calendar", "description": "The calendar service you want to integrate, as returned by the /calendars endpoint", - "enum": ["apple_calendar", "google_calendar", "office365_calendar"] + "enum": [ + "apple_calendar", + "google_calendar", + "office365_calendar" + ] }, "externalId": { "type": "string", @@ -25720,7 +28731,10 @@ "type": "string" } }, - "required": ["integration", "externalId"] + "required": [ + "integration", + "externalId" + ] }, "DestinationCalendarsOutputDto": { "type": "object", @@ -25739,7 +28753,12 @@ "nullable": true } }, - "required": ["userId", "integration", "externalId", "credentialId"] + "required": [ + "userId", + "integration", + "externalId", + "credentialId" + ] }, "DestinationCalendarsOutputResponseDto": { "type": "object", @@ -25747,18 +28766,29 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/DestinationCalendarsOutputDto" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CalendarEventResponseStatus": { "type": "string", "description": "Host's response to the invitation", - "enum": ["accepted", "pending", "declined", "needsAction"] + "enum": [ + "accepted", + "pending", + "declined", + "needsAction" + ] }, "CalendarEventAttendee": { "type": "object", @@ -25787,12 +28817,19 @@ "description": "Indicates if this attendee's attendance is optional" } }, - "required": ["email"] + "required": [ + "email" + ] }, "CalendarEventStatus": { "type": "string", "description": "Status of the event (accepted, pending, declined, cancelled)", - "enum": ["accepted", "pending", "declined", "cancelled"] + "enum": [ + "accepted", + "pending", + "declined", + "cancelled" + ] }, "CalendarEventHost": { "type": "object", @@ -25812,12 +28849,18 @@ "$ref": "#/components/schemas/CalendarEventResponseStatus" } }, - "required": ["email"] + "required": [ + "email" + ] }, "CalendarSource": { "type": "string", "description": "Calendar integration source (e.g., Google Calendar, Office 365, Apple Calendar). Currently only Google Calendar is supported.", - "enum": ["google", "office365", "apple"] + "enum": [ + "google", + "office365", + "apple" + ] }, "UnifiedCalendarEventOutput": { "type": "object", @@ -25911,7 +28954,13 @@ "$ref": "#/components/schemas/CalendarSource" } }, - "required": ["start", "end", "id", "title", "source"] + "required": [ + "start", + "end", + "id", + "title", + "source" + ] }, "GetUnifiedCalendarEventOutput": { "type": "object", @@ -25919,13 +28968,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/UnifiedCalendarEventOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "RequestEmailVerificationInput": { "type": "object", @@ -25936,7 +28991,9 @@ "example": "acme@example.com" } }, - "required": ["email"] + "required": [ + "email" + ] }, "RequestEmailVerificationOutput": { "type": "object", @@ -25944,10 +29001,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "RequestPhoneVerificationInput": { "type": "object", @@ -25958,7 +29020,9 @@ "example": "+372 5555 6666" } }, - "required": ["phone"] + "required": [ + "phone" + ] }, "RequestPhoneVerificationOutput": { "type": "object", @@ -25966,10 +29030,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "VerifyEmailInput": { "type": "object", @@ -25985,7 +29054,10 @@ "example": "1ABG2C" } }, - "required": ["email", "code"] + "required": [ + "email", + "code" + ] }, "WorkingHours": { "type": "object", @@ -26007,7 +29079,11 @@ "nullable": true } }, - "required": ["days", "startTime", "endTime"] + "required": [ + "days", + "startTime", + "endTime" + ] }, "AvailabilityModel": { "type": "object", @@ -26047,7 +29123,12 @@ "nullable": true } }, - "required": ["id", "days", "startTime", "endTime"] + "required": [ + "id", + "days", + "startTime", + "endTime" + ] }, "ScheduleOutput": { "type": "object", @@ -26117,13 +29198,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "VerifyPhoneInput": { "type": "object", @@ -26139,7 +29226,10 @@ "example": "1ABG2C" } }, - "required": ["phone", "code"] + "required": [ + "phone", + "code" + ] }, "UserVerifiedPhoneOutput": { "type": "object", @@ -26147,13 +29237,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UserVerifiedEmailsOutput": { "type": "object", @@ -26161,13 +29257,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UserVerifiedPhonesOutput": { "type": "object", @@ -26175,13 +29277,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamVerifiedEmailOutput": { "type": "object", @@ -26189,13 +29297,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamVerifiedPhoneOutput": { "type": "object", @@ -26203,13 +29317,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamVerifiedEmailsOutput": { "type": "object", @@ -26217,13 +29337,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamVerifiedPhonesOutput": { "type": "object", @@ -26231,14 +29357,20 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] } } } -} +} \ No newline at end of file diff --git a/packages/lib/server/service/hashedLinkService.ts b/packages/lib/server/service/hashedLinkService.ts index 4d55e196b8ebd0..bbe4d29b7ca7dd 100644 --- a/packages/lib/server/service/hashedLinkService.ts +++ b/packages/lib/server/service/hashedLinkService.ts @@ -129,6 +129,24 @@ export class HashedLinkService { return hashedLink; } + async createLinkForEventType(eventTypeId: number, input: string | HashedLinkInputType) { + const normalized = this.normalizeLinkInput(input); + return this.hashedLinkRepository.createLink(eventTypeId, normalized); + } + + async updateLinkForEventType(eventTypeId: number, input: string | HashedLinkInputType) { + const normalized = this.normalizeLinkInput(input); + return this.hashedLinkRepository.updateLink(eventTypeId, normalized); + } + + async deleteLinkForEventType(eventTypeId: number, linkId: string) { + return this.hashedLinkRepository.deleteLinks(eventTypeId, [linkId]); + } + + async listLinksByEventType(eventTypeId: number) { + return this.hashedLinkRepository.findLinksByEventTypeId(eventTypeId); + } + /** * Checks if a user has permission to access a link * @param link - Link object with event type information diff --git a/packages/platform/libraries/package.json b/packages/platform/libraries/package.json index 0ae5be91e923b2..1926c36e85e39b 100644 --- a/packages/platform/libraries/package.json +++ b/packages/platform/libraries/package.json @@ -78,6 +78,11 @@ "import": "./dist/bookings.js", "require": "./dist/bookings.cjs", "types": "./dist/bookings.d.ts" + }, + "./private-links": { + "import": "./dist/private-links.js", + "require": "./dist/private-links.cjs", + "types": "./dist/private-links.d.ts" } }, "typesVersions": { @@ -108,6 +113,9 @@ ], "bookings": [ "dist/bookings.d.ts" + ], + "private-links": [ + "dist/private-links.d.ts" ] } } diff --git a/packages/platform/libraries/private-links.ts b/packages/platform/libraries/private-links.ts new file mode 100644 index 00000000000000..45dd87e2c63042 --- /dev/null +++ b/packages/platform/libraries/private-links.ts @@ -0,0 +1,2 @@ +export { generateHashedLink } from "@calcom/lib/generateHashedLink"; +export { isLinkExpired } from "@calcom/lib/hashedLinksUtils"; diff --git a/packages/platform/libraries/vite.config.js b/packages/platform/libraries/vite.config.js index 07b83d36eb9cf7..494cb703ea1144 100644 --- a/packages/platform/libraries/vite.config.js +++ b/packages/platform/libraries/vite.config.js @@ -27,6 +27,7 @@ export default defineConfig({ conferencing: resolve(__dirname, "./conferencing.ts"), repositories: resolve(__dirname, "./repositories.ts"), bookings: resolve(__dirname, "./bookings.ts"), + "private-links": resolve(__dirname, "./private-links.ts"), }, name: "calcom-lib", fileName: "calcom-lib", diff --git a/packages/platform/types/event-types/index.ts b/packages/platform/types/event-types/index.ts index ee023b52832687..b250f10666db4a 100644 --- a/packages/platform/types/event-types/index.ts +++ b/packages/platform/types/event-types/index.ts @@ -1 +1,3 @@ export * from "./event-types_2024_06_14"; +export * from "./inputs/private-link.input"; +export * from "./outputs/private-link.output"; diff --git a/packages/platform/types/event-types/inputs/private-link.input.ts b/packages/platform/types/event-types/inputs/private-link.input.ts new file mode 100644 index 00000000000000..322fb600b1ed31 --- /dev/null +++ b/packages/platform/types/event-types/inputs/private-link.input.ts @@ -0,0 +1,61 @@ +import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { Type } from "class-transformer"; +import { IsOptional, IsDate, IsInt, Min, IsString } from "class-validator"; + +export class CreatePrivateLinkInput { + @IsOptional() + @IsDate() + @Type(() => Date) + @ApiPropertyOptional({ + description: "Expiration date for time-based links", + type: String, + format: "date-time", + example: "2024-12-31T23:59:59.000Z", + }) + expiresAt?: Date; + + @IsOptional() + @IsInt() + @Min(1) + @ApiPropertyOptional({ + description: "Maximum number of times the link can be used. If omitted and expiresAt is not provided, defaults to 1 (one time use).", + type: Number, + example: 10, + minimum: 1, + default: 1, + }) + maxUsageCount?: number; +} + +export class UpdatePrivateLinkInput { + @IsString() + @ApiProperty({ + description: "The private link hash to update", + type: String, + example: "abc123def456", + }) + linkId!: string; + + @IsOptional() + @IsDate() + @Type(() => Date) + @ApiPropertyOptional({ + description: "New expiration date for time-based links", + type: Date, + example: "2024-12-31T23:59:59.000Z", + }) + expiresAt?: Date; + + @IsOptional() + @IsInt() + @Min(1) + @ApiPropertyOptional({ + description: "New maximum number of times the link can be used", + type: Number, + example: 10, + minimum: 1, + }) + maxUsageCount?: number; +} + + diff --git a/packages/platform/types/event-types/outputs/private-link.output.ts b/packages/platform/types/event-types/outputs/private-link.output.ts new file mode 100644 index 00000000000000..984add1df52170 --- /dev/null +++ b/packages/platform/types/event-types/outputs/private-link.output.ts @@ -0,0 +1,132 @@ +import { ApiExtraModels, ApiProperty, getSchemaPath } from "@nestjs/swagger"; + +// Base class with common properties +abstract class BasePrivateLinkOutput { + @ApiProperty({ + description: "The private link ID", + type: String, + example: "abc123def456", + }) + linkId!: string; + + @ApiProperty({ + description: "Event type ID this link belongs to", + type: Number, + example: 123, + }) + eventTypeId!: number; + + @ApiProperty({ + description: "Whether the link is currently expired", + type: Boolean, + example: false, + }) + isExpired!: boolean; + + @ApiProperty({ + description: "Full booking URL for this private link", + type: String, + format: "uri", + example: "https://cal.com/d/abc123def456/30min", + }) + bookingUrl!: string; +} + +// Time-based private link (expires at a specific date) +export class TimeBasedPrivateLinkOutput extends BasePrivateLinkOutput { + @ApiProperty({ + description: "Expiration date for this time-based link", + type: String, + format: "date-time", + example: "2025-12-31T23:59:59.000Z", + }) + expiresAt!: Date; +} + +// Usage-based private link (expires after N uses) +export class UsageBasedPrivateLinkOutput extends BasePrivateLinkOutput { + @ApiProperty({ + description: "Maximum number of times this link can be used", + type: Number, + example: 10, + }) + maxUsageCount!: number; + + @ApiProperty({ + description: "Current usage count for this link", + type: Number, + example: 3, + }) + usageCount!: number; +} + +// Union type for either time-based or usage-based links +export type PrivateLinkOutput = TimeBasedPrivateLinkOutput | UsageBasedPrivateLinkOutput; + +@ApiExtraModels(TimeBasedPrivateLinkOutput, UsageBasedPrivateLinkOutput) +export class CreatePrivateLinkOutput { + @ApiProperty({ description: "Response status", example: "success" }) + status!: string; + + @ApiProperty({ + description: "Created private link data (either time-based or usage-based)", + oneOf: [ + { $ref: getSchemaPath(TimeBasedPrivateLinkOutput) }, + { $ref: getSchemaPath(UsageBasedPrivateLinkOutput) }, + ], + }) + data!: PrivateLinkOutput; +} + +@ApiExtraModels(TimeBasedPrivateLinkOutput, UsageBasedPrivateLinkOutput) +export class GetPrivateLinksOutput { + @ApiProperty({ description: "Response status", example: "success" }) + status!: string; + + @ApiProperty({ + description: "Array of private links for the event type (mix of time-based and usage-based)", + type: "array", + items: { + oneOf: [ + { $ref: getSchemaPath(TimeBasedPrivateLinkOutput) }, + { $ref: getSchemaPath(UsageBasedPrivateLinkOutput) }, + ], + }, + }) + data!: PrivateLinkOutput[]; +} + +@ApiExtraModels(TimeBasedPrivateLinkOutput, UsageBasedPrivateLinkOutput) +export class UpdatePrivateLinkOutput { + @ApiProperty({ description: "Response status", example: "success" }) + status!: string; + + @ApiProperty({ + description: "Updated private link data (either time-based or usage-based)", + oneOf: [ + { $ref: getSchemaPath(TimeBasedPrivateLinkOutput) }, + { $ref: getSchemaPath(UsageBasedPrivateLinkOutput) }, + ], + }) + data!: PrivateLinkOutput; +} + +export class DeletePrivateLinkOutput { + @ApiProperty({ description: "Response status", example: "success" }) + status!: string; + + @ApiProperty({ + description: "Deleted link information", + type: "object", + properties: { + linkId: { type: "string", example: "abc123def456" }, + message: { type: "string", example: "Private link deleted successfully" }, + }, + }) + data!: { + linkId: string; + message: string; + }; +} + + diff --git a/packages/platform/types/index.ts b/packages/platform/types/index.ts index eede061db00a55..002c4ec17a4f1a 100644 --- a/packages/platform/types/index.ts +++ b/packages/platform/types/index.ts @@ -7,6 +7,7 @@ export * from "./bookings"; export * from "./billing"; export * from "./schedules"; export * from "./event-types"; +export * from "./event-types/inputs/private-link.input"; export * from "./organizations"; export * from "./teams"; export * from "./embed"; diff --git a/yarn.lock b/yarn.lock index 55eea1c57bc655..700323729b5e69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2500,7 +2500,7 @@ __metadata: "@axiomhq/winston": ^1.2.0 "@calcom/platform-constants": "*" "@calcom/platform-enums": "*" - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.291" + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.294" "@calcom/platform-types": "*" "@calcom/platform-utils": "*" "@calcom/prisma": "*" @@ -3558,13 +3558,13 @@ __metadata: languageName: unknown linkType: soft -"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.291": - version: 0.0.291 - resolution: "@calcom/platform-libraries@npm:0.0.291" +"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.294": + version: 0.0.294 + resolution: "@calcom/platform-libraries@npm:0.0.294" dependencies: "@calcom/features": "*" "@calcom/lib": "*" - checksum: 09cb5db584698acccd4447b4007df2fe2d66352c6ba823ef8c354fd3458e59414a9502f6950438e1260df71613b95f1e5a14bb54e2c7ffe6cc1dafe8b643fb9d + checksum: ce7beda30e629e87d560386bf1f117280ec3466ba7dfa2089de79c2d03c46d24ee3a5388a63974ba084b6624e863c2feb5e02f42ef08c72daefc7c51e771d5f8 languageName: node linkType: hard