Connect your website, channels, AI provider, and backend
Everything you need to install the Krisp chat widget on your store, connect WhatsApp, Instagram, Facebook Messenger, Telegram, Discord and email, bring your own AI model key, verify orders over signed webhooks, and call the REST API.
Integrations at a glance
Manage in Settings → IntegrationsKrisp connects your storefront, messaging channels, AI model provider, and order backend into one shared inbox. Every channel token and AI key you connect is verified with its service before saving and stored encrypted with AES-256-GCM.
Website Chat Widget
One lightweight script tag for Shopify, WordPress, React/Next.js, Webflow, Wix, Squarespace, or any HTML site.
Omnichannel Inbox
WhatsApp numbers, Instagram accounts, Facebook Messenger Pages, Telegram bots and email routed into the same inbox, with Discord threads for your team to answer from.
AI Model Providers
Use Krisp’s model, the free built-in engine, or bring your own key for OpenAI, Anthropic, Gemini, Mistral, Groq, DeepSeek, or OpenRouter.
Signed Order Lookup
Verify customer order IDs and purchase emails against your own HTTPS endpoint with HMAC-SHA256 signatures.
Plugins & Automations
11 built-in message plugins (Sentiment Radar, Intent Tagger, Lead Scorer, Calendly Booking and more) and visual automation flows.
Scoped REST API
Server-to-server API keys with read and write scopes to read conversations, update their state, assignee and tags, and keep contacts in step.
1. Allowlist your website & find your workspace slug
Settings → SetupEvery workspace in Krisp has a unique Workspace Slug (for example acme-shop) and an explicit Website Allowlist. Even if someone copies your embed tag onto another site, both the loader and the browser’s Content-Security-Policy: frame-ancestors header refuse to open the widget outside the domains you list.
The slug is made from the workspace name. A name that would take a reserved address - Krisp’s own words and route names, mailbox names such as postmaster, or a well-known brand - gets a numbered slug (a workspace named Support gets support-1), as a name already taken does.
-
Add your domain
Open Settings → Setup and enter your domain (such as
yourstore.com).www.is included automatically;*.yourstore.comcovers all subdomains;localhost:3000works for local development. -
Copy your embed tag
Your personalized
<script>tag in Settings → Setup already contains your workspace slug. Paste it before the closing</body>tag of your site. -
Verify live
Open your website in a browser tab. The Setup page in Krisp polls every few seconds and turns green automatically the moment the script runs on your site.
2. Installing the website chat widget
Zero dependenciesPaste the snippet below into your website’s layout template right before the closing </body> tag. Replace YOUR_WORKSPACE_SLUG with the slug shown in Settings → Setup:
<!-- Krisp Live Chat Widget -->
<script
src="https://krisp.chat/api/widget/YOUR_WORKSPACE_SLUG/embed.js"
async>
</script>
Optional script attributes
By default, the launcher button uses the accent color, workspace logo, and launcher label configured in Settings → Widget. The workspace logo is part of the Starter plan and above; on the Free plan the button shows the Krisp mark. You can override the button placement, accent color or logo on specific pages using data-* attributes on the script tag:
| Attribute | Values | Description |
|---|---|---|
data-position |
"right" (default), "left", "top-right" or "top-left" |
Docks the floating launcher button and chat window to that corner of the viewport. |
data-accent |
Hex color (e.g. "#4f46e5") |
Overrides the workspace accent color for this page. Krisp picks dark or white icon and text, whichever has the higher WCAG contrast on that color. |
data-logo |
Image URL | Shows this logo on the launcher instead of the uploaded one. Starter plan and above; ignored on the Free plan, where the button carries the Krisp mark. |
<script
src="https://krisp.chat/api/widget/YOUR_WORKSPACE_SLUG/embed.js"
data-position="left"
data-accent="#4f46e5"
async>
</script>
- Lazy session creation: The iframe and visitor session are only created when a visitor clicks to open the chat, keeping page load fast. Once a visitor has a conversation, the chat loads out of sight on every page of your site, so your replies reach them and are counted on the chat button.
- 30-day session persistence: Returning visitors automatically resume their conversation thread for up to 30 days.
- Rich media & Help tab: Visitors can search published knowledge-base articles, attach JPG/PNG images (up to 10 MB) and MP4/WebM videos (up to 50 MB), and rate the conversation when resolved.
- Recovers by itself: If the chat server cannot be reached, the widget retries on its own, opens from the copy of its settings kept in the browser, and checks for new messages every few seconds while live updates are blocked by a proxy or firewall. Only the server’s own refusal - an unknown or suspended workspace, a blocked visitor - stops the retries.
3. Platform & storefront guides
8 platformsSelect your storefront or framework below for step-by-step installation instructions:
Installing on Shopify
- In your Shopify admin, go to Online Store → Themes.
- Next to your current theme, click the … button and choose Edit code.
- Open
layout/theme.liquid, paste the Krisp<script>tag right before</body>, and click Save.
Installing on WordPress & WooCommerce
- Install a header/footer snippet plugin such as WPCode (“Insert Headers and Footers”).
- Open Code Snippets → Header & Footer, paste the Krisp
<script>tag into the Footer box, and save. - Alternatively, if you maintain a custom theme, paste the snippet into
footer.phpright before</body>.
Installing in React & Next.js
- For Next.js (App Router or Pages Router), load the embed script using
next/scriptinside your root layout:
import Script from 'next/script';
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
{children}
<Script
src="https://krisp.chat/api/widget/YOUR_WORKSPACE_SLUG/embed.js"
strategy="afterInteractive"
/>
</body>
</html>
);
}
For Vite / Create React App, paste the standard HTML <script> tag into index.html before </body>.
Installing on Webflow
- Open your project’s Site settings and go to the Custom code tab.
- Paste the Krisp
<script>tag into the Footer code box and click Save Changes. - Publish your site (Webflow executes custom code only on the published domain).
Installing on Squarespace
- In your Squarespace menu, open Website → Pages → Website Tools → Code Injection (or Settings → Advanced → Code Injection).
- Paste the Krisp
<script>tag into the Footer field and click Save.
Installing on Wix
- In your Wix dashboard, go to Settings → Custom code (under Advanced).
- Click + Add Custom Code and paste the Krisp
<script>tag. - Choose All pages and place code in Body - end, then click Apply.
Installing via Google Tag Manager
- In your GTM workspace, create a new tag of type Custom HTML and paste the Krisp
<script>tag. - Set the trigger to All Pages.
- Save the tag, then click Submit and Publish your container.
Installing on any HTML website
- Open the shared layout or footer template included on every page of your website.
- Paste the Krisp
<script>tag immediately before the closing</body>tag. - Deploy your changes and open your site in a browser to complete the live check.
4. Hosted chat page & custom domains
Settings → SetupEven if you do not have a website—or want a direct support link for email signatures, social bios, receipts, or QR codes—every workspace comes with a standalone hosted chat page:
https://krisp.chat/chat/YOUR_WORKSPACE_SLUG
Mapping your own subdomain (e.g. chat.yourstore.com)
On Starter (1 domain), Growth (3 domains), and Scale (10 domains) plans, you can serve the hosted chat page on your own domain:
- Step 1: In Settings → Setup under Without a website, open Your chat page, choose Add domain and enter your subdomain (such as
chat.yourstore.com). - Step 2: Add a DNS
CNAMErecord pointing your subdomain to Krisp’s host. TheTXTrecord shown in the dashboard can prove the domain instead, but only theCNAMEbrings visitors to the chat. - Step 3: Click Check DNS. Once verified, Krisp serves your workspace’s chat page at
https://chat.yourstore.com/. - Isolated security boundary: Custom customer domains serve only the visitor chat page and widget endpoints—never the operator dashboard, login routes, or session cookies.
- Kept out of search, open to reports: The hosted chat page - at
/chat/YOUR_WORKSPACE_SLUGor on your own domain - and the widget frame answerX-Robots-Tag: noindex, and the chat page carries a Report this page link that opens an email to Krisp naming the page.
5. Messaging channel integrations
Settings → ChannelsConnect your external messaging channels so every customer conversation lands in the same shared inbox, runs through the same AI autopilot and automations, and replies back through the channel the customer used.
WhatsApp (Cloud API) beta
Add your business number to a Meta app with the WhatsApp product, generate a permanent system-user token, and paste the phone number ID, WhatsApp Business Account ID, token, App ID and App Secret into Settings → Channels. Krisp asks Meta about the number before saving anything, stores the token and secret sealed, and points the app’s WhatsApp webhook at a webhook address of your connection’s own. Text, pictures and videos travel both ways; replies follow WhatsApp’s 24-hour window.
Instagram Direct beta
Link your Instagram professional account to your Facebook Page, then choose Connect Instagram with Facebook (or Turn on Instagram if the Page is already connected for Messenger). Direct messages, story mentions and shared posts arrive in the inbox; replies go back as text through the Page, within 24 hours of the customer’s last message or 7 days for a reply from a person.
Email & Inbound Mailbox
Your workspace receives a dedicated address (<slug>@on.krisp.chat). Emails sent to it open a conversation in the inbox. When a website visitor who left their email leaves your website without seeing your replies - a teammate’s or the AI’s - in the chat, those replies are emailed after a short grace period, all in one email, with a link that reopens the chat (a one-time code, never the visitor’s token, good once within seven days), delivery and read receipts are tracked in the thread, and resolved chats can send a full transcript. Email to visitors is capped per day: 300 a workspace on Starter, 1,000 on Growth and 3,000 on Scale, and 10 to any one address from Krisp as a whole (50 for a conversation that address has answered by email).
Discord Bot & Thread Bridge
Visitor messages mirror into a dedicated thread per conversation inside your chosen Discord channel. Any reply typed by your team inside that Discord thread is sent back to the website visitor live. Use the server’s shared Discord bot or connect your own bot token from the Discord Developer Portal (requires the Message Content Intent enabled).
Telegram Bot (@BotFather)
Create a bot on Telegram with @BotFather and paste its token into Settings → Channels. Krisp verifies the token with Telegram’s Bot API before saving it sealed. Private messages and photos sent to your bot become inbox conversations, and operator, AI, and automation replies (including images) are delivered back through the bot.
Facebook Messenger
Connect your Facebook Page with Continue with Facebook or paste a Page access token, using either Krisp’s Meta app or your own Meta App ID and App Secret. Incoming webhooks are verified against Meta’s HMAC signature, text and pictures work both ways (videos you send go out too), and Messenger’s 24-hour standard / 7-day human-agent messaging windows are enforced automatically.
6. AI model providers (Bring Your Own Key)
Settings → IntegrationsIn Settings → Integrations, each workspace chooses how AI replies, operator drafts, and message rewrites are powered:
| Mode / Provider | Supported Models & Endpoints | Billing & Verification |
|---|---|---|
| Krisp’s Hosted Model | Platform-configured LLM out of the box | Every completion is metered by input/output tokens and booked to your workspace’s AI cost ledger under your monthly and hourly budget caps. |
| Your Own API Key (BYOK) | OpenAI, Anthropic, Google Gemini, Mistral, Groq, DeepSeek, OpenRouter, or any custom OpenAI-compatible /v1/chat/completions URL |
Tested with a live completion before saving, encrypted with AES-256-GCM, never shown again, and tracked in your cost ledger at the per-million-token prices you enter (or the model’s list price when Krisp knows it). |
| Built-in Local Engine | On-server keyword intent, sentiment & knowledge-base ranker | $0.00 per reply. Sends no conversation text to any outside provider. |
| AI turned off | Off - Direct to human agents, under Settings → Widget or Settings → Automated replies | No AI reply or automation answers: every visitor message goes to your team as a pending conversation. Order lookup has its own switch and still answers an order ID, until the conversation is with your team. |
7. Built-in plugins & automation flows
Dashboard → Automations & PluginsKrisp includes a deterministic automation engine and 11 built-in plugins that run in-process with zero external setup required:
- 11 Built-in Plugins: Sentiment Radar, Thread Summariser, Reply Copilot, Knowledge Gap Finder, Intent Tagger, Lead Scorer, Canned Macros, CSAT Survey and Calendly Booking, plus Shopify Orders and Stripe Billing connectors that spot order numbers and billing questions in a message (no call is made to Shopify or Stripe yet). Free installs up to 3, Starter 10, Growth and Scale any number.
- Plugin Chains: Chain multiple plugins together to execute sequentially on every visitor message and inspect every execution in the Run Log.
- Visual Automation Builder: Ten trigger kinds - keywords, intent, sentiment, priority, channel, first message, inside or outside opening hours, low classifier confidence, or a catch-all; chain knowledge-base lookups with conditional branching, replies, tags, teammate assignment, escalation, or resolution; and dry-run against sample messages before turning them on.
- Blueprints: Eleven ready-made flows in six packs. Free gets the starter pack, Starter adds e-commerce, and Growth and Scale get all of them.
8. Signed Order Lookup integration (HMAC-SHA256)
Settings → Order lookupOrder lookup lets customers collect order credentials, license keys, or fulfillment details in the website chat—or on WhatsApp, Instagram, Messenger, Telegram and email, where they reply “credentials” or “agent” instead of tapping a button—without ever uploading your orders database to Krisp. When a customer types an order ID matching your regex pattern (default ORD-12345; presets include Shopify, WooCommerce and UUIDs) and confirms the email address they used at checkout, Krisp sends a signed POST request to your HTTPS endpoint. A customer who mentions an order without its ID is asked for it first.
Order lookup has its own switch and answers whether the AI chatbot is on or off, but never in a conversation your team is handling: one assigned to a teammate or in Pending, or one a teammate has replied in - that one until it is resolved. In production your endpoint’s name is resolved at every request and the request goes only to the public addresses that were checked, within 8 seconds for the whole exchange. A custom order-ID pattern is timed before it is saved and runs under a time limit, and the signing secret is stored encrypted.
Request headers sent by Krisp
| Header | Example | Description |
|---|---|---|
Content-Type |
application/json |
UTF-8 JSON request body. |
Accept |
application/json |
Answer with a JSON body. |
User-Agent |
Krisp-OrderLookup/1.0 |
Identifies Krisp’s order lookup caller. |
X-Krisp-Event |
order.lookup |
Event type identifier. |
X-Krisp-Delivery |
5b0c6f0e-6a64-4c3e-... |
Unique UUID for this delivery attempt. |
X-Krisp-Timestamp |
1791072000 |
Unix timestamp in seconds when the request was signed. Reject if older than 300 seconds. |
X-Krisp-Signature |
v1=8f3c9a... |
v1= + lowercase hex HMAC-SHA256 of <X-Krisp-Timestamp>.<raw_body> using your workspace’s olsec_... signing secret. |
Request body & expected JSON responses
// 1. Request body sent by Krisp:
{
"type": "order.lookup",
"test": false,
"deliveryId": "5b0c6f0e-6a64-4c3e-9a0e-2f0d3f6f4b1a",
"lookupId": "c1a2b3d4-0000-4000-8000-000000000001",
"orderId": "ORD-12345",
"email": "jane@example.com",
"workspace": { "id": "ws_...", "slug": "your-shop" },
"conversationId": "e7f8a9b0-...",
"channel": "website", // or "whatsapp", "instagram", "facebook", "telegram", "email"
"visitor": { "id": "...", "externalId": "cust_42", "email": "jane@example.com" },
"sentAt": "2026-10-15T10:00:00.000Z"
}
// 2A. Response when order + email match and credentials are ready (HTTP 200):
{
"status": "verified",
"order": { "id": "ORD-12345", "product": "Pro Annual License" },
"credentials": [
{ "label": "License Key", "value": "KRISP-XXXX-YYYY-ZZZZ" },
{ "label": "Download URL", "value": "https://downloads.yourstore.com/pro" }
],
"note": "Keep your license key private."
}
// 2B. Response when order is paid but still provisioning (HTTP 200):
{
"status": "not_ready",
"message": "Your order is still being prepared. Please check back in 10 minutes."
}
// 2C. Response when order ID or email does not match (HTTP 200):
{
"status": "not_found"
}
Node.js (Express) signature verification example
import express from 'express';
import crypto from 'node:crypto';
const SECRET = process.env.KRISP_ORDER_LOOKUP_SECRET; // olsec_... from Settings -> Order lookup
const app = express();
app.post('/krisp/order-lookup', express.raw({ type: 'application/json', limit: '64kb' }), async (req, res) => {
const timestamp = req.get('X-Krisp-Timestamp') ?? '';
const signature = req.get('X-Krisp-Signature') ?? '';
const raw = req.body.toString('utf8');
if (!/^\d+$/.test(timestamp) || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) {
return res.status(401).json({ error: 'stale request' });
}
const expected = 'v1=' + crypto.createHmac('sha256', SECRET).update(`${timestamp}.${raw}`).digest('hex');
const a = Buffer.from(signature);
const b = Buffer.from(expected);
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
return res.status(401).json({ error: 'invalid signature' });
}
const { orderId, email, test } = JSON.parse(raw);
const order = await findOrderByNumber(orderId);
if (!order || order.email.toLowerCase() !== email.toLowerCase()) {
return res.json({ status: 'not_found' });
}
if (!order.ready) {
return res.json({ status: 'not_ready', message: 'Your order is being prepared.' });
}
return res.json({
status: 'verified',
order: { id: order.id, product: order.productName },
credentials: [{ label: 'License Key', value: order.licenseKey }],
});
});
9. Server-to-server REST API & scoped keys
Settings → API keysTo integrate your backend directly with Krisp—for example to read conversations and messages, change a conversation’s state, assignee or tags, update a contact, or read AI usage—create a scoped API key in Settings → API keys.
-
Create a key
Open Settings → API keys, give the key a label (such as
Order sync), and choose its permissions: Read (GETrequests), Write (create and update resources), or both. -
Copy it once
The full key is shown only once at creation. Krisp stores a peppered SHA-256 hash of the key and never logs or displays it again.
-
Send
x-krisp-keyPass the key in the
x-krisp-keyHTTP header on every request; anAuthorizationheader is not read. Owner/admin settings (billing, team, budgets, and keys) and anything a teammate does in person - sending a message, writing an article, importing data - never accept an API key.
# List unresolved conversations in your workspace
curl -sS \
-H "x-krisp-key: YOUR_API_KEY" \
"https://krisp.chat/api/conversations?state=unresolved&limit=25"
# Mark a conversation resolved (needs the Write permission)
curl -sS -X PATCH \
-H "x-krisp-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{"state":"resolved"}' \
"https://krisp.chat/api/conversations/CONVERSATION_ID"
# Replace its tags
curl -sS -X PUT \
-H "x-krisp-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{"tags":["refund","vip"]}' \
"https://krisp.chat/api/conversations/CONVERSATION_ID/tags"
10. Core REST API endpoints
JSON over HTTPSAll API endpoints accept and return JSON. Errors follow a consistent envelope: { "error": { "code": "E_...", "message": "..." } }.
| Method & Path | Scope | Description |
|---|---|---|
GET /api/conversations |
read |
List conversations filtered by state (unresolved, pending, resolved), channel, assignee (me, unassigned or a teammate’s id), tag, or a search term in search; limit up to 200. |
GET /api/conversations/:id |
read |
Fetch a conversation with its state, assignee, priority and metadata, and its latest messages. |
GET /api/conversations/:id/profile |
read |
Fetch the visitor behind a conversation: contact details, location and device, custom data, the conversation’s tags, and their other conversations. |
PATCH /api/conversations/:id |
write |
Transition conversation state (unresolved, pending, resolved), or update priority (low, normal, high, urgent), subject, assignee_id, pinned or unread. |
PUT /api/conversations/:id/tags |
write |
Replace the conversation’s tags with the list in tags. |
GET /api/conversations/:id/messages |
read |
List the latest messages and internal notes in a conversation thread, oldest first; pass before (a message id or a time) for earlier ones. |
GET /api/contacts |
read |
List and search contacts by name, email, phone, city or custom data (search), with filter set to all, identified, anonymous or blocked. |
PATCH /api/contacts/:id |
write |
Update a contact’s name (nickname), email, phone, or custom data fields. |
GET /api/articles |
read |
List knowledge-base articles used by the widget Help tab and AI autopilot. |
GET /api/automations |
read |
List workspace automation rules and their trigger/step definitions. |
GET /api/plugins |
read |
List installed plugins, available catalogue plugins, and execution counts. |
GET /api/usage |
read |
Fetch month-to-date AI token usage, cost breakdown by model and purpose, and daily spend series. |
Related pages
Ready to connect your store?
Create your workspace, paste one script tag, and test your integrations live from the dashboard.