---
title: "Get a booking with its messages"
method: GET
path: "/api/projects/{id}/bookings/{externalId}"
tags: ["Bookings"]
---

# Get a booking with its messages

`GET /api/projects/{id}/bookings/{externalId}`

## Request

- Base URL: `https://dosai.pro`
- URL: `https://dosai.pro/api/projects/{id}/bookings/{externalId}`
- Auth: HTTP bearer

## Response `200`

Booking, wrapped in `data`.

- object
  - `data` Booking, required
    - `id` string, uuid, required
    - `external_id` string, nullable: Your id; null for bookings the assistant made in Google Calendar.
    - `source` 'calendar' | 'function' | 'api', required
    - `source_function` string, nullable
    - `status` 'scheduled' | 'cancelled', required
    - `client_name` string, nullable
    - `phone` string, nullable
    - `service` string, nullable
    - `channel` 'whatsapp' | 'telegram' | 'instagram' | 'null', nullable
    - `conversation_id` string, uuid, nullable
    - `start_at` string, date-time, required
    - `start_at_local` string, nullable: `start_at` in the project's time zone, with offset: check here how your time was understood.
    - `end_at` string, date-time, nullable
    - `end_at_local` string, nullable
    - `created_at` string, date-time
    - `messages` BookingMessage[], required
      - `id` string, uuid, required
      - `kind` 'confirmation' | 'reminder', required
      - `offset_minutes` integer, nullable: For a reminder: minutes before the visit.
      - `status` 'scheduled' | 'sent' | 'skipped' | 'failed' | 'cancelled', required
      - `send_at` string, date-time, required
      - `send_at_local` string, nullable: `send_at` in the project's time zone, with offset.
      - `sent_at` string, date-time, nullable
      - `skip_reason` string, nullable: Why it did not or will not go out: unknown_contact, instagram_window, night_skip, recent_conversation, after_due, past_due, booking_cancelled, channel_banned, previous_number, project_inactive, disabled, no_channel.
      - `body` string: The message text exactly as the client gets it.

## Other responses

- `401`: Missing, invalid, expired or revoked key.
- `403`: Not allowed. Distinguish by `code`: `INSUFFICIENT_SCOPE` (read-only key attempted a mutation), `API_KEY_PROJECT_SCOPE` (project-scoped key reached outside its project), `FORBIDDEN` (the user's role on this project is too low), `ACCOUNT_BANNED`.
- `404`: No such resource, or it belongs to another account.
- `429`: Too many requests. 120/min per key overall, plus a stricter per-endpoint budget. Retry after the number of seconds in Retry-After.

---

[API](https://skmtc.dev/dosai/apis/dos-ai-public-api.md) · [All operations](https://skmtc.dev/dosai/apis/dos-ai-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dosai/apis/dos-ai-public-api/revisions/38ce5f4e8f50?raw)
