API Changelog
What changed in the API, newest first. Back to the reference
Text messages and WhatsApp get real conversations. A text thread now closes after fifteen minutes of quiet and the next message opens a new conversation carrying a summary of the last, so
GET /api/v1/apps/{appId}/conversationsreads one row per occasion instead of one endless row per customer. The id keeps the customer's thread as its prefix and gains-s2,-s3; group by that prefix or bycallerIdPhone. A conversation taken over by a team member does not roll while they are handling it.A text conversation is visible as it happens. Conversations now carry
source: "sms"or"whatsapp"and the customer'scallerIdPhonefrom the first message, and appear in the list the moment they start rather than once they have been summarised. Both dashboards show the channel on the row.HELP, STOP and START are answered by the platform.
HELPandINFOreturn one fixed line built from the app's name and the number texted.STOPand its variants now record the opt-out on the customer's record asconsents.reminders.sms = false, and every outbound text path consults it: the reminder sweep skips that customer and writesskipped:opted-outagainst the rule.STARTlifts it. Previously the platform relied on the carrier's own block, which only covers the pair of numbers that saw the STOP — and reminders go out from a different number than the one customers text. An opt-out from texts leaves email and phone reminders, and marketing consent, untouched.The assistant knows it is on a text message. It is told the channel and the sender's number, so it writes the way a person texts and never asks for a number it already has. On SMS it answers in words rather than cards or pickers; WhatsApp still renders them as native tappable lists.
Longer conversations answer from the right end. Stored conversation history was being read oldest-first and capped, so a long-running thread could answer from months-old context and miss what was just said. Every channel now reads the most recent turns.
See what your reminders did. A phone reminder now appears in the conversation list with
source: "reminder-call"and areminderblock (bookingId,ruleKey,attempt,outcome), onGET /api/v1/apps/{appId}/conversationsand the single-conversation read. Each booking'scommsSentmarkers keep the conversation id, the call length and any note.GET /api/v1/apps/{appId}/booking-reportsgainsreminders: counts by channel for the window and, for calls, how many were reached and what came of them.Hear the reminder call first.
POST /api/v1/apps/{appId}/booking/reminder-call/previewreads back the exact spoken lines and persona a reminder would carry, with a sample booking and optionally an unsavedcallsblock;POST .../reminder-call/testrings a number you give with that same call and records nothing against any booking. Both in Bookings, Messages, under the phone call section, alongside the quiet hours for texts and emails.
Outbound persona for phone reminders. A reminder call no longer borrows the inbound receptionist's instructions; it speaks with the platform's outbound manner (says who it is, asks for the customer by name, one sentence at a time, never the inbound greeting). Each app can now set the outbound voice, its own words for the opening, the language it opens in, how quickly it takes its turn and the recording notice, under
booking.comms.calls.personainPUT /api/v1/apps/{appId}/bookingand in Bookings, Messages, Phone call reminders. Nothing changes for inbound calls.Build a demonstration from a website.
POST /api/v1/apps/build-from-website(operators) reads a business's public site and builds a demonstration receptionist from it: a published app, a phone number, a booking page in the business's own branding, web chat and the site as knowledge. The app carries demonstration mode (booking.demo): the receptionist discloses it is a demonstration on every call and chat, gives no clinical advice and no suitability judgement, messages nobody, and the booking page banners and confirms bookings as demonstrations (config.demo).Demonstration landing page and funnel. Each built demonstration gets a landing page (
landingUrl) with the number, the booking page, the web chat and the proof layer. Pages report visits throughPOST /api/v1/public/demo-visit.GET /api/v1/demos/funnellists every demonstration with visits, return visits, calls and call time, web chats, booking attempts, furthest stage and last activity;PATCH /api/v1/demos/{appId}records replied and notes.Demonstration cap and teardown. A demonstration is built with a call-time allowance (
creditSeconds, default 30 minutes) allocated from the operator's pool, and a life (demoDays, default 14). A daily sweep ends demonstrations whose time is up: the number answers with an ended message, the receptionist is paused, the booking page shows the ended notice; two weeks later the operator is told it can be deleted.PATCH /api/v1/demos/{appId}takesextendDaysandend.The instantly.ai export.
GET /api/v1/demos/export.csvgives one row per live demonstration with the merge fields, a cohort question, a PECR column (limited companies only, unless consent is recorded) and the opt-out line; contact and company details are set at build or withPATCH /api/v1/demos/{appId}.
- Reminders by text, email or phone call. Each
reminder rule in the booking settings now chooses its channel:
reminders[].channelissms(the default, so nothing changes for existing apps),emailorcall, and the follow-up hasfollowUpChannel(smsoremail). Email reminders and follow-ups go out as branded emails with the manage link. A call rule has the receptionist ring the customer to confirm attendance, offer to move the appointment, or take a cancellation if you allow it; never money. The newcomms.callsblock holds what the call may do, four short scripts with the usual merge tags, the call window, attempts and retry gap, the fallback channel and the identity check, all with defaults. - The message trail. A booking's
commsSententries are now objects (at,channel,attempt,status,fallbackSent) carrying call outcomes andskipped:<reason>values; the old timestamp form still reads as a text sent. Send-log rows carrychannelandstatus. A customer who asks not to be rung getsconsents.reminders.call: falseon their record and their reminders go to the fallback channel. See "Instant Confirmations & Booking Messages" under Bookings.
- The booking record, documented. Every booking's
evidence trail has been API-accessible since 12 August and is now in
this guide:
GET …/bookings/{bookingId}/record(checklist, work details, permanent notes) plusrecord/delivery(line-by-line what was done and used — item, product, batch, expiry, quantity, price),record/note(append-only, stamped; corrections are new notes referencing the old — nothing can ever be edited or deleted), andrecord/artefact(mark a checklist item completed, or waive it with a required written reason). See "The Booking Record" under Bookings. - Gift vouchers and promo codes on the hosted booking
page. New public routes
voucher-checkout(buy a voucher through your connected Stripe; the code is emailed on payment),voucher-checkandpromo-check;confirmacceptsvoucherCodeandpromoCode. A voucher that covers the deposit pays it outright; smaller ones are noted on the booking for the till. - Instant booking confirmations. Every booking sends
an email and/or SMS confirmation the moment it exists, with
cancel/reschedule notices from any direction. Messages say "reserved"
while a deposit link is outstanding and "confirmed" only once nothing is
owed. Opt out with
"confirmationComms": false. - The details step is yours to shape.
detailFields(DOB, gender, address, practitioner note, marketing consent — each optional/required per app) andnewClientGate(steer first-timers to a consultation, server-enforced) on the booking settings. - Your voice: every customer-facing line is
configuration. Greeting style (friendly/formal), per-service
deposit wording, voucher redemption note, promo note, consent ask,
cancellation policy — all on the booking settings
PUT, all with sensible defaults, gathered in the dashboard's new "Your voice" panel.vocabularynow takesclinic,salon,tradesorhospitalityand picks vertical-correct default wording for anything left blank; the publicconfigprojection includes the resolvedvoiceDefaults.
- The built-in diary is documented end to end. The
Bookings chapter now covers the platform-hosted diary: services with
per-weekday hours (
dayWindows), multiple diary lanes, the hosted booking page with its share link, QR and embed snippets, and the moderated review store. - Public booking API. The unauthenticated surface
behind the hosted page is documented for custom front ends:
/api/v1/public/book/{appId}/config | slots | hold | confirm | release, signed customer manage links, and public reviews. - Operator diary API. The diary window read, manual
bookings and private blocks (
POST /bookings/create), cancel/reschedule/notes, the report pack (GET /booking-reports), and the customer directory with duplicate merge (/parties,/parties/{partyId}/merge). - NEW: Close dates in one call.
POST /api/v1/apps/{appId}/bookings/close-datesblocks out an inclusive date range — one lane or all — as full-day private blocks. Past days are skipped and existing bookings are left in place, with the response listing exactly what was created. - NEW: Ask page.
POST /api/v1/apps/{appId}/ask-pagemints (or returns) the app's QR-ready hosted chat page. Documented under Go Live, with the matching dashboard button.
- Chat answers can now stream. A new Server-Sent
Events endpoint delivers chat responses token by token using the same
Authorizationheader as the rest of the API — no more waiting out long tool-driven turns. See "Stream a Chat Message" in the Chat API chapter. - The buffered chat endpoint is documented
accurately.
conversationIdanduserIdentifierwere always required; the example and response shape now show the real contract.
- Auto top-up is now documented and available at two
scopes. Keep a shared account pool topped up
(
GET/PATCH /api/v1/accounts/{merchantId}/auto-topup) or protect a single app's balance (GET/PATCH /api/v1/apps/{appId}/auto-topup). Reads report whether a card is on file and which balance the setting governs. - Remove a per-app spending cap.
POST /api/v1/apps/{appId}/cap-removereturns an app's remaining cap balance to the shared pool and makes the app uncapped again — the inverse of cap top-up.
- Manage your whole account by conversation. The admin assistant (Teach) can now create and configure apps, manage team members, buy credits, connect a calendar, and change plans — every money-spending or destructive action asks for explicit confirmation first.
- Team lifecycle endpoints. Invite
(
POST /api/v1/users), change a role (PATCH /api/v1/users/{userId}), pause and resume sign-in (POST /api/v1/users/{userId}/pause), and remove a teammate (DELETE /api/v1/users/{userId}). Role changes are bounded by your own role. - Buy credits from your integration.
POST /api/v1/billing/topup-sessionreturns a hosted checkout link priced at your plan's per-minute rate. - Take an app offline.
POST /api/v1/apps/{appId}/unpublishremoves the published site without deleting the app. - List upcoming bookings.
GET /api/v1/apps/{appId}/bookingsreturns the operator view of appointments.
- Web-chat components: render contract + curated
library. Saved actions can declare how their data renders in
chat (
cards,comparison,timeline), and you can pre-approve exact content that the assistant serves verbatim. - Scoped API keys. Self-mint hash-stored keys scoped to chat, knowledge or forms, and list or revoke them — see Scoped API Keys.
- Buy a phone number from the API.
POST /api/v1/apps/{appId}/phone-numberpurchases and wires a number in one call, with automatic rollback if wiring fails;DELETEreleases it. - Automation rates are live. Workflow runs are billed per run plus per step-class; the launch rate table is published in the Workflow Execution section.