First-party app
Heartbeat

Heartbeat

Manage a Heartbeat community — members, groups, channels, threads, events, courses and documents.

stable CommunicationSocial Media

About

Heartbeat ships in the w6w first-party pack. It declares 54 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.heartbeat
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Communication · Social Media

Overview

Heartbeat (heartbeat.chat) is a community platform: members, groups, discussion channels, live/voice channels, events, direct messages, courses and a document wiki, all inside one paid community. This app covers the full surface of Heartbeat’s own public REST API, verified directly against the vendor’s OpenAPI 3.0 document embedded in its ReadMe-hosted reference (fetched 2026-09-05, info.version 1.0.0) plus live probes against api.heartbeat.chat and status.heartbeat.chat.

Membership: list, get, create, update, delete and reactivate users; look a user up by email; invitations and pending-user seats; roles; groups and group membership. Structure: channel categories, post/chat/voice channels. Content: threads, comments, direct chats and direct messages, chat-channel messages, events (including recurring instances and attendance), webhooks for reacting to community activity, courses and lessons, native videos, and the document wiki.

Every text field Heartbeat accepts (thread/comment/message bodies) is a restricted HTML subset — , , , -, , , — not Markdown; anything else is silently stripped, and this app’s params say so rather than let that surprise a workflow author.

Build with Heartbeat

Three routes to the same 54 actions. The Workflow tab is generated from Heartbeat's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Add Users to Group

add-to-group

Add members to a group by email.

Create Channel

create-channel

Create a new POSTS (thread) or CHAT channel. Thread channels are created by default.

Create Channel Category

create-channel-category

Create a new channel category.

Send Chat Channel Message

create-chat-message

Send a message to a CHAT channel.

Create Comment

create-comment

Reply to a thread, or reply to a top-level comment on it.

Get or Create Direct Chat

create-direct-chat

Create a direct chat between two users. If one already exists, its id & URL are returned instead of creating a duplicate.

Send Direct Message

create-direct-message

Send a direct message to a user.

Create Event

create-event

Create a new event. If both Invited users and Invited groups are empty, the event is open to the whole community.

Create Group

create-group

Create a new group in the community.

Create Invitation Link

create-invitation

Create a new invitation link. Members joining via it get this role and these groups.

Create Lesson

create-lesson

Create a lesson (text only — no video hero or embed cards; see this action's own docs for why those are left out).

Create Pending User

create-pending-user

Seat a member before they ever log in. On their first login they become a real member with these attributes. Calling this again for the same still-pending email updates it instead of erroring; calling it for an email that is already a real member returns an error.

Create Thread

create-thread

Post a new thread in a channel.

Create User

create-user

Create a new member in the community directly (no invitation email is required).

Create Voice Channel

create-voice-channel

Create a new voice channel.

Create Webhook

create-webhook

Register a webhook that fires on one Heartbeat community event.

Delete Channel

delete-channel

Delete a channel.

Delete Channel Category

delete-channel-category

Delete a channel category.

Delete Group

delete-group

Delete a group.

Delete User

delete-user

Remove a member from the community. Their threads, comments and messages are kept — only access is revoked. Reversible with Reactivate User.

Delete Webhook

delete-webhook

Delete a webhook.

Find User by Email

find-user

Look up a member by email address.

Get Document

get-document

Fetch a single document (wiki post), including its content.

Get Event

get-event

Fetch a single event.

Get Event Attendance

get-event-attendance

Return attendance for the last 10 instances of an event. A non-recurring event returns one entry.

Get Group

get-group

Fetch a single group, including its members.

Get Lesson

get-lesson

Fetch a single lesson by id.

Get Notification Count

get-notifications

Get the number of pending notifications a specific member has.

Get Thread

get-thread

Fetch a single thread, including its comments.

Get User

get-user

Fetch a single Heartbeat community member by id.

List Channel Categories

list-channel-categories

Return every channel category in the community.

List Channels

list-channels

Return every channel in the community — POSTS (thread), CHAT and VOICE channels.

List Chat Channel Messages

list-chat-channel-messages

Page through a CHAT channel's message history, oldest-cursor forward.

List Courses

list-courses

Return every course in the community, including its cohort/module/lesson tree.

List Direct Messages

list-direct-messages

Return the 100 most recent messages from a direct chat. Only reachable when the chat includes at least one admin user.

List Documents

list-documents

Page through the document wiki index. Heartbeat gives no `hasMore` signal here — a page shorter than the requested Limit is the only reliable end-of-list indicator.

List Event Instances

list-event-instances

Return every occurrence of a recurring event, past and future.

List Events

list-events

Return every event in the community, optionally filtered to one invited group.

List Groups

list-groups

Return every group in the community.

List Invitations

list-invitations

Return every invitation link in the community.

List Roles

list-roles

Return every role defined in the community.

List Threads in Channel

list-threads

Return the 20 most recent threads in a channel. Not paginated beyond that.

List Users

list-users

Return every member of the Heartbeat community. Heartbeat paginates nothing here — this is the full member list in one response.

List Videos

list-videos

Return every native Heartbeat video in the community.

List Webhooks

list-webhooks

Return every webhook registered on this API key.

Reactivate User

reactivate-user

Restore a previously-deleted member's access to the community.

Remove Users from Group

remove-from-group

Remove members from a group by email.

Update Channel

update-channel

Edit a channel. All fields are optional; only provided fields change.

Update Channel Category

update-channel-category

Rename a channel category.

Update Group

update-group

Edit a group. All fields are optional; only provided fields change.

Add Users to Invitation

update-invitation

Add email addresses to an existing invitation link.

Update Lesson

update-lesson

Edit a lesson's title, content or publish status. Only provided fields change; an existing video hero or embed cards are left untouched.

Update User

update-user

Update a member's profile fields, addressed by email. Only provided fields change.

Update Voice Channel

update-voice-channel

Edit a voice channel. All fields are optional; only provided fields change.

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Heartbeat's real ids.

{
  "manifestVersion": "2",
  "name": "heartbeat-example",
  "steps": [
    {
      "id": "add-to-group",
      "uses": {
        "app": "io.w6w.heartbeat",
        "action": "add-to-group",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "groupID": "<groupID>",
        "emails": "<emails>"
      }
    }
  ]
}

Here are some of the things you can do

  • Add Users to Group

    perform
    add-to-group
  • Create Channel

    perform
    create-channel
  • Create Channel Category

    perform
    create-channel-category
  • Send Chat Channel Message

    perform
    create-chat-message
  • Create Comment

    perform
    create-comment

+49 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Heartbeat, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Heartbeat. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "add-to-group",
  payload: {
    groupID: "<value>",
    emails: "<value>",
    // shouldRemoveFromSiblingGroups: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action add-to-group --payload '{"groupID":"<value>","emails":"<value>"}'

Give an AI agent Heartbeat — without giving it Heartbeat's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.heartbeat#add-to-group",
    "input": {
      "groupID": "<groupID>",
      "emails": "<emails>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Heartbeat connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Heartbeat's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Heartbeat itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Heartbeat declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Heartbeat platform status

Reads the "Heartbeat Communities" component from status.heartbeat.chat. Heartbeat has no separately-tracked API component — this backend serves both the web community product and this REST API — so that component is the signal for both. The page's other component, Mobile Apps, is dropped: a native-app outage says nothing about REST API availability.

quota

Rate-limit headroom

Reads x-ratelimit-limit/remaining/reset off GET /v0/roles. Heartbeat documents only "10 requests/second"; the headers reveal the real window is a rolling ~2 seconds (limit 20 over 2s = 10/s average).