Skip to main content

Calendly

The Calendly source syncs your organization members, groups, teams, invitations, event types and their hosts, availability schedules, meeting locations, webhook subscriptions, scheduled events, event invitees, routing forms and their submissions, contacts, outgoing communications, activity logs, and meeting recaps from the Calendly API v2.

Prerequisites​

  • A Calendly account. API access is available on all Calendly plans, including Free, but routing forms and their submissions need Teams, outgoing communications and activity logs need Enterprise, meeting recaps need a plan with Notetaker, and Calendly can deny contacts with a paid-plan error (see Plan-gated streams).
  • An organization owner or administrator account to read organization-wide data such as scheduled events, webhook subscriptions, activity logs and outgoing communications. The connector reads the current organization associated with the authenticated user's profile; you don't need to enter an organization ID.
  • One of these credentials:
  • A Start date (UTC). The connector reads scheduled events that start on or after it, and outgoing communications, activity log entries and meeting recaps from that time on.

Setup guide​

Authenticate with OAuth​

  1. In Airbyte, create a Calendly source and select OAuth under Authentication.
  2. Select Authenticate your Calendly account and sign in to Calendly as an organization owner or administrator.
  3. Review the requested access and allow it. Calendly grants the read scopes set on Airbyte's Calendly OAuth application; you don't select scopes yourself.
  4. Enter a Start date (UTC) and, optionally, a Lookback window (days) as described below.

Calendly rotates the OAuth refresh token every time Airbyte requests a new access token, and Airbyte stores the new token automatically. If Calendly rejects the refresh token, for example after you revoke Airbyte's access in Calendly, re-authenticate in the source settings.

Every refresh spends the previous refresh token, so use one connection per OAuth source. Two connections that refresh the same source at the same time leave one of them asking you to re-authenticate; if several connections read the same Calendly account, use a personal access token.

Authenticate with a personal access token​

In Airbyte Open Source, use a personal access token. OAuth requires your own Calendly OAuth application and OAuth configured on your Airbyte instance to run the Calendly sign-in flow.

  1. In Calendly, open the Profile menu, select Developer, then select Personal access tokens. If Developer isn't in your Profile menu, manage tokens from the Integrations page instead.
  2. Select Create personal access token, enter a name for the token, and select Next.
  3. Select the read scopes listed in Token scopes, then select Create.
  4. Enter the verification code that Calendly sends to your email, then copy the token. Calendly shows the token only once.
  5. In Airbyte, create a Calendly source, select Personal access token under Authentication, and enter the token in Calendly personal access token. Enter a Start date (UTC) and, optionally, a Lookback window (days) as described below.

The connection check reads only the authenticated user's profile (api_user). A successful check confirms users:read access, not the permissions needed for every stream. Missing stream-specific scopes or organization permissions can still cause a sync to fail.

Configuration​

InputTypeDescriptionDefault Value
credentials.auth_typestringRequired. oauth2.0 for OAuth, or api_key for a personal access token.
credentials.client_idstringRequired for OAuth. Client ID of the Calendly OAuth application. Airbyte Cloud fills it in when you authenticate.
credentials.client_secretstringRequired for OAuth. Client secret of the Calendly OAuth application. Airbyte Cloud fills it in when you authenticate.
credentials.refresh_tokenstringRequired for OAuth. Refresh token returned by Calendly; the connector replaces it with the rotated token after every refresh.
credentials.api_keystringRequired for a personal access token. The personal access token created during setup. Configurations from versions before 1.1.0 that set a top-level api_key are moved here automatically.
start_datestringRequired. Read scheduled events starting on or after this time, and outgoing communications, activity log entries and meeting recaps from this time on. Use UTC in the format YYYY-MM-DDTHH:mm:ssZ, for example 2024-01-01T00:00:00Z. It applies to event start times, not to when invitees booked.
lookback_daysnumberOptional. Incremental scheduled_events syncs re-emit events whose updated_at falls within this many days before the last synced update, plus a fixed five minutes. Every sync pages through all events from the start date, so 0 is right for most connections.0
num_workersintegerOptional. Number of concurrent workers, from 2 to 10. Reduce this if other connections share the same Calendly account's rate limit.4

When you create or update the source with the Airbyte API or Terraform, send the personal access token inside credentials, for example {"auth_type": "api_key", "api_key": "<token>"}; a top-level api_key is no longer read from the request. Sources saved before 1.1.0 move the token into credentials on their next check, schema refresh or sync. If you edit such a source in the Airbyte UI before that, enter the token again.

Token scopes​

With OAuth, Calendly grants the scopes configured on Airbyte's Calendly OAuth application, which cover every stream below. The rest of this section applies to personal access tokens.

Since March 2026, Calendly grants newly created tokens no API access until you select scopes for them; tokens created earlier keep their access. Select the scopes of every stream you sync; every token also needs users:read, which the connection check uses. When a scope is missing, the sync error lists it. Version 0.3.0 added user_availability_schedules, locations and webhook_subscriptions, which need availability:read, locations:read and webhooks:read, and version 0.4.0 added routing_forms, routing_form_submissions, contacts, outgoing_communications, activity_log_entries and meeting_recaps, which need routing_forms:read, contacts:read, outgoing_communications:read, activity_log:read and meeting_recaps:read. Version 1.2.0 added event_type_availability_schedules, which needs availability:read. Calendly sets a token's scopes when you create it, so create a token with these scopes and update it in the source settings before you sync these streams. Connections set to propagate all field and stream changes add these streams automatically.

StreamRequired scopes
api_userusers:read
event_typesusers:read, event_types:read
groupsusers:read, groups:read
organization_membershipsusers:read, organizations:read
scheduled_eventsusers:read, scheduled_events:read
event_inviteesusers:read, scheduled_events:read
teamsorganizations:read
event_type_membershipsusers:read, event_types:read
event_type_availability_schedulesusers:read, event_types:read, availability:read
group_relationshipsusers:read, groups:read
user_availability_schedulesusers:read, organizations:read, availability:read
locationsusers:read, organizations:read, locations:read
organization_invitationsusers:read, organizations:read
webhook_subscriptionsusers:read, webhooks:read
routing_formsusers:read, routing_forms:read
routing_form_submissionsusers:read, routing_forms:read
contactscontacts:read
outgoing_communicationsusers:read, outgoing_communications:read
activity_log_entriesusers:read, activity_log:read
meeting_recapsmeeting_recaps:read

Supported sync modes​

The Calendly source supports these sync modes:

  • Full refresh | Overwrite
  • Full refresh | Append
  • Incremental | Append
  • Incremental | Append + Deduped

Incremental modes apply only to the streams marked incremental in Supported streams; the other streams sync in Full refresh. locations and outgoing_communications have no primary key, so deduplicated modes don't apply to them. See Incremental sync behavior for how incremental syncs of scheduled_events and event_invitees work and how lookback_days applies.

Supported Streams​

StreamDataPrimary keyFull refreshIncremental
event_typesEvent types in the organization, such as meeting names, durations, and scheduling URLsuriYesYes, using updated_at
api_userThe token owner's profile and current organizationuriYesNo
groupsGroups in the organizationuriYesNo
organization_membershipsOrganization members, their roles, and user profilesuriYesNo
scheduled_eventsScheduled meetings, including their times, status, and locationuriYesYes, using updated_at
event_inviteesInvitees for each scheduled event, including answers, tracking data, and cancellation informationuriYesYes, dependent on scheduled_events
teamsTeams in the organizationuriYesNo
event_type_membershipsHosts assigned to each event typeuriYesNo
event_type_availability_schedulesAvailability settings and rules for each host of an event typeevent_type, availability_rule_uriYesNo
group_relationshipsMember and admin relationships between groups and organization members or inviteesuriYesNo
user_availability_schedulesEach organization member's availability schedules, including time zones, weekly rules, and date-specific overridesuriYesNo
locationsMeeting location types available to each organization memberNoneYesNo
organization_invitationsInvitations sent to join the organizationuriYesNo
webhook_subscriptionsConfiguration of organization-scoped webhook subscriptions, including callback URLs, subscribed event types, and stateuriYesNo
routing_formsRouting forms in the organization and their questionsuriYesNo
routing_form_submissionsSubmissions of each routing form, including answers, tracking data and the routing resulturiYesNo
contactsContacts the token's user can accessuriYesNo
outgoing_communicationsEmail and SMS messages Calendly sent for the organizationNoneYesYes, using created_at
activity_log_entriesAudit log of actions in the organizationuriYesYes, using occurred_at
meeting_recapsNotetaker recaps of meetings the token's user can accessuriYesYes, using the meeting start_time

The connector reads event_invitees for each new or changed event in scheduled_events. It reads all invitees for those events and adds scheduled_event_id to each invitee record so you can join it to the id in scheduled_events. The invitee stream's state follows scheduled_events. routing_form_submissions reads the submissions of every routing form returned for the organization.

group_relationships reads the relationships of each group returned by groups, so organizations without groups sync it without records. A group deleted during the sync is skipped; permission errors still fail the sync.

Calendly's OpenAPI specification marks calendar_event on scheduled_events as deprecated, and it can be null.

The incremental outgoing_communications, activity_log_entries and meeting_recaps streams request a window that ends at the sync time, so their cursors never move past it, and they do not use lookback_days. Calendly returns a meeting recap only after processing finishes, so each sync reads recaps of meetings that started up to three days before the saved cursor again; recaps that become available or change later than that need a Full refresh.

Calendly returns no unique identifier for outgoing communications, so this stream has no source-defined primary key, and no field combination is guaranteed unique. A primary key you select yourself can merge distinct messages, so use Full refresh | Overwrite or Incremental | Append for this stream.

user_availability_schedules and locations send one request per organization member, and event_type_memberships and event_type_availability_schedules send one per event type, so they are not suggested by default. locations has no primary key because Calendly returns no identifier for a location and can list a location kind more than once. webhook_subscriptions lists organization-scoped subscriptions only; user- and group-scoped subscriptions are not synced.

The scheduling-setup streams read configuration, not live availability or webhook deliveries:

  • user_availability_schedules returns availability rules, not bookable time slots or calendar busy times.
  • locations lists the meeting location types configured for each member, not the locations of booked meetings. Read scheduled_events for meeting-specific locations.
  • webhook_subscriptions lists existing subscriptions. It doesn't create subscriptions or receive webhook event payloads. Read scheduled_events and event_invitees for bookings and cancellations.

Incremental sync behavior​

Every incremental sync requests scheduled_events from the configured start date and emits the events whose updated_at changed since the previous sync, including upcoming events, cancellations and reschedules. Each sync therefore pages through all events from the start date, as many scheduled_events requests as a Full refresh; on the Free plan, large histories need a later start date or less frequent syncs. lookback_days makes incremental syncs also re-emit the events whose updated_at falls within that many days before the last synced update, and read their invitees again. Because every sync already pages through all events from the start date, 0 is right for most connections. In every sync mode, an event updated after a sync starts is left out of that sync, with its invitees, and the next sync that reads it before it changes again emits it; in Full refresh | Overwrite its rows are missing from the destination until then.

event_invitees follows the scheduled_events state and reads all invitees of each new or changed event again. Calendly does not document which invitee changes, such as a no-show or one invitee leaving a group event, update the event's updated_at; an invitee change that leaves the event unchanged reaches the destination with the next change to that event or a Full refresh of event_invitees.

The first sync after upgrading to 1.0.0 ignores the state saved by earlier versions and reads every event from your start date again, with all of its invitees. In Incremental | Append mode this appends one more copy of each event and invitee. See the 1.0.0 migration guide.

Limitations and troubleshooting​

Plan-gated streams​

Routing forms and their submissions require Teams, outgoing communications and activity logs require an Enterprise subscription, meeting recaps require a paid plan with Notetaker enabled, and Calendly documents a paid-plan error for contacts. When Calendly reports that the plan or feature is unavailable, these streams complete without records and log a message explaining the requirement. Missing read scopes, owner or admin permission errors, and other forbidden responses still fail the sync.

Calendly documents activity log entries and outgoing communications as Enterprise endpoints.

Rate limits​

Calendly limits API requests to 500 requests per user per minute on paid plans and 50 on the Free plan. Other applications using the same Calendly user share this allowance. If other connections or applications use the same Calendly account, lower Number of concurrent workers (num_workers).

The connector monitors X-RateLimit-Remaining and waits when the allowance is exhausted. If Calendly returns HTTP 429, the connector retries after the delay in X-RateLimit-Reset. Syncing invitees and routing form submissions requires requests for each scheduled event and form, so large histories can take longer to sync.

Troubleshooting​

SymptomAction
HTTP 401: invalid or revoked tokenWith OAuth, re-authenticate in the Airbyte source settings. With a personal access token, create a new token and update the Airbyte source settings.
Calendly rejected the OAuth refresh tokenThe refresh token expired, was revoked or was already used. Re-authenticate in the Airbyte source settings.
HTTP 403: insufficient scope or permission deniedCheck the error for missing scopes. With a personal access token, create a token with the required read scopes. Authenticate with an organization owner or administrator account for organization-wide data such as scheduled events, webhook subscriptions, activity logs and outgoing communications. Update the credentials in Airbyte.
A plan-gated stream syncs no recordsCalendly reported that the plan or feature is unavailable; the sync log names the requirement. Routing forms require Teams; without access to forms, routing form submissions also complete empty.
A scheduled event, event type, member, group or routing form disappears during a syncThe connector logs and skips that event's invitees, that event type's hosts and availability schedules, that member's availability schedules and locations, that group's relationships, or that form's submissions, then continues. A 404 on other endpoints fails the sync.
New bookings or cancellations are missingUpgrade to 1.0.0; its first sync reads every event from your start date again. See the 1.0.0 migration guide. Confirm that the connection's start date covers the event.

IP allow list​

If you use Airbyte Cloud and your organization restricts access to specific IPs, add the Airbyte Cloud IP addresses to your allow list.

Reference​

Config fields reference

Field
Type
Property name
string
api_key
string
start_date
number
lookback_days

Changelog​

Version 1.0.0 is a breaking change. Before you upgrade from 0.x, read the 1.0.0 migration guide.

Expand to review
VersionDatePull RequestSubject
1.2.12026-11-1292570Certify the connector
1.2.02026-11-1292513Allow OAuth token refresh under egress enforcement, add event-type availability schedules, and make concurrent workers configurable.
1.1.02026-11-1291296Add OAuth authentication as the default; personal access tokens remain available and existing configurations keep working
1.0.02026-11-1190864Fix incremental syncs missing new bookings and cancellations by using updated_at as the scheduled_events cursor, and declare date-time and integer types on existing fields
0.4.22026-11-1091376Update dependencies
0.4.12026-11-0991293Fix syncs that failed on routing_forms and routing_form_submissions below the Calendly Teams plan, and on group_relationships in organizations without groups
0.4.02026-11-0490848Add routing forms and submissions, contacts, outgoing communications, activity logs and meeting recaps streams; they need the new routing_forms:read, contacts:read, outgoing_communications:read, activity_log:read and meeting_recaps:read scopes
0.3.02026-11-0490847Add teams, event type memberships, group relationships, user availability schedules, locations, organization invitations and webhook subscriptions streams; user availability schedules, locations and webhook subscriptions need the new availability:read, locations:read and webhooks:read scopes
0.2.02026-11-0390829Handle rate limits and token errors, declare missing fields, fix the crash when lookback_days is unset, and include event types updated before 2021 and invitees booked before the start date.
0.1.582026-11-0390473Update dependencies
0.1.572026-10-2789813Update dependencies
0.1.562026-10-2089122Update dependencies
0.1.552026-10-1388545Update dependencies
0.1.542026-10-0687778Update dependencies
0.1.532026-09-2987092Update dependencies
0.1.522026-09-2286548Update dependencies
0.1.512026-09-1585958Update dependencies
0.1.502026-09-0885409Update dependencies
0.1.492026-08-1884504Update dependencies
0.1.482026-08-1183834Update dependencies
0.1.472026-08-0483371Update dependencies
0.1.462026-07-2882826Update dependencies
0.1.452026-07-2182322Update dependencies
0.1.442026-07-1481752Update dependencies
0.1.432026-06-3080989Update dependencies
0.1.422026-06-2380355Update dependencies
0.1.412026-06-1679778Update dependencies
0.1.402026-06-0979236Update dependencies
0.1.392026-06-0278555Update dependencies
0.1.382026-04-2877167Update dependencies
0.1.372026-04-2176522Update dependencies
0.1.362026-03-3175659Update dependencies
0.1.352026-03-1774912Update dependencies
0.1.342026-03-1074632Update dependencies
0.1.332026-03-0373791Update dependencies
0.1.322026-02-0372615Update dependencies
0.1.312026-01-2072052Update dependencies
0.1.302026-01-1471456Update dependencies
0.1.292025-12-1870622Update dependencies
0.1.282025-11-2569971Update dependencies
0.1.272025-11-1869431Update dependencies
0.1.262025-10-2968715Update dependencies
0.1.252025-10-2168240Update dependencies
0.1.242025-10-1467837Update dependencies
0.1.232025-10-0767205Update dependencies
0.1.222025-09-3066320Update dependencies
0.1.212025-08-0964664Update dependencies
0.1.202025-08-0264409Update dependencies
0.1.192025-07-2663801Update dependencies
0.1.182025-07-1963484Update dependencies
0.1.172025-07-1263040Update dependencies
0.1.162025-06-2862148Update dependencies
0.1.152025-06-2161888Update dependencies
0.1.142025-05-2860946update scheduled events to ingest future events
0.1.132025-05-2460689Update dependencies
0.1.122025-05-1059878Update dependencies
0.1.112025-05-0359314Update dependencies
0.1.102025-04-2658702Update dependencies
0.1.92025-04-1958247Update dependencies
0.1.82025-04-1257661Update dependencies
0.1.72025-04-0557123Update dependencies
0.1.62025-03-2956618Update dependencies
0.1.52025-03-2256087Update dependencies
0.1.42025-03-0855375Update dependencies
0.1.32025-03-0154839Update dependencies
0.1.22025-02-2254274Update dependencies
0.1.12025-02-1551240Update dependencies
0.1.02025-02-1252566Add stream organization members, groups, available event types, and scheduled events.
0.0.82024-12-2850462Update dependencies
0.0.72024-12-2150152Update dependencies
0.0.62024-12-1449551Update dependencies
0.0.52024-12-1249275Update dependencies
0.0.42024-12-1149022Use a rootless Docker image compatible with Airbyte 0.64 and later.
0.0.32024-11-0448279Update dependencies
0.0.22024-10-2847568Update dependencies
0.0.12024-09-01Initial release by @natikgadzhi via Connector Builder