Download OpenAPI specification:Download
TidyCal's REST API provides a handful of endpoints which can be used to get information about your account and bookings. It uses conventional OAuth 2.0 protocol for authentication.
Create a personal access token at https://tidycal.com/integrations/oauth. Once created, it can be used to authenticate requests by passing it in the Authorization header.
Authorization: Bearer {TOKEN}
If you're building a custom integration to TidyCal which requires users to authenticate in order to get access tokens to make API requests on their behalf, you'll need to create an OAuth 2.0 client. This is easy to do from the "OAuth Apps" settings page found here https://tidycal.com/integrations/oauth
Using the authorization_code grant type to authenticate users using OAuth 2.0 to retrieve an access token is fairly conventional, more information on that process can be found here: https://www.oauth.com/oauth2-servers/server-side-apps/authorization-code/
{- "name": "John Doe",
- "email": "john@doe.com",
- "lifetime_pro_at": "2022-01-01T00:00:00Z",
- "vanity_path": "johndoe",
- "language": "en",
- "profile_picture_url": "https://www.gravatar.com/avatar/202446b468bec26847368d8a214b80c9?d=blank&s=200",
- "currency_symbol": "$"
}Get a list of bookings.
| starts_at | date Get bookings starting from a specific date. |
| ends_at | date Get bookings ending before a specific date. |
| cancelled | boolean Get only cancelled bookings. |
| page | number Page number. |
| include_teams | boolean Include team bookings. |
{- "data": [
- {
- "id": 1,
- "contact_id": 1,
- "booking_type_id": 1,
- "starts_at": "2022-01-01T00:00:00Z",
- "ends_at": "2022-02-01T00:00:00Z",
- "cancelled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "timezone": "America/Los_Angeles",
- "meeting_id": "fw44lkj48fks",
- "questions": [
- {
- "id": 1,
- "booking_id": 1,
- "question": "What is your favorite color?",
- "answer": "Blue",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
], - "contact": {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "phone_number": "+1234567890",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}, - "payment": {
- "id": 1,
- "payment_id": "pi_1234567890",
- "booking_id": 1,
- "amount": 1,
- "currency": "USD",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
}
]
}Get a booking by ID.
| booking required | integer The ID of the booking. |
{- "id": 1,
- "contact_id": 1,
- "booking_type_id": 1,
- "starts_at": "2022-01-01T00:00:00Z",
- "ends_at": "2022-02-01T00:00:00Z",
- "cancelled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "timezone": "America/Los_Angeles",
- "meeting_id": "fw44lkj48fks",
- "questions": [
- {
- "id": 1,
- "booking_id": 1,
- "question": "What is your favorite color?",
- "answer": "Blue",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
], - "contact": {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "phone_number": "+1234567890",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}, - "payment": {
- "id": 1,
- "payment_id": "pi_1234567890",
- "booking_id": 1,
- "amount": 1,
- "currency": "USD",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
}Cancel a booking by ID.
| booking required | integer The ID of the booking to cancel. |
| reason | string Optional reason for cancellation |
{- "reason": "Client requested cancellation"
}{- "id": 1,
- "contact_id": 1,
- "booking_type_id": 1,
- "starts_at": "2022-01-01T00:00:00Z",
- "ends_at": "2022-02-01T00:00:00Z",
- "cancelled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "timezone": "America/Los_Angeles",
- "meeting_id": "fw44lkj48fks",
- "questions": [
- {
- "id": 1,
- "booking_id": 1,
- "question": "What is your favorite color?",
- "answer": "Blue",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
], - "contact": {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "phone_number": "+1234567890",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}, - "payment": {
- "id": 1,
- "payment_id": "pi_1234567890",
- "booking_id": 1,
- "amount": 1,
- "currency": "USD",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
}{- "data": [
- {
- "id": 1,
- "user_id": 1,
- "title": "15 Minute Meeting",
- "duration_minutes": 15,
- "padding_minutes": 10,
- "disabled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "url_slug": "15-minute-meeting",
- "description": "Book a meeting with me for 15 minutes!",
- "price": 10,
- "private": false,
- "latest_availability_days": 60,
- "booking_threshold_minutes": 120,
- "max_bookings": 1,
}
]
}Create a new booking type.
| title required | string <= 191 characters |
| description required | string <html> |
| duration_minutes required | integer >= 1 |
| url_slug required | string <= 191 characters |
| padding_minutes | integer >= 0 Default: 0 |
| latest_availability_days | integer [ 0 .. 36500 ] Default: 60 |
| private | boolean Default: false |
| max_bookings | integer >= 1 Default: 1 |
| max_guest_invites_per_booker | integer [ 0 .. 10 ] Default: 0 |
| display_seats_remaining | boolean Default: false |
| booking_availability_interval_minutes | integer [ 15 .. 1440 ] Default: 15 |
| redirect_url | string or null <= 60000 characters |
| approval_required | boolean or null |
| booking_type_category_id | integer or null |
{- "title": "30 Minute Meeting",
- "description": "Book a 30 minute meeting with me",
- "duration_minutes": 30,
- "url_slug": "30-minute-meeting",
- "padding_minutes": 15,
- "latest_availability_days": 90,
- "private": false,
- "max_bookings": 1,
- "max_guest_invites_per_booker": 0,
- "display_seats_remaining": false,
- "booking_availability_interval_minutes": 30,
- "approval_required": false,
- "booking_type_category_id": 1
}{- "data": {
- "id": 1,
- "user_id": 1,
- "title": "15 Minute Meeting",
- "duration_minutes": 15,
- "padding_minutes": 10,
- "disabled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "url_slug": "15-minute-meeting",
- "description": "Book a meeting with me for 15 minutes!",
- "price": 10,
- "private": false,
- "latest_availability_days": 60,
- "booking_threshold_minutes": 120,
- "max_bookings": 1,
}
}Get a list of available timeslots for a specific booking type.
| bookingType required | integer The ID of the booking type. |
| starts_at required | string <date-time> Start date to get timeslots from (UTC). |
| ends_at required | string <date-time> End date to get timeslots until (UTC). |
{- "data": [
- {
- "starts_at": "2024-03-20T10:00:00Z",
- "ends_at": "2024-03-20T10:30:00Z",
- "available_bookings": 1
}
]
}Create a new booking for a specific booking type.
| bookingType required | integer The ID of the booking type. |
| starts_at required | string <date-time> The start time of the booking in UTC |
| name required | string <= 191 characters Name of the person making the booking |
| email required | string <email> <= 191 characters Email of the person making the booking |
| timezone required | string <= 191 characters The timezone of the booking |
Array of objects Answers to booking type questions |
{- "starts_at": "2024-03-20T10:00:00Z",
- "name": "John Doe",
- "email": "john@example.com",
- "timezone": "America/Los_Angeles",
- "booking_questions": [
- {
- "booking_type_question_id": 1,
- "answer": "My answer"
}
]
}{- "data": {
- "id": 1,
- "contact_id": 1,
- "booking_type_id": 1,
- "starts_at": "2022-01-01T00:00:00Z",
- "ends_at": "2022-02-01T00:00:00Z",
- "cancelled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "timezone": "America/Los_Angeles",
- "meeting_id": "fw44lkj48fks",
- "questions": [
- {
- "id": 1,
- "booking_id": 1,
- "question": "What is your favorite color?",
- "answer": "Blue",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
], - "contact": {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "phone_number": "+1234567890",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}, - "payment": {
- "id": 1,
- "payment_id": "pi_1234567890",
- "booking_id": 1,
- "amount": 1,
- "currency": "USD",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
}
}{- "data": [
- {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "phone_number": "+1234567890",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}
]
}Create a new contact.
| name required | string |
| email required | string <email> |
| timezone | string |
{- "name": "John Doe",
- "email": "john@example.com",
- "timezone": "America/Los_Angeles"
}{- "data": {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "phone_number": "+1234567890",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}
}Get a list of bookings for a specific team.
| team required | integer The ID of the team. |
| page | number Page number. |
| start_date | string <date> Get bookings starting from a specific date. |
| end_date | string <date> Get bookings ending before a specific date. |
string <email> Get bookings for a specific email address. | |
| host_id | integer Get bookings for a specific user ID. |
{- "data": [
- {
- "id": 1,
- "contact_id": 1,
- "booking_type_id": 1,
- "starts_at": "2022-01-01T00:00:00Z",
- "ends_at": "2022-02-01T00:00:00Z",
- "cancelled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "timezone": "America/Los_Angeles",
- "meeting_id": "fw44lkj48fks",
- "questions": [
- {
- "id": 1,
- "booking_id": 1,
- "question": "What is your favorite color?",
- "answer": "Blue",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
], - "contact": {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "phone_number": "+1234567890",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}, - "payment": {
- "id": 1,
- "payment_id": "pi_1234567890",
- "booking_id": 1,
- "amount": 1,
- "currency": "USD",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
}
]
}Get a list of users in a specific team.
| team required | integer The ID of the team. |
| page | number Page number. |
{- "data": [
- {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "created_at": "2024-01-01T00:00:00Z",
- "updated_at": "2024-01-01T00:00:00Z"
}
]
}Add a user to a team by sending an invitation email.
| team required | integer The ID of the team. |
| email required | string <email> Email address of the user to invite |
| role_name | string Enum: "admin" "user" Role name for the user in the team |
{- "email": "user@example.com",
- "role_name": "user"
}{- "message": "Invitation sent successfully",
- "team_user_id": 123
}Get a list of booking types for a specific team.
| team required | integer The ID of the team. |
| page | number Page number. |
{- "data": [
- {
- "id": 1,
- "user_id": 1,
- "title": "15 Minute Meeting",
- "duration_minutes": 15,
- "padding_minutes": 10,
- "disabled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "url_slug": "15-minute-meeting",
- "description": "Book a meeting with me for 15 minutes!",
- "price": 10,
- "private": false,
- "latest_availability_days": 60,
- "booking_threshold_minutes": 120,
- "max_bookings": 1,
}
]
}Create a new booking type for a specific team.
| team required | integer The ID of the team. |
| title required | string <= 191 characters |
| description required | string <html> |
| duration_minutes required | integer >= 1 |
| url_slug required | string <= 191 characters |
| padding_minutes | integer >= 0 Default: 0 |
| latest_availability_days | integer [ 0 .. 36500 ] Default: 60 |
| private | boolean Default: false |
| max_bookings | integer >= 1 Default: 1 |
| max_guest_invites_per_booker | integer [ 0 .. 10 ] Default: 0 |
| display_seats_remaining | boolean Default: false |
| booking_availability_interval_minutes | integer [ 15 .. 1440 ] Default: 15 |
| redirect_url | string or null <= 60000 characters |
| approval_required | boolean or null |
| booking_type_category_id | integer or null |
{- "title": "30 Minute Meeting",
- "description": "Book a 30 minute meeting with me",
- "duration_minutes": 30,
- "url_slug": "30-minute-meeting",
- "padding_minutes": 15,
- "latest_availability_days": 90,
- "private": false,
- "max_bookings": 1,
- "max_guest_invites_per_booker": 0,
- "display_seats_remaining": false,
- "booking_availability_interval_minutes": 30,
- "approval_required": false,
- "booking_type_category_id": 1
}{- "data": {
- "id": 1,
- "user_id": 1,
- "title": "15 Minute Meeting",
- "duration_minutes": 15,
- "padding_minutes": 10,
- "disabled_at": "2022-02-01T00:00:00Z",
- "created_at": "2022-02-01T00:00:00Z",
- "updated_at": "2022-02-01T00:00:00Z",
- "url_slug": "15-minute-meeting",
- "description": "Book a meeting with me for 15 minutes!",
- "price": 10,
- "private": false,
- "latest_availability_days": 60,
- "booking_threshold_minutes": 120,
- "max_bookings": 1,
}
}