---
title: "List the workspace's bookings"
description: "Returns the workspace's bookings ordered by start time, each with its attendees, booking_hosts, booking_seats, and service summary embedded."
api_method: GET
api_path: "/v1/bookings"
canonical_url: https://wiblo.app/docs/developers/api/bookings/list-bookings
last_updated: 2026-07-28T18:15:49+02:00
md_url: https://wiblo.app/docs/developers/api/bookings/list-bookings.md
---

# List the workspace's bookings

`GET /v1/bookings`

Returns the workspace's bookings ordered by start time, each with its attendees, booking_hosts, booking_seats, and service summary embedded. Filters: `from`/`to` bound the start time, `status` matches one booking status, and `member_id` keeps bookings where that member is organizer or co-host (via booking_hosts). Pagination via `limit` (default 50, max 100) and `offset`. Available to any active member. Per-user rate-limited at 60/60s.

## Query parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `from` | `string` | No | Only bookings starting at or after this timestamp (RFC 3339). |
| `to` | `string` | No | Only bookings starting at or before this timestamp (RFC 3339). |
| `status` | `"cancelled" \| "accepted" \| "rejected" \| "pending" \| "awaiting_host"` | No | Only bookings with this status. |
| `member_id` | `string` | No | Only bookings where this member is the organizer or a co-host (matched via `booking_hosts`). |
| `limit` | `integer` | No | Page size (1–100). Defaults to `50`. |
| `offset` | `integer \| null` | No | Rows to skip before the first result. Defaults to `0`. |

## 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?from=2026-08-01T00:00:00.000Z&to=2026-09-01T00:00:00.000Z&status=accepted" \
  -H "Authorization: Bearer $WIBLO_TOKEN" \
  -H "X-Wiblo-Workspace: $WIBLO_WORKSPACE_ID"
```

**TypeScript**

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

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

const { data, error } = await listBookings({
  client: sdk,
  query: { from: "2026-08-01T00:00:00.000Z", to: "2026-09-01T00:00:00.000Z", status: "accepted" },
  headers: { "X-Wiblo-Workspace": "..." },
})
```

## Example response

```json
{
  "bookings": [
    {
      "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
      }
    },
    {
      "id": "e4b9c2f8-6a1d-4f5b-a7e3-9c8d2b4f6a1c",
      "uid": "b6d2f8c4-1e9a-4b3d-9a5c-7f4e1d8b3c6a",
      "service_id": "3f8a2b9c-51d4-4e0b-9c6a-7d2e8f1a4b5c",
      "member_id": "8b3e6d2a-4c7f-4e1b-9d5a-2f6c8e3b7a1d",
      "title": "Initial consultation with Marcus Webb",
      "description": null,
      "location": "https://meet.example.com/acme",
      "start_time": "2026-08-21T13:00:00.000Z",
      "end_time": "2026-08-21T13: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-24T15:41:00.000Z",
      "updated_at": "2026-07-24T15:41:00.000Z",
      "attendees": [
        {
          "id": "d8f4b0c6-2a7e-4d1f-8b6a-3e9c5a7d1f4b",
          "name": "Marcus Webb",
          "email": "marcus@example.com",
          "time_zone": "America/New_York",
          "phone_number": null,
          "no_show": false
        }
      ],
      "booking_hosts": [
        {
          "member_id": "8b3e6d2a-4c7f-4e1b-9d5a-2f6c8e3b7a1d",
          "role": "organizer"
        }
      ],
      "booking_seats": [],
      "booking_resources": [],
      "service": {
        "id": "3f8a2b9c-51d4-4e0b-9c6a-7d2e8f1a4b5c",
        "title": "Initial consultation",
        "slug": "initial-consultation",
        "length": 30
      }
    }
  ]
}
```

## Responses

**`200`** — The matching bookings. Returns `ListBookingsResponse`.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `bookings` | `array<BookingSummary>` | Yes | The matching bookings, ordered by start time ascending. |

**`400`** — A query parameter failed validation, or the `X-Wiblo-Workspace` header was missing (`VALIDATION_FAILED`). Returns `ApiErrorEnvelope`.

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

**`404`** — The actor has no active membership in the header's workspace (`WORKSPACE_NOT_FOUND`). 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`.

### The BookingSummary object

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

### The BookingAttendeeSummary object

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | `string` | Yes | Unique id of the attendee row. |
| `name` | `string` | Yes | Attendee's display name. |
| `email` | `string` | Yes | Attendee's email address. |
| `time_zone` | `string` | Yes | Attendee's IANA time zone. |
| `phone_number` | `string \| null` | Yes | Attendee's phone number; `null` when not provided. |
| `no_show` | `boolean` | Yes | Whether the attendee has been marked a no-show; `false` by default. |

### The BookingHostSummary object

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `member_id` | `string` | Yes | Workspace member id of the host. |
| `role` | `"organizer" \| "host"` | Yes | `organizer` owns the slot; `host` co-attends (collective services and fixed round-robin hosts). |

### The BookingSeatSummary object

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | `string` | Yes | Unique id of the seat row. |
| `reference_uid` | `string` | Yes | The seat's own public handle — per-seat cancel keys off it. |
| `attendee_id` | `string` | Yes | Id of the attendee holding the seat. |

### The BookingResourceSummary object

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | `string` | Yes | Unique id of the resource hold row. |
| `resource_id` | `string` | Yes | Id of the resource this booking holds. |
