Plug the engine into your stack.
Liquidchat is headless. Your CRM stays in charge: it tells the engine which creators and fans to work, and the engine reports every sale back by webhook. Four calls get you live.
- Connect a creator with her voice, her rules and her prices.
- Point your inbox at the engine. New fan messages flow in; replies flow out through your tools.
- Listen for
sale.completedto log revenue in your CRM in real time. - Take over any conversation with one call. Your team gets the chat; the engine steps back.
lc_test_ and never touch a live page. Keys are scoped to one agency.https://api.liquidchat.ai/v1curl https://api.liquidchat.ai/v1/creators \ -H "Authorization: Bearer lc_test_51Kd8mQv2TzRw0aLx7Hn"
Create a creator
Registers a creator page with the engine. The engine learns her voice from recent conversations, then follows the rules you set here exactly. Your AI starts off until you turn it on.
Body
Your CRM’s id for this creator. Used in every event we send you.
onlyfans or fansly.
What she never says or does.
Words and phrases the engine will never use for her.
No PPV is offered below this price.
Topics handed straight to your team, e.g. meetup, refund.
Defaults to false. Turn on per creator, per fan or by schedule.
curl https://api.liquidchat.ai/v1/creators \ -H "Authorization: Bearer lc_test_…" \ -H "Content-Type: application/json" \ -d '{ "external_id": "crm_creator_07", "platform": "onlyfans", "rules": { "never_say": ["babe", "daddy"], "price_floor_cents": 1200, "escalate_on": ["meetup", "refund"] }, "ai_enabled": false }'
{
"id": "cr_9Lq2xVb7",
"object": "creator",
"external_id": "crm_creator_07",
"voice": { "status": "learning", "eta_minutes": 40 },
"ai_enabled": false,
"holdout": { "share": 0.10 },
"created": "2026-10-22T09:14:03Z"
}Take over a conversation
Hands one conversation to your team, instantly. The engine stops mid-thought, holds any message it had queued, and won’t reply again until you hand it back.
Path
The conversation id, e.g. cv_….
Body
Your CRM’s id for the team member taking over.
Shown in Monitor and in the audit log.
Drop the engine’s queued reply instead of showing it to your team as a draft. Defaults to false.
const lc = new Liquidchat(process.env.LIQUIDCHAT_KEY); await lc.conversations.takeover("cv_3Rk81Zq", { assignee: "crm_user_212", reason: "VIP fan, handle personally", });
{
"id": "cv_3Rk81Zq",
"object": "conversation",
"handled_by": "human",
"assignee": "crm_user_212",
"queued_draft": "give me two minutes, sending it over now",
"took_over_at": "2026-10-22T23:41:08Z"
}sale.completed Event
Sent the moment a fan pays for content or tips in a conversation the engine handled. Use it to log revenue in your CRM, pay commissions and reconcile your invoice.
Payload
Gross amount the fan paid, before platform fees.
ppv, tip or bundle.
engine when the engine made the sale, holdout when it happened in your team’s control group. Both arrive, so you can compare.
new, returning, cold or whale.
Liquidchat-Signature header with your endpoint secret before you trust the payload.{
"id": "evt_7Hc2pW0d",
"type": "sale.completed",
"created": "2026-10-22T23:41:06Z",
"data": {
"creator": "crm_creator_07",
"conversation": "cv_3Rk81Zq",
"amount_cents": 4500,
"currency": "usd",
"kind": "bundle",
"attribution": "engine",
"fan_segment": "new",
"messages_to_sale": 3
}
}app.post("/webhooks/liquidchat", (req, res) => { const event = lc.webhooks.verify( req.rawBody, req.headers["liquidchat-signature"], secret ); if (event.type === "sale.completed") crm.logRevenue(event.data); res.sendStatus(200); });