Calendar API

Fully-featured scheduling
for any calendar in your application

Quickly build integrations to many calendar services like Google, Microsoft Outlook, Exchange Server, and CalDAV with our Unified Calendar API.

big yellow left quotation mark

As VP of Software Engineering, it came down to time to market. We were able to get the functionality from Kloudless that would have taken my engineers more than a year to build, and it allowed us to stay focused on our core product.

customer image
Mel Tingey

VP of Software Engineering at OC Tanner

Write code once and reuse it for any service

Kloudless is an abstraction layer on top of the popular calendar services, so you can work with one API, not five. We take care of all the Connector maintenance and updates, so you don’t have to.

Explore our API documentation
Google Calendar
Outlook Calendar
CalDAV
Exchange Server
Office 365
iCloud
              
                  # Visit this URL for the bearer token:
# https://api.kloudless.com/v1/oauth?scope=any.storage&client_id=d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5&response_type=token&state=13373

$BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"

# Retrieve a list of all the calendars
curl "https://api.kloudless.com/v1/accounts/me/cal/calendars" \
    -H "Authorization: Bearer $BEARER_TOKEN"

# Retrieve the metadata of the primary calendar
curl "https://api.kloudless.com/v1/accounts/me/cal/calendars/primary" \
    -H "Authorization: Bearer $BEARER_TOKEN"
              
            
              
                  import axios from 'axios';

// Access Token
const OAUTH_URL = "https://api.kloudless.com/v1/oauth?scope=any.storage" +
                  "&client_id=" +
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5" +
                  "&response_type=token&state=13373";

window.open(OAUTH_URL);

// Authorization

const BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"

let config = {
  headers: {
    Authorization: "Bearer " + BEARER_TOKEN,
  }
}

let LIST_CALENDARS_URL = "https://api.kloudless.com/v1/accounts/me/" +
                          "cal/calendars";
axios.get(LIST_CALENDARS_URL, {}, config)
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });

// Retrieve the metadata of the primary calendar
let CALENDAR_METADATA_URL = "https://api.kloudless.com/v1/accounts/me/" +
                             "cal/calendars/primary";
axios.get(CALENDAR_METADATA_URL, {}, config)
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });
              
            
              
                  
import webbrowser
import requests
import pprint

# Access Token
OAUTH_FLOW_URL = ("https://api.kloudless.com/v1/oauth?scope=any.storage"
                  "&client_id="
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5"
                  "&response_type=token&state=13373")
webbrowser.open(OAUTH_FLOW_URL)

# Authorization
BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
HEADERS = {
    "Authorization": "Bearer %s" % BEARER_TOKEN
}

# Retrieve a list of all the calendars

LIST_CALENDARS_URL = ("https://api.kloudless.com/v1/accounts/me/"
                      "cal/calendars")
response = requests.get(LIST_CALENDARS_URL, headers=HEADERS)

# Pretty Print response
if response.ok:
    data = response.json()
    for child in data['objects'][:5]:
        pprint.pprint(child)

# Retrieve the metadata of the primary calendar

CALENDAR_METADATA_URL = ("https://api.kloudless.com/v1/accounts/me/"
                         "cal/calendars/primary")
response = requests.get(CALENDAR_METADATA_URL, headers=HEADERS)

# Pretty Print response
if response.ok:
    data = response.json()
    pprint.pprint(data)

              
            
              
                  
# Retrieve access token
open "https://api.kloudless.com/v1/oauth/?&scope=any.storage&client_id=d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5&response_type=token&state=13373"

$BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"

# Find Availability
curl -H 'Authorization: Bearer $BEARER_TOKEN' \
    -H 'Content-Type: application/json' \
    -XPOST -d '{
        "calendars": ["fa2xvdWRsZXNzLnRlc3QudGltb3RoeUBnbWFpbC5jb20="],
        "meeting_duration": "PT1H",
        "constraints": {
            "time_windows": [{
                "start": "2017-05-20T08:00:00+07:00",
                "end": "2017-05-20T12:00:00+07:00"
            },{
                "start": "2017-05-21T08:00:00+07:00",
                "end": "2017-05-21T12:00:00+07:00"
            }]
        }
    }' \
    'https://api.kloudless.com/v1/accounts/me/cal/availability'
              
            
              
                  
import webbrowser
import requests
import pprint

# Access Token
OAUTH_FLOW_URL = ("https://api.kloudless.com/v1/oauth?scope=any.storage"
                  "&client_id="
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5"
                  "&response_type=token&state=13373")
webbrowser.open(OAUTH_FLOW_URL)

# Authorization
BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
HEADERS = {
    "Authorization": "Bearer %s" % BEARER_TOKEN
}

# Find Availability
AVAILABILITY_URL = ("https://api.kloudless.com/v1/accounts/me/"
                    "cal/availability")
data = {
    "calendars": ["fa2xvdWRsZXNzLnRlc3QudGltb3RoeUBnbWFpbC5jb20="],
    "meeting_duration": "PT1H",
    "constraints": {
        "time_windows": [{
            "start": "2017-05-20T08:00:00+07:00",
            "end": "2017-05-20T12:00:00+07:00"
        },{
            "start": "2017-05-21T08:00:00+07:00",
            "end": "2017-05-21T12:00:00+07:00"
        }]
    }
}

response = requests.post(AVAILABILITY_URL, data=data, headers=HEADERS)

# Pretty Print response
if response.ok:
    data = response.json()
    pprint.pprint(data)
              
            
              
                  
# Retrieve access token
open "https://api.kloudless.com/v1/oauth/?&scope=any.storage&client_id=d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5&response_type=token&state=13373"

$BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"

## Retrieve the latest cursor
curl -H 'Authorization: Bearer $BEARER_TOKEN' \
    'https://api.kloudless.com/v1/accounts/me/events/latest'

## TODO: It would be best to perform some actions, so that
## there will be events to retrieve

## Retrieve the latest events using the latest cursor
curl -H 'Authorization: Bearer $BEARER_TOKEN' \
    'https://api.kloudless.com/v1/accounts/me/events?cursor=$CURSOR'
              
            
              
                  
import webbrowser
import requests
import pprint

# Access Token
OAUTH_FLOW_URL = ("https://api.kloudless.com/v1/oauth?scope=any.storage"
                  "&client_id="
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5"
                  "&response_type=token&state=13373")
webbrowser.open(OAUTH_FLOW_URL)

# Authorization
BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
HEADERS = {
    "Authorization": "Bearer %s" % BEARER_TOKEN
}

## Retrieve the latest cursor
CURSOR_URL = ("https://api.kloudless.com/v1/accounts/me/"
              "events/latest")
response = requests.get(CURSOR_URL, headers=HEADERS)

# Pretty Print response
if response.ok:
    data = response.json()
    pprint.pprint(data)

## TODO: It would be best to perform some actions, so that
## there will be events to retrieve

## Retrieve the latest events using the latest cursor
EVENTS_URL = ("https://api.kloudless.com/v1/accounts/me/"
              "events")
params = {"cursor": LATEST_CURSOR}

response = requests.get(EVENTS_URL, headers=HEADERS, params=params)
# Pretty Print response
if response.ok:
    data = response.json()
    for child in data['objects'][:5]:
        pprint.pprint(child)
              
            
              
                  
import axios from 'axios';

// Access Token
const OAUTH_URL = "https://api.kloudless.com/v1/oauth?scope=any.storage" +
                  "&client_id=" +
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5" +
                  "&response_type=token&state=13373";

window.open(OAUTH_URL);

// Authorization
const BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
let config = {
  headers: {
    Authorization: "Bearer " + BEARER_TOKEN,
  }
}

// Retrieve the latest cursor
let CURSOR_URL = "https://api.kloudless.com/v1/accounts/me/" +
                 "events/latest";
axios.get(CURSOR_URL, {}, config)
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });

// Retrieve the latest events using the latest cursor
let EVENTS_URL = "https://api.kloudless.com/v1/accounts/me/" +
                 "storage/search";
axios.get(SEARCH_URL, {cursor: LATEST_CURSOR}, config)
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });
              
            

Built by developers, for developers

All the calendar features you need from CRUD to real-time webhooks. Here are some example use cases.

Scheduling

Book events on any calendar

Availability

Obtain a user’s availability in real time

Sync

Sync events from one calendar to another

View more code samples

Plug in our Meeting
Scheduler to get started even faster

The Kloudless Meeting Scheduler is an open source, JavaScript library that enables end user scheduling functionality for any calendar service. Customize the product to create a streamlined booking experience right within your app.

Supporting 1,100+ customers in 150+ countries, O.C. Tanner uses Kloudless’ Unified Calendar API to streamline intercompany meeting scheduling and empower positive ways to build personal connections within a company. With Kloudless, O.C. Tanner has saved over 6 months of development time and over $75,000 a year.

blackboard title copy

Deployment Options

Take advantage of our flexible hosting options to run Kloudless according to your business’ requirements.

Cloud

Securely and reliably hosted by Kloudless — the quickest way to start building integrations.

  • Fully managed by Kloudless
  • Pre-configured connectors to get started quickly
  • 99.9% uptime
  • Bank-level encryption both in transit and at rest
Self-hosted

Kloudless Enterprise is a Docker container, AWS AMI, or OVA to deploy in private infrastructure.

  • Complete data privacy and regulatory compliance
  • On-prem connectors, such as Exchange and Oracle
  • Clustering for high availability
  • Custom SLAs including 24/7 support

Enough reading — let’s code.
Try our calendar API today.

Not a developer? Talk to an expert.

An arrow pointing to the 'get your api key' button