Calendly
The Calendly integration lets Helios agents read and change your Calendly scheduling data, contacts, and meeting recaps through its REST API, and run agents automatically on bookings, cancellations, no-shows, routing form submissions, event type and contact changes, and meeting recaps.
What your agents can do
Helios agents use Calendly API v2 to read and update scheduling data. Access depends on the connected user's permissions, token scopes, and Calendly plan.
- Find open times for an event type, and book a meeting at one through Calendly's Scheduling API
- Share an event type's booking link, or create a single-use link
- List upcoming meetings with their invitees and answers, cancel a meeting with a reason, and mark no-shows
- Create and update event types and their availability
- Look up and update contacts, and read meeting recaps and transcripts from Calendly Notetaker
- Look up routing form submissions and the meetings they led to
Calendly's API can't reschedule a meeting. An agent can share the invitee's reschedule link instead. The agent's API tool can only reach api.calendly.com.
Booking meetings
The agent books through Calendly's Scheduling API, POST /invitees. Calendly then sends the same emails and calendar invites as a booking made on the booking page.
- Plan: the Scheduling API needs a paid Calendly plan, Standard or higher.
- Booking limits: a trial account can book 5 meetings a day per user. Paid plans below Enterprise allow 10 bookings a minute, 50 an hour, and 100 a day per user. Enterprise allows 500 a minute.
- Booking questions: the agent must answer every required question on the event type, with the question text exactly as written. An event type with a location also needs the location in the request.
Authentication
| Method | Type | Description |
|---|---|---|
| Calendly Personal Access Token | API Key | A personal access token from a Calendly user |
| Your own Calendly OAuth app | OAuth 2.0 | An OAuth app you create in Calendly's developer portal |
See Integration authentication for how credentials are stored and injected.
Scopes
Give both methods every scope, so agents can reach the whole API and triggers can receive every event.
| Scope | What it's for |
|---|---|
availability:read | Read open times, busy times, and availability schedules |
availability:write | Change an event type's availability |
event_types:read | Read event types and booking links, and list them for the event type filter. Needed for event_type.* events |
event_types:write | Create and update event types, including one-off event types |
locations:read | Read the user's meeting locations |
routing_forms:read | Read routing forms and submissions, and list them for the routing form filter. Needed for routing_form_submission.created |
shares:write | Create single-use booking links with custom settings |
scheduled_events:read | Read meetings, invitees, and no-shows. Needed for invitee.* and invitee_no_show.* events |
scheduled_events:write | Book meetings through the Scheduling API, cancel meetings, and mark no-shows |
scheduling_links:write | Create single-use booking links |
groups:read | Read groups and their members |
organizations:read | Read the organization, its members, teams, and invitations, and the user's role |
users:read | Read users, and check the connection |
webhooks:read, webhooks:write | List, create, and delete the trigger webhooks |
contacts:read | Read contacts. Needed for contact.* events |
contacts:write | Create, update, and delete contacts |
meeting_recaps:read | Read meeting recaps and transcripts. Needed for meeting_recap.* events |
meeting_recaps:write | Update and delete meeting recaps |
These admin scopes reach features that only organization owners and admins can use:
| Scope | What it's for |
|---|---|
activity_log:read | Read the organization's activity log. Needs the Enterprise plan |
data_compliance:write | Delete invitee and meeting data for privacy requests. Needs the Enterprise plan |
organizations:write | Invite members to the organization and remove them |
outgoing_communications:read | Read the emails and text messages Calendly sent. Needs the Enterprise plan |
A :write scope includes the matching :read scope.
Calendly Personal Access Token
Any Calendly user can create a personal access token. For triggers that cover every member's meetings, and for routing form triggers, use a token from an organization owner or admin.
- In Calendly, open the Integrations page and select the API & Webhooks tile.
- Select Get a token now under Personal Access Tokens. If you already have a token, select Generate new token under Your personal access tokens.
- Name the token and check all six scope groups: Scheduling, User management, Contacts, Notetaker, Security & Compliance and Webhooks. That selects every scope in both tables above.
- Select Create Token. Calendly emails a verification code to the account's address. Enter it to finish.
- Select Copy token. Calendly doesn't show it again.
- In Helios, choose Calendly Personal Access Token and paste the token into Personal Access Token.
- Save.
Calendly revokes the token if the user's login email, password, or login method changes. Create a new token, enter it through Manage, and save.
Calendly records every change made with the token as the user who owns it.
Your own Calendly OAuth app
The developer account is separate from your Calendly user account.
-
Go to developer.calendly.com, click Sign Up in the top right, and sign up with GitHub or Google.
-
Create a new OAuth application. Choose web as the kind of application and Production as the environment.
-
Set the redirect URI to:
https://api.heliosapp.com/integrations/calendly/oauth_callback -
On the app's Scopes tab, check all six scope groups: Scheduling, User management, Contacts, Notetaker, Security & Compliance and Webhooks. To change the scopes later, open the app from My Apps and use the same tab.
-
On the next step, copy the Client ID, Client Secret, and Webhook signing key. Calendly shows the secret and the signing key only once.
-
In Helios, choose Your own Calendly OAuth app and enter the three values in Client ID, Client Secret, and Webhook Signing Key.
-
Check Admin access if an organization owner or admin will approve the app and agents need the admin scopes.
-
Save, then approve access in Calendly. Approve as an organization owner or admin for triggers that cover the whole organization.
Calendly signs every webhook of an OAuth app with the app's signing key, which is why Helios needs it. If you lose the signing key, ask Calendly at [email protected]. If you lose the client secret, Calendly can't show it again, so create a new app and enter its values through Manage.
Access tokens last two hours, and Helios renews them with the refresh token. Calendly issues a new refresh token on every renewal, and Helios stores it. Calendly revokes the tokens if the approving user's login email, password, or login method changes. Connect again if that happens, or after you change the app's scopes or Admin access.
Triggers
Calendly can start a Workflow when something happens in your account. Helios registers webhook subscriptions in Calendly when you save the connection, so there is nothing to set up in Calendly. They need the webhooks:write scope, and each event needs the read scope listed in Scopes.
When you delete the connection, Helios attempts to remove its webhooks. If cleanup fails, for example because the token was revoked or Calendly is unavailable, the connection is still deleted. Remove any remaining webhook subscriptions in Calendly.
Calendly webhooks need a paid Calendly plan: Standard, Teams, or Enterprise. On the Free plan, Calendly refuses to create the webhook. The connection still works for agents, but no events reach Helios.
What the webhooks cover depends on who connects:
- An organization owner or admin: one webhook covers the whole organization. A second webhook covers the owner's or admin's own meeting recaps, because Calendly sends meeting recap events only to webhooks for one user.
- Any other member: one webhook covers only that member's meetings, event types, contacts, and recaps. Routing form submissions aren't available, because Calendly sends them only to organization webhooks.
If the token lacks the read scope of some events, Helios registers the webhook for the other events. The trigger picker shows the events a connection can't receive as unavailable, with the reason. They stay unavailable until the connection changes. After you enter a token with the missing scopes, or after the user becomes an owner or admin, save the connection again.
| Event | Description | Filters |
|---|---|---|
invitee.created | An invitee booked a meeting or rescheduled to a new time | event type, part of a reschedule |
invitee.canceled | A meeting was canceled or rescheduled away from its time | event type, part of a reschedule |
invitee_no_show.created | A host marked an invitee as a no-show | event type |
invitee_no_show.deleted | A host removed an invitee's no-show mark | event type |
routing_form_submission.created | Someone submitted one of the organization's routing forms | routing form |
event_type.created | An event type was created | none |
event_type.updated | An event type was changed | event type |
event_type.deleted | An event type was deleted | event type |
contact.created | A contact was added by a booking, by hand or through the API | none |
contact.updated | A contact's details changed | none |
contact.deleted | A contact was deleted | none |
meeting_recap.created | Calendly Notetaker finished a recap of the connected user's meeting | none |
meeting_recap.updated | The summary, action items, discussion or share link of the connected user's meeting recap changed | none |
meeting_recap.deleted | A recap of the connected user's meeting was deleted | none |
All filters are optional, and you pick their values from a menu.
- Event type matches meetings and no-shows of the event types you pick. On
event_type.updatedandevent_type.deleted, it matches the event type that changed. - Part of a reschedule separates reschedules from new bookings and real cancellations. A reschedule sends
invitee.canceledfor the old time andinvitee.createdfor the new one. Set it to No to skip both, or Yes to match only reschedules. - Routing form matches submissions of the forms you pick. The menu needs a connection from an organization owner or admin.
Deliveries are verified with the HMAC-SHA256 Calendly-Webhook-Signature header. Helios rejects deliveries signed more than three minutes ago.
Calendly's delivery rules: when deliveries fail, Calendly retries for up to 24 hours. If no delivery succeeds in that time, it disables the webhook. Save the connection again to create a new one.
An agent that books a meeting starts another invitee.created run, and an agent that cancels one starts another invitee.canceled run. An agent that changes a contact or an event type starts another contact.updated or event_type.updated run. Use the filters, or say in the prompt which events to ignore. See Guarding against events you don't want.
Check that it works
- The connection: after you save, the connection's status shows Connected. Error means Calendly rejected the token. See Common errors.
- A trigger:
- Add
invitee.createdto a workflow with no filters. - Book a test meeting on one of your booking pages.
- Check that a run starts. Then open the connection in Helios and click Webhook events to see the event.
- Add
Common errors
| What you see | Cause | Fix |
|---|---|---|
| The connection's status shows Error | The token was revoked, or the user's login email, password, or login method changed | Create a new token and enter it through Manage, or connect the OAuth app again |
| An invalid scope error on Calendly's approval page | The OAuth app is missing a scope Helios asks for | Select every scope in both tables on the app, or uncheck Admin access, then connect again |
| An event shows as unavailable in the trigger picker | The token lacks the event's read scope. For routing forms, the connected user isn't an organization owner or admin | Create a token with every scope, or add the scope to the OAuth app and connect again. For routing forms, connect as an owner or admin, or save the connection again after the user becomes one |
Routing form triggers need a connection from a Calendly organization owner or admin | The connected user is a member, not an owner or admin | Connect with an owner's or admin's token, or approve the OAuth app as one |
Access token not found. Please complete the OAuth flow first. | The OAuth approval wasn't finished | Open the connection and connect again |
403 with Insufficient scope when the agent calls Calendly | The token lacks a scope the endpoint needs. The error names it in required_scopes | Create a token with every scope, or add the scope to the OAuth app and connect again. The admin scopes also need Admin access checked |
403 Forbidden when the agent books a meeting | The account is on the Free plan | Upgrade to Standard or higher |
403 Forbidden on the activity log, data deletion, or member invitations | The connected user isn't an organization owner or admin, or the account isn't on the Enterprise plan | Connect as an owner or admin. The activity log and data deletion also need Enterprise |
429 Too Many Requests when the agent books a meeting | The account reached its booking limit | Wait for the time in X-RateLimit-Reset |
| No run starts after an event | The account is on the Free plan, Calendly disabled the webhook after failed deliveries, the connected user isn't an owner or admin and the meeting belongs to someone else, or the filters don't match | Fix the cause, then save the connection again so Helios registers new webhooks. Test with no filters |
Limits
- Plans: the API works on every plan, including Free. Webhooks and the Scheduling API need Standard or higher. The activity log, data deletion, and outgoing communications need Enterprise.
- Rate limits: Calendly allows 500 requests a minute per user on paid plans, and 50 on the Free plan. Bookings have their own limits, listed under Booking meetings. See Calendly's rate limits.
Last updated on
Lusha
Enrich contacts and companies through Lusha's API. Start workflows on supported signals for watched contacts and companies, or on contact opt-outs.
Stripe
The Stripe integration lets Helios agents search and call the entire Stripe API to manage payments, customers, subscriptions, and reporting with a server-side secret key.