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.