Managed durable event bus · people and AI agents get the same events

Take event delivery
out of your business code.

Publishers just emit business events; retention, access control, retries and catch-up are handled for you. The same events reach people over SSE or WebSocket, and AI agents over MCP.

No credit card · three ways in: HTTP, SDK or MCP

Event retention

Messages stay for the retention window, so they don't vanish when the receiver is offline; replay by cursor within it.

Retries and dead-letter

Webhook deliveries retry automatically; the ones that exhaust retries land in a dead-letter queue you can inspect and replay.

Catch-up after disconnects

SSE resumes from the same cursor on reconnect and fills the gap, within a bounded replay window.

Key scoping

A key is scoped to an action and a topic; room-aware interfaces can narrow it further. Anything beyond returns 403.

Use cases

Where the events need to go decides which path you take

Five common shapes of event delivery. Each card states its own limits, so you don't have to open the docs to find out.

A / Notifying external systems

Business events out to another system

Events that fail to reach a webhook are retried automatically; once retries are exhausted they land in a dead-letter queue and can be replayed event webhook dead-letter replay ✗ ×3

When orders, tickets or billing state need to reach another system, deliver over Webhook. Failures retry automatically; once retries are exhausted the message lands in a dead-letter queue you can inspect and replay.

Limit: the dead-letter queue only takes Webhook delivery failures — publish and long-poll consumption failures do not go there.

B / Live state in the browser

Show what happened on the backend, live

Catch up on history within the retention window, then continue from the same cursor into the live stream — no gap and no duplicates in between history (within retention) live cursor handover no gap, no duplicates

Chat messages, task progress and page state go downstream over SSE or WebSocket. On reconnect you continue from the same cursor — no gap and no duplicates.

Limit: WebSocket is downstream-only, upstream messages are dropped; SSE catch-up is bounded by the retention window and a 5,000-message cap per resume.

C / AI agent subscriptions

Agents subscribe to business events directly

An event wakes a long-running agent the moment it arrives, instead of polling every few minutes long-lived subscription event agent polling, for comparison empty-handed

Agents subscribe through the official MCP Server — no separate event-to-LLM bridge to build. A new message wakes the agent instead of it polling every few minutes.

Limit: MCP's governance tools need an admin-scoped key, and a key needs an account before it can be minted.

D / Room isolation

One topic, many rooms that don't leak into each other

A message published to a room only reaches subscribers of that room; other rooms do not receive it publish room: vip room: main presence

Split one event stream by room. Publishing and SSE / WebSocket subscriptions can both be scoped to a room, so you don't need a topic per group.

Limit: HTTP long-poll has no concept of rooms — it is always the whole topic; presence is aggregated per topic, not per room.

E / Least privilege

One key opens exactly one path

One capability key is bound to a single action on a single topic; anything beyond that returns 403 capability key orders · publish billing admin 403 403

A key is scoped to an action and a topic; interfaces that support rooms can narrow it further. Anything beyond that returns 403, so a leaked key exposes only the one path it opens.

Limit: the dashboard cannot mint room-scoped keys — that goes through the API or an SDK.

Why not just run Kafka

You want event delivery — not necessarily another Kafka to maintain

Kafka is underneath. The difference is who carries the six things below.

Running Kafka yourself Using MsgMesh
Ops Cluster, monitoring, upgrades, scaling Managed — no Kafka to babysit
Retries & dead-letter Design your own backoff, persistence, replay Webhook failures retry automatically; exhausted ones go to a replayable dead-letter queue
Resuming after disconnects Track offsets and handle reconnect catch-up yourself SSE resumes by cursor inside a bounded replay window
Backfilling history Stand up separate history storage History query, then continue into the live stream from the same cursor
Permissions Build your own ACL and tenant isolation Keys scope to an action and a topic; room-aware interfaces narrow further, anything beyond returns 403
AI access Write your own event-to-LLM bridge Official MCP Server — agents subscribe directly

Room scoping applies to publishing, SSE / WebSocket subscriptions, and history queries carrying room; HTTP long-poll operates on the whole topic.

Quickstart

Send your first event

Create a topic, then publish. Run the two separately — creating a topic that already exists returns 409, so putting them in one script stops the second run at the first line.

First-time setup (run once)
curl -X POST 'https://msgmesh-api.alderflux.com/v1/topics' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"name": "orders"}'
Everyday publishing (repeatable)
curl -X POST 'https://msgmesh-api.alderflux.com/v1/topics/orders/messages' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"orderId": "order_12345", "currency": "TWD", "status": "paid"}'

TypeScript, Python and MCP snippets — and how to fill in the three service URLs — are on Quickstart.

How you receive, and the limits

Four ways to receive, with different semantics

MethodDelivery semantics Where it runsNotes
Webhookat-least-once Needs a publicly reachable URLRetries automatically; exhausted deliveries go to a replayable dead-letter queue
SSE stream()at-least-once Browser; the JavaScript SDK does not currently support SSE on NodeReconnects catch up inside a bounded replay window
WebSocket streamWs()at-least-once Browser, or Node 22+Downstream-only; publish over HTTP
HTTP long-poll subscribe()at-most-once Node and browserThe offset commits on fetch — a lost response cannot be retrieved

In production, name your consumer group explicitly. Consumers in the same group share the messages between them; different logical subscribers should each use their own group rather than silently sharing default.

Python's WebSocket support needs an optional dependency; see the docs for runtime details.

Ways in and out

One stream of events: three ways in, four ways out

INGEST
  • HTTP APIAny backend or existing system
  • SDKTypeScript and Python
  • MCP ServerAgents subscribe and govern directly
DELIVER
  • SSELive in the browser, bounded catch-up
  • WebSocketDownstream only
  • HTTP long-pollNo long-lived connection
  • WebhookThe platform calls your endpoint

Public beta scope

The limits up front, so you can decide if it fits

Delivery semantics

No exactly-once. SSE, WebSocket and Webhook are at-least-once; HTTP long-poll is at-most-once. Deduplicate by message id.

Single site · RF=1

Deployed in a single Taiwanese facility with single-replica Kafka. A disk or broker failure can permanently lose messages inside the retention window.

SSE replay is bounded

Catch-up is bounded by the retention window and 5,000 messages per resume. Beyond that you receive msgmesh-resync and must rebuild state from your own systems — there is no snapshot.

Retention

The free plan retains 3 days; the 30-day retention plan is not open during beta. This is not permanent event storage.

Where rooms apply

Publishing, SSE / WebSocket subscriptions and history queries carrying room. HTTP long-poll works on the whole topic, and presence is aggregated per topic.

Dead-letter is Webhook-only

The dead-letter queue only handles Webhook delivery failures. Publish failures and long-poll consumption failures do not go there.

If your events directly affect payments, inventory or other core transactions, weigh RF=1 and the single site against your risk requirements first.

Send your first event

The free plan is plenty to get the hang of it · No credit card

Get started free → See pricing first →