SK Chat · Developers

Everything the widget does,
your code can do.

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.

01

How it fits together

Your systems talk to one API. Customers talk on any channel. Everything that happens comes back to you as a signed event.

Fig 01 · request → agent → event your app backend · product REST · POST /messages webhooks · hmac ✓ SK Chat agent inbox knowledge events suite tools via MCP gateway widget hosted page whatsapp instagram api channel
02

First message in three steps

From zero to a live agent reply. The free tier includes full API access — the quickstart is the evaluation.

step 1

Get your API key

Sign up free, grab a key from settings. Test and live keys are separate — break nothing real.

step 2 POST

Send a message

One POST creates the conversation and delivers the customer's message to the agent.

step 3

Catch the webhook

The agent's reply — with detected intent, language, and sentiment — arrives at your endpoint, signed.

send a message → agent replies
# 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
03

Webhooks you can trust

Every event signed with HMAC-SHA256. Delivery is at-least-once with exponential backoff — and when your endpoint is down, nothing is lost.

conversation.started

A customer opened a thread — on any channel.

message.received

Inbound message, with detected intent and language.

message.sent

The agent (AI or human) replied.

sentiment.changed

The thread's mood shifted — your early-warning signal.

handoff.requested

The AI is standing down; a human should take over.

agent.assigned

A team member picked up the conversation.

conversation.resolved

Thread closed — with resolution metadata.

wallet.low_balance

The Meta wallet needs a top-up before channels pause.

Fig 03 · retry schedule 0s 1s 4s 16s 1m 5m delivered ✓ your endpoint down back up — caught up dead-letter · replay
Fig 04 · the signature x-sk-signature: v1=hmac-sha256(...) payload: {"type": ...} verify before you trust
04

Guarantees, not vibes

These hold across the whole Softknack platform — the same invariants behind our CRM, calendar, and billing APIs.

POST · key A1 POST · key A1 network retry dedupe gate one write ✓

Idempotency, platform-wide Idempotency-Key

Every write accepts an idempotency key. The same key produces the same result — retries, timeouts, and double-clicks are safe by construction, not by luck.

test sk_test_… live sk_live_…

Test & live keys

Separate environments, separate keys. Build against test mode without touching a real customer.

model A model B providers are wrappers

No model lock-in

AI, push, and transcription providers sit behind stable interfaces. Vendor changes are config, not migrations.

tenant_a tenant_b rls ✓ rls ✓ isolation in the database

Row-level tenancy

Isolation enforced by the database itself. Your queries physically cannot cross tenants — and neither can ours.

cursor: "eyJpZCI6..."

Cursor pagination

Stable cursors everywhere — no missed rows when data changes mid-list, no page-offset drift.

05

Bring your own agent

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.

Fig 05 · one gateway, every product your agent any MCP client MCP unified gateway chat crm calendar catalog billing the same gateway our voice agent uses in production
mcp client config
// 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.
06

And if you just want the widget…

One line. Genuinely.

index.html
<script src="https://chat.softknack.com/widget.js"
        data-agent="your-agent-id" async></script>
Fig 06 · it appears

The docs go deeper.

Full API reference, webhook signing guide, MCP tool catalog, and DPDP integration notes.

Open docs.softknack.com  Start free