Checking your session…

API Changelog

What changed in the API, newest first. Back to the reference

2026-09-15
  • 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}/conversations reads 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 by callerIdPhone. 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's callerIdPhone from 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. HELP and INFO return one fixed line built from the app's name and the number texted. STOP and its variants now record the opt-out on the customer's record as consents.reminders.sms = false, and every outbound text path consults it: the reminder sweep skips that customer and writes skipped:opted-out against the rule. START lifts 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.

2026-09-13
  • See what your reminders did. A phone reminder now appears in the conversation list with source: "reminder-call" and a reminder block (bookingId, ruleKey, attempt, outcome), on GET /api/v1/apps/{appId}/conversations and the single-conversation read. Each booking's commsSent markers keep the conversation id, the call length and any note. GET /api/v1/apps/{appId}/booking-reports gains reminders: 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/preview reads back the exact spoken lines and persona a reminder would carry, with a sample booking and optionally an unsaved calls block; POST .../reminder-call/test rings 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.

2026-09-10
  • 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.persona in PUT /api/v1/apps/{appId}/booking and 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 through POST /api/v1/public/demo-visit. GET /api/v1/demos/funnel lists 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} takes extendDays and end.

  • The instantly.ai export. GET /api/v1/demos/export.csv gives 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 with PATCH /api/v1/demos/{appId}.

2026-09-09
  • Reminders by text, email or phone call. Each reminder rule in the booking settings now chooses its channel: reminders[].channel is sms (the default, so nothing changes for existing apps), email or call, and the follow-up has followUpChannel (sms or email). 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 new comms.calls block 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 commsSent entries are now objects (at, channel, attempt, status, fallbackSent) carrying call outcomes and skipped:<reason> values; the old timestamp form still reads as a text sent. Send-log rows carry channel and status. A customer who asks not to be rung gets consents.reminders.call: false on their record and their reminders go to the fallback channel. See "Instant Confirmations & Booking Messages" under Bookings.
2026-08-20
  • 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) plus record/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), and record/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-check and promo-check; confirm accepts voucherCode and promoCode. 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) and newClientGate (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. vocabulary now takes clinic, salon, trades or hospitality and picks vertical-correct default wording for anything left blank; the public config projection includes the resolved voiceDefaults.
2026-08-18
  • 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-dates blocks 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-page mints (or returns) the app's QR-ready hosted chat page. Documented under Go Live, with the matching dashboard button.
2026-07-25
  • Chat answers can now stream. A new Server-Sent Events endpoint delivers chat responses token by token using the same Authorization header 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. conversationId and userIdentifier were always required; the example and response shape now show the real contract.
2026-07-19
  • 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-remove returns an app's remaining cap balance to the shared pool and makes the app uncapped again — the inverse of cap top-up.
2026-07-17
  • 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.
2026-07-16
  • 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-session returns a hosted checkout link priced at your plan's per-minute rate.
  • Take an app offline. POST /api/v1/apps/{appId}/unpublish removes the published site without deleting the app.
  • List upcoming bookings. GET /api/v1/apps/{appId}/bookings returns the operator view of appointments.
2026-07-15
  • 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.
2026-07-13
  • Buy a phone number from the API. POST /api/v1/apps/{appId}/phone-number purchases and wires a number in one call, with automatic rollback if wiring fails; DELETE releases 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.