Reference
Integrations
Three packages on the same API: a Chat SDK bot that answers on WhatsApp, Instagram, Messenger, SMS and Gmail with one adapter, n8n nodes, and a browser SDK so your customers connect their channels in a popup. They are MIT and live next to the API.
Vercel Chat SDK: @heysteff/chat-adapter#
One adapter for every channel. It receives signed webhooks, turns them into Chat SDK messages, and every thread.post() goes out on the conversation's channel, number and recipient through the same POST /v1/messages.
npm install chat @heysteff/chat-adapter @chat-adapter/state-memoryimport { Chat } from 'chat';
import { createMemoryState } from '@chat-adapter/state-memory';
import { createHeysteffAdapter, threadChannel } from '@heysteff/chat-adapter';
export const bot = new Chat({
userName: 'my-bot',
adapters: { heysteff: createHeysteffAdapter() }, // HEYSTEFF_API_KEY and HEYSTEFF_WEBHOOK_SECRET
state: createMemoryState(),
});
bot.onDirectMessage(async (thread, message) => {
await thread.post(`Writing from ${threadChannel(thread)}: ${message.text}`);
});// app/api/webhooks/heysteff/route.ts
import { after } from 'next/server';
import { bot } from '@/lib/bot';
export async function POST(request: Request) {
return bot.webhooks.heysteff(request, { waitUntil: (task) => after(() => task) });
}- Text, files and buttons: files are uploaded with
POST /v1/media; a card withButtonbecomes reply buttons (up to 3) or a list (up to 10) withcontent_type: "interactive", and taps reachonAction. - A person took the conversation: with
bot_pausedthe bot does not receive messages andthread.postthrowsHeysteffBotPausedErrorwithout sending. - Channel:
thread.channelIdisheysteff:<channel>andthreadChannel(thread)returnswhatsapp_cloud,instagram,facebook,smsorgmail. - History and DMs:
fetchMessagesusesGET /v1/conversations/{id}/messages;adapter.openDM("whatsapp_cloud:+56912345678")opens a thread to write first.
n8n: @heysteff/n8n-nodes-heysteff#
Install it from Settings → Community Nodes as @heysteff/n8n-nodes-heysteff and create a heysteff API credential with your API key.
- heysteff Trigger: on activation it creates its webhook with
POST /v1/webhooksand the events you pick (message:received,customer.channel_connected,payment.paid…), deletes it on deactivation and verifies every signature. It can skip conversations a person took over. - heysteff: send text, templates, files or buttons on any channel; mark as read; create and search contacts; create customers and their connection links.
Connection links in a popup: @heysteff/connect#
For a SaaS whose customers connect their own channel (see Customers and setup links). connect() opens the link in a popup and resolves with { channel_id, customer_id, channel_type }; it rejects if your customer closes the window. Calling it twice still opens one popup.
npm install @heysteff/connectimport { connect } from '@heysteff/connect';
const { channel_id, customer_id, channel_type } = await connect({
// Your server creates the link with customers.createSetupLink.
url: () => fetch('/api/connect-link', { method: 'POST' }).then((r) => r.text()),
});import { ConnectButton } from '@heysteff/connect/react';
<ConnectButton url={createLink} onSuccess={(r) => save(r.channel_id)}>
Connect your WhatsApp
</ConnectButton>The link page notifies via postMessage only the origin of the window that opened it, and the SDK accepts messages only from the link's origin. For your backend, the customer.channel_connected webhook is still the source of truth.
Packages and repositories#
Everything is MIT and uses the same API: the same code for WhatsApp, Instagram, Messenger, SMS and email. Every README includes a prompt ready to paste into Claude Code, Cursor, Codex or ChatGPT. The public repos live at github.com/heysteff-com.
| Name | What it is for | Install | Links |
|---|---|---|---|
@heysteff/sdk | TypeScript SDK: the v1 API with types, retries, webhooks and live events. | npm install @heysteff/sdk | npm · Code |
@heysteff/cli | The heysteff command: messages, conversations and webhooks from the terminal. | npm install -g @heysteff/cli | npm · Code |
create-heysteff | Creates a project from a template with your key in .env.local. | npm create heysteff@latest | npm · Code |
@heysteff/chat-adapter | One Vercel Chat SDK adapter for every channel. | npm install chat @heysteff/chat-adapter @chat-adapter/state-memory | npm · Code |
@heysteff/connect | Opens a setup link in a popup and returns the connected channel. | npm install @heysteff/connect | npm · Code |
@heysteff/n8n-nodes-heysteff | n8n nodes: a trigger with its own webhook and sending on any channel. | npm install @heysteff/n8n-nodes-heysteff | npm · GitHub |
omnichannel-inbox | Template: Next.js inbox for WhatsApp, Instagram, Messenger, SMS and email. | npm create heysteff@latest my-inbox -- --template inbox | GitHub |
ai-agent-starter | Template: AI agent that answers with Claude and hands off to a person. | npm create heysteff@latest my-agent -- --template agent | GitHub |
agent-skills | Skills to integrate, automate and observe heysteff from your coding agent. | npx skills add heysteff-com/agent-skills | GitHub |
agent-plugins | Claude Code plugin (MCP, skills and safety rules), plus Cursor and Codex. | /plugin marketplace add heysteff-com/agent-plugins | GitHub |
In n8n you can also install it from Settings → Community Nodes. In Claude Code, after the marketplace run /plugin install heysteff@heysteff.