Reference
Source code
<?xml version="1.0" encoding="utf-8"?>
<ApiConfig Name="Google Calendar"
Desc="Read and write Google Calendar data effortlessly. Integrate, manage, and automate events, calendars, and availability — almost no coding required."
Slug="google-calendar-connector"
Id="4ebd0208-8328-5d69-8c44-ec50939c0967"
Logo="data:image/jpeg;base64,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"
Version="7"
EngineVersion="20"
>
<VersionHistory>
<Change Ver="7" Date="2026-01-26" Type="New">Added support for pagination in List Calendars endpoint.</Change>
<Change Ver="7" Date="2026-01-26" Type="New">Added support for supplying attendees, attachments, conferenceData, reminders.overrides as raw array of emails (Previously it was encoded , throwing error).</Change>
<Change Ver="7" Date="2026-01-26" Type="New">Added new parameter SendUpdates for create_event and update_event to send notification to all, none, externalOnly.</Change>
<Change Ver="7" Date="2026-01-26" Type="New">Added many new columns in list_events and create_event, update_event endpoints.</Change>
<Change Ver="7" Date="2026-01-26" Type="New">Added UserId parameter for list_calendar endpoint (Useful for Service Account Authentication: which can allow domain wide calendar access for any User by email ID.</Change>
<Change Ver="7" Date="2026-01-26" Type="New">Added new columns (StartsOn, EndsOn, Location, Recurrence, ICalUID, EventType, ColorId, Visibility, Transparency, Sequence, Attachments, ConferenceData, Reminders) to get_event and list_events endpoints.</Change>
<Change Ver="7" Date="2026-01-26" Type="New">Added new parameters (Start Time, End Time, Show Deleted, Single Events, Max Results, Order By) to list_events endpoint for enhanced filtering and control.</Change>
<Change Ver="7" Date="2026-01-26" Type="New">[BREAKING] Use new ZappySys app when UseCustomApp=False (Old app was blocked for many users).</Change>
<Change Ver="6" Date="2025-03-04" Type="New">Added support for JSON Key file in Service Account authentication.</Change>
<Change Ver="6" Date="2025-01-28" Type="New">Added ImpersonateAs property for Service Account authentication (Requires Domain-wide delegation ON and needs Google Workspace account)</Change>
<Change Ver="6" Date="2025-01-28" Type="New">Added images in User Account and Service Account authentication instructions</Change>
<Change Date="2024-06-05" Type="New">Added Redirect URL property to support Web Application credentials (visible when show advanced option checked)</Change>
<Change Date="2022-10-13" Type="Modified">Added retry logic on error code 429 (Too many requests).</Change>
<Change Date="2021-11-26">Initial version</Change>
</VersionHistory>
<ServiceUrls>
<ServiceUrl Name="Google Calendar API v3" Url="https://www.googleapis.com/calendar/v3/" />
</ServiceUrls>
<Auths>
<Auth Name="OAuth"
Label="User Account"
Desc="User accounts represent a developer, administrator, or any other person who interacts with Google APIs and services. User accounts are managed as Google Accounts, either with Google Workspace or Cloud Identity. They can also be user accounts that are managed by a third-party identity provider and federated with Workforce Identity Federation."
HelpLink="https://cloud.google.com/docs/authentication#user-accounts"
Type="OAuth"
ConnStr="Provider=GoogleCalendar;ScopeSeparator={space};"
TestEndPoint="list_calendars">
<Params>
<Param Name="UseCustomApp" Value="True" Required="True" Hidden="False" Desc="Use your own app credentials or inbuilt app provided by ZappySys for ease of use. If you choose UseCustomApp=true then make sure to obtain your own ClientId and Secret using steps provided (Click [Steps to Configure] link found next to Authentication Type dropdown)" />
<Param Name="ClientId" VisibleIf="UseCustomApp" RequiredIf="UseCustomApp"/>
<Param Name="ClientSecret" Secret="True" VisibleIf="UseCustomApp" RequiredIf="UseCustomApp" />
<Param Name="Scope" Value="https://www.googleapis.com/auth/calendar" />
<Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
<Param Name="RetryStatusCodeList" Value="403|429" Hidden="True" />
<Param Name="RetryCountMax" Value="5" Hidden="True" />
<Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />
<Param Name="ReturnUrl" Label="Redirect URL (Only for Web App)" Options=";https://zappysys.com/oauth/" VisibleIf="UseCustomApp" Desc="Only specifiy this if you have created Credential as Web Application rather than Desktop. In Desktop App you dont have to supply Return URL (its always localhost). When you keep this blank it uses default value http://localhost:[some_random_port_each_time] for redirect_url)" />
</Params>
<Notes>
<![CDATA[
<p>
Follow these steps on how to create Client Credentials (User Account principle) to authenticate and access Google Calendar API in SSIS package or ODBC data source:
</p>
<div class="alert alert-warning">
<strong>WARNING</strong>:
If you are planning to automate processes, we recommend that you use a <em>Service Account</em> authentication method.
In case, you still need to use <em>User Account</em>, then make sure you use a system/generic account (e.g. <code>automation@my-company.com</code>).
When you use a personal account which is tied to a specific employee profile and that employee leaves the company,
the token may become invalid and any automated processes using that token will start to fail.
</div>
<h3>Step-1: Create project</h3>
<p>
This step is optional, if you already have a project in Google Cloud and can use it.
However, if you don't, proceed with these simple steps to create one:
</p>
<ol>
<li>
<p>
First of all, go to <a target="_blank" href="https://console.developers.google.com/">Google API Console</a>.
</p>
</li>
<li>
<p>
Then click <strong>Select a project</strong> button and then click <strong>NEW PROJECT</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/start-creating-new-project-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start creating a new project in Google Cloud"
title="Starting creating a new project in Google Cloud"
width="1000"
height="340" />
</li>
<li>
<p>
Name your project and click <strong>CREATE</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/create-new-project-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Create a new project in Google Cloud"
title="Creating a new project in Google Cloud"
width="680"
height="360" />
</li>
<li>
<p>
Wait until the project is created:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/wait-until-project-is-created-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Wait until project is created in Google Cloud"
title="Waiting until project is created in Google Cloud"
width="640"
height="390" />
</li>
<li>
Done! Let's proceed to the next step.
</li>
</ol>
<h3>Step-2: Enable Google Calendar API</h3>
<p>
In this step we will enable Google Calendar API:
</p>
<ol>
<li>
<p>
Select your project on the top bar:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/select-project-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Select project in Google Cloud"
title="Selecting project in Google Cloud"
width="1000"
height="400" />
</li>
<li>
<p>
Then click the <strong>"hamburger"</strong> icon on the top left and access
<a target="_blank" href="https://console.cloud.google.com/apis/dashboard">APIs & Services</a>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/access-apis-and-services-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Access APIs and services in Google Cloud"
title="Accessing APIs and services in Google Cloud"
width="990"
height="440" />
</li>
<li>
<p>
Now let's enable several APIs by clicking <strong>ENABLE APIS AND SERVICES</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/enable-api-for-project-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Enable API for project in Google Cloud"
title="Enabling API for project in Google Cloud"
width="800"
height="300" />
</li>
<li>
<p>
In the search bar search for <code>calendar</code> and then locate and select <strong>Google Calendar API</strong>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/search-for-api-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Search for API in Google Cloud"
title="Searching for API in Google Cloud"
width="1000"
height="390" />
</li>
<li>
<p>
Enable <strong>Google Calendar API</strong>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/enable-google-calendar-api.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Enable Google Calendar API"
title="Enabling Google Calendar API"
width="620"
height="350" />
</li>
<li>
Done! Let's proceed to the next step.
</li>
</ol>
<h3>Step-3: Create OAuth application</h3>
<ol>
<li>
<p>
First of all, click the <strong>"hamburger"</strong> icon on the top left and then hit <strong>VIEW ALL PRODUCTS</strong>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/view-all-products-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="View all products in Google Cloud"
title="Viewing all products in Google Cloud"
width="990"
height="700" />
</li>
<li>
<p>
Then access
<a target="_blank" href="https://console.cloud.google.com/auth">Google Auth Platform</a>
to start creating an OAuth application:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/open-google-auth-platform-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Open Google Auth Platform in Google Cloud"
title="Opening Google Auth Platform in Google Cloud"
width="1000"
height="430" />
</li>
<li>
<p>
Start by pressing <strong>GET STARTED</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/start-creating-app-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start creating an app in Google Cloud"
title="Starting creating an app in Google Cloud"
width="1000"
height="340" />
</li>
<li>
<p>
Next, continue by filling in <strong>App name</strong> and <strong>User support email</strong> fields:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/fill-app-info-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Fill app info in Google Cloud"
title="Filling app info in Google Cloud"
width="850"
height="440" />
</li>
<li>
<p>
Choose <strong>Internal</strong> option, if it's enabled, otherwise select <strong>External</strong>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/choose-app-audience-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Choose app audience in Google Cloud"
title="Choosing app audience in Google Cloud"
width="850"
height="590" />
</li>
<li>
<p>
<em>Optional step if you used <code>Internal</code> option in the previous step</em>.
Nevertheless, if you had to use <code>External</code> option, then click <strong>ADD USERS</strong> to add a user:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/add-test-user-in-google-cloud-app.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Add test user in Google Cloud app"
title="Adding test user in Google Cloud app"
width="1000"
height="990" />
</li>
<li>
<p>
Then add your contact <strong>Email address</strong>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/enter-app-contact-info-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Enter app contact info in Google Cloud"
title="Entering app contact info in Google Cloud"
width="850"
height="510" />
</li>
<li>
<p>
Finally, check the checkbox and click <strong>CREATE</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/create-app-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Create app in Google Cloud"
title="Creating app in Google Cloud"
width="850"
height="580" />
</li>
<li>
Done! Let's create Client Credentials in the next step.
</li>
</ol>
<h3>Step-4: Create Client Credentials</h3>
<ol>
<li>
<p>
In
<a target="_blank" href="https://console.cloud.google.com/auth">Google Auth Platform</a>,
select <strong>Clients</strong> menu item and click <strong>CREATE CLIENT</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/start-creating-app-client-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start creating app client in Google Cloud"
title="Starting creating app client in Google Cloud"
width="1000"
height="340" />
</li>
<li>
<p>
Choose <code>Desktop app</code> as <strong>Application type</strong> and name your credentials:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/create-oauth-app-client-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Create OAuth app client in Google Cloud"
title="Creating OAuth app client in Google Cloud"
width="1000"
height="500" />
</li>
<li>
<p>
Continue by opening the created credentials:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/view-app-client-credentials-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="View app client credentials in Google Cloud"
title="Viewing app client credentials in Google Cloud"
width="1000"
height="370" />
</li>
<li>
<p>
Finally, copy <strong>Client ID</strong> and <strong>Client secret</strong> for the later step:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/user-account/use-client-id-and-secret-to-read-google-rest-api-data.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Use client ID and secret to read Google REST API data"
title="Using client ID and secret to read Google REST API data"
width="770"
height="360" />
</li>
<li>
Done! We have all the data needed for authentication, let's proceed to the last step!
</li>
</ol>
<h3>Step-5: Configure connection</h3>
<ol>
<li>
<p>
Now go to SSIS package or ODBC data source and use previously copied values in <strong>User Account</strong> authentication configuration:
</p>
<ul>
<li>In the <strong>ClientId</strong> field paste the <strong>Client ID</strong> value.</li>
<li>In the <strong>ClientSecret</strong> field paste the <strong>Client secret</strong> value.</li>
</ul>
</li>
<li>
<p>
Press <strong>Generate Token</strong> button to generate Access and Refresh Tokens.
</p>
</li>
<li>
<p>
Finally, click <strong>Test Connection</strong> to confirm the connection is working.
</p>
</li>
<li>
Done! Now you are ready to use Google Calendar Connector!
</li>
</ol>
]]>
</Notes>
</Auth>
<Auth Name="ServiceAccount"
Label="Service Account (Using *.json OR *.p12 key file)"
Desc="Service accounts are accounts that do not represent a human user. They provide a way to manage authentication and authorization when a human is not directly involved, such as when an application needs to access Google Cloud resources. Service accounts are managed by IAM."
HelpLink="https://cloud.google.com/docs/authentication#service-accounts"
Type="OAuth"
ConnStr="Provider=Google;UseCustomApp=True;UseClientCertificate=True;CertificateStorageType=PfxFile;CertificatePath=[$PrivateKeyPath$];GrantType=ClientCredentials;"
TestEndPoint="list_calendars">
<Params>
<Param Name="ClientId" Label="Service Account Email" Desc="This is service account email ID (e.g. some_name@my_project.iam.gserviceaccount.com)" Required="True" />
<Param Name="PrivateKeyPath" Label="Service Account Private Key Path (i.e. *.p12)" Desc="File path for p12 file (i.e. Private Key file for service account). Keep this key file secure" Required="True" />
<Param Name="Scope" Value="https://www.googleapis.com/auth/calendar" />
<Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
<Param Name="RetryStatusCodeList" Value="403|429" Hidden="True" />
<Param Name="RetryCountMax" Value="5" Hidden="True" />
<Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />
<Param Name="ImpersonateAs" Type="Property" Key="ExtraAttributesForTokenRequest" Hidden="False" ValueTemplate="user={$value$}" Label="Impersonate As (Enter Email Id)" />
</Params>
<Notes>
<![CDATA[
<p>
Follow these steps on how to create Service Account to authenticate and access Google Calendar API in SSIS package or ODBC data source:
</p>
<h3>Step-1: Create project</h3>
<p>
This step is optional, if you already have a project in Google Cloud and can use it.
However, if you don't, proceed with these simple steps to create one:
</p>
<ol>
<li>
<p>
First of all, go to <a target="_blank" href="https://console.developers.google.com/">Google API Console</a>.
</p>
</li>
<li>
<p>
Then click <strong>Select a project</strong> button and then click <strong>NEW PROJECT</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/start-creating-new-project-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start creating a new project in Google Cloud"
title="Starting creating a new project in Google Cloud"
width="1000"
height="340" />
</li>
<li>
<p>
Name your project and click <strong>CREATE</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/create-new-project-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Create a new project in Google Cloud"
title="Creating a new project in Google Cloud"
width="680"
height="360" />
</li>
<li>
<p>
Wait until the project is created:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/wait-until-project-is-created-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Wait until project is created in Google Cloud"
title="Waiting until project is created in Google Cloud"
width="640"
height="390" />
</li>
<li>
Done! Let's proceed to the next step.
</li>
</ol>
<h3>Step-2: Enable Google Calendar API</h3>
<p>
In this step we will enable Google Calendar API:
</p>
<ol>
<li>
<p>
Select your project on the top bar:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/select-project-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Select project in Google Cloud"
title="Selecting project in Google Cloud"
width="1000"
height="400" />
</li>
<li>
<p>
Then click the <strong>"hamburger"</strong> icon on the top left and access
<a target="_blank" href="https://console.cloud.google.com/apis/dashboard">APIs & Services</a>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/access-apis-and-services-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Access APIs and services in Google Cloud"
title="Accessing APIs and services in Google Cloud"
width="990"
height="440" />
</li>
<li>
<p>
Now let's enable several APIs by clicking <strong>ENABLE APIS AND SERVICES</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/enable-api-for-project-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Enable API for project in Google Cloud"
title="Enabling API for project in Google Cloud"
width="800"
height="300" />
</li>
<li>
<p>
In the search bar search for <code>calendar</code> and then locate and select <strong>Google Calendar API</strong>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/search-for-api-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Search for API in Google Cloud"
title="Searching for API in Google Cloud"
width="1000"
height="390" />
</li>
<li>
<p>
Enable <strong>Google Calendar API</strong>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/enable-google-calendar-api.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Enable Google Calendar API"
title="Enabling Google Calendar API"
width="620"
height="350" />
</li>
<li>
Done! Let's proceed to the next step.
</li>
</ol>
<h3>Step-3: Create Service Account</h3>
<p>
Use the steps below to create a Service Account in Google Cloud:
</p>
<ol>
<li>
<p>
First of all, go to
<a target="_blank" href="https://console.cloud.google.com/iam-admin/iam">IAM & Admin</a>
in Google Cloud console:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/access-iam-and-admin-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Access IAM & Admin in Google Cloud"
title="Accessing IAM & Admin in Google Cloud"
width="690"
height="510" />
</li>
<li>
<p>
Once you do that, click <strong>Service Accounts</strong> on the left side
and click <strong>CREATE SERVICE ACCOUNT</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/start-creating-service-account-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start creating service account in Google Cloud"
title="Starting creating service account in Google Cloud"
width="1000"
height="500" />
</li>
<li>
<p>
Then name your service account and click <strong>CREATE AND CONTINUE</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/create-service-account-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Create service account in Google Cloud"
title="Creating service account in Google Cloud"
width="750"
height="450" />
</li>
<li>
<p>
Continue by clicking <strong>Select a role</strong> dropdown
and start granting service account Project Viewer roles:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/start-granting-service-account-project-roles-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start granting service account project roles in Google Cloud"
title="Starting granting service account project roles in Google Cloud"
width="750"
height="250" />
</li>
<li>
<p>
Find <strong>Project</strong> group
and select <strong>Viewer</strong> role:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/grant-service-account-project-viewer-role.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Grant service account project viewer role"
title="Granting service account project viewer role"
width="540"
height="410" />
</li>
<li>
<p>
Finish adding roles by clicking <strong>CONTINUE</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/finish-granting-service-account-project-roles-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Finish granting service account project roles in Google Cloud"
title="Finishing granting service account project roles in Google Cloud"
width="750"
height="370" />
<div class="alert alert-info alert-title">
You can always add or modify permissions later in
<a target="_blank" href="https://console.cloud.google.com/iam-admin/iam">IAM & Admin</a>.
</div>
</li>
<li>
<p>
Finally, in the last step, just click button <strong>DONE</strong>:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/finish-configuring-service-account-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Finish configuring service account in Google Cloud"
title="Finishing configuring service account in Google Cloud"
width="750"
height="350" />
</li>
<li>
<p>
Done! We are ready to add a Key to this service account in the next step.
</p>
</li>
</ol>
<h3>Step-4: Add Key to Service Account</h3>
<p>
We are ready to add a Key (P12 certificate) to the created Service Account:
</p>
<ol>
<li>
<p>
In <a target="_blank" href="https://console.cloud.google.com/iam-admin/serviceaccounts">Service Accounts</a>
open newly created service account:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/open-service-account-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Open service account in Google Cloud"
title="Opening service account in Google Cloud"
width="750"
height="350" />
</li>
<li>
<p>
Next, copy email address of your service account for the later step:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/copy-service-account-email-address-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Copy service account email address in Google Cloud"
title="Copying service account email address in Google Cloud"
width="600"
height="370" />
</li>
<li>
<p>
Continue by selecting <strong>KEYS</strong> tab,
then press <strong>ADD KEY</strong> dropdown,
and click <strong>Create new key menu</strong> item:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/start-creating-key-for-service-account-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start creating key for service account in Google Cloud"
title="Starting creating key for service account in Google Cloud"
width="750"
height="530" />
</li>
<li>
<p>
Finally, select <strong>P12</strong> option and hit <strong>CREATE</strong> button:
</p>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/create-p12-key-for-service-account-in-google-cloud.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Create P12 key for service account in Google Cloud"
title="Creating P12 key for service account in Google Cloud"
width="600"
height="400" />
</li>
<li>
P12 certificate downloads into your machine. We have all the data needed for authentication, let's proceed to the last step!
</li>
</ol>
<h3>Step-5: Share Google Calendar with Service Account</h3>
<p>
Now it's time to grant Google Calendar read/write permissions to the created service account:
</p>
<ol>
<li>Login to https://calendar.google.com with Google account credentials whose calendar you want to share with the service account.</li>
<li>On the top right click <strong>gear icon</strong> and click <strong>Settings</strong> item to open configuration.</li>
<li>Then on the left, click <strong>Settings of my calendars</strong> section.</li>
<li>Locate the calendar you want to share and select it.</li>
<li>In the dropdown hit <strong>Share with specific people or groups</strong> and click <strong>Add people and groups</strong> button.</li>
<li>Enter the service account email address we obtained in the previous section.</li>
<li>Finally, choose the permissions, e.g. <code>Make changes to events</code>:</li>
<li>
<img src="https://cdn.zappysys.com/api/Images/authentication/google/Service-Account/share-google-calendar-with-service-account.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Share Google Calendar with service account"
title="Sharing Google Calendar with service account"
width="930"
height="480" />
</li>
<li>Click <strong>Send</strong> button to share the calendar.</li>
<li>That's it! Let's proceed to the configuration!</li>
</ol>
<h3>Step-6: Configure connection</h3>
<ol>
<li>
<p>
Now go to SSIS package or ODBC data source and configure these fields in <strong>Service Account</strong> authentication configuration:
</p>
<ul>
<li>In the <strong>Service Account Email</strong> field paste the service account <strong>Email address</strong> value you copied in the previous step.</li>
<li>In the <strong>Service Account Private Key Path (i.e. *.p12)</strong> field use downloaded certificate's file path.</li>
</ul>
</li>
<li>
Done! Now you are ready to use Google Calendar Connector!
</li>
</ol>
]]>
</Notes>
</Auth>
</Auths>
<Template>
<EndPoint Name="EventInputColumns">
<InputColumns>
<Column Name="EventId" Label="Id" DataType="DT_WSTR" MapToParam="True" Key="True" ExcludeFromRowMap="True"/>
<Column Name="start.date" Label="StartsOn" Desc="Use StartsOn OR StartsAt" Example="2021-12-24" DataType="DT_DBDATE" />
<Column Name="start.dateTime" Label="StartsAt" Desc="Use StartsOn OR StartsAt" Example="2021-12-24T18:30:00" DataType="DT_DBTIMESTAMP" />
<Column Name="start.timeZone" Label="StartsInTimeZone" DataType="DT_WSTR" Length="300" />
<Column Name="end.date" Label="EndsOn" DataType="DT_DBDATE" Example="2021-12-24"/>
<Column Name="end.dateTime" Label="EndsAt" DataType="DT_DBTIMESTAMP" Example="2021-12-24T18:30:00" />
<Column Name="end.timeZone" Label="EndsInTimeZone" DataType="DT_WSTR" Length="300" />
<Column Name="summary" Label="Summary" Desc="Event title" DataType="DT_WSTR" Length="300" />
<Column Name="description" Label="Description" Desc="Event description" DataType="DT_NTEXT" Length="4000" />
<Column Name="location" Label="Location" Desc="Event location" DataType="DT_WSTR" Length="1024" />
<Column Name="conferenceData" Label="ConferenceData" DataType="DT_NTEXT" Raw="True"/>
<Column Name="attendees" Label="Attendees" Desc="List of attendees" DataType="DT_NTEXT" Raw="True"/>
<Column Name="attachments" Label="Attachments" DataType="DT_NTEXT" Raw="True"/>
<Column Name="recurrence" Label="Recurrence" Desc="Recurrence rule (RRULE)"
HelpLink="https://developers.google.com/calendar/api/v3/reference/events/insert" DataType="DT_WSTR" Length="1024" Raw="True"/>
<Column Name="status" Label="Status" Desc="Event status" DataType="DT_WSTR" Length="50" Example="confirmed OR tentative OR cancelled"/>
<Column Name="transparency" Label="Transparency" Desc="Show as busy or free" DataType="DT_WSTR" Length="300" Example="opaque OR transparent"/>
<Column Name="visibility" Label="Visibility" Desc="Event visibility" DataType="DT_WSTR" Length="300" Example="default OR public OR private OR confidential"/>
<Column Name="reminders.useDefault" Label="RemindersUseDefault" DataType="DT_BOOL" />
<Column Name="reminders.overrides" Label="RemindersOverrides" DataType="DT_WSTR" Length="1000" Raw="True"/>
<Column Name="colorId" Label="ColorId" Desc="Color identifier for the event" DataType="DT_WSTR" Length="50" />
<Column Name="guestsCanInviteOthers" Label="GuestsCanInviteOthers" Desc="Allow guests to invite others" DataType="DT_BOOL" />
<Column Name="guestsCanModify" Label="GuestsCanModify" Desc="Allow guests to modify event" DataType="DT_BOOL" />
<Column Name="guestsCanSeeOtherGuests" Label="GuestsCanSeeOtherGuests" Desc="Allow guests to see other guests" DataType="DT_BOOL" />
<Column Name="anyoneCanAddSelf" Label="AnyoneCanAddSelf" Desc="Whether anyone can add themselves as an attendee" DataType="DT_BOOL" />
<Column Name="privateCopy" Label="PrivateCopy" Desc="Whether this is a private event copy" DataType="DT_BOOL" />
<Column Name="showMeAs" Label="ShowMeAs" Desc="Show event as busy or free" DataType="DT_WSTR" Length="50" Example="busy OR free OR tentative OR workingElsewhere" />
<Column Name="source.title" Label="SourceTitle" Desc="Source title of the event" DataType="DT_WSTR" Length="300" />
<Column Name="source.url" Label="SourceUrl" Desc="Source URL of the event" DataType="DT_WSTR" Length="1024" />
</InputColumns>
</EndPoint>
<EndPoint Name="EventOutputColumns">
<OutputColumns>
<Column Name="id" Label="Id" DataType="DT_WSTR" Length="300" />
<Column Name="kind" Label="Kind" DataType="DT_WSTR" Length="300" />
<Column Name="status" Label="Status" DataType="DT_WSTR" Length="300" />
<Column Name="htmlLink" Label="HtmlLink" DataType="DT_WSTR" Length="1000" />
<Column Name="created" Label="CreatedAt" DataType="DT_DBTIMESTAMP" />
<Column Name="updated" Label="UpdatedAt" DataType="DT_DBTIMESTAMP" />
<Column Name="summary" Label="Summary" DataType="DT_WSTR" Length="300" />
<Column Name="description" Label="Description" DataType="DT_NTEXT" />
<Column Name="creator.email" Label="CreatorEmail" DataType="DT_WSTR" Length="300" />
<Column Name="organizer.email" Label="OrganizerEmail" DataType="DT_WSTR" Length="300" />
<Column Name="organizer.displayName" Label="OrganizerDisplayName" DataType="DT_WSTR" Length="300" />
<Column Name="start.dateTime" Label="StartsAt" DataType="DT_DBTIMESTAMP" />
<Column Name="start.date" Label="StartsOn" DataType="DT_DBDATE" />
<Column Name="start.timeZone" Label="StartTimeZone" DataType="DT_WSTR" Length="300" />
<Column Name="end.dateTime" Label="EndsAt" DataType="DT_DBTIMESTAMP" />
<Column Name="end.date" Label="EndsOn" DataType="DT_DBDATE" />
<Column Name="end.timeZone" Label="EndTimeZone" DataType="DT_WSTR" Length="300" />
<Column Name="attendees" Label="Attendees" DataType="DT_NTEXT"/>
<!-- New columns -->
<Column Name="location" Label="Location" DataType="DT_WSTR" Length="1024" />
<Column Name="recurrence" Label="Recurrence" DataType="DT_WSTR" Length="1000" />
<Column Name="iCalUID" Label="ICalUID" DataType="DT_WSTR" Length="300" />
<Column Name="eventType" Label="EventType" DataType="DT_WSTR" Length="128" />
<Column Name="colorId" Label="ColorId" DataType="DT_WSTR" Length="50" />
<Column Name="visibility" Label="Visibility" DataType="DT_WSTR" Length="50" />
<Column Name="transparency" Label="Transparency" DataType="DT_WSTR" Length="50" />
<Column Name="sequence" Label="Sequence" DataType="DT_I4" />
<Column Name="attachments" Label="Attachments" DataType="DT_NTEXT" />
<Column Name="conferenceData.conferenceId" Label="ConferenceDataConferenceId" DataType="DT_WSTR" Length="500" />
<Column Name="conferenceData.entryPoints" Label="ConferenceDataEntryPoints" DataType="DT_WSTR" Length="1000" />
<Column Name="conferenceData.conferenceSolution.key.type" Label="ConferenceDataConferenceSolutionKeyType" DataType="DT_WSTR" Length="500" />
<Column Name="conferenceData.conferenceSolution.iconUri" Label="ConferenceDataConferenceSolutionIconUri" DataType="DT_WSTR" Length="500" />
<Column Name="conferenceData.conferenceSolution.name" Label="ConferenceDataConferenceSolutionName" DataType="DT_WSTR" Length="500" />
<Column Name="guestsCanInviteOthers" Label="GuestsCanInviteOthers" DataType="DT_BOOL" />
<Column Name="reminders.useDefault" Label="RemindersUseDefault" DataType="DT_BOOL" />
<Column Name="reminders.overrides" Label="RemindersOverrides" DataType="DT_WSTR" Length="1000" />
<Column Name="etag" Label="ETag" DataType="DT_WSTR" Length="200" />
<Column Name="hangoutLink" Label="HangoutLink" DataType="DT_WSTR" Length="1000" />
<Column Name="recurringEventId" Label="RecurringEventId" DataType="DT_WSTR" Length="300" />
<Column Name="originalStartTime.dateTime" Label="OriginalStartDateTime" DataType="DT_DBTIMESTAMP" />
<Column Name="originalStartTime.date" Label="OriginalStartDate" DataType="DT_DBDATE" />
<Column Name="source.url" Label="SourceUrl" DataType="DT_WSTR" Length="1024" />
<Column Name="source.title" Label="SourceTitle" DataType="DT_WSTR" Length="300" />
</OutputColumns>
</EndPoint>
<EndPoint Name="PaginationParams">
<Params>
<Param Name="MaxResults"
Label="Max Results"
Desc="Maximum number of events per page"
Type="Query"
Key="maxResults"
DataType="DT_I4"/>
<Param Name="NextUrlAttributeOrExpr"
Value="$.nextPageToken"
Type="Property"
/>
<Param Name="NextUrlSuffix"
Value="pageToken=<%nextlink%>"
Type="Property"
/>
</Params>
</EndPoint>
<EndPoint Name="ListEventParams">
<Params>
<Param Name="StartTime"
Label="Start Time"
Desc="Lower bound for event start time (RFC3339 timestamp, e.g. 2026-01-26T00:00:00Z --OR-- 2026-01-27T05:00:00-05:00)"
Type="Query"
Options="As Local Time (with Timezone Offset)=2026-01-27T05:00:00-05:00;
As UTC Time=2026-01-27T05:00:00Z;
As Dynamic Local Time (with Timezone Offset)=<<today+5d+2h,FUN_TO_DATETIME>>-05:00;
As Dynamic UTC Time=<<now+5h,FUN_TO_DATETIME_UTC>>"
Key="timeMin"/>
<Param Name="EndTime"
Label="End Time"
Desc="Upper bound for event end time (RFC3339 timestamp, e.g. 2026-01-27T00:00:00Z --OR-- 2026-01-27T05:00:00-05:00)"
Type="Query"
Options="As Local Time (with Timezone Offset)=2026-01-27T05:00:00-05:00;
As UTC Time=2026-01-27T05:00:00Z;
As Dynamic Local Time (with Timezone Offset)=<<today+5d+2h,FUN_TO_DATETIME>>-05:00;
As Dynamic UTC Time=<<now+5h,FUN_TO_DATETIME_UTC>>"
Key="timeMax"/>
<Param Name="ShowDeleted"
Label="Show Deleted"
Desc="Whether to include deleted events (true/false)"
Type="Query"
Key="showDeleted"
Options=";true;false"/>
<Param Name="SingleEvents"
Label="Single Events"
Desc="Expand recurring events into instances (true/false)"
Type="Query"
Key="singleEvents"
Options=";true;false"/>
<Param Name="MaxResults"
Label="Max Results"
Desc="Maximum number of events per page"
Type="Query"
Key="maxResults"
DataType="DT_I4"/>
<Param Name="OrderBy"
Label="Order By"
Desc="Order of the events returned (startTime or updated)"
Type="Query"
Key="orderBy"
Options=";startTime;updated"/>
<Param Name="NextUrlAttributeOrExpr"
Value="$.nextPageToken"
Type="Property"
/>
<Param Name="NextUrlSuffix"
Value="pageToken=<%nextlink%>"
Type="Property"
/>
<Param Name="ContinueOn404Error" Hidden="False" Value="True" Type="Property" Options=";True;False;" PushToChildEndPoint="True" />
</Params>
</EndPoint>
<Param Name="UserIdParam" Label="User ID (e.g. 'me' or other-user-email)" Value="me" Required="True" Desc="The UserId parameter can be 'me' (the authenticated user) or a specific user's email (e.g., 'someuser@example.com'). For OAuth, 'me' is the signed-in user; other users require domain-wide delegation. For Service Accounts, use 'me' for the service account itself, or specify an email if impersonation is enabled." />
<Param Name="CalendarIdParam"
Label="Calendar ID (e.g. 'primary' or calendar ID)"
OptionsEndPoint="list_calendars"
OptionsEndPointValueColumn="Id"
OptionsEndPointLabelColumn="Summary"
Value="primary"
Required="True"/>
<Param Name="EventIdParam"
Label="Event ID"
OptionsEndPoint="list_events"
OptionsEndPointValueColumn="Id"
OptionsEndPointLabelColumn="Summary"
OptionEndPointParameters="CalendarId=[$CalendarId$];"
Required="True"/>
<Param Name="SendUpdatesParam"
Label="Send Event Updates"
Desc="Whether to send notifications to guests (all, externalOnly, none)"
Type="Query"
Key="sendUpdates"
Options=";all;externalOnly;none"
Value="none"
/>
</Template>
<EndPoints>
<!--=====================================
========= LIST CALENDARS ============
=====================================-->
<EndPoint Name="list_calendars"
Label="List calendars"
Desc="Lists calendars"
Url="/users/[$UserId$]/calendarList"
Method="GET"
Filter="$.items"
Template="PaginationParams"
>
<Params>
<Param Name="UserId" Template="UserIdParam" />
</Params>
<OutputColumns>
<Column Name="id" Label="Id" DataType="DT_WSTR" Length="300" />
<Column Name="summary" Label="Summary" DataType="DT_WSTR" Length="300" />
<Column Name="description" Label="Description" DataType="DT_WSTR" Length="1500" />
<Column Name="timeZone" Label="TimeZone" DataType="DT_WSTR" Length="300" />
</OutputColumns>
</EndPoint>
<!--=====================================
=========== LIST EVENTS =============
=====================================-->
<EndPoint Name="list_events"
Label="List events"
Desc="Lists events"
Url="/calendars/[$CalendarId$]/events"
Method="GET"
Filter="$.items"
Template="EventOutputColumns,ListEventParams,PaginationParams"
>
<Params>
<Param Name="CalendarId" Template="CalendarIdParam" />
</Params>
</EndPoint>
<EndPoint Name="list_events_all_calendars"
Label="List events for all calendars"
Desc="Lists events of all calendars"
Url="/users/[$UserId$]/calendarList"
Method="GET"
Filter="$.items"
Template="EventOutputColumns,ListEventParams"
>
<Params>
<Param Name="UserId" Template="UserIdParam" />
</Params>
<EndPoint Name="child_list_events"
Url="/calendars/[$parent.id$]/events"
Method="GET"
Filter="$.items"
>
<Params>
</Params>
</EndPoint>
<OutputColumns>
<Column Name="p1_id" Label="CalendarId" DataType="DT_WSTR" Length="300" />
</OutputColumns>
</EndPoint>
<!--=====================================
============ GET EVENT ==============
=====================================-->
<EndPoint Name="get_event"
Label="Get event"
Desc="Gets event"
Url="/calendars/[$CalendarId$]/events/[$EventId$]"
Method="GET"
Template="EventOutputColumns"
>
<Params>
<Param Name="CalendarId" Template="CalendarIdParam" />
<Param Name="EventId" ReadAs="Id" IsKey="True" Template="EventIdParam" />
</Params>
</EndPoint>
<!--=====================================
=========== CREATE EVENT ============
=====================================-->
<EndPoint Name="create_event"
Label="Create event"
Desc="Creates event"
Url="/calendars/[$CalendarId$]/events"
Method="POST"
DotAsPath="True"
ContentType="application/json"
JsonRowFormat="Multicontent"
Template="EventOutputColumns,EventInputColumns"
>
<Params>
<Param Name="CalendarId" Template="CalendarIdParam" />
<Param Name="SendUpdates" Template="SendUpdatesParam"/>
</Params>
<Body><![CDATA[{$rows$}]]></Body>
</EndPoint>
<EndPoint Name="update_event"
Label="Update event"
Desc="Updates event"
Url="/calendars/[$CalendarId$]/events/[$EventId$]"
Method="PUT"
DotAsPath="True"
ContentType="application/json"
JsonRowFormat="Multicontent"
Template="EventOutputColumns,EventInputColumns"
>
<Params>
<Param Name="CalendarId" Template="CalendarIdParam" />
<Param Name="EventId" ReadAs="Id" IsKey="True" Template="EventIdParam" />
<Param Name="SendUpdates" Template="SendUpdatesParam"/>
</Params>
<Body><![CDATA[{$rows$}]]></Body>
</EndPoint>
<!--=====================================
=========== DELETE EVENT ============
=====================================-->
<EndPoint Name="delete_event"
Label="Delete event"
Desc="Deletes event"
Url="/calendars/[$CalendarId$]/events/[$EventId$]"
Method="DELETE"
DotAsPath="True"
ContentType="application/json"
JsonRowFormat="Multicontent"
>
<Params>
<Param Name="CalendarId" Template="CalendarIdParam" />
<Param Name="EventId" ReadAs="Id" IsKey="True" Template="EventIdParam" />
</Params>
<OutputColumns>
<Column Name="id" Label="Id" DataType="DT_WSTR" Length="50" />
</OutputColumns>
</EndPoint>
<!--=====================================
============ MOVE EVENT =============
=====================================-->
<EndPoint Name="move_event"
Label="Move event to another calendar"
Desc="Moves event from one calendar to another"
Url="/calendars/[$SourceCalendarId$]/events/[$EventId$]/move?destination=[$TargetCalendarId$]"
Method="POST"
DotAsPath="True"
ContentType="application/json"
JsonRowFormat="Multicontent"
>
<Params>
<Param Name="SourceCalendarId" Label="Source Calendar Id" Template="CalendarIdParam" />
<Param Name="TargetCalendarId" Label="Target Calendar Id" Value="" Template="CalendarIdParam" />
<Param Name="EventId" Template="EventIdParam" />
</Params>
<OutputColumns>
<Column Name="id" Label="Id" DataType="DT_WSTR" Length="50" />
</OutputColumns>
</EndPoint>
</EndPoints>
<!--=====================================
============= TABLES ================
=====================================-->
<Tables>
<Table Name="Events"
Desc="Insert, update, delete and list datasets"
SelectEndPoint="list_events"
LookupEndPoint="get_event"
InsertEndPoint="create_event"
DeleteEndPoint="delete_event"
UpdateEndPoint="update_event"
/>
<Table Name="EventsAll"
Desc="List events from all calendars"
SelectEndPoint="list_events_all_calendars"
/>
<Table Name="Calendars"
SelectEndPoint="list_calendars"
/>
</Tables>
<!--=====================================
============ EXAMPLES ===============
=====================================-->
<Examples>
<Example Group="ODBC" Slug="list-calendars" Label="List calendars" Default="True">
<Desc>
<![CDATA[
<p>This example retrieves a list of calendars accessible to the authenticated user or specified user. Use <code>UserId='me'</code> for the current user (OAuth) or a specific email for service accounts with domain-wide delegation.</p>
<p><strong>Note:</strong> For service accounts, impersonation may be required for non-'me' users.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT * FROM Calendars
-- Default: Lists calendars for the authenticated user
--OR--
--SELECT * FROM Calendars WITH(UserId='me') -- for OAuth authenticated user
--SELECT * FROM Calendars WITH(UserId='someuser@email.com') -- for specific user (requires domain-wide delegation for service accounts)
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events" Label="List events">
<Desc>
<![CDATA[
<p>This example lists events from a specified calendar. Supply the calendar ID to target a calendar; for a single event you can filter by event ID in the WHERE clause or use the EventId parameter.</p>
<p><strong>Tip:</strong> Combine with time range parameters (<code>StartTime</code>, <code>EndTime</code>) for filtered results.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT * FROM Events
WITH (CalendarId='MyCalendarId') -- Specify the calendar ID to list events from
--Get single event by Id
--SELECT * FROM Events WHERE Id='MyEventId' -- Filter by event ID in WHERE clause
--SELECT * FROM Events WITH(EventId='MyEventId') -- Use EventId parameter for direct lookup
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events-from-all-calendars" Label="List events from all calendars">
<Desc>
<![CDATA[
<p>This example lists events from all calendars accessible to the user. For OAuth, it uses the authenticated user's calendars. For service accounts, specify <code>UserId</code> to impersonate another user (requires domain-wide delegation).</p>
<p><strong>Note:</strong> This may return a large dataset; use filters like <code>StartTime</code> to limit results.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT * FROM EventsAll -- Lists events from all accessible calendars
--WITH (CalendarId='primary',
-- StartTime='<<today,FUN_TO_DATETIME>>-05:00',
-- EndTime='<<today+7d,FUN_TO_DATETIME>>-05:00')
--OR--
--SELECT * FROM EventsAll WITH(UserId='me') -- for OAuth authenticated user
--SELECT * FROM EventsAll WITH(UserId='someuser@email.com') -- for specific user (requires domain-wide delegation for service accounts)
--SELECT * FROM EventsAll WITH(ContinueOn404Error='False') -- Fail on 404 errors when accessing calendars
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="get-event" Label="Get event">
<Desc>
<![CDATA[
<p>This example retrieves a single event by its ID from the specified calendar. Supply the calendar ID and event ID to fetch the event details.</p>
<p><strong>Use case:</strong> Fetch detailed information for a specific event.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT * FROM get_event -- Direct endpoint for getting a single event
WITH (CalendarId='MyCalendarId' -- ID of the calendar containing the event
,EventId='MyEventId') -- Unique ID of the event to retrieve
--OR-- Use TableName + WHERE clause
--SELECT * FROM Events WHERE Id='MyEventId' -- Filter by event ID in WHERE clause
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events-with-time-range" Label="List events with time range">
<Desc>
<![CDATA[
<p>This example demonstrates how to list events within a specific date range using static timestamps. The <code>StartTime</code> and <code>EndTime</code> parameters filter events to only include those starting after the minimum time and ending before the maximum time. This is useful for querying events in a particular month or week.</p>
<p><strong>Note:</strong> Timestamps must be in RFC3339 format (e.g., <code>2026-01-01T00:00:00Z</code>).</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT *
FROM Events
WITH (CalendarId='primary',
StartTime='2026-01-01T00:00:00Z',
EndTime='2026-01-31T23:59:59Z')
--OR-- From all accessible calendars (EventsAll table)
--SELECT *
--FROM EventsAll
--WITH (StartTime='2026-01-01T00:00:00-05:00',
-- EndTime='2026-01-31T23:59:59-05:00')
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events-ordered-by-start-time" Label="List events ordered by start time">
<Desc>
<![CDATA[
<p>Use this query to retrieve events ordered by their start time. The <code>OrderBy</code> parameter sorts the results chronologically based on the event's start date and time. This is ideal for displaying upcoming events in sequence.</p>
<p><strong>Tip:</strong> Combine with <code>StartTime</code> to focus on future events.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT *
FROM Events
WITH (CalendarId='primary',
OrderBy='startTime')
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events-including-deleted-ones" Label="List events including deleted ones">
<Desc>
<![CDATA[
<p>This example shows how to include deleted events in the results by setting <code>ShowDeleted='true'</code>. Deleted events are typically hidden, but this parameter allows you to view them for auditing or recovery purposes.</p>
<p><strong>Warning:</strong> Deleted events may have limited data available.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT *
FROM Events
WITH (CalendarId='primary',
ShowDeleted='true')
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events-with-max-results-and-single-events" Label="List events with max results and single events">
<Desc>
<![CDATA[
<p>Limit the number of events returned with <code>MaxResults</code> and expand recurring events into individual instances using <code>SingleEvents='true'</code>. This prevents pagination issues and ensures each occurrence of a recurring event is listed separately.</p>
<p><strong>Example use case:</strong> Fetch the next 10 upcoming event instances.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT * FROM Events
WITH (CalendarId='primary',
MaxResults=10,
SingleEvents='true')
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events-for-next-week-using-dynamic-dates" Label="List events for next week using dynamic dates">
<Desc>
<![CDATA[
<p>This query uses dynamic date functions to list events for the next week. <code><<today,FUN_TO_DATETIME>></code> represents today's date in datetime format, and <code><<today+7d,FUN_TO_DATETIME>></code> adds 7 days. This allows for automated queries that always fetch the upcoming week's events without hardcoding dates.</p>
<p><strong>Dynamic Placeholders:</strong> Supported functions include <code>FUN_TO_DATE</code> for dates and <code>FUN_TO_DATETIME</code> for timestamps.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT * FROM Events
--FROM EventsAll --(Get from All Calendars)
WITH (CalendarId='primary',
--//e.g. append -05:00 for EST (New York Time Zone) to convert local time to UTC -OR- just appends "Z" for UTC time (2026-01-01T05:00:00Z which is same as 2026-01-01T00:00:00-05:00 ).
StartTime='<<today,FUN_TO_DATETIME>>-05:00',
EndTime='<<today+7d,FUN_TO_DATETIME>>-05:00')
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events-ordered-by-updated-time" Label="List events ordered by updated time">
<Desc>
<![CDATA[
<p>Retrieve events sorted by their last updated time using <code>OrderBy='updated'</code>. This is useful for tracking recent changes or modifications to events in the calendar.</p>
<p><strong>Combine with Filters:</strong> Add <code>StartTime</code> to focus on recently updated events.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT * FROM Events
--FROM EventsAll --(Get from All Calendars)
WITH (CalendarId='primary',
OrderBy='updated')
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-events-for-today-and-tomorrow-with-dynamic-placeholders" Label="List events for today and tomorrow with dynamic placeholders">
<Desc>
<![CDATA[
<p>Use dynamic placeholders to query events starting from today and ending tomorrow. <code><<today,FUN_TO_DATETIME>></code> is today's start, and <code><<today+1d,FUN_TO_DATETIME>></code> is tomorrow's start. This example combines static time ranges with dynamic dates for precise filtering.</p>
<p><strong>Advanced Tip:</strong> Adjust the offsets (e.g., +1d for tomorrow) to customize the range.</p>
]]>
</Desc>
<Code>
<![CDATA[
SELECT *
FROM Events
--FROM EventsAll --(Get from All Calendars)
WITH (CalendarId='primary',
StartTime='<<today,FUN_TO_DATETIME>>-05:00',
EndTime='<<today+1d,FUN_TO_DATETIME>>-05:00')
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="create-event" Label="Create event">
<Desc>
<![CDATA[
<p>This example creates a new event in the specified calendar. Provide start and end times, time zones, summary, and optional details such as location and attendees. Supply the target calendar ID (e.g. <code>primary</code> or a custom calendar ID) in the WITH clause.</p>
<p><strong>Note:</strong> Time zones are required for timed events. Attendees can be supplied as a JSON array.</p>
]]>
</Desc>
<Code>
<![CDATA[
INSERT INTO Events(StartsAt, StartsInTimeZone, EndsAt, EndsInTimeZone, Summary,
Attendees, Description, Location, Status, Transparency, Visibility)
VALUES ('2021-11-26T16:30:50', 'Europe/Vilnius', '2021-11-27T16:30:50','Europe/Vilnius', 'This is an event',
null, 'My Description', 'Vilnius', 'confirmed', 'opaque', 'default')
--WITH (CalendarId='primary') -- Use 'primary' for the main calendar
--WITH (CalendarId='YourCalendarId') -- Or specify a custom calendar ID
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="update-event" Label="Update event">
<Desc>
<![CDATA[
<p>This example updates an existing event by ID. You can change summary, description, times, location, attendees, reminders, and other fields. Use dynamic placeholders for relative times (e.g. <code><<today+1d+10h,FUN_TO_DATETIME>></code>).</p>
<p><strong>Note:</strong> Always provide time zones for timed events. You can choose whether to notify attendees of the update.</p>
]]>
</Desc>
<Code>
<![CDATA[
UPDATE Events
SET Summary = 'Project Kickoff Meeting' -- Event title
,Description = 'Your meeting description in <strong>bold HTML</strong>'
--For all day event - Example '2026-01-28'
--,StartsOn = '2026-02-01' -- All-day event start date (YYYY-MM-DD)
--,EndsOn = '2026-02-01' -- All-day event end date (YYYY-MM-DD)
--,StartsOn = '<<monthend+1d,FUN_TO_DATE>>' -- Dynamic date example
--,EndsOn = '<<monthend+1d,FUN_TO_DATE>>'
--OR--
--For events which has start/end time : Example '2026-01-28T15:59:00'
,StartsAt = '<<today+1d+10h,FUN_TO_DATETIME>>' -- Set time from today + 1 day + 10 hours (10AM)
,EndsAt = '<<today+1d+11h,FUN_TO_DATETIME>>' -- Set time from today + 1 day + 11 hours (11AM)
,StartsInTimeZone = 'America/New_York'
,EndsInTimeZone = 'America/New_York'
,Location = 'Conference Room 2B' -- Event location
,Attendees = '[{"email":"user1@example.com"},{"email":"user2@example.com"}]' -- JSON array of attendees
,RemindersUseDefault = false -- Use custom reminders
,RemindersOverrides = '[{"method": "popup","minutes": 12},{"method": "popup","minutes": 11}]' -- JSON array of reminder overrides
,Recurrence = '["RRULE:FREQ=WEEKLY;WKST=SU;UNTIL=20260131T045959Z;BYDAY=MO,WE"]' -- Recurrence rule
,Status = 'confirmed' -- confirmed | tentative | cancelled
,Transparency = 'opaque' -- opaque | transparent
,Visibility = 'default' -- default | public | private | confidential
,ColorId = '5' -- Color identifier
,GuestsCanInviteOthers = true -- Allow guests to invite others
,GuestsCanModify = false -- Allow guests to modify event
,GuestsCanSeeOtherGuests = true -- Allow guests to see other guests
,AnyoneCanAddSelf = false -- Anyone can add themselves as attendee
,PrivateCopy = false -- Private event copy
,ShowMeAs = 'busy' -- busy | free | tentative | workingElsewhere
,SourceTitle = 'Project Plan' -- Source title
,SourceUrl = 'https://example.com/project-plan' -- Source URL
WHERE Id = '5hr02mkhg09atao1clih4jco6e' -- Event ID to update
WITH (
CalendarId = 'primary' --or 'some-calendar-id'
, SendUpdates='none' --'all' or 'externalOnly' to notify attendees
)
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="delete-event" Label="Delete event">
<Desc>
<![CDATA[
<p>This example deletes an event by ID from the specified calendar. Supply the calendar ID and the event ID.</p>
<p><strong>Warning:</strong> This action is irreversible.</p>
]]>
</Desc>
<Code>
<![CDATA[
DELETE FROM Events -- Deletes the specified event
WITH (CalendarId='MyCalendarId', -- Calendar containing the event
Id='MyEventId') -- ID of the event to delete
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="move-event-to-different-calendar" Label="Move event to a different calendar">
<Desc>
<![CDATA[
<p>This example moves an event from one calendar to another. Supply the source calendar ID, target calendar ID, and the event ID.</p>
<p><strong>Use case:</strong> Reorganize events across calendars.</p>
]]>
</Desc>
<Code>
<![CDATA[
UPDATE move_event -- Moves the event to a new calendar
WITH (SourceCalendarId='MySourceCalendarId', -- Original calendar ID
TargetCalendarId='MyTargetCalendarId', -- Destination calendar ID
Id='MyEventId') -- Event ID to move
]]>
</Code>
</Example>
</Examples>
</ApiConfig>