---
title: Fetch a single booking
description: "Returns one booking by its public uid with attendees, booking_hosts, booking_seats (empty for non-seated services), and the service summary."
api_method: GET
api_path: "/v1/bookings/{uid}"
canonical_url: https://wiblo.app/docs/developers/api/bookings/get-booking
last_updated: 2026-07-28T18:15:49+02:00
md_url: https://wiblo.app/docs/developers/api/bookings/get-booking.md
---

# Fetch a single booking

`GET /v1/bookings/{uid}`

Returns one booking by its public uid with attendees, booking_hosts, booking_seats (empty for non-seated services), and the service summary. Unknown and cross-workspace uids collapse onto the same 404 `BOOKING_NOT_FOUND`. Available to any active member; the unauthenticated attendee view is the public signed-link surface (WIBLO-134), not this route. Per-user rate-limited at 60/60s.

## Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `uid` | `string` | Yes |  |

## Headers

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `X-Wiblo-Workspace` | `string` | Yes | Workspace id the call is scoped to. The actor must hold an active membership in it; a foreign or unknown id collapses onto 404 WORKSPACE_NOT_FOUND. |

## Request

**curl**

```bash
curl https://api.wiblo.app/v1/bookings/f2b8d4a6-9e1c-4c7b-8f3a-5d0e9b2c6a4e \
  -H "Authorization: Bearer $WIBLO_TOKEN" \
  -H "X-Wiblo-Workspace: $WIBLO_WORKSPACE_ID"
```

**TypeScript**

```ts
import { createSdk, getBooking } from "@workspace/sdk"

const sdk = createSdk({ baseUrl: "https://api.wiblo.app" })

const { data, error } = await getBooking({
  client: sdk,
  path: { uid: "f2b8d4a6-9e1c-4c7b-8f3a-5d0e9b2c6a4e" },
  headers: { "X-Wiblo-Workspace": "..." },
})
```

## Example response

```json
{
  "booking": {
    "id": "a7c3e9f1-2b5d-4e8a-9c1f-6d3b8a5e2c7f",
    "uid": "f2b8d4a6-9e1c-4c7b-8f3a-5d0e9b2c6a4e",
    "service_id": "3f8a2b9c-51d4-4e0b-9c6a-7d2e8f1a4b5c",
    "member_id": "5f2d8c1b-7e4a-4b9d-a6c3-1d8e5f2a7b4c",
    "title": "Initial consultation with Priya Shah",
    "description": "Scoping call for the autumn rebrand project.",
    "location": "https://meet.example.com/acme",
    "start_time": "2026-08-18T08:00:00.000Z",
    "end_time": "2026-08-18T08:30:00.000Z",
    "status": "accepted",
    "rescheduled": null,
    "rescheduled_by": null,
    "cancellation_reason": null,
    "cancelled_by": null,
    "recurring_event_id": null,
    "ical_sequence": 0,
    "created_at": "2026-07-28T10:24:00.000Z",
    "updated_at": "2026-07-28T10:24:00.000Z",
    "attendees": [
      {
        "id": "c9e5a1d7-3f6b-4a2e-b8d4-1c7f5e3a9b6d",
        "name": "Priya Shah",
        "email": "priya@example.com",
        "time_zone": "Europe/London",
        "phone_number": "+44 7700 900123",
        "no_show": false
      }
    ],
    "booking_hosts": [
      {
        "member_id": "5f2d8c1b-7e4a-4b9d-a6c3-1d8e5f2a7b4c",
        "role": "organizer"
      }
    ],
    "booking_seats": [],
    "booking_resources": [],
    "service": {
      "id": "3f8a2b9c-51d4-4e0b-9c6a-7d2e8f1a4b5c",
      "title": "Initial consultation",
      "slug": "initial-consultation",
      "length": 30
    }
  }
}
```

## Responses

**`200`** — The booking. Returns `BookingDetailResponse`.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `booking` | `object` | Yes | The requested booking. |
| `booking.id` | `string` | Yes | Unique id of the booking. |
| `booking.uid` | `string` | Yes | Public uid of the booking, used in booking route paths and signed links. |
| `booking.service_id` | `string \| null` | Yes | Id of the booked service; `null` when the service was hard-deleted (history survives). |
| `booking.member_id` | `string \| null` | Yes | The organizer's workspace member id; `null` for hostless resource bookings or when the member was hard-deleted. |
| `booking.title` | `string` | Yes | Booking title; an empty string when none was given. |
| `booking.description` | `string \| null` | Yes | Free-text description; `null` when none was given. |
| `booking.location` | `string \| null` | Yes | Where the booking happens; `null` when none was given. |
| `booking.start_time` | `string` | Yes | Slot start (RFC 3339). |
| `booking.end_time` | `string` | Yes | Slot end (RFC 3339). |
| `booking.status` | `"cancelled" \| "accepted" \| "rejected" \| "pending" \| "awaiting_host"` | Yes | Lifecycle status of the booking. |
| `booking.rescheduled` | `boolean \| null` | Yes | `true` once the booking has been rescheduled; `null` when it never has. |
| `booking.rescheduled_by` | `string \| null` | Yes | Who performed the last reschedule — the acting member's id, or `attendee` for public self-service reschedules; `null` when never rescheduled. |
| `booking.cancellation_reason` | `string \| null` | Yes | Reason supplied at cancellation; `null` when none was given or the booking is not cancelled. |
| `booking.cancelled_by` | `string \| null` | Yes | Who cancelled the booking — the acting member's id, or `attendee` for public self-service cancels; `null` when not cancelled. |
| `booking.recurring_event_id` | `string \| null` | Yes | The series linkage — one shared id across a recurring series' occurrence rows; `null` for single bookings. |
| `booking.ical_sequence` | `integer` | Yes | iCalendar SEQUENCE for calendar sync — starts at `0`, increments on reschedule, and jumps by 100 on cancellation. |
| `booking.created_at` | `string` | Yes | Creation timestamp (RFC 3339). |
| `booking.updated_at` | `string` | Yes | Last-update timestamp (RFC 3339). |
| `booking.attendees` | `array<BookingAttendeeSummary>` | Yes | The attendees on the booking. |
| `booking.booking_hosts` | `array<BookingHostSummary>` | Yes | The members hosting the booking (organizer plus co-hosts). |
| `booking.booking_seats` | `array<BookingSeatSummary>` | Yes | Seats on a seated booking; `[]` for non-seated services. |
| `booking.booking_resources` | `array<BookingResourceSummary>` | Yes | The concrete resources this booking holds; `[]` for services without resource requirements. |
| `booking.service` | `object \| null` | Yes | Summary of the booked service; `null` when the service was hard-deleted. |

**`401`** — No valid session cookie or `wbl_*` bearer was present. Returns `ApiErrorEnvelope`.

**`404`** — No booking visible to the actor with this uid in this workspace (`BOOKING_NOT_FOUND`), or the workspace itself collapsed (`WORKSPACE_NOT_FOUND`). Returns `ApiErrorEnvelope`.

**`422`** — Path param failed validation (`INVALID_PARAMS`). Returns `ApiErrorEnvelope`.

**`429`** — Rate limit exceeded. The body's `error.code` is `RATE_LIMITED` and `error.details.retry_after` is the same number of seconds as the `Retry-After` header. Returns `ApiErrorEnvelope`.
