Changelog
User-visible changes to the API, webhooks and the SDK, newest first. Breaking changes come with migration steps; every operation is in the API reference.
SDK 0.1.0
Request ids, idempotency keys and SDK 0.1.0
- AddedAPIEvery answer carries
X-Request-Id; send your own to have it echoed. Audit log entries record it. - AddedAPI
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. - AddedAPI
RateLimit-Limit,RateLimit-RemainingandRateLimit-Resetheaders on rate-limited calls. - AddedSDK
@workwae/sdk0.1.0: errors exposerequestId, and every POST sends anIdempotency-Keythat is reused across the SDK's own retries (or passcontext.idempotencyKey). - AddedWebhooksSecret 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. - AddedWebhooks
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. - AddedAPIAPI keys can expire, and can be renamed, rescoped and rotated with a grace period on the board. A request with an expired key answers 401 with the new reason
api_key_expired.
A consistent /v1 surface
- BreakingAPIPaths 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/*. - BreakingAPIError 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. - BreakingAPIListings answer
{ items, nextCursor }pages or, for small bounded lists,{ items }. Creates answer 201, deletes 204, accepted work 202. - BreakingAPI
DELETEoperations take their options in the query string, not a body. - BreakingWebhooksEvent types were renamed (
calendar_event.*,suppression.created), and webhooks andGET /v1/changesshare one event envelope with typeddataper event type. - BreakingSDKThe 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). - AddedAPIEvery schema is a named component of the OpenAPI document (
/v1/openapi.json), and every operation lists the reasons it can answer with. - ChangedAPIDeleting an account or a tenant revokes its Google grant.
- ChangedAPIWhen 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
- AddedAPIManage suppression lists (
/v1/suppressions) and review opt-outs detected in replies (/v1/suppression-reviews). - AddedAPI
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. - AddedAPI
GET /readyzreports whether the API can serve (database and Redis answer);/healthzturns 503 while an instance drains. - AddedAPIA connect session without a
redirectUriends on a workwae outcome page. - AddedAPIPlans have modules (calendar, contacts, tracking, AI, meetings, shared mailboxes): a module outside the tenant's plan answers 403
plan_module_unavailable. - AddedWebhooksWebhook tester inboxes on the board capture deliveries for inspection.
- ChangedWebhooksNew webhook endpoints must use https.
- ChangedWebhooksAn endpoint answering 429 or 503 is backed off politely, honoring
Retry-After, without counting against its failure streak. - FixedAPIA send whose SMTP reply was lost after the message was handed over fails with
outcome_unknowninstead of being sent again. - FixedSDKWebhook verification computes the signature once and checks at most 8 candidate signatures.
List unsubscribe, Markdown templates and search
- AddedAPISends and mail merges take a
listId: one-click unsubscribe headers (RFC 8058),{{rcpt.unsubscribeUrl}}, and recipients on the list or the global list skipped. - AddedAPITemplates take
format: "markdown". - AddedAPISuppress up to 1,000 addresses in one call with
POST /v1/suppressions/{listId}/entries. - AddedAPI
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
- AddedAPIStored Handlebars templates (
/v1/templates), previews (POST /v1/template-renders), andtemplateplusrender.paramson sends and drafts. - AddedAPIMail merges:
POST /v1/accounts/{accountId}/mail-mergessends one message per recipient, each with its own params, events and tracking. - AddedSDKThe
workwae templates pushcommand uploads react-email components as templates.
Open and click tracking
- AddedAPISends track opens and clicks per account or per send (
tracking), tell people from proxies, prefetchers and scanners, and reportmessage.openedandmessage.clickedevents. - AddedAPIAn optional honeypot link catches scanners;
GET .../outbox/{outboxId}/trackinglists every hit with what its request revealed. - AddedAPI
GET /v1/accounts/{accountId}/outbox/{outboxId}reads one send.
Message priority
- AddedAPISends and drafts take
priority(high,normal,low); messages carryimportance.
Contacts, meetings, threads and the SDK
- AddedSDKThe TypeScript SDK,
@workwae/sdk, typed from the API contract, with cursor and webhook helpers. - AddedAPIIMAP and SMTP accounts, with calendars and contacts over CalDAV and CardDAV.
- AddedAPIContacts sync and free/busy availability (
POST .../availability/find). - AddedAPIZoom and Webex meetings for calendar events, and
onlineMeetingUrlfor links from other services. - AddedAPIThreads, send-as identities, signatures and
message.bouncedevents. - AddedAPIAn undo send window (
undoSendSeconds), scheduled sends and rescheduling. - AddedAPIOrganization-wide connections and shared mailboxes.
- AddedAPIMessage body storage and full-text search; data exports and account purge.
- AddedWebhooksEndpoint filters by mailbox and message criteria; delivery log, replays and test events.
First release
- AddedAPIThe /v1 API: hosted and headless OAuth connect for Google and Microsoft 365, mail and calendar endpoints with push intake, webhooks and the change feed.