A quick guide to sending and receiving messages with your tenant. The commands below are filled in with your base URL and tenant UUID — copy and paste them as-is.
| Base URL | … |
|---|---|
| Tenant UUID | … |
A channel holds the most recent JSON message
posted to it. POST a message to publish it; GET returns
the last message, or streams live events if you ask for an event stream. A
channel name must match one of your topic patterns
(e.g. a test* rule would match test1); add rules on the
Topics page. Channel names may use letters, digits,
., _ and -.
Messages are ephemeral. A channel keeps only the last message, and holds it for up to 24 hours — but it may be evicted sooner, so treat reads as best-effort.
POST a JSON body (≤ 5000 bytes). A successful publish
returns 202 Accepted.
…
GET returns the last message as JSON, or
204 No Content if nothing has been posted yet.
…
Add Accept: text/event-stream to receive a
Server-Sent Events stream. It starts with the last message (if any), then
delivers each new message as it arrives.
…
A channel whose topic rule has no token is open — no
Authorization header is needed. Otherwise send the channel's write
token (to post) or read token (to read) as a bearer token. Configure these on
the Topics page.
…
You can also use an API token as the
bearer. Its value is <tenant-uuid>:<secret> — created
once on the Tokens page (the secret is shown only at creation time).
429 Too Many Requests).202 published, 204 no message yet,
200 message returned, 400 bad request,
401 unauthorized, 404 no such channel,
413 payload too large, 429 rate limited,
503 active-channel limit reached.These endpoints manage your tenant and are separate from the
public pub/sub API above. They require an API token
with the admin scope, sent as
Authorization: Bearer <uuid>:<secret> (the web console
uses your signed-in session instead). <uuid> is your tenant
UUID.
Click an endpoint for example request/response JSON.
GET /tenant/<uuid>/info — tenant metadata, tokens, and usageResponse
{
"id": "11111111-1111-1111-1111-111111111111",
"name": "Acme",
"email": "you@example.com",
"tokens": [
{ "id": "k3f9c2", "name": "my-app", "scopes": ["admin"], "used_days_last_7": 3 }
],
"usage": {
"topic_rules": { "count": 2, "limit": 1000 },
"api_tokens": { "count": 1, "limit": 50 },
"active_channels": { "count": 0, "limit": 1000 }
}
}
GET /tenant/<uuid>/topics — list the topic rulesResponse
{ "topics": [ { "pattern": "news.*", "write": "wtok", "read": "" } ] }
PUT /tenant/<uuid>/topics — replace the whole topic listRequest
{ "topics": [ { "pattern": "news.*", "write": "wtok", "read": "" } ] }
Response — the saved list
{ "topics": [ { "pattern": "news.*", "write": "wtok", "read": "" } ] }
POST /tenant/<uuid>/topic — add one topic ruleRequest
{ "pattern": "news.*", "write": "wtok", "read": "" }
Response — the updated list
{ "topics": [ { "pattern": "news.*", "write": "wtok", "read": "" } ] }
PATCH /tenant/<uuid>/topic — change a rule's write/read tokensRequest — pattern selects the rule
{ "pattern": "news.*", "write": "new-wtok", "read": "" }
Response — the updated list
{ "topics": [ { "pattern": "news.*", "write": "new-wtok", "read": "" } ] }
DELETE /tenant/<uuid>/topic — remove a topic ruleRequest
{ "pattern": "news.*" }
Response — the remaining list
{ "topics": [] }
GET /tenant/<uuid>/tokens — list API tokens (no secrets)Response
{ "tokens": [ { "id": "k3f9c2", "name": "my-app", "scopes": ["admin"], "used_days_last_7": 3 } ] }
POST /tenant/<uuid>/token — create an API tokenRequest (scopes and expires_at optional)
{ "name": "my-app", "scopes": ["admin"] }
Response — the secret is shown only here
{
"id": "k3f9c2",
"name": "my-app",
"scopes": ["admin"],
"credential": "11111111-1111-1111-1111-111111111111:SECRET",
"authorization": "Bearer 11111111-1111-1111-1111-111111111111:SECRET"
}
DELETE /tenant/<uuid>/token — delete an API tokenRequest
{ "id": "k3f9c2" }
Response
{ "deleted": "k3f9c2" }
GET /tenant/<uuid>/log — recent admin activity, newest firstResponse
{
"entries": [
{
"ts": "2026-06-15T00:00:00Z",
"ip": "203.0.113.7",
"tenant": "11111111-1111-1111-1111-111111111111",
"email": "you@example.com",
"action": "create topic",
"topic": "news.*"
}
]
}
GET /tenant/<uuid>/channels — list currently-live channel namesThe concrete channels in use right now (those with a live in-memory message), not the topic patterns. Sorted.
Response
{ "channels": ["news.sports", "news.weather"] }