HookChat · a Jiffi product

Instagram and Messenger DMs, as a webhook.

Connect Instagram and Messenger business accounts to one webhook URL. Every direct message arrives as one normalised, signed event. Reply with one API call, inside Meta's messaging windows, never around them. Think Stripe webhooks, for DMs.

// Every message arrives as one signed webhook event.
{
  "id": "evt_9f2a1c7d4b8e0a3f6c2d5e91",
  "type": "message.received",
  "created": 1737000000,
  "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: process.env.HOOKCHAT_API_KEY })

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

One event shape

Instagram and Messenger DMs are normalised into one event envelope: the same { id, type, created, data } shape whichever platform they came from. The original Meta payload rides along under data.message.raw, so nothing is hidden from you.

Signed deliveries

Every delivery is HMAC-SHA256 signed over the exact bytes (HookChat-Signature: t=,v1=). Verify with the @hookchat/node SDK and reject anything that doesn't match.

A real retry contract

At-least-once delivery with seven backoff legs over about 33 hours, then a dead-letter queue. Failing endpoints auto-pause; you can replay any delivery from the console or the API.

Window-safe sending

HookChat computes Meta's messaging window for every conversation and exposes it. Two send routes, no message tags: the policy is impossible to violate by accident.

Built for platforms, not one business

Each of your customers connects their own account, isolated by construction. Scoped API keys, per-workspace isolation, and an audit trail of who did what. A cross-tenant id 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. You receive messages as events and send replies as API calls. There is no inbox to log into and no UI to learn.

What it is

HookChat is webhook infrastructure for Instagram and Messenger DMs, the way Stripe webhooks are infrastructure 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. If you want a UI for a team to chat with customers, build it on top of the API. HookChat only ever sends replies inside Meta's messaging windows, so it is the wrong tool for a marketing broadcast.

Free during beta

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