Calendar API for Advanced Scheduling & Integration Solutions
New

2025 Report: The Future of Meeting Recordings for Product Roadmaps

Read the full report
Icon Calendar API

Power calendars with customizable scheduling in your app

The Nylas Calendar API makes it easy for developers to securely build custom scheduling solutions 10x faster than building from scratch while giving control and flexibility to configure workflows and leverage out-of-the-box features.

Introducing the Nylas Calendar API

Simplify calendar integration and maintenance with real-time scheduling features

The Nylas Calendar API connects to your users’ calendars with reliable performance and consistent functionality, saving months of development time.

Availability Calendars Conferencing Events Free/busy schedules Participants Recurrence Reminders Scheduled send RSVPs
Image
Image

One API for every major provider

Eliminate the need to integrate with and maintain multiple unique integrations.

Image

Personalized scheduling workflows

Easily configure scheduling rules and workflows unique to your business use case.

Image

Maximum control and security

Adhere to the highest security and compliance standards without sacrificing control.

Customers

Optimizing scheduling chaos for leading companies across the globe

250,000 developers and counting trust Nylas to power scheduling experiences their customers love.

Choicely builds scheduling features to streamline manual casting process

“It’s not an exaggeration to say that Nylas helped us build our new casting features 10x faster. It took us less than a month to integrate email and calendar, allowing us to refocus our technical resources on building the most robust casting solution on the market.”

Tommy Eklund,

Tommy Eklund,

CTO @ Choicely

10x

faster to launch

<1

month to build integrations

Read the full story
For developers

Schedule meetings in minutes

With a few lines of code, build calendar CRUD capabilities and bi-directional sync.

See the docs

Node.js

Ruby

Python

Java

Curl

const events = await nylas.events.list({
identifier: 1,
queryParams: {
calendarId: 2
}
})
require 'nylas'
nylas = Nylas::Client.new(api_key: 'API_KEY')
query_params = { limit: 5 }
messages, _ = nylas.messages.list(identifier: '<GRANT_ID>', query_params: query_params)
messages.each {|message|
puts "[#{Time.at(message[:date]).strftime("%d/%m/%Y at %H:%M:%S")}] \
#{message[:subject]}"
}
events = nylas.events.list(
grant_id,
query_params={
"calendar_id": 1
}
)
import com.nylas.NylasClient;
import com.nylas.models.*;
import java.text.SimpleDateFormat;
public class ReadInbox {
public static void main(String[] args) throws NylasSdkTimeoutError, NylasApiError {
NylasClient nylas = new NylasClient.Builder("<API_KEY>").build();
ListMessagesQueryParams queryParams = new
ListMessagesQueryParams.Builder().limit(5).build();
ListResponse<Message> message = nylas.messages().list("<GRANT_ID>", queryParams);
for(Message email : message.getData()) {
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
format(new java.util.Date((email.getDate() * 1000L)));
System.out.println("[" + date + "] | " + email.getSubject());
}
}
}
--url https://api.us.nylas.com/v3/grants/<GRANT_ID>/events
--header 'Accept: application/json' \
--header 'Authorization: Bearer <API_KEY_OR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'

Node.js

Ruby

Python

Java

Curl

const draft = new Draft.default(nylas, {
subject: "With Love, from Nylas",
body: "This email was sent using the Nylas email API.",
to: [{ name: "Nyla", email: "nyla@nylas.com" }],
});
const message = await draft.send();
require 'nylas'
nylas = Nylas::Client.new(api_key: "<API_KEY>")
# Call a list of calendars
calendars, _request_ids = nylas.calendars.list(identifier: "<GRANT_ID>", query_params: {limit: 5})
calendars.each {|calendar|
puts calendar
}
draft = nylas.drafts.create()
draft.subject = 'With Love, from Nylas'
draft.body = 'This email was sent using the Nylas email API.'
draft.to = [{'name': 'Nyla', 'email': 'nyla@nylas.com')}]
message = draft.send()
import com.nylas.NylasClient;
import com.nylas.models.*;
import java.util.List;
public class read_calendars {
public static void main(String[] args) throws NylasSdkTimeoutError, NylasApiError {
NylasClient nylas = new NylasClient.Builder("<API_KEY>").build();
ListCalendersQueryParams listCalendersQueryParams = new
ListCalendersQueryParams.Builder().limit(5).build();
List<Calendar> calendars = nylas.calendars().list(dotenv.get("CALENDAR_ID"),
listCalendersQueryParams).getData();
for (Calendar calendar : calendars) {
System.out.println(calendar);
}
}
}
curl --request POST \
--url https://api.nylas.com/send \
--data '{
"subject": "From Nylas",
"to": [
{
"email": "nyla@nylas.com",
"name": "Nyla"
}
],
"from": [
{
"name": "Developer Relations",
"email": "devrel@nylas.com"
}
],
"body": "This email was sent using the Nylas email API.",
}'

Node.js

Ruby

Python

Java

Curl

const contact = new Contact(nylas);
contact.givenName = 'Nyla'
contact.birthday = '2014-06-01'
contact.companyName = 'Nylas'
contact.jobTitle = 'Communications Platform'
contact.officeLocation = 'San Francisco'
contact.notes = 'Check out the Nylas Email, Calendar, and Contacts APIs'
contact.emailAddresses = [new EmailAddress({
type: 'work', email: 'nyla@nylas.com'
})];
contact.save();
require 'nylas'
nylas = Nylas::Client.new(
api_key: “<API_KEY
)
query_params = {
limit: 5
}
contacts, _ = nylas.contacts.list(identifier: ENV["GRANT_ID"], query_params: query_params)
contacts.each {|contact|
puts "Name: #{contact[:given_name]} #{contact[:surname]} | " \
"Email: #{contact[:emails][0][:email]} | ID: #{contact[:id]}"
}
contact = nylas.contacts.create()
contact.given_name = 'Nyla'
contact.office_location = 'San Francisco'
contact.company_name = 'Nylas'
contact.notes = 'Check out the Nylas Email, Calendar, and Contacts APIs'
contact.manager_name = 'Communications'
contact.job_title = 'Communications Platform'
contact.birthday = datetime(2014, 6, 1)
contact.emails['work'] = ['nyla@nylas.com']
contact.save()
import com.nylas.NylasClient;
import com.nylas.models.*;
public class ReadAllContacts {
public static void main(String[] args) throws
NylasSdkTimeoutError, NylasApiError {
NylasClient nylas = new NylasClient.Builder("<API_KEY>").build();
ListContactsQueryParams queryParams =
new ListContactsQueryParams.Builder().
limit(5).build();
ListResponse<Contact> contacts = nylas.contacts().list(dotenv.get("GRANT_ID"),
queryParams);
for(Contact contact : contacts.getData()){
assert contact.getEmails() != null;
System.out.printf("Name: %s | Email: %s | Id: %s%n",
contact.getGivenName(),
contact.getEmails().get(0).getEmail(),
contact.getId()
);
}
}
}
curl --request POST \
--url https://api.nylas.com/contacts \
--data '{
"birthday": "2014-06-01",
"company_name": "Nylas",
"emails": [
{
"email": "nyla@nylas.com",
"type": "work"
}
],
"given_name": "Nyla",
],
"job_title": "Nylas Mascot",
"phone_numbers": [
{
"number": "1 800 GO NYLAS",
"type": "business"
}
],
"web_pages": [
{
"type": "work",
"url": "nylas.com"
}
],
}'

Response

{
"request_id": "cbd60372-df33-41d3-b203-169ad5e3AAAA",
"data": [
{
"busy": true,
"calendar_id": "primary",
"conferencing": {
"details": {
"meeting_code": "ist-****-tcz",
"url": "https://meet.google.com/ist-****-tcz"
},
"provider": "Google Meet"
},
"created_at": 1701974804,
"creator": {
"email": "anna.molly@example.com",
"name": ""
},
"description": null,
"grant_id": "1e3288f6-124e-405d-a13a-635a2ee54eb2",
"hide_participants": false,
"html_link": "https://www.google.com/calendar/event?eid=NmE0dXIwabQAAAA",
"ical_uid": "6aaaaaaame8kpgcid6hvd0q@google.com",
"id": "6aaaaaaame8kpgcid6hvd",
"object": "event",
"organizer": {
"email": "anna.molly@example.com",
"name": ""
},
"participants": [
{
"email": "jenna.doe@example.com",
"status": "yes"
},
{
"email": "anna.molly@example.com",
"status": "yes"
}
],
"read_only": true,
"reminders": {
"overrides": null,
"use_default": true
},
"status": "confirmed",
"title": "Holiday check in",
"updated_at": 1701974915,
"when": {
"end_time": 1701978300,
"end_timezone": "America/Los_Angeles",
"object": "timespan",
"start_time": 1701977400,
"start_timezone": "America/Los_Angeles"
}
}
]
}
{
"type": "event.created2",
"data": {
"object": {
"busy": true,
"calendar_id": "mock-name%40nylas.com",
"created_at": 1234567890,
"description": "mock description",
"hide_participants": false,
"ical_uid": "mock_uids@google.com",
"id": "mock-data-id",
"object": "event",
"owner": "Mock Owner <mock_owner@example.com>",
"organizer": {
"name": "mock organizer name",
"email": "mock_email@example.com"
},
"participants": [
{
"email": "mockParticipantsA@example.com",
"name": "mockParticipantsA",
"status": "yes"
},
{
"email": "mockParticipantsB@example.comm",
"name": "mockParticipantsB",
"status": "noreply"
}
],
"read_only": false,
"reminders": null,
"status": "confirmed",
"title": "mock_title",
"updated_at": 1234567890,
"when": {
"start_time": 1234567890,
"start_timezone": "America/Edmonton",
"end_time": 1234567890,
"end_timezone": "America/Edmonton",
"object": "timespan"
}
}
}
}
{
"type": "event.created3",
"data": {
"object": {
"busy": true,
"calendar_id": "mock-name%40nylas.com",
"created_at": 1234567890,
"description": "mock description",
"hide_participants": false,
"ical_uid": "mock_uids@google.com",
"id": "mock-data-id",
"object": "event",
"owner": "Mock Owner <mock_owner@example.com>",
"organizer": {
"name": "mock organizer name",
"email": "mock_email@example.com"
},
"participants": [
{
"email": "mockParticipantsA@example.com",
"name": "mockParticipantsA",
"status": "yes"
},
{
"email": "mockParticipantsB@example.comm",
"name": "mockParticipantsB",
"status": "noreply"
}
],
"read_only": false,
"reminders": null,
"status": "confirmed",
"title": "mock_title",
"updated_at": 1234567890,
"when": {
"start_time": 1234567890,
"start_timezone": "America/Edmonton",
"end_time": 1234567890,
"end_timezone": "America/Edmonton",
"object": "timespan"
}
}
}
}

Webhooks

Receive real-time notifications to monitor events and trigger automated workflows.

Sandbox

Experiment with our API with pre-configured settings in the Nylas Dashboard.

SDKs

Fast-track your integration with our Node.js, Ruby, Python, Java and Kotlin SDKs.

Features

Streamline scheduling within your application

Maximize event management and scheduling efficiency to keep your users engaged in your app.

Image

Automated scheduling

Simplify complex scheduling with one-on-one, collective, round robin, and group event types.

Image

Conferencing

Auto-create conferencing links for Microsoft Teams, Google Meet, and Zoom when users create events.

Image

Virtual calendars

It is a standalone calendar functionality that protects sensitive data as it does not need to connect to a 3rd party calendar provider (e.g. Google, Exchange, O365).

Everyhing you need for Calendar

Sandbox

Test all Nylas functionality for free.
FREE

5 connected accounts

Get Started

Calendar Only

Just the calendar. No extra baggage.
$1/ca/month

Starts at $10/month for 5 accounts, then listed rate applies.

Get started

Full Platform

Everything you need to build your comm stack.
$1.50/ca/month

Starts at $15/month for 5 accounts, then listed rate applies.

Get started

Custom

Get everything you need. Start scaling.
Let’s Talk!

Volume pricing discounts

Contact sales
Demo

Watch our calendar API in action

Explore this interactive demo on how to connect a calendar, approve access, and instantly view events inside your app. Watch each API call in real time to see how easily you can bring secure, seamless scheduling to your product.

Moible Background
Built on the Calendar API

Deliver custom, front-end scheduling experiences with the Nylas Scheduler

Access an out-of-the-box scheduling solution or embed modular, customizable, and native scheduling components for your end users.

Explore the Nylas Scheduler:
  • Modular design: Combine and interchange web components to use only what you need.
  • End-to-end customization: Tailor pre- and post- booking workflows to your users and their use cases.
  • Native experience: Deliver a front-end experience that reflects your app’s design.
Use cases

End-to-end scheduling saves users time without the back-and-forth

Simplify calendar management and scheduling by integrating real-time availability access in your application.

Calendar management

Recreate booking and scheduling functionality with your users’ calendars in your application.

Explore calendar management

Scheduling automation

Automate scheduling tasks and workflows, such as coordinating availability and sending event reminders.

Explore scheduling automation