Changelog
Breaking changes to a released version are announced before they ship. Additive changes — a new field, a new endpoint, a new error code — can arrive at any time, so parse defensively: ignore fields you do not recognise.
Unreleased — first delivery
Section titled “Unreleased — first delivery”Version v1 has not been released to partners yet. Everything below is the shape
of the first delivery.
Tooling
- An official MCP server ships alongside v1:
@salesbud/mcpon npm, one tool per public read operation, for Claude Desktop, Claude Code and Cursor. It is a client of this API and adds no capability of its own. See MCP server.
Resources
- Calls are their own collection at
/v1/calls, withcall_identifiers. A record captured from a VoIP integration hasobject: "call"; everything else is ameeting. Ids do not resolve across collections. - All five routes are mirrored for both collections: list, retrieve, transcript, template answers and overall evaluation.
- A call does not carry
bot_historyat all: a VoIP capture has no recording bot, so the field is omitted rather than returned empty, and a schema that validates a call rejects it.enablement.meeting_typestays and is oftennull— that null is legitimate, unlike the bot. - WhatsApp conversations of the company’s sellers are a collection at
/v1/whatsapp, withwa_identifiers andwamsg_messages, behindwhatsapp.read(metadata) andwhatsapp.content.read(sanitized text, media metadata, audio transcriptions).last_message_atmoves only on a new message, so re-read messages to observe edits and deletions; deleted messages stay as tombstones. Date filters compare in whole seconds. See WhatsApp.
Errors
- The error envelope is
{ type, title, detail, code, request_id }. Every field is snake_case; the HTTP status stays in the status line and is not repeated in the body. Branch oncode. POST /oauth/tokenkeeps the OAuth 2.0 error shape required by RFC 6749 §5.2.
Pagination and filters
- Cursors are signed and ordered by ascending id; they bind the filters of the request that produced them.
updated_after,updated_beforeandsnapshot_atwere removed. Without a dedicated visibility timestamp there is no honest incremental sync; re-query by period instead.updated_atremains in responses as informative only.- The date filters are
meeting_afterandmeeting_before. Earlier drafts also acceptedmeeting_at_fromandmeeting_at_to; those never reached a partner and were removed rather than shipped as deprecated on day one.
Access
- The API is gated by the
API_ACCESScompany feature, checked at token issuance and at credential creation. - Emails and account domains are normalised to lower case in every field, so an address can be used as a join key regardless of where it appears.