Get a booking
/bookings/{booking_id}Returns one booking, including the linked visit for confirmed in-person bookings.
Scope: bookings:read · Plan: Pro and Enterprise in live mode; every plan in test mode.
Send Authorization: Bearer <token> on every request. The token is one of:
| Prefix | What it is | Where it may be used |
|---|---|---|
agoo_sk_live_ | Secret key, live mode | Your servers only |
agoo_sk_test_ | Secret key, test mode | Your servers only |
agoo_pk_live_ | Publishable key, live mode | Browsers and apps: create pre-registrations and bookings, read public booking types (with their intake questions) and their free slots, read the visit types open for pre-registration with their public forms. Never lists people. |
agoo_pk_test_ | Publishable key, test mode | As above, in test mode |
Admins create keys in Console → Developers → API keys and choose each key's scopes. A key is shown once. Never put a secret key in a URL, a browser or a mobile app.
In: header
Scope: bookings:read
Path Parameters
The booking's ID.
^booking_[0-7][0-9a-hjkmnp-tv-z]{25}$"booking_01m4dtqd00eq4rtc1jdsr1gr6z"Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/bookings/booking_01m4dtqd00eq4rtc1jdsr1gr6z"{ "id": "booking_01m4dtqd00eq4rtc1jdsr1gr6z", "status": "confirmed", "booking_type_id": "btype_01kn44arm0eya81713cpbnfbpq", "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg", "start_at": "2026-10-16T10:00:00Z", "end_at": "2026-10-16T10:30:00Z", "time_zone": "Africa/Accra", "meeting_kind": "in_person", "site_id": "site_01kjpt3yw0fz0v414608h9x65s", "meeting_url": null, "address": null, "attendee": { "name": "Ama Owusu", "phone": "+233241234567", "email": "ama@coastline.example", "company": "Coastline Consult" }, "visit_id": "visit_01m4dtqdz8f59rarmdksqjprz9", "custom_fields": {}, "confirm_by": null, "confirmed_at": "2026-10-08T13:20:00Z", "declined_at": null, "decline_reason": null, "cancelled_at": null, "cancellation_reason": null, "created_at": "2026-10-08T13:20:00Z", "updated_at": "2026-10-08T13:20:00Z"}Create a booking POST
Books a slot from `GET /booking-types/{btype_id}/availability`. If the slot has been taken in the meantime, you get `conflict`; fetch availability again and offer another time. - If the booking type doesn't require host confirmation, the booking is `confirmed` straight away. Agoo confirms it to the attendee and the host, and sends reminders by your organisation's settings. - If it does (`requires_confirmation`), the booking starts as `pending` and holds its slot. Agoo tells the attendee their request was received and asks the host to confirm or decline it before `confirm_by`. See `POST /bookings/{booking_id}/confirm` and `/decline`. - Fires `booking.created` for every booking, with its `status`. - A confirmed `in_person` booking also creates an expected visit with a QR pass, so the attendee can check in on arrival. Its `visit_id` is set, and `visit.created` and `pass.sent` fire too. For a `pending` booking this happens when the host confirms it. - `custom_fields` are checked against the visit form for the booking type's `visit_type`. With a publishable key, they may contain only the fields in the booking type's `public_form`; a field your staff fill in returns `validation_failed` at `body.custom_fields.<key>`. - Leave `host_id` out to let Agoo pick a free host from the booking type's hosts. - A `booking_type_id` that isn't a booking type you can book (unknown, turned off, or private with a publishable key), or a `host_id` that isn't one of its hosts, returns `validation_failed`. **Scope:** `bookings:write` · **Plan:** Pro and Enterprise in live mode; every plan in test mode. **Publishable keys:** allowed for public booking types.
Reschedule a booking POST
Moves a `confirmed` booking to another free slot. Agoo tells the attendee and the host, moves the linked visit and fires `booking.rescheduled` (and `visit.updated` for in-person bookings). Returns `conflict` if the new slot isn't free and `invalid_state` if the booking isn't `confirmed`. A `pending` booking can't be moved; confirm or decline it first. **Scope:** `bookings:write` · **Plan:** Pro and Enterprise in live mode; every plan in test mode.