# create_appointment_type Behavior, inputs, outputs and permissions for create_appointment_type. Source: https://docs.getridian.com/developers/tools/create_appointment_type/ Language: en Reviewed: 2026-10-06 This reference is generated from the published tool contract. ## Behavior and boundaries Creates a new appointment type (a booking page) as a draft, e.g. "Create a 30-minute intro call on Zoom". It uses your connected calendars and your working hours, like a new appointment type in Ridian. Drafts cannot be booked: the user activates it in Ridian at console_url after checking it. Returns the planned booking page URL, which works once it is active; it is null until the workspace has a public name. Confirm title, duration and location with the user first. ## Permissions Granted scopes, accounts, calendars and visibility rules limit access. Workspace administrators do not automatically gain access to other users’ accounts. `bookings:write` [Consent and boundaries](https://docs.getridian.com/developers/authentication/) ## Input ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "title": { "type": "string", "minLength": 1, "maxLength": 120, "description": "Name bookers see, e.g. \"Intro call\"." }, "description": { "description": "Shown on the booking page.", "type": "string", "maxLength": 5000 }, "duration_minutes": { "description": "Default 30.", "type": "integer", "minimum": 5, "maximum": 720 }, "location": { "description": "Default none. google_meet needs a Google calendar, microsoft_teams a Microsoft calendar, zoom a Zoom connection in Ridian.", "type": "object", "properties": { "type": { "type": "string", "enum": [ "none", "address", "phone", "link", "google_meet", "microsoft_teams", "zoom" ] }, "value": { "description": "Required for address, phone and link (https).", "type": "string", "maxLength": 500 } }, "required": [ "type" ], "additionalProperties": false }, "questions": { "description": "Extra booking form questions. Name and email are always asked.", "maxItems": 20, "type": "array", "items": { "type": "object", "properties": { "label": { "type": "string", "minLength": 1, "maxLength": 200 }, "type": { "type": "string", "enum": [ "text", "multiline", "phone", "choice" ] }, "required": { "type": "boolean" }, "options": { "description": "Only for choice.", "minItems": 1, "maxItems": 30, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 200 } } }, "required": [ "label", "type", "required" ], "additionalProperties": false } }, "confirmation": { "description": "manual: the host accepts each request first. Default instant.", "type": "string", "enum": [ "instant", "manual" ] } }, "required": [ "title" ], "additionalProperties": false } ``` ## Output ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "appointment_type": { "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": {} }, "console_url": { "type": "string" }, "next_step": { "type": "string" } }, "required": [ "appointment_type", "console_url", "next_step" ], "additionalProperties": false } ``` ## Errors and retries Check the tool result for errors. Do not blindly retry writes after a timeout. Check the current resource or send status first. [Error handling](https://docs.getridian.com/developers/errors/)