Skip to content

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.