Changelog
User-visible changes to the API, webhooks and the SDK, newest first.
Each release lists its changes as Breaking, Added, Changed or Fixed, and the area they affect: API, Webhooks or SDK. Releases with breaking changes end with migration steps. Every operation is in the API reference.
Scheduling links, folder and calendar management, and on-demand sync
October 17, 2026
- Added, API. Scheduling links:
POST /v1/scheduling-linksstores a bookable configuration: accounts,allor round-robinanymode, duration, working hours, buffers, notice and a daily cap.GET /v1/scheduling-links/{linkId}/slotsreturns open slots.POST /v1/scheduling-links/{linkId}/bookingsre-checks availability, creates the event and answers409 slot_takenwhen the slot is gone.DELETE /v1/bookings/{bookingId}cancels a booking.
- Added, Webhooks.
booking.createdandbooking.cancelledevents. - Added, API.
POST /v1/availability/findfinds free time across several accounts: slots where all of them are free or, with modeany, which of them are free per slot. - Added, API. Availability answers say whether every attendee was read:
completeandunresolved. WithrequireAll: true, no slots are suggested while an attendee is unresolved. - Added, API. Create, rename, move and delete mailboxes (
POST,PATCH,DELETE /v1/accounts/{accountId}/mailboxes) on Microsoft 365, Gmail (labels) and IMAP, and calendars (/v1/accounts/{accountId}/calendars) on Microsoft 365, Google and CalDAV. System folders answermailbox_protectedand the primary calendarcalendar_primary. - Added, API.
POST /v1/accounts/{accountId}/syncstarts a sync pass now for mail, calendar or contacts, limited per account per minute. - Changed, API. The API reference shows each operation's required scope, and SDK samples for deletes with options pass
{ params, query }. - Fixed, API. A contact
birthdayaccepts--MM-DDfor a birthday without a year, as documented.
MCP server and account-scoped API keys
October 17, 2026
- Breaking, API. MCP tools renamed or removed:
list_messagesis nowsearch_messages(qoptional).update_messageandupdate_threadaremark_messages(read, flagged) andmove_messages(mailbox, Gmail labels).trash_threadismove_messageswithto: "trash".list_contactsandget_contactaresearch_contacts.list_identitiesis gone;list_accountslists each account's send-as addresses.
- Breaking, API. MCP tool arguments changed:
create_draft,update_draftandsend_messagetakebodyandformat(textorhtml) instead oftextandhtml.create_eventtakesmeeting({ provider: teams | meet | zoom | webex }or{ url }) instead ofonlineMeeting,onlineMeetingServiceandonlineMeetingUrl.update_eventtakesmeeting: { url }ornull.
- Breaking, API. The MCP send policy's
modedefaults toconfirminstead ofallow: a workspace that never set one has the user confirm every agent send, in a form or the review card. Clients that can do neither, and backend API keys, getsend_policy_refusedwith ruleconfirmuntil an admin setsmode: allow. A mode already saved is unchanged. - Added, API. An MCP server at
/mcpwith mail, calendar and contacts tools for agents.- Clients connect with an API key, whose scopes decide the tools they see, or with OAuth, where the user picks a workspace, scopes and accounts in the console.
- Tools take an account's id or its email address as
accountId. - Every tool call is recorded in the audit log under the surface
mcp.
- Added, API. OAuth for MCP clients:
- Open client registration (
POST /api/auth/oauth2/register) takes 10 registrations per 10 minutes from one client address; past that it answers 429 withRetry-Afterand the OAuth errortemporarily_unavailable. - A client that registered itself or was read from a client ID metadata document, and that no user ever consented to, is deleted after 7 days.
- Granting a workspace no longer switches the console to it.
- Owners and admins can see and revoke every member's connected apps under Settings.
- Open client registration (
- Added, API. API keys can be limited to specific accounts (
accountIds). Such a key reaches only those accounts' operations,GET /v1/accountsandGET /v1/changesreturn only those accounts and their events, and anything tenant-wide answers the new reasonaccount_scope_forbidden(403). - Added, API. A developer toolset at
/mcp/developerfor coding agents working on an integration: accounts' sync health, webhook endpoints, the delivery log, failed delivery counts, test events and replays, hosted connect links, the change feed, usage, the audit log, and a search of the API reference. It takes API keys only; other bearer tokens answer the new reasonapi_key_required(403), and MCP keys minted for an accountmcp_only_key(403). - Added, API. MCP keys for your users:
POST /v1/accounts/{accountId}/mcp-keysmints a key for one account withread,writeorsend(neveradmin), returned once.GETlists them andDELETE /v1/accounts/{accountId}/mcp-keys/{keyId}revokes one; deleting the account revokes its keys.- Such a key works only at
/mcp; anywhere else it answers the new reasonmcp_only_key(403). - An account holds at most 25 live keys (
mcp_key_limit, 409). POST /v1/connect-sessionstakesmcp: { scopes, name? }to mint a key when the session connects an account and show it once to the person who connected it, on a Workwae page with setup steps for MCP clients.GET /v1/connect-sessions/{sessionId}names it asmcpKeyId, or answersmcpKeySkipped: "mcp_key_limit"when the account was already at the cap and got no key.
- Added, API. MCP mail tools:
search_messagesfilters byfrom,to,unread,flagged,hasAttachments,after,beforeandmailbox(an id or a role such asinbox), withdetailbrief or full and 20 a page.get_messageandget_threadleave out quoted history unlessquoted: true;get_threadreturns bodies (bodies: latest, all or none).mark_messagesandmove_messagestake up to 50 ids or a thread.- Drafts and sends take
reply: { messageId, mode }(reply, replyAll, forward), the server filling in recipients, subject, threading and the quote, and attachments by reference ({ fromMessageId, attachmentId }).
- Added, API. MCP calendar and account tools:
- Times show in the account's calendar zone or
timeZone. list_eventstakesqanddetailand defaults to the next 90 days;create_eventdefaults to the primary calendar.list_accountsshows each account's zone, capabilities and send-as addresses.connect_accountreturns a hosted connect link for another mailbox (as URL elicitation where the client supports it).get_current_timetakesaccountId, else answers in the zone the credential's accounts' calendars share.accountIdmay be left out where a message id names the account, and for calendar and contacts tools when only one account syncs them; a refusal for a missing one names the accounts.
- Times show in the account's calendar zone or
- Added, API. Safe MCP sends: on 2026-07-28 clients that support forms,
send_messageandsend_draftask the user to confirm first, and a declined or cancelled form sends nothing (a cancel points the model tocreate_draft). An identical send within 10 minutes answersduplicate_sendunlessallowDuplicate: true. Sends,update_draft,cancel_send,update_eventandupdate_contactare annotated destructive. - Added, API. An MCP send policy,
mcpSendPolicyinGET/PATCH /v1/settingsand under Settings, Agents (MCP):mode: allow, confirm or drafts_only.allowedRecipientDomains, where the account's own domain counts unless it is a public mailbox provider such as gmail.com.dailySendLimitper credential per UTC day.externalRecipientConfirmation, for addresses the account has never sent to.- Refused sends answer
send_policy_refusedwith therule.POST /v1/accounts/{accountId}/mcp-keystakessendPolicy, which only tightens the workspace's./v1sends are unaffected.
- Added, API. MCP calendar writes that email anyone outside the account (
create_event,update_event,delete_eventnotifying attendees,respond_to_eventtelling the organizer or with a comment) are sends: they need thesendscope (elsemissing_scope; passnotify: false), follow the send policy and its confirmation, and count toward the daily limit. On Microsoft 365 an organizer's changes always notify. - Added, API. MCP Apps:
preview_messageshows a message as it would go out in a review card: an HTML body rendered as mail clients do but without remote content, followed by its link targets and remote hosts. The card's Send commits exactly that message (commit_message, single use within 10 minutes; theproposalIdgoes only to the card).- Send counts as the user's confirmation only when the preview and the commit come from a 2026-07-28 client declaring the extension; policy confirmations still ask where the client supports forms.
pick_meeting_timeshows free slots in a picker.- New reasons
proposal_not_foundandproposal_changed.
- Added, API. MCP Events for 2026-07-28 clients (
events/list,events/subscribe,events/unsubscribe):mail.message_received,mail.reply_receivedandcalendar.event_changed, delivered as signed webhooks carrying ids, the account, the sender's address and times, never subjects or bodies.- Subscriptions last 24 hours by default (at most 30 days), at most 20 per credential.
- Callback verification is limited to 10 attempts per credential and 20 per host every 10 minutes, and a failed host is refused for 10 minutes.
- Queued deliveries stop once a subscription ends or its credential loses the account.
- Added, API. MCP prompts
triage_inbox,draft_reply,schedule_meeting,weekly_agendaandsummarize_thread; server cards at/mcp/server-cardand/mcp/developer/server-card; and an AI catalog at/.well-known/ai-catalog.json. A tool call needing a scope an OAuth grant lacks answers 403insufficient_scopenaming every scope needed, so the client can ask for them. - Added, API.
GET /v1/accounts/{accountId}/messagestakesfrom,to,flagged,hasAttachments,afterandbefore(invalid_rangewhenbeforeis not afterafter).GET /v1/accounts/{accountId}/search/messagestakesfrom,to,unread,flaggedandhasAttachments. - Changed, API. MCP results with mail, calendar or contact text return it only as fenced text, without
structuredContent. Other results carry compactstructuredContent, their summary included assummary, and the same as text. Invisible Unicode (tag characters, bidi controls, zero-width characters, lone surrogates) is stripped from third-party text and from outgoing mail, its recipient names and attachment filenames included.
Migrating
- MCP: replace
list_messageswithsearch_messages,update_message/update_threadwithmark_messagesormove_messages,trash_threadwithmove_messages(to: "trash"),list_contacts/get_contactwithsearch_contactsandlist_identitieswithlist_accounts. - MCP: pass
bodyandformatinstead oftext/htmltocreate_draft,update_draftandsend_message, andmeetinginstead ofonlineMeeting*tocreate_eventandupdate_event.
Request ids, idempotency keys and the SDK alpha
October 17, 2026 · SDK 0.1.0-alpha.1
- Added, API. Every answer carries
X-Request-Id; send your own to have it echoed. Audit log entries record it. - Added, API.
Idempotency-Keyon authenticatedPOST /v1/*calls: a retry with the same key within 24 hours replays the first answer (Idempotent-Replayed: true) instead of running twice. New reasonsidempotency_key_reused,idempotency_key_in_progressandinvalid_idempotency_key. - Added, API.
RateLimit-Limit,RateLimit-RemainingandRateLimit-Resetheaders on rate-limited calls. - Added, API. API keys can expire, and can be renamed, rescoped and rotated with a grace period in the console. A request with an expired key answers 401 with the new reason
api_key_expired. - Added, Webhooks. Secret rotation with a grace period:
POST /v1/webhooks/{endpointId}/rotate-secrettakesgraceSeconds(default 24 hours,0= at once), during which deliveries carry a second signature by the old secret inwebhook-signature. The answer and the endpoint showpreviousSecretExpiresAt. - Added, Webhooks.
POST /v1/webhooks/{endpointId}/replay-failedqueues every event the endpoint gave up on again, once each, optionally withinsince/until;GET /v1/webhooks/{endpointId}/failed-deliveries/countsays how many that is. See webhook delivery. - Added, SDK.
@workwae/sdk0.1.0-alpha.1, an alpha whose API may still change: errors exposerequestId, and every POST sends anIdempotency-Keythat is reused across the SDK's own retries (or passcontext.idempotencyKey).
Consistent /v1 paths, errors, lists and event types
October 16, 2026
- Breaking, API. Paths follow resource nouns:
/v1/imap-accounts,/v1/accounts/{accountId}/outbox,/v1/accounts/{accountId}/calendar-events,/v1/suppressions/{listId}/entries, and the hosted connect pages under/v1/hosted/*. - Breaking, API. Error bodies are
{ defined, code, status, message, data? }wherecodeis the error's reason (there is nodata.reason), and each reason always answers with the same HTTP status. - Breaking, API. Listings answer
{ items, nextCursor }pages or, for small bounded lists,{ items }. Creates answer 201, deletes 204, accepted work 202. - Breaking, API.
DELETEoperations take their options in the query string, not a body. - Breaking, Webhooks. Event types were renamed (
calendar_event.*,suppression.created), and webhooks andGET /v1/changesshare one event envelope with typeddataper event type. - Breaking, SDK. The SDK is generated from the new contract: methods are named after the operations (
workwae.calendarEvents.list), dates arrive asDate, and errors areORPCErrors whosecodeis the reason (isApiError,safe,isDefinedError). - Added, API. Every schema is a named component of the OpenAPI document (
/v1/openapi.json), and every operation lists the reasons it can answer with. - Changed, API. Deleting an account or a tenant revokes its Google grant.
- Changed, API. When a Zoom user removes the Workwae app, their meeting connections must be reconnected and
meeting_connection.reauth_requiredis sent.
Migrating
- Update request paths to the new resource names; the API reference lists every operation.
- Read an error's reason from
codeinstead ofdata.reason. - Read list results from
itemsand continue withnextCursor(null on the last page). - Move
DELETEoptions (for examplepurge,notify) into the query string. - Rename the event types your webhook endpoints and change-feed readers filter on.
- Upgrade
@workwae/sdkand follow the type errors: method names,Datefields and error codes changed with the API.
Suppression reviews, AI drafting and health probes
October 15, 2026
- Added, API. Manage suppression lists (
/v1/suppressions) and review opt-outs detected in replies (/v1/suppression-reviews). - Added, API.
POST /v1/ai/draftdrafts email text. Reply classification sorts auto-replies into categories; it is off until a tenant turns onaiReplyClassificationand is capped per day. - Added, API.
GET /readyzreports whether the API can serve requests;/healthzturns 503 while the API is shutting down. - Added, API. A connect session without a
redirectUriends on a Workwae outcome page. - Added, API. Plans have modules (calendar, contacts, tracking, AI, meetings, shared mailboxes): a module outside the tenant's plan answers 403
plan_module_unavailable. - Added, Webhooks. Webhook tester inboxes in the console capture deliveries for inspection.
- Changed, Webhooks. New webhook endpoints must use https.
- Changed, Webhooks. An endpoint answering 429 or 503 is backed off politely, honoring
Retry-After, without counting against its failure streak. - Fixed, API. A send whose SMTP reply was lost after the message was handed over fails with
outcome_unknowninstead of being sent again. - Fixed, SDK. Webhook verification computes the signature once and checks at most 8 candidate signatures.
List unsubscribe, Markdown templates and search
October 14, 2026
- Added, API. Sends and mail merges take a
listId: one-click unsubscribe headers (RFC 8058),{{rcpt.unsubscribeUrl}}, and recipients on the list or the global list skipped. - Added, API. Templates take
format: "markdown". - Added, API. Suppress up to 1,000 addresses in one call with
POST /v1/suppressions/{listId}/entries. - Added, API.
GET /v1/templates?query=filters by a name substring;GET /v1/accounts?q=searches accounts by email address or external reference.
Templates and mail merge
October 13, 2026
- Added, API. Stored Handlebars templates (
/v1/templates), previews (POST /v1/template-renders), andtemplateplusrender.paramson sends and drafts. - Added, API. Mail merges:
POST /v1/accounts/{accountId}/mail-mergessends one message per recipient, each with its own params, events and tracking.
Open and click tracking
October 12, 2026
- Added, API. Sends track opens and clicks per account or per send (
tracking), tell people from proxies, prefetchers and scanners, and reportmessage.openedandmessage.clickedevents. - Added, API. An optional honeypot link catches scanners;
GET /v1/accounts/{accountId}/outbox/{outboxId}/trackinglists every hit with what its request revealed. - Added, API.
GET /v1/accounts/{accountId}/outbox/{outboxId}reads one send.
Message priority
October 10, 2026
- Added, API. Sends and drafts take
priority(high,normal,low); messages carryimportance.
Contacts, meetings, threads and the SDK
October 9, 2026
- Added, API. IMAP and SMTP accounts, with calendars and contacts over CalDAV and CardDAV.
- Added, API. Contacts sync and free/busy availability (
POST /v1/accounts/{accountId}/availability/find). - Added, API. Zoom and Webex meetings for calendar events, and
onlineMeetingUrlfor links from other services. - Added, API. Threads, send-as identities, signatures and
message.bouncedevents. - Added, API. An undo send window (
undoSendSeconds), scheduled sends and rescheduling. - Added, API. Organization-wide connections and shared mailboxes.
- Added, API. Message body storage and full-text search; data exports and account purge.
- Added, Webhooks. Endpoint filters by mailbox and message criteria; delivery log, replays and test events.
- Added, SDK. The TypeScript SDK,
@workwae/sdk, typed from the API contract, with cursor and webhook helpers.
First release: the /v1 API
October 8, 2026
- Added, API. The /v1 API: hosted and headless OAuth connect for Google and Microsoft 365, mail and calendar endpoints with push intake, webhooks and the change feed.