> ## Documentation Index
> Fetch the complete documentation index at: https://developers.hubspot.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Meetings scheduler API (BETA)

> Use the meetings API to retrieve information about meetings created through a scheduling page, book a meeting, and manage payment link associations.

Use the meetings API to retrieve information about meetings created [through a scheduling page](https://knowledge.hubspot.com/meetings-tool/create-and-edit-scheduling-pages). You can also book a meeting with a scheduling page through the API, and manage the payment link attached with a scheduling page.

<Note>
  If you're looking to manage meeting activities on CRM record pages, check out the [meetings activity API](/docs/api-reference/latest/crm/activities/meetings/guide) instead.
</Note>

With the meetings API, you can:

* Get a list of meeting links.
* Get booking information for a meeting link.
* Get the next availability page for a meeting link.
* Update the payment link associated with a meeting link.

This could be useful if you have an app that can get a list of meeting links or book meetings. You could also use the meetings API to create an interface for your customers to book meetings with your team, or to programmatically manage payment collection on scheduled meetings.

The following features aren't supported when using the meetings API:

* UTM, HubSpot UTK, and content tracking.
* Reschedule through this API.
* Send in [CAPTCHA tokens](https://knowledge.hubspot.com/meetings-tool/create-and-edit-scheduling-pages#form).
* Create meetings with [payment links](https://knowledge.hubspot.com/meetings-tool/create-and-edit-scheduling-pages#scheduling) (payment links can be added via the [update endpoint](#update-meeting-link-payment-links)).
* Send in an IP address.

The sections below provide a walkthrough of how to use the endpoints.

## Retrieve meeting scheduling pages

To retrieve all meetings scheduling pages, make a `GET` request to `/scheduler/2027-03-beta/meetings/meeting-links`. Use the amount of meeting links you want returned as the limit in the request URL and use your [user ID](/docs/api-reference/latest/crm/objects/users/guide), name, and type as a query parameter.

You can filter the request using the following query parameters: `limit`, `type`, `name`, and `organizerUserId`.

The response will resemble the following:

```json theme={null}
{
  "total": 1,
  "results": [
    {
      "id": "339269",
      "slug": "my_meeting_slug",
      "link": "https://meetings.hubspot.com/my_meeting_slug",
      "name": "60 min, 30 min, and 15 min meeting",
      "type": "PERSONAL_LINK",
      "organizerUserId": "2859646",
      "defaultLink": true,
      "createdAt": "2026-08-31T14:15:39.690Z",
      "updatedAt": "2026-08-31T14:15:39.690Z"
    }
  ]
}
```

| Field                  | Type    | Description                                                                                                                                 |
| ---------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                   | String  | The ID of the meeting link.                                                                                                                 |
| `slug`                 | String  | The end of the meeting link's URL.                                                                                                          |
| `link`                 | String  | The full meeting URL.                                                                                                                       |
| `name`                 | String  | The title of the meeting.                                                                                                                   |
| `type`                 | String  | Indicates if the meeting is a one-on-one (`PERSONAL_LINK`), group (`GROUP_CALENDAR`), or round-robin (`ROUND_ROBIN_CALENDAR`) meeting link. |
| `organizerUserId`      | String  | The user ID of the user who organized the meeting.                                                                                          |
| `userIdsOfLinkMembers` | Array   | For group or round robin meetings, the user IDs of the team members.                                                                        |
| `defaultLink`          | Boolean | Indicates if the meeting is the user's default meeting link.                                                                                |
| `paymentLinkId`        | String  | The ID of the payment link associated with the scheduling page, if any.                                                                     |

## Retrieve booking information

To view a meeting link's booking and availability details, make a `GET` request to `/scheduler/2027-03-beta/meetings/meeting-links/book/{slug}?timezone={timeZone}` and provide the following in your request:

* `slug` (path parameter): the meeting link's slug. If it contains a forward slash, URL-encode it as `%2F`. For example, `troymcclure/my_meeting` becomes `troymcclure%2Fmy_meeting`.
* `timezone` (query parameter): the visitor's time zone (e.g., `America/New_York`). The API uses this to determine which month's availability windows to return based on the visitor's local date.
* By default, the response will only include results from the current month. To get availability information for a future month, you can include the `monthOffset` query parameter to specify the number of months forward from the current month (e.g., `monthOffset=2` would get availability two months from the current date).

For example, if a user's scheduling link is `https://meetings.hubspot.com/jdoe`, to get booking information in the New York time zone in two months, you'd make a `GET` request to `/scheduler/2027-03-beta/meetings/meeting-links/book/jdoe?timezone=America/New_York&monthOffset=2`.

The response would resemble the following:

```json expandable theme={null}
{
  "linkId": "123456",
  "isOffline": true,
  "customParams": {
    "legalConsentEnabled": false,
    "ownerPrioritized": false,
    "legalConsentOptions": {
      "legitimateInterestSubscriptionTypes": [
        5457724
      ],
      "communicationConsentCheckboxes": [
        {
          "communicationTypeId": "5457724",
          "label": "I agree to receive other communications from jkurien.com.",
          "required": false
        }
      ],
      "legitimateInterestLegalBasis": "LEGITIMATE_INTEREST_PQL",
      "communicationConsentText": "jkurien.com is committed to protecting and respecting your privacy, and we'll only use your personal information to administer your account and to provide the products and services you requested from us. From time to time, we would like to contact you about our products and services, as well as other content that may be of interest to you. If you consent to us contacting you for this purpose, please tick below to say how you would like us to contact you:",
      "processingConsentType": "IMPLICIT",
      "processingConsentText": "By clicking submit below, you consent to allow jkurien.com to store and process the personal information submitted above to provide you the content requested.",
      "processingConsentCheckboxLabel": "",
      "processingConsentFooterText": "",
      "privacyPolicyText": "You can unsubscribe from these communications at any time. For more information on how to unsubscribe, our privacy practices, and how we are committed to protecting and respecting your privacy, please review our Privacy Policy.",
      "isLegitimateInterest": false
    },
    "formFields": [],
    "displayInfo": {
      "companyAvatar": "https://example.com/hello.jpg",
      "publicDisplayAvatarOption": "PROFILE_IMAGE"
    },
    "guestSettings": {
      "canAddGuests": false,
      "maxGuestCount": 0
    },
    "meetingBufferTime": 900000,
    "availability": {
      "FRIDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ],
      "WEDNESDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ],
      "TUESDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ],
      "MONDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ],
      "THURSDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ]
    },
    "startTimeIncrementMinutes": "FIFTEEN",
    "weeksToAdvertise": 2,
    "durations": [
      900000,
      1800000,
      3600000
    ]
  },
  "linkType": "PERSONAL_LINK",
  "allUsersBusyTimes": [
    {
      "isOffline": true,
      "meetingsUser": {
        "id": "123456",
        "userId": "271921",
        "isSalesStarter": true,
        "userProfile": {
          "firstName": "John",
          "lastName": "Doe",
          "email": "jdoe@example.com",
          "fullName": "John Doe"
        },
        "calendarProvider": "GOOGLE"
      },
      "busyTimes": []
    }
  ],
  "brandingMetadata": {
    "logoWidth": 1920,
    "logoHeight": 1280,
    "showMarketingAd": false,
    "showSalesAd": false,
    "logoUrl": "https://example.com/hello.jpg",
    "logoAltText": "soup",
    "primaryColor": "#ebb70e",
    "secondaryColor": "#ebb70e",
    "accentColor": "#216bb4",
    "accent2Color": "#216bb4",
    "companyName": null,
    "companyDomain": "saltpigkitchen.com",
    "companyAddressLine1": "40 Fremont St",
    "companyAddressLine2": "#2",
    "companyCity": "Somerville",
    "companyState": null,
    "companyZip": "02145",
    "companyCountry": "US",
    "companyAvatar": "https://example.com/hello.jpg"
  },
  "linkAvailability": {
    "linkAvailabilityByDuration": {
      "900000": {
        "meetingDurationMillis": 900000,
        "availabilities": [
          {
            "startMillisUtc": 1760129100000,
            "endMillisUtc": 1760130000000
          },
          {
            "startMillisUtc": 1760360400000,
            "endMillisUtc": 1760361300000
          }
        ]
      },
      "1800000": {
        "meetingDurationMillis": 1800000,
        "availabilities": [
          {
            "startMillisUtc": 1760360400000,
            "endMillisUtc": 1760362200000
          },
          {
            "startMillisUtc": 1760361300000,
            "endMillisUtc": 1760363100000
          }
        ]
      },
      "3600000": {
        "meetingDurationMillis": 3600000,
        "availabilities": [
          {
            "startMillisUtc": 1760360400000,
            "endMillisUtc": 1760364000000
          },
          {
            "startMillisUtc": 1760361300000,
            "endMillisUtc": 1760364900000
          },
          {
            "startMillisUtc": 1760362200000,
            "endMillisUtc": 1760365800000
          }
        ]
      }
    },
    "hasMore": false
  }
}
```

## Retrieve availability

To get the next availability page for a meeting, make a `GET` request to `/scheduler/2027-03-beta/meetings/meeting-links/book/availability-page/{slug}?timezone={timezone}`.

If the `slug` contains a forward slash, URL-encode it as `%2F` (e.g., `troymcclure/my_meeting` becomes `troymcclure%2Fmy_meeting`). For example:

`/scheduler/2026-03/meetings/meeting-links/book/troymcclure%2Fbookme2026?timezone=America/New_York`

The response will resemble the following:

```json expandable theme={null}
{
  "linkId": "13256977",
  "isOffline": false,
  "customParams": {
    "legalConsentEnabled": false,
    "ownerPrioritized": false,
    "formFields": [],
    "guestSettings": {
      "canAddGuests": false,
      "maxGuestCount": 10
    },
    "meetingBufferTime": 900000,
    "availability": {
      "FRIDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ],
      "MONDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ],
      "THURSDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ],
      "TUESDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ],
      "WEDNESDAY": [
        {
          "start": 540,
          "end": 1020
        }
      ]
    },
    "startTimeIncrementMinutes": "FIFTEEN",
    "weeksToAdvertise": 2,
    "durations": [
      1800000
    ],
    "welcomeScreenInfo": {
      "useCompanyLogo": false,
      "showWelcomeScreen": false
    }
  },
  "linkType": "PERSONAL_LINK",
  "allUsersBusyTimes": [
    {
      "isOffline": false,
      "meetingsUser": {
        "id": "11286",
        "userId": "2931299",
        "isSalesStarter": true,
        "userProfile": {
          "firstName": "Troy",
          "lastName": "McClure",
          "email": "troymcclure@rememberme.com",
          "fullName": "Troy McClure"
        },
        "calendarProvider": "GOOGLE"
      },
      "busyTimes": []
    }
  ],
  "brandingMetadata": {
    "logoWidth": 128,
    "logoHeight": 128,
    "showMarketingAd": false,
    "showSalesAd": false,
    "primaryColor": "#376494",
    "secondaryColor": "",
    "accentColor": "#425b76",
    "accent2Color": "",
    "companyName": null,
    "companyDomain": "meowmix.org",
    "companyAddressLine1": "123 Fake St.",
    "companyAddressLine2": "2nd floor",
    "companyCity": "Springfield",
    "companyState": null,
    "companyZip": "01234"
  },
  "linkAvailability": {
    "linkAvailabilityByDuration": {
      "1800000": {
        "meetingDurationMillis": 1800000,
        "availabilities": [
          {
            "startMillisUtc": 1788204600000,
            "endMillisUtc": 1788206400000
          },
          {
            "startMillisUtc": 1788205500000,
            "endMillisUtc": 1788207300000
          },
          {
            "startMillisUtc": 1788206400000,
            "endMillisUtc": 1788208200000
          },
          {
            "startMillisUtc": 1788207300000,
            "endMillisUtc": 1788209100000
          },
          {
            "startMillisUtc": 1788208200000,
            "endMillisUtc": 1788210000000
          }
        ]
      }
    },
    "hasMore": true
  }
}
```

## Book a meeting

To book a meeting using a meeting link, make a `POST` request to `/scheduler/2027-03-beta/meetings/meeting-links/book?timezone={timezone}`.

The following request body fields are required:

* `slug`: the slug of the meeting link to book.
* `firstName`: the first name of the person booking the meeting.
* `lastName`: the last name of the person booking the meeting.
* `email`: the email address of the person booking the meeting.
* `startTime`: the requested start time of the meeting, as a Unix timestamp in milliseconds.
* `duration`: the duration of the meeting in milliseconds.

For example, to book a meeting, make a `POST` request to `/scheduler/2027-03-beta/meetings/meeting-links/book?timezone=America/New_York` with the following request body:

```json theme={null}
{
  "slug": "menelson",
  "firstName": "Melinda",
  "lastName": "Nelson",
  "email": "menelson@hubspot.com",
  "startTime": 1726059600000,
  "duration": 1800000,
  "guestEmails": [],
  "timezone": "America/New_York",
  "locale": "en-us",
  "likelyAvailableUserIds": []
}
```

The response will resemble the following:

```json theme={null}
{
  "calendarEventId": "6q0nonv2c1a73b1nqctf5rmo6g",
  "start": "2024-09-19T18:45:00Z",
  "duration": 1800000,
  "contactId": "1706743198",
  "bookingTimezone": "America/New_York",
  "locale": "en-us",
  "guestEmails": [],
  "subject": "Event Subject",
  "location": "Location Example",
  "isOffline": false,
  "end": "2024-09-19T19:15:00Z"
}
```

### Offline bookings

If the server was not able to access the user's calendar availability, either because the user did not have a calendar connected or because the calendar provider could not be reached, a meeting will be booked "offline". That means that no calendar event will be created, and the user will instead be sent a notification informing them of the time that a lead attempted to book a meeting with them.

In the case of an offline booking, `isOffline` will be set to `true` in the response body. The `calendarEventId` field will be set to `""`, indicating that no event ID was generated.

## Retrieve user calendar and meetings connection statuses

To view which HubSpot account users have connected their calendars, enabled calendar sync, and have scheduling pages turned on, use the [Users API](/docs/api-reference/latest/crm/objects/users/guide) to retrieve users with the following properties:

| Field                           | Description                                                                                                                                                                                                                                                                                     |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `hs_calendar_connection_status` | Whether the user's [calendar is connected to HubSpot](https://knowledge.hubspot.com/meetings-tool/use-meetings). Either `true` (connected), `false` (disconnected), or `null` (never connected).                                                                                                |
| `hs_calendar_sync_enabled`      | Whether the user has [calendar sync](https://knowledge.hubspot.com/meeting-tool/customize-connected-calendar-and-meeting-scheduling-page-settings) turned on to log meetings from their calendar to records in HubSpot. Either `true` (on), `false` (off), or `null` (never turned on).         |
| `hs_meetings_enabled`           | Whether the user has [scheduling pages](https://knowledge.hubspot.com/meeting-tool/customize-connected-calendar-and-meeting-scheduling-page-settings) turned on to allow contacts to book meetings on their connected calendar. Either `true` (on), `false` (off), or `null` (never turned on). |

For example, to check if a user has connected their calendar and turned on both calendar sync and meeting scheduling, make a `GET` request to `/crm/objects/2027-03-beta/users?properties=hs_calendar_connection_status,hs_calendar_sync_enabled,hs_meetings_enabled`.

### Attach a payment link

To attach a payment link, include its ID as the `paymentLinkId` in the request body:

```json theme={null}
{
  "paymentLinkId": "271025967279"
}
```

A successful response returns `200` with the updated meeting link metadata. The `paymentLinkId` field in the response reflects the current associated value:

```json theme={null}
{
  "id": "13256977",
  "slug": "ericdevenney/bookme2026",
  "link": "https://meetings.hubspot.com/ericdevenney/bookme2026",
  "name": "BookMe2026",
  "type": "PERSONAL_LINK",
  "organizerUserId": "2931299",
  "userIdsOfLinkMembers": [
    "2931299"
  ],
  "defaultLink": false,
  "createdAt": "2026-08-31T17:05:18.543Z",
  "updatedAt": "2026-09-08T15:40:05.821Z",
  "paymentLinkId": "1723570"
}
```

### Remove a payment link

To remove an existing payment link association, set `paymentLinkId` to `null`:

```json theme={null}
{
  "paymentLinkId": null
}
```

A successful response returns `200` with the updated meeting link metadata, where `paymentLinkId` reflects the removed state.
