From 5cdddd8f9fbff3d1e6ebf533bb7932d279e926f6 Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Thu, 7 Aug 2025 09:11:38 +0400 Subject: [PATCH 01/15] --init --- .../controllers/event-types.controller.ts | 88 +++- .../event-types.module.ts | 2 + .../services/private-links.service.ts | 128 ++++++ apps/api/v2/swagger/documentation.json | 387 ++++++++++++++++++ apps/api/v2/tsconfig.json | 3 +- docs/api-reference/v2/openapi.json | 387 ++++++++++++++++++ packages/platform/libraries/package.json | 10 +- packages/platform/libraries/private-links.ts | 214 ++++++++++ packages/platform/libraries/vite.config.js | 1 + .../event-types_2024_06_14/inputs/index.ts | 1 + .../inputs/private-link.input.ts | 99 +++++ .../event-types_2024_06_14/outputs/index.ts | 1 + .../outputs/private-link.output.ts | 122 ++++++ 13 files changed, 1440 insertions(+), 3 deletions(-) create mode 100644 apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts create mode 100644 packages/platform/libraries/private-links.ts create mode 100644 packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts create mode 100644 packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts 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..d9a13dfa0742bc 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 { PrivateLinksService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links.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,12 @@ import { GetEventTypesQuery_2024_06_14, CreateEventTypeInput_2024_06_14, EventTypeOutput_2024_06_14, + CreatePrivateLinkInput_2024_06_14, + UpdatePrivateLinkInput_2024_06_14, + CreatePrivateLinkOutput_2024_06_14, + GetPrivateLinksOutput_2024_06_14, + UpdatePrivateLinkOutput_2024_06_14, + DeletePrivateLinkOutput_2024_06_14, } from "@calcom/platform-types"; @Controller({ @@ -62,7 +69,8 @@ export class EventTypesController_2024_06_14 { constructor( private readonly eventTypesService: EventTypesService_2024_06_14, private readonly inputEventTypesService: InputEventTypesService_2024_06_14, - private readonly eventTypeResponseTransformPipe: EventTypeResponseTransformPipe + private readonly eventTypeResponseTransformPipe: EventTypeResponseTransformPipe, + private readonly privateLinksService: PrivateLinksService_2024_06_14 ) {} @Post("/") @@ -186,4 +194,82 @@ export class EventTypesController_2024_06_14 { }, }; } + + // Private Links Endpoints + + @Post("/:eventTypeId/private-links") + @Permissions([EVENT_TYPE_WRITE]) + @UseGuards(ApiAuthGuard) + @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_2024_06_14, + @GetUser("id") userId: number + ): Promise { + const privateLink = await this.privateLinksService.createPrivateLink(eventTypeId, userId, body); + + return { + status: SUCCESS_STATUS, + data: privateLink, + }; + } + + @Get("/:eventTypeId/private-links") + @Permissions([EVENT_TYPE_READ]) + @UseGuards(ApiAuthGuard) + @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("/:eventTypeId/private-links/:linkId") + @Permissions([EVENT_TYPE_WRITE]) + @UseGuards(ApiAuthGuard) + @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: Omit, + @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("/:eventTypeId/private-links/:linkId") + @Permissions([EVENT_TYPE_WRITE]) + @UseGuards(ApiAuthGuard) + @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/event-types_2024_06_14/event-types.module.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts index 23b8cda8e350e4..8ba8225d0fa208 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts @@ -6,6 +6,7 @@ import { EventTypeResponseTransformPipe } from "@/ee/event-types/event-types_202 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 { OutputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/output-event-types.service"; +import { PrivateLinksService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links.service"; import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.repository"; import { AppsRepository } from "@/modules/apps/apps.repository"; import { CredentialsRepository } from "@/modules/credentials/credentials.repository"; @@ -24,6 +25,7 @@ import { Module } from "@nestjs/common"; EventTypesService_2024_06_14, InputEventTypesService_2024_06_14, OutputEventTypesService_2024_06_14, + PrivateLinksService_2024_06_14, UsersRepository, UsersService, SchedulesRepository_2024_06_11, diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts new file mode 100644 index 00000000000000..7365ff8c92c1d1 --- /dev/null +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts @@ -0,0 +1,128 @@ +import { Injectable, NotFoundException, BadRequestException } from "@nestjs/common"; + +import { + createPrivateLink, + getPrivateLinks, + updatePrivateLink, + deletePrivateLink, + type PrivateLinkData, + type CreatePrivateLinkInput, + type UpdatePrivateLinkInput, +} from "@calcom/platform-libraries/private-links"; +import { + CreatePrivateLinkInput_2024_06_14, + UpdatePrivateLinkInput_2024_06_14, + PrivateLinkOutput_2024_06_14, +} from "@calcom/platform-types"; + +@Injectable() +export class PrivateLinksService_2024_06_14 { + constructor() {} + + /** + * Transform platform library input to API v2 input + */ + private transformInputToLibrary(input: CreatePrivateLinkInput_2024_06_14): CreatePrivateLinkInput { + return { + expiresAt: input.expiresAt, + maxUsageCount: input.maxUsageCount, + }; + } + + /** + * Transform platform library output to API v2 output + */ + private transformOutputFromLibrary(data: PrivateLinkData): PrivateLinkOutput_2024_06_14 { + const result: PrivateLinkOutput_2024_06_14 = { + id: data.id.toString(), + link: data.link, + eventTypeId: data.eventTypeId, + isExpired: data.isExpired, + bookingUrl: data.bookingUrl, + }; + + // Only include expiresAt if it has a value + if (data.expiresAt !== null && data.expiresAt !== undefined) { + result.expiresAt = data.expiresAt; + } + + // Only include maxUsageCount and usageCount if this is not a time-based expiration link + if (!data.expiresAt) { + if (data.maxUsageCount !== null && data.maxUsageCount !== undefined) { + result.maxUsageCount = data.maxUsageCount; + } + if (data.usageCount !== null && data.usageCount !== undefined) { + result.usageCount = data.usageCount; + } + } + + return result; + } + + async createPrivateLink( + eventTypeId: number, + userId: number, + input: CreatePrivateLinkInput_2024_06_14 + ): Promise { + try { + const libraryInput = this.transformInputToLibrary(input); + const result = await createPrivateLink(eventTypeId, userId, libraryInput); + return this.transformOutputFromLibrary(result); + } 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 results = await getPrivateLinks(eventTypeId, userId); + return results.map((result) => this.transformOutputFromLibrary(result)); + } 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_2024_06_14 + ): Promise { + try { + const libraryInput: UpdatePrivateLinkInput = { + linkId: input.linkId, + expiresAt: input.expiresAt, + maxUsageCount: input.maxUsageCount, + }; + const result = await updatePrivateLink(eventTypeId, userId, libraryInput); + return this.transformOutputFromLibrary(result); + } 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 { + await deletePrivateLink(eventTypeId, userId, linkId); + } 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/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 8fa97692b50f1c..1668d68a037a83 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -9632,6 +9632,228 @@ ] } }, + "/v2/event-types/{eventTypeId}/private-links": { + "post": { + "operationId": "EventTypesController_2024_06_14_createPrivateLink", + "summary": "Create a private link for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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_2024_06_14" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePrivateLinkOutput_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types" + ] + }, + "get": { + "operationId": "EventTypesController_2024_06_14_getPrivateLinks", + "summary": "Get all private links for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types" + ] + } + }, + "/v2/event-types/{eventTypeId}/private-links/{linkId}": { + "patch": { + "operationId": "EventTypesController_2024_06_14_updatePrivateLink", + "summary": "Update a private link for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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/UpdatePrivateLinkOutput_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types" + ] + }, + "delete": { + "operationId": "EventTypesController_2024_06_14_deletePrivateLink", + "summary": "Delete a private link for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types" + ] + } + }, "/v2/event-types/{eventTypeId}/webhooks": { "post": { "operationId": "EventTypeWebhooksController_createEventTypeWebhook", @@ -18071,6 +18293,171 @@ "data" ] }, + "CreatePrivateLinkInput_2024_06_14": { + "type": "object", + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "Expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times the link can be used", + "example": 10, + "minimum": 1 + } + } + }, + "PrivateLinkOutput_2024_06_14": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The private link ID", + "example": "abc123def456" + }, + "link": { + "type": "string", + "description": "The private link hash", + "example": "abc123def456" + }, + "expiresAt": { + "format": "date-time", + "type": "string", + "nullable": true, + "description": "Expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "nullable": true, + "description": "Maximum number of times the link can be used. Only present for usage-based links (not time-based expiration links)", + "example": 10 + }, + "usageCount": { + "type": "number", + "description": "Current usage count. Only present for usage-based links (not time-based expiration links)", + "example": 3 + }, + "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", + "example": "https://cal.com/d/abc123def456/30min" + } + }, + "required": [ + "id", + "link", + "eventTypeId", + "isExpired", + "bookingUrl" + ] + }, + "CreatePrivateLinkOutput_2024_06_14": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Created private link data", + "allOf": [ + { + "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "GetPrivateLinksOutput_2024_06_14": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Array of private links for the event type", + "type": "array", + "items": { + "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + } + } + }, + "required": [ + "status", + "data" + ] + }, + "UpdatePrivateLinkOutput_2024_06_14": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Updated private link data", + "allOf": [ + { + "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "DeletePrivateLinkOutput_2024_06_14": { + "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" + ] + }, "SelectedCalendarsInputDto": { "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..0d1cbeb08596af 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -9187,6 +9187,228 @@ "tags": ["Event Types"] } }, + "/v2/event-types/{eventTypeId}/private-links": { + "post": { + "operationId": "EventTypesController_2024_06_14_createPrivateLink", + "summary": "Create a private link for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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_2024_06_14" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePrivateLinkOutput_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types" + ] + }, + "get": { + "operationId": "EventTypesController_2024_06_14_getPrivateLinks", + "summary": "Get all private links for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types" + ] + } + }, + "/v2/event-types/{eventTypeId}/private-links/{linkId}": { + "patch": { + "operationId": "EventTypesController_2024_06_14_updatePrivateLink", + "summary": "Update a private link for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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/UpdatePrivateLinkOutput_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types" + ] + }, + "delete": { + "operationId": "EventTypesController_2024_06_14_deletePrivateLink", + "summary": "Delete a private link for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types" + ] + } + }, "/v2/event-types/{eventTypeId}/webhooks": { "post": { "operationId": "EventTypeWebhooksController_createEventTypeWebhook", @@ -16931,6 +17153,171 @@ }, "required": ["status", "data"] }, + "CreatePrivateLinkInput_2024_06_14": { + "type": "object", + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "Expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times the link can be used", + "example": 10, + "minimum": 1 + } + } + }, + "PrivateLinkOutput_2024_06_14": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The private link ID", + "example": "abc123def456" + }, + "link": { + "type": "string", + "description": "The private link hash", + "example": "abc123def456" + }, + "expiresAt": { + "format": "date-time", + "type": "string", + "nullable": true, + "description": "Expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "nullable": true, + "description": "Maximum number of times the link can be used. Only present for usage-based links (not time-based expiration links)", + "example": 10 + }, + "usageCount": { + "type": "number", + "description": "Current usage count. Only present for usage-based links (not time-based expiration links)", + "example": 3 + }, + "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", + "example": "https://cal.com/d/abc123def456/30min" + } + }, + "required": [ + "id", + "link", + "eventTypeId", + "isExpired", + "bookingUrl" + ] + }, + "CreatePrivateLinkOutput_2024_06_14": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Created private link data", + "allOf": [ + { + "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "GetPrivateLinksOutput_2024_06_14": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Array of private links for the event type", + "type": "array", + "items": { + "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + } + } + }, + "required": [ + "status", + "data" + ] + }, + "UpdatePrivateLinkOutput_2024_06_14": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Response status", + "example": "success" + }, + "data": { + "description": "Updated private link data", + "allOf": [ + { + "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "DeletePrivateLinkOutput_2024_06_14": { + "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" + ] + }, "SelectedCalendarsInputDto": { "type": "object", "properties": { diff --git a/packages/platform/libraries/package.json b/packages/platform/libraries/package.json index 0ae5be91e923b2..b53cb026bea44c 100644 --- a/packages/platform/libraries/package.json +++ b/packages/platform/libraries/package.json @@ -1,6 +1,6 @@ { "name": "@calcom/platform-libraries", - "version": "0.0.0", + "version": "0.0.288", "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", @@ -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..a0c28e4a1fe043 --- /dev/null +++ b/packages/platform/libraries/private-links.ts @@ -0,0 +1,214 @@ +import { generateHashedLink } from "@calcom/lib/generateHashedLink"; +import { isLinkExpired as utilsIsLinkExpired } from "@calcom/lib/hashedLinksUtils"; +import { HashedLinkService } from "@calcom/lib/server/service/hashedLinkService"; +import { HashedLinkRepository } from "@calcom/lib/server/repository/hashedLinkRepository"; + +export type PrivateLinkData = { + id: string | number; + link: string; + expiresAt?: Date | null; + maxUsageCount?: number | null; + usageCount?: number; + eventTypeId: number; + isExpired: boolean; + bookingUrl: string; +}; + +export type CreatePrivateLinkInput = { + expiresAt?: Date | null; + maxUsageCount?: number | null; +}; + +export type UpdatePrivateLinkInput = { + linkId: string; + expiresAt?: Date | null; + maxUsageCount?: number | null; +}; + +export type BulkUpdatePrivateLinkInput = { + privateLinks: Array<{ + link: string; + expiresAt?: Date | null; + maxUsageCount?: number | null; + }>; +}; + +/** + * Platform library service for managing private links + * This wraps the existing HashedLinkService and HashedLinkRepository + */ +export class PlatformPrivateLinksService { + private readonly hashedLinkService: HashedLinkService; + private readonly hashedLinkRepository: HashedLinkRepository; + + constructor() { + this.hashedLinkService = new HashedLinkService(); + this.hashedLinkRepository = HashedLinkRepository.create(); + } + + async createPrivateLink( + eventTypeId: number, + userId: number, + input: CreatePrivateLinkInput + ): Promise { + // Generate a new hashed link ID + const linkId = generateHashedLink(userId); + + // Create the link + const createdLink = await this.hashedLinkRepository.createLink(eventTypeId, { + link: linkId, + expiresAt: input.expiresAt || null, + maxUsageCount: input.maxUsageCount || null, + }); + + return this.formatPrivateLinkOutput(createdLink, eventTypeId); + } + + async getPrivateLinks(eventTypeId: number, userId: number): Promise { + // First verify that the user owns the event type + await this.checkUserPermission(eventTypeId, userId); + + const links = await this.hashedLinkRepository.findLinksByEventTypeId(eventTypeId); + + return links.map((link) => this.formatPrivateLinkOutput(link, eventTypeId)); + } + + async updatePrivateLink( + eventTypeId: number, + userId: number, + input: UpdatePrivateLinkInput + ): Promise { + // First verify that the user has permission to update this link + await this.checkUserPermission(eventTypeId, userId); + + // Verify the link exists and belongs to this event type + const existingLink = await this.hashedLinkRepository.findLinkWithEventTypeDetails(input.linkId); + + if (!existingLink || existingLink.eventTypeId !== eventTypeId) { + throw new Error(`Private link with ID ${input.linkId} not found for this event type`); + } + + // Update the link + await this.hashedLinkRepository.updateLink(eventTypeId, { + link: input.linkId, + expiresAt: input.expiresAt || null, + maxUsageCount: input.maxUsageCount || null, + }); + + // Fetch the updated link + const updatedLink = await this.hashedLinkRepository.findLinkWithEventTypeDetails(input.linkId); + + if (!updatedLink) { + throw new Error(`Failed to retrieve updated link`); + } + + return this.formatPrivateLinkOutput(updatedLink, eventTypeId); + } + + async deletePrivateLink(eventTypeId: number, userId: number, linkId: string): Promise { + // First verify that the user has permission to delete this link + await this.checkUserPermission(eventTypeId, userId); + + // Verify the link exists and belongs to this event type + const existingLink = await this.hashedLinkRepository.findLinkWithEventTypeDetails(linkId); + + if (!existingLink || existingLink.eventTypeId !== eventTypeId) { + throw new Error(`Private link with ID ${linkId} not found for this event type`); + } + + // Delete the link + await this.hashedLinkRepository.deleteLinks(eventTypeId, [linkId]); + } + + async bulkUpdatePrivateLinks( + eventTypeId: number, + userId: number, + input: BulkUpdatePrivateLinkInput + ): Promise { + // First verify that the user has permission + await this.checkUserPermission(eventTypeId, userId); + + // Get existing links for this event type + const existingLinks = await this.hashedLinkRepository.findLinksByEventTypeId(eventTypeId); + const existingLinkIds = existingLinks.map((link) => link.link); + + // Use the HashedLinkService to handle the bulk operation + const normalizedLinks = input.privateLinks.map((linkData) => ({ + link: linkData.link, + expiresAt: linkData.expiresAt || null, + maxUsageCount: linkData.maxUsageCount || null, + })); + + await this.hashedLinkService.handleMultiplePrivateLinks({ + eventTypeId, + multiplePrivateLinks: normalizedLinks, + connectedMultiplePrivateLinks: existingLinkIds, + }); + + // Return the updated links + return this.getPrivateLinks(eventTypeId, userId); + } + + private async checkUserPermission(eventTypeId: number, userId: number): Promise { + // This is a simplified check - in a real implementation, you might want to + // check through the event types service to ensure proper ownership validation + const links = await this.hashedLinkRepository.findLinksByEventTypeId(eventTypeId); + + if (links.length > 0) { + // If links exist, we can check permissions through the existing hashedLinkService + const firstLink = links[0]; + const linkWithDetails = await this.hashedLinkRepository.findLinkWithEventTypeDetails(firstLink.link); + + if (linkWithDetails) { + const hasPermission = await this.hashedLinkService.checkUserPermissionForLink( + { eventType: linkWithDetails.eventType }, + userId + ); + + if (!hasPermission) { + throw new Error(`User does not have permission to access event type ${eventTypeId}`); + } + } + } + // If no links exist yet, we assume the user has permission to create them + // In a production environment, you'd want to verify event type ownership here + } + + private formatPrivateLinkOutput( + link: any, + eventTypeId: number, + eventTypeSlug?: string + ): PrivateLinkData { + const isExpired = utilsIsLinkExpired(link); + const bookingUrl = `${process.env.NEXT_PUBLIC_WEBAPP_URL || "https://cal.com"}/d/${link.link}${ + eventTypeSlug ? `/${eventTypeSlug}` : "" + }`; + + return { + id: link.id?.toString() || link.link, + link: link.link, + expiresAt: link.expiresAt, + maxUsageCount: link.maxUsageCount, + usageCount: link.usageCount || 0, + eventTypeId, + isExpired, + bookingUrl, + }; + } +} + +// Export the service instance +export const platformPrivateLinksService = new PlatformPrivateLinksService(); + +// Export individual functions for convenience +export const createPrivateLink = (eventTypeId: number, userId: number, input: CreatePrivateLinkInput) => + platformPrivateLinksService.createPrivateLink(eventTypeId, userId, input); + +export const getPrivateLinks = (eventTypeId: number, userId: number) => + platformPrivateLinksService.getPrivateLinks(eventTypeId, userId); + +export const updatePrivateLink = (eventTypeId: number, userId: number, input: UpdatePrivateLinkInput) => + platformPrivateLinksService.updatePrivateLink(eventTypeId, userId, input); + +export const deletePrivateLink = (eventTypeId: number, userId: number, linkId: string) => + platformPrivateLinksService.deletePrivateLink(eventTypeId, userId, linkId); 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/event-types_2024_06_14/inputs/index.ts b/packages/platform/types/event-types/event-types_2024_06_14/inputs/index.ts index 4461d87e0b99f0..955801d8d0eeec 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/inputs/index.ts +++ b/packages/platform/types/event-types/event-types_2024_06_14/inputs/index.ts @@ -13,3 +13,4 @@ export * from "./event-type-color.input"; export * from "./seats.input"; export * from "./destination-calendar.input"; export * from "./disabled.input"; +export * from "./private-link.input"; diff --git a/packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts b/packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts new file mode 100644 index 00000000000000..101cfd7a120f38 --- /dev/null +++ b/packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts @@ -0,0 +1,99 @@ +import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { Type } from "class-transformer"; +import { IsString, IsOptional, IsDate, IsInt, Min, IsArray, ValidateNested } from "class-validator"; + +export class CreatePrivateLinkInput_2024_06_14 { + @IsOptional() + @IsDate() + @Type(() => Date) + @ApiPropertyOptional({ + description: "Expiration date for time-based links", + type: Date, + example: "2024-12-31T23:59:59.000Z", + }) + expiresAt?: Date; + + @IsOptional() + @IsInt() + @Min(1) + @ApiPropertyOptional({ + description: "Maximum number of times the link can be used", + type: Number, + example: 10, + minimum: 1, + }) + maxUsageCount?: number; +} + +export class UpdatePrivateLinkInput_2024_06_14 { + @IsString() + @ApiProperty({ + description: "The private link ID 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; +} + +export class PrivateLinkData { + @IsString() + @ApiProperty({ + description: "The private link ID", + type: String, + example: "abc123def456", + }) + link!: string; + + @IsOptional() + @IsDate() + @Type(() => Date) + @ApiPropertyOptional({ + description: "Expiration date for time-based links", + type: Date, + example: "2024-12-31T23:59:59.000Z", + }) + expiresAt?: Date; + + @IsOptional() + @IsInt() + @Min(1) + @ApiPropertyOptional({ + description: "Maximum number of times the link can be used", + type: Number, + example: 10, + minimum: 1, + }) + maxUsageCount?: number; +} + +export class BulkUpdatePrivateLinksInput_2024_06_14 { + @IsArray() + @ValidateNested({ each: true }) + @Type(() => PrivateLinkData) + @ApiProperty({ + description: "Array of private links to create/update", + type: [PrivateLinkData], + }) + privateLinks!: PrivateLinkData[]; +} diff --git a/packages/platform/types/event-types/event-types_2024_06_14/outputs/index.ts b/packages/platform/types/event-types/event-types_2024_06_14/outputs/index.ts index 06fbdb43b0dc17..f74b62edd0324a 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/outputs/index.ts +++ b/packages/platform/types/event-types/event-types_2024_06_14/outputs/index.ts @@ -1,3 +1,4 @@ export * from "./event-type.output"; export * from "./booking-fields.output"; export * from "./locations.output"; +export * from "./private-link.output"; diff --git a/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts b/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts new file mode 100644 index 00000000000000..bac4b803d84747 --- /dev/null +++ b/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts @@ -0,0 +1,122 @@ +import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; + +export class PrivateLinkOutput_2024_06_14 { + @ApiProperty({ + description: "The private link ID", + type: String, + example: "abc123def456", + }) + id!: string; + + @ApiProperty({ + description: "The private link hash", + type: String, + example: "abc123def456", + }) + link!: string; + + @ApiPropertyOptional({ + description: "Expiration date for time-based links", + type: Date, + example: "2024-12-31T23:59:59.000Z", + }) + expiresAt?: Date | null; + + @ApiPropertyOptional({ + description: "Maximum number of times the link can be used. Only present for usage-based links (not time-based expiration links)", + type: Number, + example: 10, + }) + maxUsageCount?: number | null; + + @ApiPropertyOptional({ + description: "Current usage count. Only present for usage-based links (not time-based expiration links)", + type: Number, + example: 3, + }) + usageCount?: number; + + @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, + example: "https://cal.com/d/abc123def456/30min", + }) + bookingUrl!: string; +} + +export class CreatePrivateLinkOutput_2024_06_14 { + @ApiProperty({ + description: "Response status", + example: "success", + }) + status!: string; + + @ApiProperty({ + description: "Created private link data", + type: PrivateLinkOutput_2024_06_14, + }) + data!: PrivateLinkOutput_2024_06_14; +} + +export class GetPrivateLinksOutput_2024_06_14 { + @ApiProperty({ + description: "Response status", + example: "success", + }) + status!: string; + + @ApiProperty({ + description: "Array of private links for the event type", + type: [PrivateLinkOutput_2024_06_14], + }) + data!: PrivateLinkOutput_2024_06_14[]; +} + +export class UpdatePrivateLinkOutput_2024_06_14 { + @ApiProperty({ + description: "Response status", + example: "success", + }) + status!: string; + + @ApiProperty({ + description: "Updated private link data", + type: PrivateLinkOutput_2024_06_14, + }) + data!: PrivateLinkOutput_2024_06_14; +} + +export class DeletePrivateLinkOutput_2024_06_14 { + @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; + }; +} From 2323a8230bdab25e5008c97a7f8043f4d9f7cfda Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Thu, 7 Aug 2025 16:04:15 +0400 Subject: [PATCH 02/15] address change requests --- .../event-types-private-links.controller.ts | 131 ++++++ .../controllers/event-types.controller.ts | 90 +---- .../event-types.module.ts | 7 +- .../services/private-links-input.service.ts | 35 ++ .../services/private-links-output.service.ts | 48 +++ .../services/private-links.service.ts | 69 +--- apps/api/v2/swagger/documentation.json | 366 ++++++++--------- docs/api-reference/v2/openapi.json | 378 +++++++++--------- packages/platform/libraries/package.json | 2 +- packages/platform/libraries/private-links.ts | 74 +--- .../inputs/private-link.input.ts | 44 +- .../outputs/private-link.output.ts | 80 ++-- yarn.lock | 10 +- 13 files changed, 688 insertions(+), 646 deletions(-) create mode 100644 apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types-private-links.controller.ts create mode 100644 apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-input.service.ts create mode 100644 apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-output.service.ts diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types-private-links.controller.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types-private-links.controller.ts new file mode 100644 index 00000000000000..67e526ad0cd3bd --- /dev/null +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types-private-links.controller.ts @@ -0,0 +1,131 @@ +import { PrivateLinksService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links.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"; +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 { + Controller, + UseGuards, + Get, + Param, + Post, + Body, + Patch, + Delete, + ParseIntPipe, +} from "@nestjs/common"; +import { ApiHeader, ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; + +import { + EVENT_TYPE_READ, + EVENT_TYPE_WRITE, + SUCCESS_STATUS, + VERSION_2024_06_14, +} from "@calcom/platform-constants"; +import { + CreatePrivateLinkInput_2024_06_14, + UpdatePrivateLinkInput_2024_06_14, + CreatePrivateLinkOutput_2024_06_14, + GetPrivateLinksOutput_2024_06_14, + UpdatePrivateLinkOutput_2024_06_14, + DeletePrivateLinkOutput_2024_06_14, + TimeBasedPrivateLinkOutput_2024_06_14, + UsageBasedPrivateLinkOutput_2024_06_14, +} from "@calcom/platform-types"; + +@Controller({ + path: "/v2/event-types/:eventTypeId/private-links", + version: VERSION_2024_06_14_VALUE, +}) +@UseGuards(PermissionsGuard) +@DocsTags("Event Types Private Links") +@ApiHeader({ + name: "cal-api-version", + description: `Must be set to ${VERSION_2024_06_14}`, + example: VERSION_2024_06_14, + required: true, + schema: { + default: VERSION_2024_06_14, + }, +}) +export class EventTypesPrivateLinksController_2024_06_14 { + constructor(private readonly privateLinksService: PrivateLinksService_2024_06_14) {} + + @Post("/") + @Permissions([EVENT_TYPE_WRITE]) + @UseGuards(ApiAuthGuard) + @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_2024_06_14, + @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) + @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) + @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: Omit, + @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) + @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/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 d9a13dfa0742bc..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,7 +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 { PrivateLinksService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links.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"; @@ -42,12 +42,7 @@ import { GetEventTypesQuery_2024_06_14, CreateEventTypeInput_2024_06_14, EventTypeOutput_2024_06_14, - CreatePrivateLinkInput_2024_06_14, - UpdatePrivateLinkInput_2024_06_14, - CreatePrivateLinkOutput_2024_06_14, - GetPrivateLinksOutput_2024_06_14, - UpdatePrivateLinkOutput_2024_06_14, - DeletePrivateLinkOutput_2024_06_14, + } from "@calcom/platform-types"; @Controller({ @@ -69,8 +64,7 @@ export class EventTypesController_2024_06_14 { constructor( private readonly eventTypesService: EventTypesService_2024_06_14, private readonly inputEventTypesService: InputEventTypesService_2024_06_14, - private readonly eventTypeResponseTransformPipe: EventTypeResponseTransformPipe, - private readonly privateLinksService: PrivateLinksService_2024_06_14 + private readonly eventTypeResponseTransformPipe: EventTypeResponseTransformPipe ) {} @Post("/") @@ -194,82 +188,4 @@ export class EventTypesController_2024_06_14 { }, }; } - - // Private Links Endpoints - - @Post("/:eventTypeId/private-links") - @Permissions([EVENT_TYPE_WRITE]) - @UseGuards(ApiAuthGuard) - @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_2024_06_14, - @GetUser("id") userId: number - ): Promise { - const privateLink = await this.privateLinksService.createPrivateLink(eventTypeId, userId, body); - - return { - status: SUCCESS_STATUS, - data: privateLink, - }; - } - - @Get("/:eventTypeId/private-links") - @Permissions([EVENT_TYPE_READ]) - @UseGuards(ApiAuthGuard) - @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("/:eventTypeId/private-links/:linkId") - @Permissions([EVENT_TYPE_WRITE]) - @UseGuards(ApiAuthGuard) - @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: Omit, - @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("/:eventTypeId/private-links/:linkId") - @Permissions([EVENT_TYPE_WRITE]) - @UseGuards(ApiAuthGuard) - @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/event-types_2024_06_14/event-types.module.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts index 8ba8225d0fa208..85ed14f7a31edc 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts @@ -1,12 +1,15 @@ import { CalendarsRepository } from "@/ee/calendars/calendars.repository"; import { CalendarsService } from "@/ee/calendars/services/calendars.service"; import { EventTypesController_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/controllers/event-types.controller"; +import { EventTypesPrivateLinksController_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/controllers/event-types-private-links.controller"; import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.repository"; 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 { OutputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/output-event-types.service"; import { PrivateLinksService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links.service"; +import { PrivateLinksInputService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links-input.service"; +import { PrivateLinksOutputService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links-output.service"; import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.repository"; import { AppsRepository } from "@/modules/apps/apps.repository"; import { CredentialsRepository } from "@/modules/credentials/credentials.repository"; @@ -26,6 +29,8 @@ import { Module } from "@nestjs/common"; InputEventTypesService_2024_06_14, OutputEventTypesService_2024_06_14, PrivateLinksService_2024_06_14, + PrivateLinksInputService_2024_06_14, + PrivateLinksOutputService_2024_06_14, UsersRepository, UsersService, SchedulesRepository_2024_06_11, @@ -35,7 +40,7 @@ import { Module } from "@nestjs/common"; AppsRepository, CalendarsRepository, ], - controllers: [EventTypesController_2024_06_14], + controllers: [EventTypesController_2024_06_14, EventTypesPrivateLinksController_2024_06_14], exports: [ EventTypesService_2024_06_14, EventTypesRepository_2024_06_14, diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-input.service.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-input.service.ts new file mode 100644 index 00000000000000..8e700273a4ea9d --- /dev/null +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-input.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from "@nestjs/common"; + +import { + CreatePrivateLinkInput_2024_06_14, + UpdatePrivateLinkInput_2024_06_14, +} from "@calcom/platform-types"; + +@Injectable() +export class PrivateLinksInputService_2024_06_14 { + constructor() {} + + /** + * Transform API v2 input to platform library internal format + * Currently inputs are compatible, but this service allows for future transformations + */ + transformCreateInput(input: CreatePrivateLinkInput_2024_06_14): CreatePrivateLinkInput_2024_06_14 { + // Currently no transformation needed, but this allows for future changes + return { + expiresAt: input.expiresAt, + maxUsageCount: input.maxUsageCount, + }; + } + + /** + * Transform API v2 update input to platform library internal format + */ + transformUpdateInput(input: UpdatePrivateLinkInput_2024_06_14): UpdatePrivateLinkInput_2024_06_14 { + // Currently no transformation needed, but this allows for future changes + return { + linkId: input.linkId, + expiresAt: input.expiresAt, + maxUsageCount: input.maxUsageCount, + }; + } +} diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-output.service.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-output.service.ts new file mode 100644 index 00000000000000..7e96c64be75b81 --- /dev/null +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-output.service.ts @@ -0,0 +1,48 @@ +import { Injectable } from "@nestjs/common"; + +import { type PrivateLinkData } from "@calcom/platform-libraries/private-links"; +import { + PrivateLinkOutput_2024_06_14, + TimeBasedPrivateLinkOutput_2024_06_14, + UsageBasedPrivateLinkOutput_2024_06_14, +} from "@calcom/platform-types"; + +@Injectable() +export class PrivateLinksOutputService_2024_06_14 { + constructor() {} + + /** + * Transform platform library internal data to API v2 output + */ + transformToOutput(data: PrivateLinkData): PrivateLinkOutput_2024_06_14 { + const baseData = { + linkId: data.id.toString(), + link: data.link, + eventTypeId: data.eventTypeId, + isExpired: data.isExpired, + bookingUrl: data.bookingUrl, + }; + + // Return time-based link if expiresAt is set + if (data.expiresAt !== null && data.expiresAt !== undefined) { + return { + ...baseData, + expiresAt: data.expiresAt, + } as TimeBasedPrivateLinkOutput_2024_06_14; + } + + // Return usage-based link if maxUsageCount is set + return { + ...baseData, + maxUsageCount: data.maxUsageCount || 0, + usageCount: data.usageCount || 0, + } as UsageBasedPrivateLinkOutput_2024_06_14; + } + + /** + * Transform array of platform library internal data to API v2 outputs + */ + transformArrayToOutput(data: PrivateLinkData[]): PrivateLinkOutput_2024_06_14[] { + return data.map((item) => this.transformToOutput(item)); + } +} diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts index 7365ff8c92c1d1..82d5087996877e 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts @@ -5,9 +5,6 @@ import { getPrivateLinks, updatePrivateLink, deletePrivateLink, - type PrivateLinkData, - type CreatePrivateLinkInput, - type UpdatePrivateLinkInput, } from "@calcom/platform-libraries/private-links"; import { CreatePrivateLinkInput_2024_06_14, @@ -15,49 +12,15 @@ import { PrivateLinkOutput_2024_06_14, } from "@calcom/platform-types"; +import { PrivateLinksInputService_2024_06_14 } from "./private-links-input.service"; +import { PrivateLinksOutputService_2024_06_14 } from "./private-links-output.service"; + @Injectable() export class PrivateLinksService_2024_06_14 { - constructor() {} - - /** - * Transform platform library input to API v2 input - */ - private transformInputToLibrary(input: CreatePrivateLinkInput_2024_06_14): CreatePrivateLinkInput { - return { - expiresAt: input.expiresAt, - maxUsageCount: input.maxUsageCount, - }; - } - - /** - * Transform platform library output to API v2 output - */ - private transformOutputFromLibrary(data: PrivateLinkData): PrivateLinkOutput_2024_06_14 { - const result: PrivateLinkOutput_2024_06_14 = { - id: data.id.toString(), - link: data.link, - eventTypeId: data.eventTypeId, - isExpired: data.isExpired, - bookingUrl: data.bookingUrl, - }; - - // Only include expiresAt if it has a value - if (data.expiresAt !== null && data.expiresAt !== undefined) { - result.expiresAt = data.expiresAt; - } - - // Only include maxUsageCount and usageCount if this is not a time-based expiration link - if (!data.expiresAt) { - if (data.maxUsageCount !== null && data.maxUsageCount !== undefined) { - result.maxUsageCount = data.maxUsageCount; - } - if (data.usageCount !== null && data.usageCount !== undefined) { - result.usageCount = data.usageCount; - } - } - - return result; - } + constructor( + private readonly inputService: PrivateLinksInputService_2024_06_14, + private readonly outputService: PrivateLinksOutputService_2024_06_14 + ) {} async createPrivateLink( eventTypeId: number, @@ -65,9 +28,9 @@ export class PrivateLinksService_2024_06_14 { input: CreatePrivateLinkInput_2024_06_14 ): Promise { try { - const libraryInput = this.transformInputToLibrary(input); - const result = await createPrivateLink(eventTypeId, userId, libraryInput); - return this.transformOutputFromLibrary(result); + const transformedInput = this.inputService.transformCreateInput(input); + const result = await createPrivateLink(eventTypeId, userId, transformedInput); + return this.outputService.transformToOutput(result); } catch (error) { if (error instanceof Error) { throw new BadRequestException(error.message); @@ -79,7 +42,7 @@ export class PrivateLinksService_2024_06_14 { async getPrivateLinks(eventTypeId: number, userId: number): Promise { try { const results = await getPrivateLinks(eventTypeId, userId); - return results.map((result) => this.transformOutputFromLibrary(result)); + return this.outputService.transformArrayToOutput(results); } catch (error) { if (error instanceof Error) { throw new BadRequestException(error.message); @@ -94,13 +57,9 @@ export class PrivateLinksService_2024_06_14 { input: UpdatePrivateLinkInput_2024_06_14 ): Promise { try { - const libraryInput: UpdatePrivateLinkInput = { - linkId: input.linkId, - expiresAt: input.expiresAt, - maxUsageCount: input.maxUsageCount, - }; - const result = await updatePrivateLink(eventTypeId, userId, libraryInput); - return this.transformOutputFromLibrary(result); + const transformedInput = this.inputService.transformUpdateInput(input); + const result = await updatePrivateLink(eventTypeId, userId, transformedInput); + return this.outputService.transformToOutput(result); } catch (error) { if (error instanceof Error) { if (error.message.includes("not found")) { diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 1668d68a037a83..b2d27783f667d7 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -9632,19 +9632,18 @@ ] } }, - "/v2/event-types/{eventTypeId}/private-links": { + "/v2/event-types/{eventTypeId}/webhooks": { "post": { - "operationId": "EventTypesController_2024_06_14_createPrivateLink", - "summary": "Create a private link for an event type", + "operationId": "EventTypeWebhooksController_createEventTypeWebhook", + "summary": "Create a webhook", "parameters": [ { - "name": "cal-api-version", + "name": "Authorization", "in": "header", - "description": "Must be set to 2024-06-14", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", "required": true, "schema": { - "type": "string", - "default": "2024-06-14" + "type": "string" } }, { @@ -9654,15 +9653,6 @@ "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": { @@ -9670,7 +9660,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePrivateLinkInput_2024_06_14" + "$ref": "#/components/schemas/CreateWebhookInputDto" } } } @@ -9681,38 +9671,20 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" } } } } }, "tags": [ - "Event Types" + "Event Types / Webhooks" ] }, "get": { - "operationId": "EventTypesController_2024_06_14_getPrivateLinks", - "summary": "Get all private links for an event type", + "operationId": "EventTypeWebhooksController_getEventTypeWebhooks", + "summary": "Get all webhooks", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, - { - "name": "eventTypeId", - "required": true, - "in": "path", - "schema": { - "type": "number" - } - }, { "name": "Authorization", "in": "header", @@ -9721,39 +9693,6 @@ "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetPrivateLinksOutput_2024_06_14" - } - } - } - } - }, - "tags": [ - "Event Types" - ] - } - }, - "/v2/event-types/{eventTypeId}/private-links/{linkId}": { - "patch": { - "operationId": "EventTypesController_2024_06_14_updatePrivateLink", - "summary": "Update a private link for an event type", - "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } }, { "name": "eventTypeId", @@ -9764,20 +9703,28 @@ } }, { - "name": "linkId", - "required": true, - "in": "path", + "name": "take", + "required": false, + "in": "query", + "description": "Maximum number of items to return", + "example": 25, "schema": { - "type": "string" + "minimum": 1, + "maximum": 250, + "default": 250, + "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, + "name": "skip", + "required": false, + "in": "query", + "description": "Number of items to skip", + "example": 0, "schema": { - "type": "string" + "minimum": 0, + "default": 0, + "type": "number" } } ], @@ -9787,28 +9734,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdatePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/EventTypeWebhooksOutputResponseDto" } } } } }, "tags": [ - "Event Types" + "Event Types / Webhooks" ] }, "delete": { - "operationId": "EventTypesController_2024_06_14_deletePrivateLink", - "summary": "Delete a private link for an event type", + "operationId": "EventTypeWebhooksController_deleteAllEventTypeWebhooks", + "summary": "Delete all webhooks", "parameters": [ { - "name": "cal-api-version", + "name": "Authorization", "in": "header", - "description": "Must be set to 2024-06-14", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", "required": true, "schema": { - "type": "string", - "default": "2024-06-14" + "type": "string" } }, { @@ -9818,23 +9764,6 @@ "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": { @@ -9843,21 +9772,21 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeletePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/DeleteManyWebhooksOutputResponseDto" } } } } }, "tags": [ - "Event Types" + "Event Types / Webhooks" ] } }, - "/v2/event-types/{eventTypeId}/webhooks": { - "post": { - "operationId": "EventTypeWebhooksController_createEventTypeWebhook", - "summary": "Create a webhook", + "/v2/event-types/{eventTypeId}/webhooks/{webhookId}": { + "patch": { + "operationId": "EventTypeWebhooksController_updateEventTypeWebhook", + "summary": "Update a webhook", "parameters": [ { "name": "Authorization", @@ -9869,11 +9798,11 @@ } }, { - "name": "eventTypeId", + "name": "webhookId", "required": true, "in": "path", "schema": { - "type": "number" + "type": "string" } } ], @@ -9882,13 +9811,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWebhookInputDto" + "$ref": "#/components/schemas/UpdateWebhookInputDto" } } } }, "responses": { - "201": { + "200": { "description": "", "content": { "application/json": { @@ -9904,8 +9833,8 @@ ] }, "get": { - "operationId": "EventTypeWebhooksController_getEventTypeWebhooks", - "summary": "Get all webhooks", + "operationId": "EventTypeWebhooksController_getEventTypeWebhook", + "summary": "Get a webhook", "parameters": [ { "name": "Authorization", @@ -9915,39 +9844,6 @@ "schema": { "type": "string" } - }, - { - "name": "eventTypeId", - "required": true, - "in": "path", - "schema": { - "type": "number" - } - }, - { - "name": "take", - "required": false, - "in": "query", - "description": "Maximum number of items to return", - "example": 25, - "schema": { - "minimum": 1, - "maximum": 250, - "default": 250, - "type": "number" - } - }, - { - "name": "skip", - "required": false, - "in": "query", - "description": "Number of items to skip", - "example": 0, - "schema": { - "minimum": 0, - "default": 0, - "type": "number" - } } ], "responses": { @@ -9956,7 +9852,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EventTypeWebhooksOutputResponseDto" + "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" } } } @@ -9967,8 +9863,8 @@ ] }, "delete": { - "operationId": "EventTypeWebhooksController_deleteAllEventTypeWebhooks", - "summary": "Delete all webhooks", + "operationId": "EventTypeWebhooksController_deleteEventTypeWebhook", + "summary": "Delete a webhook", "parameters": [ { "name": "Authorization", @@ -9978,14 +9874,6 @@ "schema": { "type": "string" } - }, - { - "name": "eventTypeId", - "required": true, - "in": "path", - "schema": { - "type": "number" - } } ], "responses": { @@ -9994,7 +9882,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteManyWebhooksOutputResponseDto" + "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" } } } @@ -10005,24 +9893,34 @@ ] } }, - "/v2/event-types/{eventTypeId}/webhooks/{webhookId}": { - "patch": { - "operationId": "EventTypeWebhooksController_updateEventTypeWebhook", - "summary": "Update a webhook", + "/v2/event-types/{eventTypeId}/private-links": { + "post": { + "operationId": "EventTypesPrivateLinksController_2024_06_14_createPrivateLink", + "summary": "Create a private link for an event type", "parameters": [ { - "name": "Authorization", + "name": "cal-api-version", "in": "header", - "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "description": "Must be set to 2024-06-14", "required": true, "schema": { - "type": "string" + "type": "string", + "default": "2024-06-14" } }, { - "name": "webhookId", + "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" } @@ -10033,31 +9931,49 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWebhookInputDto" + "$ref": "#/components/schemas/CreatePrivateLinkInput_2024_06_14" } } } }, "responses": { - "200": { + "201": { "description": "", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" + "$ref": "#/components/schemas/CreatePrivateLinkOutput_2024_06_14" } } } } }, "tags": [ - "Event Types / Webhooks" + "Event Types Private Links" ] }, "get": { - "operationId": "EventTypeWebhooksController_getEventTypeWebhook", - "summary": "Get a webhook", + "operationId": "EventTypesPrivateLinksController_2024_06_14_getPrivateLinks", + "summary": "Get all private links for an event type", "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, { "name": "Authorization", "in": "header", @@ -10074,20 +9990,104 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" + "$ref": "#/components/schemas/GetPrivateLinksOutput_2024_06_14" } } } } }, "tags": [ - "Event Types / Webhooks" + "Event Types Private Links" + ] + } + }, + "/v2/event-types/{eventTypeId}/private-links/{linkId}": { + "patch": { + "operationId": "EventTypesPrivateLinksController_2024_06_14_updatePrivateLink", + "summary": "Update a private link for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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/UpdatePrivateLinkOutput_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" ] }, "delete": { - "operationId": "EventTypeWebhooksController_deleteEventTypeWebhook", - "summary": "Delete a webhook", + "operationId": "EventTypesPrivateLinksController_2024_06_14_deletePrivateLink", + "summary": "Delete a private link for an event type", "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "linkId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, { "name": "Authorization", "in": "header", @@ -10104,14 +10104,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" + "$ref": "#/components/schemas/DeletePrivateLinkOutput_2024_06_14" } } } } }, "tags": [ - "Event Types / Webhooks" + "Event Types Private Links" ] } }, diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index 0d1cbeb08596af..dab26ed482155b 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -9187,19 +9187,18 @@ "tags": ["Event Types"] } }, - "/v2/event-types/{eventTypeId}/private-links": { + "/v2/event-types/{eventTypeId}/webhooks": { "post": { - "operationId": "EventTypesController_2024_06_14_createPrivateLink", - "summary": "Create a private link for an event type", + "operationId": "EventTypeWebhooksController_createEventTypeWebhook", + "summary": "Create a webhook", "parameters": [ { - "name": "cal-api-version", + "name": "Authorization", "in": "header", - "description": "Must be set to 2024-06-14", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", "required": true, "schema": { - "type": "string", - "default": "2024-06-14" + "type": "string" } }, { @@ -9209,15 +9208,6 @@ "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": { @@ -9225,7 +9215,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePrivateLinkInput_2024_06_14" + "$ref": "#/components/schemas/CreateWebhookInputDto" } } } @@ -9236,38 +9226,18 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" } } } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types / Webhooks"] }, "get": { - "operationId": "EventTypesController_2024_06_14_getPrivateLinks", - "summary": "Get all private links for an event type", + "operationId": "EventTypeWebhooksController_getEventTypeWebhooks", + "summary": "Get all webhooks", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, - { - "name": "eventTypeId", - "required": true, - "in": "path", - "schema": { - "type": "number" - } - }, { "name": "Authorization", "in": "header", @@ -9276,39 +9246,6 @@ "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetPrivateLinksOutput_2024_06_14" - } - } - } - } - }, - "tags": [ - "Event Types" - ] - } - }, - "/v2/event-types/{eventTypeId}/private-links/{linkId}": { - "patch": { - "operationId": "EventTypesController_2024_06_14_updatePrivateLink", - "summary": "Update a private link for an event type", - "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } }, { "name": "eventTypeId", @@ -9319,20 +9256,28 @@ } }, { - "name": "linkId", - "required": true, - "in": "path", + "name": "take", + "required": false, + "in": "query", + "description": "Maximum number of items to return", + "example": 25, "schema": { - "type": "string" + "minimum": 1, + "maximum": 250, + "default": 250, + "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, + "name": "skip", + "required": false, + "in": "query", + "description": "Number of items to skip", + "example": 0, "schema": { - "type": "string" + "minimum": 0, + "default": 0, + "type": "number" } } ], @@ -9342,28 +9287,25 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdatePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/EventTypeWebhooksOutputResponseDto" } } } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types / Webhooks"] }, "delete": { - "operationId": "EventTypesController_2024_06_14_deletePrivateLink", - "summary": "Delete a private link for an event type", + "operationId": "EventTypeWebhooksController_deleteAllEventTypeWebhooks", + "summary": "Delete all webhooks", "parameters": [ { - "name": "cal-api-version", + "name": "Authorization", "in": "header", - "description": "Must be set to 2024-06-14", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", "required": true, "schema": { - "type": "string", - "default": "2024-06-14" + "type": "string" } }, { @@ -9373,23 +9315,6 @@ "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": { @@ -9398,21 +9323,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeletePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/DeleteManyWebhooksOutputResponseDto" } } } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types / Webhooks"] } }, - "/v2/event-types/{eventTypeId}/webhooks": { - "post": { - "operationId": "EventTypeWebhooksController_createEventTypeWebhook", - "summary": "Create a webhook", + "/v2/event-types/{eventTypeId}/webhooks/{webhookId}": { + "patch": { + "operationId": "EventTypeWebhooksController_updateEventTypeWebhook", + "summary": "Update a webhook", "parameters": [ { "name": "Authorization", @@ -9424,11 +9347,11 @@ } }, { - "name": "eventTypeId", + "name": "webhookId", "required": true, "in": "path", "schema": { - "type": "number" + "type": "string" } } ], @@ -9437,13 +9360,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateWebhookInputDto" + "$ref": "#/components/schemas/UpdateWebhookInputDto" } } } }, "responses": { - "201": { + "200": { "description": "", "content": { "application/json": { @@ -9457,8 +9380,8 @@ "tags": ["Event Types / Webhooks"] }, "get": { - "operationId": "EventTypeWebhooksController_getEventTypeWebhooks", - "summary": "Get all webhooks", + "operationId": "EventTypeWebhooksController_getEventTypeWebhook", + "summary": "Get a webhook", "parameters": [ { "name": "Authorization", @@ -9468,39 +9391,6 @@ "schema": { "type": "string" } - }, - { - "name": "eventTypeId", - "required": true, - "in": "path", - "schema": { - "type": "number" - } - }, - { - "name": "take", - "required": false, - "in": "query", - "description": "Maximum number of items to return", - "example": 25, - "schema": { - "minimum": 1, - "maximum": 250, - "default": 250, - "type": "number" - } - }, - { - "name": "skip", - "required": false, - "in": "query", - "description": "Number of items to skip", - "example": 0, - "schema": { - "minimum": 0, - "default": 0, - "type": "number" - } } ], "responses": { @@ -9509,7 +9399,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EventTypeWebhooksOutputResponseDto" + "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" } } } @@ -9518,8 +9408,8 @@ "tags": ["Event Types / Webhooks"] }, "delete": { - "operationId": "EventTypeWebhooksController_deleteAllEventTypeWebhooks", - "summary": "Delete all webhooks", + "operationId": "EventTypeWebhooksController_deleteEventTypeWebhook", + "summary": "Delete a webhook", "parameters": [ { "name": "Authorization", @@ -9529,14 +9419,6 @@ "schema": { "type": "string" } - }, - { - "name": "eventTypeId", - "required": true, - "in": "path", - "schema": { - "type": "number" - } } ], "responses": { @@ -9545,7 +9427,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeleteManyWebhooksOutputResponseDto" + "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" } } } @@ -9554,24 +9436,34 @@ "tags": ["Event Types / Webhooks"] } }, - "/v2/event-types/{eventTypeId}/webhooks/{webhookId}": { - "patch": { - "operationId": "EventTypeWebhooksController_updateEventTypeWebhook", - "summary": "Update a webhook", + "/v2/event-types/{eventTypeId}/private-links": { + "post": { + "operationId": "EventTypesPrivateLinksController_2024_06_14_createPrivateLink", + "summary": "Create a private link for an event type", "parameters": [ { - "name": "Authorization", + "name": "cal-api-version", "in": "header", - "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "description": "Must be set to 2024-06-14", "required": true, "schema": { - "type": "string" + "type": "string", + "default": "2024-06-14" } }, { - "name": "webhookId", + "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" } @@ -9582,29 +9474,49 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateWebhookInputDto" + "$ref": "#/components/schemas/CreatePrivateLinkInput_2024_06_14" } } } }, "responses": { - "200": { + "201": { "description": "", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" + "$ref": "#/components/schemas/CreatePrivateLinkOutput_2024_06_14" } } } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types Private Links" + ] }, "get": { - "operationId": "EventTypeWebhooksController_getEventTypeWebhook", - "summary": "Get a webhook", + "operationId": "EventTypesPrivateLinksController_2024_06_14_getPrivateLinks", + "summary": "Get all private links for an event type", "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, { "name": "Authorization", "in": "header", @@ -9621,18 +9533,104 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" + "$ref": "#/components/schemas/GetPrivateLinksOutput_2024_06_14" } } } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types Private Links" + ] + } + }, + "/v2/event-types/{eventTypeId}/private-links/{linkId}": { + "patch": { + "operationId": "EventTypesPrivateLinksController_2024_06_14_updatePrivateLink", + "summary": "Update a private link for an event type", + "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "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/UpdatePrivateLinkOutput_2024_06_14" + } + } + } + } + }, + "tags": [ + "Event Types Private Links" + ] }, "delete": { - "operationId": "EventTypeWebhooksController_deleteEventTypeWebhook", - "summary": "Delete a webhook", + "operationId": "EventTypesPrivateLinksController_2024_06_14_deletePrivateLink", + "summary": "Delete a private link for an event type", "parameters": [ + { + "name": "cal-api-version", + "in": "header", + "description": "Must be set to 2024-06-14", + "required": true, + "schema": { + "type": "string", + "default": "2024-06-14" + } + }, + { + "name": "eventTypeId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "linkId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, { "name": "Authorization", "in": "header", @@ -9649,13 +9647,15 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EventTypeWebhookOutputResponseDto" + "$ref": "#/components/schemas/DeletePrivateLinkOutput_2024_06_14" } } } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types Private Links" + ] } }, "/v2/organizations/{orgId}/organizations": { diff --git a/packages/platform/libraries/package.json b/packages/platform/libraries/package.json index b53cb026bea44c..1926c36e85e39b 100644 --- a/packages/platform/libraries/package.json +++ b/packages/platform/libraries/package.json @@ -1,6 +1,6 @@ { "name": "@calcom/platform-libraries", - "version": "0.0.288", + "version": "0.0.0", "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/platform/libraries/private-links.ts b/packages/platform/libraries/private-links.ts index a0c28e4a1fe043..00da784ac81dea 100644 --- a/packages/platform/libraries/private-links.ts +++ b/packages/platform/libraries/private-links.ts @@ -2,6 +2,10 @@ import { generateHashedLink } from "@calcom/lib/generateHashedLink"; import { isLinkExpired as utilsIsLinkExpired } from "@calcom/lib/hashedLinksUtils"; import { HashedLinkService } from "@calcom/lib/server/service/hashedLinkService"; import { HashedLinkRepository } from "@calcom/lib/server/repository/hashedLinkRepository"; +import type { + CreatePrivateLinkInput_2024_06_14, + UpdatePrivateLinkInput_2024_06_14 +} from "@calcom/platform-types"; export type PrivateLinkData = { id: string | number; @@ -14,30 +18,13 @@ export type PrivateLinkData = { bookingUrl: string; }; -export type CreatePrivateLinkInput = { - expiresAt?: Date | null; - maxUsageCount?: number | null; -}; -export type UpdatePrivateLinkInput = { - linkId: string; - expiresAt?: Date | null; - maxUsageCount?: number | null; -}; - -export type BulkUpdatePrivateLinkInput = { - privateLinks: Array<{ - link: string; - expiresAt?: Date | null; - maxUsageCount?: number | null; - }>; -}; /** - * Platform library service for managing private links + * Internal service for managing private links * This wraps the existing HashedLinkService and HashedLinkRepository */ -export class PlatformPrivateLinksService { +class PlatformPrivateLinksService { private readonly hashedLinkService: HashedLinkService; private readonly hashedLinkRepository: HashedLinkRepository; @@ -49,7 +36,7 @@ export class PlatformPrivateLinksService { async createPrivateLink( eventTypeId: number, userId: number, - input: CreatePrivateLinkInput + input: CreatePrivateLinkInput_2024_06_14 ): Promise { // Generate a new hashed link ID const linkId = generateHashedLink(userId); @@ -76,7 +63,7 @@ export class PlatformPrivateLinksService { async updatePrivateLink( eventTypeId: number, userId: number, - input: UpdatePrivateLinkInput + input: UpdatePrivateLinkInput_2024_06_14 ): Promise { // First verify that the user has permission to update this link await this.checkUserPermission(eventTypeId, userId); @@ -120,34 +107,7 @@ export class PlatformPrivateLinksService { await this.hashedLinkRepository.deleteLinks(eventTypeId, [linkId]); } - async bulkUpdatePrivateLinks( - eventTypeId: number, - userId: number, - input: BulkUpdatePrivateLinkInput - ): Promise { - // First verify that the user has permission - await this.checkUserPermission(eventTypeId, userId); - - // Get existing links for this event type - const existingLinks = await this.hashedLinkRepository.findLinksByEventTypeId(eventTypeId); - const existingLinkIds = existingLinks.map((link) => link.link); - - // Use the HashedLinkService to handle the bulk operation - const normalizedLinks = input.privateLinks.map((linkData) => ({ - link: linkData.link, - expiresAt: linkData.expiresAt || null, - maxUsageCount: linkData.maxUsageCount || null, - })); - await this.hashedLinkService.handleMultiplePrivateLinks({ - eventTypeId, - multiplePrivateLinks: normalizedLinks, - connectedMultiplePrivateLinks: existingLinkIds, - }); - - // Return the updated links - return this.getPrivateLinks(eventTypeId, userId); - } private async checkUserPermission(eventTypeId: number, userId: number): Promise { // This is a simplified check - in a real implementation, you might want to @@ -197,18 +157,24 @@ export class PlatformPrivateLinksService { } } -// Export the service instance -export const platformPrivateLinksService = new PlatformPrivateLinksService(); +// Internal service instance (not exported) +const platformPrivateLinksService = new PlatformPrivateLinksService(); // Export individual functions for convenience -export const createPrivateLink = (eventTypeId: number, userId: number, input: CreatePrivateLinkInput) => - platformPrivateLinksService.createPrivateLink(eventTypeId, userId, input); +export const createPrivateLink = ( + eventTypeId: number, + userId: number, + input: CreatePrivateLinkInput_2024_06_14 +) => platformPrivateLinksService.createPrivateLink(eventTypeId, userId, input); export const getPrivateLinks = (eventTypeId: number, userId: number) => platformPrivateLinksService.getPrivateLinks(eventTypeId, userId); -export const updatePrivateLink = (eventTypeId: number, userId: number, input: UpdatePrivateLinkInput) => - platformPrivateLinksService.updatePrivateLink(eventTypeId, userId, input); +export const updatePrivateLink = ( + eventTypeId: number, + userId: number, + input: UpdatePrivateLinkInput_2024_06_14 +) => platformPrivateLinksService.updatePrivateLink(eventTypeId, userId, input); export const deletePrivateLink = (eventTypeId: number, userId: number, linkId: string) => platformPrivateLinksService.deletePrivateLink(eventTypeId, userId, linkId); diff --git a/packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts b/packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts index 101cfd7a120f38..37da913cdbd590 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts +++ b/packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts @@ -1,6 +1,6 @@ import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; import { Type } from "class-transformer"; -import { IsString, IsOptional, IsDate, IsInt, Min, IsArray, ValidateNested } from "class-validator"; +import { IsOptional, IsDate, IsInt, Min, IsString } from "class-validator"; export class CreatePrivateLinkInput_2024_06_14 { @IsOptional() @@ -28,7 +28,7 @@ export class CreatePrivateLinkInput_2024_06_14 { export class UpdatePrivateLinkInput_2024_06_14 { @IsString() @ApiProperty({ - description: "The private link ID to update", + description: "The private link hash to update", type: String, example: "abc123def456", }) @@ -56,44 +56,4 @@ export class UpdatePrivateLinkInput_2024_06_14 { maxUsageCount?: number; } -export class PrivateLinkData { - @IsString() - @ApiProperty({ - description: "The private link ID", - type: String, - example: "abc123def456", - }) - link!: string; - - @IsOptional() - @IsDate() - @Type(() => Date) - @ApiPropertyOptional({ - description: "Expiration date for time-based links", - type: Date, - example: "2024-12-31T23:59:59.000Z", - }) - expiresAt?: Date; - @IsOptional() - @IsInt() - @Min(1) - @ApiPropertyOptional({ - description: "Maximum number of times the link can be used", - type: Number, - example: 10, - minimum: 1, - }) - maxUsageCount?: number; -} - -export class BulkUpdatePrivateLinksInput_2024_06_14 { - @IsArray() - @ValidateNested({ each: true }) - @Type(() => PrivateLinkData) - @ApiProperty({ - description: "Array of private links to create/update", - type: [PrivateLinkData], - }) - privateLinks!: PrivateLinkData[]; -} diff --git a/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts b/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts index bac4b803d84747..66f92ab20cf4f4 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts +++ b/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts @@ -1,12 +1,13 @@ import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; -export class PrivateLinkOutput_2024_06_14 { +// Base class with common properties +abstract class BasePrivateLinkOutput_2024_06_14 { @ApiProperty({ description: "The private link ID", type: String, example: "abc123def456", }) - id!: string; + linkId!: string; @ApiProperty({ description: "The private link hash", @@ -15,27 +16,6 @@ export class PrivateLinkOutput_2024_06_14 { }) link!: string; - @ApiPropertyOptional({ - description: "Expiration date for time-based links", - type: Date, - example: "2024-12-31T23:59:59.000Z", - }) - expiresAt?: Date | null; - - @ApiPropertyOptional({ - description: "Maximum number of times the link can be used. Only present for usage-based links (not time-based expiration links)", - type: Number, - example: 10, - }) - maxUsageCount?: number | null; - - @ApiPropertyOptional({ - description: "Current usage count. Only present for usage-based links (not time-based expiration links)", - type: Number, - example: 3, - }) - usageCount?: number; - @ApiProperty({ description: "Event type ID this link belongs to", type: Number, @@ -58,6 +38,36 @@ export class PrivateLinkOutput_2024_06_14 { bookingUrl!: string; } +// Time-based private link (expires at a specific date) +export class TimeBasedPrivateLinkOutput_2024_06_14 extends BasePrivateLinkOutput_2024_06_14 { + @ApiProperty({ + description: "Expiration date for this time-based link", + type: Date, + example: "2024-12-31T23:59:59.000Z", + }) + expiresAt!: Date; +} + +// Usage-based private link (expires after N uses) +export class UsageBasedPrivateLinkOutput_2024_06_14 extends BasePrivateLinkOutput_2024_06_14 { + @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_2024_06_14 = TimeBasedPrivateLinkOutput_2024_06_14 | UsageBasedPrivateLinkOutput_2024_06_14; + export class CreatePrivateLinkOutput_2024_06_14 { @ApiProperty({ description: "Response status", @@ -66,8 +76,11 @@ export class CreatePrivateLinkOutput_2024_06_14 { status!: string; @ApiProperty({ - description: "Created private link data", - type: PrivateLinkOutput_2024_06_14, + description: "Created private link data (either time-based or usage-based)", + oneOf: [ + { $ref: "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" }, + { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" }, + ], }) data!: PrivateLinkOutput_2024_06_14; } @@ -80,8 +93,14 @@ export class GetPrivateLinksOutput_2024_06_14 { status!: string; @ApiProperty({ - description: "Array of private links for the event type", - type: [PrivateLinkOutput_2024_06_14], + description: "Array of private links for the event type (mix of time-based and usage-based)", + type: "array", + items: { + oneOf: [ + { $ref: "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" }, + { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" }, + ], + }, }) data!: PrivateLinkOutput_2024_06_14[]; } @@ -94,8 +113,11 @@ export class UpdatePrivateLinkOutput_2024_06_14 { status!: string; @ApiProperty({ - description: "Updated private link data", - type: PrivateLinkOutput_2024_06_14, + description: "Updated private link data (either time-based or usage-based)", + oneOf: [ + { $ref: "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" }, + { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" }, + ], }) data!: PrivateLinkOutput_2024_06_14; } diff --git a/yarn.lock b/yarn.lock index 55eea1c57bc655..692908fe44e89f 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.288" "@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.288": + version: 0.0.288 + resolution: "@calcom/platform-libraries@npm:0.0.288" dependencies: "@calcom/features": "*" "@calcom/lib": "*" - checksum: 09cb5db584698acccd4447b4007df2fe2d66352c6ba823ef8c354fd3458e59414a9502f6950438e1260df71613b95f1e5a14bb54e2c7ffe6cc1dafe8b643fb9d + checksum: 9f44ba9e258a94c9b8bb5388c400696f6e6acd20dbf73865d62739b1aad212626bb181d88b38b30d08659c8b9183d27aba94bdd52b36e6c6c3cc7594d1af29d7 languageName: node linkType: hard From 7b00c99d46c405f1e6885d1ebd3561275134f68f Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Thu, 7 Aug 2025 16:26:27 +0400 Subject: [PATCH 03/15] adding further changes --- apps/api/v2/swagger/documentation.json | 84 ++++------------ docs/api-reference/v2/openapi.json | 120 ++++++----------------- packages/platform/libraries/package.json | 2 +- yarn.lock | 14 +-- 4 files changed, 53 insertions(+), 167 deletions(-) diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index b2d27783f667d7..4ac3494d5f099b 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -18310,61 +18310,6 @@ } } }, - "PrivateLinkOutput_2024_06_14": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The private link ID", - "example": "abc123def456" - }, - "link": { - "type": "string", - "description": "The private link hash", - "example": "abc123def456" - }, - "expiresAt": { - "format": "date-time", - "type": "string", - "nullable": true, - "description": "Expiration date for time-based links", - "example": "2024-12-31T23:59:59.000Z" - }, - "maxUsageCount": { - "type": "number", - "nullable": true, - "description": "Maximum number of times the link can be used. Only present for usage-based links (not time-based expiration links)", - "example": 10 - }, - "usageCount": { - "type": "number", - "description": "Current usage count. Only present for usage-based links (not time-based expiration links)", - "example": 3 - }, - "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", - "example": "https://cal.com/d/abc123def456/30min" - } - }, - "required": [ - "id", - "link", - "eventTypeId", - "isExpired", - "bookingUrl" - ] - }, "CreatePrivateLinkOutput_2024_06_14": { "type": "object", "properties": { @@ -18374,10 +18319,13 @@ "example": "success" }, "data": { - "description": "Created private link data", - "allOf": [ + "description": "Created private link data (either time-based or usage-based)", + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + }, { - "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" } ] } @@ -18396,10 +18344,17 @@ "example": "success" }, "data": { - "description": "Array of private links for the event type", "type": "array", + "description": "Array of private links for the event type (mix of time-based and usage-based)", "items": { - "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + } + ] } } }, @@ -18417,10 +18372,13 @@ "example": "success" }, "data": { - "description": "Updated private link data", - "allOf": [ + "description": "Updated private link data (either time-based or usage-based)", + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + }, { - "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" } ] } diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index dab26ed482155b..07db1543765bec 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -9491,9 +9491,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] }, "get": { "operationId": "EventTypesPrivateLinksController_2024_06_14_getPrivateLinks", @@ -9539,9 +9537,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] } }, "/v2/event-types/{eventTypeId}/private-links/{linkId}": { @@ -9597,9 +9593,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] }, "delete": { "operationId": "EventTypesPrivateLinksController_2024_06_14_deletePrivateLink", @@ -9653,9 +9647,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] } }, "/v2/organizations/{orgId}/organizations": { @@ -17170,61 +17162,6 @@ } } }, - "PrivateLinkOutput_2024_06_14": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The private link ID", - "example": "abc123def456" - }, - "link": { - "type": "string", - "description": "The private link hash", - "example": "abc123def456" - }, - "expiresAt": { - "format": "date-time", - "type": "string", - "nullable": true, - "description": "Expiration date for time-based links", - "example": "2024-12-31T23:59:59.000Z" - }, - "maxUsageCount": { - "type": "number", - "nullable": true, - "description": "Maximum number of times the link can be used. Only present for usage-based links (not time-based expiration links)", - "example": 10 - }, - "usageCount": { - "type": "number", - "description": "Current usage count. Only present for usage-based links (not time-based expiration links)", - "example": 3 - }, - "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", - "example": "https://cal.com/d/abc123def456/30min" - } - }, - "required": [ - "id", - "link", - "eventTypeId", - "isExpired", - "bookingUrl" - ] - }, "CreatePrivateLinkOutput_2024_06_14": { "type": "object", "properties": { @@ -17234,18 +17171,18 @@ "example": "success" }, "data": { - "description": "Created private link data", - "allOf": [ + "description": "Created private link data (either time-based or usage-based)", + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + }, { - "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" } ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetPrivateLinksOutput_2024_06_14": { "type": "object", @@ -17256,17 +17193,21 @@ "example": "success" }, "data": { - "description": "Array of private links for the event type", "type": "array", + "description": "Array of private links for the event type (mix of time-based and usage-based)", "items": { - "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + } + ] } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdatePrivateLinkOutput_2024_06_14": { "type": "object", @@ -17277,18 +17218,18 @@ "example": "success" }, "data": { - "description": "Updated private link data", - "allOf": [ + "description": "Updated private link data (either time-based or usage-based)", + "oneOf": [ + { + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + }, { - "$ref": "#/components/schemas/PrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" } ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeletePrivateLinkOutput_2024_06_14": { "type": "object", @@ -17313,10 +17254,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "SelectedCalendarsInputDto": { "type": "object", diff --git a/packages/platform/libraries/package.json b/packages/platform/libraries/package.json index 1926c36e85e39b..419a9d29484893 100644 --- a/packages/platform/libraries/package.json +++ b/packages/platform/libraries/package.json @@ -1,6 +1,6 @@ { "name": "@calcom/platform-libraries", - "version": "0.0.0", + "version": "9.9.9", "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/yarn.lock b/yarn.lock index 692908fe44e89f..d31854e2ebbf10 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.288" + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@9.9.9" "@calcom/platform-types": "*" "@calcom/platform-utils": "*" "@calcom/prisma": "*" @@ -3558,17 +3558,7 @@ __metadata: languageName: unknown linkType: soft -"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.288": - version: 0.0.288 - resolution: "@calcom/platform-libraries@npm:0.0.288" - dependencies: - "@calcom/features": "*" - "@calcom/lib": "*" - checksum: 9f44ba9e258a94c9b8bb5388c400696f6e6acd20dbf73865d62739b1aad212626bb181d88b38b30d08659c8b9183d27aba94bdd52b36e6c6c3cc7594d1af29d7 - languageName: node - linkType: hard - -"@calcom/platform-libraries@workspace:packages/platform/libraries": +"@calcom/platform-libraries@npm:@calcom/platform-libraries@9.9.9, @calcom/platform-libraries@workspace:packages/platform/libraries": version: 0.0.0-use.local resolution: "@calcom/platform-libraries@workspace:packages/platform/libraries" dependencies: From 049f5a22c11e1b1173b1f47d0adc5d912410db83 Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Fri, 8 Aug 2025 07:17:10 +0400 Subject: [PATCH 04/15] address feedback --- ...types-private-links.controller.e2e-spec.ts | 184 + .../event-types-private-links.controller.ts | 37 +- .../event-types-private-links.module.ts | 17 + .../services/private-links-input.service.ts | 13 +- .../services/private-links-output.service.ts | 30 +- .../services/private-links.service.ts | 16 +- .../event-types.module.ts | 9 +- .../v2/src/ee/platform-endpoints-module.ts | 2 + apps/api/v2/swagger/documentation.json | 294 +- docs/api-reference/v2/openapi.json | 4689 +++++++++++++---- 10 files changed, 4053 insertions(+), 1238 deletions(-) create mode 100644 apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.e2e-spec.ts rename apps/api/v2/src/ee/{event-types/event-types_2024_06_14/controllers => event-types-private-links}/event-types-private-links.controller.ts (85%) create mode 100644 apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts rename apps/api/v2/src/ee/{event-types/event-types_2024_06_14 => event-types-private-links}/services/private-links-input.service.ts (58%) rename apps/api/v2/src/ee/{event-types/event-types_2024_06_14 => event-types-private-links}/services/private-links-output.service.ts (57%) rename apps/api/v2/src/ee/{event-types/event-types_2024_06_14 => event-types-private-links}/services/private-links.service.ts (87%) 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..82337a022e9791 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.e2e-spec.ts @@ -0,0 +1,184 @@ +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 { CAL_API_VERSION_HEADER, SUCCESS_STATUS, VERSION_2024_06_14 } from "@calcom/platform-constants"; +import { CreatePrivateLinkInput_2024_06_14 } 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_2024_06_14 = { + expiresAt: undefined, + maxUsageCount: 5, + }; + + const response = await request(app.getHttpServer()) + .post(`/api/v2/event-types/${eventType.id}/private-links`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_06_14) + .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(CAL_API_VERSION_HEADER, VERSION_2024_06_14) + .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(CAL_API_VERSION_HEADER, VERSION_2024_06_14) + .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(CAL_API_VERSION_HEADER, VERSION_2024_06_14) + .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(CAL_API_VERSION_HEADER, VERSION_2024_06_14) + .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(CAL_API_VERSION_HEADER, VERSION_2024_06_14) + .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/event-types_2024_06_14/controllers/event-types-private-links.controller.ts b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts similarity index 85% rename from apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types-private-links.controller.ts rename to apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts index 67e526ad0cd3bd..7e250389a952e3 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types-private-links.controller.ts +++ b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts @@ -1,20 +1,18 @@ -import { PrivateLinksService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links.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"; 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 { + Body, Controller, - UseGuards, + Delete, Get, Param, - Post, - Body, - Patch, - Delete, ParseIntPipe, + Patch, + Post, + UseGuards, } from "@nestjs/common"; import { ApiHeader, ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; @@ -22,36 +20,25 @@ import { EVENT_TYPE_READ, EVENT_TYPE_WRITE, SUCCESS_STATUS, - VERSION_2024_06_14, } from "@calcom/platform-constants"; import { CreatePrivateLinkInput_2024_06_14, - UpdatePrivateLinkInput_2024_06_14, CreatePrivateLinkOutput_2024_06_14, + DeletePrivateLinkOutput_2024_06_14, GetPrivateLinksOutput_2024_06_14, + UpdatePrivateLinkInput_2024_06_14, UpdatePrivateLinkOutput_2024_06_14, - DeletePrivateLinkOutput_2024_06_14, - TimeBasedPrivateLinkOutput_2024_06_14, - UsageBasedPrivateLinkOutput_2024_06_14, } from "@calcom/platform-types"; +import { PrivateLinksService } from "./services/private-links.service"; + @Controller({ path: "/v2/event-types/:eventTypeId/private-links", - version: VERSION_2024_06_14_VALUE, }) @UseGuards(PermissionsGuard) @DocsTags("Event Types Private Links") -@ApiHeader({ - name: "cal-api-version", - description: `Must be set to ${VERSION_2024_06_14}`, - example: VERSION_2024_06_14, - required: true, - schema: { - default: VERSION_2024_06_14, - }, -}) -export class EventTypesPrivateLinksController_2024_06_14 { - constructor(private readonly privateLinksService: PrivateLinksService_2024_06_14) {} +export class EventTypesPrivateLinksController { + constructor(private readonly privateLinksService: PrivateLinksService) {} @Post("/") @Permissions([EVENT_TYPE_WRITE]) @@ -129,3 +116,5 @@ export class EventTypesPrivateLinksController_2024_06_14 { }; } } + + 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..f08259cc223435 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts @@ -0,0 +1,17 @@ +import { Module } from "@nestjs/common"; +import { TokensModule } from "@/modules/tokens/tokens.module"; +import { OAuthClientModule } from "@/modules/oauth-clients/oauth-client.module"; + +import { EventTypesPrivateLinksController } from "./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"; + +@Module({ + imports: [TokensModule, OAuthClientModule], + controllers: [EventTypesPrivateLinksController], + providers: [PrivateLinksService, PrivateLinksInputService, PrivateLinksOutputService], +}) +export class EventTypesPrivateLinksModule {} + + diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-input.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links-input.service.ts similarity index 58% rename from apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-input.service.ts rename to apps/api/v2/src/ee/event-types-private-links/services/private-links-input.service.ts index 8e700273a4ea9d..5e1963e1c8a9cd 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-input.service.ts +++ b/apps/api/v2/src/ee/event-types-private-links/services/private-links-input.service.ts @@ -6,26 +6,17 @@ import { } from "@calcom/platform-types"; @Injectable() -export class PrivateLinksInputService_2024_06_14 { +export class PrivateLinksInputService { constructor() {} - /** - * Transform API v2 input to platform library internal format - * Currently inputs are compatible, but this service allows for future transformations - */ transformCreateInput(input: CreatePrivateLinkInput_2024_06_14): CreatePrivateLinkInput_2024_06_14 { - // Currently no transformation needed, but this allows for future changes return { expiresAt: input.expiresAt, maxUsageCount: input.maxUsageCount, }; } - /** - * Transform API v2 update input to platform library internal format - */ transformUpdateInput(input: UpdatePrivateLinkInput_2024_06_14): UpdatePrivateLinkInput_2024_06_14 { - // Currently no transformation needed, but this allows for future changes return { linkId: input.linkId, expiresAt: input.expiresAt, @@ -33,3 +24,5 @@ export class PrivateLinksInputService_2024_06_14 { }; } } + + diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-output.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts similarity index 57% rename from apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-output.service.ts rename to apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts index 7e96c64be75b81..9228bb9cca93fe 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links-output.service.ts +++ b/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts @@ -1,4 +1,5 @@ import { Injectable } from "@nestjs/common"; +import { plainToClass } from "class-transformer"; import { type PrivateLinkData } from "@calcom/platform-libraries/private-links"; import { @@ -8,12 +9,9 @@ import { } from "@calcom/platform-types"; @Injectable() -export class PrivateLinksOutputService_2024_06_14 { +export class PrivateLinksOutputService { constructor() {} - /** - * Transform platform library internal data to API v2 output - */ transformToOutput(data: PrivateLinkData): PrivateLinkOutput_2024_06_14 { const baseData = { linkId: data.id.toString(), @@ -23,26 +21,22 @@ export class PrivateLinksOutputService_2024_06_14 { bookingUrl: data.bookingUrl, }; - // Return time-based link if expiresAt is set if (data.expiresAt !== null && data.expiresAt !== undefined) { - return { - ...baseData, - expiresAt: data.expiresAt, - } as TimeBasedPrivateLinkOutput_2024_06_14; + return plainToClass( + TimeBasedPrivateLinkOutput_2024_06_14, + { ...baseData, expiresAt: data.expiresAt } + ); } - // Return usage-based link if maxUsageCount is set - return { - ...baseData, - maxUsageCount: data.maxUsageCount || 0, - usageCount: data.usageCount || 0, - } as UsageBasedPrivateLinkOutput_2024_06_14; + return plainToClass( + UsageBasedPrivateLinkOutput_2024_06_14, + { ...baseData, maxUsageCount: data.maxUsageCount || 0, usageCount: data.usageCount || 0 } + ); } - /** - * Transform array of platform library internal data to API v2 outputs - */ transformArrayToOutput(data: PrivateLinkData[]): PrivateLinkOutput_2024_06_14[] { return data.map((item) => this.transformToOutput(item)); } } + + diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts similarity index 87% rename from apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts rename to apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts index 82d5087996877e..f8c327ca94de10 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/private-links.service.ts +++ b/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts @@ -2,24 +2,24 @@ import { Injectable, NotFoundException, BadRequestException } from "@nestjs/comm import { createPrivateLink, + deletePrivateLink, getPrivateLinks, updatePrivateLink, - deletePrivateLink, } from "@calcom/platform-libraries/private-links"; import { CreatePrivateLinkInput_2024_06_14, - UpdatePrivateLinkInput_2024_06_14, PrivateLinkOutput_2024_06_14, + UpdatePrivateLinkInput_2024_06_14, } from "@calcom/platform-types"; -import { PrivateLinksInputService_2024_06_14 } from "./private-links-input.service"; -import { PrivateLinksOutputService_2024_06_14 } from "./private-links-output.service"; +import { PrivateLinksInputService } from "./private-links-input.service"; +import { PrivateLinksOutputService } from "./private-links-output.service"; @Injectable() -export class PrivateLinksService_2024_06_14 { +export class PrivateLinksService { constructor( - private readonly inputService: PrivateLinksInputService_2024_06_14, - private readonly outputService: PrivateLinksOutputService_2024_06_14 + private readonly inputService: PrivateLinksInputService, + private readonly outputService: PrivateLinksOutputService ) {} async createPrivateLink( @@ -85,3 +85,5 @@ export class PrivateLinksService_2024_06_14 { } } } + + diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts index 85ed14f7a31edc..23b8cda8e350e4 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts @@ -1,15 +1,11 @@ import { CalendarsRepository } from "@/ee/calendars/calendars.repository"; import { CalendarsService } from "@/ee/calendars/services/calendars.service"; import { EventTypesController_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/controllers/event-types.controller"; -import { EventTypesPrivateLinksController_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/controllers/event-types-private-links.controller"; import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.repository"; 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 { OutputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/output-event-types.service"; -import { PrivateLinksService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links.service"; -import { PrivateLinksInputService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links-input.service"; -import { PrivateLinksOutputService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/private-links-output.service"; import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.repository"; import { AppsRepository } from "@/modules/apps/apps.repository"; import { CredentialsRepository } from "@/modules/credentials/credentials.repository"; @@ -28,9 +24,6 @@ import { Module } from "@nestjs/common"; EventTypesService_2024_06_14, InputEventTypesService_2024_06_14, OutputEventTypesService_2024_06_14, - PrivateLinksService_2024_06_14, - PrivateLinksInputService_2024_06_14, - PrivateLinksOutputService_2024_06_14, UsersRepository, UsersService, SchedulesRepository_2024_06_11, @@ -40,7 +33,7 @@ import { Module } from "@nestjs/common"; AppsRepository, CalendarsRepository, ], - controllers: [EventTypesController_2024_06_14, EventTypesPrivateLinksController_2024_06_14], + controllers: [EventTypesController_2024_06_14], exports: [ EventTypesService_2024_06_14, EventTypesRepository_2024_06_14, diff --git a/apps/api/v2/src/ee/platform-endpoints-module.ts b/apps/api/v2/src/ee/platform-endpoints-module.ts index 2185ef80a0c652..525c6c57ddc919 100644 --- a/apps/api/v2/src/ee/platform-endpoints-module.ts +++ b/apps/api/v2/src/ee/platform-endpoints-module.ts @@ -4,6 +4,7 @@ import { CalendarsModule } from "@/ee/calendars/calendars.module"; import { EventTypesModule_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/event-types.module"; import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; import { GcalModule } from "@/ee/gcal/gcal.module"; +import { EventTypesPrivateLinksModule } from "@/ee/event-types-private-links/event-types-private-links.module"; import { MeModule } from "@/ee/me/me.module"; import { ProviderModule } from "@/ee/provider/provider.module"; import { SchedulesModule_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/schedules.module"; @@ -27,6 +28,7 @@ import { Module } from "@nestjs/common"; MeModule, EventTypesModule_2024_04_15, EventTypesModule_2024_06_14, + EventTypesPrivateLinksModule, CalendarsModule, BookingsModule_2024_04_15, BookingsModule_2024_08_13, diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 4ac3494d5f099b..6b02b8accefef7 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -9895,19 +9895,9 @@ }, "/v2/event-types/{eventTypeId}/private-links": { "post": { - "operationId": "EventTypesPrivateLinksController_2024_06_14_createPrivateLink", + "operationId": "EventTypesPrivateLinksController_createPrivateLink", "summary": "Create a private link for an event type", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, { "name": "eventTypeId", "required": true, @@ -9953,19 +9943,9 @@ ] }, "get": { - "operationId": "EventTypesPrivateLinksController_2024_06_14_getPrivateLinks", + "operationId": "EventTypesPrivateLinksController_getPrivateLinks", "summary": "Get all private links for an event type", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, { "name": "eventTypeId", "required": true, @@ -10003,19 +9983,9 @@ }, "/v2/event-types/{eventTypeId}/private-links/{linkId}": { "patch": { - "operationId": "EventTypesPrivateLinksController_2024_06_14_updatePrivateLink", + "operationId": "EventTypesPrivateLinksController_updatePrivateLink", "summary": "Update a private link for an event type", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, { "name": "eventTypeId", "required": true, @@ -10059,19 +10029,9 @@ ] }, "delete": { - "operationId": "EventTypesPrivateLinksController_2024_06_14_deletePrivateLink", + "operationId": "EventTypesPrivateLinksController_deletePrivateLink", "summary": "Delete a private link for an event type", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, { "name": "eventTypeId", "required": true, @@ -18293,129 +18253,6 @@ "data" ] }, - "CreatePrivateLinkInput_2024_06_14": { - "type": "object", - "properties": { - "expiresAt": { - "format": "date-time", - "type": "string", - "description": "Expiration date for time-based links", - "example": "2024-12-31T23:59:59.000Z" - }, - "maxUsageCount": { - "type": "number", - "description": "Maximum number of times the link can be used", - "example": 10, - "minimum": 1 - } - } - }, - "CreatePrivateLinkOutput_2024_06_14": { - "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_2024_06_14" - }, - { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" - } - ] - } - }, - "required": [ - "status", - "data" - ] - }, - "GetPrivateLinksOutput_2024_06_14": { - "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_2024_06_14" - }, - { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" - } - ] - } - } - }, - "required": [ - "status", - "data" - ] - }, - "UpdatePrivateLinkOutput_2024_06_14": { - "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_2024_06_14" - }, - { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" - } - ] - } - }, - "required": [ - "status", - "data" - ] - }, - "DeletePrivateLinkOutput_2024_06_14": { - "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" - ] - }, "SelectedCalendarsInputDto": { "type": "object", "properties": { @@ -25811,6 +25648,129 @@ "data" ] }, + "CreatePrivateLinkInput_2024_06_14": { + "type": "object", + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "Expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times the link can be used", + "example": 10, + "minimum": 1 + } + } + }, + "CreatePrivateLinkOutput_2024_06_14": { + "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_2024_06_14" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "GetPrivateLinksOutput_2024_06_14": { + "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_2024_06_14" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + } + ] + } + } + }, + "required": [ + "status", + "data" + ] + }, + "UpdatePrivateLinkOutput_2024_06_14": { + "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_2024_06_14" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "DeletePrivateLinkOutput_2024_06_14": { + "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" + ] + }, "BookingInputAddressLocation_2024_08_13": { "type": "object", "properties": { diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index 07db1543765bec..6b02b8accefef7 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,24 +9888,16 @@ } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types / Webhooks" + ] } }, "/v2/event-types/{eventTypeId}/private-links": { "post": { - "operationId": "EventTypesPrivateLinksController_2024_06_14_createPrivateLink", + "operationId": "EventTypesPrivateLinksController_createPrivateLink", "summary": "Create a private link for an event type", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, { "name": "eventTypeId", "required": true, @@ -9491,26 +9938,18 @@ } } }, - "tags": ["Event Types Private Links"] + "tags": [ + "Event Types Private Links" + ] }, "get": { - "operationId": "EventTypesPrivateLinksController_2024_06_14_getPrivateLinks", + "operationId": "EventTypesPrivateLinksController_getPrivateLinks", "summary": "Get all private links for an event type", "parameters": [ { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", + "name": "eventTypeId", "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, - { - "name": "eventTypeId", - "required": true, - "in": "path", + "in": "path", "schema": { "type": "number" } @@ -9537,24 +9976,16 @@ } } }, - "tags": ["Event Types Private Links"] + "tags": [ + "Event Types Private Links" + ] } }, "/v2/event-types/{eventTypeId}/private-links/{linkId}": { "patch": { - "operationId": "EventTypesPrivateLinksController_2024_06_14_updatePrivateLink", + "operationId": "EventTypesPrivateLinksController_updatePrivateLink", "summary": "Update a private link for an event type", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, { "name": "eventTypeId", "required": true, @@ -9593,22 +10024,14 @@ } } }, - "tags": ["Event Types Private Links"] + "tags": [ + "Event Types Private Links" + ] }, "delete": { - "operationId": "EventTypesPrivateLinksController_2024_06_14_deletePrivateLink", + "operationId": "EventTypesPrivateLinksController_deletePrivateLink", "summary": "Delete a private link for an event type", "parameters": [ - { - "name": "cal-api-version", - "in": "header", - "description": "Must be set to 2024-06-14", - "required": true, - "schema": { - "type": "string", - "default": "2024-06-14" - } - }, { "name": "eventTypeId", "required": true, @@ -9647,7 +10070,9 @@ } } }, - "tags": ["Event Types Private Links"] + "tags": [ + "Event Types Private Links" + ] } }, "/v2/organizations/{orgId}/organizations": { @@ -9705,7 +10130,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "get": { "operationId": "OrganizationsOrganizationsController_getOrganizations", @@ -9806,7 +10233,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] } }, "/v2/organizations/{orgId}/organizations/{managedOrganizationId}": { @@ -9854,7 +10283,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "patch": { "operationId": "OrganizationsOrganizationsController_updateOrganization", @@ -9918,7 +10349,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "delete": { "operationId": "OrganizationsOrganizationsController_deleteOrganization", @@ -9964,7 +10397,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] } }, "/v2/me": { @@ -9994,7 +10429,9 @@ } } }, - "tags": ["Me"] + "tags": [ + "Me" + ] }, "patch": { "operationId": "MeController_updateMe", @@ -10032,7 +10469,9 @@ } } }, - "tags": ["Me"] + "tags": [ + "Me" + ] } }, "/v2/oauth-clients": { @@ -10072,7 +10511,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "get": { "operationId": "OAuthClientsController_getOAuthClients", @@ -10100,7 +10541,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] } }, "/v2/oauth-clients/{clientId}": { @@ -10138,7 +10581,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "patch": { "operationId": "OAuthClientsController_updateOAuthClient", @@ -10184,7 +10629,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "delete": { "operationId": "OAuthClientsController_deleteOAuthClient", @@ -10220,7 +10667,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -10261,7 +10710,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -10302,7 +10753,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -10351,7 +10804,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -10400,7 +10855,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails": { @@ -10463,7 +10920,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones": { @@ -10526,7 +10985,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/{id}": { @@ -10572,7 +11033,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/{id}": { @@ -10618,7 +11081,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/routing-forms/{routingFormId}/calculate-slots": { @@ -10683,7 +11148,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" } }, @@ -10718,7 +11186,9 @@ } } }, - "tags": ["Routing forms"] + "tags": [ + "Routing forms" + ] } }, "/v2/schedules": { @@ -10769,7 +11239,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "get": { "operationId": "SchedulesController_2024_06_11_getSchedules", @@ -10808,7 +11280,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/schedules/default": { @@ -10849,7 +11323,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/schedules/{scheduleId}": { @@ -10897,7 +11373,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "patch": { "operationId": "SchedulesController_2024_06_11_updateSchedule", @@ -10953,7 +11431,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "delete": { "operationId": "SchedulesController_2024_06_11_deleteSchedule", @@ -10999,7 +11479,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/selected-calendars": { @@ -11039,7 +11521,9 @@ } } }, - "tags": ["Selected Calendars"] + "tags": [ + "Selected Calendars" + ] }, "delete": { "operationId": "SelectedCalendarsController_deleteSelectedCalendar", @@ -11099,7 +11583,9 @@ } } }, - "tags": ["Selected Calendars"] + "tags": [ + "Selected Calendars" + ] } }, "/v2/slots": { @@ -11302,7 +11788,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/slots/reservations": { @@ -11362,7 +11850,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/slots/reservations/{uid}": { @@ -11401,7 +11891,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] }, "patch": { "operationId": "SlotsController_2024_09_04_updateReservedSlot", @@ -11448,7 +11940,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] }, "delete": { "operationId": "SlotsController_2024_09_04_deleteReservedSlot", @@ -11488,7 +11982,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/stripe/connect": { @@ -11518,7 +12014,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/stripe/save": { @@ -11555,7 +12053,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/stripe/check": { @@ -11585,7 +12085,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/teams": { @@ -11625,7 +12127,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "get": { "operationId": "TeamsController_getTeams", @@ -11653,7 +12157,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] } }, "/v2/teams/{teamId}": { @@ -11691,7 +12197,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "patch": { "operationId": "TeamsController_updateTeam", @@ -11737,7 +12245,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "delete": { "operationId": "TeamsController_deleteTeam", @@ -11773,7 +12283,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] } }, "/v2/teams/{teamId}/event-types": { @@ -11821,7 +12333,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "get": { "operationId": "TeamsEventTypesController_getTeamEventTypes", @@ -11866,7 +12380,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}": { @@ -11912,7 +12428,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "patch": { "operationId": "TeamsEventTypesController_updateTeamEventType", @@ -11966,7 +12484,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "delete": { "operationId": "TeamsEventTypesController_deleteTeamEventType", @@ -12010,7 +12530,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}/create-phone-call": { @@ -12066,7 +12588,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/memberships": { @@ -12114,7 +12638,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "get": { "operationId": "TeamsMembershipsController_getTeamMemberships", @@ -12175,7 +12701,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] } }, "/v2/teams/{teamId}/memberships/{membershipId}": { @@ -12221,7 +12749,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "patch": { "operationId": "TeamsMembershipsController_updateTeamMembership", @@ -12275,7 +12805,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "delete": { "operationId": "TeamsMembershipsController_deleteTeamMembership", @@ -12319,7 +12851,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -12360,7 +12894,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -12401,7 +12937,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -12450,7 +12988,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -12499,7 +13039,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails": { @@ -12562,7 +13104,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones": { @@ -12625,7 +13169,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/{id}": { @@ -12671,7 +13217,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/{id}": { @@ -12717,7 +13265,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/verified-resources/emails/verification-code/request": { @@ -12758,7 +13308,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/verification-code/request": { @@ -12799,7 +13351,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails/verification-code/verify": { @@ -12840,7 +13394,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/verification-code/verify": { @@ -12881,7 +13437,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails": { @@ -12936,7 +13494,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones": { @@ -12991,7 +13551,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails/{id}": { @@ -13029,7 +13591,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/{id}": { @@ -13067,7 +13631,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/webhooks": { @@ -13107,7 +13673,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "get": { "operationId": "WebhooksController_getWebhooks", @@ -13161,7 +13729,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] } }, "/v2/webhooks/{webhookId}": { @@ -13209,7 +13779,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "get": { "operationId": "WebhooksController_getWebhook", @@ -13237,7 +13809,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "delete": { "operationId": "WebhooksController_deleteWebhook", @@ -13273,7 +13847,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] } } }, @@ -13416,7 +13992,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -13425,7 +14004,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateManagedUserInput": { "type": "object", @@ -13441,14 +14023,25 @@ }, "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", @@ -13522,7 +14115,10 @@ } } }, - "required": ["email", "name"] + "required": [ + "email", + "name" + ] }, "CreateManagedUserData": { "type": "object", @@ -13545,7 +14141,13 @@ "type": "number" } }, - "required": ["accessToken", "refreshToken", "user", "accessTokenExpiresAt", "refreshTokenExpiresAt"] + "required": [ + "accessToken", + "refreshToken", + "user", + "accessTokenExpiresAt", + "refreshTokenExpiresAt" + ] }, "CreateManagedUserOutput": { "type": "object", @@ -13553,7 +14155,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/CreateManagedUserData" @@ -13562,7 +14167,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetManagedUserOutput": { "type": "object", @@ -13570,13 +14178,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", @@ -13589,7 +14203,10 @@ }, "timeFormat": { "type": "number", - "enum": [12, 24], + "enum": [ + 12, + 24 + ], "example": 12, "description": "Must be 12 or 24" }, @@ -13598,7 +14215,15 @@ }, "weekStart": { "type": "string", - "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + "enum": [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" + ], "example": "Monday" }, "timeZone": { @@ -13690,7 +14315,12 @@ "type": "number" } }, - "required": ["accessToken", "refreshToken", "accessTokenExpiresAt", "refreshTokenExpiresAt"] + "required": [ + "accessToken", + "refreshToken", + "accessTokenExpiresAt", + "refreshTokenExpiresAt" + ] }, "KeysResponseDto": { "type": "object", @@ -13698,13 +14328,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", @@ -13764,7 +14400,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", @@ -13778,14 +14418,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": { @@ -13800,7 +14446,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "PlatformOAuthClientDto": { "type": "object", @@ -13835,14 +14484,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" @@ -13903,7 +14557,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -13912,7 +14569,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetOAuthClientResponseDto": { "type": "object", @@ -13920,13 +14580,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", @@ -13973,7 +14639,9 @@ "description": "Managed user's refresh token." } }, - "required": ["refreshToken"] + "required": [ + "refreshToken" + ] }, "RefreshApiKeyInput": { "type": "object", @@ -13999,7 +14667,9 @@ "type": "string" } }, - "required": ["apiKey"] + "required": [ + "apiKey" + ] }, "RefreshApiKeyOutput": { "type": "object", @@ -14007,31 +14677,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", @@ -14047,7 +14734,10 @@ "example": "#fafafa" } }, - "required": ["lightThemeHex", "darkThemeHex"] + "required": [ + "lightThemeHex", + "darkThemeHex" + ] }, "DestinationCalendar_2024_06_14": { "type": "object", @@ -14061,7 +14751,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", @@ -14079,7 +14772,11 @@ "type": "boolean" } }, - "required": ["type", "address", "public"] + "required": [ + "type", + "address", + "public" + ] }, "InputLinkLocation_2024_06_14": { "type": "object", @@ -14097,7 +14794,11 @@ "type": "boolean" } }, - "required": ["type", "link", "public"] + "required": [ + "type", + "link", + "public" + ] }, "InputIntegrationLocation_2024_06_14": { "type": "object", @@ -14110,10 +14811,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", @@ -14131,7 +14840,11 @@ "type": "boolean" } }, - "required": ["type", "phone", "public"] + "required": [ + "type", + "phone", + "public" + ] }, "PhoneFieldInput_2024_06_14": { "type": "object", @@ -14164,7 +14877,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", @@ -14199,7 +14919,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", @@ -14234,7 +14961,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", @@ -14269,7 +15003,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", @@ -14304,7 +15045,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", @@ -14331,7 +15079,10 @@ "example": "Select..." }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -14346,7 +15097,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", @@ -14369,7 +15128,10 @@ "type": "boolean" }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -14384,7 +15146,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", @@ -14419,7 +15188,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", @@ -14442,7 +15218,10 @@ "type": "boolean" }, "options": { - "example": ["Checkbox 1", "Checkbox 2"], + "example": [ + "Checkbox 1", + "Checkbox 2" + ], "type": "array", "items": { "type": "string" @@ -14457,7 +15236,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", @@ -14480,7 +15266,10 @@ "type": "boolean" }, "options": { - "example": ["Radio 1", "Radio 2"], + "example": [ + "Radio 1", + "Radio 2" + ], "type": "array", "items": { "type": "string" @@ -14495,7 +15284,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", @@ -14526,10 +15322,16 @@ "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"] - }, - "UrlFieldInput_2024_06_14": { - "type": "object", + "required": [ + "type", + "slug", + "label", + "required", + "hidden" + ] + }, + "UrlFieldInput_2024_06_14": { + "type": "object", "properties": { "type": { "type": "string", @@ -14561,14 +15363,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": { @@ -14582,14 +15395,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": { @@ -14603,18 +15423,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": { @@ -14622,7 +15452,10 @@ } } }, - "required": ["type", "value"] + "required": [ + "type", + "value" + ] }, "BaseBookingLimitsCount_2024_06_14": { "type": "object", @@ -14663,7 +15496,9 @@ "default": false } }, - "required": ["disabled"] + "required": [ + "disabled" + ] }, "BaseBookingLimitsDuration_2024_06_14": { "type": "object", @@ -14705,10 +15540,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", @@ -14724,7 +15567,10 @@ "example": 30 } }, - "required": ["unit", "count"] + "required": [ + "unit", + "count" + ] }, "BaseConfirmationPolicy_2024_06_14": { "type": "object", @@ -14732,7 +15578,10 @@ "type": { "type": "string", "description": "The policy that determines when confirmation is required", - "enum": ["always", "time"], + "enum": [ + "always", + "time" + ], "example": "always" }, "noticeThreshold": { @@ -14748,7 +15597,10 @@ "description": "Unconfirmed bookings still block calendar slots." } }, - "required": ["type", "blockUnconfirmedBookingsInBooker"] + "required": [ + "type", + "blockUnconfirmedBookingsInBooker" + ] }, "Seats_2024_06_14": { "type": "object", @@ -14769,7 +15621,11 @@ "example": true } }, - "required": ["seatsPerTimeSlot", "showAttendeeInfo", "showAvailabilityCount"] + "required": [ + "seatsPerTimeSlot", + "showAttendeeInfo", + "showAvailabilityCount" + ] }, "InputAttendeeAddressLocation_2024_06_14": { "type": "object", @@ -14780,7 +15636,9 @@ "description": "only allowed value for type is `attendeeAddress`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "InputAttendeePhoneLocation_2024_06_14": { "type": "object", @@ -14791,7 +15649,9 @@ "description": "only allowed value for type is `attendeePhone`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "InputAttendeeDefinedLocation_2024_06_14": { "type": "object", @@ -14802,7 +15662,9 @@ "description": "only allowed value for type is `attendeeDefined`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "NameDefaultFieldInput_2024_06_14": { "type": "object", @@ -14823,7 +15685,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", @@ -14852,7 +15718,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", @@ -14880,7 +15750,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", @@ -14894,7 +15766,9 @@ "type": "string" } }, - "required": ["slug"] + "required": [ + "slug" + ] }, "NotesDefaultFieldInput_2024_06_14": { "type": "object", @@ -14922,7 +15796,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", @@ -14950,7 +15826,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", @@ -14978,7 +15856,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", @@ -14989,7 +15869,9 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "CalVideoSettings": { "type": "object", @@ -15020,7 +15902,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": { @@ -15289,7 +16175,11 @@ } } }, - "required": ["lengthInMinutes", "title", "slug"] + "required": [ + "lengthInMinutes", + "title", + "slug" + ] }, "OutputAddressLocation_2024_06_14": { "type": "object", @@ -15318,7 +16208,11 @@ "type": "boolean" } }, - "required": ["type", "address", "public"] + "required": [ + "type", + "address", + "public" + ] }, "OutputLinkLocation_2024_06_14": { "type": "object", @@ -15346,7 +16240,11 @@ "type": "boolean" } }, - "required": ["type", "link", "public"] + "required": [ + "type", + "link", + "public" + ] }, "OutputIntegrationLocation_2024_06_14": { "type": "object", @@ -15412,7 +16310,10 @@ "description": "Credential ID associated with the integration" } }, - "required": ["type", "integration"] + "required": [ + "type", + "integration" + ] }, "OutputPhoneLocation_2024_06_14": { "type": "object", @@ -15440,7 +16341,11 @@ "type": "boolean" } }, - "required": ["type", "phone", "public"] + "required": [ + "type", + "phone", + "public" + ] }, "OutputOrganizersDefaultAppLocation_2024_06_14": { "type": "object", @@ -15463,7 +16368,9 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OutputUnknownLocation_2024_06_14": { "type": "object", @@ -15489,7 +16396,10 @@ "type": "string" } }, - "required": ["type", "location"] + "required": [ + "type", + "location" + ] }, "EmailDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15546,7 +16456,11 @@ "default": "email" } }, - "required": ["type", "isDefault", "slug"] + "required": [ + "type", + "isDefault", + "slug" + ] }, "NameDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15597,7 +16511,12 @@ "type": "boolean" } }, - "required": ["type", "isDefault", "slug", "required"] + "required": [ + "type", + "isDefault", + "slug", + "required" + ] }, "LocationDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15628,14 +16547,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" @@ -15668,14 +16599,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" @@ -15708,14 +16649,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" @@ -15748,14 +16699,24 @@ "default": "textarea" } }, - "required": ["slug", "isDefault", "type"] + "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" @@ -15788,7 +16749,11 @@ "default": "multiemail" } }, - "required": ["slug", "isDefault", "type"] + "required": [ + "slug", + "isDefault", + "type" + ] }, "AddressFieldOutput_2024_06_14": { "type": "object", @@ -15845,7 +16810,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "BooleanFieldOutput_2024_06_14": { "type": "object", @@ -15898,7 +16870,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "CheckboxGroupFieldOutput_2024_06_14": { "type": "object", @@ -15937,7 +16916,10 @@ "type": "boolean" }, "options": { - "example": ["Checkbox 1", "Checkbox 2"], + "example": [ + "Checkbox 1", + "Checkbox 2" + ], "type": "array", "items": { "type": "string" @@ -15958,7 +16940,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", @@ -16015,7 +17005,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "MultiSelectFieldOutput_2024_06_14": { "type": "object", @@ -16054,7 +17051,10 @@ "type": "boolean" }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -16075,7 +17075,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", @@ -16132,7 +17140,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "NumberFieldOutput_2024_06_14": { "type": "object", @@ -16189,7 +17204,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "PhoneFieldOutput_2024_06_14": { "type": "object", @@ -16244,7 +17266,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "RadioGroupFieldOutput_2024_06_14": { "type": "object", @@ -16283,7 +17312,10 @@ "type": "boolean" }, "options": { - "example": ["Radio 1", "Radio 2"], + "example": [ + "Radio 1", + "Radio 2" + ], "type": "array", "items": { "type": "string" @@ -16304,7 +17336,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", @@ -16347,7 +17387,10 @@ "example": "Select..." }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -16368,7 +17411,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", @@ -16425,7 +17476,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "TextFieldOutput_2024_06_14": { "type": "object", @@ -16482,7 +17540,14 @@ "example": false } }, - "required": ["type", "slug", "label", "required", "hidden", "isDefault"] + "required": [ + "type", + "slug", + "label", + "required", + "hidden", + "isDefault" + ] }, "EventTypeOutput_2024_06_14": { "type": "object", @@ -16496,7 +17561,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": { @@ -16776,21 +17845,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": { @@ -16802,14 +17880,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": { @@ -16819,7 +17903,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateEventTypeInput_2024_06_14": { "type": "object", @@ -16829,7 +17916,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": { @@ -17101,14 +18192,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", @@ -17129,156 +18226,60 @@ "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" + ] }, - "CreatePrivateLinkInput_2024_06_14": { + "SelectedCalendarsInputDto": { "type": "object", "properties": { - "expiresAt": { - "format": "date-time", - "type": "string", - "description": "Expiration date for time-based links", - "example": "2024-12-31T23:59:59.000Z" + "integration": { + "type": "string" }, - "maxUsageCount": { - "type": "number", - "description": "Maximum number of times the link can be used", - "example": 10, - "minimum": 1 + "externalId": { + "type": "string" + }, + "credentialId": { + "type": "number" + }, + "delegationCredentialId": { + "type": "string" } - } + }, + "required": [ + "integration", + "externalId", + "credentialId" + ] }, - "CreatePrivateLinkOutput_2024_06_14": { + "SelectedCalendarOutputDto": { "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_2024_06_14" - }, - { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" - } - ] - } - }, - "required": ["status", "data"] - }, - "GetPrivateLinksOutput_2024_06_14": { - "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_2024_06_14" - }, - { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" - } - ] - } - } - }, - "required": ["status", "data"] - }, - "UpdatePrivateLinkOutput_2024_06_14": { - "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_2024_06_14" - }, - { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" - } - ] - } - }, - "required": ["status", "data"] - }, - "DeletePrivateLinkOutput_2024_06_14": { - "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"] - }, - "SelectedCalendarsInputDto": { - "type": "object", - "properties": { - "integration": { - "type": "string" - }, - "externalId": { - "type": "string" - }, - "credentialId": { - "type": "number" - }, - "delegationCredentialId": { - "type": "string" - } - }, - "required": ["integration", "externalId", "credentialId"] - }, - "SelectedCalendarOutputDto": { - "type": "object", - "properties": { - "userId": { - "type": "number" + "userId": { + "type": "number" }, "integration": { "type": "string" @@ -17291,7 +18292,12 @@ "nullable": true } }, - "required": ["userId", "integration", "externalId", "credentialId"] + "required": [ + "userId", + "integration", + "externalId", + "credentialId" + ] }, "SelectedCalendarOutputResponseDto": { "type": "object", @@ -17299,13 +18305,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", @@ -17381,7 +18393,11 @@ "default": "Sunday" } }, - "required": ["id", "name", "isOrganization"] + "required": [ + "id", + "name", + "isOrganization" + ] }, "OrgTeamsOutputResponseDto": { "type": "object", @@ -17389,7 +18405,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17398,7 +18417,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgMeTeamsOutputResponseDto": { "type": "object", @@ -17406,7 +18428,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17415,7 +18440,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgTeamOutputResponseDto": { "type": "object", @@ -17423,13 +18451,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", @@ -17594,19 +18628,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": { @@ -17622,7 +18677,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", @@ -17644,7 +18703,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", @@ -17668,12 +18731,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" } @@ -17701,7 +18770,15 @@ } } }, - "required": ["id", "ownerId", "name", "timeZone", "availability", "isDefault", "overrides"] + "required": [ + "id", + "ownerId", + "name", + "timeZone", + "availability", + "isDefault", + "overrides" + ] }, "GetSchedulesOutput_2024_06_11": { "type": "object", @@ -17709,7 +18786,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17721,7 +18801,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateScheduleInput_2024_06_11": { "type": "object", @@ -17739,12 +18822,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" } @@ -17774,7 +18863,11 @@ } } }, - "required": ["name", "timeZone", "isDefault"] + "required": [ + "name", + "timeZone", + "isDefault" + ] }, "CreateScheduleOutput_2024_06_11": { "type": "object", @@ -17782,13 +18875,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", @@ -17796,7 +18895,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -17810,7 +18912,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateScheduleInput_2024_06_11": { "type": "object", @@ -17826,7 +18931,10 @@ "availability": { "example": [ { - "days": ["Monday", "Tuesday"], + "days": [ + "Monday", + "Tuesday" + ], "startTime": "09:00", "endTime": "10:00" } @@ -17861,7 +18969,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" @@ -17870,7 +18981,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteScheduleOutput_2024_06_11": { "type": "object", @@ -17878,10 +18992,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "ProfileOutput": { "type": "object", @@ -17908,7 +19027,11 @@ "example": "john_doe" } }, - "required": ["id", "organizationId", "userId"] + "required": [ + "id", + "organizationId", + "userId" + ] }, "GetOrgUsersWithProfileOutput": { "type": "object", @@ -18050,7 +19173,15 @@ ] } }, - "required": ["id", "email", "timeZone", "weekStart", "hideBranding", "createdDate", "profile"] + "required": [ + "id", + "email", + "timeZone", + "weekStart", + "hideBranding", + "createdDate", + "profile" + ] }, "GetOrganizationUsersResponseDTO": { "type": "object", @@ -18058,7 +19189,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -18067,7 +19201,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOrganizationUserInput": { "type": "object", @@ -18157,14 +19294,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", @@ -18172,13 +19315,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", @@ -18194,7 +19343,10 @@ "type": "string" } }, - "required": ["id", "name"] + "required": [ + "id", + "name" + ] }, "TextAttribute": { "type": "object", @@ -18215,7 +19367,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "NumberAttribute": { "type": "object", @@ -18236,7 +19394,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "SingleSelectAttribute": { "type": "object", @@ -18257,7 +19421,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "MultiSelectAttributeOption": { "type": "object", @@ -18269,7 +19439,10 @@ "type": "string" } }, - "required": ["optionId", "option"] + "required": [ + "optionId", + "option" + ] }, "MultiSelectAttribute": { "type": "object", @@ -18290,7 +19463,12 @@ } } }, - "required": ["id", "name", "type", "options"] + "required": [ + "id", + "name", + "type", + "options" + ] }, "MembershipUserOutputDto": { "type": "object", @@ -18317,7 +19495,9 @@ } } }, - "required": ["email"] + "required": [ + "email" + ] }, "OrganizationMembershipOutput": { "type": "object", @@ -18336,7 +19516,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -18364,7 +19548,15 @@ } } }, - "required": ["id", "userId", "teamId", "accepted", "role", "user", "attributes"] + "required": [ + "id", + "userId", + "teamId", + "accepted", + "role", + "user", + "attributes" + ] }, "GetAllOrgMemberships": { "type": "object", @@ -18372,13 +19564,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", @@ -18393,7 +19591,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": { @@ -18401,7 +19603,10 @@ "default": false } }, - "required": ["userId", "role"] + "required": [ + "userId", + "role" + ] }, "CreateOrgMembershipOutput": { "type": "object", @@ -18409,13 +19614,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", @@ -18423,13 +19634,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", @@ -18437,13 +19654,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", @@ -18453,7 +19676,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -18466,13 +19693,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", @@ -18487,10 +19720,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", @@ -18500,7 +19741,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": { @@ -18741,7 +19986,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." }, @@ -18789,7 +20038,12 @@ } } }, - "required": ["lengthInMinutes", "title", "slug", "schedulingType"] + "required": [ + "lengthInMinutes", + "title", + "slug", + "schedulingType" + ] }, "CreateTeamEventTypeOutput": { "type": "object", @@ -18797,7 +20051,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -18813,7 +20070,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamEventTypeResponseHost": { "type": "object", @@ -18830,7 +20090,13 @@ "priority": { "type": "string", "default": "medium", - "enum": ["lowest", "low", "medium", "high", "highest"] + "enum": [ + "lowest", + "low", + "medium", + "high", + "highest" + ] }, "name": { "type": "string", @@ -18846,7 +20112,11 @@ "example": "https://cal.com/api/avatar/d95949bc-ccb1-400f-acf6-045c51a16856.png" } }, - "required": ["userId", "name", "username"] + "required": [ + "userId", + "name", + "username" + ] }, "EventTypeTeam": { "type": "object", @@ -18879,7 +20149,9 @@ "type": "string" } }, - "required": ["id"] + "required": [ + "id" + ] }, "TeamEventTypeOutput_2024_06_14": { "type": "object", @@ -18894,7 +20166,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": { @@ -19165,7 +20441,11 @@ }, "schedulingType": { "type": "string", - "enum": ["roundRobin", "collective", "managed"] + "enum": [ + "roundRobin", + "collective", + "managed" + ] }, "team": { "$ref": "#/components/schemas/EventTypeTeam" @@ -19201,13 +20481,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", @@ -19233,7 +20519,10 @@ }, "templateType": { "default": "CUSTOM_TEMPLATE", - "enum": ["CHECK_IN_APPOINTMENT", "CUSTOM_TEMPLATE"], + "enum": [ + "CHECK_IN_APPOINTMENT", + "CUSTOM_TEMPLATE" + ], "type": "string", "description": "Template type" }, @@ -19262,7 +20551,13 @@ "description": "General prompt" } }, - "required": ["yourPhoneNumber", "numberToCall", "calApiKey", "enabled", "templateType"] + "required": [ + "yourPhoneNumber", + "numberToCall", + "calApiKey", + "enabled", + "templateType" + ] }, "Data": { "type": "object", @@ -19274,7 +20569,9 @@ "type": "string" } }, - "required": ["callId"] + "required": [ + "callId" + ] }, "CreatePhoneCallOutput": { "type": "object", @@ -19282,13 +20579,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", @@ -19296,7 +20599,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19305,7 +20611,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateTeamEventTypeInput_2024_06_14": { "type": "object", @@ -19315,7 +20624,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": { @@ -19601,7 +20914,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -19617,7 +20933,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteTeamEventTypeOutput": { "type": "object", @@ -19625,13 +20944,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamMembershipOutput": { "type": "object", @@ -19650,7 +20975,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -19659,7 +20988,14 @@ "$ref": "#/components/schemas/MembershipUserOutputDto" } }, - "required": ["id", "userId", "teamId", "accepted", "role", "user"] + "required": [ + "id", + "userId", + "teamId", + "accepted", + "role", + "user" + ] }, "OrgTeamMembershipsOutputResponseDto": { "type": "object", @@ -19667,7 +21003,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19676,7 +21015,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgTeamMembershipOutputResponseDto": { "type": "object", @@ -19684,13 +21026,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", @@ -19700,7 +21048,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -19720,14 +21072,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", @@ -19745,7 +21104,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", @@ -19768,7 +21132,14 @@ "example": true } }, - "required": ["id", "teamId", "type", "name", "slug", "enabled"] + "required": [ + "id", + "teamId", + "type", + "name", + "slug", + "enabled" + ] }, "GetOrganizationAttributesOutput": { "type": "object", @@ -19776,7 +21147,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19785,7 +21159,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetSingleAttributeOutput": { "type": "object", @@ -19793,7 +21170,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -19804,7 +21184,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOrganizationAttributeOptionInput": { "type": "object", @@ -19816,7 +21199,10 @@ "type": "string" } }, - "required": ["value", "slug"] + "required": [ + "value", + "slug" + ] }, "CreateOrganizationAttributeInput": { "type": "object", @@ -19829,7 +21215,12 @@ }, "type": { "type": "string", - "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] + "enum": [ + "TEXT", + "NUMBER", + "SINGLE_SELECT", + "MULTI_SELECT" + ] }, "options": { "type": "array", @@ -19841,7 +21232,12 @@ "type": "boolean" } }, - "required": ["name", "slug", "type", "options"] + "required": [ + "name", + "slug", + "type", + "options" + ] }, "CreateOrganizationAttributesOutput": { "type": "object", @@ -19849,13 +21245,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", @@ -19868,7 +21270,12 @@ }, "type": { "type": "string", - "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] + "enum": [ + "TEXT", + "NUMBER", + "SINGLE_SELECT", + "MULTI_SELECT" + ] }, "enabled": { "type": "boolean" @@ -19881,13 +21288,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", @@ -19895,13 +21308,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", @@ -19927,7 +21346,12 @@ "example": "option-slug" } }, - "required": ["id", "attributeId", "value", "slug"] + "required": [ + "id", + "attributeId", + "value", + "slug" + ] }, "CreateAttributeOptionOutput": { "type": "object", @@ -19935,13 +21359,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", @@ -19949,13 +21379,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", @@ -19974,13 +21410,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", @@ -19988,7 +21430,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19997,7 +21442,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "AssignedOptionOutput": { "type": "object", @@ -20024,14 +21472,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", @@ -20039,7 +21496,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -20048,7 +21508,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "AssignOrganizationAttributeOptionToUserInput": { "type": "object", @@ -20063,7 +21526,9 @@ "type": "string" } }, - "required": ["attributeId"] + "required": [ + "attributeId" + ] }, "AssignOptionUserOutputData": { "type": "object", @@ -20081,7 +21546,11 @@ "description": "The value of the option" } }, - "required": ["id", "memberId", "attributeOptionId"] + "required": [ + "id", + "memberId", + "attributeOptionId" + ] }, "AssignOptionUserOutput": { "type": "object", @@ -20089,13 +21558,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", @@ -20103,13 +21578,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", @@ -20131,7 +21612,12 @@ "description": "The slug of the option" } }, - "required": ["id", "attributeId", "value", "slug"] + "required": [ + "id", + "attributeId", + "value", + "slug" + ] }, "GetOptionUserOutput": { "type": "object", @@ -20139,7 +21625,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -20148,7 +21637,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamWebhookOutputDto": { "type": "object", @@ -20180,7 +21672,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "teamId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "teamId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "TeamWebhooksOutputResponseDto": { "type": "object", @@ -20188,7 +21687,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -20197,7 +21699,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateWebhookInputDto": { "type": "object", @@ -20250,7 +21755,11 @@ "type": "string" } }, - "required": ["active", "subscriberUrl", "triggers"] + "required": [ + "active", + "subscriberUrl", + "triggers" + ] }, "TeamWebhookOutputResponseDto": { "type": "object", @@ -20258,13 +21767,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", @@ -20347,10 +21862,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", @@ -20381,7 +21905,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" + ] } } }, @@ -20396,7 +21926,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" @@ -20416,10 +21949,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", @@ -20447,7 +21987,9 @@ ] } }, - "required": ["type"] + "required": [ + "type" + ] }, "WorkflowMessageOutputDto": { "type": "object", @@ -20468,7 +22010,9 @@ "example": "Reminder for {EVENT_NAME}." } }, - "required": ["subject"] + "required": [ + "subject" + ] }, "WorkflowStepOutputDto": { "type": "object", @@ -20501,7 +22045,12 @@ "type": "string", "description": "Intended recipient type", "example": "const", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "email": { "type": "string", @@ -20516,7 +22065,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", @@ -20538,7 +22094,15 @@ ] } }, - "required": ["id", "stepNumber", "action", "recipient", "template", "sender", "message"] + "required": [ + "id", + "stepNumber", + "action", + "recipient", + "template", + "sender", + "message" + ] }, "WorkflowOutput": { "type": "object", @@ -20597,7 +22161,13 @@ "example": "2024-05-12T11:30:00.000Z" } }, - "required": ["id", "name", "activation", "trigger", "steps"] + "required": [ + "id", + "name", + "activation", + "trigger", + "steps" + ] }, "GetWorkflowsOutput": { "type": "object", @@ -20606,7 +22176,10 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "description": "List of workflows", @@ -20616,7 +22189,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetWorkflowOutput": { "type": "object", @@ -20625,7 +22201,10 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "description": "workflow", @@ -20635,7 +22214,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "WorkflowTriggerOffsetDto": { "type": "object", @@ -20651,7 +22233,10 @@ "example": "hour" } }, - "required": ["value", "unit"] + "required": [ + "value", + "unit" + ] }, "OnBeforeEventTriggerDto": { "type": "object", @@ -20671,7 +22256,10 @@ "example": "beforeEvent" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnAfterEventTriggerDto": { "type": "object", @@ -20691,7 +22279,10 @@ "example": "afterEvent" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnCancelTriggerDto": { "type": "object", @@ -20702,7 +22293,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnCreationTriggerDto": { "type": "object", @@ -20713,7 +22306,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnRescheduleTriggerDto": { "type": "object", @@ -20724,7 +22319,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnAfterCalVideoGuestsNoShowTriggerDto": { "type": "object", @@ -20744,7 +22341,10 @@ "example": "afterGuestsCalVideoNoShow" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnAfterCalVideoHostsNoShowTriggerDto": { "type": "object", @@ -20764,7 +22364,10 @@ "example": "afterHostsCalVideoNoShow" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "HtmlWorkflowMessageDto": { "type": "object", @@ -20780,7 +22383,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", @@ -20809,13 +22415,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", @@ -20882,13 +22500,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", @@ -20946,13 +22576,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", @@ -20997,7 +22639,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", @@ -21026,13 +22671,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", @@ -21047,7 +22704,14 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "WorkflowPhoneWhatsAppNumberStepDto": { "type": "object", @@ -21076,13 +22740,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", @@ -21105,7 +22781,15 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "WorkflowPhoneNumberStepDto": { "type": "object", @@ -21134,13 +22818,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", @@ -21163,7 +22859,15 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "WorkflowPhoneAttendeeStepDto": { "type": "object", @@ -21192,13 +22896,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", @@ -21217,7 +22933,14 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "BaseWorkflowTriggerDto": { "type": "object", @@ -21227,7 +22950,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "WorkflowActivationDto": { "type": "object", @@ -21241,14 +22966,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", @@ -21322,7 +23051,12 @@ } } }, - "required": ["name", "activation", "trigger", "steps"] + "required": [ + "name", + "activation", + "trigger", + "steps" + ] }, "UpdateEmailAddressWorkflowStepDto": { "type": "object", @@ -21351,13 +23085,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", @@ -21429,13 +23175,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", @@ -21498,13 +23256,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", @@ -21567,13 +23337,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", @@ -21597,7 +23379,14 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "UpdatePhoneWhatsAppNumberWorkflowStepDto": { "type": "object", @@ -21626,13 +23415,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", @@ -21660,7 +23461,15 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "UpdateWhatsAppAttendeePhoneWorkflowStepDto": { "type": "object", @@ -21689,13 +23498,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", @@ -21715,7 +23536,14 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "UpdatePhoneNumberWorkflowStepDto": { "type": "object", @@ -21744,13 +23572,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", @@ -21778,7 +23618,15 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "UpdateWorkflowDto": { "type": "object", @@ -21860,7 +23708,9 @@ "type": "string" } }, - "required": ["authUrl"] + "required": [ + "authUrl" + ] }, "StripConnectOutputResponseDto": { "type": "object", @@ -21868,13 +23718,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", @@ -21883,7 +23739,9 @@ "type": "string" } }, - "required": ["url"] + "required": [ + "url" + ] }, "StripCredentialsCheckOutputResponseDto": { "type": "object", @@ -21893,7 +23751,9 @@ "example": "success" } }, - "required": ["status"] + "required": [ + "status" + ] }, "GetDefaultScheduleOutput_2024_06_11": { "type": "object", @@ -21901,13 +23761,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", @@ -21991,7 +23857,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", @@ -21999,7 +23867,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -22013,7 +23884,10 @@ "description": "Either an Output object or a TeamOutputDto." } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamOutputDto": { "type": "object", @@ -22089,7 +23963,11 @@ "default": "Sunday" } }, - "required": ["id", "name", "isOrganization"] + "required": [ + "id", + "name", + "isOrganization" + ] }, "GetTeamOutput": { "type": "object", @@ -22097,13 +23975,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", @@ -22111,7 +23995,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -22120,7 +24007,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateTeamOutput": { "type": "object", @@ -22128,13 +24018,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", @@ -22159,20 +24055,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", @@ -22180,17 +24086,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", @@ -22199,7 +24113,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "SetDefaultConferencingAppOutputResponseDto": { "type": "object", @@ -22207,10 +24124,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "DefaultConferencingAppsOutputDto": { "type": "object", @@ -22229,13 +24151,18 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/DefaultConferencingAppsOutputDto" } }, - "required": ["status"] + "required": [ + "status" + ] }, "DisconnectConferencingAppOutputResponseDto": { "type": "object", @@ -22243,10 +24170,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "GoogleServiceAccountKeyInput": { "type": "object", @@ -22261,7 +24193,11 @@ "type": "string" } }, - "required": ["private_key", "client_email", "client_id"] + "required": [ + "private_key", + "client_email", + "client_id" + ] }, "CreateDelegationCredentialInput": { "type": "object", @@ -22286,7 +24222,11 @@ } } }, - "required": ["workspacePlatformSlug", "domain", "serviceAccountKey"] + "required": [ + "workspacePlatformSlug", + "domain", + "serviceAccountKey" + ] }, "WorkspacePlatformDto": { "type": "object", @@ -22298,7 +24238,10 @@ "type": "string" } }, - "required": ["name", "slug"] + "required": [ + "name", + "slug" + ] }, "DelegationCredentialOutput": { "type": "object", @@ -22343,13 +24286,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", @@ -22378,20 +24327,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", @@ -22405,7 +24363,9 @@ "description": "Whether to allowing writing to the calendar or not" } }, - "required": ["urls"] + "required": [ + "urls" + ] }, "CreateIcsFeedOutput": { "type": "object", @@ -22445,7 +24405,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", @@ -22453,13 +24420,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", @@ -22477,7 +24450,10 @@ "nullable": true } }, - "required": ["start", "end"] + "required": [ + "start", + "end" + ] }, "GetBusyTimesOutput": { "type": "object", @@ -22485,7 +24461,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -22494,7 +24473,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "Integration": { "type": "object", @@ -22603,7 +24585,13 @@ "nullable": true } }, - "required": ["externalId", "primary", "readOnly", "isSelected", "credentialId"] + "required": [ + "externalId", + "primary", + "readOnly", + "isSelected", + "credentialId" + ] }, "Calendar": { "type": "object", @@ -22638,7 +24626,12 @@ "nullable": true } }, - "required": ["externalId", "readOnly", "isSelected", "credentialId"] + "required": [ + "externalId", + "readOnly", + "isSelected", + "credentialId" + ] }, "ConnectedCalendar": { "type": "object", @@ -22663,7 +24656,10 @@ } } }, - "required": ["integration", "credentialId"] + "required": [ + "integration", + "credentialId" + ] }, "DestinationCalendar": { "type": "object", @@ -22737,7 +24733,10 @@ "$ref": "#/components/schemas/DestinationCalendar" } }, - "required": ["connectedCalendars", "destinationCalendar"] + "required": [ + "connectedCalendars", + "destinationCalendar" + ] }, "ConnectedCalendarsOutput": { "type": "object", @@ -22745,13 +24744,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", @@ -22763,7 +24768,10 @@ "type": "string" } }, - "required": ["username", "password"] + "required": [ + "username", + "password" + ] }, "DeleteCalendarCredentialsInputBodyDto": { "type": "object", @@ -22774,7 +24782,9 @@ "description": "Credential ID of the calendar to delete, as returned by the /calendars endpoint" } }, - "required": ["id"] + "required": [ + "id" + ] }, "DeletedCalendarCredentialsOutputDto": { "type": "object", @@ -22802,7 +24812,14 @@ "nullable": true } }, - "required": ["id", "type", "userId", "teamId", "appId", "invalid"] + "required": [ + "id", + "type", + "userId", + "teamId", + "appId", + "invalid" + ] }, "DeletedCalendarCredentialsOutputResponseDto": { "type": "object", @@ -22810,13 +24827,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", @@ -22852,7 +24875,9 @@ } } }, - "required": ["name"] + "required": [ + "name" + ] }, "ManagedOrganizationWithApiKeyOutput": { "type": "object", @@ -22877,7 +24902,11 @@ "type": "string" } }, - "required": ["id", "name", "apiKey"] + "required": [ + "id", + "name", + "apiKey" + ] }, "CreateManagedOrganizationOutput": { "type": "object", @@ -22885,13 +24914,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", @@ -22913,7 +24948,10 @@ } } }, - "required": ["id", "name"] + "required": [ + "id", + "name" + ] }, "GetManagedOrganizationOutput": { "type": "object", @@ -22921,13 +24959,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", @@ -22995,7 +25039,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -23007,7 +25054,11 @@ "$ref": "#/components/schemas/PaginationMetaDto" } }, - "required": ["status", "data", "pagination"] + "required": [ + "status", + "data", + "pagination" + ] }, "UpdateOrganizationInput": { "type": "object", @@ -23056,7 +25107,14 @@ "type": "string" } }, - "required": ["id", "formId", "formFillerId", "routedToBookingUid", "response", "createdAt"] + "required": [ + "id", + "formId", + "formFillerId", + "routedToBookingUid", + "response", + "createdAt" + ] }, "GetRoutingFormResponsesOutput": { "type": "object", @@ -23064,13 +25122,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", @@ -23089,7 +25153,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" @@ -23116,7 +25183,9 @@ "example": "Account" } }, - "required": ["teamMemberIds"] + "required": [ + "teamMemberIds" + ] }, "CreateRoutingFormResponseOutputData": { "type": "object", @@ -23131,7 +25200,10 @@ "example": { "eventTypeId": 123, "routing": { - "teamMemberIds": [101, 102], + "teamMemberIds": [ + 101, + 102 + ], "teamMemberEmail": "john.doe@example.com", "skipContactOwner": true } @@ -23170,13 +25242,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", @@ -23193,13 +25271,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", @@ -23275,7 +25359,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -23284,7 +25371,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "SlotsOutput_2024_09_04": { "type": "object", @@ -23311,7 +25401,10 @@ ] } }, - "required": ["eventTypeId", "slots"] + "required": [ + "eventTypeId", + "slots" + ] }, "ResponseSlotsOutput": { "type": "object", @@ -23319,13 +25412,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", @@ -23351,7 +25450,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", @@ -23408,13 +25510,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", @@ -23422,7 +25530,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -23433,7 +25544,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "MeOrgOutput": { "type": "object", @@ -23445,7 +25559,10 @@ "type": "number" } }, - "required": ["isPlatform", "id"] + "required": [ + "isPlatform", + "id" + ] }, "MeOutput": { "type": "object", @@ -23497,13 +25614,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", @@ -23511,13 +25634,142 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/MeOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] + }, + "CreatePrivateLinkInput_2024_06_14": { + "type": "object", + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "Expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times the link can be used", + "example": 10, + "minimum": 1 + } + } + }, + "CreatePrivateLinkOutput_2024_06_14": { + "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_2024_06_14" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "GetPrivateLinksOutput_2024_06_14": { + "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_2024_06_14" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + } + ] + } + } + }, + "required": [ + "status", + "data" + ] + }, + "UpdatePrivateLinkOutput_2024_06_14": { + "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_2024_06_14" + }, + { + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + } + ] + } + }, + "required": [ + "status", + "data" + ] + }, + "DeletePrivateLinkOutput_2024_06_14": { + "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" + ] }, "BookingInputAddressLocation_2024_08_13": { "type": "object", @@ -23528,7 +25780,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", @@ -23543,7 +25797,10 @@ "example": "123 Example St, City, Country" } }, - "required": ["type", "address"] + "required": [ + "type", + "address" + ] }, "BookingInputAttendeeDefinedLocation_2024_08_13": { "type": "object", @@ -23558,7 +25815,10 @@ "example": "321 Example St, City, Country" } }, - "required": ["type", "location"] + "required": [ + "type", + "location" + ] }, "BookingInputAttendeePhoneLocation_2024_08_13": { "type": "object", @@ -23573,7 +25833,10 @@ "example": "+37120993151" } }, - "required": ["type", "phone"] + "required": [ + "type", + "phone" + ] }, "BookingInputIntegrationLocation_2024_08_13": { "type": "object", @@ -23619,7 +25882,10 @@ ] } }, - "required": ["type", "integration"] + "required": [ + "type", + "integration" + ] }, "BookingInputLinkLocation_2024_08_13": { "type": "object", @@ -23630,7 +25896,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", @@ -23641,7 +25909,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", @@ -23652,7 +25922,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", @@ -23733,7 +26005,10 @@ "default": "en" } }, - "required": ["name", "timeZone"] + "required": [ + "name", + "timeZone" + ] }, "CreateBookingInput_2024_08_13": { "type": "object", @@ -23785,7 +26060,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" @@ -23842,7 +26120,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": [ { @@ -23851,7 +26132,10 @@ ] } }, - "required": ["start", "attendee"] + "required": [ + "start", + "attendee" + ] }, "CreateInstantBookingInput_2024_08_13": { "type": "object", @@ -23903,7 +26187,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" @@ -23960,7 +26247,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": [ { @@ -23974,7 +26264,11 @@ "example": true } }, - "required": ["start", "attendee", "instant"] + "required": [ + "start", + "attendee", + "instant" + ] }, "CreateRecurringBookingInput_2024_08_13": { "type": "object", @@ -24026,7 +26320,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" @@ -24083,7 +26380,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": [ { @@ -24097,7 +26397,10 @@ "example": 5 } }, - "required": ["start", "attendee"] + "required": [ + "start", + "attendee" + ] }, "BookingHost": { "type": "object", @@ -24123,7 +26426,13 @@ "example": "America/Los_Angeles" } }, - "required": ["id", "name", "email", "username", "timeZone"] + "required": [ + "id", + "name", + "email", + "username", + "timeZone" + ] }, "EventType": { "type": "object", @@ -24137,7 +26446,10 @@ "example": "some-event" } }, - "required": ["id", "slug"] + "required": [ + "id", + "slug" + ] }, "BookingAttendee": { "type": "object", @@ -24212,7 +26524,12 @@ "example": "+1234567890" } }, - "required": ["name", "email", "timeZone", "absent"] + "required": [ + "name", + "email", + "timeZone", + "absent" + ] }, "BookingOutput_2024_08_13": { "type": "object", @@ -24241,7 +26558,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24335,7 +26657,10 @@ } }, "guests": { - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -24396,7 +26721,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24490,7 +26820,10 @@ } }, "guests": { - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -24619,7 +26952,14 @@ } } }, - "required": ["name", "email", "timeZone", "absent", "seatUid", "bookingFieldsResponses"] + "required": [ + "name", + "email", + "timeZone", + "absent", + "seatUid", + "bookingFieldsResponses" + ] }, "CreateSeatedBookingOutput_2024_08_13": { "type": "object", @@ -24648,7 +26988,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24793,7 +27138,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24922,7 +27272,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -24948,7 +27301,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", @@ -24977,7 +27333,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -25117,7 +27478,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -25241,7 +27607,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25276,7 +27645,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "RecordingItem": { "type": "object", @@ -25320,7 +27692,14 @@ "example": "Error message" } }, - "required": ["id", "roomName", "startTs", "status", "duration", "shareToken"] + "required": [ + "id", + "roomName", + "startTs", + "status", + "duration", + "shareToken" + ] }, "GetBookingRecordingsOutput": { "type": "object", @@ -25328,7 +27707,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "error": { "type": "object" @@ -25340,7 +27722,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetBookingTranscriptsOutput": { "type": "object", @@ -25348,10 +27733,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" @@ -25361,7 +27752,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetBookingsOutput_2024_08_13": { "type": "object", @@ -25369,7 +27763,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25398,7 +27795,11 @@ "type": "object" } }, - "required": ["status", "data", "pagination"] + "required": [ + "status", + "data", + "pagination" + ] }, "RescheduleBookingInput_2024_08_13": { "type": "object", @@ -25418,7 +27819,9 @@ "description": "Reason for rescheduling the booking" } }, - "required": ["start"] + "required": [ + "start" + ] }, "RescheduleSeatedBookingInput_2024_08_13": { "type": "object", @@ -25438,7 +27841,10 @@ "description": "Uid of the specific seat within booking." } }, - "required": ["start", "seatUid"] + "required": [ + "start", + "seatUid" + ] }, "RescheduleBookingOutput_2024_08_13": { "type": "object", @@ -25446,7 +27852,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25466,7 +27875,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", @@ -25490,7 +27902,9 @@ "description": "Uid of the specific seat within booking." } }, - "required": ["seatUid"] + "required": [ + "seatUid" + ] }, "CancelBookingOutput_2024_08_13": { "type": "object", @@ -25498,7 +27912,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25530,7 +27947,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", @@ -25542,7 +27962,10 @@ "type": "boolean" } }, - "required": ["email", "absent"] + "required": [ + "email", + "absent" + ] }, "MarkAbsentBookingInput_2024_08_13": { "type": "object", @@ -25566,7 +27989,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25580,7 +28006,10 @@ "description": "Booking data, which can be either a BookingOutput object or a RecurringBookingOutput object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "ReassignedToDto": { "type": "object", @@ -25598,7 +28027,11 @@ "example": "john.doe@example.com" } }, - "required": ["id", "name", "email"] + "required": [ + "id", + "name", + "email" + ] }, "ReassignBookingOutput_2024_08_13": { "type": "object", @@ -25606,7 +28039,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25622,7 +28058,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "ReassignToUserBookingInput_2024_08_13": { "type": "object", @@ -25656,7 +28095,10 @@ "description": "The link to the calendar" } }, - "required": ["label", "link"] + "required": [ + "label", + "link" + ] }, "CalendarLinksOutput_2024_08_13": { "type": "object", @@ -25674,7 +28116,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "BookingReference": { "type": "object", @@ -25697,7 +28142,12 @@ "description": "The id of the booking reference" } }, - "required": ["type", "eventUid", "destinationCalendarId", "id"] + "required": [ + "type", + "eventUid", + "destinationCalendarId", + "id" + ] }, "BookingReferencesOutput_2024_08_13": { "type": "object", @@ -25715,7 +28165,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateTeamMembershipInput": { "type": "object", @@ -25730,14 +28183,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", @@ -25745,13 +28204,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", @@ -25759,13 +28224,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", @@ -25773,13 +28244,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", @@ -25789,7 +28266,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -25802,13 +28283,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", @@ -25816,13 +28303,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UserWebhookOutputDto": { "type": "object", @@ -25854,7 +28347,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "userId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "userId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "UserWebhookOutputResponseDto": { "type": "object", @@ -25862,13 +28362,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", @@ -25876,7 +28382,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25885,7 +28394,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "EventTypeWebhookOutputDto": { "type": "object", @@ -25917,7 +28429,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "eventTypeId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "eventTypeId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "EventTypeWebhookOutputResponseDto": { "type": "object", @@ -25925,13 +28444,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", @@ -25939,7 +28464,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25948,7 +28476,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteManyWebhooksOutputResponseDto": { "type": "object", @@ -25956,13 +28487,19 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "string" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OAuthClientWebhookOutputDto": { "type": "object", @@ -25994,7 +28531,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "oAuthClientId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "oAuthClientId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "OAuthClientWebhookOutputResponseDto": { "type": "object", @@ -26002,13 +28546,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", @@ -26016,7 +28566,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -26025,7 +28578,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DestinationCalendarsInputBodyDto": { "type": "object", @@ -26034,7 +28590,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", @@ -26045,7 +28605,10 @@ "type": "string" } }, - "required": ["integration", "externalId"] + "required": [ + "integration", + "externalId" + ] }, "DestinationCalendarsOutputDto": { "type": "object", @@ -26064,7 +28627,12 @@ "nullable": true } }, - "required": ["userId", "integration", "externalId", "credentialId"] + "required": [ + "userId", + "integration", + "externalId", + "credentialId" + ] }, "DestinationCalendarsOutputResponseDto": { "type": "object", @@ -26072,18 +28640,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", @@ -26112,12 +28691,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", @@ -26137,12 +28723,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", @@ -26236,7 +28828,13 @@ "$ref": "#/components/schemas/CalendarSource" } }, - "required": ["start", "end", "id", "title", "source"] + "required": [ + "start", + "end", + "id", + "title", + "source" + ] }, "GetUnifiedCalendarEventOutput": { "type": "object", @@ -26244,13 +28842,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", @@ -26261,7 +28865,9 @@ "example": "acme@example.com" } }, - "required": ["email"] + "required": [ + "email" + ] }, "RequestEmailVerificationOutput": { "type": "object", @@ -26269,10 +28875,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "RequestPhoneVerificationInput": { "type": "object", @@ -26283,7 +28894,9 @@ "example": "+372 5555 6666" } }, - "required": ["phone"] + "required": [ + "phone" + ] }, "RequestPhoneVerificationOutput": { "type": "object", @@ -26291,10 +28904,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "VerifyEmailInput": { "type": "object", @@ -26310,7 +28928,10 @@ "example": "1ABG2C" } }, - "required": ["email", "code"] + "required": [ + "email", + "code" + ] }, "WorkingHours": { "type": "object", @@ -26332,7 +28953,11 @@ "nullable": true } }, - "required": ["days", "startTime", "endTime"] + "required": [ + "days", + "startTime", + "endTime" + ] }, "AvailabilityModel": { "type": "object", @@ -26372,7 +28997,12 @@ "nullable": true } }, - "required": ["id", "days", "startTime", "endTime"] + "required": [ + "id", + "days", + "startTime", + "endTime" + ] }, "ScheduleOutput": { "type": "object", @@ -26442,13 +29072,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", @@ -26464,7 +29100,10 @@ "example": "1ABG2C" } }, - "required": ["phone", "code"] + "required": [ + "phone", + "code" + ] }, "UserVerifiedPhoneOutput": { "type": "object", @@ -26472,13 +29111,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", @@ -26486,13 +29131,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", @@ -26500,13 +29151,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", @@ -26514,13 +29171,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", @@ -26528,13 +29191,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", @@ -26542,13 +29211,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", @@ -26556,14 +29231,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 From 853faf3f344ade2fc0fd29ee7348be33ea47705f Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Fri, 8 Aug 2025 08:08:36 +0400 Subject: [PATCH 05/15] further changes --- .../services/private-links-output.service.ts | 1 - packages/platform/libraries/private-links.ts | 4 +--- .../event-types_2024_06_14/outputs/private-link.output.ts | 7 ------- 3 files changed, 1 insertion(+), 11 deletions(-) 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 index 9228bb9cca93fe..dabeb157f8389e 100644 --- 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 @@ -15,7 +15,6 @@ export class PrivateLinksOutputService { transformToOutput(data: PrivateLinkData): PrivateLinkOutput_2024_06_14 { const baseData = { linkId: data.id.toString(), - link: data.link, eventTypeId: data.eventTypeId, isExpired: data.isExpired, bookingUrl: data.bookingUrl, diff --git a/packages/platform/libraries/private-links.ts b/packages/platform/libraries/private-links.ts index 00da784ac81dea..0b59467a0c45a4 100644 --- a/packages/platform/libraries/private-links.ts +++ b/packages/platform/libraries/private-links.ts @@ -9,7 +9,6 @@ import type { export type PrivateLinkData = { id: string | number; - link: string; expiresAt?: Date | null; maxUsageCount?: number | null; usageCount?: number; @@ -145,8 +144,7 @@ class PlatformPrivateLinksService { }`; return { - id: link.id?.toString() || link.link, - link: link.link, + id: link.link, expiresAt: link.expiresAt, maxUsageCount: link.maxUsageCount, usageCount: link.usageCount || 0, diff --git a/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts b/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts index 66f92ab20cf4f4..7ce1ef0bacca02 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts +++ b/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts @@ -9,13 +9,6 @@ abstract class BasePrivateLinkOutput_2024_06_14 { }) linkId!: string; - @ApiProperty({ - description: "The private link hash", - type: String, - example: "abc123def456", - }) - link!: string; - @ApiProperty({ description: "Event type ID this link belongs to", type: Number, From 28aa86f1a4eb9fe43f7d467d1e31ecb6693603fd Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Fri, 8 Aug 2025 16:29:51 +0400 Subject: [PATCH 06/15] further clean-up --- ...types-private-links.controller.e2e-spec.ts | 4 +- .../event-types-private-links.controller.ts | 24 +- .../services/private-links-input.service.ts | 9 +- .../services/private-links-output.service.ts | 24 +- .../services/private-links.service.ts | 20 +- apps/api/v2/swagger/documentation.json | 32 +-- docs/api-reference/v2/openapi.json | 32 +-- .../lib/server/service/hashedLinkService.ts | 30 +++ packages/platform/libraries/private-links.ts | 246 +++++++----------- .../event-types_2024_06_14/inputs/index.ts | 1 - packages/platform/types/event-types/index.ts | 2 + .../inputs/private-link.input.ts | 4 +- .../outputs/private-link.output.ts | 127 +++++++++ packages/platform/types/index.ts | 1 + 14 files changed, 319 insertions(+), 237 deletions(-) rename packages/platform/types/event-types/{event-types_2024_06_14 => }/inputs/private-link.input.ts (92%) create mode 100644 packages/platform/types/event-types/outputs/private-link.output.ts 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 index 82337a022e9791..b6961bc4090d68 100644 --- 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 @@ -11,7 +11,7 @@ import { Test } from "@nestjs/testing"; import * as request from "supertest"; import { CAL_API_VERSION_HEADER, SUCCESS_STATUS, VERSION_2024_06_14 } from "@calcom/platform-constants"; -import { CreatePrivateLinkInput_2024_06_14 } from "@calcom/platform-types"; +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"; @@ -96,7 +96,7 @@ describe("Event Types Private Links Endpoints", () => { } it("POST /v2/event-types/:eventTypeId/private-links - create private link", async () => { - const body: CreatePrivateLinkInput_2024_06_14 = { + const body: CreatePrivateLinkInput = { expiresAt: undefined, maxUsageCount: 5, }; diff --git a/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts index 7e250389a952e3..4823b47da8b90b 100644 --- a/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts +++ b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts @@ -22,12 +22,12 @@ import { SUCCESS_STATUS, } from "@calcom/platform-constants"; import { - CreatePrivateLinkInput_2024_06_14, - CreatePrivateLinkOutput_2024_06_14, - DeletePrivateLinkOutput_2024_06_14, - GetPrivateLinksOutput_2024_06_14, - UpdatePrivateLinkInput_2024_06_14, - UpdatePrivateLinkOutput_2024_06_14, + CreatePrivateLinkInput, + CreatePrivateLinkOutput, + DeletePrivateLinkOutput, + GetPrivateLinksOutput, + UpdatePrivateLinkInput, + UpdatePrivateLinkOutput, } from "@calcom/platform-types"; import { PrivateLinksService } from "./services/private-links.service"; @@ -47,9 +47,9 @@ export class EventTypesPrivateLinksController { @ApiOperation({ summary: "Create a private link for an event type" }) async createPrivateLink( @Param("eventTypeId", ParseIntPipe) eventTypeId: number, - @Body() body: CreatePrivateLinkInput_2024_06_14, + @Body() body: CreatePrivateLinkInput, @GetUser("id") userId: number - ): Promise { + ): Promise { const privateLink = await this.privateLinksService.createPrivateLink(eventTypeId, userId, body); return { @@ -66,7 +66,7 @@ export class EventTypesPrivateLinksController { async getPrivateLinks( @Param("eventTypeId", ParseIntPipe) eventTypeId: number, @GetUser("id") userId: number - ): Promise { + ): Promise { const privateLinks = await this.privateLinksService.getPrivateLinks(eventTypeId, userId); return { @@ -83,9 +83,9 @@ export class EventTypesPrivateLinksController { async updatePrivateLink( @Param("eventTypeId", ParseIntPipe) eventTypeId: number, @Param("linkId") linkId: string, - @Body() body: Omit, + @Body() body: Omit, @GetUser("id") userId: number - ): Promise { + ): Promise { const updateInput = { ...body, linkId }; const privateLink = await this.privateLinksService.updatePrivateLink(eventTypeId, userId, updateInput); @@ -104,7 +104,7 @@ export class EventTypesPrivateLinksController { @Param("eventTypeId", ParseIntPipe) eventTypeId: number, @Param("linkId") linkId: string, @GetUser("id") userId: number - ): Promise { + ): Promise { await this.privateLinksService.deletePrivateLink(eventTypeId, userId, linkId); return { 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 index 5e1963e1c8a9cd..290238eb5d744f 100644 --- 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 @@ -1,22 +1,19 @@ import { Injectable } from "@nestjs/common"; -import { - CreatePrivateLinkInput_2024_06_14, - UpdatePrivateLinkInput_2024_06_14, -} from "@calcom/platform-types"; +import { CreatePrivateLinkInput, UpdatePrivateLinkInput } from "@calcom/platform-types"; @Injectable() export class PrivateLinksInputService { constructor() {} - transformCreateInput(input: CreatePrivateLinkInput_2024_06_14): CreatePrivateLinkInput_2024_06_14 { + transformCreateInput(input: CreatePrivateLinkInput): CreatePrivateLinkInput { return { expiresAt: input.expiresAt, maxUsageCount: input.maxUsageCount, }; } - transformUpdateInput(input: UpdatePrivateLinkInput_2024_06_14): UpdatePrivateLinkInput_2024_06_14 { + transformUpdateInput(input: UpdatePrivateLinkInput): UpdatePrivateLinkInput { return { linkId: input.linkId, expiresAt: input.expiresAt, 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 index dabeb157f8389e..e948fb08f1f83e 100644 --- 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 @@ -2,17 +2,13 @@ import { Injectable } from "@nestjs/common"; import { plainToClass } from "class-transformer"; import { type PrivateLinkData } from "@calcom/platform-libraries/private-links"; -import { - PrivateLinkOutput_2024_06_14, - TimeBasedPrivateLinkOutput_2024_06_14, - UsageBasedPrivateLinkOutput_2024_06_14, -} from "@calcom/platform-types"; +import { PrivateLinkOutput, TimeBasedPrivateLinkOutput, UsageBasedPrivateLinkOutput } from "@calcom/platform-types"; @Injectable() export class PrivateLinksOutputService { constructor() {} - transformToOutput(data: PrivateLinkData): PrivateLinkOutput_2024_06_14 { + transformToOutput(data: PrivateLinkData): PrivateLinkOutput { const baseData = { linkId: data.id.toString(), eventTypeId: data.eventTypeId, @@ -21,19 +17,17 @@ export class PrivateLinksOutputService { }; if (data.expiresAt !== null && data.expiresAt !== undefined) { - return plainToClass( - TimeBasedPrivateLinkOutput_2024_06_14, - { ...baseData, expiresAt: data.expiresAt } - ); + return plainToClass(TimeBasedPrivateLinkOutput, { ...baseData, expiresAt: data.expiresAt }); } - return plainToClass( - UsageBasedPrivateLinkOutput_2024_06_14, - { ...baseData, maxUsageCount: data.maxUsageCount || 0, usageCount: data.usageCount || 0 } - ); + return plainToClass(UsageBasedPrivateLinkOutput, { + ...baseData, + maxUsageCount: data.maxUsageCount || 0, + usageCount: data.usageCount || 0, + }); } - transformArrayToOutput(data: PrivateLinkData[]): PrivateLinkOutput_2024_06_14[] { + 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 index f8c327ca94de10..c1a98a75151415 100644 --- 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 @@ -6,14 +6,10 @@ import { getPrivateLinks, updatePrivateLink, } from "@calcom/platform-libraries/private-links"; -import { - CreatePrivateLinkInput_2024_06_14, - PrivateLinkOutput_2024_06_14, - UpdatePrivateLinkInput_2024_06_14, -} from "@calcom/platform-types"; +import { CreatePrivateLinkInput, PrivateLinkOutput, UpdatePrivateLinkInput } from "@calcom/platform-types"; -import { PrivateLinksInputService } from "./private-links-input.service"; -import { PrivateLinksOutputService } from "./private-links-output.service"; +import { PrivateLinksInputService } from "@/ee/event-types-private-links/services/private-links-input.service"; +import { PrivateLinksOutputService } from "@/ee/event-types-private-links/services/private-links-output.service"; @Injectable() export class PrivateLinksService { @@ -25,8 +21,8 @@ export class PrivateLinksService { async createPrivateLink( eventTypeId: number, userId: number, - input: CreatePrivateLinkInput_2024_06_14 - ): Promise { + input: CreatePrivateLinkInput + ): Promise { try { const transformedInput = this.inputService.transformCreateInput(input); const result = await createPrivateLink(eventTypeId, userId, transformedInput); @@ -39,7 +35,7 @@ export class PrivateLinksService { } } - async getPrivateLinks(eventTypeId: number, userId: number): Promise { + async getPrivateLinks(eventTypeId: number, userId: number): Promise { try { const results = await getPrivateLinks(eventTypeId, userId); return this.outputService.transformArrayToOutput(results); @@ -54,8 +50,8 @@ export class PrivateLinksService { async updatePrivateLink( eventTypeId: number, userId: number, - input: UpdatePrivateLinkInput_2024_06_14 - ): Promise { + input: UpdatePrivateLinkInput + ): Promise { try { const transformedInput = this.inputService.transformUpdateInput(input); const result = await updatePrivateLink(eventTypeId, userId, transformedInput); diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 6b02b8accefef7..d28321838887b6 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -9921,7 +9921,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePrivateLinkInput_2024_06_14" + "$ref": "#/components/schemas/CreatePrivateLinkInput" } } } @@ -9932,7 +9932,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/CreatePrivateLinkOutput" } } } @@ -9970,7 +9970,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GetPrivateLinksOutput_2024_06_14" + "$ref": "#/components/schemas/GetPrivateLinksOutput" } } } @@ -10018,7 +10018,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdatePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UpdatePrivateLinkOutput" } } } @@ -10064,7 +10064,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeletePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/DeletePrivateLinkOutput" } } } @@ -25648,7 +25648,7 @@ "data" ] }, - "CreatePrivateLinkInput_2024_06_14": { + "CreatePrivateLinkInput": { "type": "object", "properties": { "expiresAt": { @@ -25665,7 +25665,7 @@ } } }, - "CreatePrivateLinkOutput_2024_06_14": { + "CreatePrivateLinkOutput": { "type": "object", "properties": { "status": { @@ -25677,10 +25677,10 @@ "description": "Created private link data (either time-based or usage-based)", "oneOf": [ { - "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" }, { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" } ] } @@ -25690,7 +25690,7 @@ "data" ] }, - "GetPrivateLinksOutput_2024_06_14": { + "GetPrivateLinksOutput": { "type": "object", "properties": { "status": { @@ -25704,10 +25704,10 @@ "items": { "oneOf": [ { - "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" }, { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" } ] } @@ -25718,7 +25718,7 @@ "data" ] }, - "UpdatePrivateLinkOutput_2024_06_14": { + "UpdatePrivateLinkOutput": { "type": "object", "properties": { "status": { @@ -25730,10 +25730,10 @@ "description": "Updated private link data (either time-based or usage-based)", "oneOf": [ { - "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" }, { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" } ] } @@ -25743,7 +25743,7 @@ "data" ] }, - "DeletePrivateLinkOutput_2024_06_14": { + "DeletePrivateLinkOutput": { "type": "object", "properties": { "status": { diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index 6b02b8accefef7..d28321838887b6 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -9921,7 +9921,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePrivateLinkInput_2024_06_14" + "$ref": "#/components/schemas/CreatePrivateLinkInput" } } } @@ -9932,7 +9932,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreatePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/CreatePrivateLinkOutput" } } } @@ -9970,7 +9970,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GetPrivateLinksOutput_2024_06_14" + "$ref": "#/components/schemas/GetPrivateLinksOutput" } } } @@ -10018,7 +10018,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdatePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UpdatePrivateLinkOutput" } } } @@ -10064,7 +10064,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DeletePrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/DeletePrivateLinkOutput" } } } @@ -25648,7 +25648,7 @@ "data" ] }, - "CreatePrivateLinkInput_2024_06_14": { + "CreatePrivateLinkInput": { "type": "object", "properties": { "expiresAt": { @@ -25665,7 +25665,7 @@ } } }, - "CreatePrivateLinkOutput_2024_06_14": { + "CreatePrivateLinkOutput": { "type": "object", "properties": { "status": { @@ -25677,10 +25677,10 @@ "description": "Created private link data (either time-based or usage-based)", "oneOf": [ { - "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" }, { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" } ] } @@ -25690,7 +25690,7 @@ "data" ] }, - "GetPrivateLinksOutput_2024_06_14": { + "GetPrivateLinksOutput": { "type": "object", "properties": { "status": { @@ -25704,10 +25704,10 @@ "items": { "oneOf": [ { - "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" }, { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" } ] } @@ -25718,7 +25718,7 @@ "data" ] }, - "UpdatePrivateLinkOutput_2024_06_14": { + "UpdatePrivateLinkOutput": { "type": "object", "properties": { "status": { @@ -25730,10 +25730,10 @@ "description": "Updated private link data (either time-based or usage-based)", "oneOf": [ { - "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/TimeBasedPrivateLinkOutput" }, { - "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" + "$ref": "#/components/schemas/UsageBasedPrivateLinkOutput" } ] } @@ -25743,7 +25743,7 @@ "data" ] }, - "DeletePrivateLinkOutput_2024_06_14": { + "DeletePrivateLinkOutput": { "type": "object", "properties": { "status": { diff --git a/packages/lib/server/service/hashedLinkService.ts b/packages/lib/server/service/hashedLinkService.ts index 4d55e196b8ebd0..fd2ec76dac0988 100644 --- a/packages/lib/server/service/hashedLinkService.ts +++ b/packages/lib/server/service/hashedLinkService.ts @@ -129,6 +129,36 @@ export class HashedLinkService { return hashedLink; } + /** + * Create a private link for an event type + */ + async createLinkForEventType(eventTypeId: number, input: string | HashedLinkInputType) { + const normalized = this.normalizeLinkInput(input); + return this.hashedLinkRepository.createLink(eventTypeId, normalized); + } + + /** + * Update an existing private link for an event type + */ + async updateLinkForEventType(eventTypeId: number, input: string | HashedLinkInputType) { + const normalized = this.normalizeLinkInput(input); + return this.hashedLinkRepository.updateLink(eventTypeId, normalized); + } + + /** + * Delete a private link for an event type + */ + async deleteLinkForEventType(eventTypeId: number, linkId: string) { + return this.hashedLinkRepository.deleteLinks(eventTypeId, [linkId]); + } + + /** + * List links for an event type (lightweight fields) + */ + 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/private-links.ts b/packages/platform/libraries/private-links.ts index 0b59467a0c45a4..6827e86c8b6744 100644 --- a/packages/platform/libraries/private-links.ts +++ b/packages/platform/libraries/private-links.ts @@ -1,11 +1,7 @@ import { generateHashedLink } from "@calcom/lib/generateHashedLink"; import { isLinkExpired as utilsIsLinkExpired } from "@calcom/lib/hashedLinksUtils"; import { HashedLinkService } from "@calcom/lib/server/service/hashedLinkService"; -import { HashedLinkRepository } from "@calcom/lib/server/repository/hashedLinkRepository"; -import type { - CreatePrivateLinkInput_2024_06_14, - UpdatePrivateLinkInput_2024_06_14 -} from "@calcom/platform-types"; +import type { CreatePrivateLinkInput, UpdatePrivateLinkInput } from "@calcom/platform-types"; export type PrivateLinkData = { id: string | number; @@ -16,163 +12,103 @@ export type PrivateLinkData = { isExpired: boolean; bookingUrl: string; }; +// Helpers (module-scoped, no class) +const hashedLinkService = new HashedLinkService(); + +const formatPrivateLinkOutput = ( + link: any, + eventTypeId: number, + eventTypeSlug?: string +): PrivateLinkData => { + const isExpired = utilsIsLinkExpired(link); + const bookingUrl = `${process.env.NEXT_PUBLIC_WEBAPP_URL || "https://cal.com"}/d/${link.link}${ + eventTypeSlug ? `/${eventTypeSlug}` : "" + }`; + + return { + id: link.link, + expiresAt: link.expiresAt, + maxUsageCount: link.maxUsageCount, + usageCount: link.usageCount || 0, + eventTypeId, + isExpired, + bookingUrl, + }; +}; - - -/** - * Internal service for managing private links - * This wraps the existing HashedLinkService and HashedLinkRepository - */ -class PlatformPrivateLinksService { - private readonly hashedLinkService: HashedLinkService; - private readonly hashedLinkRepository: HashedLinkRepository; - - constructor() { - this.hashedLinkService = new HashedLinkService(); - this.hashedLinkRepository = HashedLinkRepository.create(); - } - - async createPrivateLink( - eventTypeId: number, - userId: number, - input: CreatePrivateLinkInput_2024_06_14 - ): Promise { - // Generate a new hashed link ID - const linkId = generateHashedLink(userId); - - // Create the link - const createdLink = await this.hashedLinkRepository.createLink(eventTypeId, { - link: linkId, - expiresAt: input.expiresAt || null, - maxUsageCount: input.maxUsageCount || null, - }); - - return this.formatPrivateLinkOutput(createdLink, eventTypeId); - } - - async getPrivateLinks(eventTypeId: number, userId: number): Promise { - // First verify that the user owns the event type - await this.checkUserPermission(eventTypeId, userId); - - const links = await this.hashedLinkRepository.findLinksByEventTypeId(eventTypeId); - - return links.map((link) => this.formatPrivateLinkOutput(link, eventTypeId)); - } - - async updatePrivateLink( - eventTypeId: number, - userId: number, - input: UpdatePrivateLinkInput_2024_06_14 - ): Promise { - // First verify that the user has permission to update this link - await this.checkUserPermission(eventTypeId, userId); - - // Verify the link exists and belongs to this event type - const existingLink = await this.hashedLinkRepository.findLinkWithEventTypeDetails(input.linkId); - - if (!existingLink || existingLink.eventTypeId !== eventTypeId) { - throw new Error(`Private link with ID ${input.linkId} not found for this event type`); - } - - // Update the link - await this.hashedLinkRepository.updateLink(eventTypeId, { - link: input.linkId, - expiresAt: input.expiresAt || null, - maxUsageCount: input.maxUsageCount || null, - }); - - // Fetch the updated link - const updatedLink = await this.hashedLinkRepository.findLinkWithEventTypeDetails(input.linkId); - - if (!updatedLink) { - throw new Error(`Failed to retrieve updated link`); +const checkUserPermission = async (eventTypeId: number, userId: number): Promise => { + const links = await hashedLinkService.listLinksByEventType(eventTypeId); + if (links.length > 0) { + const firstLink = links[0]; + const linkWithDetails = await hashedLinkService.findLinkWithDetails(firstLink.link); + if (linkWithDetails) { + const hasPermission = await hashedLinkService.checkUserPermissionForLink( + { eventType: linkWithDetails.eventType }, + userId + ); + if (!hasPermission) { + throw new Error(`User does not have permission to access event type ${eventTypeId}`); + } } - - return this.formatPrivateLinkOutput(updatedLink, eventTypeId); } + // If no links exist yet, assume permission to create; real impl should verify event type ownership. +}; - async deletePrivateLink(eventTypeId: number, userId: number, linkId: string): Promise { - // First verify that the user has permission to delete this link - await this.checkUserPermission(eventTypeId, userId); - - // Verify the link exists and belongs to this event type - const existingLink = await this.hashedLinkRepository.findLinkWithEventTypeDetails(linkId); +// Public API +export const createPrivateLink = async ( + eventTypeId: number, + userId: number, + input: CreatePrivateLinkInput +): Promise => { + const linkId = generateHashedLink(userId); + const createdLink = await hashedLinkService.createLinkForEventType(eventTypeId, { + link: linkId, + expiresAt: input.expiresAt || null, + maxUsageCount: input.maxUsageCount || null, + }); + return formatPrivateLinkOutput(createdLink, eventTypeId); +}; - if (!existingLink || existingLink.eventTypeId !== eventTypeId) { - throw new Error(`Private link with ID ${linkId} not found for this event type`); - } +export const getPrivateLinks = async ( + eventTypeId: number, + userId: number +): Promise => { + await checkUserPermission(eventTypeId, userId); + const links = await hashedLinkService.listLinksByEventType(eventTypeId); + return links.map((link) => formatPrivateLinkOutput(link, eventTypeId)); +}; - // Delete the link - await this.hashedLinkRepository.deleteLinks(eventTypeId, [linkId]); +export const updatePrivateLink = async ( + eventTypeId: number, + userId: number, + input: UpdatePrivateLinkInput +): Promise => { + await checkUserPermission(eventTypeId, userId); + const existingLink = await hashedLinkService.findLinkWithDetails(input.linkId); + if (!existingLink || existingLink.eventTypeId !== eventTypeId) { + throw new Error(`Private link with ID ${input.linkId} not found for this event type`); } - - - - private async checkUserPermission(eventTypeId: number, userId: number): Promise { - // This is a simplified check - in a real implementation, you might want to - // check through the event types service to ensure proper ownership validation - const links = await this.hashedLinkRepository.findLinksByEventTypeId(eventTypeId); - - if (links.length > 0) { - // If links exist, we can check permissions through the existing hashedLinkService - const firstLink = links[0]; - const linkWithDetails = await this.hashedLinkRepository.findLinkWithEventTypeDetails(firstLink.link); - - if (linkWithDetails) { - const hasPermission = await this.hashedLinkService.checkUserPermissionForLink( - { eventType: linkWithDetails.eventType }, - userId - ); - - if (!hasPermission) { - throw new Error(`User does not have permission to access event type ${eventTypeId}`); - } - } - } - // If no links exist yet, we assume the user has permission to create them - // In a production environment, you'd want to verify event type ownership here + await hashedLinkService.updateLinkForEventType(eventTypeId, { + link: input.linkId, + expiresAt: input.expiresAt || null, + maxUsageCount: input.maxUsageCount || null, + }); + const updatedLink = await hashedLinkService.findLinkWithDetails(input.linkId); + if (!updatedLink) { + throw new Error("Failed to retrieve updated link"); } + return formatPrivateLinkOutput(updatedLink, eventTypeId); +}; - private formatPrivateLinkOutput( - link: any, - eventTypeId: number, - eventTypeSlug?: string - ): PrivateLinkData { - const isExpired = utilsIsLinkExpired(link); - const bookingUrl = `${process.env.NEXT_PUBLIC_WEBAPP_URL || "https://cal.com"}/d/${link.link}${ - eventTypeSlug ? `/${eventTypeSlug}` : "" - }`; - - return { - id: link.link, - expiresAt: link.expiresAt, - maxUsageCount: link.maxUsageCount, - usageCount: link.usageCount || 0, - eventTypeId, - isExpired, - bookingUrl, - }; +export const deletePrivateLink = async ( + eventTypeId: number, + userId: number, + linkId: string +): Promise => { + await checkUserPermission(eventTypeId, userId); + const existingLink = await hashedLinkService.findLinkWithDetails(linkId); + if (!existingLink || existingLink.eventTypeId !== eventTypeId) { + throw new Error(`Private link with ID ${linkId} not found for this event type`); } -} - -// Internal service instance (not exported) -const platformPrivateLinksService = new PlatformPrivateLinksService(); - -// Export individual functions for convenience -export const createPrivateLink = ( - eventTypeId: number, - userId: number, - input: CreatePrivateLinkInput_2024_06_14 -) => platformPrivateLinksService.createPrivateLink(eventTypeId, userId, input); - -export const getPrivateLinks = (eventTypeId: number, userId: number) => - platformPrivateLinksService.getPrivateLinks(eventTypeId, userId); - -export const updatePrivateLink = ( - eventTypeId: number, - userId: number, - input: UpdatePrivateLinkInput_2024_06_14 -) => platformPrivateLinksService.updatePrivateLink(eventTypeId, userId, input); - -export const deletePrivateLink = (eventTypeId: number, userId: number, linkId: string) => - platformPrivateLinksService.deletePrivateLink(eventTypeId, userId, linkId); + await hashedLinkService.deleteLinkForEventType(eventTypeId, linkId); +}; diff --git a/packages/platform/types/event-types/event-types_2024_06_14/inputs/index.ts b/packages/platform/types/event-types/event-types_2024_06_14/inputs/index.ts index 955801d8d0eeec..4461d87e0b99f0 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/inputs/index.ts +++ b/packages/platform/types/event-types/event-types_2024_06_14/inputs/index.ts @@ -13,4 +13,3 @@ export * from "./event-type-color.input"; export * from "./seats.input"; export * from "./destination-calendar.input"; export * from "./disabled.input"; -export * from "./private-link.input"; 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/event-types_2024_06_14/inputs/private-link.input.ts b/packages/platform/types/event-types/inputs/private-link.input.ts similarity index 92% rename from packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts rename to packages/platform/types/event-types/inputs/private-link.input.ts index 37da913cdbd590..c3dd13447b500a 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/inputs/private-link.input.ts +++ b/packages/platform/types/event-types/inputs/private-link.input.ts @@ -2,7 +2,7 @@ import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; import { Type } from "class-transformer"; import { IsOptional, IsDate, IsInt, Min, IsString } from "class-validator"; -export class CreatePrivateLinkInput_2024_06_14 { +export class CreatePrivateLinkInput { @IsOptional() @IsDate() @Type(() => Date) @@ -25,7 +25,7 @@ export class CreatePrivateLinkInput_2024_06_14 { maxUsageCount?: number; } -export class UpdatePrivateLinkInput_2024_06_14 { +export class UpdatePrivateLinkInput { @IsString() @ApiProperty({ description: "The private link hash to update", 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..c2c2c28a797b98 --- /dev/null +++ b/packages/platform/types/event-types/outputs/private-link.output.ts @@ -0,0 +1,127 @@ +import { ApiProperty } 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, + 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: Date, + 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; + +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: "#/components/schemas/TimeBasedPrivateLinkOutput" }, + { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput" }, + ], + }) + data!: PrivateLinkOutput; +} + +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: "#/components/schemas/TimeBasedPrivateLinkOutput" }, + { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput" }, + ], + }, + }) + data!: PrivateLinkOutput[]; +} + +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: "#/components/schemas/TimeBasedPrivateLinkOutput" }, + { $ref: "#/components/schemas/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"; From ef8945280f82ac32f0adf3a3f753ac4071af2b05 Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Fri, 8 Aug 2025 20:14:55 +0400 Subject: [PATCH 07/15] clean up --- ...types-private-links.controller.e2e-spec.ts | 8 +-- .../event-types-private-links.controller.ts | 2 +- .../event-types-private-links.module.ts | 17 ----- .../private-links.repository.ts | 57 +++++++++++++++ .../services/private-links-output.service.ts | 10 ++- .../services/private-links.service.ts | 71 +++++++++++++++---- .../v2/src/ee/platform-endpoints-module.ts | 2 - 7 files changed, 124 insertions(+), 43 deletions(-) rename apps/api/v2/src/ee/event-types-private-links/{ => controllers}/event-types-private-links.controller.ts (98%) delete mode 100644 apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts create mode 100644 apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts 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 index b6961bc4090d68..ab91f87c5884d3 100644 --- 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 @@ -10,7 +10,7 @@ import { NestExpressApplication } from "@nestjs/platform-express"; import { Test } from "@nestjs/testing"; import * as request from "supertest"; -import { CAL_API_VERSION_HEADER, SUCCESS_STATUS, VERSION_2024_06_14 } from "@calcom/platform-constants"; +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"; @@ -103,7 +103,6 @@ describe("Event Types Private Links Endpoints", () => { const response = await request(app.getHttpServer()) .post(`/api/v2/event-types/${eventType.id}/private-links`) - .set(CAL_API_VERSION_HEADER, VERSION_2024_06_14) .set("Authorization", `Bearer whatever`) .send(body) .expect(201); @@ -117,7 +116,6 @@ describe("Event Types Private Links Endpoints", () => { 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(CAL_API_VERSION_HEADER, VERSION_2024_06_14) .set("Authorization", `Bearer whatever`) .expect(200); @@ -130,7 +128,6 @@ describe("Event Types Private Links Endpoints", () => { // create a link first const createResp = await request(app.getHttpServer()) .post(`/api/v2/event-types/${eventType.id}/private-links`) - .set(CAL_API_VERSION_HEADER, VERSION_2024_06_14) .set("Authorization", `Bearer whatever`) .send({ maxUsageCount: 3 }) .expect(201); @@ -139,7 +136,6 @@ describe("Event Types Private Links Endpoints", () => { const response = await request(app.getHttpServer()) .patch(`/api/v2/event-types/${eventType.id}/private-links/${linkId}`) - .set(CAL_API_VERSION_HEADER, VERSION_2024_06_14) .set("Authorization", `Bearer whatever`) .send({ maxUsageCount: 10 }) .expect(200); @@ -152,7 +148,6 @@ describe("Event Types Private Links Endpoints", () => { // create a link to delete const createResp = await request(app.getHttpServer()) .post(`/api/v2/event-types/${eventType.id}/private-links`) - .set(CAL_API_VERSION_HEADER, VERSION_2024_06_14) .set("Authorization", `Bearer whatever`) .send({ maxUsageCount: 2 }) .expect(201); @@ -161,7 +156,6 @@ describe("Event Types Private Links Endpoints", () => { const response = await request(app.getHttpServer()) .delete(`/api/v2/event-types/${eventType.id}/private-links/${linkId}`) - .set(CAL_API_VERSION_HEADER, VERSION_2024_06_14) .set("Authorization", `Bearer whatever`) .expect(200); diff --git a/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts similarity index 98% rename from apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts rename to apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts index 4823b47da8b90b..6bd9040d27d2d8 100644 --- a/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.controller.ts +++ b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts @@ -30,7 +30,7 @@ import { UpdatePrivateLinkOutput, } from "@calcom/platform-types"; -import { PrivateLinksService } from "./services/private-links.service"; +import { PrivateLinksService } from "../services/private-links.service"; @Controller({ path: "/v2/event-types/:eventTypeId/private-links", 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 deleted file mode 100644 index f08259cc223435..00000000000000 --- a/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Module } from "@nestjs/common"; -import { TokensModule } from "@/modules/tokens/tokens.module"; -import { OAuthClientModule } from "@/modules/oauth-clients/oauth-client.module"; - -import { EventTypesPrivateLinksController } from "./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"; - -@Module({ - imports: [TokensModule, OAuthClientModule], - controllers: [EventTypesPrivateLinksController], - providers: [PrivateLinksService, PrivateLinksInputService, PrivateLinksOutputService], -}) -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..12e30cfc47fd02 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts @@ -0,0 +1,57 @@ +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: { + id: true, + link: true, + expiresAt: true, + maxUsageCount: true, + usageCount: true, + eventTypeId: true, + eventType: { select: { teamId: true, userId: 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-output.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts index e948fb08f1f83e..35ce974f53bbcd 100644 --- 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 @@ -1,7 +1,15 @@ import { Injectable } from "@nestjs/common"; import { plainToClass } from "class-transformer"; -import { type PrivateLinkData } from "@calcom/platform-libraries/private-links"; +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() 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 index c1a98a75151415..721d7ac06dca1f 100644 --- 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 @@ -1,21 +1,22 @@ import { Injectable, NotFoundException, BadRequestException } from "@nestjs/common"; -import { - createPrivateLink, - deletePrivateLink, - getPrivateLinks, - updatePrivateLink, -} from "@calcom/platform-libraries/private-links"; +import { generateHashedLink } from "@calcom/lib/generateHashedLink"; +import { isLinkExpired } from "@calcom/lib/hashedLinksUtils"; import { CreatePrivateLinkInput, PrivateLinkOutput, UpdatePrivateLinkInput } from "@calcom/platform-types"; import { PrivateLinksInputService } from "@/ee/event-types-private-links/services/private-links-input.service"; -import { PrivateLinksOutputService } from "@/ee/event-types-private-links/services/private-links-output.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 outputService: PrivateLinksOutputService, + private readonly repo: PrivateLinksRepository ) {} async createPrivateLink( @@ -25,8 +26,21 @@ export class PrivateLinksService { ): Promise { try { const transformedInput = this.inputService.transformCreateInput(input); - const result = await createPrivateLink(eventTypeId, userId, transformedInput); - return this.outputService.transformToOutput(result); + 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); @@ -37,8 +51,17 @@ export class PrivateLinksService { async getPrivateLinks(eventTypeId: number, userId: number): Promise { try { - const results = await getPrivateLinks(eventTypeId, userId); - return this.outputService.transformArrayToOutput(results); + 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); @@ -54,8 +77,26 @@ export class PrivateLinksService { ): Promise { try { const transformedInput = this.inputService.transformUpdateInput(input); - const result = await updatePrivateLink(eventTypeId, userId, transformedInput); - return this.outputService.transformToOutput(result); + 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")) { @@ -69,7 +110,7 @@ export class PrivateLinksService { async deletePrivateLink(eventTypeId: number, userId: number, linkId: string): Promise { try { - await deletePrivateLink(eventTypeId, userId, linkId); + await this.repo.delete(eventTypeId, linkId); } catch (error) { if (error instanceof Error) { if (error.message.includes("not found")) { diff --git a/apps/api/v2/src/ee/platform-endpoints-module.ts b/apps/api/v2/src/ee/platform-endpoints-module.ts index 525c6c57ddc919..2185ef80a0c652 100644 --- a/apps/api/v2/src/ee/platform-endpoints-module.ts +++ b/apps/api/v2/src/ee/platform-endpoints-module.ts @@ -4,7 +4,6 @@ import { CalendarsModule } from "@/ee/calendars/calendars.module"; import { EventTypesModule_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/event-types.module"; import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; import { GcalModule } from "@/ee/gcal/gcal.module"; -import { EventTypesPrivateLinksModule } from "@/ee/event-types-private-links/event-types-private-links.module"; import { MeModule } from "@/ee/me/me.module"; import { ProviderModule } from "@/ee/provider/provider.module"; import { SchedulesModule_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/schedules.module"; @@ -28,7 +27,6 @@ import { Module } from "@nestjs/common"; MeModule, EventTypesModule_2024_04_15, EventTypesModule_2024_06_14, - EventTypesPrivateLinksModule, CalendarsModule, BookingsModule_2024_04_15, BookingsModule_2024_08_13, From 29a95c4029f5175077a849c635c26ea2e10ba698 Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Fri, 8 Aug 2025 20:43:29 +0400 Subject: [PATCH 08/15] fix module import and others --- .../event-types-private-links.module.ts | 19 ++ .../services/private-links.service.ts | 3 +- .../v2/src/ee/platform-endpoints-module.ts | 2 + apps/api/v2/swagger/documentation.json | 246 +++++++++--------- docs/api-reference/v2/openapi.json | 246 +++++++++--------- packages/platform/libraries/private-links.ts | 117 +-------- 6 files changed, 272 insertions(+), 361 deletions(-) create mode 100644 apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts 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..83b25f330ed811 --- /dev/null +++ b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts @@ -0,0 +1,19 @@ +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 { 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], + controllers: [EventTypesPrivateLinksController], + providers: [PrivateLinksService, PrivateLinksInputService, PrivateLinksOutputService, PrivateLinksRepository], +}) +export class EventTypesPrivateLinksModule {} + + 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 index 721d7ac06dca1f..4648e0172939ed 100644 --- 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 @@ -1,7 +1,6 @@ import { Injectable, NotFoundException, BadRequestException } from "@nestjs/common"; -import { generateHashedLink } from "@calcom/lib/generateHashedLink"; -import { isLinkExpired } from "@calcom/lib/hashedLinksUtils"; +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"; 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/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index d28321838887b6..eb350fa3dd7c91 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -25648,129 +25648,6 @@ "data" ] }, - "CreatePrivateLinkInput": { - "type": "object", - "properties": { - "expiresAt": { - "format": "date-time", - "type": "string", - "description": "Expiration date for time-based links", - "example": "2024-12-31T23:59:59.000Z" - }, - "maxUsageCount": { - "type": "number", - "description": "Maximum number of times the link can be used", - "example": 10, - "minimum": 1 - } - } - }, - "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" - ] - }, - "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" - ] - }, "BookingInputAddressLocation_2024_08_13": { "type": "object", "properties": { @@ -28317,6 +28194,129 @@ "data" ] }, + "CreatePrivateLinkInput": { + "type": "object", + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "Expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times the link can be used", + "example": 10, + "minimum": 1 + } + } + }, + "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" + ] + }, + "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/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index d28321838887b6..eb350fa3dd7c91 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -25648,129 +25648,6 @@ "data" ] }, - "CreatePrivateLinkInput": { - "type": "object", - "properties": { - "expiresAt": { - "format": "date-time", - "type": "string", - "description": "Expiration date for time-based links", - "example": "2024-12-31T23:59:59.000Z" - }, - "maxUsageCount": { - "type": "number", - "description": "Maximum number of times the link can be used", - "example": 10, - "minimum": 1 - } - } - }, - "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" - ] - }, - "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" - ] - }, "BookingInputAddressLocation_2024_08_13": { "type": "object", "properties": { @@ -28317,6 +28194,129 @@ "data" ] }, + "CreatePrivateLinkInput": { + "type": "object", + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "Expiration date for time-based links", + "example": "2024-12-31T23:59:59.000Z" + }, + "maxUsageCount": { + "type": "number", + "description": "Maximum number of times the link can be used", + "example": 10, + "minimum": 1 + } + } + }, + "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" + ] + }, + "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/packages/platform/libraries/private-links.ts b/packages/platform/libraries/private-links.ts index 6827e86c8b6744..c654471d3d6cbd 100644 --- a/packages/platform/libraries/private-links.ts +++ b/packages/platform/libraries/private-links.ts @@ -1,114 +1,5 @@ -import { generateHashedLink } from "@calcom/lib/generateHashedLink"; -import { isLinkExpired as utilsIsLinkExpired } from "@calcom/lib/hashedLinksUtils"; -import { HashedLinkService } from "@calcom/lib/server/service/hashedLinkService"; -import type { CreatePrivateLinkInput, UpdatePrivateLinkInput } from "@calcom/platform-types"; +// Thin barrel for private-links utils used by API v2 +// Expose generateHashedLink and isLinkExpired from core lib under a stable platform-libraries import path +export { generateHashedLink } from "@calcom/lib/generateHashedLink"; +export { isLinkExpired } from "@calcom/lib/hashedLinksUtils"; -export type PrivateLinkData = { - id: string | number; - expiresAt?: Date | null; - maxUsageCount?: number | null; - usageCount?: number; - eventTypeId: number; - isExpired: boolean; - bookingUrl: string; -}; -// Helpers (module-scoped, no class) -const hashedLinkService = new HashedLinkService(); - -const formatPrivateLinkOutput = ( - link: any, - eventTypeId: number, - eventTypeSlug?: string -): PrivateLinkData => { - const isExpired = utilsIsLinkExpired(link); - const bookingUrl = `${process.env.NEXT_PUBLIC_WEBAPP_URL || "https://cal.com"}/d/${link.link}${ - eventTypeSlug ? `/${eventTypeSlug}` : "" - }`; - - return { - id: link.link, - expiresAt: link.expiresAt, - maxUsageCount: link.maxUsageCount, - usageCount: link.usageCount || 0, - eventTypeId, - isExpired, - bookingUrl, - }; -}; - -const checkUserPermission = async (eventTypeId: number, userId: number): Promise => { - const links = await hashedLinkService.listLinksByEventType(eventTypeId); - if (links.length > 0) { - const firstLink = links[0]; - const linkWithDetails = await hashedLinkService.findLinkWithDetails(firstLink.link); - if (linkWithDetails) { - const hasPermission = await hashedLinkService.checkUserPermissionForLink( - { eventType: linkWithDetails.eventType }, - userId - ); - if (!hasPermission) { - throw new Error(`User does not have permission to access event type ${eventTypeId}`); - } - } - } - // If no links exist yet, assume permission to create; real impl should verify event type ownership. -}; - -// Public API -export const createPrivateLink = async ( - eventTypeId: number, - userId: number, - input: CreatePrivateLinkInput -): Promise => { - const linkId = generateHashedLink(userId); - const createdLink = await hashedLinkService.createLinkForEventType(eventTypeId, { - link: linkId, - expiresAt: input.expiresAt || null, - maxUsageCount: input.maxUsageCount || null, - }); - return formatPrivateLinkOutput(createdLink, eventTypeId); -}; - -export const getPrivateLinks = async ( - eventTypeId: number, - userId: number -): Promise => { - await checkUserPermission(eventTypeId, userId); - const links = await hashedLinkService.listLinksByEventType(eventTypeId); - return links.map((link) => formatPrivateLinkOutput(link, eventTypeId)); -}; - -export const updatePrivateLink = async ( - eventTypeId: number, - userId: number, - input: UpdatePrivateLinkInput -): Promise => { - await checkUserPermission(eventTypeId, userId); - const existingLink = await hashedLinkService.findLinkWithDetails(input.linkId); - if (!existingLink || existingLink.eventTypeId !== eventTypeId) { - throw new Error(`Private link with ID ${input.linkId} not found for this event type`); - } - await hashedLinkService.updateLinkForEventType(eventTypeId, { - link: input.linkId, - expiresAt: input.expiresAt || null, - maxUsageCount: input.maxUsageCount || null, - }); - const updatedLink = await hashedLinkService.findLinkWithDetails(input.linkId); - if (!updatedLink) { - throw new Error("Failed to retrieve updated link"); - } - return formatPrivateLinkOutput(updatedLink, eventTypeId); -}; - -export const deletePrivateLink = async ( - eventTypeId: number, - userId: number, - linkId: string -): Promise => { - await checkUserPermission(eventTypeId, userId); - const existingLink = await hashedLinkService.findLinkWithDetails(linkId); - if (!existingLink || existingLink.eventTypeId !== eventTypeId) { - throw new Error(`Private link with ID ${linkId} not found for this event type`); - } - await hashedLinkService.deleteLinkForEventType(eventTypeId, linkId); -}; From f5b1a0120e60cc8588d6f3e27aad1572f4f41dbd Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Fri, 8 Aug 2025 21:06:51 +0400 Subject: [PATCH 09/15] add guards --- .../event-types-private-links.controller.ts | 9 ++--- .../event-types-private-links.module.ts | 12 +++++-- .../guards/event-type-ownership.guard.ts | 34 +++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts 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 index 6bd9040d27d2d8..e45290d426562c 100644 --- 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 @@ -3,6 +3,7 @@ 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, @@ -42,7 +43,7 @@ export class EventTypesPrivateLinksController { @Post("/") @Permissions([EVENT_TYPE_WRITE]) - @UseGuards(ApiAuthGuard) + @UseGuards(ApiAuthGuard, EventTypeOwnershipGuard) @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) @ApiOperation({ summary: "Create a private link for an event type" }) async createPrivateLink( @@ -60,7 +61,7 @@ export class EventTypesPrivateLinksController { @Get("/") @Permissions([EVENT_TYPE_READ]) - @UseGuards(ApiAuthGuard) + @UseGuards(ApiAuthGuard, EventTypeOwnershipGuard) @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) @ApiOperation({ summary: "Get all private links for an event type" }) async getPrivateLinks( @@ -77,7 +78,7 @@ export class EventTypesPrivateLinksController { @Patch("/:linkId") @Permissions([EVENT_TYPE_WRITE]) - @UseGuards(ApiAuthGuard) + @UseGuards(ApiAuthGuard, EventTypeOwnershipGuard) @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) @ApiOperation({ summary: "Update a private link for an event type" }) async updatePrivateLink( @@ -97,7 +98,7 @@ export class EventTypesPrivateLinksController { @Delete("/:linkId") @Permissions([EVENT_TYPE_WRITE]) - @UseGuards(ApiAuthGuard) + @UseGuards(ApiAuthGuard, EventTypeOwnershipGuard) @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) @ApiOperation({ summary: "Delete a private link for an event type" }) async deletePrivateLink( 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 index 83b25f330ed811..4b9643fc76e062 100644 --- 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 @@ -2,6 +2,8 @@ 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"; @@ -10,9 +12,15 @@ import { PrivateLinksService } from "./services/private-links.service"; import { PrivateLinksRepository } from "./private-links.repository"; @Module({ - imports: [TokensModule, OAuthClientModule, PrismaModule], + imports: [TokensModule, OAuthClientModule, PrismaModule, EventTypesModule_2024_06_14], controllers: [EventTypesPrivateLinksController], - providers: [PrivateLinksService, PrivateLinksInputService, PrivateLinksOutputService, PrivateLinksRepository], + providers: [ + PrivateLinksService, + PrivateLinksInputService, + PrivateLinksOutputService, + PrivateLinksRepository, + EventTypeOwnershipGuard, + ], }) export class EventTypesPrivateLinksModule {} 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..7e11ad1ac0166d --- /dev/null +++ b/apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts @@ -0,0 +1,34 @@ +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 { 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 ForbiddenException("EventTypeOwnershipGuard - Missing eventTypeId param."); + } + + const eventTypeId = parseInt(eventTypeIdParam); + 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; + } +} + + From 527e84f1269af4cffd30fe8be62bf8d17d71ffcb Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Mon, 11 Aug 2025 06:30:38 +0400 Subject: [PATCH 10/15] remove unnecessary comments --- apps/api/v2/package.json | 2 +- apps/api/v2/swagger/documentation.json | 45 +- docs/api-reference/v2/openapi.json | 4432 ++++------------- .../lib/server/service/hashedLinkService.ts | 12 - 4 files changed, 894 insertions(+), 3597 deletions(-) diff --git a/apps/api/v2/package.json b/apps/api/v2/package.json index c7d8abaab28e5c..e2fe12fdd2be20 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@9.9.9", "@calcom/platform-types": "*", "@calcom/platform-utils": "*", "@calcom/prisma": "*", diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index eb350fa3dd7c91..6d2c5bb4108d88 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -22038,7 +22038,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ] }, "recipient": { @@ -22400,7 +22401,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", @@ -22485,7 +22487,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", @@ -22561,7 +22564,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", @@ -22656,7 +22660,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_attendee", "description": "Action to perform", @@ -22725,7 +22730,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", @@ -22803,7 +22809,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", @@ -22881,7 +22888,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", @@ -23070,7 +23078,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", @@ -23160,7 +23169,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", @@ -23241,7 +23251,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", @@ -23322,7 +23333,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", @@ -23400,7 +23412,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", @@ -23483,7 +23496,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_attendee", "description": "Action to perform", @@ -23557,7 +23571,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", diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index eb350fa3dd7c91..c6bb6c12c7fc9e 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -69,9 +69,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] }, "post": { "operationId": "OAuthClientUsersController_createUser", @@ -117,9 +115,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] } }, "/v2/oauth-clients/{clientId}/users/{userId}": { @@ -165,9 +161,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] }, "patch": { "operationId": "OAuthClientUsersController_updateUser", @@ -221,9 +215,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] }, "delete": { "operationId": "OAuthClientUsersController_deleteUser", @@ -267,9 +259,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] } }, "/v2/oauth-clients/{clientId}/users/{userId}/force-refresh": { @@ -316,9 +306,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] } }, "/v2/oauth/{clientId}/refresh": { @@ -367,9 +355,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] } }, "/v2/oauth-clients/{clientId}/webhooks": { @@ -417,9 +403,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] }, "get": { "operationId": "OAuthClientWebhooksController_getOAuthClientWebhooks", @@ -480,9 +464,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] }, "delete": { "operationId": "OAuthClientWebhooksController_deleteAllOAuthClientWebhooks", @@ -518,9 +500,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] } }, "/v2/oauth-clients/{clientId}/webhooks/{webhookId}": { @@ -568,9 +548,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] }, "get": { "operationId": "OAuthClientWebhooksController_getOAuthClientWebhook", @@ -598,9 +576,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] }, "delete": { "operationId": "OAuthClientWebhooksController_deleteOAuthClientWebhook", @@ -628,9 +604,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] } }, "/v2/organizations/{orgId}/attributes": { @@ -693,9 +667,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] }, "post": { "operationId": "OrganizationsAttributesController_createOrganizationAttribute", @@ -741,9 +713,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] } }, "/v2/organizations/{orgId}/attributes/{attributeId}": { @@ -789,9 +759,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] }, "patch": { "operationId": "OrganizationsAttributesController_updateOrganizationAttribute", @@ -845,9 +813,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] }, "delete": { "operationId": "OrganizationsAttributesController_deleteOrganizationAttribute", @@ -891,9 +857,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options": { @@ -949,9 +913,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] }, "get": { "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptions", @@ -995,9 +957,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options/{optionId}": { @@ -1051,9 +1011,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] }, "patch": { "operationId": "OrganizationsAttributesOptionsController_updateOrganizationAttributeOption", @@ -1115,9 +1073,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options/assigned": { @@ -1207,9 +1163,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/slugs/{attributeSlug}/options/assigned": { @@ -1299,9 +1253,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/options/{userId}": { @@ -1357,9 +1309,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] }, "get": { "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptionsForUser", @@ -1403,9 +1353,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/options/{userId}/{attributeOptionId}": { @@ -1459,9 +1407,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/bookings": { @@ -1506,13 +1452,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "upcoming", - "recurring", - "past", - "cancelled", - "unconfirmed" - ] + "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] } } }, @@ -1653,10 +1593,7 @@ "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" } }, @@ -1667,10 +1604,7 @@ "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" } }, @@ -1681,10 +1615,7 @@ "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" } }, @@ -1695,10 +1626,7 @@ "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" } }, @@ -1755,9 +1683,7 @@ } } }, - "tags": [ - "Orgs / Bookings" - ] + "tags": ["Orgs / Bookings"] } }, "/v2/organizations/{orgId}/delegation-credentials": { @@ -1823,9 +1749,7 @@ } } }, - "tags": [ - "Orgs / Delegation Credentials" - ] + "tags": ["Orgs / Delegation Credentials"] } }, "/v2/organizations/{orgId}/delegation-credentials/{credentialId}": { @@ -1899,9 +1823,7 @@ } } }, - "tags": [ - "Orgs / Delegation Credentials" - ] + "tags": ["Orgs / Delegation Credentials"] } }, "/v2/organizations/{orgId}/memberships": { @@ -1982,9 +1904,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] }, "post": { "operationId": "OrganizationsMembershipsController_createMembership", @@ -2048,9 +1968,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] } }, "/v2/organizations/{orgId}/memberships/{membershipId}": { @@ -2114,9 +2032,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] }, "delete": { "operationId": "OrganizationsMembershipsController_deleteMembership", @@ -2178,9 +2094,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] }, "patch": { "operationId": "OrganizationsMembershipsController_updateMembership", @@ -2252,9 +2166,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] } }, "/v2/organizations/{orgId}/routing-forms": { @@ -2303,10 +2215,7 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -2316,10 +2225,7 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -2398,9 +2304,7 @@ } } }, - "tags": [ - "Orgs / Routing forms" - ] + "tags": ["Orgs / Routing forms"] } }, "/v2/organizations/{orgId}/routing-forms/{routingFormId}/responses": { @@ -2457,10 +2361,7 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -2470,10 +2371,7 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -2539,9 +2437,7 @@ } } }, - "tags": [ - "Orgs / Routing forms" - ] + "tags": ["Orgs / Routing forms"] }, "post": { "operationId": "OrganizationsRoutingFormsResponsesController_createRoutingFormResponse", @@ -2619,10 +2515,7 @@ "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" } }, @@ -2659,9 +2552,7 @@ } } }, - "tags": [ - "Orgs / Routing forms" - ] + "tags": ["Orgs / Routing forms"] } }, "/v2/organizations/{orgId}/routing-forms/{routingFormId}/responses/{responseId}": { @@ -2725,9 +2616,7 @@ } } }, - "tags": [ - "Orgs / Routing forms" - ] + "tags": ["Orgs / Routing forms"] } }, "/v2/organizations/{orgId}/schedules": { @@ -2808,9 +2697,7 @@ } } }, - "tags": [ - "Orgs / Schedules" - ] + "tags": ["Orgs / Schedules"] } }, "/v2/organizations/{orgId}/teams": { @@ -2891,9 +2778,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] }, "post": { "operationId": "OrganizationsTeamsController_createTeam", @@ -2957,9 +2842,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] } }, "/v2/organizations/{orgId}/teams/me": { @@ -3040,9 +2923,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] } }, "/v2/organizations/{orgId}/teams/{teamId}": { @@ -3090,9 +2971,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] }, "delete": { "operationId": "OrganizationsTeamsController_deleteTeam", @@ -3154,9 +3033,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] }, "patch": { "operationId": "OrganizationsTeamsController_updateTeam", @@ -3228,9 +3105,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] } }, "/v2/organizations/{orgId}/teams/{teamId}/bookings": { @@ -3275,13 +3150,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "upcoming", - "recurring", - "past", - "cancelled", - "unconfirmed" - ] + "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] } } }, @@ -3352,10 +3221,7 @@ "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" } }, @@ -3366,10 +3232,7 @@ "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" } }, @@ -3380,10 +3243,7 @@ "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" } }, @@ -3439,9 +3299,7 @@ } } }, - "tags": [ - "Orgs / Teams / Bookings" - ] + "tags": ["Orgs / Teams / Bookings"] } }, "/v2/organizations/{orgId}/teams/{teamId}/bookings/{bookingUid}/references": { @@ -3515,9 +3373,7 @@ } } }, - "tags": [ - "Orgs / Teams / Bookings" - ] + "tags": ["Orgs / Teams / Bookings"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/connect": { @@ -3547,9 +3403,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet" - ], + "enum": ["google-meet"], "type": "string" } } @@ -3566,9 +3420,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/oauth/auth-url": { @@ -3606,10 +3458,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "zoom", - "msteams" - ], + "enum": ["zoom", "msteams"], "type": "string" } }, @@ -3642,9 +3491,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing": { @@ -3673,9 +3520,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/default": { @@ -3697,12 +3542,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams", - "daily-video" - ], + "enum": ["google-meet", "zoom", "msteams", "daily-video"], "type": "string" } } @@ -3719,9 +3559,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/default": { @@ -3743,12 +3581,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams", - "daily-video" - ], + "enum": ["google-meet", "zoom", "msteams", "daily-video"], "type": "string" } } @@ -3765,9 +3598,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/disconnect": { @@ -3789,11 +3620,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams" - ], + "enum": ["google-meet", "zoom", "msteams"], "type": "string" } } @@ -3810,9 +3637,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/oauth/callback": { @@ -3866,9 +3691,7 @@ "description": "" } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types": { @@ -3942,9 +3765,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] }, "get": { "operationId": "OrganizationsEventTypesController_getTeamEventTypes", @@ -4016,9 +3837,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types/{eventTypeId}": { @@ -4082,9 +3901,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] }, "patch": { "operationId": "OrganizationsEventTypesController_updateTeamEventType", @@ -4156,9 +3973,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] }, "delete": { "operationId": "OrganizationsEventTypesController_deleteTeamEventType", @@ -4220,9 +4035,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types/{eventTypeId}/create-phone-call": { @@ -4296,9 +4109,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] } }, "/v2/organizations/{orgId}/teams/event-types": { @@ -4379,9 +4190,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] } }, "/v2/organizations/{orgId}/teams/{teamId}/memberships": { @@ -4470,9 +4279,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] }, "post": { "operationId": "OrganizationsTeamsMembershipsController_createOrgTeamMembership", @@ -4544,9 +4351,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] } }, "/v2/organizations/{orgId}/teams/{teamId}/memberships/{membershipId}": { @@ -4618,9 +4423,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] }, "delete": { "operationId": "OrganizationsTeamsMembershipsController_deleteOrgTeamMembership", @@ -4690,9 +4493,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] }, "patch": { "operationId": "OrganizationsTeamsMembershipsController_updateOrgTeamMembership", @@ -4772,9 +4573,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms": { @@ -4831,10 +4630,7 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -4844,10 +4640,7 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -4913,9 +4706,7 @@ } } }, - "tags": [ - "Orgs / Teams / Routing forms" - ] + "tags": ["Orgs / Teams / Routing forms"] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routingFormId}/responses": { @@ -4980,10 +4771,7 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -4993,10 +4781,7 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -5062,9 +4847,7 @@ } } }, - "tags": [ - "Orgs / Teams / Routing forms / Responses" - ] + "tags": ["Orgs / Teams / Routing forms / Responses"] }, "post": { "operationId": "OrganizationsTeamsRoutingFormsResponsesController_createRoutingFormResponse", @@ -5150,10 +4933,7 @@ "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" } }, @@ -5190,9 +4970,7 @@ } } }, - "tags": [ - "Orgs / Teams / Routing forms / Responses" - ] + "tags": ["Orgs / Teams / Routing forms / Responses"] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routingFormId}/responses/{responseId}": { @@ -5256,9 +5034,7 @@ } } }, - "tags": [ - "Orgs / Teams / Routing forms / Responses" - ] + "tags": ["Orgs / Teams / Routing forms / Responses"] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/connect": { @@ -5319,9 +5095,7 @@ } } }, - "tags": [ - "Orgs / Teams / Stripe" - ] + "tags": ["Orgs / Teams / Stripe"] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/check": { @@ -5350,9 +5124,7 @@ } } }, - "tags": [ - "Orgs / Teams / Stripe" - ] + "tags": ["Orgs / Teams / Stripe"] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/save": { @@ -5397,9 +5169,7 @@ } } }, - "tags": [ - "Orgs / Teams / Stripe" - ] + "tags": ["Orgs / Teams / Stripe"] } }, "/v2/organizations/{orgId}/teams/{teamId}/users/{userId}/schedules": { @@ -5455,9 +5225,7 @@ } } }, - "tags": [ - "Orgs / Teams / Users / Schedules" - ] + "tags": ["Orgs / Teams / Users / Schedules"] } }, "/v2/organizations/{orgId}/teams/{teamId}/workflows": { @@ -5546,9 +5314,7 @@ } } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] }, "post": { "operationId": "OrganizationTeamWorkflowsController_createWorkflow", @@ -5612,9 +5378,7 @@ } } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] } }, "/v2/organizations/{orgId}/teams/{teamId}/workflows/{workflowId}": { @@ -5678,9 +5442,7 @@ } } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] }, "patch": { "operationId": "OrganizationTeamWorkflowsController_updateWorkflow", @@ -5752,9 +5514,7 @@ } } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] }, "delete": { "operationId": "OrganizationTeamWorkflowsController_deleteWorkflow", @@ -5809,9 +5569,7 @@ "description": "" } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] } }, "/v2/organizations/{orgId}/users": { @@ -5910,11 +5668,7 @@ "example": "NONE", "schema": { "default": "AND", - "enum": [ - "OR", - "AND", - "NONE" - ], + "enum": ["OR", "AND", "NONE"], "type": "string" } }, @@ -5944,9 +5698,7 @@ } } }, - "tags": [ - "Orgs / Users" - ] + "tags": ["Orgs / Users"] }, "post": { "operationId": "OrganizationsUsersController_createOrganizationUser", @@ -6002,9 +5754,7 @@ } } }, - "tags": [ - "Orgs / Users" - ] + "tags": ["Orgs / Users"] } }, "/v2/organizations/{orgId}/users/{userId}": { @@ -6078,9 +5828,7 @@ } } }, - "tags": [ - "Orgs / Users" - ] + "tags": ["Orgs / Users"] }, "delete": { "operationId": "OrganizationsUsersController_deleteOrganizationUser", @@ -6142,9 +5890,7 @@ } } }, - "tags": [ - "Orgs / Users" - ] + "tags": ["Orgs / Users"] } }, "/v2/organizations/{orgId}/users/{userId}/bookings": { @@ -6205,13 +5951,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "upcoming", - "recurring", - "past", - "cancelled", - "unconfirmed" - ] + "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] } } }, @@ -6352,10 +6092,7 @@ "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" } }, @@ -6366,10 +6103,7 @@ "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" } }, @@ -6380,10 +6114,7 @@ "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" } }, @@ -6394,10 +6125,7 @@ "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" } }, @@ -6429,9 +6157,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / Bookings" - ] + "tags": ["Orgs / Users / Bookings"] } }, "/v2/organizations/{orgId}/users/{userId}/ooo": { @@ -6506,10 +6232,7 @@ "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" } }, @@ -6520,10 +6243,7 @@ "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" } } @@ -6533,9 +6253,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] }, "post": { "operationId": "OrganizationsUsersOOOController_createOrganizationUserOOO", @@ -6592,9 +6310,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] } }, "/v2/organizations/{orgId}/users/{userId}/ooo/{oooId}": { @@ -6661,9 +6377,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] }, "delete": { "operationId": "OrganizationsUsersOOOController_deleteOrganizationUserOOO", @@ -6710,9 +6424,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] } }, "/v2/organizations/{orgId}/ooo": { @@ -6787,10 +6499,7 @@ "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" } }, @@ -6801,10 +6510,7 @@ "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" } }, @@ -6824,9 +6530,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] } }, "/v2/organizations/{orgId}/users/{userId}/schedules": { @@ -6892,9 +6596,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] }, "get": { "operationId": "OrganizationsSchedulesController_getUserSchedules", @@ -6948,9 +6650,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] } }, "/v2/organizations/{orgId}/users/{userId}/schedules/{scheduleId}": { @@ -7014,9 +6714,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] }, "patch": { "operationId": "OrganizationsSchedulesController_updateUserSchedule", @@ -7088,9 +6786,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] }, "delete": { "operationId": "OrganizationsSchedulesController_deleteUserSchedule", @@ -7152,9 +6848,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] } }, "/v2/organizations/{orgId}/webhooks": { @@ -7235,9 +6929,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] }, "post": { "operationId": "OrganizationsWebhooksController_createOrganizationWebhook", @@ -7301,9 +6993,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] } }, "/v2/organizations/{orgId}/webhooks/{webhookId}": { @@ -7359,9 +7049,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] }, "delete": { "operationId": "OrganizationsWebhooksController_deleteWebhook", @@ -7415,9 +7103,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] }, "patch": { "operationId": "OrganizationsWebhooksController_updateOrgWebhook", @@ -7481,9 +7167,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] } }, "/v2/api-keys/refresh": { @@ -7524,9 +7208,7 @@ } } }, - "tags": [ - "Api Keys" - ] + "tags": ["Api Keys"] } }, "/v2/bookings": { @@ -7579,9 +7261,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] }, "get": { "operationId": "BookingsController_2024_08_13_getBookings", @@ -7607,13 +7287,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "upcoming", - "recurring", - "past", - "cancelled", - "unconfirmed" - ] + "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] } } }, @@ -7754,10 +7428,7 @@ "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" } }, @@ -7768,10 +7439,7 @@ "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" } }, @@ -7782,10 +7450,7 @@ "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" } }, @@ -7796,10 +7461,7 @@ "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" } }, @@ -7847,9 +7509,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}": { @@ -7889,9 +7549,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/recordings": { @@ -7931,9 +7589,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/transcripts": { @@ -7973,9 +7629,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/reschedule": { @@ -8033,9 +7687,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/cancel": { @@ -8093,9 +7745,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/mark-absent": { @@ -8154,9 +7804,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/reassign": { @@ -8205,9 +7853,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/reassign/{userId}": { @@ -8274,9 +7920,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/confirm": { @@ -8325,9 +7969,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/decline": { @@ -8386,9 +8028,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/calendar-links": { @@ -8437,9 +8077,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/references": { @@ -8505,9 +8143,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/calendars/{calendar}/event/{eventUid}": { @@ -8521,9 +8157,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "google" - ], + "enum": ["google"], "type": "string" } }, @@ -8558,9 +8192,7 @@ } } }, - "tags": [ - "Cal Unified Calendars" - ] + "tags": ["Cal Unified Calendars"] } }, "/v2/calendars/ics-feed/save": { @@ -8600,9 +8232,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/ics-feed/check": { @@ -8632,9 +8262,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/busy-times": { @@ -8711,9 +8339,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars": { @@ -8743,9 +8369,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/connect": { @@ -8767,10 +8391,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "office365", - "google" - ], + "enum": ["office365", "google"], "type": "string" } }, @@ -8804,9 +8425,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/save": { @@ -8835,10 +8454,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "office365", - "google" - ], + "enum": ["office365", "google"], "type": "string" } } @@ -8848,9 +8464,7 @@ "description": "" } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/credentials": { @@ -8863,9 +8477,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "apple" - ], + "enum": ["apple"], "type": "string" } }, @@ -8894,9 +8506,7 @@ "description": "" } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/check": { @@ -8909,11 +8519,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "apple", - "google", - "office365" - ], + "enum": ["apple", "google", "office365"], "type": "string" } }, @@ -8939,9 +8545,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/disconnect": { @@ -8954,11 +8558,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "apple", - "google", - "office365" - ], + "enum": ["apple", "google", "office365"], "type": "string" } }, @@ -8994,9 +8594,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/conferencing/{app}/connect": { @@ -9010,9 +8608,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet" - ], + "enum": ["google-meet"], "type": "string" } }, @@ -9038,9 +8634,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/{app}/oauth/auth-url": { @@ -9063,10 +8657,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "zoom", - "msteams" - ], + "enum": ["zoom", "msteams"], "type": "string" } }, @@ -9099,9 +8690,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/{app}/oauth/callback": { @@ -9123,10 +8712,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "zoom", - "msteams" - ], + "enum": ["zoom", "msteams"], "type": "string" } }, @@ -9144,9 +8730,7 @@ "description": "" } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing": { @@ -9176,9 +8760,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/{app}/default": { @@ -9192,12 +8774,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams", - "daily-video" - ], + "enum": ["google-meet", "zoom", "msteams", "daily-video"], "type": "string" } }, @@ -9223,9 +8800,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/default": { @@ -9255,9 +8830,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/{app}/disconnect": { @@ -9271,11 +8844,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams" - ], + "enum": ["google-meet", "zoom", "msteams"], "type": "string" } }, @@ -9301,9 +8870,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/destination-calendars": { @@ -9343,9 +8910,7 @@ } } }, - "tags": [ - "Destination Calendars" - ] + "tags": ["Destination Calendars"] } }, "/v2/event-types": { @@ -9395,9 +8960,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] }, "get": { "operationId": "EventTypesController_2024_06_14_getEventTypes", @@ -9471,9 +9034,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] } }, "/v2/event-types/{eventTypeId}": { @@ -9521,9 +9082,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] }, "patch": { "operationId": "EventTypesController_2024_06_14_updateEventType", @@ -9579,9 +9138,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] }, "delete": { "operationId": "EventTypesController_2024_06_14_deleteEventType", @@ -9627,9 +9184,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] } }, "/v2/event-types/{eventTypeId}/webhooks": { @@ -9677,9 +9232,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] }, "get": { "operationId": "EventTypeWebhooksController_getEventTypeWebhooks", @@ -9740,9 +9293,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] }, "delete": { "operationId": "EventTypeWebhooksController_deleteAllEventTypeWebhooks", @@ -9778,9 +9329,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] } }, "/v2/event-types/{eventTypeId}/webhooks/{webhookId}": { @@ -9828,9 +9377,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] }, "get": { "operationId": "EventTypeWebhooksController_getEventTypeWebhook", @@ -9858,9 +9405,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] }, "delete": { "operationId": "EventTypeWebhooksController_deleteEventTypeWebhook", @@ -9888,9 +9433,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] } }, "/v2/event-types/{eventTypeId}/private-links": { @@ -9938,9 +9481,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] }, "get": { "operationId": "EventTypesPrivateLinksController_getPrivateLinks", @@ -9976,9 +9517,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] } }, "/v2/event-types/{eventTypeId}/private-links/{linkId}": { @@ -10024,9 +9563,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] }, "delete": { "operationId": "EventTypesPrivateLinksController_deletePrivateLink", @@ -10070,9 +9607,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] } }, "/v2/organizations/{orgId}/organizations": { @@ -10130,9 +9665,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] }, "get": { "operationId": "OrganizationsOrganizationsController_getOrganizations", @@ -10233,9 +9766,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] } }, "/v2/organizations/{orgId}/organizations/{managedOrganizationId}": { @@ -10283,9 +9814,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] }, "patch": { "operationId": "OrganizationsOrganizationsController_updateOrganization", @@ -10349,9 +9878,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] }, "delete": { "operationId": "OrganizationsOrganizationsController_deleteOrganization", @@ -10397,9 +9924,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] } }, "/v2/me": { @@ -10429,9 +9954,7 @@ } } }, - "tags": [ - "Me" - ] + "tags": ["Me"] }, "patch": { "operationId": "MeController_updateMe", @@ -10469,9 +9992,7 @@ } } }, - "tags": [ - "Me" - ] + "tags": ["Me"] } }, "/v2/oauth-clients": { @@ -10511,9 +10032,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] }, "get": { "operationId": "OAuthClientsController_getOAuthClients", @@ -10541,9 +10060,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] } }, "/v2/oauth-clients/{clientId}": { @@ -10581,9 +10098,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] }, "patch": { "operationId": "OAuthClientsController_updateOAuthClient", @@ -10629,9 +10144,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] }, "delete": { "operationId": "OAuthClientsController_deleteOAuthClient", @@ -10667,9 +10180,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -10710,9 +10221,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -10753,9 +10262,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -10804,9 +10311,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -10855,9 +10360,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails": { @@ -10920,9 +10423,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones": { @@ -10985,9 +10486,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/{id}": { @@ -11033,9 +10532,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/{id}": { @@ -11081,9 +10578,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/routing-forms/{routingFormId}/calculate-slots": { @@ -11148,10 +10643,7 @@ "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" } }, @@ -11186,9 +10678,7 @@ } } }, - "tags": [ - "Routing forms" - ] + "tags": ["Routing forms"] } }, "/v2/schedules": { @@ -11239,9 +10729,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] }, "get": { "operationId": "SchedulesController_2024_06_11_getSchedules", @@ -11280,9 +10768,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] } }, "/v2/schedules/default": { @@ -11323,9 +10809,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] } }, "/v2/schedules/{scheduleId}": { @@ -11373,9 +10857,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] }, "patch": { "operationId": "SchedulesController_2024_06_11_updateSchedule", @@ -11431,9 +10913,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] }, "delete": { "operationId": "SchedulesController_2024_06_11_deleteSchedule", @@ -11479,9 +10959,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] } }, "/v2/selected-calendars": { @@ -11521,9 +10999,7 @@ } } }, - "tags": [ - "Selected Calendars" - ] + "tags": ["Selected Calendars"] }, "delete": { "operationId": "SelectedCalendarsController_deleteSelectedCalendar", @@ -11583,9 +11059,7 @@ } } }, - "tags": [ - "Selected Calendars" - ] + "tags": ["Selected Calendars"] } }, "/v2/slots": { @@ -11788,9 +11262,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] } }, "/v2/slots/reservations": { @@ -11850,9 +11322,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] } }, "/v2/slots/reservations/{uid}": { @@ -11891,9 +11361,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] }, "patch": { "operationId": "SlotsController_2024_09_04_updateReservedSlot", @@ -11940,9 +11408,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] }, "delete": { "operationId": "SlotsController_2024_09_04_deleteReservedSlot", @@ -11982,9 +11448,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] } }, "/v2/stripe/connect": { @@ -12014,9 +11478,7 @@ } } }, - "tags": [ - "Stripe" - ] + "tags": ["Stripe"] } }, "/v2/stripe/save": { @@ -12053,9 +11515,7 @@ } } }, - "tags": [ - "Stripe" - ] + "tags": ["Stripe"] } }, "/v2/stripe/check": { @@ -12085,9 +11545,7 @@ } } }, - "tags": [ - "Stripe" - ] + "tags": ["Stripe"] } }, "/v2/teams": { @@ -12127,9 +11585,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] }, "get": { "operationId": "TeamsController_getTeams", @@ -12157,9 +11613,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] } }, "/v2/teams/{teamId}": { @@ -12197,9 +11651,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] }, "patch": { "operationId": "TeamsController_updateTeam", @@ -12245,9 +11697,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] }, "delete": { "operationId": "TeamsController_deleteTeam", @@ -12283,9 +11733,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] } }, "/v2/teams/{teamId}/event-types": { @@ -12333,9 +11781,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] }, "get": { "operationId": "TeamsEventTypesController_getTeamEventTypes", @@ -12380,9 +11826,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}": { @@ -12428,9 +11872,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] }, "patch": { "operationId": "TeamsEventTypesController_updateTeamEventType", @@ -12484,9 +11926,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] }, "delete": { "operationId": "TeamsEventTypesController_deleteTeamEventType", @@ -12530,9 +11970,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}/create-phone-call": { @@ -12588,9 +12026,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] } }, "/v2/teams/{teamId}/memberships": { @@ -12638,9 +12074,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] }, "get": { "operationId": "TeamsMembershipsController_getTeamMemberships", @@ -12701,9 +12135,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] } }, "/v2/teams/{teamId}/memberships/{membershipId}": { @@ -12749,9 +12181,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] }, "patch": { "operationId": "TeamsMembershipsController_updateTeamMembership", @@ -12805,9 +12235,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] }, "delete": { "operationId": "TeamsMembershipsController_deleteTeamMembership", @@ -12851,9 +12279,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -12894,9 +12320,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -12937,9 +12361,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -12988,9 +12410,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -13039,9 +12459,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/emails": { @@ -13104,9 +12522,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/phones": { @@ -13169,9 +12585,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/emails/{id}": { @@ -13217,9 +12631,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/phones/{id}": { @@ -13265,9 +12677,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/verified-resources/emails/verification-code/request": { @@ -13308,9 +12718,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/phones/verification-code/request": { @@ -13351,9 +12759,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/emails/verification-code/verify": { @@ -13394,9 +12800,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/phones/verification-code/verify": { @@ -13437,9 +12841,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/emails": { @@ -13494,9 +12896,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/phones": { @@ -13551,9 +12951,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/emails/{id}": { @@ -13591,9 +12989,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/phones/{id}": { @@ -13631,9 +13027,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/webhooks": { @@ -13673,9 +13067,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] }, "get": { "operationId": "WebhooksController_getWebhooks", @@ -13729,9 +13121,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] } }, "/v2/webhooks/{webhookId}": { @@ -13779,9 +13169,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] }, "get": { "operationId": "WebhooksController_getWebhook", @@ -13809,9 +13197,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] }, "delete": { "operationId": "WebhooksController_deleteWebhook", @@ -13847,9 +13233,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] } } }, @@ -13992,10 +13376,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -14004,10 +13385,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateManagedUserInput": { "type": "object", @@ -14023,25 +13401,14 @@ }, "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", @@ -14115,10 +13482,7 @@ } } }, - "required": [ - "email", - "name" - ] + "required": ["email", "name"] }, "CreateManagedUserData": { "type": "object", @@ -14141,13 +13505,7 @@ "type": "number" } }, - "required": [ - "accessToken", - "refreshToken", - "user", - "accessTokenExpiresAt", - "refreshTokenExpiresAt" - ] + "required": ["accessToken", "refreshToken", "user", "accessTokenExpiresAt", "refreshTokenExpiresAt"] }, "CreateManagedUserOutput": { "type": "object", @@ -14155,10 +13513,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/CreateManagedUserData" @@ -14167,10 +13522,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetManagedUserOutput": { "type": "object", @@ -14178,19 +13530,13 @@ "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", @@ -14203,10 +13549,7 @@ }, "timeFormat": { "type": "number", - "enum": [ - 12, - 24 - ], + "enum": [12, 24], "example": 12, "description": "Must be 12 or 24" }, @@ -14215,15 +13558,7 @@ }, "weekStart": { "type": "string", - "enum": [ - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday" - ], + "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], "example": "Monday" }, "timeZone": { @@ -14315,12 +13650,7 @@ "type": "number" } }, - "required": [ - "accessToken", - "refreshToken", - "accessTokenExpiresAt", - "refreshTokenExpiresAt" - ] + "required": ["accessToken", "refreshToken", "accessTokenExpiresAt", "refreshTokenExpiresAt"] }, "KeysResponseDto": { "type": "object", @@ -14328,19 +13658,13 @@ "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", @@ -14400,11 +13724,7 @@ "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", @@ -14418,20 +13738,14 @@ "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": { @@ -14446,10 +13760,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "PlatformOAuthClientDto": { "type": "object", @@ -14484,19 +13795,14 @@ "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" @@ -14557,10 +13863,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -14569,10 +13872,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetOAuthClientResponseDto": { "type": "object", @@ -14580,19 +13880,13 @@ "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", @@ -14639,9 +13933,7 @@ "description": "Managed user's refresh token." } }, - "required": [ - "refreshToken" - ] + "required": ["refreshToken"] }, "RefreshApiKeyInput": { "type": "object", @@ -14667,9 +13959,7 @@ "type": "string" } }, - "required": [ - "apiKey" - ] + "required": ["apiKey"] }, "RefreshApiKeyOutput": { "type": "object", @@ -14677,48 +13967,31 @@ "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", @@ -14734,10 +14007,7 @@ "example": "#fafafa" } }, - "required": [ - "lightThemeHex", - "darkThemeHex" - ] + "required": ["lightThemeHex", "darkThemeHex"] }, "DestinationCalendar_2024_06_14": { "type": "object", @@ -14751,10 +14021,7 @@ "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", @@ -14772,11 +14039,7 @@ "type": "boolean" } }, - "required": [ - "type", - "address", - "public" - ] + "required": ["type", "address", "public"] }, "InputLinkLocation_2024_06_14": { "type": "object", @@ -14794,11 +14057,7 @@ "type": "boolean" } }, - "required": [ - "type", - "link", - "public" - ] + "required": ["type", "link", "public"] }, "InputIntegrationLocation_2024_06_14": { "type": "object", @@ -14811,18 +14070,10 @@ "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", @@ -14840,11 +14091,7 @@ "type": "boolean" } }, - "required": [ - "type", - "phone", - "public" - ] + "required": ["type", "phone", "public"] }, "PhoneFieldInput_2024_06_14": { "type": "object", @@ -14877,14 +14124,7 @@ "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", @@ -14919,14 +14159,7 @@ "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", @@ -14961,14 +14194,7 @@ "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", @@ -15003,14 +14229,7 @@ "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", @@ -15045,14 +14264,7 @@ "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", @@ -15079,10 +14291,7 @@ "example": "Select..." }, "options": { - "example": [ - "Option 1", - "Option 2" - ], + "example": ["Option 1", "Option 2"], "type": "array", "items": { "type": "string" @@ -15097,15 +14306,7 @@ "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", @@ -15128,10 +14329,7 @@ "type": "boolean" }, "options": { - "example": [ - "Option 1", - "Option 2" - ], + "example": ["Option 1", "Option 2"], "type": "array", "items": { "type": "string" @@ -15146,14 +14344,7 @@ "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", @@ -15188,14 +14379,7 @@ "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", @@ -15218,10 +14402,7 @@ "type": "boolean" }, "options": { - "example": [ - "Checkbox 1", - "Checkbox 2" - ], + "example": ["Checkbox 1", "Checkbox 2"], "type": "array", "items": { "type": "string" @@ -15236,14 +14417,7 @@ "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", @@ -15266,10 +14440,7 @@ "type": "boolean" }, "options": { - "example": [ - "Radio 1", - "Radio 2" - ], + "example": ["Radio 1", "Radio 2"], "type": "array", "items": { "type": "string" @@ -15284,14 +14455,7 @@ "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", @@ -15322,13 +14486,7 @@ "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", @@ -15363,25 +14521,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"] }, "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": { @@ -15395,21 +14542,14 @@ "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": { @@ -15423,28 +14563,18 @@ "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": { @@ -15452,10 +14582,7 @@ } } }, - "required": [ - "type", - "value" - ] + "required": ["type", "value"] }, "BaseBookingLimitsCount_2024_06_14": { "type": "object", @@ -15496,9 +14623,7 @@ "default": false } }, - "required": [ - "disabled" - ] + "required": ["disabled"] }, "BaseBookingLimitsDuration_2024_06_14": { "type": "object", @@ -15540,18 +14665,10 @@ }, "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", @@ -15567,10 +14684,7 @@ "example": 30 } }, - "required": [ - "unit", - "count" - ] + "required": ["unit", "count"] }, "BaseConfirmationPolicy_2024_06_14": { "type": "object", @@ -15578,10 +14692,7 @@ "type": { "type": "string", "description": "The policy that determines when confirmation is required", - "enum": [ - "always", - "time" - ], + "enum": ["always", "time"], "example": "always" }, "noticeThreshold": { @@ -15597,10 +14708,7 @@ "description": "Unconfirmed bookings still block calendar slots." } }, - "required": [ - "type", - "blockUnconfirmedBookingsInBooker" - ] + "required": ["type", "blockUnconfirmedBookingsInBooker"] }, "Seats_2024_06_14": { "type": "object", @@ -15621,11 +14729,7 @@ "example": true } }, - "required": [ - "seatsPerTimeSlot", - "showAttendeeInfo", - "showAvailabilityCount" - ] + "required": ["seatsPerTimeSlot", "showAttendeeInfo", "showAvailabilityCount"] }, "InputAttendeeAddressLocation_2024_06_14": { "type": "object", @@ -15636,9 +14740,7 @@ "description": "only allowed value for type is `attendeeAddress`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "InputAttendeePhoneLocation_2024_06_14": { "type": "object", @@ -15649,9 +14751,7 @@ "description": "only allowed value for type is `attendeePhone`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "InputAttendeeDefinedLocation_2024_06_14": { "type": "object", @@ -15662,9 +14762,7 @@ "description": "only allowed value for type is `attendeeDefined`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "NameDefaultFieldInput_2024_06_14": { "type": "object", @@ -15685,11 +14783,7 @@ "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", @@ -15718,11 +14812,7 @@ "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", @@ -15750,9 +14840,7 @@ "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", @@ -15766,9 +14854,7 @@ "type": "string" } }, - "required": [ - "slug" - ] + "required": ["slug"] }, "NotesDefaultFieldInput_2024_06_14": { "type": "object", @@ -15796,9 +14882,7 @@ "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", @@ -15826,9 +14910,7 @@ "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", @@ -15856,9 +14938,7 @@ "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", @@ -15869,9 +14949,7 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "CalVideoSettings": { "type": "object", @@ -15902,11 +14980,7 @@ "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": { @@ -16175,11 +15249,7 @@ } } }, - "required": [ - "lengthInMinutes", - "title", - "slug" - ] + "required": ["lengthInMinutes", "title", "slug"] }, "OutputAddressLocation_2024_06_14": { "type": "object", @@ -16208,11 +15278,7 @@ "type": "boolean" } }, - "required": [ - "type", - "address", - "public" - ] + "required": ["type", "address", "public"] }, "OutputLinkLocation_2024_06_14": { "type": "object", @@ -16240,11 +15306,7 @@ "type": "boolean" } }, - "required": [ - "type", - "link", - "public" - ] + "required": ["type", "link", "public"] }, "OutputIntegrationLocation_2024_06_14": { "type": "object", @@ -16310,10 +15372,7 @@ "description": "Credential ID associated with the integration" } }, - "required": [ - "type", - "integration" - ] + "required": ["type", "integration"] }, "OutputPhoneLocation_2024_06_14": { "type": "object", @@ -16341,11 +15400,7 @@ "type": "boolean" } }, - "required": [ - "type", - "phone", - "public" - ] + "required": ["type", "phone", "public"] }, "OutputOrganizersDefaultAppLocation_2024_06_14": { "type": "object", @@ -16368,9 +15423,7 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "OutputUnknownLocation_2024_06_14": { "type": "object", @@ -16396,10 +15449,7 @@ "type": "string" } }, - "required": [ - "type", - "location" - ] + "required": ["type", "location"] }, "EmailDefaultFieldOutput_2024_06_14": { "type": "object", @@ -16456,11 +15506,7 @@ "default": "email" } }, - "required": [ - "type", - "isDefault", - "slug" - ] + "required": ["type", "isDefault", "slug"] }, "NameDefaultFieldOutput_2024_06_14": { "type": "object", @@ -16511,12 +15557,7 @@ "type": "boolean" } }, - "required": [ - "type", - "isDefault", - "slug", - "required" - ] + "required": ["type", "isDefault", "slug", "required"] }, "LocationDefaultFieldOutput_2024_06_14": { "type": "object", @@ -16547,26 +15588,14 @@ "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" @@ -16599,24 +15628,14 @@ "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" @@ -16649,24 +15668,14 @@ "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" @@ -16699,24 +15708,14 @@ "default": "textarea" } }, - "required": [ - "slug", - "isDefault", - "type" - ] + "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" @@ -16749,11 +15748,7 @@ "default": "multiemail" } }, - "required": [ - "slug", - "isDefault", - "type" - ] + "required": ["slug", "isDefault", "type"] }, "AddressFieldOutput_2024_06_14": { "type": "object", @@ -16810,14 +15805,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "BooleanFieldOutput_2024_06_14": { "type": "object", @@ -16870,14 +15858,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "CheckboxGroupFieldOutput_2024_06_14": { "type": "object", @@ -16916,10 +15897,7 @@ "type": "boolean" }, "options": { - "example": [ - "Checkbox 1", - "Checkbox 2" - ], + "example": ["Checkbox 1", "Checkbox 2"], "type": "array", "items": { "type": "string" @@ -16940,15 +15918,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] }, "MultiEmailFieldOutput_2024_06_14": { "type": "object", @@ -17005,14 +15975,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "MultiSelectFieldOutput_2024_06_14": { "type": "object", @@ -17051,10 +16014,7 @@ "type": "boolean" }, "options": { - "example": [ - "Option 1", - "Option 2" - ], + "example": ["Option 1", "Option 2"], "type": "array", "items": { "type": "string" @@ -17075,15 +16035,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] }, "UrlFieldOutput_2024_06_14": { "type": "object", @@ -17140,14 +16092,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "NumberFieldOutput_2024_06_14": { "type": "object", @@ -17204,14 +16149,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "PhoneFieldOutput_2024_06_14": { "type": "object", @@ -17266,14 +16204,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "RadioGroupFieldOutput_2024_06_14": { "type": "object", @@ -17312,10 +16243,7 @@ "type": "boolean" }, "options": { - "example": [ - "Radio 1", - "Radio 2" - ], + "example": ["Radio 1", "Radio 2"], "type": "array", "items": { "type": "string" @@ -17336,15 +16264,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] }, "SelectFieldOutput_2024_06_14": { "type": "object", @@ -17387,10 +16307,7 @@ "example": "Select..." }, "options": { - "example": [ - "Option 1", - "Option 2" - ], + "example": ["Option 1", "Option 2"], "type": "array", "items": { "type": "string" @@ -17411,15 +16328,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] }, "TextAreaFieldOutput_2024_06_14": { "type": "object", @@ -17476,14 +16385,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "TextFieldOutput_2024_06_14": { "type": "object", @@ -17540,14 +16442,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "EventTypeOutput_2024_06_14": { "type": "object", @@ -17561,11 +16456,7 @@ "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": { @@ -17845,30 +16736,21 @@ "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": { @@ -17880,20 +16762,14 @@ ] } }, - "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": { @@ -17903,10 +16779,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateEventTypeInput_2024_06_14": { "type": "object", @@ -17916,11 +16789,7 @@ "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": { @@ -18192,20 +17061,14 @@ "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", @@ -18226,32 +17089,21 @@ "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", @@ -18269,11 +17121,7 @@ "type": "string" } }, - "required": [ - "integration", - "externalId", - "credentialId" - ] + "required": ["integration", "externalId", "credentialId"] }, "SelectedCalendarOutputDto": { "type": "object", @@ -18292,12 +17140,7 @@ "nullable": true } }, - "required": [ - "userId", - "integration", - "externalId", - "credentialId" - ] + "required": ["userId", "integration", "externalId", "credentialId"] }, "SelectedCalendarOutputResponseDto": { "type": "object", @@ -18305,19 +17148,13 @@ "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", @@ -18393,11 +17230,7 @@ "default": "Sunday" } }, - "required": [ - "id", - "name", - "isOrganization" - ] + "required": ["id", "name", "isOrganization"] }, "OrgTeamsOutputResponseDto": { "type": "object", @@ -18405,10 +17238,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -18417,10 +17247,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OrgMeTeamsOutputResponseDto": { "type": "object", @@ -18428,10 +17255,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -18440,10 +17264,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OrgTeamOutputResponseDto": { "type": "object", @@ -18451,19 +17272,13 @@ "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", @@ -18628,40 +17443,19 @@ "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": { @@ -18677,11 +17471,7 @@ "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", @@ -18703,11 +17493,7 @@ "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", @@ -18731,18 +17517,12 @@ "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" } @@ -18770,15 +17550,7 @@ } } }, - "required": [ - "id", - "ownerId", - "name", - "timeZone", - "availability", - "isDefault", - "overrides" - ] + "required": ["id", "ownerId", "name", "timeZone", "availability", "isDefault", "overrides"] }, "GetSchedulesOutput_2024_06_11": { "type": "object", @@ -18786,10 +17558,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -18801,10 +17570,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateScheduleInput_2024_06_11": { "type": "object", @@ -18822,18 +17588,12 @@ "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" } @@ -18863,11 +17623,7 @@ } } }, - "required": [ - "name", - "timeZone", - "isDefault" - ] + "required": ["name", "timeZone", "isDefault"] }, "CreateScheduleOutput_2024_06_11": { "type": "object", @@ -18875,19 +17631,13 @@ "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", @@ -18895,10 +17645,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "nullable": true, @@ -18912,10 +17659,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateScheduleInput_2024_06_11": { "type": "object", @@ -18931,10 +17675,7 @@ "availability": { "example": [ { - "days": [ - "Monday", - "Tuesday" - ], + "days": ["Monday", "Tuesday"], "startTime": "09:00", "endTime": "10:00" } @@ -18969,10 +17710,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" @@ -18981,10 +17719,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteScheduleOutput_2024_06_11": { "type": "object", @@ -18992,15 +17727,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "ProfileOutput": { "type": "object", @@ -19027,11 +17757,7 @@ "example": "john_doe" } }, - "required": [ - "id", - "organizationId", - "userId" - ] + "required": ["id", "organizationId", "userId"] }, "GetOrgUsersWithProfileOutput": { "type": "object", @@ -19173,15 +17899,7 @@ ] } }, - "required": [ - "id", - "email", - "timeZone", - "weekStart", - "hideBranding", - "createdDate", - "profile" - ] + "required": ["id", "email", "timeZone", "weekStart", "hideBranding", "createdDate", "profile"] }, "GetOrganizationUsersResponseDTO": { "type": "object", @@ -19189,10 +17907,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -19201,10 +17916,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateOrganizationUserInput": { "type": "object", @@ -19294,20 +18006,14 @@ "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", @@ -19315,19 +18021,13 @@ "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", @@ -19343,10 +18043,7 @@ "type": "string" } }, - "required": [ - "id", - "name" - ] + "required": ["id", "name"] }, "TextAttribute": { "type": "object", @@ -19367,13 +18064,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "type", - "option", - "optionId" - ] + "required": ["id", "name", "type", "option", "optionId"] }, "NumberAttribute": { "type": "object", @@ -19394,13 +18085,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "type", - "option", - "optionId" - ] + "required": ["id", "name", "type", "option", "optionId"] }, "SingleSelectAttribute": { "type": "object", @@ -19421,13 +18106,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "type", - "option", - "optionId" - ] + "required": ["id", "name", "type", "option", "optionId"] }, "MultiSelectAttributeOption": { "type": "object", @@ -19439,10 +18118,7 @@ "type": "string" } }, - "required": [ - "optionId", - "option" - ] + "required": ["optionId", "option"] }, "MultiSelectAttribute": { "type": "object", @@ -19463,12 +18139,7 @@ } } }, - "required": [ - "id", - "name", - "type", - "options" - ] + "required": ["id", "name", "type", "options"] }, "MembershipUserOutputDto": { "type": "object", @@ -19495,9 +18166,7 @@ } } }, - "required": [ - "email" - ] + "required": ["email"] }, "OrganizationMembershipOutput": { "type": "object", @@ -19516,11 +18185,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -19548,15 +18213,7 @@ } } }, - "required": [ - "id", - "userId", - "teamId", - "accepted", - "role", - "user", - "attributes" - ] + "required": ["id", "userId", "teamId", "accepted", "role", "user", "attributes"] }, "GetAllOrgMemberships": { "type": "object", @@ -19564,19 +18221,13 @@ "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", @@ -19591,11 +18242,7 @@ "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": { @@ -19603,10 +18250,7 @@ "default": false } }, - "required": [ - "userId", - "role" - ] + "required": ["userId", "role"] }, "CreateOrgMembershipOutput": { "type": "object", @@ -19614,19 +18258,13 @@ "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", @@ -19634,19 +18272,13 @@ "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", @@ -19654,19 +18286,13 @@ "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", @@ -19676,11 +18302,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -19693,19 +18315,13 @@ "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", @@ -19720,18 +18336,10 @@ }, "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", @@ -19741,11 +18349,7 @@ "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": { @@ -19986,11 +18590,7 @@ }, "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." }, @@ -20038,12 +18638,7 @@ } } }, - "required": [ - "lengthInMinutes", - "title", - "slug", - "schedulingType" - ] + "required": ["lengthInMinutes", "title", "slug", "schedulingType"] }, "CreateTeamEventTypeOutput": { "type": "object", @@ -20051,10 +18646,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -20070,10 +18662,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamEventTypeResponseHost": { "type": "object", @@ -20090,13 +18679,7 @@ "priority": { "type": "string", "default": "medium", - "enum": [ - "lowest", - "low", - "medium", - "high", - "highest" - ] + "enum": ["lowest", "low", "medium", "high", "highest"] }, "name": { "type": "string", @@ -20112,11 +18695,7 @@ "example": "https://cal.com/api/avatar/d95949bc-ccb1-400f-acf6-045c51a16856.png" } }, - "required": [ - "userId", - "name", - "username" - ] + "required": ["userId", "name", "username"] }, "EventTypeTeam": { "type": "object", @@ -20149,9 +18728,7 @@ "type": "string" } }, - "required": [ - "id" - ] + "required": ["id"] }, "TeamEventTypeOutput_2024_06_14": { "type": "object", @@ -20166,11 +18743,7 @@ "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": { @@ -20441,11 +19014,7 @@ }, "schedulingType": { "type": "string", - "enum": [ - "roundRobin", - "collective", - "managed" - ] + "enum": ["roundRobin", "collective", "managed"] }, "team": { "$ref": "#/components/schemas/EventTypeTeam" @@ -20481,19 +19050,13 @@ "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", @@ -20519,10 +19082,7 @@ }, "templateType": { "default": "CUSTOM_TEMPLATE", - "enum": [ - "CHECK_IN_APPOINTMENT", - "CUSTOM_TEMPLATE" - ], + "enum": ["CHECK_IN_APPOINTMENT", "CUSTOM_TEMPLATE"], "type": "string", "description": "Template type" }, @@ -20551,13 +19111,7 @@ "description": "General prompt" } }, - "required": [ - "yourPhoneNumber", - "numberToCall", - "calApiKey", - "enabled", - "templateType" - ] + "required": ["yourPhoneNumber", "numberToCall", "calApiKey", "enabled", "templateType"] }, "Data": { "type": "object", @@ -20569,9 +19123,7 @@ "type": "string" } }, - "required": [ - "callId" - ] + "required": ["callId"] }, "CreatePhoneCallOutput": { "type": "object", @@ -20579,19 +19131,13 @@ "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", @@ -20599,10 +19145,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -20611,10 +19154,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateTeamEventTypeInput_2024_06_14": { "type": "object", @@ -20624,11 +19164,7 @@ "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": { @@ -20914,10 +19450,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -20933,10 +19466,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteTeamEventTypeOutput": { "type": "object", @@ -20944,19 +19474,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamMembershipOutput": { "type": "object", @@ -20975,11 +19499,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -20988,14 +19508,7 @@ "$ref": "#/components/schemas/MembershipUserOutputDto" } }, - "required": [ - "id", - "userId", - "teamId", - "accepted", - "role", - "user" - ] + "required": ["id", "userId", "teamId", "accepted", "role", "user"] }, "OrgTeamMembershipsOutputResponseDto": { "type": "object", @@ -21003,10 +19516,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21015,10 +19525,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OrgTeamMembershipOutputResponseDto": { "type": "object", @@ -21026,19 +19533,13 @@ "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", @@ -21048,11 +19549,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -21072,21 +19569,14 @@ "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", @@ -21104,12 +19594,7 @@ "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", @@ -21132,14 +19617,7 @@ "example": true } }, - "required": [ - "id", - "teamId", - "type", - "name", - "slug", - "enabled" - ] + "required": ["id", "teamId", "type", "name", "slug", "enabled"] }, "GetOrganizationAttributesOutput": { "type": "object", @@ -21147,10 +19625,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21159,10 +19634,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetSingleAttributeOutput": { "type": "object", @@ -21170,10 +19642,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "nullable": true, @@ -21184,10 +19653,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateOrganizationAttributeOptionInput": { "type": "object", @@ -21199,10 +19665,7 @@ "type": "string" } }, - "required": [ - "value", - "slug" - ] + "required": ["value", "slug"] }, "CreateOrganizationAttributeInput": { "type": "object", @@ -21215,12 +19678,7 @@ }, "type": { "type": "string", - "enum": [ - "TEXT", - "NUMBER", - "SINGLE_SELECT", - "MULTI_SELECT" - ] + "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] }, "options": { "type": "array", @@ -21232,12 +19690,7 @@ "type": "boolean" } }, - "required": [ - "name", - "slug", - "type", - "options" - ] + "required": ["name", "slug", "type", "options"] }, "CreateOrganizationAttributesOutput": { "type": "object", @@ -21245,19 +19698,13 @@ "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", @@ -21270,12 +19717,7 @@ }, "type": { "type": "string", - "enum": [ - "TEXT", - "NUMBER", - "SINGLE_SELECT", - "MULTI_SELECT" - ] + "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] }, "enabled": { "type": "boolean" @@ -21288,19 +19730,13 @@ "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", @@ -21308,19 +19744,13 @@ "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", @@ -21346,12 +19776,7 @@ "example": "option-slug" } }, - "required": [ - "id", - "attributeId", - "value", - "slug" - ] + "required": ["id", "attributeId", "value", "slug"] }, "CreateAttributeOptionOutput": { "type": "object", @@ -21359,19 +19784,13 @@ "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", @@ -21379,19 +19798,13 @@ "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", @@ -21410,19 +19823,13 @@ "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", @@ -21430,10 +19837,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21442,10 +19846,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "AssignedOptionOutput": { "type": "object", @@ -21472,23 +19873,14 @@ }, "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", @@ -21496,10 +19888,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21508,10 +19897,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "AssignOrganizationAttributeOptionToUserInput": { "type": "object", @@ -21526,9 +19912,7 @@ "type": "string" } }, - "required": [ - "attributeId" - ] + "required": ["attributeId"] }, "AssignOptionUserOutputData": { "type": "object", @@ -21546,11 +19930,7 @@ "description": "The value of the option" } }, - "required": [ - "id", - "memberId", - "attributeOptionId" - ] + "required": ["id", "memberId", "attributeOptionId"] }, "AssignOptionUserOutput": { "type": "object", @@ -21558,19 +19938,13 @@ "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", @@ -21578,19 +19952,13 @@ "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", @@ -21612,12 +19980,7 @@ "description": "The slug of the option" } }, - "required": [ - "id", - "attributeId", - "value", - "slug" - ] + "required": ["id", "attributeId", "value", "slug"] }, "GetOptionUserOutput": { "type": "object", @@ -21625,10 +19988,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21637,10 +19997,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamWebhookOutputDto": { "type": "object", @@ -21672,14 +20029,7 @@ "type": "string" } }, - "required": [ - "payloadTemplate", - "teamId", - "id", - "triggers", - "subscriberUrl", - "active" - ] + "required": ["payloadTemplate", "teamId", "id", "triggers", "subscriberUrl", "active"] }, "TeamWebhooksOutputResponseDto": { "type": "object", @@ -21687,10 +20037,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21699,10 +20046,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateWebhookInputDto": { "type": "object", @@ -21755,11 +20099,7 @@ "type": "string" } }, - "required": [ - "active", - "subscriberUrl", - "triggers" - ] + "required": ["active", "subscriberUrl", "triggers"] }, "TeamWebhookOutputResponseDto": { "type": "object", @@ -21767,19 +20107,13 @@ "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", @@ -21862,19 +20196,10 @@ "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", @@ -21905,13 +20230,7 @@ "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"] } } }, @@ -21926,10 +20245,7 @@ }, "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" @@ -21949,17 +20265,10 @@ "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", @@ -21987,9 +20296,7 @@ ] } }, - "required": [ - "type" - ] + "required": ["type"] }, "WorkflowMessageOutputDto": { "type": "object", @@ -22010,9 +20317,7 @@ "example": "Reminder for {EVENT_NAME}." } }, - "required": [ - "subject" - ] + "required": ["subject"] }, "WorkflowStepOutputDto": { "type": "object", @@ -22038,19 +20343,15 @@ "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", @@ -22065,14 +20366,7 @@ "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", @@ -22094,15 +20388,7 @@ ] } }, - "required": [ - "id", - "stepNumber", - "action", - "recipient", - "template", - "sender", - "message" - ] + "required": ["id", "stepNumber", "action", "recipient", "template", "sender", "message"] }, "WorkflowOutput": { "type": "object", @@ -22161,13 +20447,7 @@ "example": "2024-05-12T11:30:00.000Z" } }, - "required": [ - "id", - "name", - "activation", - "trigger", - "steps" - ] + "required": ["id", "name", "activation", "trigger", "steps"] }, "GetWorkflowsOutput": { "type": "object", @@ -22176,10 +20456,7 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "description": "List of workflows", @@ -22189,10 +20466,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetWorkflowOutput": { "type": "object", @@ -22201,10 +20475,7 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "description": "workflow", @@ -22214,10 +20485,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "WorkflowTriggerOffsetDto": { "type": "object", @@ -22233,10 +20501,7 @@ "example": "hour" } }, - "required": [ - "value", - "unit" - ] + "required": ["value", "unit"] }, "OnBeforeEventTriggerDto": { "type": "object", @@ -22256,10 +20521,7 @@ "example": "beforeEvent" } }, - "required": [ - "offset", - "type" - ] + "required": ["offset", "type"] }, "OnAfterEventTriggerDto": { "type": "object", @@ -22279,10 +20541,7 @@ "example": "afterEvent" } }, - "required": [ - "offset", - "type" - ] + "required": ["offset", "type"] }, "OnCancelTriggerDto": { "type": "object", @@ -22293,9 +20552,7 @@ "description": "Trigger type for the workflow" } }, - "required": [ - "type" - ] + "required": ["type"] }, "OnCreationTriggerDto": { "type": "object", @@ -22306,9 +20563,7 @@ "description": "Trigger type for the workflow" } }, - "required": [ - "type" - ] + "required": ["type"] }, "OnRescheduleTriggerDto": { "type": "object", @@ -22319,9 +20574,7 @@ "description": "Trigger type for the workflow" } }, - "required": [ - "type" - ] + "required": ["type"] }, "OnAfterCalVideoGuestsNoShowTriggerDto": { "type": "object", @@ -22341,10 +20594,7 @@ "example": "afterGuestsCalVideoNoShow" } }, - "required": [ - "offset", - "type" - ] + "required": ["offset", "type"] }, "OnAfterCalVideoHostsNoShowTriggerDto": { "type": "object", @@ -22364,10 +20614,7 @@ "example": "afterHostsCalVideoNoShow" } }, - "required": [ - "offset", - "type" - ] + "required": ["offset", "type"] }, "HtmlWorkflowMessageDto": { "type": "object", @@ -22383,10 +20630,7 @@ "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", @@ -22400,7 +20644,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", @@ -22415,25 +20660,13 @@ "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", @@ -22485,7 +20718,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", @@ -22500,25 +20734,13 @@ "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", @@ -22561,7 +20783,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", @@ -22576,25 +20799,13 @@ "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", @@ -22639,10 +20850,7 @@ "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", @@ -22656,7 +20864,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_attendee", "description": "Action to perform", @@ -22671,25 +20880,13 @@ "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", @@ -22704,14 +20901,7 @@ ] } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] }, "WorkflowPhoneWhatsAppNumberStepDto": { "type": "object", @@ -22725,7 +20915,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", @@ -22740,25 +20931,13 @@ "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", @@ -22781,15 +20960,7 @@ ] } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "verifiedPhoneId", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] }, "WorkflowPhoneNumberStepDto": { "type": "object", @@ -22803,7 +20974,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", @@ -22818,25 +20990,13 @@ "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", @@ -22859,15 +21019,7 @@ ] } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "verifiedPhoneId", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] }, "WorkflowPhoneAttendeeStepDto": { "type": "object", @@ -22881,7 +21033,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", @@ -22896,25 +21049,13 @@ "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", @@ -22933,14 +21074,7 @@ ] } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] }, "BaseWorkflowTriggerDto": { "type": "object", @@ -22950,9 +21084,7 @@ "description": "Trigger type for the workflow" } }, - "required": [ - "type" - ] + "required": ["type"] }, "WorkflowActivationDto": { "type": "object", @@ -22966,18 +21098,14 @@ "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", @@ -23051,12 +21179,7 @@ } } }, - "required": [ - "name", - "activation", - "trigger", - "steps" - ] + "required": ["name", "activation", "trigger", "steps"] }, "UpdateEmailAddressWorkflowStepDto": { "type": "object", @@ -23070,7 +21193,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", @@ -23085,25 +21209,13 @@ "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", @@ -23160,7 +21272,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", @@ -23175,25 +21288,13 @@ "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", @@ -23241,7 +21342,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", @@ -23256,25 +21358,13 @@ "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", @@ -23322,7 +21412,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", @@ -23337,25 +21428,13 @@ "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", @@ -23379,14 +21458,7 @@ "example": 67244 } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] }, "UpdatePhoneWhatsAppNumberWorkflowStepDto": { "type": "object", @@ -23400,7 +21472,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", @@ -23415,25 +21488,13 @@ "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", @@ -23461,15 +21522,7 @@ "example": 67244 } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "verifiedPhoneId", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] }, "UpdateWhatsAppAttendeePhoneWorkflowStepDto": { "type": "object", @@ -23483,7 +21536,8 @@ "sms_attendee", "sms_number", "whatsapp_attendee", - "whatsapp_number" + "whatsapp_number", + "cal_ai_phone_call" ], "default": "whatsapp_attendee", "description": "Action to perform", @@ -23498,25 +21552,13 @@ "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", @@ -23536,14 +21578,7 @@ "example": 67244 } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] }, "UpdatePhoneNumberWorkflowStepDto": { "type": "object", @@ -23557,7 +21592,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", @@ -23572,25 +21608,13 @@ "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", @@ -23618,15 +21642,7 @@ "example": 67244 } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "verifiedPhoneId", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] }, "UpdateWorkflowDto": { "type": "object", @@ -23708,9 +21724,7 @@ "type": "string" } }, - "required": [ - "authUrl" - ] + "required": ["authUrl"] }, "StripConnectOutputResponseDto": { "type": "object", @@ -23718,19 +21732,13 @@ "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", @@ -23739,9 +21747,7 @@ "type": "string" } }, - "required": [ - "url" - ] + "required": ["url"] }, "StripCredentialsCheckOutputResponseDto": { "type": "object", @@ -23751,9 +21757,7 @@ "example": "success" } }, - "required": [ - "status" - ] + "required": ["status"] }, "GetDefaultScheduleOutput_2024_06_11": { "type": "object", @@ -23761,19 +21765,13 @@ "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", @@ -23857,9 +21855,7 @@ "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", @@ -23867,10 +21863,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -23884,10 +21877,7 @@ "description": "Either an Output object or a TeamOutputDto." } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamOutputDto": { "type": "object", @@ -23963,11 +21953,7 @@ "default": "Sunday" } }, - "required": [ - "id", - "name", - "isOrganization" - ] + "required": ["id", "name", "isOrganization"] }, "GetTeamOutput": { "type": "object", @@ -23975,19 +21961,13 @@ "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", @@ -23995,10 +21975,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -24007,10 +21984,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateTeamOutput": { "type": "object", @@ -24018,19 +21992,13 @@ "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", @@ -24055,30 +22023,20 @@ "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", @@ -24086,25 +22044,17 @@ "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", @@ -24113,10 +22063,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "SetDefaultConferencingAppOutputResponseDto": { "type": "object", @@ -24124,15 +22071,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "DefaultConferencingAppsOutputDto": { "type": "object", @@ -24151,18 +22093,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/DefaultConferencingAppsOutputDto" } }, - "required": [ - "status" - ] + "required": ["status"] }, "DisconnectConferencingAppOutputResponseDto": { "type": "object", @@ -24170,15 +22107,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "GoogleServiceAccountKeyInput": { "type": "object", @@ -24193,11 +22125,7 @@ "type": "string" } }, - "required": [ - "private_key", - "client_email", - "client_id" - ] + "required": ["private_key", "client_email", "client_id"] }, "CreateDelegationCredentialInput": { "type": "object", @@ -24222,11 +22150,7 @@ } } }, - "required": [ - "workspacePlatformSlug", - "domain", - "serviceAccountKey" - ] + "required": ["workspacePlatformSlug", "domain", "serviceAccountKey"] }, "WorkspacePlatformDto": { "type": "object", @@ -24238,10 +22162,7 @@ "type": "string" } }, - "required": [ - "name", - "slug" - ] + "required": ["name", "slug"] }, "DelegationCredentialOutput": { "type": "object", @@ -24286,19 +22207,13 @@ "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", @@ -24327,29 +22242,20 @@ "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", @@ -24363,9 +22269,7 @@ "description": "Whether to allowing writing to the calendar or not" } }, - "required": [ - "urls" - ] + "required": ["urls"] }, "CreateIcsFeedOutput": { "type": "object", @@ -24405,14 +22309,7 @@ "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", @@ -24420,19 +22317,13 @@ "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", @@ -24450,10 +22341,7 @@ "nullable": true } }, - "required": [ - "start", - "end" - ] + "required": ["start", "end"] }, "GetBusyTimesOutput": { "type": "object", @@ -24461,10 +22349,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -24473,10 +22358,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "Integration": { "type": "object", @@ -24585,13 +22467,7 @@ "nullable": true } }, - "required": [ - "externalId", - "primary", - "readOnly", - "isSelected", - "credentialId" - ] + "required": ["externalId", "primary", "readOnly", "isSelected", "credentialId"] }, "Calendar": { "type": "object", @@ -24626,12 +22502,7 @@ "nullable": true } }, - "required": [ - "externalId", - "readOnly", - "isSelected", - "credentialId" - ] + "required": ["externalId", "readOnly", "isSelected", "credentialId"] }, "ConnectedCalendar": { "type": "object", @@ -24656,10 +22527,7 @@ } } }, - "required": [ - "integration", - "credentialId" - ] + "required": ["integration", "credentialId"] }, "DestinationCalendar": { "type": "object", @@ -24733,10 +22601,7 @@ "$ref": "#/components/schemas/DestinationCalendar" } }, - "required": [ - "connectedCalendars", - "destinationCalendar" - ] + "required": ["connectedCalendars", "destinationCalendar"] }, "ConnectedCalendarsOutput": { "type": "object", @@ -24744,19 +22609,13 @@ "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", @@ -24768,10 +22627,7 @@ "type": "string" } }, - "required": [ - "username", - "password" - ] + "required": ["username", "password"] }, "DeleteCalendarCredentialsInputBodyDto": { "type": "object", @@ -24782,9 +22638,7 @@ "description": "Credential ID of the calendar to delete, as returned by the /calendars endpoint" } }, - "required": [ - "id" - ] + "required": ["id"] }, "DeletedCalendarCredentialsOutputDto": { "type": "object", @@ -24812,14 +22666,7 @@ "nullable": true } }, - "required": [ - "id", - "type", - "userId", - "teamId", - "appId", - "invalid" - ] + "required": ["id", "type", "userId", "teamId", "appId", "invalid"] }, "DeletedCalendarCredentialsOutputResponseDto": { "type": "object", @@ -24827,19 +22674,13 @@ "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", @@ -24875,9 +22716,7 @@ } } }, - "required": [ - "name" - ] + "required": ["name"] }, "ManagedOrganizationWithApiKeyOutput": { "type": "object", @@ -24902,11 +22741,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "apiKey" - ] + "required": ["id", "name", "apiKey"] }, "CreateManagedOrganizationOutput": { "type": "object", @@ -24914,19 +22749,13 @@ "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", @@ -24948,10 +22777,7 @@ } } }, - "required": [ - "id", - "name" - ] + "required": ["id", "name"] }, "GetManagedOrganizationOutput": { "type": "object", @@ -24959,19 +22785,13 @@ "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", @@ -25039,10 +22859,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -25054,11 +22871,7 @@ "$ref": "#/components/schemas/PaginationMetaDto" } }, - "required": [ - "status", - "data", - "pagination" - ] + "required": ["status", "data", "pagination"] }, "UpdateOrganizationInput": { "type": "object", @@ -25107,14 +22920,7 @@ "type": "string" } }, - "required": [ - "id", - "formId", - "formFillerId", - "routedToBookingUid", - "response", - "createdAt" - ] + "required": ["id", "formId", "formFillerId", "routedToBookingUid", "response", "createdAt"] }, "GetRoutingFormResponsesOutput": { "type": "object", @@ -25122,19 +22928,13 @@ "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", @@ -25153,10 +22953,7 @@ }, "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" @@ -25183,9 +22980,7 @@ "example": "Account" } }, - "required": [ - "teamMemberIds" - ] + "required": ["teamMemberIds"] }, "CreateRoutingFormResponseOutputData": { "type": "object", @@ -25200,10 +22995,7 @@ "example": { "eventTypeId": 123, "routing": { - "teamMemberIds": [ - 101, - 102 - ], + "teamMemberIds": [101, 102], "teamMemberEmail": "john.doe@example.com", "skipContactOwner": true } @@ -25242,19 +23034,13 @@ "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", @@ -25271,19 +23057,13 @@ "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", @@ -25359,10 +23139,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -25371,10 +23148,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "SlotsOutput_2024_09_04": { "type": "object", @@ -25401,10 +23175,7 @@ ] } }, - "required": [ - "eventTypeId", - "slots" - ] + "required": ["eventTypeId", "slots"] }, "ResponseSlotsOutput": { "type": "object", @@ -25412,19 +23183,13 @@ "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", @@ -25450,10 +23215,7 @@ "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", @@ -25510,19 +23272,13 @@ "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", @@ -25530,10 +23286,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "nullable": true, @@ -25544,10 +23297,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "MeOrgOutput": { "type": "object", @@ -25559,10 +23309,7 @@ "type": "number" } }, - "required": [ - "isPlatform", - "id" - ] + "required": ["isPlatform", "id"] }, "MeOutput": { "type": "object", @@ -25614,19 +23361,13 @@ "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", @@ -25634,19 +23375,13 @@ "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", @@ -25657,9 +23392,7 @@ "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", @@ -25674,10 +23407,7 @@ "example": "123 Example St, City, Country" } }, - "required": [ - "type", - "address" - ] + "required": ["type", "address"] }, "BookingInputAttendeeDefinedLocation_2024_08_13": { "type": "object", @@ -25692,10 +23422,7 @@ "example": "321 Example St, City, Country" } }, - "required": [ - "type", - "location" - ] + "required": ["type", "location"] }, "BookingInputAttendeePhoneLocation_2024_08_13": { "type": "object", @@ -25710,10 +23437,7 @@ "example": "+37120993151" } }, - "required": [ - "type", - "phone" - ] + "required": ["type", "phone"] }, "BookingInputIntegrationLocation_2024_08_13": { "type": "object", @@ -25759,10 +23483,7 @@ ] } }, - "required": [ - "type", - "integration" - ] + "required": ["type", "integration"] }, "BookingInputLinkLocation_2024_08_13": { "type": "object", @@ -25773,9 +23494,7 @@ "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", @@ -25786,9 +23505,7 @@ "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", @@ -25799,9 +23516,7 @@ "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", @@ -25882,10 +23597,7 @@ "default": "en" } }, - "required": [ - "name", - "timeZone" - ] + "required": ["name", "timeZone"] }, "CreateBookingInput_2024_08_13": { "type": "object", @@ -25937,10 +23649,7 @@ }, "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" @@ -25997,10 +23706,7 @@ "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": [ { @@ -26009,10 +23715,7 @@ ] } }, - "required": [ - "start", - "attendee" - ] + "required": ["start", "attendee"] }, "CreateInstantBookingInput_2024_08_13": { "type": "object", @@ -26064,10 +23767,7 @@ }, "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" @@ -26124,10 +23824,7 @@ "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": [ { @@ -26141,11 +23838,7 @@ "example": true } }, - "required": [ - "start", - "attendee", - "instant" - ] + "required": ["start", "attendee", "instant"] }, "CreateRecurringBookingInput_2024_08_13": { "type": "object", @@ -26197,10 +23890,7 @@ }, "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" @@ -26257,10 +23947,7 @@ "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": [ { @@ -26274,10 +23961,7 @@ "example": 5 } }, - "required": [ - "start", - "attendee" - ] + "required": ["start", "attendee"] }, "BookingHost": { "type": "object", @@ -26303,13 +23987,7 @@ "example": "America/Los_Angeles" } }, - "required": [ - "id", - "name", - "email", - "username", - "timeZone" - ] + "required": ["id", "name", "email", "username", "timeZone"] }, "EventType": { "type": "object", @@ -26323,10 +24001,7 @@ "example": "some-event" } }, - "required": [ - "id", - "slug" - ] + "required": ["id", "slug"] }, "BookingAttendee": { "type": "object", @@ -26401,12 +24076,7 @@ "example": "+1234567890" } }, - "required": [ - "name", - "email", - "timeZone", - "absent" - ] + "required": ["name", "email", "timeZone", "absent"] }, "BookingOutput_2024_08_13": { "type": "object", @@ -26435,12 +24105,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -26534,10 +24199,7 @@ } }, "guests": { - "example": [ - "guest1@example.com", - "guest2@example.com" - ], + "example": ["guest1@example.com", "guest2@example.com"], "type": "array", "items": { "type": "string" @@ -26598,12 +24260,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -26697,10 +24354,7 @@ } }, "guests": { - "example": [ - "guest1@example.com", - "guest2@example.com" - ], + "example": ["guest1@example.com", "guest2@example.com"], "type": "array", "items": { "type": "string" @@ -26829,14 +24483,7 @@ } } }, - "required": [ - "name", - "email", - "timeZone", - "absent", - "seatUid", - "bookingFieldsResponses" - ] + "required": ["name", "email", "timeZone", "absent", "seatUid", "bookingFieldsResponses"] }, "CreateSeatedBookingOutput_2024_08_13": { "type": "object", @@ -26865,12 +24512,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -27015,12 +24657,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -27149,10 +24786,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27178,10 +24812,7 @@ "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", @@ -27210,12 +24841,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -27355,12 +24981,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -27484,10 +25105,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27522,10 +25140,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "RecordingItem": { "type": "object", @@ -27569,14 +25184,7 @@ "example": "Error message" } }, - "required": [ - "id", - "roomName", - "startTs", - "status", - "duration", - "shareToken" - ] + "required": ["id", "roomName", "startTs", "status", "duration", "shareToken"] }, "GetBookingRecordingsOutput": { "type": "object", @@ -27584,10 +25192,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "error": { "type": "object" @@ -27599,10 +25204,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetBookingTranscriptsOutput": { "type": "object", @@ -27610,16 +25212,10 @@ "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" @@ -27629,10 +25225,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetBookingsOutput_2024_08_13": { "type": "object", @@ -27640,10 +25233,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -27672,11 +25262,7 @@ "type": "object" } }, - "required": [ - "status", - "data", - "pagination" - ] + "required": ["status", "data", "pagination"] }, "RescheduleBookingInput_2024_08_13": { "type": "object", @@ -27696,9 +25282,7 @@ "description": "Reason for rescheduling the booking" } }, - "required": [ - "start" - ] + "required": ["start"] }, "RescheduleSeatedBookingInput_2024_08_13": { "type": "object", @@ -27718,10 +25302,7 @@ "description": "Uid of the specific seat within booking." } }, - "required": [ - "start", - "seatUid" - ] + "required": ["start", "seatUid"] }, "RescheduleBookingOutput_2024_08_13": { "type": "object", @@ -27729,10 +25310,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27752,10 +25330,7 @@ "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", @@ -27779,9 +25354,7 @@ "description": "Uid of the specific seat within booking." } }, - "required": [ - "seatUid" - ] + "required": ["seatUid"] }, "CancelBookingOutput_2024_08_13": { "type": "object", @@ -27789,10 +25362,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27824,10 +25394,7 @@ "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", @@ -27839,10 +25406,7 @@ "type": "boolean" } }, - "required": [ - "email", - "absent" - ] + "required": ["email", "absent"] }, "MarkAbsentBookingInput_2024_08_13": { "type": "object", @@ -27866,10 +25430,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27883,10 +25444,7 @@ "description": "Booking data, which can be either a BookingOutput object or a RecurringBookingOutput object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "ReassignedToDto": { "type": "object", @@ -27904,11 +25462,7 @@ "example": "john.doe@example.com" } }, - "required": [ - "id", - "name", - "email" - ] + "required": ["id", "name", "email"] }, "ReassignBookingOutput_2024_08_13": { "type": "object", @@ -27916,10 +25470,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27935,10 +25486,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "ReassignToUserBookingInput_2024_08_13": { "type": "object", @@ -27972,10 +25520,7 @@ "description": "The link to the calendar" } }, - "required": [ - "label", - "link" - ] + "required": ["label", "link"] }, "CalendarLinksOutput_2024_08_13": { "type": "object", @@ -27993,10 +25538,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "BookingReference": { "type": "object", @@ -28019,12 +25561,7 @@ "description": "The id of the booking reference" } }, - "required": [ - "type", - "eventUid", - "destinationCalendarId", - "id" - ] + "required": ["type", "eventUid", "destinationCalendarId", "id"] }, "BookingReferencesOutput_2024_08_13": { "type": "object", @@ -28042,10 +25579,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateTeamMembershipInput": { "type": "object", @@ -28060,20 +25594,14 @@ "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", @@ -28081,19 +25609,13 @@ "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", @@ -28101,19 +25623,13 @@ "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", @@ -28121,19 +25637,13 @@ "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", @@ -28143,11 +25653,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -28160,19 +25666,13 @@ "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", @@ -28180,19 +25680,13 @@ "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", @@ -28231,10 +25725,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetPrivateLinksOutput": { "type": "object", @@ -28259,10 +25750,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdatePrivateLinkOutput": { "type": "object", @@ -28284,10 +25772,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeletePrivateLinkOutput": { "type": "object", @@ -28312,10 +25797,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UserWebhookOutputDto": { "type": "object", @@ -28347,14 +25829,7 @@ "type": "string" } }, - "required": [ - "payloadTemplate", - "userId", - "id", - "triggers", - "subscriberUrl", - "active" - ] + "required": ["payloadTemplate", "userId", "id", "triggers", "subscriberUrl", "active"] }, "UserWebhookOutputResponseDto": { "type": "object", @@ -28362,19 +25837,13 @@ "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", @@ -28382,10 +25851,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -28394,10 +25860,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "EventTypeWebhookOutputDto": { "type": "object", @@ -28429,14 +25892,7 @@ "type": "string" } }, - "required": [ - "payloadTemplate", - "eventTypeId", - "id", - "triggers", - "subscriberUrl", - "active" - ] + "required": ["payloadTemplate", "eventTypeId", "id", "triggers", "subscriberUrl", "active"] }, "EventTypeWebhookOutputResponseDto": { "type": "object", @@ -28444,19 +25900,13 @@ "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", @@ -28464,10 +25914,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -28476,10 +25923,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteManyWebhooksOutputResponseDto": { "type": "object", @@ -28487,19 +25931,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "string" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OAuthClientWebhookOutputDto": { "type": "object", @@ -28531,14 +25969,7 @@ "type": "string" } }, - "required": [ - "payloadTemplate", - "oAuthClientId", - "id", - "triggers", - "subscriberUrl", - "active" - ] + "required": ["payloadTemplate", "oAuthClientId", "id", "triggers", "subscriberUrl", "active"] }, "OAuthClientWebhookOutputResponseDto": { "type": "object", @@ -28546,19 +25977,13 @@ "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", @@ -28566,10 +25991,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -28578,10 +26000,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DestinationCalendarsInputBodyDto": { "type": "object", @@ -28590,11 +26009,7 @@ "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", @@ -28605,10 +26020,7 @@ "type": "string" } }, - "required": [ - "integration", - "externalId" - ] + "required": ["integration", "externalId"] }, "DestinationCalendarsOutputDto": { "type": "object", @@ -28627,12 +26039,7 @@ "nullable": true } }, - "required": [ - "userId", - "integration", - "externalId", - "credentialId" - ] + "required": ["userId", "integration", "externalId", "credentialId"] }, "DestinationCalendarsOutputResponseDto": { "type": "object", @@ -28640,29 +26047,18 @@ "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", @@ -28691,19 +26087,12 @@ "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", @@ -28723,18 +26112,12 @@ "$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", @@ -28828,13 +26211,7 @@ "$ref": "#/components/schemas/CalendarSource" } }, - "required": [ - "start", - "end", - "id", - "title", - "source" - ] + "required": ["start", "end", "id", "title", "source"] }, "GetUnifiedCalendarEventOutput": { "type": "object", @@ -28842,19 +26219,13 @@ "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", @@ -28865,9 +26236,7 @@ "example": "acme@example.com" } }, - "required": [ - "email" - ] + "required": ["email"] }, "RequestEmailVerificationOutput": { "type": "object", @@ -28875,15 +26244,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "RequestPhoneVerificationInput": { "type": "object", @@ -28894,9 +26258,7 @@ "example": "+372 5555 6666" } }, - "required": [ - "phone" - ] + "required": ["phone"] }, "RequestPhoneVerificationOutput": { "type": "object", @@ -28904,15 +26266,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "VerifyEmailInput": { "type": "object", @@ -28928,10 +26285,7 @@ "example": "1ABG2C" } }, - "required": [ - "email", - "code" - ] + "required": ["email", "code"] }, "WorkingHours": { "type": "object", @@ -28953,11 +26307,7 @@ "nullable": true } }, - "required": [ - "days", - "startTime", - "endTime" - ] + "required": ["days", "startTime", "endTime"] }, "AvailabilityModel": { "type": "object", @@ -28997,12 +26347,7 @@ "nullable": true } }, - "required": [ - "id", - "days", - "startTime", - "endTime" - ] + "required": ["id", "days", "startTime", "endTime"] }, "ScheduleOutput": { "type": "object", @@ -29072,19 +26417,13 @@ "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", @@ -29100,10 +26439,7 @@ "example": "1ABG2C" } }, - "required": [ - "phone", - "code" - ] + "required": ["phone", "code"] }, "UserVerifiedPhoneOutput": { "type": "object", @@ -29111,19 +26447,13 @@ "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", @@ -29131,19 +26461,13 @@ "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", @@ -29151,19 +26475,13 @@ "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", @@ -29171,19 +26489,13 @@ "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", @@ -29191,19 +26503,13 @@ "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", @@ -29211,19 +26517,13 @@ "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", @@ -29231,20 +26531,14 @@ "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 fd2ec76dac0988..bbe4d29b7ca7dd 100644 --- a/packages/lib/server/service/hashedLinkService.ts +++ b/packages/lib/server/service/hashedLinkService.ts @@ -129,32 +129,20 @@ export class HashedLinkService { return hashedLink; } - /** - * Create a private link for an event type - */ async createLinkForEventType(eventTypeId: number, input: string | HashedLinkInputType) { const normalized = this.normalizeLinkInput(input); return this.hashedLinkRepository.createLink(eventTypeId, normalized); } - /** - * Update an existing private link for an event type - */ async updateLinkForEventType(eventTypeId: number, input: string | HashedLinkInputType) { const normalized = this.normalizeLinkInput(input); return this.hashedLinkRepository.updateLink(eventTypeId, normalized); } - /** - * Delete a private link for an event type - */ async deleteLinkForEventType(eventTypeId: number, linkId: string) { return this.hashedLinkRepository.deleteLinks(eventTypeId, [linkId]); } - /** - * List links for an event type (lightweight fields) - */ async listLinksByEventType(eventTypeId: number) { return this.hashedLinkRepository.findLinksByEventTypeId(eventTypeId); } From 955a0e40281272102390f440b147909073fc9cee Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Mon, 11 Aug 2025 06:31:17 +0400 Subject: [PATCH 11/15] remove unnecessary comments --- packages/platform/libraries/private-links.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/platform/libraries/private-links.ts b/packages/platform/libraries/private-links.ts index c654471d3d6cbd..45dd87e2c63042 100644 --- a/packages/platform/libraries/private-links.ts +++ b/packages/platform/libraries/private-links.ts @@ -1,5 +1,2 @@ -// Thin barrel for private-links utils used by API v2 -// Expose generateHashedLink and isLinkExpired from core lib under a stable platform-libraries import path export { generateHashedLink } from "@calcom/lib/generateHashedLink"; export { isLinkExpired } from "@calcom/lib/hashedLinksUtils"; - From 6911818ef664e980ae81612763f8de02ad3f564f Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Mon, 11 Aug 2025 06:33:01 +0400 Subject: [PATCH 12/15] cleanup --- .../event-types_2024_06_14/outputs/index.ts | 1 - .../outputs/private-link.output.ts | 137 ------------------ 2 files changed, 138 deletions(-) delete mode 100644 packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts diff --git a/packages/platform/types/event-types/event-types_2024_06_14/outputs/index.ts b/packages/platform/types/event-types/event-types_2024_06_14/outputs/index.ts index f74b62edd0324a..06fbdb43b0dc17 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/outputs/index.ts +++ b/packages/platform/types/event-types/event-types_2024_06_14/outputs/index.ts @@ -1,4 +1,3 @@ export * from "./event-type.output"; export * from "./booking-fields.output"; export * from "./locations.output"; -export * from "./private-link.output"; diff --git a/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts b/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts deleted file mode 100644 index 7ce1ef0bacca02..00000000000000 --- a/packages/platform/types/event-types/event-types_2024_06_14/outputs/private-link.output.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; - -// Base class with common properties -abstract class BasePrivateLinkOutput_2024_06_14 { - @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, - example: "https://cal.com/d/abc123def456/30min", - }) - bookingUrl!: string; -} - -// Time-based private link (expires at a specific date) -export class TimeBasedPrivateLinkOutput_2024_06_14 extends BasePrivateLinkOutput_2024_06_14 { - @ApiProperty({ - description: "Expiration date for this time-based link", - type: Date, - example: "2024-12-31T23:59:59.000Z", - }) - expiresAt!: Date; -} - -// Usage-based private link (expires after N uses) -export class UsageBasedPrivateLinkOutput_2024_06_14 extends BasePrivateLinkOutput_2024_06_14 { - @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_2024_06_14 = TimeBasedPrivateLinkOutput_2024_06_14 | UsageBasedPrivateLinkOutput_2024_06_14; - -export class CreatePrivateLinkOutput_2024_06_14 { - @ApiProperty({ - description: "Response status", - example: "success", - }) - status!: string; - - @ApiProperty({ - description: "Created private link data (either time-based or usage-based)", - oneOf: [ - { $ref: "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" }, - { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" }, - ], - }) - data!: PrivateLinkOutput_2024_06_14; -} - -export class GetPrivateLinksOutput_2024_06_14 { - @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: "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" }, - { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" }, - ], - }, - }) - data!: PrivateLinkOutput_2024_06_14[]; -} - -export class UpdatePrivateLinkOutput_2024_06_14 { - @ApiProperty({ - description: "Response status", - example: "success", - }) - status!: string; - - @ApiProperty({ - description: "Updated private link data (either time-based or usage-based)", - oneOf: [ - { $ref: "#/components/schemas/TimeBasedPrivateLinkOutput_2024_06_14" }, - { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput_2024_06_14" }, - ], - }) - data!: PrivateLinkOutput_2024_06_14; -} - -export class DeletePrivateLinkOutput_2024_06_14 { - @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; - }; -} From a0534ab74770a1e5208bbddb5cf152ac6fac5583 Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Mon, 11 Aug 2025 08:57:32 +0400 Subject: [PATCH 13/15] sort coderabbig suggestions --- .../event-types-private-links.controller.ts | 6 +- .../private-links.repository.ts | 3 - .../services/private-links-input.service.ts | 13 +- .../services/private-links.service.ts | 5 +- .../guards/event-type-ownership.guard.ts | 16 +- apps/api/v2/swagger/documentation.json | 117 +- docs/api-reference/v2/openapi.json | 4520 ++++++++++++++--- .../event-types/inputs/private-link.input.ts | 6 +- .../outputs/private-link.output.ts | 21 +- 9 files changed, 3840 insertions(+), 867 deletions(-) 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 index e45290d426562c..cd770676665988 100644 --- 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 @@ -15,7 +15,7 @@ import { Post, UseGuards, } from "@nestjs/common"; -import { ApiHeader, ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; +import { ApiHeader, ApiOperation, ApiTags as DocsTags, OmitType } from "@nestjs/swagger"; import { EVENT_TYPE_READ, @@ -33,6 +33,8 @@ import { import { PrivateLinksService } from "../services/private-links.service"; +class UpdatePrivateLinkBody extends OmitType(UpdatePrivateLinkInput, ["linkId"] as const) {} + @Controller({ path: "/v2/event-types/:eventTypeId/private-links", }) @@ -84,7 +86,7 @@ export class EventTypesPrivateLinksController { async updatePrivateLink( @Param("eventTypeId", ParseIntPipe) eventTypeId: number, @Param("linkId") linkId: string, - @Body() body: Omit, + @Body() body: UpdatePrivateLinkBody, @GetUser("id") userId: number ): Promise { const updateInput = { ...body, linkId }; 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 index 12e30cfc47fd02..4f6dde61b11176 100644 --- 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 @@ -17,13 +17,10 @@ export class PrivateLinksRepository { return this.dbRead.prisma.hashedLink.findUnique({ where: { link: linkId }, select: { - id: true, link: true, expiresAt: true, maxUsageCount: true, usageCount: true, - eventTypeId: true, - eventType: { select: { teamId: true, userId: true } }, }, }); } 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 index 290238eb5d744f..c16ba040375a9c 100644 --- 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 @@ -7,9 +7,20 @@ export class PrivateLinksInputService { constructor() {} transformCreateInput(input: CreatePrivateLinkInput): CreatePrivateLinkInput { + const hasExpires = input.expiresAt instanceof Date; + 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, + maxUsageCount: input.maxUsageCount ?? (hasMaxCount ? input.maxUsageCount : undefined), }; } 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 index 4648e0172939ed..a9bd77582846d4 100644 --- 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 @@ -109,7 +109,10 @@ export class PrivateLinksService { async deletePrivateLink(eventTypeId: number, userId: number, linkId: string): Promise { try { - await this.repo.delete(eventTypeId, linkId); + 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")) { 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 index 7e11ad1ac0166d..ea6a01cc85ff76 100644 --- 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 @@ -1,6 +1,13 @@ 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 { CanActivate, ExecutionContext, ForbiddenException, Injectable, NotFoundException } from "@nestjs/common"; +import { + BadRequestException, + CanActivate, + ExecutionContext, + ForbiddenException, + Injectable, + NotFoundException, +} from "@nestjs/common"; import { Request } from "express"; @Injectable() @@ -17,10 +24,13 @@ export class EventTypeOwnershipGuard implements CanActivate { } if (!eventTypeIdParam) { - throw new ForbiddenException("EventTypeOwnershipGuard - Missing eventTypeId param."); + throw new BadRequestException("Missing eventTypeId param."); } - const eventTypeId = parseInt(eventTypeIdParam); + 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 diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 6d2c5bb4108d88..2719e583f006b6 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -10012,6 +10012,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePrivateLinkBody" + } + } + } + }, "responses": { "200": { "description": "", @@ -28213,19 +28223,103 @@ "type": "object", "properties": { "expiresAt": { - "format": "date-time", "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", + "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 + "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": { @@ -28279,6 +28373,23 @@ "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": { diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index c6bb6c12c7fc9e..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,7 +9888,9 @@ } } }, - "tags": ["Event Types / Webhooks"] + "tags": [ + "Event Types / Webhooks" + ] } }, "/v2/event-types/{eventTypeId}/private-links": { @@ -9481,7 +9938,9 @@ } } }, - "tags": ["Event Types Private Links"] + "tags": [ + "Event Types Private Links" + ] }, "get": { "operationId": "EventTypesPrivateLinksController_getPrivateLinks", @@ -9517,7 +9976,9 @@ } } }, - "tags": ["Event Types Private Links"] + "tags": [ + "Event Types Private Links" + ] } }, "/v2/event-types/{eventTypeId}/private-links/{linkId}": { @@ -9551,6 +10012,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePrivateLinkBody" + } + } + } + }, "responses": { "200": { "description": "", @@ -9563,7 +10034,9 @@ } } }, - "tags": ["Event Types Private Links"] + "tags": [ + "Event Types Private Links" + ] }, "delete": { "operationId": "EventTypesPrivateLinksController_deletePrivateLink", @@ -9607,7 +10080,9 @@ } } }, - "tags": ["Event Types Private Links"] + "tags": [ + "Event Types Private Links" + ] } }, "/v2/organizations/{orgId}/organizations": { @@ -9665,7 +10140,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "get": { "operationId": "OrganizationsOrganizationsController_getOrganizations", @@ -9766,7 +10243,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] } }, "/v2/organizations/{orgId}/organizations/{managedOrganizationId}": { @@ -9814,7 +10293,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "patch": { "operationId": "OrganizationsOrganizationsController_updateOrganization", @@ -9878,7 +10359,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] }, "delete": { "operationId": "OrganizationsOrganizationsController_deleteOrganization", @@ -9924,7 +10407,9 @@ } } }, - "tags": ["Managed Orgs"] + "tags": [ + "Managed Orgs" + ] } }, "/v2/me": { @@ -9954,7 +10439,9 @@ } } }, - "tags": ["Me"] + "tags": [ + "Me" + ] }, "patch": { "operationId": "MeController_updateMe", @@ -9992,7 +10479,9 @@ } } }, - "tags": ["Me"] + "tags": [ + "Me" + ] } }, "/v2/oauth-clients": { @@ -10032,7 +10521,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "get": { "operationId": "OAuthClientsController_getOAuthClients", @@ -10060,7 +10551,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] } }, "/v2/oauth-clients/{clientId}": { @@ -10098,7 +10591,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "patch": { "operationId": "OAuthClientsController_updateOAuthClient", @@ -10144,7 +10639,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] }, "delete": { "operationId": "OAuthClientsController_deleteOAuthClient", @@ -10180,7 +10677,9 @@ } } }, - "tags": ["OAuth Clients"] + "tags": [ + "OAuth Clients" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -10221,7 +10720,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -10262,7 +10763,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -10311,7 +10814,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -10360,7 +10865,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails": { @@ -10423,7 +10930,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones": { @@ -10486,7 +10995,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/{id}": { @@ -10532,7 +11043,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/{id}": { @@ -10578,7 +11091,9 @@ } } }, - "tags": ["Organization Team Verified Resources"] + "tags": [ + "Organization Team Verified Resources" + ] } }, "/v2/routing-forms/{routingFormId}/calculate-slots": { @@ -10643,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" } }, @@ -10678,7 +11196,9 @@ } } }, - "tags": ["Routing forms"] + "tags": [ + "Routing forms" + ] } }, "/v2/schedules": { @@ -10729,7 +11249,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "get": { "operationId": "SchedulesController_2024_06_11_getSchedules", @@ -10768,7 +11290,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/schedules/default": { @@ -10809,7 +11333,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/schedules/{scheduleId}": { @@ -10857,7 +11383,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "patch": { "operationId": "SchedulesController_2024_06_11_updateSchedule", @@ -10913,7 +11441,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] }, "delete": { "operationId": "SchedulesController_2024_06_11_deleteSchedule", @@ -10959,7 +11489,9 @@ } } }, - "tags": ["Schedules"] + "tags": [ + "Schedules" + ] } }, "/v2/selected-calendars": { @@ -10999,7 +11531,9 @@ } } }, - "tags": ["Selected Calendars"] + "tags": [ + "Selected Calendars" + ] }, "delete": { "operationId": "SelectedCalendarsController_deleteSelectedCalendar", @@ -11059,7 +11593,9 @@ } } }, - "tags": ["Selected Calendars"] + "tags": [ + "Selected Calendars" + ] } }, "/v2/slots": { @@ -11262,7 +11798,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/slots/reservations": { @@ -11322,7 +11860,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/slots/reservations/{uid}": { @@ -11361,7 +11901,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] }, "patch": { "operationId": "SlotsController_2024_09_04_updateReservedSlot", @@ -11408,7 +11950,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] }, "delete": { "operationId": "SlotsController_2024_09_04_deleteReservedSlot", @@ -11448,7 +11992,9 @@ } } }, - "tags": ["Slots"] + "tags": [ + "Slots" + ] } }, "/v2/stripe/connect": { @@ -11478,7 +12024,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/stripe/save": { @@ -11515,7 +12063,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/stripe/check": { @@ -11545,7 +12095,9 @@ } } }, - "tags": ["Stripe"] + "tags": [ + "Stripe" + ] } }, "/v2/teams": { @@ -11585,7 +12137,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "get": { "operationId": "TeamsController_getTeams", @@ -11613,7 +12167,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] } }, "/v2/teams/{teamId}": { @@ -11651,7 +12207,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "patch": { "operationId": "TeamsController_updateTeam", @@ -11697,7 +12255,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] }, "delete": { "operationId": "TeamsController_deleteTeam", @@ -11733,7 +12293,9 @@ } } }, - "tags": ["Teams"] + "tags": [ + "Teams" + ] } }, "/v2/teams/{teamId}/event-types": { @@ -11781,7 +12343,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "get": { "operationId": "TeamsEventTypesController_getTeamEventTypes", @@ -11826,7 +12390,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}": { @@ -11872,7 +12438,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "patch": { "operationId": "TeamsEventTypesController_updateTeamEventType", @@ -11926,7 +12494,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] }, "delete": { "operationId": "TeamsEventTypesController_deleteTeamEventType", @@ -11970,7 +12540,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}/create-phone-call": { @@ -12026,7 +12598,9 @@ } } }, - "tags": ["Teams / Event Types"] + "tags": [ + "Teams / Event Types" + ] } }, "/v2/teams/{teamId}/memberships": { @@ -12074,7 +12648,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "get": { "operationId": "TeamsMembershipsController_getTeamMemberships", @@ -12135,7 +12711,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] } }, "/v2/teams/{teamId}/memberships/{membershipId}": { @@ -12181,7 +12759,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "patch": { "operationId": "TeamsMembershipsController_updateTeamMembership", @@ -12235,7 +12815,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] }, "delete": { "operationId": "TeamsMembershipsController_deleteTeamMembership", @@ -12279,7 +12861,9 @@ } } }, - "tags": ["Teams / Memberships"] + "tags": [ + "Teams / Memberships" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -12320,7 +12904,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -12361,7 +12947,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -12410,7 +12998,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -12459,7 +13049,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails": { @@ -12522,7 +13114,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones": { @@ -12585,7 +13179,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/emails/{id}": { @@ -12631,7 +13227,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/teams/{teamId}/verified-resources/phones/{id}": { @@ -12677,7 +13275,9 @@ } } }, - "tags": ["Teams Verified Resources"] + "tags": [ + "Teams Verified Resources" + ] } }, "/v2/verified-resources/emails/verification-code/request": { @@ -12718,7 +13318,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/verification-code/request": { @@ -12759,7 +13361,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails/verification-code/verify": { @@ -12800,7 +13404,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/verification-code/verify": { @@ -12841,7 +13447,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails": { @@ -12896,7 +13504,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones": { @@ -12951,7 +13561,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/emails/{id}": { @@ -12989,7 +13601,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/verified-resources/phones/{id}": { @@ -13027,7 +13641,9 @@ } } }, - "tags": ["Verified Resources"] + "tags": [ + "Verified Resources" + ] } }, "/v2/webhooks": { @@ -13067,7 +13683,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "get": { "operationId": "WebhooksController_getWebhooks", @@ -13121,7 +13739,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] } }, "/v2/webhooks/{webhookId}": { @@ -13169,7 +13789,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "get": { "operationId": "WebhooksController_getWebhook", @@ -13197,7 +13819,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] }, "delete": { "operationId": "WebhooksController_deleteWebhook", @@ -13233,7 +13857,9 @@ } } }, - "tags": ["Webhooks"] + "tags": [ + "Webhooks" + ] } } }, @@ -13376,7 +14002,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -13385,7 +14014,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateManagedUserInput": { "type": "object", @@ -13401,14 +14033,25 @@ }, "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", @@ -13482,7 +14125,10 @@ } } }, - "required": ["email", "name"] + "required": [ + "email", + "name" + ] }, "CreateManagedUserData": { "type": "object", @@ -13505,7 +14151,13 @@ "type": "number" } }, - "required": ["accessToken", "refreshToken", "user", "accessTokenExpiresAt", "refreshTokenExpiresAt"] + "required": [ + "accessToken", + "refreshToken", + "user", + "accessTokenExpiresAt", + "refreshTokenExpiresAt" + ] }, "CreateManagedUserOutput": { "type": "object", @@ -13513,7 +14165,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/CreateManagedUserData" @@ -13522,7 +14177,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetManagedUserOutput": { "type": "object", @@ -13530,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", @@ -13549,7 +14213,10 @@ }, "timeFormat": { "type": "number", - "enum": [12, 24], + "enum": [ + 12, + 24 + ], "example": 12, "description": "Must be 12 or 24" }, @@ -13558,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": { @@ -13650,7 +14325,12 @@ "type": "number" } }, - "required": ["accessToken", "refreshToken", "accessTokenExpiresAt", "refreshTokenExpiresAt"] + "required": [ + "accessToken", + "refreshToken", + "accessTokenExpiresAt", + "refreshTokenExpiresAt" + ] }, "KeysResponseDto": { "type": "object", @@ -13658,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", @@ -13724,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", @@ -13738,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": { @@ -13760,7 +14456,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "PlatformOAuthClientDto": { "type": "object", @@ -13795,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" @@ -13863,7 +14567,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -13872,7 +14579,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetOAuthClientResponseDto": { "type": "object", @@ -13880,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", @@ -13933,7 +14649,9 @@ "description": "Managed user's refresh token." } }, - "required": ["refreshToken"] + "required": [ + "refreshToken" + ] }, "RefreshApiKeyInput": { "type": "object", @@ -13959,7 +14677,9 @@ "type": "string" } }, - "required": ["apiKey"] + "required": [ + "apiKey" + ] }, "RefreshApiKeyOutput": { "type": "object", @@ -13967,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", @@ -14007,7 +14744,10 @@ "example": "#fafafa" } }, - "required": ["lightThemeHex", "darkThemeHex"] + "required": [ + "lightThemeHex", + "darkThemeHex" + ] }, "DestinationCalendar_2024_06_14": { "type": "object", @@ -14021,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", @@ -14039,7 +14782,11 @@ "type": "boolean" } }, - "required": ["type", "address", "public"] + "required": [ + "type", + "address", + "public" + ] }, "InputLinkLocation_2024_06_14": { "type": "object", @@ -14057,7 +14804,11 @@ "type": "boolean" } }, - "required": ["type", "link", "public"] + "required": [ + "type", + "link", + "public" + ] }, "InputIntegrationLocation_2024_06_14": { "type": "object", @@ -14070,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", @@ -14091,7 +14850,11 @@ "type": "boolean" } }, - "required": ["type", "phone", "public"] + "required": [ + "type", + "phone", + "public" + ] }, "PhoneFieldInput_2024_06_14": { "type": "object", @@ -14124,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", @@ -14159,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", @@ -14194,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", @@ -14229,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", @@ -14264,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", @@ -14291,7 +15089,10 @@ "example": "Select..." }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -14306,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", @@ -14329,7 +15138,10 @@ "type": "boolean" }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -14344,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", @@ -14379,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", @@ -14402,7 +15228,10 @@ "type": "boolean" }, "options": { - "example": ["Checkbox 1", "Checkbox 2"], + "example": [ + "Checkbox 1", + "Checkbox 2" + ], "type": "array", "items": { "type": "string" @@ -14417,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", @@ -14440,7 +15276,10 @@ "type": "boolean" }, "options": { - "example": ["Radio 1", "Radio 2"], + "example": [ + "Radio 1", + "Radio 2" + ], "type": "array", "items": { "type": "string" @@ -14455,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", @@ -14486,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", @@ -14521,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": { @@ -14542,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": { @@ -14563,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": { @@ -14582,7 +15462,10 @@ } } }, - "required": ["type", "value"] + "required": [ + "type", + "value" + ] }, "BaseBookingLimitsCount_2024_06_14": { "type": "object", @@ -14623,7 +15506,9 @@ "default": false } }, - "required": ["disabled"] + "required": [ + "disabled" + ] }, "BaseBookingLimitsDuration_2024_06_14": { "type": "object", @@ -14665,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", @@ -14684,7 +15577,10 @@ "example": 30 } }, - "required": ["unit", "count"] + "required": [ + "unit", + "count" + ] }, "BaseConfirmationPolicy_2024_06_14": { "type": "object", @@ -14692,7 +15588,10 @@ "type": { "type": "string", "description": "The policy that determines when confirmation is required", - "enum": ["always", "time"], + "enum": [ + "always", + "time" + ], "example": "always" }, "noticeThreshold": { @@ -14708,7 +15607,10 @@ "description": "Unconfirmed bookings still block calendar slots." } }, - "required": ["type", "blockUnconfirmedBookingsInBooker"] + "required": [ + "type", + "blockUnconfirmedBookingsInBooker" + ] }, "Seats_2024_06_14": { "type": "object", @@ -14729,7 +15631,11 @@ "example": true } }, - "required": ["seatsPerTimeSlot", "showAttendeeInfo", "showAvailabilityCount"] + "required": [ + "seatsPerTimeSlot", + "showAttendeeInfo", + "showAvailabilityCount" + ] }, "InputAttendeeAddressLocation_2024_06_14": { "type": "object", @@ -14740,7 +15646,9 @@ "description": "only allowed value for type is `attendeeAddress`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "InputAttendeePhoneLocation_2024_06_14": { "type": "object", @@ -14751,7 +15659,9 @@ "description": "only allowed value for type is `attendeePhone`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "InputAttendeeDefinedLocation_2024_06_14": { "type": "object", @@ -14762,7 +15672,9 @@ "description": "only allowed value for type is `attendeeDefined`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "NameDefaultFieldInput_2024_06_14": { "type": "object", @@ -14783,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", @@ -14812,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", @@ -14840,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", @@ -14854,7 +15776,9 @@ "type": "string" } }, - "required": ["slug"] + "required": [ + "slug" + ] }, "NotesDefaultFieldInput_2024_06_14": { "type": "object", @@ -14882,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", @@ -14910,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", @@ -14938,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", @@ -14949,7 +15879,9 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "CalVideoSettings": { "type": "object", @@ -14980,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": { @@ -15249,7 +16185,11 @@ } } }, - "required": ["lengthInMinutes", "title", "slug"] + "required": [ + "lengthInMinutes", + "title", + "slug" + ] }, "OutputAddressLocation_2024_06_14": { "type": "object", @@ -15278,7 +16218,11 @@ "type": "boolean" } }, - "required": ["type", "address", "public"] + "required": [ + "type", + "address", + "public" + ] }, "OutputLinkLocation_2024_06_14": { "type": "object", @@ -15306,7 +16250,11 @@ "type": "boolean" } }, - "required": ["type", "link", "public"] + "required": [ + "type", + "link", + "public" + ] }, "OutputIntegrationLocation_2024_06_14": { "type": "object", @@ -15372,7 +16320,10 @@ "description": "Credential ID associated with the integration" } }, - "required": ["type", "integration"] + "required": [ + "type", + "integration" + ] }, "OutputPhoneLocation_2024_06_14": { "type": "object", @@ -15400,7 +16351,11 @@ "type": "boolean" } }, - "required": ["type", "phone", "public"] + "required": [ + "type", + "phone", + "public" + ] }, "OutputOrganizersDefaultAppLocation_2024_06_14": { "type": "object", @@ -15423,7 +16378,9 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OutputUnknownLocation_2024_06_14": { "type": "object", @@ -15449,7 +16406,10 @@ "type": "string" } }, - "required": ["type", "location"] + "required": [ + "type", + "location" + ] }, "EmailDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15506,7 +16466,11 @@ "default": "email" } }, - "required": ["type", "isDefault", "slug"] + "required": [ + "type", + "isDefault", + "slug" + ] }, "NameDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15557,7 +16521,12 @@ "type": "boolean" } }, - "required": ["type", "isDefault", "slug", "required"] + "required": [ + "type", + "isDefault", + "slug", + "required" + ] }, "LocationDefaultFieldOutput_2024_06_14": { "type": "object", @@ -15588,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" @@ -15628,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" @@ -15668,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" @@ -15708,14 +16709,24 @@ "default": "textarea" } }, - "required": ["slug", "isDefault", "type"] + "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" @@ -15748,7 +16759,11 @@ "default": "multiemail" } }, - "required": ["slug", "isDefault", "type"] + "required": [ + "slug", + "isDefault", + "type" + ] }, "AddressFieldOutput_2024_06_14": { "type": "object", @@ -15805,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", @@ -15858,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", @@ -15897,7 +16926,10 @@ "type": "boolean" }, "options": { - "example": ["Checkbox 1", "Checkbox 2"], + "example": [ + "Checkbox 1", + "Checkbox 2" + ], "type": "array", "items": { "type": "string" @@ -15918,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", @@ -15975,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", @@ -16014,7 +17061,10 @@ "type": "boolean" }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -16035,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", @@ -16092,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", @@ -16149,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", @@ -16204,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", @@ -16243,7 +17322,10 @@ "type": "boolean" }, "options": { - "example": ["Radio 1", "Radio 2"], + "example": [ + "Radio 1", + "Radio 2" + ], "type": "array", "items": { "type": "string" @@ -16264,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", @@ -16307,7 +17397,10 @@ "example": "Select..." }, "options": { - "example": ["Option 1", "Option 2"], + "example": [ + "Option 1", + "Option 2" + ], "type": "array", "items": { "type": "string" @@ -16328,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", @@ -16385,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", @@ -16442,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", @@ -16456,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": { @@ -16736,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": { @@ -16762,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": { @@ -16779,7 +17913,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateEventTypeInput_2024_06_14": { "type": "object", @@ -16789,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": { @@ -17061,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", @@ -17089,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", @@ -17121,7 +18279,11 @@ "type": "string" } }, - "required": ["integration", "externalId", "credentialId"] + "required": [ + "integration", + "externalId", + "credentialId" + ] }, "SelectedCalendarOutputDto": { "type": "object", @@ -17140,7 +18302,12 @@ "nullable": true } }, - "required": ["userId", "integration", "externalId", "credentialId"] + "required": [ + "userId", + "integration", + "externalId", + "credentialId" + ] }, "SelectedCalendarOutputResponseDto": { "type": "object", @@ -17148,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", @@ -17230,7 +18403,11 @@ "default": "Sunday" } }, - "required": ["id", "name", "isOrganization"] + "required": [ + "id", + "name", + "isOrganization" + ] }, "OrgTeamsOutputResponseDto": { "type": "object", @@ -17238,7 +18415,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17247,7 +18427,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgMeTeamsOutputResponseDto": { "type": "object", @@ -17255,7 +18438,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17264,7 +18450,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgTeamOutputResponseDto": { "type": "object", @@ -17272,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", @@ -17443,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": { @@ -17471,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", @@ -17493,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", @@ -17517,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" } @@ -17550,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", @@ -17558,7 +18796,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17570,7 +18811,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateScheduleInput_2024_06_11": { "type": "object", @@ -17588,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" } @@ -17623,7 +18873,11 @@ } } }, - "required": ["name", "timeZone", "isDefault"] + "required": [ + "name", + "timeZone", + "isDefault" + ] }, "CreateScheduleOutput_2024_06_11": { "type": "object", @@ -17631,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", @@ -17645,7 +18905,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -17659,7 +18922,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateScheduleInput_2024_06_11": { "type": "object", @@ -17675,7 +18941,10 @@ "availability": { "example": [ { - "days": ["Monday", "Tuesday"], + "days": [ + "Monday", + "Tuesday" + ], "startTime": "09:00", "endTime": "10:00" } @@ -17710,7 +18979,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" @@ -17719,7 +18991,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteScheduleOutput_2024_06_11": { "type": "object", @@ -17727,10 +19002,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "ProfileOutput": { "type": "object", @@ -17757,7 +19037,11 @@ "example": "john_doe" } }, - "required": ["id", "organizationId", "userId"] + "required": [ + "id", + "organizationId", + "userId" + ] }, "GetOrgUsersWithProfileOutput": { "type": "object", @@ -17899,7 +19183,15 @@ ] } }, - "required": ["id", "email", "timeZone", "weekStart", "hideBranding", "createdDate", "profile"] + "required": [ + "id", + "email", + "timeZone", + "weekStart", + "hideBranding", + "createdDate", + "profile" + ] }, "GetOrganizationUsersResponseDTO": { "type": "object", @@ -17907,7 +19199,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -17916,7 +19211,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOrganizationUserInput": { "type": "object", @@ -18006,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", @@ -18021,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", @@ -18043,7 +19353,10 @@ "type": "string" } }, - "required": ["id", "name"] + "required": [ + "id", + "name" + ] }, "TextAttribute": { "type": "object", @@ -18064,7 +19377,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "NumberAttribute": { "type": "object", @@ -18085,7 +19404,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "SingleSelectAttribute": { "type": "object", @@ -18106,7 +19431,13 @@ "type": "string" } }, - "required": ["id", "name", "type", "option", "optionId"] + "required": [ + "id", + "name", + "type", + "option", + "optionId" + ] }, "MultiSelectAttributeOption": { "type": "object", @@ -18118,7 +19449,10 @@ "type": "string" } }, - "required": ["optionId", "option"] + "required": [ + "optionId", + "option" + ] }, "MultiSelectAttribute": { "type": "object", @@ -18139,7 +19473,12 @@ } } }, - "required": ["id", "name", "type", "options"] + "required": [ + "id", + "name", + "type", + "options" + ] }, "MembershipUserOutputDto": { "type": "object", @@ -18166,7 +19505,9 @@ } } }, - "required": ["email"] + "required": [ + "email" + ] }, "OrganizationMembershipOutput": { "type": "object", @@ -18185,7 +19526,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -18213,7 +19558,15 @@ } } }, - "required": ["id", "userId", "teamId", "accepted", "role", "user", "attributes"] + "required": [ + "id", + "userId", + "teamId", + "accepted", + "role", + "user", + "attributes" + ] }, "GetAllOrgMemberships": { "type": "object", @@ -18221,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", @@ -18242,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": { @@ -18250,7 +19613,10 @@ "default": false } }, - "required": ["userId", "role"] + "required": [ + "userId", + "role" + ] }, "CreateOrgMembershipOutput": { "type": "object", @@ -18258,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", @@ -18272,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", @@ -18286,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", @@ -18302,7 +19686,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -18315,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", @@ -18336,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", @@ -18349,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": { @@ -18590,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." }, @@ -18638,7 +20048,12 @@ } } }, - "required": ["lengthInMinutes", "title", "slug", "schedulingType"] + "required": [ + "lengthInMinutes", + "title", + "slug", + "schedulingType" + ] }, "CreateTeamEventTypeOutput": { "type": "object", @@ -18646,7 +20061,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -18662,7 +20080,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamEventTypeResponseHost": { "type": "object", @@ -18679,7 +20100,13 @@ "priority": { "type": "string", "default": "medium", - "enum": ["lowest", "low", "medium", "high", "highest"] + "enum": [ + "lowest", + "low", + "medium", + "high", + "highest" + ] }, "name": { "type": "string", @@ -18695,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", @@ -18728,7 +20159,9 @@ "type": "string" } }, - "required": ["id"] + "required": [ + "id" + ] }, "TeamEventTypeOutput_2024_06_14": { "type": "object", @@ -18743,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": { @@ -19014,7 +20451,11 @@ }, "schedulingType": { "type": "string", - "enum": ["roundRobin", "collective", "managed"] + "enum": [ + "roundRobin", + "collective", + "managed" + ] }, "team": { "$ref": "#/components/schemas/EventTypeTeam" @@ -19050,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", @@ -19082,7 +20529,10 @@ }, "templateType": { "default": "CUSTOM_TEMPLATE", - "enum": ["CHECK_IN_APPOINTMENT", "CUSTOM_TEMPLATE"], + "enum": [ + "CHECK_IN_APPOINTMENT", + "CUSTOM_TEMPLATE" + ], "type": "string", "description": "Template type" }, @@ -19111,7 +20561,13 @@ "description": "General prompt" } }, - "required": ["yourPhoneNumber", "numberToCall", "calApiKey", "enabled", "templateType"] + "required": [ + "yourPhoneNumber", + "numberToCall", + "calApiKey", + "enabled", + "templateType" + ] }, "Data": { "type": "object", @@ -19123,7 +20579,9 @@ "type": "string" } }, - "required": ["callId"] + "required": [ + "callId" + ] }, "CreatePhoneCallOutput": { "type": "object", @@ -19131,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", @@ -19145,7 +20609,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19154,7 +20621,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateTeamEventTypeInput_2024_06_14": { "type": "object", @@ -19164,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": { @@ -19450,7 +20924,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -19466,7 +20943,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteTeamEventTypeOutput": { "type": "object", @@ -19474,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", @@ -19499,7 +20985,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -19508,7 +20998,14 @@ "$ref": "#/components/schemas/MembershipUserOutputDto" } }, - "required": ["id", "userId", "teamId", "accepted", "role", "user"] + "required": [ + "id", + "userId", + "teamId", + "accepted", + "role", + "user" + ] }, "OrgTeamMembershipsOutputResponseDto": { "type": "object", @@ -19516,7 +21013,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19525,7 +21025,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "OrgTeamMembershipOutputResponseDto": { "type": "object", @@ -19533,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", @@ -19549,7 +21058,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -19569,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", @@ -19594,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", @@ -19617,7 +21142,14 @@ "example": true } }, - "required": ["id", "teamId", "type", "name", "slug", "enabled"] + "required": [ + "id", + "teamId", + "type", + "name", + "slug", + "enabled" + ] }, "GetOrganizationAttributesOutput": { "type": "object", @@ -19625,7 +21157,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19634,7 +21169,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetSingleAttributeOutput": { "type": "object", @@ -19642,7 +21180,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -19653,7 +21194,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateOrganizationAttributeOptionInput": { "type": "object", @@ -19665,7 +21209,10 @@ "type": "string" } }, - "required": ["value", "slug"] + "required": [ + "value", + "slug" + ] }, "CreateOrganizationAttributeInput": { "type": "object", @@ -19678,7 +21225,12 @@ }, "type": { "type": "string", - "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] + "enum": [ + "TEXT", + "NUMBER", + "SINGLE_SELECT", + "MULTI_SELECT" + ] }, "options": { "type": "array", @@ -19690,7 +21242,12 @@ "type": "boolean" } }, - "required": ["name", "slug", "type", "options"] + "required": [ + "name", + "slug", + "type", + "options" + ] }, "CreateOrganizationAttributesOutput": { "type": "object", @@ -19698,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", @@ -19717,7 +21280,12 @@ }, "type": { "type": "string", - "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] + "enum": [ + "TEXT", + "NUMBER", + "SINGLE_SELECT", + "MULTI_SELECT" + ] }, "enabled": { "type": "boolean" @@ -19730,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", @@ -19744,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", @@ -19776,7 +21356,12 @@ "example": "option-slug" } }, - "required": ["id", "attributeId", "value", "slug"] + "required": [ + "id", + "attributeId", + "value", + "slug" + ] }, "CreateAttributeOptionOutput": { "type": "object", @@ -19784,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", @@ -19798,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", @@ -19823,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", @@ -19837,7 +21440,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19846,7 +21452,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "AssignedOptionOutput": { "type": "object", @@ -19873,22 +21482,34 @@ }, "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"] - }, - "GetAllAttributeAssignedOptionOutput": { - "type": "object", + "required": [ + "id", + "attributeId", + "value", + "slug", + "assignedUserIds" + ] + }, + "GetAllAttributeAssignedOptionOutput": { + "type": "object", "properties": { "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19897,7 +21518,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "AssignOrganizationAttributeOptionToUserInput": { "type": "object", @@ -19912,7 +21536,9 @@ "type": "string" } }, - "required": ["attributeId"] + "required": [ + "attributeId" + ] }, "AssignOptionUserOutputData": { "type": "object", @@ -19930,7 +21556,11 @@ "description": "The value of the option" } }, - "required": ["id", "memberId", "attributeOptionId"] + "required": [ + "id", + "memberId", + "attributeOptionId" + ] }, "AssignOptionUserOutput": { "type": "object", @@ -19938,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", @@ -19952,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", @@ -19980,7 +21622,12 @@ "description": "The slug of the option" } }, - "required": ["id", "attributeId", "value", "slug"] + "required": [ + "id", + "attributeId", + "value", + "slug" + ] }, "GetOptionUserOutput": { "type": "object", @@ -19988,7 +21635,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -19997,7 +21647,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamWebhookOutputDto": { "type": "object", @@ -20029,7 +21682,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "teamId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "teamId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "TeamWebhooksOutputResponseDto": { "type": "object", @@ -20037,7 +21697,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -20046,7 +21709,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateWebhookInputDto": { "type": "object", @@ -20099,7 +21765,11 @@ "type": "string" } }, - "required": ["active", "subscriberUrl", "triggers"] + "required": [ + "active", + "subscriberUrl", + "triggers" + ] }, "TeamWebhookOutputResponseDto": { "type": "object", @@ -20107,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", @@ -20196,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", @@ -20230,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" + ] } } }, @@ -20245,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" @@ -20265,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", @@ -20296,7 +21997,9 @@ ] } }, - "required": ["type"] + "required": [ + "type" + ] }, "WorkflowMessageOutputDto": { "type": "object", @@ -20317,7 +22020,9 @@ "example": "Reminder for {EVENT_NAME}." } }, - "required": ["subject"] + "required": [ + "subject" + ] }, "WorkflowStepOutputDto": { "type": "object", @@ -20351,7 +22056,12 @@ "type": "string", "description": "Intended recipient type", "example": "const", - "enum": ["const", "attendee", "email", "phone_number"] + "enum": [ + "const", + "attendee", + "email", + "phone_number" + ] }, "email": { "type": "string", @@ -20366,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", @@ -20388,7 +22105,15 @@ ] } }, - "required": ["id", "stepNumber", "action", "recipient", "template", "sender", "message"] + "required": [ + "id", + "stepNumber", + "action", + "recipient", + "template", + "sender", + "message" + ] }, "WorkflowOutput": { "type": "object", @@ -20447,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", @@ -20456,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", @@ -20466,7 +22200,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetWorkflowOutput": { "type": "object", @@ -20475,7 +22212,10 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "description": "workflow", @@ -20485,7 +22225,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "WorkflowTriggerOffsetDto": { "type": "object", @@ -20501,7 +22244,10 @@ "example": "hour" } }, - "required": ["value", "unit"] + "required": [ + "value", + "unit" + ] }, "OnBeforeEventTriggerDto": { "type": "object", @@ -20521,7 +22267,10 @@ "example": "beforeEvent" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnAfterEventTriggerDto": { "type": "object", @@ -20541,7 +22290,10 @@ "example": "afterEvent" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnCancelTriggerDto": { "type": "object", @@ -20552,7 +22304,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnCreationTriggerDto": { "type": "object", @@ -20563,7 +22317,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnRescheduleTriggerDto": { "type": "object", @@ -20574,7 +22330,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "OnAfterCalVideoGuestsNoShowTriggerDto": { "type": "object", @@ -20594,7 +22352,10 @@ "example": "afterGuestsCalVideoNoShow" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "OnAfterCalVideoHostsNoShowTriggerDto": { "type": "object", @@ -20614,7 +22375,10 @@ "example": "afterHostsCalVideoNoShow" } }, - "required": ["offset", "type"] + "required": [ + "offset", + "type" + ] }, "HtmlWorkflowMessageDto": { "type": "object", @@ -20630,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", @@ -20660,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", @@ -20734,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", @@ -20799,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", @@ -20850,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", @@ -20880,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", @@ -20901,7 +22719,14 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "WorkflowPhoneWhatsAppNumberStepDto": { "type": "object", @@ -20931,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", @@ -20960,7 +22797,15 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "WorkflowPhoneNumberStepDto": { "type": "object", @@ -20990,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", @@ -21019,7 +22876,15 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "WorkflowPhoneAttendeeStepDto": { "type": "object", @@ -21049,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", @@ -21074,7 +22951,14 @@ ] } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "BaseWorkflowTriggerDto": { "type": "object", @@ -21084,7 +22968,9 @@ "description": "Trigger type for the workflow" } }, - "required": ["type"] + "required": [ + "type" + ] }, "WorkflowActivationDto": { "type": "object", @@ -21098,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", @@ -21179,7 +23069,12 @@ } } }, - "required": ["name", "activation", "trigger", "steps"] + "required": [ + "name", + "activation", + "trigger", + "steps" + ] }, "UpdateEmailAddressWorkflowStepDto": { "type": "object", @@ -21209,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", @@ -21288,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", @@ -21358,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", @@ -21428,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", @@ -21458,7 +23401,14 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "UpdatePhoneWhatsAppNumberWorkflowStepDto": { "type": "object", @@ -21488,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", @@ -21522,7 +23484,15 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] }, "UpdateWhatsAppAttendeePhoneWorkflowStepDto": { "type": "object", @@ -21552,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", @@ -21578,7 +23560,14 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "message" + ] }, "UpdatePhoneNumberWorkflowStepDto": { "type": "object", @@ -21608,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", @@ -21642,12 +23643,20 @@ "example": 67244 } }, - "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] - }, - "UpdateWorkflowDto": { - "type": "object", - "properties": { - "name": { + "required": [ + "action", + "stepNumber", + "recipient", + "template", + "sender", + "verifiedPhoneId", + "message" + ] + }, + "UpdateWorkflowDto": { + "type": "object", + "properties": { + "name": { "type": "string", "description": "Name of the workflow", "example": "Platform Test Workflow" @@ -21724,7 +23733,9 @@ "type": "string" } }, - "required": ["authUrl"] + "required": [ + "authUrl" + ] }, "StripConnectOutputResponseDto": { "type": "object", @@ -21732,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", @@ -21747,7 +23764,9 @@ "type": "string" } }, - "required": ["url"] + "required": [ + "url" + ] }, "StripCredentialsCheckOutputResponseDto": { "type": "object", @@ -21757,7 +23776,9 @@ "example": "success" } }, - "required": ["status"] + "required": [ + "status" + ] }, "GetDefaultScheduleOutput_2024_06_11": { "type": "object", @@ -21765,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", @@ -21855,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", @@ -21863,7 +23892,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -21877,7 +23909,10 @@ "description": "Either an Output object or a TeamOutputDto." } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "TeamOutputDto": { "type": "object", @@ -21953,7 +23988,11 @@ "default": "Sunday" } }, - "required": ["id", "name", "isOrganization"] + "required": [ + "id", + "name", + "isOrganization" + ] }, "GetTeamOutput": { "type": "object", @@ -21961,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", @@ -21975,7 +24020,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -21984,7 +24032,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UpdateTeamOutput": { "type": "object", @@ -21992,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", @@ -22023,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", @@ -22044,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", @@ -22063,7 +24138,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "SetDefaultConferencingAppOutputResponseDto": { "type": "object", @@ -22071,10 +24149,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "DefaultConferencingAppsOutputDto": { "type": "object", @@ -22093,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", @@ -22107,10 +24195,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "GoogleServiceAccountKeyInput": { "type": "object", @@ -22125,7 +24218,11 @@ "type": "string" } }, - "required": ["private_key", "client_email", "client_id"] + "required": [ + "private_key", + "client_email", + "client_id" + ] }, "CreateDelegationCredentialInput": { "type": "object", @@ -22150,7 +24247,11 @@ } } }, - "required": ["workspacePlatformSlug", "domain", "serviceAccountKey"] + "required": [ + "workspacePlatformSlug", + "domain", + "serviceAccountKey" + ] }, "WorkspacePlatformDto": { "type": "object", @@ -22162,7 +24263,10 @@ "type": "string" } }, - "required": ["name", "slug"] + "required": [ + "name", + "slug" + ] }, "DelegationCredentialOutput": { "type": "object", @@ -22207,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", @@ -22242,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", @@ -22269,7 +24388,9 @@ "description": "Whether to allowing writing to the calendar or not" } }, - "required": ["urls"] + "required": [ + "urls" + ] }, "CreateIcsFeedOutput": { "type": "object", @@ -22309,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", @@ -22317,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", @@ -22341,7 +24475,10 @@ "nullable": true } }, - "required": ["start", "end"] + "required": [ + "start", + "end" + ] }, "GetBusyTimesOutput": { "type": "object", @@ -22349,7 +24486,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -22358,7 +24498,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "Integration": { "type": "object", @@ -22467,7 +24610,13 @@ "nullable": true } }, - "required": ["externalId", "primary", "readOnly", "isSelected", "credentialId"] + "required": [ + "externalId", + "primary", + "readOnly", + "isSelected", + "credentialId" + ] }, "Calendar": { "type": "object", @@ -22502,7 +24651,12 @@ "nullable": true } }, - "required": ["externalId", "readOnly", "isSelected", "credentialId"] + "required": [ + "externalId", + "readOnly", + "isSelected", + "credentialId" + ] }, "ConnectedCalendar": { "type": "object", @@ -22527,7 +24681,10 @@ } } }, - "required": ["integration", "credentialId"] + "required": [ + "integration", + "credentialId" + ] }, "DestinationCalendar": { "type": "object", @@ -22601,7 +24758,10 @@ "$ref": "#/components/schemas/DestinationCalendar" } }, - "required": ["connectedCalendars", "destinationCalendar"] + "required": [ + "connectedCalendars", + "destinationCalendar" + ] }, "ConnectedCalendarsOutput": { "type": "object", @@ -22609,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", @@ -22627,7 +24793,10 @@ "type": "string" } }, - "required": ["username", "password"] + "required": [ + "username", + "password" + ] }, "DeleteCalendarCredentialsInputBodyDto": { "type": "object", @@ -22638,7 +24807,9 @@ "description": "Credential ID of the calendar to delete, as returned by the /calendars endpoint" } }, - "required": ["id"] + "required": [ + "id" + ] }, "DeletedCalendarCredentialsOutputDto": { "type": "object", @@ -22666,7 +24837,14 @@ "nullable": true } }, - "required": ["id", "type", "userId", "teamId", "appId", "invalid"] + "required": [ + "id", + "type", + "userId", + "teamId", + "appId", + "invalid" + ] }, "DeletedCalendarCredentialsOutputResponseDto": { "type": "object", @@ -22674,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", @@ -22716,7 +24900,9 @@ } } }, - "required": ["name"] + "required": [ + "name" + ] }, "ManagedOrganizationWithApiKeyOutput": { "type": "object", @@ -22741,7 +24927,11 @@ "type": "string" } }, - "required": ["id", "name", "apiKey"] + "required": [ + "id", + "name", + "apiKey" + ] }, "CreateManagedOrganizationOutput": { "type": "object", @@ -22749,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", @@ -22777,7 +24973,10 @@ } } }, - "required": ["id", "name"] + "required": [ + "id", + "name" + ] }, "GetManagedOrganizationOutput": { "type": "object", @@ -22785,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", @@ -22859,7 +25064,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -22871,7 +25079,11 @@ "$ref": "#/components/schemas/PaginationMetaDto" } }, - "required": ["status", "data", "pagination"] + "required": [ + "status", + "data", + "pagination" + ] }, "UpdateOrganizationInput": { "type": "object", @@ -22920,7 +25132,14 @@ "type": "string" } }, - "required": ["id", "formId", "formFillerId", "routedToBookingUid", "response", "createdAt"] + "required": [ + "id", + "formId", + "formFillerId", + "routedToBookingUid", + "response", + "createdAt" + ] }, "GetRoutingFormResponsesOutput": { "type": "object", @@ -22928,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", @@ -22953,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" @@ -22980,7 +25208,9 @@ "example": "Account" } }, - "required": ["teamMemberIds"] + "required": [ + "teamMemberIds" + ] }, "CreateRoutingFormResponseOutputData": { "type": "object", @@ -22995,7 +25225,10 @@ "example": { "eventTypeId": 123, "routing": { - "teamMemberIds": [101, 102], + "teamMemberIds": [ + 101, + 102 + ], "teamMemberEmail": "john.doe@example.com", "skipContactOwner": true } @@ -23034,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", @@ -23057,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", @@ -23139,7 +25384,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -23148,7 +25396,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "SlotsOutput_2024_09_04": { "type": "object", @@ -23175,7 +25426,10 @@ ] } }, - "required": ["eventTypeId", "slots"] + "required": [ + "eventTypeId", + "slots" + ] }, "ResponseSlotsOutput": { "type": "object", @@ -23183,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", @@ -23215,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", @@ -23272,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", @@ -23286,7 +25555,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "nullable": true, @@ -23297,7 +25569,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "MeOrgOutput": { "type": "object", @@ -23309,7 +25584,10 @@ "type": "number" } }, - "required": ["isPlatform", "id"] + "required": [ + "isPlatform", + "id" + ] }, "MeOutput": { "type": "object", @@ -23361,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", @@ -23375,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", @@ -23392,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", @@ -23407,7 +25699,10 @@ "example": "123 Example St, City, Country" } }, - "required": ["type", "address"] + "required": [ + "type", + "address" + ] }, "BookingInputAttendeeDefinedLocation_2024_08_13": { "type": "object", @@ -23422,7 +25717,10 @@ "example": "321 Example St, City, Country" } }, - "required": ["type", "location"] + "required": [ + "type", + "location" + ] }, "BookingInputAttendeePhoneLocation_2024_08_13": { "type": "object", @@ -23437,7 +25735,10 @@ "example": "+37120993151" } }, - "required": ["type", "phone"] + "required": [ + "type", + "phone" + ] }, "BookingInputIntegrationLocation_2024_08_13": { "type": "object", @@ -23483,7 +25784,10 @@ ] } }, - "required": ["type", "integration"] + "required": [ + "type", + "integration" + ] }, "BookingInputLinkLocation_2024_08_13": { "type": "object", @@ -23494,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", @@ -23505,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", @@ -23516,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", @@ -23597,7 +25907,10 @@ "default": "en" } }, - "required": ["name", "timeZone"] + "required": [ + "name", + "timeZone" + ] }, "CreateBookingInput_2024_08_13": { "type": "object", @@ -23649,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" @@ -23706,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": [ { @@ -23715,7 +26034,10 @@ ] } }, - "required": ["start", "attendee"] + "required": [ + "start", + "attendee" + ] }, "CreateInstantBookingInput_2024_08_13": { "type": "object", @@ -23767,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" @@ -23824,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": [ { @@ -23838,7 +26166,11 @@ "example": true } }, - "required": ["start", "attendee", "instant"] + "required": [ + "start", + "attendee", + "instant" + ] }, "CreateRecurringBookingInput_2024_08_13": { "type": "object", @@ -23890,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" @@ -23947,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": [ { @@ -23961,7 +26299,10 @@ "example": 5 } }, - "required": ["start", "attendee"] + "required": [ + "start", + "attendee" + ] }, "BookingHost": { "type": "object", @@ -23987,7 +26328,13 @@ "example": "America/Los_Angeles" } }, - "required": ["id", "name", "email", "username", "timeZone"] + "required": [ + "id", + "name", + "email", + "username", + "timeZone" + ] }, "EventType": { "type": "object", @@ -24001,7 +26348,10 @@ "example": "some-event" } }, - "required": ["id", "slug"] + "required": [ + "id", + "slug" + ] }, "BookingAttendee": { "type": "object", @@ -24076,7 +26426,12 @@ "example": "+1234567890" } }, - "required": ["name", "email", "timeZone", "absent"] + "required": [ + "name", + "email", + "timeZone", + "absent" + ] }, "BookingOutput_2024_08_13": { "type": "object", @@ -24105,7 +26460,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24199,7 +26559,10 @@ } }, "guests": { - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -24260,7 +26623,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24354,7 +26722,10 @@ } }, "guests": { - "example": ["guest1@example.com", "guest2@example.com"], + "example": [ + "guest1@example.com", + "guest2@example.com" + ], "type": "array", "items": { "type": "string" @@ -24483,7 +26854,14 @@ } } }, - "required": ["name", "email", "timeZone", "absent", "seatUid", "bookingFieldsResponses"] + "required": [ + "name", + "email", + "timeZone", + "absent", + "seatUid", + "bookingFieldsResponses" + ] }, "CreateSeatedBookingOutput_2024_08_13": { "type": "object", @@ -24512,7 +26890,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24657,7 +27040,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24786,7 +27174,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -24812,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", @@ -24841,7 +27235,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -24981,7 +27380,12 @@ }, "status": { "type": "string", - "enum": ["cancelled", "accepted", "rejected", "pending"], + "enum": [ + "cancelled", + "accepted", + "rejected", + "pending" + ], "example": "accepted" }, "cancellationReason": { @@ -25105,7 +27509,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25140,7 +27547,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "RecordingItem": { "type": "object", @@ -25184,7 +27594,14 @@ "example": "Error message" } }, - "required": ["id", "roomName", "startTs", "status", "duration", "shareToken"] + "required": [ + "id", + "roomName", + "startTs", + "status", + "duration", + "shareToken" + ] }, "GetBookingRecordingsOutput": { "type": "object", @@ -25192,7 +27609,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "error": { "type": "object" @@ -25204,7 +27624,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetBookingTranscriptsOutput": { "type": "object", @@ -25212,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" @@ -25225,7 +27654,10 @@ "type": "object" } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetBookingsOutput_2024_08_13": { "type": "object", @@ -25233,7 +27665,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25262,7 +27697,11 @@ "type": "object" } }, - "required": ["status", "data", "pagination"] + "required": [ + "status", + "data", + "pagination" + ] }, "RescheduleBookingInput_2024_08_13": { "type": "object", @@ -25282,7 +27721,9 @@ "description": "Reason for rescheduling the booking" } }, - "required": ["start"] + "required": [ + "start" + ] }, "RescheduleSeatedBookingInput_2024_08_13": { "type": "object", @@ -25302,7 +27743,10 @@ "description": "Uid of the specific seat within booking." } }, - "required": ["start", "seatUid"] + "required": [ + "start", + "seatUid" + ] }, "RescheduleBookingOutput_2024_08_13": { "type": "object", @@ -25310,7 +27754,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25330,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", @@ -25354,7 +27804,9 @@ "description": "Uid of the specific seat within booking." } }, - "required": ["seatUid"] + "required": [ + "seatUid" + ] }, "CancelBookingOutput_2024_08_13": { "type": "object", @@ -25362,7 +27814,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25394,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", @@ -25406,7 +27864,10 @@ "type": "boolean" } }, - "required": ["email", "absent"] + "required": [ + "email", + "absent" + ] }, "MarkAbsentBookingInput_2024_08_13": { "type": "object", @@ -25430,7 +27891,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25444,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", @@ -25462,7 +27929,11 @@ "example": "john.doe@example.com" } }, - "required": ["id", "name", "email"] + "required": [ + "id", + "name", + "email" + ] }, "ReassignBookingOutput_2024_08_13": { "type": "object", @@ -25470,7 +27941,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "oneOf": [ @@ -25486,7 +27960,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "ReassignToUserBookingInput_2024_08_13": { "type": "object", @@ -25520,7 +27997,10 @@ "description": "The link to the calendar" } }, - "required": ["label", "link"] + "required": [ + "label", + "link" + ] }, "CalendarLinksOutput_2024_08_13": { "type": "object", @@ -25538,7 +28018,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "BookingReference": { "type": "object", @@ -25561,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", @@ -25579,7 +28067,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "CreateTeamMembershipInput": { "type": "object", @@ -25594,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", @@ -25609,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", @@ -25623,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", @@ -25637,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", @@ -25653,7 +28168,11 @@ }, "role": { "type": "string", - "enum": ["MEMBER", "OWNER", "ADMIN"] + "enum": [ + "MEMBER", + "OWNER", + "ADMIN" + ] }, "disableImpersonation": { "type": "boolean" @@ -25666,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", @@ -25680,31 +28205,121 @@ "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": { - "format": "date-time", "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", + "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 + "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": { @@ -25725,7 +28340,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "GetPrivateLinksOutput": { "type": "object", @@ -25750,7 +28368,27 @@ } } }, - "required": ["status", "data"] + "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", @@ -25772,7 +28410,10 @@ ] } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeletePrivateLinkOutput": { "type": "object", @@ -25797,7 +28438,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "UserWebhookOutputDto": { "type": "object", @@ -25829,7 +28473,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "userId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "userId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "UserWebhookOutputResponseDto": { "type": "object", @@ -25837,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", @@ -25851,7 +28508,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25860,7 +28520,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "EventTypeWebhookOutputDto": { "type": "object", @@ -25892,7 +28555,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "eventTypeId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "eventTypeId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "EventTypeWebhookOutputResponseDto": { "type": "object", @@ -25900,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", @@ -25914,7 +28590,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -25923,7 +28602,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DeleteManyWebhooksOutputResponseDto": { "type": "object", @@ -25931,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", @@ -25969,7 +28657,14 @@ "type": "string" } }, - "required": ["payloadTemplate", "oAuthClientId", "id", "triggers", "subscriberUrl", "active"] + "required": [ + "payloadTemplate", + "oAuthClientId", + "id", + "triggers", + "subscriberUrl", + "active" + ] }, "OAuthClientWebhookOutputResponseDto": { "type": "object", @@ -25977,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", @@ -25991,7 +28692,10 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] }, "data": { "type": "array", @@ -26000,7 +28704,10 @@ } } }, - "required": ["status", "data"] + "required": [ + "status", + "data" + ] }, "DestinationCalendarsInputBodyDto": { "type": "object", @@ -26009,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", @@ -26020,7 +28731,10 @@ "type": "string" } }, - "required": ["integration", "externalId"] + "required": [ + "integration", + "externalId" + ] }, "DestinationCalendarsOutputDto": { "type": "object", @@ -26039,7 +28753,12 @@ "nullable": true } }, - "required": ["userId", "integration", "externalId", "credentialId"] + "required": [ + "userId", + "integration", + "externalId", + "credentialId" + ] }, "DestinationCalendarsOutputResponseDto": { "type": "object", @@ -26047,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", @@ -26087,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", @@ -26112,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", @@ -26211,7 +28954,13 @@ "$ref": "#/components/schemas/CalendarSource" } }, - "required": ["start", "end", "id", "title", "source"] + "required": [ + "start", + "end", + "id", + "title", + "source" + ] }, "GetUnifiedCalendarEventOutput": { "type": "object", @@ -26219,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", @@ -26236,7 +28991,9 @@ "example": "acme@example.com" } }, - "required": ["email"] + "required": [ + "email" + ] }, "RequestEmailVerificationOutput": { "type": "object", @@ -26244,10 +29001,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "RequestPhoneVerificationInput": { "type": "object", @@ -26258,7 +29020,9 @@ "example": "+372 5555 6666" } }, - "required": ["phone"] + "required": [ + "phone" + ] }, "RequestPhoneVerificationOutput": { "type": "object", @@ -26266,10 +29030,15 @@ "status": { "type": "string", "example": "success", - "enum": ["success", "error"] + "enum": [ + "success", + "error" + ] } }, - "required": ["status"] + "required": [ + "status" + ] }, "VerifyEmailInput": { "type": "object", @@ -26285,7 +29054,10 @@ "example": "1ABG2C" } }, - "required": ["email", "code"] + "required": [ + "email", + "code" + ] }, "WorkingHours": { "type": "object", @@ -26307,7 +29079,11 @@ "nullable": true } }, - "required": ["days", "startTime", "endTime"] + "required": [ + "days", + "startTime", + "endTime" + ] }, "AvailabilityModel": { "type": "object", @@ -26347,7 +29123,12 @@ "nullable": true } }, - "required": ["id", "days", "startTime", "endTime"] + "required": [ + "id", + "days", + "startTime", + "endTime" + ] }, "ScheduleOutput": { "type": "object", @@ -26417,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", @@ -26439,7 +29226,10 @@ "example": "1ABG2C" } }, - "required": ["phone", "code"] + "required": [ + "phone", + "code" + ] }, "UserVerifiedPhoneOutput": { "type": "object", @@ -26447,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", @@ -26461,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", @@ -26475,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", @@ -26489,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", @@ -26503,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", @@ -26517,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", @@ -26531,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/platform/types/event-types/inputs/private-link.input.ts b/packages/platform/types/event-types/inputs/private-link.input.ts index c3dd13447b500a..322fb600b1ed31 100644 --- a/packages/platform/types/event-types/inputs/private-link.input.ts +++ b/packages/platform/types/event-types/inputs/private-link.input.ts @@ -8,7 +8,8 @@ export class CreatePrivateLinkInput { @Type(() => Date) @ApiPropertyOptional({ description: "Expiration date for time-based links", - type: Date, + type: String, + format: "date-time", example: "2024-12-31T23:59:59.000Z", }) expiresAt?: Date; @@ -17,10 +18,11 @@ export class CreatePrivateLinkInput { @IsInt() @Min(1) @ApiPropertyOptional({ - description: "Maximum number of times the link can be used", + 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; } diff --git a/packages/platform/types/event-types/outputs/private-link.output.ts b/packages/platform/types/event-types/outputs/private-link.output.ts index c2c2c28a797b98..984add1df52170 100644 --- a/packages/platform/types/event-types/outputs/private-link.output.ts +++ b/packages/platform/types/event-types/outputs/private-link.output.ts @@ -1,4 +1,4 @@ -import { ApiProperty } from "@nestjs/swagger"; +import { ApiExtraModels, ApiProperty, getSchemaPath } from "@nestjs/swagger"; // Base class with common properties abstract class BasePrivateLinkOutput { @@ -26,6 +26,7 @@ abstract class BasePrivateLinkOutput { @ApiProperty({ description: "Full booking URL for this private link", type: String, + format: "uri", example: "https://cal.com/d/abc123def456/30min", }) bookingUrl!: string; @@ -35,7 +36,8 @@ abstract class BasePrivateLinkOutput { export class TimeBasedPrivateLinkOutput extends BasePrivateLinkOutput { @ApiProperty({ description: "Expiration date for this time-based link", - type: Date, + type: String, + format: "date-time", example: "2025-12-31T23:59:59.000Z", }) expiresAt!: Date; @@ -61,6 +63,7 @@ export class UsageBasedPrivateLinkOutput extends BasePrivateLinkOutput { // 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; @@ -68,13 +71,14 @@ export class CreatePrivateLinkOutput { @ApiProperty({ description: "Created private link data (either time-based or usage-based)", oneOf: [ - { $ref: "#/components/schemas/TimeBasedPrivateLinkOutput" }, - { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput" }, + { $ref: getSchemaPath(TimeBasedPrivateLinkOutput) }, + { $ref: getSchemaPath(UsageBasedPrivateLinkOutput) }, ], }) data!: PrivateLinkOutput; } +@ApiExtraModels(TimeBasedPrivateLinkOutput, UsageBasedPrivateLinkOutput) export class GetPrivateLinksOutput { @ApiProperty({ description: "Response status", example: "success" }) status!: string; @@ -84,14 +88,15 @@ export class GetPrivateLinksOutput { type: "array", items: { oneOf: [ - { $ref: "#/components/schemas/TimeBasedPrivateLinkOutput" }, - { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput" }, + { $ref: getSchemaPath(TimeBasedPrivateLinkOutput) }, + { $ref: getSchemaPath(UsageBasedPrivateLinkOutput) }, ], }, }) data!: PrivateLinkOutput[]; } +@ApiExtraModels(TimeBasedPrivateLinkOutput, UsageBasedPrivateLinkOutput) export class UpdatePrivateLinkOutput { @ApiProperty({ description: "Response status", example: "success" }) status!: string; @@ -99,8 +104,8 @@ export class UpdatePrivateLinkOutput { @ApiProperty({ description: "Updated private link data (either time-based or usage-based)", oneOf: [ - { $ref: "#/components/schemas/TimeBasedPrivateLinkOutput" }, - { $ref: "#/components/schemas/UsageBasedPrivateLinkOutput" }, + { $ref: getSchemaPath(TimeBasedPrivateLinkOutput) }, + { $ref: getSchemaPath(UsageBasedPrivateLinkOutput) }, ], }) data!: PrivateLinkOutput; From 6e020129fd4b6b86cff8af1b6f1b0072e1dd5c5b Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz Date: Mon, 11 Aug 2025 09:47:17 +0400 Subject: [PATCH 14/15] improve check --- .../services/private-links-input.service.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 index c16ba040375a9c..28e3a2bc61f491 100644 --- 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 @@ -7,7 +7,7 @@ export class PrivateLinksInputService { constructor() {} transformCreateInput(input: CreatePrivateLinkInput): CreatePrivateLinkInput { - const hasExpires = input.expiresAt instanceof Date; + const hasExpires = input.expiresAt !== undefined && input.expiresAt !== null; const hasMaxCount = typeof input.maxUsageCount === "number"; if (!hasExpires && !hasMaxCount) { @@ -32,5 +32,3 @@ export class PrivateLinksInputService { }; } } - - From 7551ecbca59ae0bdf448437949f95c052f6258c6 Mon Sep 17 00:00:00 2001 From: supalarry Date: Mon, 11 Aug 2025 09:40:30 +0200 Subject: [PATCH 15/15] chore: bump platform libraries --- apps/api/v2/package.json | 2 +- packages/platform/libraries/package.json | 2 +- yarn.lock | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/api/v2/package.json b/apps/api/v2/package.json index e2fe12fdd2be20..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@9.9.9", + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.294", "@calcom/platform-types": "*", "@calcom/platform-utils": "*", "@calcom/prisma": "*", diff --git a/packages/platform/libraries/package.json b/packages/platform/libraries/package.json index 419a9d29484893..1926c36e85e39b 100644 --- a/packages/platform/libraries/package.json +++ b/packages/platform/libraries/package.json @@ -1,6 +1,6 @@ { "name": "@calcom/platform-libraries", - "version": "9.9.9", + "version": "0.0.0", "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/yarn.lock b/yarn.lock index d31854e2ebbf10..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@9.9.9" + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.294" "@calcom/platform-types": "*" "@calcom/platform-utils": "*" "@calcom/prisma": "*" @@ -3558,7 +3558,17 @@ __metadata: languageName: unknown linkType: soft -"@calcom/platform-libraries@npm:@calcom/platform-libraries@9.9.9, @calcom/platform-libraries@workspace:packages/platform/libraries": +"@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: ce7beda30e629e87d560386bf1f117280ec3466ba7dfa2089de79c2d03c46d24ee3a5388a63974ba084b6624e863c2feb5e02f42ef08c72daefc7c51e771d5f8 + languageName: node + linkType: hard + +"@calcom/platform-libraries@workspace:packages/platform/libraries": version: 0.0.0-use.local resolution: "@calcom/platform-libraries@workspace:packages/platform/libraries" dependencies: