Skip to content

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.

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/mcp on 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, with call_ identifiers. A record captured from a VoIP integration has object: "call"; everything else is a meeting. 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_history at 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_type stays and is often null — that null is legitimate, unlike the bot.
  • WhatsApp conversations of the company’s sellers are a collection at /v1/whatsapp, with wa_ identifiers and wamsg_ messages, behind whatsapp.read (metadata) and whatsapp.content.read (sanitized text, media metadata, audio transcriptions). last_message_at moves 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 on code.
  • POST /oauth/token keeps 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_before and snapshot_at were removed. Without a dedicated visibility timestamp there is no honest incremental sync; re-query by period instead. updated_at remains in responses as informative only.
  • The date filters are meeting_after and meeting_before. Earlier drafts also accepted meeting_at_from and meeting_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_ACCESS company 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.