Chati · a Jiffi product

Meta DMs, on your webhook, as one signed event.

Connect Instagram and Messenger business accounts to a single webhook URL. Every direct message arrives as one normalised, signed event. Reply with one API call — inside Meta's messaging windows, never around them. Chati is webhook infrastructure for Meta messaging, not a campaign tool.

// 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#17894#4471",
      "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": "17894", "handle": "brunswick.ink" },
      "participant": { "id": "4471" },
      "raw": { /* the exact Meta payload, always included */ }
    }
  }
}
// Reply with one call, inside the 24-hour window.
import { Chati } from '@chati/node'

const chati = new Chati({ apiKey: process.env.CHATI_API_KEY })

await chati.messages.reply({
  conversation_id: 'CONV#acme#instagram#17894#4471',
  text: 'Happy to help — can you send a reference image?',
})
// -> { ok: true, data: { platform_message_id: 'mid.def456' } }

One unified 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 (Chati-Signature: t=,v1=). Verify with the @chati/node SDK and reject anything that doesn't match.

A real retry contract

At-least-once delivery with seven backoff legs over ~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

Chati 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.

Multi-tenant by construction

Scoped API keys, per-tenant 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 → Chati → your webhook → your code → Chati 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 isn't

Chati is not a CRM, not a chatbot builder, not a campaign tool, and not an inbox. It is webhook infrastructure for Meta messaging. If you want a UI for your team to chat with customers, build it on top of the API. If you want to send a marketing broadcast, Chati is the wrong tool — it only ever sends replies inside Meta's messaging windows. If you want every message your business receives delivered as a clean event to a URL you control, Chati is for you.

Free during beta

Chati is in beta and free to use while we get it right — no billing, no credit card. See the planned tiers on the pricing page.