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.
- 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.