API changelog
/api/v1 is additive: new endpoints, fields, and headers ship without a version bump, and we do not remove or rename existing ones. Parse responses leniently — ignore fields you do not recognise — so new additions never break your integration. On the rare occasion a change could fail an existing integration, it lands here marked Breaking in the same deploy, with migration guidance.
2026-10-18
- AddedSDK 0.8.0. The client now reaches all 126 documented API operations (0.7.0 reached 104). New: tables and their rows, tickets, wallet invoices, business API keys, commerce product history (product sales and stock movements), documents (a PDF for one contact, sent with
messages.send), message media, template submission, and webhook replay of every failed delivery since a time.messages.sendalso takesto.createto create a new number's contact in the same call. Upgrade withnpm install @blueticked/sdk@latest. - FixedSDK 0.8.0 keeps the API key in the client. A transport or proxy message the SDK passes into its own error has the key redacted, and
util.inspect(client, { showHidden: true })no longer prints it.
2026-08-31
- FixedSDK 0.7.0 — security release, please upgrade.In SDK versions up to 0.6.1 the client object's configuration was enumerable, so passing the client through
JSON.stringify, a logger, or any generic serializer could expose your live API key. 0.7.0 makes the credential non-enumerable; every earlier version is deprecated on npm. Upgrade withnpm install @blueticked/sdk@latest— no code changes needed — and if a client object may have reached your logs, rotate the key in Developers → API keys.
2026-08-10
- Breaking
POST /v1/events/send:channelno longer silently defaults to email. Omit it and your workspace's own live automations decide — the one channel whose automation matches the event and can reach the contact fires, and the response says which. When more than one channel qualifies the request fails withvalidation_failedasking for an explicitchannel. If you relied on the old email default, passchannel: "email". (We briefly shippedchannelas required on 2026-08-09 without an entry here — breaking changes now always land in this changelog, marked, in the same deploy.) - AddedSandbox (
blu_test_) keys can now create WhatsApp templates with no channel connected. They are bornapproved— the simulator stands in for Meta — and are immediately usable in test sends, so the whole template lifecycle rehearses without touching a live Meta asset. Live sends refuse a sandbox-born template with the actual reason instead of a Meta template-not-found. - Added
message.receivedwebhooks now carry amediafield —{type, filename}ornull— so an inbound photo or voice note no longer looks like an empty message. Fetch content via the conversations API; the webhook carries no URLs. - ChangedThe OpenAPI spec for
POST /v1/events/sendnow encodes "exactly one ofcontact_id,emailorphone" as aoneOf, so generated clients enforce it, not just the docs.
2026-08-09
- AddedPlatforms can onboard their own customers over the API:
POST /v1/businessescreates a customer and can mint a credential scoped to it in the same call;POST /v1/businesses/{id}/keyshandles rotation. Minted keys are always pinned to one business, can never create more, and inherit the minter's test/live environment. SDK 0.6.0 shipsbt.businesses. - Added
POST /v1/channels/connect-sessionsmints a single-use link your customer opens to connect their own WhatsApp — no Blueticked login. Achannel.connectedwebhook fires on completion, echoing yourreference. - AddedEvery error now carries
error.next_steps— the remedy as data, each step markedcaller,humanorwaiting. Sandbox keys can rehearse any of fourteen failures with theX-Simulate-Errorheader, so error handling is testable before production. - Changed
GET /v1/readinessanswers per business: pass?business_id=, and the response'sscopesays what the answer covers.message.*webhooks now carrybusiness_idso a platform can route receipts without calling back.
2026-08-03
- AddedRemote MCP server at
app.blueticked.com/api/mcp— browser-approved OAuth, nothing to install. Agent-readable docs at llms.txt and llms-full.txt, public and generated from the same source as the OpenAPI document.
2026-07-13
- AddedEvery authenticated response now returns
x-ratelimit-limit,x-ratelimit-remaining, andx-ratelimit-resetheaders, so you can pace before a429— see Rate limits and retries. - ChangedRotating an API key now keeps the previous secret valid for a 24-hour grace window. The rotation response includes
previous_key_expires_atso you can finish rolling the new key out with no downtime. - AddedNew endpoints:
GET /v1/wallet/ledger,DELETE /v1/contacts/{id},POST /v1/contacts/{id}/erase,GET/PATCH/DELETE /v1/groups/{id}, andPUT/DELETE /v1/groups/{id}/members. - ChangedSandbox (
blu_test_) keys no longer submit templates or publish Flows to Meta — those calls are simulated so test integrations never touch your live Meta assets. - FixedList endpoints now return an error on a database failure instead of silently returning an empty page, so a transient outage can no longer look like "no results".
2026-07-12
- AddedThe OpenAPI spec now documents real
201/202statuses, the full error-code set, query parameters, and per-event webhook payload schemas. - FixedThe marketing-email docs example is now a valid request.