API Changelog

New endpoints and fields as they ship. Read the reference documentation.

August 27, 2026

Staff check-ins

Staff clock in and out, optionally against a booking, and you can pull the resulting timesheet out for payroll or an external time tracker.

  • POST /api/v1/staff_check_ins records a punch: kind of check_in, check_out, or status_update to add a note or photo mid-shift.
  • GET /api/v1/staff_check_ins lists shifts, most recent first.
  • GET /api/v1/staff_check_ins/{id} returns one shift. Add ?include=event,notes to embed the booking and the shift's notes and photos.

Punching and reading your own shifts need own_staff_check_in_read_and_create. search_mode chooses whose shifts the list returns: my by default, or all for the whole business and user with a staff_id for one person, both of which need all_staff_check_in_read. check_in_at_start and check_in_at_end bound the list by check-in date and include both days. The whole resource is available only when the business has staff check-in turned on.

Correct or delete a recorded shift

Fix a punch someone got wrong, or drop one that should not be there.

  • PATCH /api/v1/staff_check_ins/{id} corrects check_in_at, check_out_at, or the booking the shift is linked to.
  • DELETE /api/v1/staff_check_ins/{id} removes the shift along with its notes and photos.

Both need own_staff_check_in_write for your own shift or all_staff_check_in_write for anyone's. Both grants are admin-only by default, and every correction is recorded in the shift's history with the user who made it.

August 14, 2026

Manage the packages on a proposal or booking

Sell more after the fact, or fix what is already there. Adding a package brings its add-ons across, and pricing, tax and the event title are recalculated on every change.

  • POST /api/v1/events/{id}/event_bookings adds a package and returns the event booking it created.
  • PATCH /api/v1/event_bookings/{id} edits a package, or swaps in a different one with use_new_or_existing_package set to new.
  • PATCH /api/v1/event_bookings/{id}/update_staffing sets how many staff the package needs.
  • DELETE /api/v1/events/{event_id}/event_bookings/{id} removes a package.

All four need assigned_event_write or unassigned_event_write. To add a package, send its event_type_id and a starts_at_date, plus a proposal_alternative_id when the proposal has alternatives. What else is required depends on how the package is sold: a length, a unit count, or a unit range.

Two gotchas: the update replaces the package rather than merging into it, so anything you leave out is cleared. And an event always keeps one package, so removing the last one is a 403.

Convert a lead to a booking in one call

Turn a lead to a proposal or booking more easily. The lead's packages, venue, notes, and other details carry over, and the lead is marked converted. The lead's message history moves onto the new event.

  • POST /api/v1/leads/{id}/convert_to_booking creates a confirmed booking, or one awaiting signature with signature_collected: false.
  • POST /api/v1/leads/{id}/convert_to_proposal creates a proposal, holding the date with proposal_date_reserved.

Both need event_create, and both take an empty body. Every field they accept is optional and overrides what came from the lead, using the same names as POST /api/v1/bookings.

One gotcha: packages replaces the lead's packages outright rather than merging with them. Leave it out to book what the lead actually asked for. Converting a lead that has already been converted produces a second event and leaves the first alone.

August 13, 2026

Bookings and proposals each have their own endpoint

Creating a booking and creating a proposal are separate calls, so each one documents only the fields that apply to it.

  • POST /api/v1/bookings creates a confirmed booking, or one awaiting signature with signature_collected: false.
  • POST /api/v1/proposals creates a proposal, holding the date with proposal_date_reserved and expiring on proposal_valid_through.

Both take the event's packages as packages, and both need event_create. contact_type is one of New Customer, Existing Customer or None; any other value is now a 422 rather than an event created with no client on it. Existing Customer also needs customer_user_id.

POST /api/v1/events is no longer documented. It keeps working, so existing integrations, including Zapier, are unaffected.

Suggestion lists are readable

The song questions on a questionnaire draw from a suggestion list. You can now read those lists.

  • GET /api/v1/suggestion_lists returns every list with its title and item_count.
  • GET /api/v1/suggestion_lists/{id} returns one list's songs, each with artist, album, your songNotes, and Spotify, YouTube, Apple Music and SoundCloud links.

Both need planning_read.

Also documented: suggestionListId and allowCustomSongEntry on questionnaire fields. On a field, suggestionListId is the list it draws from; in values, songSuggestionListId is where the chosen song came from.

August 11, 2026

Questionnaires

A questionnaire collects what a business needs once a booking is secured: timelines, song requests, setup notes, signatures. The whole surface is now documented.

  • /api/v1/questionnaires covers the lifecycle: list and read them, attach one from a template, write answers, collect a signature, mark complete or incomplete, reset, delete.
  • /api/v1/questionnaire_templates lists and reads the templates you attach from, and needs planning_read.
  • POST /api/v1/questionnaires/create_external attaches a questionnaire hosted on another site. Read kind before rendering one: it carries an external_url and no questions, and you mark it complete yourself.

data holds the questions and values holds the answers, keyed by question uuid. Both are schemas, with a table naming every field type and the element its answer is stored under. Three things to know before writing answers:

  • Answers merge by uuid. The array you send under a uuid replaces that question's answers whole, [] clears one, and replace: true replaces the entire blob.
  • values is required, and an answer carrying a type or element name the question does not declare is a 422.
  • A field group is a tab, and headers, explainer text, images and separators are fields too, so not every field takes an answer.