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. |
{- "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": { },
- "contact": {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-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": { },
- "contact": {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}
}
}
{- "data": [
- {
- "id": 1,
- "name": "John Doe",
- "email": "john@doe.com",
- "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",
- "ip_address": "127.0.0.1",
- "timezone": "America/New_York",
- "created_at": "2022-01-01T00:00:00Z",
- "updated_at": "2022-01-01T00:00:00Z"
}
}