REGISTER NOW: Supercharge Your Cloud Integrations and Watch Our Webinar Recording
Calendar API

Fully-featured scheduling
for any calendar service embedded in your app

Use our general Calendar API to quickly build integrations to many calendar services like Google, Microsoft Outlook, Exchange Server, and CalDAV.

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 a Calendar API abstraction layer that enables you to work with one common API in the place of many. We also take care of all the underlying calendar service API maintenance and updates, so you don’t have to.

Explore our API documentation
Google Calendar
Outlook Calendar
CalDAV
Exchange Server
Office 365
iCloud

Everything you need to build and deliver powerful integrations

Unified Core Functionality

Authentication (OAuth 2.0), token management, full CRUD functionality, Search

Events and Webhooks

Live monitoring event endpoints gives you the ability to track real-time activity and changes.

Team API

Get admin access to an entire organization’s data, users, and groups with our Team API endpoints.

Unified Data Models

We unify objects into a single representation for each category of services.

Raw Data

Obtain data in its original format if you need access to unique objects that do not appear in our Unified Data Models.

Pass-through API

Access the full functionality of supported services with default values correctly added to your requests.

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. White label and customize the branding to create a streamlined booking experience right within your app.

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

account = Account(token=BEARER_TOKEN)

# Retrieve a list of all the calendars
response = account.get('cal/calendars')

# Retrieve the primary calendar's events
response = account.get('cal/calendars/primary/events')
              
            
              
                  
const account = new Kloudless.sdk.Account({ token: BEARER_TOKEN });

// Retrieve a list of all the calendars
let response = await account.get({ url: `cal/calendars` });

// Retrieve the primary calendar's events
response = await account.get({ url: 'cal/calendars/primary/events' });
              
            
              
                  
import com.google.gson.JsonObject;
import com.kloudless.Account;
import com.kloudless.models.ResourceList;

Account account = new Account("YOUR BEARER TOKEN");

// Retrieve a list of all the calendars
ResourceList resourceList =
    (ResourceList) account.get("/cal/calendars");
JsonObject data = resourceList.getData();

// Retrieve the primary calendar's events
ResourceList primaryCalendarEvents =
    (ResourceList) account.get("/cal/calendars/primary/events");
JsonObject eventData = primaryCalendarEvents.getData();
              
            
              
                  # Find available time slots for a particular calendar

curl -X POST -H 'Content-Type: application/json' \
     -H "Authorization: Bearer $BEARER_TOKEN" \
     --data '{
        "calendars": ["'"$CALENDAR_ID"'"],
        "meeting_duration": "PT1H",
        "time_windows": [
            {
                "start": "2019-08-20T08:00:00-08:00",
                "end": "2019-08-20T12:00:00-08:00"
            }
        ],
        "time_slot_increment": 15
     }' \
     "https://api.kloudless.com/v1/accounts/me/cal/availability" \
     | jq ".time_windows"
              
            
              
                  
from kloudless import Account

# Find available time slots for a particular calendar
account = Account(token=BEARER_TOKEN)

data = {
    "calendars": [CALENDAR_ID],
    "meeting_duration": "PT1H",
    "constraints": {
        "time_windows": [
            {
                "start": "2019-08-20T08:00:00-08:00",
                "end": "2019-08-20T12:00:00-08:00"
            }
        ]
    },
    "time_slot_increment": "15"
}
response = account.post("cal/availability", json=data)
time_slots = response.data['time_windows']
              
            
              
                  
const account = new Kloudless.sdk.Account({ token: BEARER_TOKEN });

// Find available time slots for a particular calendar
const response = await account.post({
    url: `cal/availability`,
    data: {
      calendars: [CALENDAR_ID],
      meeting_duration: 'PT1H',
      time_windows: [
        {
          start: '2019-08-20T08:00:00-08:00',
          end: '2019-08-20T12:00:00-08:00'
        }
      ],
      time_slot_increment: 15
    },
  });
const time_slots = response.data.time_windows;
              
            
              
                  
import com.google.gson.JsonElement;
import com.kloudless.Account;
import com.kloudless.models.ResponseJson;

Account account = new Account("YOUR BEARER TOKEN");

// Find available time slots for a particular calendar
Map<String, Object> avRange = new HashMap<>();
avRange.put("start", "2019-08-20T08:00:00-08:00");
avRange.put("end", "2019-08-20T12:00:00-08:00");

List<Object> rangeList = new ArrayList<>();
rangeList.add(avRange);

Map<String, Object> timeWindows = new HashMap<String, Object>();
timeWindows.put("time_windows", rangeList);

Map<String, Object> httpContent = new HashMap<String, Object>();
httpContent.put("calendars", Arrays.asList("CALENDAR_ID"));
httpContent.put("meeting_duration", "PT1H");
httpContent.put("constraints", timeWindows);
httpContent.put("time_slot_increment", "15");

ResponseJson response = 
    (ResponseJson) account.post("/cal/availability", httpContent);
JsonElement time_slots = response.getData().get("time_windows");
              
            
              
                  # Retrieve the current cursor
CURSOR=$(curl -H "Authorization: Bearer $BEARER_TOKEN" \
              "https://api.kloudless.com/v1/accounts/me/activity" \
              | jq ".cursor")

# Once the user makes a change, retrieve new activity
curl -H "Authorization: Bearer $BEARER_TOKEN" \
        "https://api.kloudless.com/v1/accounts/me/activity?cursor=$CURSOR"
              
            
              
                  
from kloudless import Account

account = Account(token=BEARER_TOKEN)

# Retrieve the current cursor
response = account.get('activity')
cursor = response.data['cursor']

# Once the user makes a change, retrieve new activity
response = account.get('activity', params={"cursor": cursor})
              
            
              
                  
const account = new Kloudless.sdk.Account({ token: BEARER_TOKEN });

// Retrieve the current cursor
let response = await account.get({ url: 'activity' });
let cursor = response.data.cursor;

// Once the user makes a change, retrieve new activity
response = await account.get({
  url: 'activity',
  params: { cursor }
});

              
            
              
                  
import com.google.gson.JsonObject;
import com.kloudless.Account;
import com.kloudless.models.ResourceList;

Account account = new Account("YOUR BEARER TOKEN");

// Retrieve the current cursor
ResourceList response = 
    (ResourceList) account.get("/activity");
JsonObject data = response.getData();
String cursor = response.getCursor();

// Once the user makes a change, retrieve new activity
response =
    (ResourceList) account.get("/activity?cursor=" + cursor);
data = response.getData();
              
            

One calendar API, all the features you need.

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

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

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

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