---
title: "Your booking profile, link types and public URL"
method: GET
path: "/api/booking-profile"
tags: ["Booking links"]
---

# Your booking profile, link types and public URL

`GET /api/booking-profile`

## Request

- Base URL: `https://whenmeet.me`
- URL: `https://whenmeet.me/api/booking-profile`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__Host-session`

profile is null until the first /links visit (or POST /api/booking-profile/ensure).

## Response `200`

Profile + link types.

- BookingProfileResponse
  - `profile` Profile
    - `handle` string
    - `displayName` string, nullable
    - `welcome` string, nullable: Intro shown on the public page.
    - `timezone` string: IANA zone the weekly hours are expressed in.
    - `weeklyHours` WeeklyHours: Working hours per weekday in the profile timezone, or in hoursTimezone for a personal link override: up to 6 ["HH:MM","HH:MM"] intervals per day ("24:00" allowed as an end). Missing days mean no hours; overlapping intervals merge. Profile default Mon–Fri 09:00–17:00.
      - `mon` array[]
        - string[]
      - `tue` array[]
        - string[]
      - `wed` array[]
        - string[]
      - `thu` array[]
        - string[]
      - `fri` array[]
        - string[]
      - `sat` array[]
        - string[]
      - `sun` array[]
        - string[]
    - `createdAt` integer: unix ms
    - `updatedAt` integer: unix ms
  - `suggestedHandle` string
  - `eventTypes` EventType[]
    - `id` string
    - `slug` string
    - `title` string
    - `description` string, nullable
    - `durationMin` integer
    - `conference` 'meet' | 'teams' | 'null', nullable
    - `bufferBeforeMin` integer
    - `bufferAfterMin` integer
    - `minNoticeMin` integer
    - `maxDaysAhead` integer
    - `slotStepMin` integer
    - `dailyLimit` integer, nullable
    - `questions` BookingQuestion[]
      - `id` string, required
      - `label` string, required
      - `type` 'text' | 'textarea', required
      - `required` boolean, required
    - `weeklyHours` WeeklyHours: Working hours per weekday in the profile timezone, or in hoursTimezone for a personal link override: up to 6 ["HH:MM","HH:MM"] intervals per day ("24:00" allowed as an end). Missing days mean no hours; overlapping intervals merge. Profile default Mon–Fri 09:00–17:00.
      - `mon` array[]
        - string[]
      - `tue` array[]
        - string[]
      - `wed` array[]
        - string[]
      - `thu` array[]
        - string[]
      - `fri` array[]
        - string[]
      - `sat` array[]
        - string[]
      - `sun` array[]
        - string[]
    - `hoursTimezone` string, nullable: Timezone for the personal link’s weeklyHours override; null when following the profile.
    - `reminders` integer[]: Minutes before the start, sorted descending; [] = off.
    - `active` boolean
    - `position` integer
    - `url` string, uri: Public booking URL, e.g. https://whenmeet.me/@anna/intro
    - `team` object, nullable
      - `mode` 'all' | 'any'
      - `members` TeamMember[]
        - `email` string, email
        - `name` string, nullable
        - `status` 'pending' | 'active' | 'declined'
        - `isOwner` boolean
        - `visibility` 'self' | 'org' | 'none': self = joined, their own calendar is used; org = not joined yet but your calendar account can see their free/busy (same Workspace / Microsoft 365 org); none = not visible until they join (excluded from the check).
        - `hours` ParticipantHours: The working hours a team participant is checked against (owner view only — never public). Every teammate is checked against their OWN hours: own = their booking profile (also your own entry); default = joined but no profile yet: Mon–Fri 09:00–17:00 in their account timezone (UTC if unknown); owner = not joined yet (pending / declined): your hours and zone.
          - `weeklyHours` WeeklyHours, required: Working hours per weekday in the profile timezone, or in hoursTimezone for a personal link override: up to 6 ["HH:MM","HH:MM"] intervals per day ("24:00" allowed as an end). Missing days mean no hours; overlapping intervals merge. Profile default Mon–Fri 09:00–17:00.
            - `mon` array[]
              - …
            - `tue` array[]
              - …
            - `wed` array[]
              - …
            - `thu` array[]
              - …
            - `fri` array[]
              - …
            - `sat` array[]
              - …
            - `sun` array[]
              - …
          - `tz` string, required: IANA zone the hours are in.
          - `source` 'own' | 'default' | 'owner', required
      - `health` TeamHealth: Can this team link take bookings right now? The same strict calendar read the public page does (today in the link zone + 14 days), served from its 60 s cache. Inactive links are not read and report ok.
        - `ok` boolean, required
        - `reason` 'member_unreadable' | 'no_checkable_member' | 'null', nullable, required: member_unreadable = an "all" participant, or every "any" participant, can’t be read (an "any" link with only some unreadable stays ok); no_checkable_member = nobody can be checked, or you have no calendar connected.
        - `memberEmail` string, nullable, required: The first unreadable participant (member_unreadable only).
    - `teamHandle` string, nullable: The team link’s own handle (null for personal links and team links without one).
    - `teamName` string, nullable
    - `teamUrl` string, uri, nullable: https://whenmeet.me/@<teamHandle>, or null.
  - `hasCalendar` boolean
  - `calendarOk` boolean: The booking page can read the calendar right now (false: revoked / expired token or missing scope — reconnect).
  - `publicUrl` string, uri, nullable

## Other responses

- `401`: unauthenticated (no session or token), or invalid_token (a Bearer token that is malformed, unknown or revoked — never a silent anonymous fallback).

---

[API](https://skmtc.dev/whenmeet/apis/whenmeet-me-api.md) · [All operations](https://skmtc.dev/whenmeet/apis/whenmeet-me-api/llms.txt) · [OpenAPI document](https://skmtc.dev/whenmeet/apis/whenmeet-me-api/revisions/202b80022215?raw)
