canonical: https://jentic.com/apis/crisp.chat/crisp

# Crisp Chat Crisp REST API

Jentic publishes the only available OpenAPI specification for Crisp REST API, keeping it validated and agent-ready. Crisp is a customer messaging platform that combines a website chat widget, shared inbox, and contact CRM. The v1 REST API exposes the same primitives the operator UI uses - websites, conversations, messages, people profiles, and an upload helper for attachments - so an external system can read the inbox, post replies, route conversations, and keep visitor profile data in sync.

## For AI agents

Read and reply to Crisp conversations, route them to operators, and maintain people profiles and event data from outside the Crisp UI. Use it for support automation, lead routing, and CRM sync.

## Scope

Does not handle helpdesk ticketing, SLA management, or outbound email campaigns - use for Crisp websites, conversations, messaging, and people profiles only.

## Capabilities

- Create, retrieve, and delete Crisp websites and update their settings
- List operators on a website to find a target for routing or assignment
- List, create, and delete conversations on a website and update their state and routing
- Send messages into a conversation and update the compose (typing) indicator from a bot
- Fetch and update conversation metadata for tagging or context-injection workflows
- Manage people profiles, profile-level data, and the events stream attached to each person
- Generate a signed upload URL through the bucket endpoint for attachments and media

## Use cases

### AI-assisted support replies

Let an LLM-powered assistant draft replies inside Crisp by listing open conversations with GET `/website/{website_id}/conversations`, reading the message thread with GET `/website/{website_id}/conversation/{session_id}/messages`, and posting the suggested reply with POST `/website/{website_id}/conversation/{session_id}/message.` Compose indicators give the human operator real-time feedback that the bot is composing.

Example prompt: List conversations in state 'pending', read the last 20 messages of each, draft a reply, set the compose indicator with PATCH `/website/{website_id}/conversation/{session_id}/compose`, and POST the message.

### Conversation routing and triage

Route inbound conversations based on tags, language, or visitor data by combining GET `/website/{website_id}/operators` with PATCH `/website/{website_id}/conversation/{session_id}/routing` to assign the right operator. Conversation meta and state can be updated in the same workflow to mark priority or move the conversation to resolved.

Example prompt: On new conversation, fetch GET `/website/{website_id}/operators`, choose by skill tag, and call PATCH `/website/{website_id}/conversation/{session_id}/routing` with the chosen operator IDs.

### Visitor profile and event sync

Keep Crisp's people profiles aligned with an external CRM by paging GET `/website/{website_id}/people/profiles` and writing back fields with PATCH `/website/{website_id}/people/profile/{people_id}` and event entries via the people events endpoint. This gives operators a richer picture of who is chatting with them.

Example prompt: On CRM update, find the matching profile via GET `/website/{website_id}/people/profiles`, then PATCH `/website/{website_id}/people/profile/{people_id}` and write an event via the people events endpoint.

### Agent-driven shared inbox via Jentic

An LLM-orchestrated agent can act as a frontline responder for inbound chats, with Jentic mediating the Crisp credentials. The agent searches Jentic for a 'send a chat reply' operation, loads POST `/website/{website_id}/conversation/{session_id}/message`, and posts the reply while Jentic injects the basic-auth identifier and key.

Example prompt: Through Jentic, run search('send a Crisp chat message'), load POST `/website/{website_id}/conversation/{session_id}/message`, and post the reply with the resolved website_id and session_id.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| GET | `/website/{website_id}/conversations` | List conversations on a website |
| GET | `/website/{website_id}/conversation/{session_id}/messages` | Read messages in a conversation |
| POST | `/website/{website_id}/conversation/{session_id}/message` | Send a message into a conversation |
| PATCH | `/website/{website_id}/conversation/{session_id}/state` | Change conversation state |
| PATCH | `/website/{website_id}/conversation/{session_id}/routing` | Assign conversation routing |
| GET | `/website/{website_id}/people/profiles` | List people profiles |
| PATCH | `/website/{website_id}/people/profile/{people_id}` | Update a people profile |
| POST | `/bucket/url/upload` | Generate a signed file upload URL |

## Key resources

- **Website** — Top-level tenant; create, fetch, delete, and configure settings via /website endpoints.
- **Conversations** — Per-session threads under `/website/{website_id}/conversations` including state, routing, meta, and messages.
- **Messages** — Read with /messages and post with /message; compose indicator updates support typing UX.
- **People** — Profiles, profile data, conversation history, and event stream under `/website/{website_id}/people`/*.
- **Bucket** — Signed upload URL helper at `/bucket/url/upload` for attachments and media.

## Why Jentic

- **Setup:** Wiring Crisp by hand means encoding its identifier and key pair for Basic auth and threading the website and session ids through every conversation call. Through Jentic you install once, import Crisp from the API Directory, store the credential pair once, and your agent calls it.
- **Permission scoping:** Crisp puts the website id in the URL path (`/website/{website_id}/...`), so a rule can pin the agent to one Crisp website and nothing else. You choose the operations it may call, so changing conversation state or routing is not included unless you add those operations.
- **Credential handling:** Your Crisp identifier and key pair is stored once, encrypted, by your own Jentic One instance and applied as the Authorization header at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'send a Crisp chat message' or 'list Crisp conversations', and Jentic returns the matching Crisp operation with its input schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **Intercom** — Larger customer messaging suite with conversation, contact, and ticket APIs.
- **Zendesk** — Ticket-first support platform with chat as one channel among many.
- **Chatwoot** — Open-source customer messaging platform with conversation and contact APIs.

## FAQ

### Why is there no official OpenAPI spec for Crisp REST API?

Crisp documents its REST API in HTML reference pages but does not distribute a maintained OpenAPI specification. Jentic generates and maintains this spec so that AI agents and developers can call Crisp REST API via structured tooling. It is validated against the live API and kept up to date. Get started with Jentic One, the self-hosted execution layer.

### What authentication does the Crisp REST API use?

The API uses HTTP basic authentication. The username is your plugin or token identifier and the password is the matching key, both issued by Crisp. Through Jentic, the credential pair is stored encrypted in the vault and applied to every call to https://api.crisp.chat/v1 so it never appears in the agent's prompt.

### Can I send a message into a Crisp conversation through the API?

Yes. POST `/website/{website_id}/conversation/{session_id}/message` posts a new message into an existing conversation. PATCH `/website/{website_id}/conversation/{session_id}/compose` updates the typing indicator while a reply is being composed.

### How do I assign a Crisp conversation to a specific operator?

List operators with GET `/website/{website_id}/operators`, then PATCH `/website/{website_id}/conversation/{session_id}/routing` with the chosen operator IDs to assign the conversation.

### What are the rate limits for the Crisp REST API?

The published OpenAPI spec does not declare numeric rate limits. Crisp enforces fair-use limits per plan, so check response headers and your plan's limits in the Crisp dashboard. Build retries with backoff around HTTP 429 responses, particularly on POST `/website/{website_id}/conversation/{session_id}/message.`

### How do I send a Crisp reply through Jentic?

Install Jentic with pip install jentic, then async-search for 'send a Crisp chat message'. Jentic returns POST `/website/{website_id}/conversation/{session_id}/message`; load it and execute with the website_id, session_id, and reply body. Jentic attaches the basic-auth credentials from the vault automatically.

### Can I limit what my agent is allowed to do with the Crisp REST API?

Yes. Because you run Jentic One yourself, your own rules decide which Crisp operations and credentials the agent can use. Since Crisp carries the website id in the URL path (`/website/{website_id}/...`), a rule can pin the agent to a single website and nothing else. You also pick the exact operations it may call, so sensitive actions like changing conversation state with PATCH `/website/{website_id}/conversation/{session_id}/state` or reassigning it with PATCH `/website/{website_id}/conversation/{session_id}/routing` stay out of reach unless you explicitly grant them.
