Changelog
Every customer-visible change to the Kirimdev platform ships with a release note here — new endpoints, SDK versions, MCP tool additions, behavior changes, and deprecations. Newest first.
- API reference readability improvements
Public API operation pages now include complete parameter guidance, pagination semantics, retry headers, and status-specific error examples.
- Message status error details restored
Meta delivery failures now preserve structured errors and pricing metadata in message.status webhooks.
- WhatsApp reactions in Public API v1
Send emoji reactions through the messages endpoint and reliably receive inbound reaction webhooks.
- Media card carousel templates (create + send)
Create and send WhatsApp media card carousel marketing templates — up to 10 swipeable product cards, each with an image/video header and its own buttons — via the API, SDK, and MCP.
- Guide — message correlation & tenant routing for platform mode
A new platform-mode reference page explains, end to end, how to route each message webhook to the right end-customer and correlate a msg_ send with the wamid in its delivery-status webhooks.
- Edit message templates via API and SDK
New PATCH /v1/{phone_number_id}/templates/{name} endpoint (plus SDK templates.update()) edits an existing WhatsApp template's content and re-submits it to Meta for review.
- BSUID identity-change ingestion & webhook accuracy
contact.identity_updated now also fires when a WhatsApp user changes their phone number (delivered by Meta as a system message), batched multi-sender webhooks label each message with its own contact, and outbound status webhooks report the parent BSUID field under its current name.
- MCP server supports protocol revision 2026-07-28
The Kirimdev MCP server now speaks MCP protocol revision 2026-07-28 alongside the 2025-era revisions. Clients that negotiate the newer revision connect without change; existing clients are unaffected.
- Template responses now include category
GET template list and retrieve responses now return the Meta template category (MARKETING / UTILITY / AUTHENTICATION), closing the gap where category could be submitted on create but not read back.
- Webhooks for pre-delivery send failures + longer transient retries
message.status now fires a failed event for sends that fail before Meta admits them (131000 outages, quota/compliance refusals), and transient Meta failures retry on a longer 1m/5m/15m schedule before giving up.
- Disconnect a customer's WhatsApp account over the Public API
New DELETE /v1/customers/{id}/whatsapp_accounts/{phone_number_id} endpoint (plus kirim.customers.disconnectWhatsappAccount in the SDK) lets you remove a WhatsApp account a customer connected via a setup link, without touching the dashboard.
- media_upload_failed names the real cause, WebP uploads are rejected early, and the failed-sends error tables are corrected
The media_upload_failed message now points at Content-Type instead of connectivity, WebP image uploads are rejected before they reach Meta, and the failed-sends guide no longer documents error codes and statuses the API never returns.
- Message history is now deleted after your plan's retention window
Messages older than your plan's history retention window are permanently deleted, along with the inbound media Kirimdev downloaded for them. Contacts, conversations, Media Library files and broadcast campaigns are unaffected. Aggregate analytics remain available for deleted periods.
- A past-due subscription no longer reports itself as a quota problem
Sends refused because your Kirimdev subscription lapsed now return `subscription_inactive` instead of `invalid_request` with a "monthly quota exceeded" message.
- Webhook deliveries now tell you why they failed
New `error_code` and `error_message` fields separate what your endpoint returned from why we could not deliver. Terminating a delivery no longer erases its attempt history.
- Template names are validated, and inbound messages with control characters no longer disappear
POST /v1/{phone_number_id}/messages now trims and validates template.name instead of forwarding malformed names to Meta. Separately, an inbound message containing a NUL byte no longer fails to arrive.
- Register a WhatsApp number via API and SDK
New POST /v1/{phone_number_id}/register endpoint (plus SDK phoneNumbers(id).register()) finishes onboarding a number with its two-step-verification PIN. GET /v1/accounts now also returns meta_status.
- Revoke/edit webhook events and unsupported sub-kind hint
Two new webhook events (message.revoked, message.edited) and an unsupported.type hint on message.received so integrators can react to deleted or edited messages from Coexistence numbers.
- Per-account filter for webhook subscriptions
Scope a webhook subscription to a subset of WhatsApp accounts by passing `phone_number_ids`. Omit the field to keep the current behaviour and receive events from every account in the organisation.
- Header and footer on interactive CTA URL messages
The `interactive.type=cta_url` variant now accepts an optional header (text / image / video / document) and footer text — matching Meta's documented shape and the reply_buttons variant.
- BSUID + WhatsApp username support
Public API, SDK, MCP tools, and webhooks now accept and expose Business-Scoped User IDs (BSUID) so you can reach users who adopted a WhatsApp username. Auth OTP templates require a phone number; every other message type accepts BSUID recipients.
- MCP server gains label tools
Six new MCP tools expose label CRUD and contact-scoped attach/detach — labels sync to conversations automatically, so no separate conversation label tools.
- Hermes integration docs clarified
Hermes + Kirimdev documentation now states the integration is for owner access to Kirimdev via WhatsApp chat — not end-customer AI support.
- message.sent media_url for outbound attachments
Outbound image, video, audio, document, and sticker webhooks now include message.media_url — parity with inbound kirim.media_url.
- Faster Public API polling
Redis-backed caches, updated_since delta sync, and ETag/304 on conversation list and message retrieve.
- Create templates with media header from public URL
POST /v1/{phone_number_id}/templates now accepts example.header_url (or an https URL in header_handle); Kirimdev uploads the sample to Meta server-side. Meta validation errors return 400 instead of 502.
- Voice note played status + played_at on messages
Meta's new `played` delivery webhook is ingested without worker errors; GET /v1 messages expose an optional played_at timestamp for outbound voice notes.
- message.sent outbound webhook
Subscribe to message.sent for full outbound message bodies when Kirimdev sends to a customer — API, dashboard, broadcast, or phone-app echo.
- Contextual replies on Public API sends
POST /v1/{phone_number_id}/messages now accepts optional context.message_id to reply to an inbound wamid — same Meta wire shape as the Cloud API.
- Enriched message.received webhooks
Customer webhooks for inbound messages now include an optional kirim block with conversation ids, labels, and a hosted media URL when ready.
- Hermes Agent integration docs
New documentation for the open-source kirimdev-hermes plugin — self-hosted WhatsApp AI gateway on Kirimdev webhooks and the Public API.
- Panduan FAQ jendela 24 jam & template
Halaman docs-site baru dalam Bahasa Indonesia untuk pertanyaan berulang tentang jendela layanan pelanggan WhatsApp, kapan wajib pakai template, dan error outside_24h_window.
- Create message templates via API, SDK, and MCP
New POST /v1/{phone_number_id}/templates endpoint (plus SDK templates.create() and the create_template MCP tool) submits a new WhatsApp message template to Meta for review and persists it locally as pending.
- /v1/me now returns the org's teams
GET /v1/me adds a `teams` array so API and SDK consumers can discover the team_id values required by team-scoped writes (e.g. POST /v1/customers on multi-team orgs) without leaving the API surface.
- Voice notes + faster inbound media downloads
Send audio as a voice-note bubble with audio.voice=true, and have inbound media show up in your inbox roughly twice as fast thanks to a Meta webhook optimisation.
- Dropped the duplicate `token` field from customer setup link create responses
The create-setup-link response previously returned `token` alongside `setup_url`; the same plaintext token was already embedded in the URL's path. The duplicate field is removed in this release.
- New `setup_link_inactive` error code replaces wrong-domain `webhook_subscription_disabled` on customer setup links
PATCH / DELETE on a customer setup link that's no longer active now returns the dedicated `setup_link_inactive` error code (HTTP 409 conflict), instead of the misleading `webhook_subscription_disabled` that previously surfaced.
- Operator suspend now blocks outbound sends on customer-owned accounts
When an operator flips a Customer (tenant-of-tenant) to status `suspended` or `archived`, all outbound sends from that Customer's WhatsApp accounts are now blocked at the send-guard layer with the new `customer_suspended` error code on a 422 response.
- Customers — multi-tenant platform mode
New /v1/customers resource lets you onboard end-customers (tenant-of-tenant) and have them connect their own WhatsApp accounts via setup links. Five new MCP tools plus a TypeScript SDK namespace ship alongside.
- Pre-send compliance checks on POST /messages
The messages endpoint now validates marketing opt-out and WhatsApp account compliance state before queuing the send. New 422 error codes — marketing_opted_out, account_restricted, consent_required, upstream_error — let integrations distinguish recoverable from non-recoverable failures without round-tripping to Meta.
- MCP server gains 5 new tools
The Kirimdev MCP server now exposes 11 tools — adds get_message, list_messages, mark_as_read, create_contact, and update_contact so AI assistants can close the full read-then-reply loop.
- Interactive reply buttons
Send up to 3 tappable quick-reply buttons via interactive.type=reply_buttons. Taps arrive on your webhook as button_reply events.
- Initial release
First public cut of the Kirimdev Public API, TypeScript SDK, MCP server, and developer documentation.