REST in, signed webhooks out, MCP tools for your own agents. Built by a team that treats the API as the product — and publishes the invariants to prove it.
Your systems talk to one API. Customers talk on any channel. Everything that happens comes back to you as a signed event.
From zero to a live agent reply. The free tier includes full API access — the quickstart is the evaluation.
Sign up free, grab a key from settings. Test and live keys are separate — break nothing real.
One POST creates the conversation and delivers the customer's message to the agent.
The agent's reply — with detected intent, language, and sentiment — arrives at your endpoint, signed.
# 1 · send the customer's message curl -X POST https://api.softknack.com/chat/v1/conversations/cnv_01J.../messages \ -H "Authorization: Bearer $SK_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "role": "customer", "text": "Do you deliver to Chennai?" }' # 2 · your webhook endpoint receives the agent's reply { "type": "chat.message.sent", "conversation_id": "cnv_01J...", "text": "Yes — free delivery across Chennai, 1–2 days.", "intent": "delivery_area", "lang": "en", "sentiment": "neutral" }
// send the customer's message const res = await fetch("https://api.softknack.com/chat/v1/conversations/cnv_01J.../messages", { method: "POST", headers: { Authorization: `Bearer ${process.env.SK_API_KEY}`, "Idempotency-Key": crypto.randomUUID(), "Content-Type": "application/json", }, body: JSON.stringify({ role: "customer", text: "Do you deliver to Chennai?" }), }); // the agent's reply arrives at your webhook, HMAC-signed
# send the customer's message import requests, uuid, os r = requests.post( "https://api.softknack.com/chat/v1/conversations/cnv_01J.../messages", headers={ "Authorization": f"Bearer {os.environ['SK_API_KEY']}", "Idempotency-Key": str(uuid.uuid4()), }, json={"role": "customer", "text": "Do you deliver to Chennai?"}, ) # the agent's reply arrives at your webhook, HMAC-signed
Every event signed with HMAC-SHA256. Delivery is at-least-once with exponential backoff — and when your endpoint is down, nothing is lost.
A customer opened a thread — on any channel.
Inbound message, with detected intent and language.
The agent (AI or human) replied.
The thread's mood shifted — your early-warning signal.
The AI is standing down; a human should take over.
A team member picked up the conversation.
Thread closed — with resolution metadata.
The Meta wallet needs a top-up before channels pause.
These hold across the whole Softknack platform — the same invariants behind our CRM, calendar, and billing APIs.
Idempotency-KeyEvery write accepts an idempotency key. The same key produces the same result — retries, timeouts, and double-clicks are safe by construction, not by luck.
Separate environments, separate keys. Build against test mode without touching a real customer.
AI, push, and transcription providers sit behind stable interfaces. Vendor changes are config, not migrations.
Isolation enforced by the database itself. Your queries physically cannot cross tenants — and neither can ours.
Stable cursors everywhere — no missed rows when data changes mid-list, no page-offset drift.
SK Chat is MCP-native. The same tool gateway our production voice agent calls is open to yours — Claude, your in-house agent, anything that speaks the protocol.
// connect any MCP client to the gateway { "mcpServers": { "softknack": { "url": "https://mcp.softknack.com", "auth": { "bearer": "$SK_API_KEY" } } } } // your agent can now search the catalog, // read conversations, request handoffs — // scoped to exactly what its key allows.
One line. Genuinely.
<script src="https://chat.softknack.com/widget.js" data-agent="your-agent-id" async></script>
Full API reference, webhook signing guide, MCP tool catalog, and DPDP integration notes.
Open docs.softknack.com Start free