What changed in the API
Every change a client could notice, newest first. What a change is allowed to be is the deprecation policy; the current document is at /api/openapi.json and the reference at /api/docs.
- Changed — `POST /api/v1/admin/orgs` takes `country` from the US alone, and `PATCH /api/v1/admin/org` refuses a move to any other with `409 country_not_offered`.
- Changed — Bookings, customers, rooms, availability, series, payments, documents and webhooks are the stable core of v1. Every other operation carries `x-stability: beta` and may change.
- Removed — Console plumbing is no longer in the public document. That is the storefront's embed-host, host and redirect lookups and the theme editor's session read. It is also attention counts, seeding system flows, signup options, storefront features, the room billing preview, console search, saved views and staff notification preferences.
- Added — Every operation that takes a body or a parameter declares its `400 validation_error`, with `issues` naming each bad field.
- Added — A webhook body carries `eventId`, the same on every endpoint's delivery and on a replay. `timestamp` is when the event happened, not when the attempt was sent. A charge's processor id is `processorPaymentId` beside `paymentIntentId`. Failed deliveries are retried for about three days.
- Removed — `series.occurrence_skipped` no longer carries `orgId`, and `booking.abandoned` no longer carries `dateLabel` or `timeLabel`.
- Changed — `GET /api/v1/storefront/{slug}/classes` is keyset-paged and answers `nextCursor`.
- Changed — A storefront request carrying the studio's API key as a bearer is rate-limited per key rather than per address.
- Changed — `POST /api/v1/admin/orgs` takes `country` from the US, Canada and Australia, and `PATCH /api/v1/admin/org` refuses a move to another with `409 country_not_offered`.
- Added — `POST /api/v1/admin/org/terms` records the owner's acceptance of the current Terms.
- Removed — Gear hire was rebuilt as rental products and orders. The `rental-items` paths and the old `rentals` paths are gone, and `rental.reserved` carries `rentalOrderId`, `number` and `items` in place of `rentalId`, `itemName`, `startDate` and `endDate`.
- Removed — `paymentStatus` no longer has a `credit_refunded` value: every refund is on the refund ledger, and a booking handed back in part is `partially_refunded`.
- Removed — Locations no longer carry `taxRatePct`. Tax rates are their own resource, per location.
- Added — `GET /api/v1/storefront/{slug}/availability` answers `waitlistWindow` beside `window`: the range a waitlist entry may cover on that date, including a date a blackout has taken off sale.
- Changed — `POST /api/v1/storefront/{slug}/waitlist` takes a `guest` block, so a customer with no account can be told when a room frees up.
- Added — `@soundslot/sdk-public`, a TypeScript client, and `@soundslot/cli`, the theme CLI, are generated from the public document. Neither is on npm yet, and this changelog records the day each is.
- Added — `GET /api/v1/themes/{slug}/archive` serves a theme that ships with the product as a zip. It takes no credential, and `soundslot theme init` starts a new theme from it.
- Removed — The lead form, the marketing page counter, the email open pixel, the email click redirect and the invitation helpers are no longer in the public document. They are first-party plumbing for soundslot.app and never had an integration behind them.
- Changed — The reference's error inventory lists only the codes its own operations can answer with, grouped by the resource that emits each one.
- Changed — `info.version` reads `1.0.0`. The path is still `/api/v1` and nothing about it moved; the document now says what the prose already did.