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_insrecords a punch:kindofcheck_in,check_out, orstatus_updateto add a note or photo mid-shift.GET /api/v1/staff_check_inslists shifts, most recent first.GET /api/v1/staff_check_ins/{id}returns one shift. Add?include=event,notesto 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}correctscheck_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_bookingsadds a package and returns the event booking it created.PATCH /api/v1/event_bookings/{id}edits a package, or swaps in a different one withuse_new_or_existing_packageset tonew.PATCH /api/v1/event_bookings/{id}/update_staffingsets 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_bookingcreates a confirmed booking, or one awaiting signature withsignature_collected: false.POST /api/v1/leads/{id}/convert_to_proposalcreates a proposal, holding the date withproposal_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/bookingscreates a confirmed booking, or one awaiting signature withsignature_collected: false.POST /api/v1/proposalscreates a proposal, holding the date withproposal_date_reservedand expiring onproposal_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_listsreturns every list with itstitleanditem_count.GET /api/v1/suggestion_lists/{id}returns one list's songs, each with artist, album, yoursongNotes, 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/questionnairescovers 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_templateslists and reads the templates you attach from, and needsplanning_read.POST /api/v1/questionnaires/create_externalattaches a questionnaire hosted on another site. Readkindbefore rendering one: it carries anexternal_urland 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, andreplace: truereplaces the entire blob. valuesis 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.