HookChat · a Jiffi product

Instagram and Messenger DMs, as a webhook.

Connect Instagram and Messenger business accounts to one webhook URL. Every DM lands on it as one signed event, the same shape for both platforms. Reply with one API call, inside Meta's messaging window. Think Stripe webhooks, for DMs.

SDKs for TypeScript, Python and Go, plus a command line tool.

// Every message arrives as one signed webhook event.
{
  "id": "evt_9f2a1c7d4b8e0a3f6c2d5e91",
  "type": "message.received",
  "created": 1787886862,
  "data": {
    "message": {
      "id": "mid.abc123",
      "conversation_id": "CONV#acme#instagram#17841405309211844#6021573449812077",
      "tenant": "acme",
      "platform": "instagram",
      "direction": "inbound",
      "text": "Hey, can I get a quote for a half-sleeve?",
      "attachments": [],
      "timestamp": "2026-08-28T03:14:22Z",
      "account": { "external_id": "17841405309211844", "handle": "brunswick.ink" },
      "participant": { "id": "6021573449812077" },
      "raw": { /* the exact Meta payload, always included */ }
    }
  }
}
// Reply with one call, inside the 24 hour window.
import { HookChat } from '@hookchat/node'

const hookchat = new HookChat({ apiKey: 'hookchat_live_...', baseUrl: 'https://hookchat.dev' })

await hookchat.messages.reply({
  conversation_id: 'CONV#acme#instagram#17841405309211844#6021573449812077',
  text: 'Happy to help. Can you send a reference image?',
})
// -> { platform_message_id: 'mid.def456' }

One event shape

Instagram and Messenger DMs arrive as one event, the same { id, type, created, data } shape whichever platform sent them. The original Meta payload rides along under data.message.raw, so nothing is hidden.

Signed deliveries

Every delivery is signed (HookChat-Signature: t=,v1=). Check the signature with an SDK or the CLI and drop anything that fails. One line of code.

A real retry contract

Retries that keep going: eight tries over about 33 hours. Then the delivery gives up and waits for you. A failing endpoint pauses itself. Replay any delivery from the console, the CLI or the API.

Window-safe sending

HookChat works out Meta's reply window for every conversation and shows it to you. Two send routes, no message tags: you cannot break the rules by accident.

Built for platforms, not one business

Each of your customers connects their own account and never sees another. Scoped API keys, one workspace per customer, and an audit trail of who did what. An id from another workspace is a 404, never a leak.

Built for the loop

The whole system is one loop: Meta → HookChat → your webhook → your code → HookChat send → Meta. Messages come to you as events. Replies go back as API calls. The console lets you inspect delivery failures, manage keys and endpoints, and read or reply to conversations. Your application can use the API for the same messaging loop.

What it is

HookChat is the plumbing between Instagram and Messenger DMs and your code, the way Stripe webhooks are the plumbing for payments. It is built for platforms, not one business: every workspace on your product connects its own accounts, and every message they receive lands on a URL you control as one clean event. Want a screen for your team to chat with customers? Build it on the API. HookChat only sends replies inside Meta's messaging window, so it is the wrong tool for a marketing blast.

Free during beta

HookChat is in beta and free while we get it right. No bill, no card, no meter. See the planned tiers on the pricing page.