---
title: "Update an offering. Set active: false to pause booking; it stays in your dashboard. Setting waitlist_enabled false takes everyone waiting for its times off the waitlist and emails each of them that it closed."
method: PATCH
path: "/offerings/{id}"
tags: ["offerings"]
---

# Update an offering. Set active: false to pause booking; it stays in your dashboard. Setting waitlist_enabled false takes everyone waiting for its times off the waitlist and emails each of them that it closed.

`PATCH /offerings/{id}`

## Request

- Base URL: `https://daybag.io/api/v1`
- URL: `https://daybag.io/api/v1/offerings/{id}`
- Auth: HTTP bearer

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `name` string
  - `description` string
  - `location` string: Where it meets, as guests read it, with a Google Maps link: an address, a place with its town, or GPS coordinates ("45.6770, -111.0429"). Or an https meeting link (Zoom, Meet, Teams) for an offering online: guests get Join instead of a map, and its times on their own clock
  - `duration_minutes` integer: Length of a class session or appointment, or of one rental period (1440 = a day)
  - `capacity` integer: class: seats per session · appointment: parallel bookings per slot · rental: items in stock
  - `max_per_booking` integer: Most seats, people or items in one booking. An appointment is one-on-one at 1 (its default); more lets a guest book for a party
  - `price_cents` integer: class: per seat · appointment: per appointment, for its first person (see guest_price_cents) · rental: per item per period
  - `guest_price_cents` integer, nullable: appointment: what each additional guest in a party adds; null (the default) charges each the full price, 0 makes them free
  - `deposit_cents` integer, nullable: A deposit to hold a place, in the currency's minor units: where guests pay online at booking, they pay this much (at most the total) and the rest at the start. Null (the default) takes the whole total. One or the other with deposit_percent: setting one clears the other, both at once is 400 deposit_conflict
  - `deposit_percent` integer, nullable: A deposit as a percent of the total, 1 to 99, rounded half up to a whole minor unit (after any promo code). Null (the default) takes the whole total
  - `slot_interval_minutes` integer, nullable: Minutes between start times; null means back to back
  - `buffer_minutes` integer: Gap between bookings: minutes kept free before and after each one, for rentals and appointments on weekly hours (a calendar's times keep none)
  - `min_notice_minutes` integer: When booking closes: how many minutes before a time starts (0: open until it starts)
  - `max_advance_days` integer
  - `max_periods` integer: Rentals: the most periods one booking can span
  - `active` boolean: false pauses booking: guests and agents can't book it, and it stays in your dashboard
  - `metadata` object: Free-form JSON for your own integrations
  - `lat` number, nullable: The meeting point's latitude, for its map link and the weather call. A new location without lat and lon sets them from coordinates typed in it, or clears them
  - `lon` number, nullable: The meeting point's longitude
  - `place_id` string, nullable: Google Maps' place ID for the location, which the guest's map link opens; the dashboard's Location search sets it, and a new location without it clears it
  - `gauge_site` string, nullable: A USGS river gauge's site number (e.g. 13022500), for the river's flow
  - `schedule` 'hours' | 'calendar': Appointments only: open on weekly hours (offerings.set_hours) or on calendar entries (series.create), one or the other; new ones use the calendar, and it moves to hours only once its calendar has no times to come
  - `waiver_required` boolean: Each person booked signs your waiver on their phone before they come: one per seat or guest, one per rental booking. Needs your waiver's text first (waiver.update; 409 waiver_missing)
  - `waitlist_enabled` boolean: A full time keeps a waitlist: guests whose party doesn't fit join it from the booking page, and when a place opens everyone whose party fits is emailed at once (waitlist_list). Times on a calendar only: a class's, or an appointment's on its calendar (400 waitlist_not_supported)
  - `questions` object[]: What guests answer as they book, up to 6, in this order; the whole list replaces the last. bookings.create takes their answers keyed by each question's id
    - `id` string: Keep a question's id to keep the answers given to it; a new question gets one
    - `label` string, required: The question as guests read it, e.g. Shoe size
    - `type` 'text' | 'yes_no' | 'choice', required: text: a line in their words · yes_no: yes or no · choice: one of its options
    - `options` string[]: A choice's options, 2 to 8, each once; the other types take none
    - `required` boolean: Guests must answer it to book (false by default)
  - `course` boolean: Classes only (409 not_a_class): sell it as a course. One booking (bookings.create's series_id) takes a seat in every time of a calendar entry from its first to come, at price_cents per seat for the whole course; a repeating entry needs ends_on. No waitlist (409 waitlist_conflict)

## Response `200`

Success

- object
  - `id` string, required
  - `org_id` string, required
  - `kind` 'class' | 'appointment' | 'rental', required: class: sessions with seats, from its calendar · appointment: times from its calendar or weekly hours · rental: inventory over periods
  - `name` string, required
  - `description` string, required
  - `location` string, required: Where it meets, as guests read it: an address, a place or GPS coordinates. Or an https meeting link for an offering online, which guests join
  - `duration_minutes` integer, required: Length of a class session or appointment, or of one rental period (1440 = a day)
  - `capacity` integer, required: class: seats per session · appointment: parallel bookings per slot · rental: items in stock
  - `max_per_booking` integer, required: Most seats, people or items in one booking. An appointment is one-on-one at 1 (its default); more lets a guest book for a party
  - `price_cents` integer, required: class: per seat · appointment: per appointment, for its first person (see guest_price_cents) · rental: per item per period
  - `guest_price_cents` integer, nullable: appointment: what each additional guest in a party adds; null (the default) charges each the full price, 0 makes them free
  - `deposit_cents` integer, nullable: A deposit guests pay at booking where they pay online, in the currency's minor units (at most the total); the rest is due at the start. Null: the whole total
  - `deposit_percent` integer, nullable: A deposit as a percent of the total, 1 to 99, paid at booking where guests pay online; null: the whole total
  - `slot_interval_minutes` integer, nullable, required: Minutes between start times; null means back to back
  - `buffer_minutes` integer, required
  - `min_notice_minutes` integer, required
  - `max_advance_days` integer, required
  - `max_periods` integer, required: Rentals: the most periods one booking can span
  - `active` boolean, required: false pauses booking: guests and agents can't book it, and it stays in your dashboard
  - `metadata` unknown, required
  - `lat` number, nullable: The meeting point's latitude, for its map link and the weather call
  - `lon` number, nullable
  - `place_id` string, nullable: Google Maps' place ID for the location, which the guest's map link opens
  - `gauge_site` string, nullable: A USGS river gauge's site number
  - `schedule` 'hours' | 'calendar', nullable: An appointment's: weekly hours or calendar entries; null for other kinds
  - `waiver_required` boolean: Each person booked signs your waiver (waiver.get) on their phone before they come
  - `waitlist_enabled` boolean: A full time keeps a waitlist that guests join, emailed when a place opens (waitlist_list). Switched off, everyone waiting comes off and is emailed
  - `course` boolean: A class sold as a course: availability.get lists each calendar entry that ends as one slot, and bookings.create takes its series_id to book every time of it
  - `questions` object[]: What guests answer as they book, in this order: ask the guest, then pass the answers to bookings.create as answers, keyed by each question's id
    - `id` string, required: bookings.create takes the answer to this question under this id
    - `label` string, required: The question as guests read it
    - `type` string, required: text: a line in their words · yes_no: true or false · choice: one of its options
    - `options` string[]: A choice's options: its answer is one of them, as listed
    - `required` boolean, required: Guests must answer it to book online
  - `photo_url` string, nullable: Its photo, at the top of its card on the booking page: a JPEG's absolute URL, or null without one. Read-only: photos are uploaded in the dashboard (the offering's Photo)
  - `created_at` string, required: ISO 8601 timestamp (UTC)

## Other responses

- `default`: Error

---

[API](https://skmtc.dev/daybag/apis/daybooked-io-api.md) · [All operations](https://skmtc.dev/daybag/apis/daybooked-io-api/llms.txt) · [OpenAPI document](https://skmtc.dev/daybag/apis/daybooked-io-api/revisions/1f576dead370?raw)
