Answer · Integrations

Is there an API for Microsoft Bookings available slots?

Last updated 4 min read6 sources

The question people ask
“Is there an API to get available time slots from Microsoft Bookings?”

Asked in stackoverflow.com (opens in a new tab)

Short answer

Not a slots API, no. Microsoft Graph has getStaffAvailability, which returns free and busy blocks for each staff member over a date range. It doesn't return the start times a customer can book. You turn those blocks into slots yourself, using the service length, buffers, time increment, lead time and maximum advance, and the Bookings page does this in a way that's easy to get wrong. The call needs an application permission with admin consent, and it doesn't cover "Bookings with me" personal pages at all.

What getStaffAvailability gives you#

  • Request: a POST on a booking business, with a list of staff IDs and a start and end date-time with time zones. The documented request doesn't include a service, so rules that belong to a service are yours to apply.
  • Response: for each staff member, a list of items with a status (for example Available or Busy), a start and an end.
  • Permissions: application only. The least privileged is Bookings.Read.All; delegated access is "Not supported". It's not available in the 21Vianet cloud. Permissions for the other Bookings calls are in Graph permissions for Bookings.
  • Throttling: Microsoft allows four concurrent requests per app ID and booking mailbox.

The accepted Stack Overflow answer (2020) builds slots on a clock grid from business hours, minus existing appointments. It's a reasonable start, but it won't match what customers see on the booking page, and it ignores the staff member's Outlook busy time.

How the booking page turns availability into slots#

What we saw when testing (September 2026)#

We captured the public Bookings page and the availability calls it makes: 13 live captures, 913 days and 7,924 slots, in several time zones. The page gets availability from the Microsoft server with working hours, Outlook busy time, existing bookings and service windows already applied. The page then works out slots in the browser.

  • Starts aren't aligned to the clock. A free block starting at 6:40 gives 6:40, 7:10 and so on. The step used to walk a block is the largest of 60, 30, 15, 10, 5, 2 or 1 minutes that divides the time increment (45 gives 15, 20 gives 10). A pre-buffer shifts the first start. More in odd start times.
  • Slots are thinned greedily. The page keeps a slot only if it's at least one time increment after the last one kept. That's why lists like 5:00, 5:30, 6:30 appear when 6:00 to 6:30 was busy.
  • Lead time: the earliest slot is now plus the minimum lead time plus about 3 minutes. If neither the service nor the page sets a lead time, the page code uses 1 day, a maximum advance of 365 days and a 30-minute increment.
  • The answer depends on the range you ask for. The same hour came back as out-of-office in one request and available in another. So days near a month boundary can differ depending on how you request them.
  • Personal pages use a different algorithm. Starts sit on a grid of the increment from local midnight, shifted by the pre-buffer, and blocks aren't merged. A slot has to start more than lead time plus 15 minutes from now.

We tested the calls the public page makes, not Graph against a live tenant, so treat the Graph response as similar in shape rather than proven identical.

Check again before you create the booking#

Microsoft says apps that create appointments with application permissions "must follow the business rules": business hours, service duration, lead time and staff selection. Our tests of the public booking service point the same way. Called directly, it accepted a booking inside the lead-time window (even one in the past) and one over a busy Outlook block. It only rejected a clash with another Bookings appointment. So check availability yourself, right before you create the booking.

Personal pages and the public page API#

  • "Bookings with me": Microsoft says the Graph Bookings API "applies only to shared bookings" and "is not applicable for personal bookings".
  • The public page: it calls its own availability service without sign-in. That service is undocumented and can change with any Microsoft update. It sends no CORS headers, so a script on your website can't call it from the browser; you need a server in between. From our server, reads took roughly 0.3 to 1.3 seconds. We haven't measured Graph response times, because we don't have tenant consent.

If you're building your own front end, see building a custom Bookings booking page. There's no event feed either; see Bookings webhooks.

Doing this with BookingsXP#

The BookingsXP booking widget works out slots the same way the Bookings page does. Replayed against the same 13 captures, it matched all 7,924 slots with 0 mismatches. That covers shared pages, plus the personal-page algorithm (support for "Bookings with me" is best-effort). Our server makes the calls from your public booking page link, so there's no Graph permission, app registration or admin consent. BookingsXP is independent and not affiliated with or endorsed by Microsoft.

Questions people also ask

Sources

  1. Microsoft Learn: Bookingbusiness getstaffavailability (opens in a new tab) · learn.microsoft.com
  2. Microsoft Learn: Booking api overview (opens in a new tab) · learn.microsoft.com
  3. Microsoft Learn: Bookingsbusiness business rules (opens in a new tab) · learn.microsoft.com
  4. Microsoft Learn: Bookingbusiness post appointments (opens in a new tab) · learn.microsoft.com
  5. Microsoft Learn: Throttling limits (opens in a new tab) · learn.microsoft.com
  6. Microsoft Learn: Set scheduling policies (opens in a new tab) · learn.microsoft.com