/api/v1/contactsreadList contacts, newest first.
- limit (≤200)
- cursor (created_at from the previous page)
- tag
- q (name, phone or email)
curl "http://localhost:3000/api/v1/contacts?tag=vip&limit=50" -H "Authorization: Bearer $KEY"
Everything the app does with contacts, conversations, messages and orders, over HTTPS with JSON. Keys are created in Settings → API & webhooks and scoped to read, write or intake.
http://localhost:3000/api/v1Authorization: Bearer lf_…429 with Retry-After.{ data, next_cursor }; pass cursor back to get the next page.{ error: { code, message } } with a 4xx or 5xx status. Send refusals use the outbound pipeline's codes: OUTSIDE_WINDOW, NO_CONSENT, TEMPLATE_NOT_APPROVED, …/api/v1/contactsreadList contacts, newest first.
curl "http://localhost:3000/api/v1/contacts?tag=vip&limit=50" -H "Authorization: Bearer $KEY"
/api/v1/contactswriteCreate or update a contact by phone or email. Returns 201 when created, 200 when matched.
{ "name": "Rahul Sharma", "phone": "+919876543210", "email": "rahul@example.com", "tags": ["vip"], "notes": "…", "source": "crm" }curl -X POST "http://localhost:3000/api/v1/contacts" -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d '{"name":"Rahul Sharma","phone":"+919876543210","tags":["vip"]}'/api/v1/conversationsreadList conversations with channel, status, AI mode, lead label and score.
curl "http://localhost:3000/api/v1/conversations?status=open" -H "Authorization: Bearer $KEY"
/api/v1/conversations/{id}/messagesreadMessages in a conversation, oldest first.
curl "http://localhost:3000/api/v1/conversations/$ID/messages" -H "Authorization: Bearer $KEY"
/api/v1/conversations/{id}/messageswriteSend a message. Free text needs the 24-hour window to be open; otherwise send an approved template. Consent, approval status and cost rules apply; refusals return 422 with a code.
{ "text": "Hi Rahul, your order is on its way." }
// or
{ "template": { "pack": "ecommerce", "slug": "order_shipped" }, "params": { "customer_name": "Rahul", "order_number": "#1042", "carrier": "Delhivery", "tracking_number": "AWB1" } }curl -X POST "http://localhost:3000/api/v1/conversations/$ID/messages" -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d '{"text":"Hi Rahul, your order is on its way."}'/api/v1/ordersreadOrders synced from the connected store, with items and shipments.
curl "http://localhost:3000/api/v1/orders?cod=pending" -H "Authorization: Bearer $KEY"
/api/v1/templatesreadWhatsApp templates and their approval status.
curl "http://localhost:3000/api/v1/templates" -H "Authorization: Bearer $KEY"
/api/v1/leadsintakeLead intake from a website form, ad platform or property portal. Creates the contact, requirement hints and a WhatsApp thread, and fires lead.captured for workflows.
{ "name": "Priya", "phone": "9876543210", "email": "…", "message": "Looking for a 2BHK in Thane", "source": "website", "project": "Lodha Park", "config": "2BHK", "locality": "Thane West", "budget": "80 lakh", "meta": { "utm_campaign": "diwali" } }curl -X POST "http://localhost:3000/api/v1/leads" -H "Authorization: Bearer $INTAKE_KEY" -H "Content-Type: application/json" -d '{"name":"Priya","phone":"9876543210","source":"website","config":"2BHK","locality":"Thane West","budget":"80 lakh"}'Add an endpoint in Settings → API & webhooks and pick the events (or *). Every delivery is a POST with this shape, signed with X-ChatOps-Signature: sha256=<hex HMAC-SHA256 of the raw body with your endpoint secret> (the legacy X-Leadflow-Signature header is sent too for now). Respond 2xx within 10 seconds; ten consecutive failures disable the endpoint.
{
"id": 12345,
"type": "order.created",
"occurred_at": "2026-09-05T10:00:00.000Z",
"org_id": "…",
"actor": { "type": "integration", "id": "shopify" },
"subject": { "type": "order", "id": "…" },
"data": { "orderId": "…", "orderNumber": "#1042", "total": 1249, "currency": "INR", "paymentMethod": "cod", … }
}message.receivedmessage.sentmessage.failedconversation.createdconversation.assignedcontact.opted_outlead.scoredlead.capturedapproval.requestedapproval.decidedbooking.createdorder.createdorder.paidorder.fulfilledorder.cancelledcod.requestedcod.confirmedcod.cancelledcod.expiredcheckout.abandonedcheckout.recoveredshipment.updatedshipment.deliveredreturn.requestedpayment.completedcampaign.scheduledcampaign.sentVerify in Node: crypto.createHmac("sha256", secret).update(rawBody).digest("hex") must equal the part after sha256=.