Skip to main content
Last modified: August 22, 2025
Use the meetings API to retrieve information about meetings created through a scheduling page. You can also book a meeting with a scheduling page through the API.
Please note: if you’re looking to manage meeting engagements on CRM record pages, check out the API guide here instead.
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.
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. 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.
  • Create meetings with payment.
  • Send in an IP address.
The sections below provides a walkthrough of how to use the v3 endpoints.

List meeting scheduling pages

To get a list of meetings scheduling pages, make a GET request to /scheduler/v3/meetings/meeting-links. Use the amount of meeting links you want returned as the limit in the request URL and use your userID, name, and type as a query parameter. To get and filter a list of meeting links, supply the filters you’d like to apply as query parameters (e.g., limit, type, and name), and provide your user ID as the organizerUserId query parameter. For example, if your user ID is 1234567, you’d make a GET request to /scheduler/v3/meetings/meeting-links?limit=1&name=menelson&organzerUserId=1234567&type=PERSONAL_LINK The response for fetching a list of meeting scheduling pages would resemble the following:
{
  "total": 1,
  "results": [
    {
      "id": "3779484",
      "slug": "menelson",
      "link": "https://meetings.hubspotqa.com/menelson",
      "name": "Sales Pro Demo",
      "type": "PERSONAL_LINK",
      "organizerUserId": "2195101",
      "userIdsOfLinkMembers": ["2195101"],
      "defaultLink": true,
      "createdAt": "2024-09-13T18:05:08.797Z",
      "updatedAt": "2024-09-13T18:43:35.116Z"
    }
  ]
}
The details of each response field are outlined in the table below:
FieldDescription
idThe ID of the activity.
slugThe end of the meeting link’s URL.
linkThe full meeting URL.
nameThe title of the meeting.
typeIndicates if the meeting is a one-on-one (PERSONAL_LINK), group (GROUP_CALENDAR), or round-robin (ROUND_ROBIN_CALENDAR) meeting link.
organizerUserIdThe user ID of the user who organized the meeting.
userIdsOfLinkMembersThe user IDs of the team members on the group or round robin meeting.
defaultLinkIndicates if the meeting is the user’s default meeting link.

List booking information

To get details about the initial information necessary for a meeting scheduler, make a GET request to /scheduler/v3/meetings/meeting-links/book/{slug} and provide the following in your request:
  • Use your unique meeting link ID as the slug path parameter. The default slug that’s used when creating a scheduling link is the first letter of the HubSpot user’s name followed by their last name. For example, the slug for “John Doe” would be jdoe.
  • Provide your time zone as the timezone query parameter (e.g., ?timezone=America/New_York for the New York time zone).
  • 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/v3/meetings/meeting-links/book/jdoe?timezone=America/New_York&monthOffset=2. The response would resemble the following:
{
  "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
  }
}

List availability

To get the next availability page for a meeting, make a GET request to /scheduler/v3/meetings/meeting-links/book/availability-page/{slug}. Use your meeting link path as the slug and your timezone as a query parameter. The response for fetching the availability page for a meeting would resemble the following:
{
  "linkAvailability": {
    "linkAvailabilityByDuration": {
      "1800000": {
        "meetingDurationMillis": 1800000,
        "availabilities": [
          {
            "startMillisUtc": 1725282000000,
            "endMillisUtc": 1725283800000
          },
          {
            "startMillisUtc": 1725282900000,
            "endMillisUtc": 1725284700000
          },
          {
            "startMillisUtc": 1726259400000,
            "endMillisUtc": 1726261200000
          }
        ]
      }
    },
    "hasMore": false
  },
  "allUsersBusyTimes": [
    {
      "isOffline": false,
      "meetingsUser": {
        "id": "1821619",
        "userId": "1234567",
        "isSalesStarter": true
      }
    }
  ]
}

Book a meeting

To book a meeting using a meeting link, make a POST request to /scheduler/v3/meetings/meeting-links/book/. Use your timezone as a query parameter. For example to book a meeting, make a POST request to /scheduler/v3/meetings/meeting-links/book?timezone=America%2FNew_York The request body should include the following information. Any information that’s required in your meeting registration must be included in the request body:
{
  "slug": "menelson",
  "firstName": "Melinda",
  "lastName": "Nelson",
  "email": "menelson@hubspot.com",
  "startTime": 1726059600000,
  "duration": 1800000,
  "guestEmails": [],
  "timezone": "America/New_York",
  "locale": "en-us",
  ],
  "likelyAvailableUserIds": []
}
//Response body sample
{
  "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 our 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 that 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.