Calendar API for Advanced Scheduling & Integration Solutions
New

Sync, filter, and extract data from your user’s inbox with Nylas ExtractAI

Learn more
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.

Icon
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.

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).

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.
Customers

Optimizing scheduling chaos for leading companies across the globe

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

Crunchbase increases sales productivity and bookings with Nylas

“Adding bi-directional email sync provides our users with a way to increase their productivity within the Crunchbase platform [while encouraging upsells to a new pricing tier with premium features]”

Monika Abraham,

Monika Abraham,

Product Ops Manager @ Crunchbase

1 new

pricing tier added to increase revenue

$75k

saved from Google security review

Read the full story

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

Talentreef accelerates time-to-hire with the Nylas Calendar API

“There’s no longer any disconnect with users copying and pasting information for scheduling or sending out manual emails. This has made a huge difference in response times.”

Alexander Plumb,

Alexander Plumb,

Sr. Product Manager @ TalentReef

3 days

reduced in time-to-hire

2x

faster to build calendar features, with 1/2 the resources

Read the full story

CatchApp increases sales conversion and increases user base

“For us, the main pain point that Nylas addressed was providing [calendar integration] in a consistent manner across multiple platforms and providers.”

Oliver Lamming,

Oliver Lamming,

CTO of CatchApp

66%

growth in user base within three months

400%

increase in sales conversion

Read the full story
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

Start building the future

Get your API key and connect up to 5 accounts for free.

Image