Bookings API: POST /appointments returns HTTP 500 UnknownError with empty message (application permissions)

Kayahan Yilmaz 0 Reputation points
2026-07-18T17:41:09.3066667+00:00

Subject: Graph API — POST /solutions/bookingBusinesses/{id}/appointments returns HTTP 500 UnknownError with empty message

Hi,

We are building a custom booking flow against the Microsoft Bookings Graph API using application permissions (client credentials). All read endpoints work correctly, but every POST to /appointments fails with HTTP 500 "UnknownError" and an empty message body. We would like your engineering team to look up the request-ids below in your server-side logs, as the error gives us no diagnosable information.

Tenant ID: <PII removed>

App (client) ID: <PII removed>

Booking business: <PII removed>

Datacenter: Germany West Central

Failing request:

POST https://graph.microsoft.com/v1.0/solutions/bookingBusinesses/<PII removed>/appointments

Response (consistent across all attempts):

{ "error": { "code": "UnknownError", "message": "", "innerError": { ... } } }

Graph request-ids:

  • <PII removed>
  • <PII removed>
  • <PII removed>
  • <PII removed>

What works (same token, same app):

  • OAuth2 client credentials token acquisition
  • GET /services, GET /staffMembers
  • POST /getStaffAvailability (returns correct available/busy/outOfOffice data)

What we have already ruled out:

  1. Permissions/consent — JWT decode of the access token shows roles: ["Bookings.ReadWrite.All", "BookingsAppointment.ReadWrite.All"], aud: https://graph.microsoft.com, idtyp: app. Both are Application permissions with admin consent granted.
  2. Request body — we initially received HTTP 400 ("input was not valid"); after correcting to start/end + customerTimeZone + flat customer fields the 400 disappeared and the 500 began. The minimal body from your own reference documentation also returns 500.
  3. postBuffer — fails with PT0M as well.
  4. staffMemberIds — fails with the field omitted entirely.
  5. Time slot conflicts — tested four different dates (10, 14, 15, 16 July 2026), including slots that getStaffAvailability explicitly returned as "available", within business hours (Mon–Fri 08:00–18:00) and outside the 24-hour minimum lead time.
  6. Service configuration — no required custom fields, no custom questions, maxAttendeesCount = 1.
  7. ApplicationAccessPolicy — created via Exchange Online PowerShell and verified (IsValid: True), scoped to a security-enabled distribution group containing the Bookings mailbox. Waited more than 24 hours for propagation.

Questions:

  1. What is the actual server-side error behind these request-ids?
  2. Does a Bookings mailbox require any authorization beyond Graph application permissions and an ApplicationAccessPolicy for app-only writes to /appointments?
  3. Is this a known issue on this endpoint in the Germany West Central datacenter?

I have a full configuration and troubleshooting document available if useful.

Thanks,

<PII removed>

Microsoft 365 and Office | Development | Office JavaScript API
0 comments No comments

1 answer

Sort by: Oldest
  1. Anonymous
    2026-07-20T06:57:42.51+00:00

    Hi @Kayahan Yilmaz

    Please note that our forum is a public platform, and we will modify your question to hide your personal information in the description. Kindly ensure that you hide any personal or organizational information the next time you post an error or other details to protect personal data.

    I was able to reproduce the same behavior in my test environment. The request is accepted by Microsoft Graph, but the POST/solutions/bookingBusinesses/{bookingBusinessId}/appointments call consistently returns 500 Internal Server Error with an UnknownError response.

    I verified that the issue does not appear to be related to the basic configuration because:

    • The access token is generated successfully.
    • The required application permissions are configured and consented.
    • The Bookings business can be accessed.
    • Services and staff members can be retrieved successfully.

    Since the issue is reproducible and other Graph Bookings operations are working as expected, the issue does not appear to be caused by an obvious client-side configuration issue.

    After doing some additional research, I found other users reporting similar behavior. The issue appears to be related to the request payload format used for creating bookingAppointment. The payload needs to match the microsoft.graph.bookingAppointment schema.

    I tested the following payload in my environment, and it works successfully:

    {
      "@odata.type": "#microsoft.graph.bookingAppointment",
      "serviceId": "<your-service-id>",
      "staffMemberIds": [
        "<your-staff-member-id>"
      ],
      "startDateTime": {
        "@odata.type": "#microsoft.graph.dateTimeTimeZone",
        "dateTime": "2026-07-24T10:00:00.0000000",
        "timeZone": "W. Europe Standard Time"
      },
      "endDateTime": {
        "@odata.type": "#microsoft.graph.dateTimeTimeZone",
        "dateTime": "2026-07-24T10:30:00.0000000",
        "timeZone": "W. Europe Standard Time"
      },
      "customers": [
        {
          "@odata.type": "#microsoft.graph.bookingCustomerInformation",
          "name": "<customer-name>",
          "emailAddress": "<customer-email>"
        }
      ]
    }
    

    This is the result:

    User's image

    Please try this payload and let me know if it resolves the issue in your environment.

    Reference: MS Bookings API Error - POST /solutions/bookingBusinesses/{id}/appointments - Microsoft Q&A

    As this is a user-to-user support forum, we do not have access to Microsoft internal service logs or backend telemetry and cannot investigate the server-side exception associated with the request IDs. Based on the troubleshooting performed and the successful reproduction, I recommend opening a Microsoft support case and providing the request IDs, timestamps, tenant ID, app ID, and booking business details. Microsoft Support can trace the requests through the Bookings backend logs and determine the underlying cause of the HTTP 500 response.
    Thank you for your understanding.


    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.  

    Was this answer helpful?


Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.