# Activities
Source: https://docs.clarky.ai/api-reference/activities
Log notes, calls, meetings, tasks, and reminders against contacts and companies
Activities are the timeline of CRM events on a contact or company — notes you took, calls you had, meetings you scheduled, tasks you owe, and reminders you set. The API exposes a read endpoint for a contact's activity timeline and a write endpoint to log new activities.
## The Activity object
The contact this activity is logged against. Either `contact_id` or `company_id` is set.
The company this activity is logged against. Either `contact_id` or `company_id` is set.
One of `note`, `call`, `meeting`, `video_call`, `task`, `todo`, `reminder`.
ISO 8601 timestamp. Used for `task`, `todo`, and `reminder` activities.
Duration in minutes. Useful for `call`, `meeting`, and `video_call`.
ISO 8601 timestamp marking the activity as done.
Free-form JSON for extra context (call recording URL, meeting attendees, etc.).
ISO 8601 timestamp.
## Activity types
| Type | Use for |
| ------------ | ----------------------------------------------------- |
| `note` | Free-form notes recorded against a contact or company |
| `call` | Phone calls made or received |
| `meeting` | In-person or scheduled meetings |
| `video_call` | Zoom, Google Meet, etc. |
| `task` | Work to be done, typically with a `due_date` |
| `todo` | Lightweight checklist items |
| `reminder` | Time-based prompts to follow up |
For more on how Clarky's CRM uses activities, see the [CRM Activity feature docs](/features/crm/activity).
***
## List a contact's activities
`GET /api/v1/contacts/{contact_id}/activities`
Returns a paginated, reverse-chronological timeline of activities on a single contact.
### Query parameters
| Param | Type | Description |
| --------------- | ------- | ------------------------------------------------------ |
| `activity_type` | string | Filter to a single activity type (e.g. `note`, `call`) |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/contacts/c_01HXYZ/activities?activity_type=call" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "a_01HACT...",
"contact_id": "c_01HXYZ...",
"company_id": null,
"activity_type": "call",
"title": "Discovery call",
"description": "Walked through the platform, customer is interested in the Pro plan.",
"due_date": null,
"duration_minutes": 32,
"completed_at": "2026-04-29T15:30:00.000Z",
"metadata": { "outcome": "qualified" },
"created_at": "2026-04-29T15:31:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 25, "total": 1, "total_pages": 1 }
}
```
***
## Log an activity
`POST /api/v1/activities`
Requires a key with the `write` scope. Each activity must be linked to **either** a `contact_id` **or** a `company_id` (you can pass both, but at least one is required).
### Body fields
| Field | Type | Required | Description |
| ------------------ | ----------------- | ----------- | -------------------------------------------------------------------------- |
| `activity_type` | string | Yes | One of `note`, `call`, `meeting`, `video_call`, `task`, `todo`, `reminder` |
| `contact_id` | string | Conditional | Required unless `company_id` is provided |
| `company_id` | string | Conditional | Required unless `contact_id` is provided |
| `title` | string | No | |
| `description` | string | No | |
| `due_date` | string (ISO 8601) | No | Useful for `task`, `todo`, `reminder` |
| `duration_minutes` | number | No | Useful for `call`, `meeting`, `video_call` |
| `completed_at` | string (ISO 8601) | No | Mark the activity as already done |
| `metadata` | object | No | Free-form JSON |
### Example: log a note
```bash theme={null}
curl https://clarky.ai/api/v1/activities \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"activity_type": "note",
"contact_id": "c_01HXYZ",
"title": "Follow-up needed",
"description": "Customer asked about migration help next quarter."
}'
```
```json theme={null}
{
"data": {
"id": "a_01HACT...",
"contact_id": "c_01HXYZ...",
"company_id": null,
"activity_type": "note",
"title": "Follow-up needed",
"description": "Customer asked about migration help next quarter.",
"due_date": null,
"duration_minutes": null,
"completed_at": null,
"metadata": {},
"created_at": "2026-04-29T19:25:00.000Z"
}
}
```
### Example: schedule a task
```bash theme={null}
curl https://clarky.ai/api/v1/activities \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"activity_type": "task",
"contact_id": "c_01HXYZ",
"title": "Send follow-up proposal",
"due_date": "2026-05-06T17:00:00.000Z"
}'
```
```json theme={null}
{
"data": {
"id": "a_01HACT...",
"contact_id": "c_01HXYZ...",
"activity_type": "task",
"title": "Send follow-up proposal",
"due_date": "2026-05-06T17:00:00.000Z",
"completed_at": null,
"created_at": "2026-04-29T19:26:00.000Z"
}
}
```
# Agents
Source: https://docs.clarky.ai/api-reference/agents
Discover the agents in your workspace and their channel configuration
Agents are the AI assistants in your workspace — every contact, conversation, form, and pipeline lives under one. The Agents API is a **read-only** discovery endpoint: use it to list the agents in a workspace and look up the IDs you'll pass as `bot_id` to the rest of the API.
Most resources in the API (contacts, companies, forms, pipelines, conversations) are scoped by `bot_id`. If you don't already have one, list agents first and pick the right `id`.
## The Agent object
Unique agent identifier — pass this as `bot_id` to other endpoints.
The workspace this agent belongs to.
Human-readable agent name.
URL-safe handle used in dashboard links (`/admin/{workspace}/{slug}`).
One-line description of what this agent does.
`true` for next-gen agents (`/admin/{workspace}/agents`). Some legacy bots may have `is_agent=false` — they're still valid `bot_id` targets for the rest of the API.
`false` if the agent has been disabled by an admin.
`true` if the agent's chat embed is allowed on public sites.
Role string (e.g. `"sales"`, `"support"`).
One of `internal`, `external`, or `both`.
Brand color used in the dashboard / inbox.
Auto-provisioned inbound email address (e.g. `b_01HDEF@inbound.clarky.ai`).
Provisioned voice / SMS phone number, when one is attached.
Opening message shown in the chat widget.
Speech bubble shown next to the avatar before the user opens the widget.
Spoken greeting on inbound calls.
ID of the TTS voice used for outbound speech.
Auto-reply for first SMS contact.
`true` if inbound emails to `agent_email` are processed.
"From" address used for outbound emails.
"From" name used for outbound emails.
Booking integration in use — `clarky`, `calcom`, `google`, etc. `null` if booking isn't enabled.
IDs of [Event Types](/features/booking/event-types) this agent can offer when scheduling.
`true` if teammates can take over conversations from this agent.
`true` if Clarky should auto-flag conversations that need a human.
`true` if conversations are analyzed for sentiment.
Approximate number of [context documents](/features/context/overview) attached to this agent.
Lifetime conversation count.
Recent top topics extracted from this agent's conversations.
ISO 8601 timestamp.
We deliberately omit secrets (Slack tokens, Resend API keys), system prompts (`internal_personality`, `external_personality`, `custom_escalation_prompt`), and internal RAG tuning knobs (`match_threshold`, `match_count`) from this response. Manage those in the dashboard.
***
## List agents
`GET /api/v1/agents`
Returns a paginated list of every agent in the workspace.
### Query parameters
| Param | Type | Description |
| ------------ | ------- | ------------------------------------------- |
| `search` | string | Match against name, slug, or summary |
| `slug` | string | Exact-match agent slug |
| `is_agent` | boolean | Filter to next-gen agents only |
| `enabled` | boolean | Filter by enabled state |
| `agent_type` | string | One of `internal`, `external`, `both` |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/agents?enabled=true" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "b_01HDEF...",
"workspace_id": "w_01HXXX...",
"name": "Clarky Sales",
"slug": "sales",
"summary": "Outbound + inbound sales agent for the marketing site.",
"is_agent": true,
"enabled": true,
"public": true,
"agent_role": "sales",
"agent_type": "external",
"agent_status": "live",
"agent_color": "#0586ff",
"agent_email": "b_01HDEF@inbound.clarky.ai",
"agent_phone": "+15125550100",
"chat_greeting": "Hey! What can I help you with today?",
"chat_avatar_intro": "Got questions? Ask me anything.",
"chat_avatar_image_url": null,
"phone_greeting": "Hi, this is Clarky's sales agent — how can I help?",
"phone_voice_id": "elv_voice_andy",
"text_greeting": "Thanks for texting! What's up?",
"email_inbound": true,
"email_outbound_autoreply": true,
"email_outbound_email": "sales@example.com",
"email_outbound_name": "Clarky Sales",
"booking_provider": "clarky",
"enabled_event_type_ids": ["et_01HABC..."],
"allow_human_takeover": true,
"escalation_detection_enabled": true,
"sentiment_analysis_enabled": true,
"knowledge_count": 184,
"number_of_conversations": 5421,
"popular_topics": ["pricing", "demo", "integrations"],
"created_at": "2026-01-12T10:00:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 25, "total": 1, "total_pages": 1 }
}
```
***
## Get an agent
`GET /api/v1/agents/{id}`
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/agents/b_01HDEF \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": {
"id": "b_01HDEF...",
"name": "Clarky Sales",
"slug": "sales",
"is_agent": true,
"enabled": true,
"agent_email": "b_01HDEF@inbound.clarky.ai",
"agent_phone": "+15125550100",
"booking_provider": "clarky",
"knowledge_count": 184,
"number_of_conversations": 5421,
"created_at": "2026-01-12T10:00:00.000Z"
}
}
```
***
## Common patterns
### Resolve an agent by slug
The dashboard URL `https://clarky.ai/admin/{workspace}/{slug}` exposes each agent's slug. Use it to look up the canonical `id`:
```bash theme={null}
curl "https://clarky.ai/api/v1/agents?slug=sales" \
-H "Authorization: Bearer ck_live_example"
```
### Bootstrap an integration
A first-run flow for a new integration:
```bash theme={null}
# 1. List agents to let the user pick one.
curl https://clarky.ai/api/v1/agents \
-H "Authorization: Bearer ck_live_example"
# 2. Use the chosen id as bot_id everywhere else.
curl -X POST https://clarky.ai/api/v1/contacts \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{ "bot_id": "b_01HDEF", "first_name": "Ada", "emails": [{ "email": "ada@example.com" }] }'
```
# Authentication
Source: https://docs.clarky.ai/api-reference/authentication
Authenticate API requests with workspace-scoped Bearer tokens
The Clarky API uses **Bearer token** authentication. Every request must include an `Authorization` header containing a valid API key.
```bash theme={null}
Authorization: Bearer ck_live_example
```
Requests without a valid key — or with a key that has been revoked — return `401 Unauthorized`.
**Plan availability:** Creating API keys requires a **Standard**, **Pro**, or **Enterprise** plan. See [Plans & Billing](/features/settings/plans).
## Creating an API key
Go to **Settings > API Keys** (under the Workspace Settings section).
Give the key a descriptive name — for example, "Production data warehouse" or "Zapier sync" — so it's easy to identify later.
Select **read**, **write**, or both. A key without `write` cannot create, update, or delete records.
The full key is shown **only once**, right after you create it. Store it in a secure secret manager. If you lose it, revoke the key and create a new one.
## Key format
Every Clarky API key follows the same shape:
```
ck_live_
```
Keys are 38–39 characters total and prefixed with `ck_live_` so they're easy to recognize in logs and source control scans.
## Workspace scope
Every key is bound to **exactly one workspace**. The workspace is determined by which workspace you were viewing when the key was created. A key cannot be transferred across workspaces — to access a different workspace, create a new key from inside that workspace.
## Scopes
Scopes are selected when the key is created. Two scopes are currently available:
Allows `GET` and `HEAD` requests on every endpoint.
Allows `POST`, `PATCH`, and `DELETE` requests in addition to reads. A request that requires `write` made with a read-only key returns `403 Forbidden` with code `forbidden`.
For backend services that only need to push data into Clarky (for example, a lead-capture form on a marketing site), grant **write** only. For analytics workloads that pull data into a warehouse, grant **read** only. Use the principle of least privilege.
## Sending the header
```bash curl theme={null}
curl https://clarky.ai/api/v1/contacts \
-H "Authorization: Bearer ck_live_example"
```
```javascript Node.js theme={null}
const res = await fetch("https://clarky.ai/api/v1/contacts", {
headers: {
Authorization: `Bearer ${process.env.CLARKY_API_KEY}`,
},
});
```
```python Python theme={null}
import os, requests
res = requests.get(
"https://clarky.ai/api/v1/contacts",
headers={"Authorization": f"Bearer {os.environ['CLARKY_API_KEY']}"}
)
```
## Rotating keys
To rotate a key without downtime:
Create a fresh key with the same scopes from **Settings > API Keys**.
Update your application's secret store and deploy. Verify the new key is working in production.
Once nothing depends on the old key, revoke it from the API Keys list. Revocation takes effect immediately.
## Revoking a key
You can revoke any key at any time from **Settings > API Keys**. Revocation is **immediate and permanent** — every subsequent request using that key will return `401 Unauthorized`. The key cannot be re-enabled.
If a key is leaked — committed to a public repo, posted in a Slack message, or pasted into a screenshot — revoke it immediately and create a new one. There's no way to "expire" a leaked key while keeping it usable.
## Security best practices
* **Never commit keys to source control.** Use a secret manager (AWS Secrets Manager, GCP Secret Manager, Doppler, 1Password, etc.) and load them at runtime.
* **Use environment variables** for local development — never hardcode keys.
* **Restrict by scope.** A read-only key cannot accidentally delete data even if it's compromised.
* **Use one key per integration** so you can rotate or revoke them independently.
* **Audit regularly.** Review your API key list quarterly and delete any that are no longer in use.
* **Don't expose keys client-side.** API keys must only ever be used from a trusted backend. They should never be embedded in browser JavaScript, mobile apps, or anywhere an end user could read them.
You're authenticated and ready to make requests. Continue to [Errors](/api-reference/errors) to learn the error envelope, or jump straight to [Contacts](/api-reference/contacts).
# Companies
Source: https://docs.clarky.ai/api-reference/companies
Manage companies and the contacts that belong to them
Companies represent organizations in your CRM — typically the employers, customers, or accounts that your contacts belong to. Each company is owned by a specific agent (`bot_id`) and inherits the workspace from your API key.
## The Company object
Unique company identifier.
The agent that owns this company.
Company name.
Primary domain (e.g. `acme.com`).
Free-form size band (e.g. `"50-200"`).
Array of `{ email, is_primary }` objects.
Array of `{ phone_number, is_primary }` objects.
Sum of `deal_value` across all contacts linked to this company.
ISO 8601 timestamp of the most recent activity on a related contact.
ISO 8601 timestamp.
ISO 8601 timestamp.
***
## List companies
`GET /api/v1/companies`
Paginated list of companies in the workspace.
### Query parameters
| Param | Type | Description |
| ----------- | ------- | ----------------------------------------------- |
| `search` | string | Match against name, domain, or industry |
| `tags` | string | Comma-separated list of tags |
| `industry` | string | Exact-match industry filter |
| `domain` | string | Exact-match domain filter |
| `bot_id` | string | Restrict to companies owned by a specific agent |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/companies?search=acme" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "co_01HABC...",
"workspace_id": "w_01HXXX...",
"bot_id": "b_01HDEF...",
"name": "Acme Corp",
"domain": "acme.com",
"website": "https://acme.com",
"industry": "Manufacturing",
"company_size": "200-500",
"employee_count": 320,
"annual_revenue": 18000000,
"emails": [{ "email": "hello@acme.com", "is_primary": true }],
"phone_numbers": [],
"tags": ["enterprise"],
"total_deal_value": 125000,
"pipeline_stage_id": null,
"city": "Austin",
"country": "US",
"custom_fields": {},
"last_activity_at": "2026-04-28T13:14:00.000Z",
"created_at": "2026-03-01T10:00:00.000Z",
"updated_at": "2026-04-28T13:14:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 25, "total": 1, "total_pages": 1 }
}
```
***
## Get a company
`GET /api/v1/companies/{id}`
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/companies/co_01HABC \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": {
"id": "co_01HABC...",
"name": "Acme Corp",
"domain": "acme.com",
"industry": "Manufacturing",
"tags": ["enterprise"],
"total_deal_value": 125000,
"created_at": "2026-03-01T10:00:00.000Z",
"updated_at": "2026-04-28T13:14:00.000Z"
}
}
```
***
## Create a company
`POST /api/v1/companies`
Requires a key with the `write` scope.
### Body fields
| Field | Type | Required | Description |
| ------------------- | --------- | -------- | --------------------------------------- |
| `bot_id` | string | Yes | Owning agent |
| `name` | string | Yes | Company name |
| `domain` | string | No | |
| `website` | string | No | |
| `industry` | string | No | |
| `company_size` | string | No | |
| `company_type` | string | No | |
| `employee_count` | number | No | |
| `annual_revenue` | number | No | |
| `description` | string | No | |
| `emails` | array | No | Array of `{ email, is_primary }` |
| `phone_numbers` | array | No | Array of `{ phone_number, is_primary }` |
| `tags` | string\[] | No | |
| `pipeline_stage_id` | string | No | |
| `address_line1` | string | No | |
| `address_line2` | string | No | |
| `city` | string | No | |
| `state` | string | No | |
| `postal_code` | string | No | |
| `country` | string | No | |
| `linkedin_url` | string | No | |
| `notes` | string | No | |
| `custom_fields` | object | No | |
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/companies \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"bot_id": "b_01HDEF",
"name": "Acme Corp",
"domain": "acme.com",
"industry": "Manufacturing",
"tags": ["enterprise"]
}'
```
```json theme={null}
{
"data": {
"id": "co_01HABC...",
"name": "Acme Corp",
"domain": "acme.com",
"industry": "Manufacturing",
"tags": ["enterprise"],
"created_at": "2026-04-29T18:55:00.000Z",
"updated_at": "2026-04-29T18:55:00.000Z"
}
}
```
***
## Update a company
`PATCH /api/v1/companies/{id}`
Same fields as [Create a company](#create-a-company). `bot_id` cannot be changed.
### Example
```bash theme={null}
curl -X PATCH https://clarky.ai/api/v1/companies/co_01HABC \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{ "annual_revenue": 24000000, "tags": ["enterprise", "expansion"] }'
```
```json theme={null}
{
"data": {
"id": "co_01HABC...",
"annual_revenue": 24000000,
"tags": ["enterprise", "expansion"],
"updated_at": "2026-04-29T19:01:00.000Z"
}
}
```
***
## Delete a company
`DELETE /api/v1/companies/{id}`
Returns `204 No Content` with an empty body on success.
### Example
```bash theme={null}
curl -X DELETE https://clarky.ai/api/v1/companies/co_01HABC \
-H "Authorization: Bearer ck_live_example"
```
Deletion is permanent. Contacts that referenced this company will have their `company_id` cleared but will not themselves be deleted.
# Contacts
Source: https://docs.clarky.ai/api-reference/contacts
Create, read, update, delete, and bulk upsert contacts
Contacts represent the people in your CRM — leads, customers, prospects, and anyone else captured by your agents or imported from another system. Every contact belongs to a specific agent (`bot_id`) and inherits the workspace from your API key.
## The Contact object
Unique contact identifier.
The workspace this contact belongs to.
The agent that owns this contact.
Array of `{ email, is_primary }` objects. The first item is treated as primary if no `is_primary` flag is set.
Array of `{ phone_number, is_primary }` objects.
Free-text company name. Use `company_id` to link to a structured Company record.
Foreign key to a [Company](/api-reference/companies).
Estimated deal value as a number (currency assumed to match workspace settings).
Current stage in a sales pipeline.
Free-form classification (e.g. `"lead"`, `"customer"`).
Workspace-defined custom fields, stored as a free-form JSON object.
ISO 8601 timestamp of the most recent activity.
ISO 8601 timestamp.
ISO 8601 timestamp.
***
## List contacts
`GET /api/v1/contacts`
Returns a paginated list of contacts in the workspace.
### Query parameters
| Param | Type | Description |
| ------------------- | ----------------- | ----------------------------------------------- |
| `search` | string | Match against name, email, phone, or company |
| `tags` | string | Comma-separated list of tags to filter by |
| `lead_source` | string | Filter by lead source |
| `pipeline_stage_id` | string | Filter to contacts in a specific pipeline stage |
| `bot_id` | string | Filter to contacts owned by a specific agent |
| `created_after` | string (ISO 8601) | Created at or after this timestamp |
| `created_before` | string (ISO 8601) | Created at or before this timestamp |
| `updated_after` | string (ISO 8601) | Updated at or after this timestamp |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/contacts?search=ada&page_size=10" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "c_01HXYZ...",
"workspace_id": "w_01HABC...",
"bot_id": "b_01HDEF...",
"first_name": "Ada",
"last_name": "Lovelace",
"emails": [{ "email": "ada@example.com", "is_primary": true }],
"phone_numbers": [],
"company": "Analytical Engines Inc.",
"company_id": null,
"job_title": "Founder",
"lead_source": "website",
"tags": ["vip"],
"deal_value": 25000,
"pipeline_stage_id": "ps_01HGHI...",
"contact_type": "lead",
"address_line1": null,
"address_line2": null,
"city": "London",
"state": null,
"postal_code": null,
"country": "UK",
"linkedin_url": null,
"notes": null,
"custom_fields": {},
"last_contacted_at": "2026-04-29T14:00:00.000Z",
"created_at": "2026-04-12T09:30:00.000Z",
"updated_at": "2026-04-29T14:00:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 10, "total": 1, "total_pages": 1 }
}
```
***
## Get contact by email
`GET /api/v1/contacts/by-email`
Looks up a single contact by primary email address. Returns `404 not_found` if no contact matches.
### Query parameters
| Param | Type | Required | Description |
| ------- | ------ | -------- | --------------------------------- |
| `email` | string | Yes | Email to match (case-insensitive) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/contacts/by-email?email=ada@example.com" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": {
"id": "c_01HXYZ...",
"first_name": "Ada",
"last_name": "Lovelace",
"emails": [{ "email": "ada@example.com", "is_primary": true }],
"phone_numbers": [],
"company": "Analytical Engines Inc.",
"tags": ["vip"],
"created_at": "2026-04-12T09:30:00.000Z",
"updated_at": "2026-04-29T14:00:00.000Z"
}
}
```
***
## Get a contact
`GET /api/v1/contacts/{id}`
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/contacts/c_01HXYZ \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": {
"id": "c_01HXYZ...",
"first_name": "Ada",
"last_name": "Lovelace",
"emails": [{ "email": "ada@example.com", "is_primary": true }],
"phone_numbers": [],
"tags": ["vip"],
"created_at": "2026-04-12T09:30:00.000Z",
"updated_at": "2026-04-29T14:00:00.000Z"
}
}
```
***
## Create a contact
`POST /api/v1/contacts`
Requires a key with the `write` scope.
### Body fields
| Field | Type | Required | Description |
| ------------------- | --------- | -------- | --------------------------------------- |
| `bot_id` | string | Yes | Agent that should own this contact |
| `first_name` | string | No | |
| `last_name` | string | No | |
| `emails` | array | No | Array of `{ email, is_primary }` |
| `phone_numbers` | array | No | Array of `{ phone_number, is_primary }` |
| `company` | string | No | Free-text company name |
| `company_id` | string | No | Link to an existing Company |
| `job_title` | string | No | |
| `lead_source` | string | No | |
| `tags` | string\[] | No | |
| `deal_value` | number | No | |
| `pipeline_stage_id` | string | No | |
| `contact_type` | string | No | |
| `address_line1` | string | No | |
| `address_line2` | string | No | |
| `city` | string | No | |
| `state` | string | No | |
| `postal_code` | string | No | |
| `country` | string | No | |
| `linkedin_url` | string | No | |
| `notes` | string | No | |
| `custom_fields` | object | No | |
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/contacts \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"bot_id": "b_01HDEF",
"first_name": "Ada",
"last_name": "Lovelace",
"emails": [{ "email": "ada@example.com", "is_primary": true }],
"company": "Analytical Engines Inc.",
"tags": ["vip"]
}'
```
```json theme={null}
{
"data": {
"id": "c_01HXYZ...",
"first_name": "Ada",
"last_name": "Lovelace",
"emails": [{ "email": "ada@example.com", "is_primary": true }],
"company": "Analytical Engines Inc.",
"tags": ["vip"],
"created_at": "2026-04-29T18:42:00.000Z",
"updated_at": "2026-04-29T18:42:00.000Z"
}
}
```
***
## Update a contact
`PATCH /api/v1/contacts/{id}`
Updates the listed fields and leaves everything else untouched. Same fields as [Create a contact](#create-a-contact), **except** `bot_id` cannot be changed.
### Example
```bash theme={null}
curl -X PATCH https://clarky.ai/api/v1/contacts/c_01HXYZ \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"tags": ["vip", "newsletter"],
"deal_value": 30000
}'
```
```json theme={null}
{
"data": {
"id": "c_01HXYZ...",
"tags": ["vip", "newsletter"],
"deal_value": 30000,
"updated_at": "2026-04-29T18:50:00.000Z"
}
}
```
***
## Delete a contact
`DELETE /api/v1/contacts/{id}`
Returns `204 No Content` with an empty body on success.
### Example
```bash theme={null}
curl -X DELETE https://clarky.ai/api/v1/contacts/c_01HXYZ \
-H "Authorization: Bearer ck_live_example"
```
Deletion is permanent — there's no undo.
***
## Bulk upsert contacts
`POST /api/v1/contacts/upsert`
Insert or update up to **200 contacts** in a single request. Each input contact is matched against existing contacts in this order:
1. Primary email (if provided)
2. Primary phone number (if no email match)
If a match is found, the existing contact is updated. If not, a new contact is created.
### Body fields
| Field | Type | Required | Description |
| ---------- | ------ | -------- | ------------------------------------------------------------------------------- |
| `bot_id` | string | Yes | Agent to own newly created contacts |
| `contacts` | array | Yes | Array of contact objects (same fields as [Create](#create-a-contact)). Max 200. |
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/contacts/upsert \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"bot_id": "b_01HDEF",
"contacts": [
{
"first_name": "Ada",
"emails": [{ "email": "ada@example.com", "is_primary": true }]
},
{
"first_name": "Grace",
"emails": [{ "email": "grace@example.com", "is_primary": true }]
}
]
}'
```
### Response
```json theme={null}
{
"data": {
"created": [
{
"id": "c_01HNEW1...",
"first_name": "Grace",
"emails": [{ "email": "grace@example.com", "is_primary": true }]
}
],
"updated": [
{
"id": "c_01HXYZ...",
"first_name": "Ada",
"emails": [{ "email": "ada@example.com", "is_primary": true }]
}
],
"errors": []
}
}
```
Contacts that were newly inserted.
Contacts that matched an existing record and were updated.
Per-row failures as `{ index, message }`. The numeric `index` is the position of the failing item in the input `contacts` array. The rest of the batch still succeeds.
Upsert counts as a single write against your [rate limit](/api-reference/rate-limits) regardless of how many contacts are in the batch — much more efficient than a loop of `POST /contacts` calls.
# Conversations
Source: https://docs.clarky.ai/api-reference/conversations
Read, manage, and clean up conversations and messages across every channel — chat, voice, text, email, and forms
Conversations capture every back-and-forth your agents have with people — chat sessions on your site, phone calls, SMS threads, inbound emails, and form submissions. Each conversation belongs to an agent (`bot_id`) and may be linked to a [Contact](/api-reference/contacts) and/or an anonymous [Visitor](/features/traffic/visitors).
You can read transcripts, update inbox state (assignment, archive, takeover, internal notes), and soft-delete conversations from the API. Creating conversations is **not** supported — they originate from real channel events (the chat widget, voice/SMS webhooks, inbound email, form submissions) so that routing, billing, and analytics stay accurate.
Looking for the full transcript of a single conversation? Fetch the conversation, then call [List messages](#list-messages-in-a-conversation) with `order=asc`.
## The Conversation object
Unique conversation identifier.
The agent this conversation belongs to.
The CRM contact linked to this conversation, if one has been resolved.
Channel the conversation happened on. See [Conversation types](#conversation-types) below.
Best-known email for the participant (may be `null` for anonymous chats).
E.164 phone number for the participant on voice / text conversations.
Display name of the human, when known.
`true` when a human teammate has taken over the conversation from the agent.
User ID of the teammate the conversation is assigned to.
ISO 8601 timestamp of the most recent assignment.
`true` while the conversation is in progress; flips to `false` after a period of inactivity.
Soft-delete flag. Deleted conversations are excluded from list responses unless you pass `include_deleted=true`.
`true` for conversations between teammates (e.g. asking your internal agent), `false` for customer-facing conversations.
Free-text notes added by your team. Never shared with the participant.
Snippet of the most recent message — useful for inbox-style list views.
ISO 8601 timestamp of the most recent message.
ISO 8601 timestamp of the participant's most recent activity (typing, page change, etc.).
`true` if Clarky's sentiment analysis judged the conversation as net-positive, `false` if negative, `null` if not yet analyzed.
Sentiment score in the range `[-1, 1]`.
One-sentence summary of the participant's mood and intent.
Storage path for the call recording on voice conversations. Use the dashboard or a workspace-authenticated session to download.
Duration of voice / phone calls, in minutes.
Linked anonymous [Visitor](/features/traffic/visitors), when the conversation came from an unauthenticated chat.
ISO 8601 timestamp.
### Conversation types
The `type` field is a numeric ID. The list endpoint also accepts the names below as a convenience.
| `type` | Name | Channel |
| ------ | ---------------------------- | ------------------------------- |
| `1` | `chat` | Web chat widget |
| `2` | `phone` (or `voice`, `call`) | Inbound or outbound voice calls |
| `3` | `text` (or `sms`) | SMS / text-message threads |
| `4` | `email` | Inbound email threads |
| `5` | `form` | Form submissions |
## The Message object
Who sent the message. Common roles: `user` (participant), `assistant` (the agent), `system`, `tool`, `human` (a human teammate during takeover).
The text payload of the message. May be empty for tool-only messages.
MIME hint for the content (e.g. `text/plain`, `text/markdown`).
Delivery status, when available — e.g. `sent`, `delivered`, `failed`.
Name of the tool the assistant called, when this message represents a tool invocation.
JSON arguments passed to the tool.
ISO 8601 timestamp.
***
## List conversations
`GET /api/v1/conversations`
Returns a paginated list of conversations across all agents in your workspace. Sorted by `created_at` descending by default.
### Query parameters
| Param | Type | Description |
| --------------------- | ----------------- | -------------------------------------------------------------------------------- |
| `bot_id` | string | Filter to a single agent |
| `contact_id` | string | Filter to conversations linked to a specific contact |
| `visitor_id` | string | Filter to conversations linked to a specific anonymous visitor |
| `assigned_to` | string | Filter by the user ID of the assigned teammate |
| `type` | string \| integer | Filter by channel — `chat`, `phone`, `text`, `email`, `form`, or numeric `1`–`5` |
| `active` | boolean | `true` for in-progress conversations, `false` for inactive |
| `archived` | boolean | Filter on the archived flag (omit to include both) |
| `human_takeover` | boolean | `true` for conversations currently being handled by a human |
| `include_deleted` | boolean | Pass `true` to include soft-deleted conversations |
| `created_after` | string (ISO 8601) | Created at or after this timestamp |
| `created_before` | string (ISO 8601) | Created at or before this timestamp |
| `last_message_after` | string (ISO 8601) | Most-recent message at or after this timestamp |
| `last_message_before` | string (ISO 8601) | Most-recent message at or before this timestamp |
| `search` | string | Substring match against the latest message snippet, email, phone, or human name |
| `sort` | string | `created_at` (default) or `last_message_at` |
| `order` | string | `desc` (default) or `asc` |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/conversations?type=chat&active=true&page_size=10" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "conv_01HXYZ...",
"bot_id": "b_01HDEF...",
"contact_id": "c_01HABC...",
"type": 1,
"email": "ada@example.com",
"phone_number": null,
"human": "Ada Lovelace",
"human_takeover": false,
"assigned_to": null,
"assigned_at": null,
"active": true,
"archived": false,
"archived_at": null,
"deleted": false,
"deleted_at": null,
"internal": false,
"internal_notes": null,
"last_message": "Sounds good, talk soon!",
"last_message_at": "2026-04-30T14:21:00.000Z",
"last_active_at": "2026-04-30T14:21:30.000Z",
"sentiment_positive": true,
"sentiment_score": 0.74,
"sentiment_summary": "Customer is excited about the upcoming demo.",
"audio_url": null,
"minutes": null,
"visitor_id": "v_01HVIS...",
"created_at": "2026-04-30T14:00:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 10, "total": 1, "total_pages": 1 }
}
```
***
## Get a conversation
`GET /api/v1/conversations/{id}`
Fetches a single conversation by ID. Returns `404 not_found` if the conversation does not exist or belongs to another workspace.
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/conversations/conv_01HXYZ \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": {
"id": "conv_01HXYZ...",
"bot_id": "b_01HDEF...",
"contact_id": "c_01HABC...",
"type": 1,
"human": "Ada Lovelace",
"human_takeover": false,
"active": true,
"last_message": "Sounds good, talk soon!",
"last_message_at": "2026-04-30T14:21:00.000Z",
"sentiment_positive": true,
"sentiment_score": 0.74,
"created_at": "2026-04-30T14:00:00.000Z"
}
}
```
***
## Update a conversation
`PATCH /api/v1/conversations/{id}`
Requires a key with the `write` scope. Updates the listed fields and leaves everything else untouched. Use this to manage inbox state — assigning conversations to teammates, archiving, taking over from the agent, or adding private notes.
### Body fields
| Field | Type | Description |
| ---------------- | -------------- | ---------------------------------------------------------------------------------- |
| `internal_notes` | string \| null | Private notes for your team. Never shared with the participant. |
| `assigned_to` | string \| null | User ID of the teammate who should own this conversation. Pass `null` to unassign. |
| `archived` | boolean | `true` to archive, `false` to unarchive. |
| `human_takeover` | boolean | `true` to mute the agent and let a human reply. |
| `active` | boolean | Mark the conversation in-progress (`true`) or closed (`false`). |
Setting `assigned_to` automatically updates `assigned_at`. Setting `archived` automatically updates `archived_at`. You don't need to send those fields yourself.
### Example: assign a conversation
```bash theme={null}
curl -X PATCH https://clarky.ai/api/v1/conversations/conv_01HXYZ \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"assigned_to": "u_01HUSER",
"internal_notes": "Hot lead — follow up by EOD."
}'
```
```json theme={null}
{
"data": {
"id": "conv_01HXYZ...",
"bot_id": "b_01HDEF...",
"contact_id": "c_01HABC...",
"assigned_to": "u_01HUSER...",
"assigned_at": "2026-04-30T19:10:00.000Z",
"internal_notes": "Hot lead — follow up by EOD.",
"archived": false,
"active": true,
"created_at": "2026-04-30T14:00:00.000Z"
}
}
```
### Example: archive
```bash theme={null}
curl -X PATCH https://clarky.ai/api/v1/conversations/conv_01HXYZ \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{ "archived": true }'
```
### Example: take over from the agent
```bash theme={null}
curl -X PATCH https://clarky.ai/api/v1/conversations/conv_01HXYZ \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{ "human_takeover": true }'
```
Updating `human_takeover` only flips the flag — sending the actual reply still happens through the agent's channel (chat widget, SMS, etc.). Use takeover to silence the agent while a human responds in the dashboard.
***
## Delete a conversation
`DELETE /api/v1/conversations/{id}`
Requires a key with the `write` scope. Returns `204 No Content` with an empty body on success.
This is a **soft delete** — the conversation is hidden from list responses (and from the dashboard inbox) but transcripts, recordings, and analytics are preserved. Pass `include_deleted=true` on [List conversations](#list-conversations) to surface deleted records, and `PATCH` with `deleted: false` is **not** supported via the API; restoration is dashboard-only.
### Example
```bash theme={null}
curl -X DELETE https://clarky.ai/api/v1/conversations/conv_01HXYZ \
-H "Authorization: Bearer ck_live_example"
```
Deleting a conversation removes it from your inbox and all dashboard views. The underlying transcript is retained for compliance and analytics, but cannot be re-surfaced through the public API.
***
## List messages in a conversation
`GET /api/v1/conversations/{id}/messages`
Returns the messages in a single conversation, paginated. Defaults to **chronological order** (`order=asc`) — the natural read order for a transcript.
### Query parameters
| Param | Type | Description |
| ---------------- | ----------------- | --------------------------------------------------------------------------------- |
| `role` | string | Filter to messages from a single role — e.g. `user`, `assistant`, `human`, `tool` |
| `created_after` | string (ISO 8601) | Created at or after this timestamp |
| `created_before` | string (ISO 8601) | Created at or before this timestamp |
| `order` | string | `asc` (default) or `desc` |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/conversations/conv_01HXYZ/messages?page_size=50" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "msg_01HMSG1...",
"conversation_id": "conv_01HXYZ...",
"role": "user",
"content": "Hi! Do you support importing from HubSpot?",
"content_type": "text/plain",
"status": null,
"tool_used": null,
"tool_arguments": null,
"created_at": "2026-04-30T14:00:05.000Z"
},
{
"id": "msg_01HMSG2...",
"conversation_id": "conv_01HXYZ...",
"role": "assistant",
"content": "Yes — we have a one-click HubSpot importer. Want me to walk you through it?",
"content_type": "text/markdown",
"status": "delivered",
"tool_used": null,
"tool_arguments": null,
"created_at": "2026-04-30T14:00:08.000Z"
}
],
"pagination": { "page": 1, "page_size": 50, "total": 2, "total_pages": 1 }
}
```
For long transcripts, page through with `page_size=100` (the maximum) to minimize round-trips. The total message count is in `pagination.total`.
***
## List a contact's conversations
`GET /api/v1/contacts/{contact_id}/conversations`
Convenience endpoint that returns every conversation linked to a single contact, across all agents and channels.
### Query parameters
| Param | Type | Description |
| ----------------- | ------- | ------------------------------------------------- |
| `include_deleted` | boolean | Pass `true` to include soft-deleted conversations |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/contacts/c_01HABC/conversations \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "conv_01HXYZ...",
"bot_id": "b_01HDEF...",
"contact_id": "c_01HABC...",
"type": 1,
"last_message": "Sounds good, talk soon!",
"last_message_at": "2026-04-30T14:21:00.000Z",
"created_at": "2026-04-30T14:00:00.000Z"
},
{
"id": "conv_01HOLD...",
"bot_id": "b_01HDEF...",
"contact_id": "c_01HABC...",
"type": 2,
"minutes": 12,
"last_message_at": "2026-04-15T10:05:00.000Z",
"created_at": "2026-04-15T09:53:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 25, "total": 2, "total_pages": 1 }
}
```
***
## Common patterns
### Sync new conversations to a data warehouse
Poll for conversations that have started since your last sync.
```bash theme={null}
curl "https://clarky.ai/api/v1/conversations?created_after=2026-04-30T00:00:00Z&sort=created_at&order=asc" \
-H "Authorization: Bearer ck_live_example"
```
### Pull a full transcript
```bash theme={null}
# 1. Fetch the conversation (for metadata).
curl https://clarky.ai/api/v1/conversations/conv_01HXYZ \
-H "Authorization: Bearer ck_live_example"
# 2. Page through its messages in order.
curl "https://clarky.ai/api/v1/conversations/conv_01HXYZ/messages?page_size=100&order=asc" \
-H "Authorization: Bearer ck_live_example"
```
### Find every chat a customer has had with you
```bash theme={null}
curl https://clarky.ai/api/v1/contacts/c_01HABC/conversations \
-H "Authorization: Bearer ck_live_example"
```
### Auto-assign new conversations from your CRM
Combine [List conversations](#list-conversations) with [Update a conversation](#update-a-conversation) to route inbound chats to the right rep. Filter for unassigned, in-progress conversations and PATCH each one with the right `assigned_to`.
```bash theme={null}
curl "https://clarky.ai/api/v1/conversations?active=true&type=chat" \
-H "Authorization: Bearer ck_live_example"
curl -X PATCH https://clarky.ai/api/v1/conversations/conv_01HXYZ \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{ "assigned_to": "u_01HUSER" }'
```
# Errors
Source: https://docs.clarky.ai/api-reference/errors
Consistent error envelope and codes returned by the Clarky API
Every Clarky API error — whether it's an authentication failure, a validation problem, or an internal error — comes back in the same envelope. This makes it easy to write a single error handler that works across every endpoint.
## Error envelope
```json theme={null}
{
"error": {
"code": "validation_error",
"message": "first_name must be a string",
"details": {
"field": "first_name"
}
}
}
```
A short machine-readable identifier for the failure. Use this for branching logic — never the message.
A human-readable description of what went wrong. Safe to surface to developers, but not generally suitable for end users.
Optional structured context. The shape depends on the error code — for `validation_error` this often includes the offending field name, expected type, etc.
## Error codes
| Code | HTTP | Meaning |
| ------------------ | ---- | ------------------------------------------------------------------ |
| `unauthorized` | 401 | Missing, malformed, or revoked API key |
| `forbidden` | 403 | Authenticated, but the key doesn't have permission for this action |
| `not_found` | 404 | The resource doesn't exist or isn't visible to your workspace |
| `bad_request` | 400 | The request was malformed (bad JSON, unsupported parameter, etc.) |
| `validation_error` | 422 | The request was well-formed but a field failed validation |
| `conflict` | 409 | The request conflicts with the current state of a resource |
| `rate_limited` | 429 | Too many requests — see [Rate Limits](/api-reference/rate-limits) |
| `internal_error` | 500 | Something went wrong on our end. Retry with backoff |
## Examples
### `unauthorized` (401)
Returned when the `Authorization` header is missing, the key has been revoked, or the key format is invalid.
```json theme={null}
{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key"
}
}
```
### `forbidden` (403)
Returned when the key is valid but doesn't have permission for the action — for example, a `read`-only key trying to `POST`.
```json theme={null}
{
"error": {
"code": "forbidden",
"message": "This API key does not have the 'write' scope"
}
}
```
### `not_found` (404)
Returned when the resource doesn't exist, or exists in a different workspace than the one your key belongs to.
```json theme={null}
{
"error": {
"code": "not_found",
"message": "Contact not found"
}
}
```
### `bad_request` (400)
Returned for malformed requests — invalid JSON, unsupported query parameters, missing `Content-Type`, etc.
```json theme={null}
{
"error": {
"code": "bad_request",
"message": "Request body must be valid JSON"
}
}
```
### `validation_error` (422)
Returned when the request is structurally valid but at least one field failed validation. The `details` object identifies the offending field.
```json theme={null}
{
"error": {
"code": "validation_error",
"message": "deal_value must be a non-negative number",
"details": {
"field": "deal_value"
}
}
}
```
### `conflict` (409)
Returned when the request would violate a uniqueness constraint or otherwise conflict with the current state.
```json theme={null}
{
"error": {
"code": "conflict",
"message": "A contact with this primary email already exists",
"details": {
"field": "emails",
"existing_contact_id": "c_01HXYZ..."
}
}
}
```
### `rate_limited` (429)
Returned when you exceed the per-key request budget. The response includes `Retry-After` and `X-RateLimit-*` headers — see [Rate Limits](/api-reference/rate-limits).
```json theme={null}
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after 30 seconds."
}
}
```
### `internal_error` (500)
Returned when something unexpected happened server-side. These should be rare. Retry with exponential backoff.
```json theme={null}
{
"error": {
"code": "internal_error",
"message": "An unexpected error occurred"
}
}
```
Always branch on `error.code`, never on `error.message`. We may improve message wording over time, but codes are stable contract.
# Forms
Source: https://docs.clarky.ai/api-reference/forms
Read forms and the submissions captured by them
Forms collect structured data from your users — typically lead capture, surveys, or onboarding flows. The Forms API is **read-only**: forms themselves are configured in the dashboard (see the [Forms feature docs](/features/forms/overview)), and submissions are created when users fill them out. The API lets you list forms, fetch a single form's configuration, and read submissions.
## The Form object
The agent that owns this form.
Configuration for built-in fields (name, email, phone, etc.) — JSON shape varies by form.
Configuration for custom fields the workspace has defined.
Configuration for survey questions, if the form is a survey form.
ISO 8601 timestamp.
ISO 8601 timestamp.
## The Submission object
Linked contact, if the submission was associated with one.
The submitter's answers, keyed by field name.
`true` if the submission was created by an internal user (e.g. via dashboard testing). Filtered out of submission lists by default.
ISO 8601 timestamp.
***
## List forms
`GET /api/v1/forms`
### Query parameters
| Param | Type | Description |
| ----------- | ------- | ------------------------------------------- |
| `bot_id` | string | Restrict to forms owned by a specific agent |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/forms \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "f_01HFRM...",
"workspace_id": "w_01HXXX...",
"bot_id": "b_01HDEF...",
"name": "Demo Request",
"description": "Lead capture form for the marketing site",
"standard_fields": {
"first_name": { "enabled": true, "required": true },
"email": { "enabled": true, "required": true }
},
"custom_fields": {},
"survey_questions": {},
"created_at": "2026-02-10T10:00:00.000Z",
"updated_at": "2026-04-15T08:00:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 25, "total": 1, "total_pages": 1 }
}
```
***
## Get a form
`GET /api/v1/forms/{id}`
Returns the full form configuration, including every standard, custom, and survey field.
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/forms/f_01HFRM \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": {
"id": "f_01HFRM...",
"workspace_id": "w_01HXXX...",
"bot_id": "b_01HDEF...",
"name": "Demo Request",
"description": "Lead capture form for the marketing site",
"standard_fields": {
"first_name": { "enabled": true, "required": true },
"last_name": { "enabled": true, "required": false },
"email": { "enabled": true, "required": true },
"company": { "enabled": true, "required": false }
},
"custom_fields": {
"team_size": {
"label": "How big is your team?",
"type": "select",
"options": ["1-10", "11-50", "51-200", "200+"]
}
},
"survey_questions": {},
"created_at": "2026-02-10T10:00:00.000Z",
"updated_at": "2026-04-15T08:00:00.000Z"
}
}
```
***
## List form submissions
`GET /api/v1/forms/{id}/submissions`
Returns a paginated list of submissions for a single form, in reverse-chronological order.
### Query parameters
| Param | Type | Description |
| ------------------ | ------- | -------------------------------------------------------------- |
| `include_internal` | boolean | Include submissions where `is_internal=true` (default `false`) |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/forms/f_01HFRM/submissions?page_size=50" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "s_01HSUB...",
"form_id": "f_01HFRM...",
"contact_id": "c_01HXYZ...",
"custom_field_responses": {
"first_name": "Ada",
"email": "ada@example.com",
"company": "Analytical Engines Inc.",
"team_size": "11-50"
},
"is_internal": false,
"submitted_at": "2026-04-29T13:00:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 50, "total": 1, "total_pages": 1 }
}
```
By default, submissions where `is_internal=true` (typically internal test fills from the dashboard) are excluded. Pass `include_internal=true` to see them — useful when reconciling totals against the dashboard's "include internal" toggle.
***
## Get a submission
`GET /api/v1/submissions/{id}`
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/submissions/s_01HSUB \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": {
"id": "s_01HSUB...",
"form_id": "f_01HFRM...",
"contact_id": "c_01HXYZ...",
"custom_field_responses": {
"first_name": "Ada",
"email": "ada@example.com",
"company": "Analytical Engines Inc.",
"team_size": "11-50"
},
"is_internal": false,
"submitted_at": "2026-04-29T13:00:00.000Z"
}
}
```
To get notified the moment a new submission lands — instead of polling — set up a [Webhook](/features/settings/webhooks) on the contact-created or form-submission events.
# API Reference
Source: https://docs.clarky.ai/api-reference/introduction
Programmatic access to your Clarky workspace data via a public REST API
The Clarky REST API gives you programmatic access to the same CRM and conversation data you see in the dashboard — contacts, companies, pipelines, activities, conversations, messages, forms, and submissions. Use it to sync data into your data warehouse, build custom dashboards, automate lead capture, or power two-way integrations with your stack.
**Plan availability:** API access is available on the **Standard**, **Pro**, and **Enterprise** plans. See [Plans & Billing](/features/settings/plans).
## Base URL
All endpoints are served from a single base URL:
```bash theme={null}
https://clarky.ai/api/v1
```
The API is versioned in the URL path. The current version is `v1`. We'll announce breaking changes well in advance and maintain older versions for a documented deprecation window.
## Conventions
* **Format** — All requests and responses are JSON. Send `Content-Type: application/json` with `POST` and `PATCH` requests.
* **Workspace scope** — Every API key belongs to a single workspace. Calls automatically operate on that workspace's data.
* **Single resources** — Returned as `{ "data": { ... } }`.
* **List resources** — Returned as `{ "data": [...], "pagination": { ... } }`.
* **Deletes** — Return `204 No Content` with an empty body.
* **Errors** — Wrapped in a consistent `error` envelope. See [Errors](/api-reference/errors).
## Quick example
```bash theme={null}
curl https://clarky.ai/api/v1/contacts \
-H "Authorization: Bearer ck_live_example"
```
## Get started
Make your first curl request in under 2 minutes
Create an API key, understand scopes, and authenticate requests
Error envelope shape and every error code with examples
Page through list endpoints with `page` and `page_size`
Per-key request limits and recommended retry behavior
## Resources
Discover the agents in your workspace and their channel configuration
Create, read, update, delete, and bulk upsert contacts
Manage companies and the contacts that belong to them
Read pipelines and stages, manage pipeline cards
Log notes, calls, meetings, tasks, and reminders
Read conversations and messages across every channel
Read forms and their submissions
## API and Webhooks
The REST API and [Webhooks](/features/settings/webhooks) are complementary. The API is the right tool for two-way data flow — pulling data on demand, creating and updating records, or backfilling historical data. Webhooks are best for one-way, real-time push notifications when something happens inside Clarky. Most integrations use both.
Need a feature that isn't covered yet? Email [support@clarky.ai](mailto:support@clarky.ai) — we're actively expanding the API surface.
# Pagination
Source: https://docs.clarky.ai/api-reference/pagination
Page through list endpoints with `page` and `page_size`
All list endpoints in the Clarky API return paginated results. Pagination is page-based — you ask for a specific page and a page size, and the response tells you how many pages there are in total.
## Query parameters
The 1-indexed page number to fetch.
Number of items per page. **Maximum is 100.** Requests above the maximum return `validation_error`.
## Response shape
Every list endpoint wraps results in `data` (the items for the current page) and `pagination` (metadata about the pagination state).
```json theme={null}
{
"data": [
{ "id": "c_01HXYZ...", "first_name": "Ada" },
{ "id": "c_01HXYZ...", "first_name": "Grace" }
],
"pagination": {
"page": 1,
"page_size": 25,
"total": 142,
"total_pages": 6
}
}
```
The current page number (1-indexed).
Number of items returned per page.
Total number of items across every page.
Total number of pages. `total_pages` is `Math.ceil(total / page_size)`.
## Examples
### Fetch the first page
```bash theme={null}
curl "https://clarky.ai/api/v1/contacts?page=1&page_size=25" \
-H "Authorization: Bearer ck_live_example"
```
### Fetch a larger page
```bash theme={null}
curl "https://clarky.ai/api/v1/contacts?page_size=100" \
-H "Authorization: Bearer ck_live_example"
```
### Iterate every page
```javascript theme={null}
async function fetchAllContacts(apiKey) {
const all = [];
let page = 1;
while (true) {
const res = await fetch(
`https://clarky.ai/api/v1/contacts?page=${page}&page_size=100`,
{ headers: { Authorization: `Bearer ${apiKey}` } }
);
const { data, pagination } = await res.json();
all.push(...data);
if (page >= pagination.total_pages) break;
page += 1;
}
return all;
}
```
For large backfills, prefer `page_size=100` to minimize round-trips, and respect the [rate limits](/api-reference/rate-limits) by backing off when you see `429` responses.
## Endpoints that don't paginate
A small number of endpoints return collections without pagination because the result set is bounded — for example, [stages within a pipeline](/api-reference/pipelines#list-pipeline-stages). These return `{ "data": [...] }` with no `pagination` object. The shape is documented per-endpoint.
## Single-resource responses
For endpoints that return a single resource (e.g. `GET /contacts/{id}`), the response is just `{ "data": { ... } }` — no `pagination` object.
```json theme={null}
{
"data": {
"id": "c_01HXYZ...",
"first_name": "Ada"
}
}
```
# Pipelines
Source: https://docs.clarky.ai/api-reference/pipelines
Read pipelines and stages, manage pipeline cards
Pipelines model your sales (or other) workflow. Each pipeline has an ordered list of **stages**, and each stage holds **cards** — usually one per deal or opportunity. Pipelines and stages are read-only via the API; cards support full CRUD.
## Resources
The top-level container, owned by an agent
Ordered columns within a pipeline
Individual deals living in a stage
***
## The Pipeline object
ISO 8601 timestamp.
ISO 8601 timestamp.
## List pipelines
`GET /api/v1/pipelines`
### Query parameters
| Param | Type | Description |
| ----------- | ------- | ----------------------------------------------- |
| `bot_id` | string | Restrict to pipelines owned by a specific agent |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/pipelines?bot_id=b_01HDEF" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "p_01HPLA...",
"workspace_id": "w_01HXXX...",
"bot_id": "b_01HDEF...",
"name": "Sales Pipeline",
"is_default": true,
"is_private": false,
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-04-01T08:00:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 25, "total": 1, "total_pages": 1 }
}
```
***
## The Stage object
Hex color (e.g. `"#0586ff"`).
0-indexed position within the pipeline.
## List pipeline stages
`GET /api/v1/pipelines/{id}/stages`
Returns every stage in the pipeline, sorted by `order_index`. **Not paginated** — the response shape is `{ "data": [...] }` with no `pagination` object.
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/pipelines/p_01HPLA/stages \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "ps_01HSTA...",
"bot_id": "b_01HDEF...",
"pipeline_id": "p_01HPLA...",
"name": "Lead",
"color": "#94a3b8",
"order_index": 0,
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-01-15T10:00:00.000Z"
},
{
"id": "ps_01HSTB...",
"bot_id": "b_01HDEF...",
"pipeline_id": "p_01HPLA...",
"name": "Qualified",
"color": "#3b82f6",
"order_index": 1,
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-01-15T10:00:00.000Z"
},
{
"id": "ps_01HSTC...",
"bot_id": "b_01HDEF...",
"pipeline_id": "p_01HPLA...",
"name": "Closed Won",
"color": "#22c55e",
"order_index": 2,
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-01-15T10:00:00.000Z"
}
]
}
```
***
## The Pipeline Card object
The stage the card is currently in.
The contact associated with this card, if any.
Position within the stage. Lower values sort first.
ISO 8601 timestamp the card was archived. `null` if active.
## List pipeline cards
`GET /api/v1/pipeline-cards`
### Query parameters
| Param | Type | Description |
| ------------------- | ------- | ---------------------------------------------- |
| `pipeline_id` | string | Restrict to cards in a specific pipeline |
| `pipeline_stage_id` | string | Restrict to cards in a specific stage |
| `bot_id` | string | Restrict to cards owned by a specific agent |
| `contact_id` | string | Restrict to cards linked to a specific contact |
| `include_archived` | boolean | Include archived cards (default `false`) |
| `page` | integer | See [Pagination](/api-reference/pagination) |
| `page_size` | integer | See [Pagination](/api-reference/pagination) |
### Example
```bash theme={null}
curl "https://clarky.ai/api/v1/pipeline-cards?pipeline_stage_id=ps_01HSTA" \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": [
{
"id": "pc_01HCRD...",
"pipeline_stage_id": "ps_01HSTA...",
"contact_id": "c_01HXYZ...",
"title": "Acme Corp – renewal",
"description": "Renewal due in Q2",
"tags": ["renewal"],
"order_index": 0,
"archived_at": null,
"created_at": "2026-04-10T09:00:00.000Z",
"updated_at": "2026-04-29T15:00:00.000Z"
}
],
"pagination": { "page": 1, "page_size": 25, "total": 1, "total_pages": 1 }
}
```
***
## Get a pipeline card
`GET /api/v1/pipeline-cards/{id}`
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/pipeline-cards/pc_01HCRD \
-H "Authorization: Bearer ck_live_example"
```
```json theme={null}
{
"data": {
"id": "pc_01HCRD...",
"pipeline_stage_id": "ps_01HSTA...",
"contact_id": "c_01HXYZ...",
"title": "Acme Corp – renewal",
"description": "Renewal due in Q2",
"tags": ["renewal"],
"order_index": 0,
"archived_at": null,
"created_at": "2026-04-10T09:00:00.000Z",
"updated_at": "2026-04-29T15:00:00.000Z"
}
}
```
***
## Create a pipeline card
`POST /api/v1/pipeline-cards`
Requires a key with the `write` scope.
### Body fields
| Field | Type | Required | Description |
| ------------------- | --------- | -------- | -------------------------------- |
| `pipeline_stage_id` | string | Yes | The stage to drop the card into |
| `title` | string | Yes | |
| `contact_id` | string | No | Link to a contact |
| `description` | string | No | |
| `tags` | string\[] | No | |
| `order_index` | integer | No | Defaults to the end of the stage |
### Example
```bash theme={null}
curl https://clarky.ai/api/v1/pipeline-cards \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"pipeline_stage_id": "ps_01HSTA",
"title": "Acme Corp – renewal",
"contact_id": "c_01HXYZ",
"tags": ["renewal"]
}'
```
```json theme={null}
{
"data": {
"id": "pc_01HCRD...",
"pipeline_stage_id": "ps_01HSTA...",
"contact_id": "c_01HXYZ...",
"title": "Acme Corp – renewal",
"tags": ["renewal"],
"order_index": 3,
"archived_at": null,
"created_at": "2026-04-29T19:10:00.000Z",
"updated_at": "2026-04-29T19:10:00.000Z"
}
}
```
***
## Update a pipeline card
`PATCH /api/v1/pipeline-cards/{id}`
Update any combination of fields. Setting `pipeline_stage_id` to a new stage moves the card. Setting `archived_at` to an ISO 8601 timestamp archives the card; setting it to `null` un-archives it.
### Body fields
| Field | Type | Description |
| ------------------- | -------------- | ------------------------------------------- |
| `pipeline_stage_id` | string | Move the card to a different stage |
| `contact_id` | string \| null | Link or unlink a contact |
| `title` | string | |
| `description` | string | |
| `tags` | string\[] | |
| `order_index` | integer | Reorder within the stage |
| `archived_at` | string \| null | ISO 8601 timestamp, or `null` to un-archive |
### Example: move a card to a new stage
```bash theme={null}
curl -X PATCH https://clarky.ai/api/v1/pipeline-cards/pc_01HCRD \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{ "pipeline_stage_id": "ps_01HSTC", "order_index": 0 }'
```
```json theme={null}
{
"data": {
"id": "pc_01HCRD...",
"pipeline_stage_id": "ps_01HSTC...",
"order_index": 0,
"updated_at": "2026-04-29T19:15:00.000Z"
}
}
```
***
## Delete a pipeline card
`DELETE /api/v1/pipeline-cards/{id}`
Returns `204 No Content`. To preserve a card while removing it from active views, set `archived_at` via [Update](#update-a-pipeline-card) instead of deleting.
```bash theme={null}
curl -X DELETE https://clarky.ai/api/v1/pipeline-cards/pc_01HCRD \
-H "Authorization: Bearer ck_live_example"
```
# Quickstart
Source: https://docs.clarky.ai/api-reference/quickstart
Make your first request to the Clarky API in under 2 minutes
This walks you from zero to a working `curl` call against your live workspace data. By the end you'll have listed contacts, fetched a single contact, and created one — using nothing but the terminal.
**Plan availability:** Standard, Pro, or Enterprise. See [Plans & Billing](/features/settings/plans).
## 1. Create an API key
From the admin dashboard, click **Settings**, then choose **API Keys** under the Workspace section.
Give it a memorable name (e.g. "Local testing"). The full key is shown **only once** — copy it immediately.
Store it somewhere safe. If you lose it, revoke it and create a new one.
## 2. Set the key as a shell variable
This keeps the key out of your shell history and makes the examples below copy-pasteable.
```bash macOS / Linux theme={null}
export CLARKY_KEY='ck_live_paste_your_key_here'
```
```powershell Windows (PowerShell) theme={null}
$env:CLARKY_KEY='ck_live_paste_your_key_here'
```
## 3. List your contacts
Your first read. The list is automatically scoped to the workspace the key belongs to.
```bash theme={null}
curl -H "Authorization: Bearer $CLARKY_KEY" \
"https://clarky.ai/api/v1/contacts?page=1&page_size=5"
```
Expected response shape:
```json theme={null}
{
"data": [
{
"id": "9f1c6a9e-8c3b-4ea2-bf8c-5b08f7a4d6c2",
"first_name": "Ada",
"last_name": "Lovelace",
"emails": ["ada@example.com"],
"company": "Analytical Engines",
"tags": ["beta-tester"],
"created_at": "2026-01-12T14:30:00Z",
"updated_at": "2026-01-12T14:30:00Z"
}
],
"pagination": { "page": 1, "page_size": 5, "total": 47, "total_pages": 10 }
}
```
Pipe the response through `jq` for readable output: `curl ... | jq`. Install with `brew install jq` on macOS.
## 4. Get a single contact
Grab any `id` from the previous response and use it in the path:
```bash theme={null}
curl -H "Authorization: Bearer $CLARKY_KEY" \
"https://clarky.ai/api/v1/contacts/9f1c6a9e-8c3b-4ea2-bf8c-5b08f7a4d6c2"
```
## 5. Search by email
Useful for "do I already have this contact?" lookups. Returns `404` if no match.
```bash theme={null}
curl -H "Authorization: Bearer $CLARKY_KEY" \
"https://clarky.ai/api/v1/contacts/by-email?email=ada@example.com"
```
## 6. Create a contact (your first write)
You'll need a `bot_id` — find it in the URL when you're inside an agent's admin pages (`/admin///...`), or call `GET /api/v1/pipelines` and use the `bot_id` from any returned pipeline.
```bash theme={null}
curl -X POST "https://clarky.ai/api/v1/contacts" \
-H "Authorization: Bearer $CLARKY_KEY" \
-H "Content-Type: application/json" \
-d '{
"bot_id": "your-bot-uuid",
"first_name": "Test",
"last_name": "User",
"emails": ["test@example.com"],
"tags": ["api-test"],
"lead_source": "API Quickstart"
}'
```
A `201 Created` response means it worked. Open **CRM → People** in your dashboard sidebar and you'll see the new contact.
For idempotent imports use [`POST /api/v1/contacts/upsert`](/api-reference/contacts) — it dedupes on primary email or phone so you can re-run the same payload safely.
## 7. Verify auth is enforced
Sanity-check that the API rejects requests without a valid key:
```bash theme={null}
curl -i "https://clarky.ai/api/v1/contacts"
```
You should get back `HTTP/1.1 401 Unauthorized` with:
```json theme={null}
{ "error": { "code": "unauthorized", "message": "Missing or invalid API key" } }
```
## Common pitfalls
The `Authorization` header is missing, malformed, or the key has been revoked. The header must be exactly `Authorization: Bearer ` — note the literal word `Bearer` and a single space.
Your key was created without the `write` scope. Revoke it and create a new one with both `read` and `write` (the default).
The `bot_id` you sent doesn't belong to your workspace. Use a bot ID from your own workspace — pulling one from `GET /api/v1/pipelines` is the easiest check.
You've exceeded the per-key rate limit (120 reads/min, 60 writes/min). Look at the `Retry-After` header and back off. See [Rate Limits](/api-reference/rate-limits) for details.
On Windows or older curl versions the JSON body may need different quoting. Use single quotes around the `-d` payload on macOS/Linux and escape inner double quotes on Windows, or use a `--data @body.json` file instead.
## Next steps
Scopes, key rotation, security best practices
Walking large result sets
Per-key limits and retry behavior
Full Contacts endpoint reference
# Rate Limits
Source: https://docs.clarky.ai/api-reference/rate-limits
Per-key request budgets and recommended client behavior
Every API key has its own request budget, applied independently per key. Limits are split between read and write operations to keep heavy reads from starving writes (and vice versa).
## Limits
| Operation | Methods | Limit |
| ---------- | ------------------------- | ------------------------------- |
| **Reads** | `GET`, `HEAD` | **120 requests/minute** per key |
| **Writes** | `POST`, `PATCH`, `DELETE` | **60 requests/minute** per key |
Limits are enforced on a rolling 60-second window. When you hit the limit, subsequent requests return `429 Too Many Requests` until the window resets.
## Rate limit headers
Every response — successful or rate-limited — includes headers that describe your current budget:
Maximum requests allowed in the current window for this method class (read or write).
Requests remaining in the current window.
Unix timestamp (seconds since epoch) when the current window resets.
Example response headers:
```http theme={null}
HTTP/1.1 200 OK
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
X-RateLimit-Reset: 1735689600
```
## What a 429 looks like
When you exceed the limit, you'll get a `429` with a standard error envelope and a `Retry-After` header (in seconds):
```http theme={null}
HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1735689600
Content-Type: application/json
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after 30 seconds."
}
}
```
## Recommended client behavior
On a `429`, wait at least the number of seconds in the `Retry-After` header before retrying. This is the simplest correct strategy.
For longer-running jobs, layer exponential backoff on top of `Retry-After`. Add random jitter so a fleet of workers doesn't synchronize and thunder back together.
Watch `X-RateLimit-Remaining`. If it's getting close to zero, slow down before you hit the limit — it's much cheaper than recovering from a `429`.
If you genuinely need throughput beyond the per-key limit, create multiple keys (one per worker) and shard your work across them. Limits are per-key, so independent keys give you linear scaling. Reach out to support if you need a higher per-key limit.
## Example: handling 429 in Node.js
```javascript theme={null}
async function fetchWithBackoff(url, options, attempt = 0) {
const res = await fetch(url, options);
if (res.status === 429) {
const retryAfter = parseInt(res.headers.get("Retry-After") ?? "5", 10);
const jitter = Math.random() * 500;
const delayMs = retryAfter * 1000 + jitter;
if (attempt >= 5) throw new Error("Too many retries");
await new Promise((r) => setTimeout(r, delayMs));
return fetchWithBackoff(url, options, attempt + 1);
}
return res;
}
```
Don't retry every error blindly — only retry `429` and `5xx` responses. Retrying `4xx` errors (other than `429`) wastes budget and won't change the outcome.
For bulk loads, the [`POST /contacts/upsert`](/api-reference/contacts#bulk-upsert-contacts) endpoint accepts up to 200 contacts in a single request. Prefer it over a loop of individual `POST /contacts` calls — one upsert costs one write against your budget.
# Sequences
Source: https://docs.clarky.ai/api-reference/sequences
Upsert a contact and start a personalized outbound sequence in one call
**Plan availability:** Standard or higher (requires both **Sequences** and **API Access**). See [Plans & Billing](/features/settings/plans).
The Sequences API lets you trigger a fully personalized outbound campaign for a single contact from your own backend. In one call, Clarky will:
1. **Upsert the contact** in your workspace (matched by primary email, falling back to phone).
2. **Append the notes** you send (`Speaks Spanish. Located in Madrid.`) to the contact's record so they survive across calls.
3. **Generate a bespoke sequence** from a saved template using a two-stage LLM pipeline — emails are written for the specific recipient, in their language, referencing real context. SMS / voice scripts are generated the same way.
4. **Optionally launch immediately** — with `auto_approve: true`, the first step (call or email) fires within seconds of generation completing, no human review required.
Templates encode which channels are allowed (`email`, `voice`, `sms`), so the API itself does not expose a channel selector — pick a template that uses the channels you want.
**Generation takes time.** The endpoint responds with `202 Accepted` after a few hundred milliseconds, but the LLM pipeline runs in the background and takes \~30–90s before the first outbound action goes out. Poll the status endpoint to know when it has shipped.
## Start a sequence
`POST /api/v1/sequences/start`
### Request body
ID of a [sequence template](#) in your workspace. The template defines the goal prompt, allowed channels, pacing, and (optionally) the bot identity.
Required only if the template has no `bot_id`. The bot whose email/phone identity will be used as the sender.
The contact to upsert.
Array of email addresses. The first is treated as primary and used for matching.
Array of phone numbers in E.164 format. The first is primary. Used for matching when no email is provided.
Free-text context the LLM will use to personalize the outreach — e.g. `"Speaks Spanish. Located in Madrid. Returning lead."`. On an existing contact, new notes are **appended** (not overwritten) with a timestamp tag like `[via API 2026-05-06]`.
Workspace-defined custom fields, stored as JSON.
At least one of `emails` or `phone_numbers` is required.
When `true`, skips the human review gate. After generation, step 1's `scheduled_for` is forced to `now` and the dispatcher fires immediately — the contact's phone rings (or inbox dings) within seconds. Use this for trusted automation.
When `false` (the default), the sequence is generated and parked in `pending_approval`. Workspace admins receive an email with a review link.
A stable identifier (e.g. your internal lead ID). Calling the endpoint a second time with the same key returns the original `sequence_id` and `enrollment_id` — no duplicate sequence is created.
Display name for the sequence. Defaults to the template's name.
### Response — 202 Accepted
```json theme={null}
{
"data": {
"sequence_id": "seq_01HXYZ...",
"enrollment_id": "enr_01HXYZ...",
"contact_id": "c_01HXYZ...",
"contact_action": "created",
"auto_approve": true,
"status": "generating",
"status_url": "/api/v1/sequences/enrollments/enr_01HXYZ..."
}
}
```
### Example — call back a Spanish-speaking lead immediately
```bash theme={null}
curl -X POST "https://clarky.ai/api/v1/sequences/start" \
-H "Authorization: Bearer ck_live_example" \
-H "Content-Type: application/json" \
-d '{
"template_id": "tpl_01HABC...",
"contact": {
"first_name": "Maria",
"last_name": "García",
"emails": ["maria@example.com"],
"phone_numbers": ["+34911234567"],
"company": "Acme Spain",
"notes": "Speaks Spanish. Located in Madrid. Submitted contact form 30 seconds ago asking about pricing."
},
"auto_approve": true,
"idempotency_key": "lead_20260506_84211"
}'
```
### Errors
| Code | Meaning |
| ----- | ------------------------------------------------------------------------------------------------- |
| `400` | Missing required field, or template has no `bot_id` and none was provided. |
| `401` | Invalid or revoked API key. |
| `403` | API key does not have `write` scope. |
| `404` | Template not found in this workspace. |
| `422` | Validation error — e.g. contact has no email or phone, or `bot_id` is from a different workspace. |
| `429` | Rate limit exceeded. |
***
## Get enrollment status
`GET /api/v1/sequences/enrollments/{enrollment_id}`
Use this to poll for generation progress, see the generated steps, and check delivery state.
### Status values
| Status | Meaning |
| ---------------------- | -------------------------------------------------------------------------------------------------------------- |
| `generating` | LLM is still producing the sequence. Typical 30–90s. |
| `pending_approval` | Sequence is generated but awaiting human approval (only when `auto_approve: false`). Admins have been emailed. |
| `approved` | Steps are scheduled. The first step is in flight or already sent. |
| `running` | Sequence is active across multiple steps. |
| `stopped_reply` | Contact replied; the sequence halted (if `stop_on_reply` is on for the template). |
| `stopped_unsubscribed` | Contact's email/phone is suppressed. |
| `stopped_user` | Manually halted by a workspace user. |
| `completed` | All steps sent. |
| `failed` | Generation or dispatch failed. See `generation_error`. |
### Example response
```json theme={null}
{
"data": {
"id": "enr_01HXYZ...",
"sequence_id": "seq_01HXYZ...",
"contact_id": "c_01HXYZ...",
"status": "approved",
"generation_error": null,
"approved_at": "2026-05-06T14:22:11Z",
"stop_reason": null,
"created_at": "2026-05-06T14:21:14Z",
"updated_at": "2026-05-06T14:22:11Z",
"sequence": {
"id": "seq_01HXYZ...",
"name": "Inbound lead — Spanish",
"status": "active",
"bot_id": "b_01HDEF...",
"template_id": "tpl_01HABC..."
},
"steps": [
{
"id": "stp_01...",
"sort_order": 1,
"channel": "voice",
"status": "sent",
"scheduled_for": "2026-05-06T14:22:11Z",
"sent_at": "2026-05-06T14:22:18Z",
"to_identifier": "+34911234567",
"voice_objective": "Confirm pricing tier and book a 15-minute demo this week",
"voice_script": "Hola Maria, te llamo desde Acme..."
},
{
"id": "stp_02...",
"sort_order": 2,
"channel": "email",
"status": "scheduled",
"scheduled_for": "2026-05-07T15:00:00Z",
"email_subject": "Resumen de la llamada y próximos pasos"
}
]
}
}
```
***
## Notes & limits
* **Latency floor:** \~30–90s from API call to first outbound action. Two LLM calls run in the background; this can't be made faster while still producing language-matched, personalized content.
* **Channels are template-driven.** If the template's `allowed_channels` is `["email", "voice"]`, no SMS will be sent regardless of what the contact has on file.
* **Concurrent enrollments are allowed** — calling the endpoint while the contact is in another active sequence will not be rejected.
* **Suppressed contacts** (unsubscribed email, opted-out phone) cause the enrollment to fail with `no_usable_channels`. Polling the status endpoint will reflect this.
# Availability and Schedules
Source: https://docs.clarky.ai/features/booking/availability
Define when you're bookable and connect your Google Calendar to block real conflicts
## How Availability Works
Clarky calculates available time slots from three sources, in order of priority:
1. **Event type schedule** — working hours set on a specific event type
2. **Default schedule** — your default working hours
3. **Built-in fallback** — Monday through Friday, 9am to 5pm, if nothing else is configured
On top of that, Clarky removes any time that conflicts with existing Clarky bookings or events on connected Google Calendars.
## Working Hours
A schedule defines which days and times you're available. Configure it from the **Availability** tab inside an event type.
From an event type, open the **Availability** tab.
All hours are stored in your timezone. Invitees see times converted to their own timezone automatically.
For each day of the week, set a start and end time (for example, Monday–Friday 9:00–17:00). Days you leave blank are unavailable.
Block specific dates — vacations, holidays, conferences — so they never appear as bookable.
Changes take effect immediately for new bookings.
## Date Overrides
Override your normal hours for a specific date without changing your weekly schedule.
Use date overrides to:
* Block a single day (for example, "out for a doctor's appointment on Tuesday")
* Open a normally-closed day (for example, "available this Saturday only, 10am–2pm")
* Shorten a day (for example, "Friday 9am–noon only")
## Connecting Google Calendar
Connecting Google Calendar lets Clarky:
* Block time slots that conflict with events on your calendar
* Add new bookings to your calendar automatically
* Generate Google Meet links for Google Meet event types
Inside any event type, go to the **Availability** tab.
Sign in with the Google account you want to use.
Grant permission so Clarky can read events and create new ones.
Pick which calendars to scan for conflicts (work, personal, etc.) and which calendar to add new bookings to.
Each workspace member connects their own Google account. The connection is private — your teammates can't see your calendar events, only that your time is busy.
## Conflict Detection
Once Google Calendar is connected, Clarky checks your calendar before offering a time slot. If you have an event on your calendar at 2pm — even one created outside Clarky — that time disappears from your booking page.
You control which calendars are checked for conflicts. For example, you might check both your work and personal calendars for conflicts but only add new bookings to your work calendar.
Calendar sync runs automatically every 15 minutes, so events you add to Google Calendar are reflected on your booking page shortly after.
## Multi-Host Conflict Logic
When an event type has more than one host, Clarky decides which time slots to offer based on the scheduling type:
**All hosts must be free.** A single host with a conflict blocks the time slot for everyone. Use this when every host needs to attend the same meeting.
**At least one host must be free.** A time slot is only blocked if every host is busy. Use this when any teammate can take the booking.
## Disconnecting and Changing Calendar Settings
From the **Availability** tab on any event type:
* **Disconnect** the Google account entirely
* **Change which calendars** are checked for conflicts
* **Change which calendar** new bookings are added to
* **Pause sync** by toggling "add bookings to calendar"
## Troubleshooting
Check that:
* The event type is **active**
* You've configured working hours for the days you expect
* The day isn't blocked by time off or a date override
* You haven't hit the maximum bookings per day limit
* The date is within the **maximum days ahead** window
Working hours are stored in your timezone. If you set Monday 9–5 in New York, an invitee in Tokyo sees that as a different time of day, but it's still Monday on your calendar.
Double-check the timezone shown at the top of your schedule editor.
* Make sure that calendar is enabled for **conflict detection** in your connection settings
* Calendar sync runs every 15 minutes — wait a few minutes and refresh
* Check that the event isn't marked "free" in Google Calendar (free events don't block)
* Check that **add bookings to calendar** is enabled in your connection settings
* Confirm you've selected a destination calendar
* Make sure your Google connection is still authorized (re-connect if it expired)
## Next Steps
See what invitees experience
Configure meeting templates
# The Booking Flow
Source: https://docs.clarky.ai/features/booking/booking-flow
What invitees experience when they book a time on your calendar
## The Public Booking Page
Every event type has a public booking page at `/b/[event-slug]`. Share this link in emails, on your website, on social — anywhere. Invitees don't need an account to book.
The booking page walks invitees through a clean three-step flow.
## The Three Steps
A monthly calendar shows available dates highlighted. Unavailable dates — based on your working hours, time off, and existing bookings — are grayed out.
Once a date is picked, available time slots appear. Times display in the invitee's detected timezone, but they can switch to a different one if needed.
The invitee enters their name and email (required), and optionally their phone number, notes, and answers to any custom questions you've configured.
After submitting, the invitee sees a confirmation screen with the meeting details and any custom confirmation message you've written.
## What Happens After Booking
Behind the scenes, Clarky:
A booking record is created and linked to the invitee
If the host has Google Calendar connected, the event is added automatically
For Google Meet event types, a unique Meet link is created via Google
With meeting details, an ICS attachment, and reschedule/cancel links
## The Confirmation Email
Every invitee gets a confirmation email immediately after booking. It includes:
* **Meeting details** — date, time, duration, location
* **The Google Meet link** (for Google Meet event types)
* **An ICS calendar file** they can add to any calendar app
* **A reschedule link** (if rescheduling is enabled)
* **A cancel link**
The host also gets the meeting on their connected Google Calendar with the invitee added as an attendee.
For event types that **require confirmation**, the booking starts as pending. The invitee gets a confirmation email only after a workspace admin confirms it from the booking detail view.
## Rescheduling
If you've enabled rescheduling on the event type, invitees can change their meeting time without contacting you.
The invitee opens the link in their confirmation email.
They see your current availability and pick a new date and time.
The original booking is updated, your Google Calendar event is moved, and a new confirmation email is sent.
You can cap how many times a single booking can be rescheduled. Once the limit is hit, the link stops working and the invitee has to cancel and rebook instead.
## Cancellation
Either side can cancel a booking:
* **The invitee** clicks the cancel link in their confirmation email and optionally provides a reason
* **A workspace admin** opens the booking from the admin calendar and clicks cancel
When a booking is cancelled:
* The status changes to cancelled and the time slot opens back up
* The Google Calendar event is deleted (Google notifies all attendees)
* A cancellation email is sent to the invitee
* The reason is recorded in the booking history
## The Admin Calendar
Workspace admins can see, manage, and create bookings from **Booking > Calendar**.
Upcoming bookings in chronological order. Best for quickly scanning what's coming up.
A 7-day grid. Best for seeing your week at a glance.
A monthly overview. Best for spotting busy days and gaps.
Filter the calendar by status (pending, confirmed, cancelled, completed, no-show), event type, or date range.
## Managing a Booking
Click any booking to open the detail view, where admins can:
* **Confirm** a pending booking (sends the confirmation email and creates the calendar event)
* **Reschedule** to a different time
* **Cancel** with an optional reason
* **Mark as completed** after the meeting happens
* **Mark as no-show** if the invitee didn't show up
* Add **internal notes** that are only visible to your team
Marking past bookings as **completed** or **no-show** keeps your calendar tidy and improves reporting on your sales pipeline.
## Reminder Emails and Texts
If you've configured reminders on the event type, invitees automatically receive emails or SMS messages a set number of hours before their meeting.
For example, a 24-hour and 1-hour reminder schedule sends:
* An email or SMS one day before the meeting
* A second one an hour before
Reminders only go out for **confirmed** bookings. Pending bookings won't trigger reminders until they're confirmed.
## Next Steps
Book meetings inside conversations
Customize what invitees can book
# Event Types
Source: https://docs.clarky.ai/features/booking/event-types
Create the meeting templates people can book on your calendar
## What is an Event Type?
An event type is a template for a bookable meeting — for example, a 15-minute discovery call or a 60-minute strategy session. Each event type has its own duration, location, hosts, availability, and booking link.
Event types live at the workspace level, so you can share the same event type across multiple AI assistants in your workspace.
## Creating an Event Type
Open **Booking > Event Types** and click **New Event Type**.
Name, description, duration, and the URL slug for the public booking link.
Choose how the meeting will happen (Google Meet, Zoom, Teams, phone, or in-person).
Select one or more workspace members who will host this meeting.
Your event type gets a public link at `/b/[your-slug]` that you can share anywhere.
## Event Type Fields
The name appears at the top of the booking page. The description explains what the meeting is about and shows up under the name. Both are visible to invitees.
How long the meeting lasts, in minutes. Common choices: 15, 30, 45, 60. The booking page shows time slots in increments of this length.
The URL-friendly identifier used in the booking link. For example, a slug of `discovery-call` produces a link at `/b/discovery-call`. Pick something short and memorable.
Where the meeting happens:
* **Google Meet** — Clarky generates a Meet link automatically when the host has Google Calendar connected
* **Zoom** — paste your meeting link or personal Zoom room
* **Microsoft Teams** — paste your Teams meeting link
* **Phone** — Clarky shares the invitee's phone number with the host
* **In-Person** — provide the address or location details
A visual identifier shown on the admin calendar so different event types are easy to scan at a glance.
Inactive event types stop accepting new bookings and disappear from public booking pages. Existing bookings are unaffected.
## Scheduling Type
If your event type has more than one host, the **scheduling type** controls how invitees are matched to hosts:
A single host runs the meeting. The invitee books with that one person.
Bookings rotate across the host pool. A time slot is offered as long as **at least one** host is free at that time. Great for sales teams or support shifts where any teammate can take the call.
Everyone joins the same meeting. A time slot is only offered when **every** host is free. Use this for panel interviews or team intros.
A single host meets with multiple invitees in the same session. Use this for office hours, group demos, or webinars.
For round-robin, set host **priority** to control the order Clarky tries to assign bookings.
## Booking Rules
Each event type lets you control when and how often it can be booked:
The shortest amount of time between now and a bookable slot. For example, a 4-hour minimum prevents same-day last-minute bookings.
How far into the future invitees can book. A 60-day window is a common default.
Block extra time before and/or after each meeting to prevent back-to-back calls. For example, a 10-minute buffer after a 30-minute call gives you time to write notes.
Cap how many of this event type can happen in a single day. Once the limit is reached, the day disappears from the booking page.
When enabled, new bookings start as **pending** and need a workspace admin to approve them before they're confirmed. The invitee gets a confirmation email only after you confirm.
Lets invitees reschedule from the link in their confirmation email. You can also cap the number of times a single booking can be rescheduled.
## Custom Booking Questions
Beyond the standard name, email, and notes fields, you can add custom questions invitees must answer when booking. Use these to qualify leads, gather context, or collect information your team needs before the meeting.
Examples:
* "What's your company size?"
* "What problem are you trying to solve?"
* "Have you used a tool like ours before?"
Responses appear in the booking detail view alongside the meeting.
## Reminders
Set automatic reminder emails and SMS messages before each meeting. Configure how many hours before the meeting to send each reminder — for example, 24 hours and 1 hour before.
Reminders are only sent for **confirmed** bookings, not pending ones.
## Confirmation Message and Cancellation Policy
* **Confirmation message** — what the invitee sees on the success screen after booking
* **Cancellation policy** — what the invitee sees if they try to cancel
Use plain language. These are great places to set expectations like "We'll send a Google Meet link by email" or "Please cancel at least 24 hours in advance."
## Choosing Which Event Types Each Bot Offers
Event types are workspace-wide, but you can pick which ones each AI assistant offers. Open the event types list to see a chip for every assistant in your workspace next to each event type. Click a chip to toggle whether that assistant can offer that event type in chat or voice.
By default, every assistant offers every active event type. Per-assistant selection is only needed if you want to scope event types — for example, a sales assistant that only offers discovery calls and a support assistant that only offers triage sessions.
## Next Steps
Configure working hours and Google Calendar
Preview what invitees see
# In-Chat Booking
Source: https://docs.clarky.ai/features/booking/in-chat-booking
Let your AI assistant book meetings directly in chat, voice, SMS, and email conversations
## Booking Without Leaving the Conversation
Your AI assistant doesn't just answer questions — it can book meetings on your calendar in the same conversation. When a customer says "Can we hop on a call this week?", the assistant offers available times, takes their details, and confirms the booking, all without sending them to a separate booking page.
## What It Looks Like in Each Channel
The assistant detects intent to book and renders a booking widget inline in the chat. The customer picks a date, picks a time, and enters their details — right there in the chat window. Once confirmed, the assistant follows up with a friendly summary.
If you have multiple event types, the assistant first asks which one to book (or shows a picker). If only one event type is enabled, it goes straight to dates and times.
On a phone call, the assistant walks through booking conversationally:
1. Lists the available event types ("Would you like a 30-minute intro call or a 60-minute deep dive?")
2. Confirms which one to book
3. Reads off available times for the customer's preferred day
4. Confirms the time the customer picks
5. Captures their name, email, and phone
6. Books and reads back the confirmation
The customer never has to type anything — the whole booking happens by voice.
The assistant replies with a booking link plus a quick summary of the next available times. The customer taps the link to complete the booking on the public page.
For simple cases, the assistant can also book directly without redirecting the customer.
The assistant includes a booking link in its email reply, formatted with the next few available time slots. The customer clicks the link to pick a time.
## How the Assistant Decides When to Book
Your AI assistant uses your event types and availability automatically. You don't need to write special instructions for booking — when a customer expresses interest in scheduling, the assistant offers it.
You can shape the experience by:
* **Limiting which event types** an assistant offers (configure per-bot from the event types list)
* **Updating event type names and descriptions** so the assistant has clear context to share
* **Configuring custom questions** so the assistant gathers qualifying info before booking
A short, descriptive event type name like "30-min Discovery Call" works much better than something generic like "Meeting" — it gives the AI clear language to use in conversation.
## After the Booking
Once a customer books in conversation:
Sent to the customer with the meeting details
Added to the host's connected Google Calendar
The conversation continues with the assistant's confirmation
The booking is associated with the customer's contact record
## Switching Booking Providers
If you use Calendly or Cal.com instead of Clarky's built-in scheduler, your AI assistant uses those instead. Switch providers from **Booking > Settings** — see the [providers guide](/features/booking/providers) for setup.
Each AI assistant uses one booking provider at a time. The assistant's chat, voice, SMS, and email flows all use the same provider you've selected.
## Troubleshooting
* Make sure your workspace has at least one **active** event type
* Confirm the event type is enabled for that specific assistant (check the chips on the event types list)
* Verify your booking provider is set in **Booking > Settings**
Check the [Availability guide](/features/booking/availability) — usually no slots means working hours aren't set, the date is outside your max-days-ahead window, or all hosts are busy on connected calendars.
Voice booking uses a step-by-step flow. If the assistant gets stuck, the customer can usually re-state their preferred time clearly, or you can fall back to sending them the public link.
## Next Steps
Use Calendly or Cal.com instead
Configure what assistants can book
# AI Meeting Briefs
Source: https://docs.clarky.ai/features/booking/meeting-briefs
Clarky researches every guest before your meetings and delivers a prep brief with the goal, who matters, what changed, and the questions worth asking
## What are Meeting Briefs?
Turn on Meeting Briefs for an event type and Clarky prepares you for every booking automatically. Before the meeting starts, Clarky studies the guest's entire history with your workspace (contact and company records, emails, chats, notes, past meeting recordings, and their booking answers), reads their company's website, and sends the meeting host a short, skimmable brief by push notification and email.
**Plan availability:** Standard or higher. See [Plans & Billing](/features/settings/plans).
## What a brief contains
Every brief follows the same structure, written to be read on your phone a minute before the call:
* **Goal**: what you should walk out of the meeting with
* **Stakes**: why this meeting matters and what kind of conversation it is
* **Who matters**: the guest and anyone else relevant, with the context that matters right now
* **What changed**: developments since you last talked
* **Watch for**: risks, open questions, and things to handle early
* **Use this**: specific questions to ask and lines to say
* **Sources**: links that informed the brief, like the guest's LinkedIn or company site
Briefs are built only from real evidence in your CRM and the guest's public web presence. If Clarky does not know something, the section stays empty rather than guessing.
## Key Features
Contact history, conversations, notes, past meeting recordings, booking answers, and the guest's company website, gathered without lifting a finger
Arrives as a push notification and a formatted email at the lead time you choose, from 15 minutes to a day ahead
Read the brief on the booking in your calendar; after the call it appears as a Brief tab next to the meeting's notes and transcript
The meeting chat knows the brief, so afterwards you can ask whether everything you planned to cover was actually covered
## Turning briefs on
Go to **Booking, Event Types** and open the event type you want briefs for.
In the **Reminders** tab, find **AI Meeting Brief** and choose when the brief should arrive: 15 minutes, 30 minutes, 1 hour, 2 hours, or 1 day before the meeting. Choose **Off** to disable it.
Briefs go to the meeting's assigned host (or the event type's hosts). Each person can turn the push and email delivery on or off under **Notifications** with the **Meeting Brief** toggles.
## Generating a brief on demand
You do not have to wait for the automatic schedule, and briefs are not limited to event types that have them turned on. Open any booking on the calendar and click **Generate brief** in the booking details. Clarky researches the guest on the spot, usually in under a minute, and the brief appears right there. On-demand briefs are shown in place rather than sent by push or email.
## Where briefs live
* **Calendar**: open any booking on the calendar and the brief appears in the booking details once it has been generated.
* **Meeting recordings**: when a recording from your notetaker matches the booking, the recording page gains a **Brief** tab alongside Notes, Transcript, and Chat, so the plan and the outcome live together. See [Meeting Recordings](/features/booking/meeting-recordings).
* **Email**: the full brief is in the notification email, with the guest's name linked to their CRM record.
Briefs are internal prep notes for your team. They are never shown to the guest, and meeting recordings shared by public link never include the brief.
# Meeting Recordings
Source: https://docs.clarky.ai/features/booking/meeting-recordings
Clarky's built-in AI notetaker joins your meetings, records them, and writes the notes, with everything filed on your calendar and CRM
## The Clarky Notetaker
Clarky has a built-in AI notetaker. It joins your Google Meet, Zoom, and Microsoft Teams calls, records them, and writes AI meeting notes from the transcript. Every meeting lands in Clarky with the recording, the notes, and the full transcript, matched to the calendar booking it belongs to and linked to your CRM contacts by attendee email. You can ask Clarky questions about any meeting and get answers straight from what was said.
It works two ways, and you can use both at once:
* **Clarky bookings**: any confirmed booking with a video link gets recorded automatically.
* **Your Google Calendar**: connect your calendar and the notetaker joins every meeting with a video link, even ones that were never booked through Clarky. No event types or booking links required.
**Plan availability:** The Clarky Notetaker is available on Standard plans and above. Syncing a third-party notetaker (like Fellow) works on all plans. See [Plans & Billing](/features/settings/plans).
## Key Features
Works on Google Meet, Zoom, and Microsoft Teams; joins about a minute before the meeting starts
Give the notetaker a custom name and profile picture so it joins meetings as part of your team
A TL;DR, key points, decisions, and action items, plus the full speaker-by-speaker transcript
Watch or listen to the meeting right inside Clarky
Recordings attach to the right calendar booking using the attendee list and meeting time
Attendees that match CRM contacts get a meeting activity on their timeline
A built-in AI chat that answers questions from the notes and transcript
Your team is notified when a new recording arrives
## Turn It On
Go to **Settings > Meeting Recordings** in your workspace and flip on the **Clarky Notetaker**.
Two toggles control coverage: **Record Clarky bookings** and **Record Google Calendar meetings**. Calendar recording needs a connected Google Calendar (set up under **Calendar > Settings**).
Set the **notetaker name** and upload a **photo** (your company logo or a headshot). That is the identity everyone sees when it joins a meeting. Left alone, it joins as "Clarky Notetaker" with a "Clarky is recording" badge, so everyone on the call knows the meeting is being recorded.
## Control It Per Meeting
* **From the Calendar screen**: meetings from your connected Google Calendar appear alongside your bookings. Click one and use the **Record with Clarky Notetaker** switch to record or skip just that meeting, without changing your workspace default.
* **Record a meeting right now**: on **Calendar > Recordings**, click **Record a meeting**, paste any Google Meet, Zoom, or Teams link, and the notetaker joins immediately. Great for meetings on someone else's calendar.
## What Happens After a Meeting
When the meeting ends, Clarky automatically:
1. **Transcribes the recording** and writes AI notes: a TL;DR, key points, decisions, and action items.
2. **Stores the recording** so you can watch or listen to it later inside Clarky.
3. **Matches it to the booking** it belongs to, using the attendee emails and the meeting time.
4. **Links matched attendees to your CRM**, adding a meeting activity to each matching contact and company timeline.
5. **Notifies your team** (notification preferences are configurable per user under Notifications).
Notes and the transcript usually land within a few minutes of the meeting ending.
## Recordings on Your Calendar
* In the **week and month views**, bookings that have a recording show a small video icon on the event, and calendar meetings that will be recorded show one too.
* In the **list view**, recorded meetings show a Recording label.
* Opening a booking shows a **Recording** section that jumps to the notes and transcript.
## The Recordings Screen
Find every recording under **Calendar > Recordings**. The list shows when each meeting happened, how long it ran, who attended, and which booking and CRM contacts it matched.
Click any recording to open it:
* **Notes tab**: the AI-generated summary, decisions, and action items.
* **Transcript tab**: the full conversation, grouped by speaker.
* **Recording tab**: play the video or audio of the meeting. Playback keeps going when you switch to the Notes or Transcript tabs, and the video pops out into a floating picture-in-picture window so you can read along.
* **Ask about this meeting**: a chat panel that answers questions using only the notes and transcript. Try "What were the action items?", "Summarize the key decisions", or "What objections came up?"
While a meeting is still being transcribed, the Notes and Transcript tabs show a progress state and update on their own; notes usually land a couple of minutes after the meeting ends. Want the storage space back? **Delete video** (or audio) under the player permanently removes the file after a confirmation, while the notes and transcript stay.
Meeting activities are also searchable from [Ask Clarky](/features/crm/ask-clarky), so you can ask things like "when did we last meet with Acme?" from anywhere.
## Using a Third-Party Notetaker Instead
Already paying for a notetaker like [Fellow](https://fellow.app)? Clarky can sync its finished recordings instead of (or alongside) the built-in notetaker:
Under **Settings > Meeting Recordings**, the Fellow card shows a unique webhook URL for your workspace.
In Fellow, open **User settings > API, MCP & Webhooks > Webhooks**, add a webhook pointing at the URL, and subscribe it to the **AI Note Generated** event.
Copy the signing secret Fellow gives you (it starts with `whsec_`) into the Signing secret field in Clarky and save.
If both the Clarky Notetaker and a third-party notetaker cover the same meeting, you will get two copies of it. Pick one recorder per meeting source.
## Learn More
How scheduling works in Clarky
AI research on every guest before the meeting starts
Your AI assistant for CRM questions
What each plan includes
# Booking Overview
Source: https://docs.clarky.ai/features/booking/overview
Let people schedule meetings with you directly from chat, voice, email, or a public page
## What is Booking?
Booking is Clarky's built-in scheduling system. Customers can pick a time on a public booking page, get a confirmation email with a Google Meet link, and add the meeting to their calendar — all without you lifting a finger. Your AI assistant can also offer time slots and complete bookings inside chat, voice calls, SMS, and email conversations.
**Plan availability:** Available on all plans. See [Plans & Billing](/features/settings/plans).
## Key Features
A clean three-step flow: pick a date, pick a time, enter details
Connect Google Calendar to block conflicts and add bookings automatically
Auto-generated for every Google Meet event type
Configurable email and SMS reminders before each meeting
Invitees manage their own bookings from links in the confirmation email
Round-robin or collective scheduling across teammates
## Choose Your Provider
Clarky supports three booking providers. Pick the one that matches how your team already schedules:
The built-in scheduler. Includes Google Calendar sync, native event types, multi-host support, and full AI agent integration. Recommended for most workspaces.
Connect your existing Calendly account with a Personal Access Token. Your AI assistant will surface your Calendly event types in chat and email.
Connect your Cal.com account using your Cal link (for example, `yourname/30min`). Your AI assistant will offer Cal.com event types to invitees.
You can switch providers at any time from **Booking > Settings**. Switching changes which event types your AI assistant offers.
## Where Booking Happens
Customers can book a meeting from any of these entry points:
* **Public booking page** at `/b/[event-slug]` — share the link anywhere
* **Embedded widget** on your website
* **Chat** — the AI offers a date and time picker inline
* **Voice calls** — the AI walks the caller through booking conversationally
* **SMS** — the AI sends a booking link with available times
* **Email** — the AI includes a booking link in its reply
## Getting Started
Click **Booking** in your workspace navigation.
Define what meeting people can book — name, duration, location, and who hosts it.
Configure working hours and connect your Google Calendar to block real conflicts.
Send the public link, embed the widget, or let your AI assistant handle bookings in conversation.
## Learn More
Create and configure bookable meetings
Working hours, schedules, and Google Calendar
What invitees see when they book a time
Let your AI assistant book meetings inline
Use Calendly or Cal.com instead of Clarky
Manage the conversations that lead to bookings
# Booking Providers
Source: https://docs.clarky.ai/features/booking/providers
Use Clarky's built-in scheduler, or connect Calendly or Cal.com
## Choosing a Provider
Clarky supports three booking providers. Each AI assistant uses one provider at a time, set from **Booking > Settings**.
Built-in scheduler with full feature support
Connect your existing Calendly account
Connect your existing Cal.com account
## Clarky (Default)
The built-in scheduler. No extra setup — it's enabled out of the box.
**Use Clarky when you want:**
* Native Google Calendar sync and Google Meet generation
* Multi-host scheduling (round-robin, collective)
* Custom booking questions and confirmation messages
* Full integration with the AI assistant in chat, voice, SMS, and email
* Reminders and configurable buffer times
If Clarky covers your needs, stop here — you don't need to set up another provider.
## Calendly
Connect your Calendly account to use your existing event types.
Go to **Booking > Settings**.
Choose **Calendly** as your booking provider.
Sign in to Calendly and go to **Integrations > API & Webhooks**. Create a new Personal Access Token and copy it.
Treat your Personal Access Token like a password. Anyone with it can read and modify your Calendly events.
Paste the token into Clarky and save. Clarky validates the token with Calendly automatically.
Ask your AI assistant to schedule a meeting. It will offer your Calendly event types.
With Calendly selected, your AI assistant offers Calendly event types in chat and email. Calendar conflicts, working hours, and Meet links are all managed through Calendly.
## Cal.com
Connect your Cal.com account using your Cal link.
Go to **Booking > Settings**.
Choose **Cal.com** as your booking provider.
In Cal.com, your booking link looks like `cal.com/yourname/30min`. Copy the part after `cal.com/` — for example, `yourname/30min`.
Paste the link into Clarky and save.
Ask your AI assistant to schedule a meeting. It will share your Cal.com link.
## Switching Providers
You can switch booking providers any time from **Booking > Settings**. Switching changes which event types your AI assistant offers in conversation, but doesn't delete data from your other providers.
Existing bookings made through one provider stay where they are when you switch. For example, switching from Clarky to Calendly leaves your past Clarky bookings on the Clarky calendar — they aren't migrated.
## Comparing Features
All three providers work with your AI assistant. Clarky has the deepest integration — including inline booking widgets in chat — while Calendly and Cal.com surface event types and links in conversation.
Clarky supports collective and round-robin scheduling natively. Calendly and Cal.com handle their own multi-host logic on their side.
Clarky generates Meet links automatically when the host has Google Calendar connected. Calendly and Cal.com generate Meet links according to their own settings.
All three providers support custom event names, descriptions, and booking questions through their own UI.
All three providers send reminder emails. Clarky also supports SMS reminders configured per event type.
## Next Steps
Set up Clarky event types
See how the assistant uses your provider
# Documents
Source: https://docs.clarky.ai/features/context/documents
Write, edit and organize what your agent knows
## The Documents list
**Context > Documents** lists every document your agent can draw on: text you wrote, uploaded files, crawled website pages and Q\&A pairs. Use the search box, the type filter (All / Text / Files / Website / Q\&A) and the channel filter to find things. Click any column header to sort.
Each row shows:
* The title (and URL or file name), with a **Pinned** badge when it is always included
* One column per channel. A filled dot means the document is used there. **Click a dot to toggle** that channel without opening the document.
* Size, status (Ready / Processing / Error / Disabled) and when it was last updated
* A menu with Edit, Enable/Disable, Always include / Unpin, Re-index and Delete
## Writing a document
Give it a clear title, for example "What is Acme", "Refund policy", "Sales playbook".
Plain text or markdown. Write the way you would explain it to a new hire. There is no hard size limit, but a document over a few thousand characters should probably not be pinned.
Check the channels this document applies to. Voice shows a reminder that voice documents are sent in full at call start.
Turn on **Always include** for the essentials (who you are, core rules). Leave it off for reference material; the agent pulls that in only when a question calls for it.
The document is indexed in a few seconds and shows **Ready**.
## Create from website
If a website is connected, **Add > Create from website** reads all crawled pages and writes a new pinned *About \* document with the essentials (services, contact info, hours). Review and edit it afterwards; it is a starting point, not a final answer.
## Editing and managing
* **Edit** any document, including website pages and file text, by clicking its row.
* **Disable** to stop the agent using it without deleting it.
* **Delete** removes it immediately. Website pages come back on the next crawl if the page still exists.
* **Re-index** rebuilds the search index for a document (or re-scrapes a website page). Use it if a document shows **Error**.
## Status meanings
| Status | Meaning |
| ------------ | --------------------------------------------------------------------------------------- |
| Ready | Indexed and in use on its channels |
| Processing | Being converted or indexed; usually a few seconds |
| Error | Something failed (hover for details). Re-index, or edit and save. |
| Disabled | Kept but not used |
| Needs answer | A Q\&A captured from a conversation, waiting for you (see [Q\&A](/features/context/qa)) |
# Files
Source: https://docs.clarky.ai/features/context/files
Upload PDFs, Word documents, text and markdown
## Supported files
Upload **PDF**, **Word (.docx)**, **text**, **markdown**, **CSV**, **HTML** or **JSON**, up to **25 MB** each. You can select several at once or drag them onto the upload box.
Clarky converts each file to plain text and creates one document per file. The text is fully editable afterwards, so you can fix anything the conversion got wrong or trim sections you do not want the agent to use.
Scanned PDFs (images of pages with no text layer) cannot be read. Run them through OCR first, or paste the text into a document instead.
## Uploading
From **Context > Documents**.
Or click to browse. Remove any file from the list before uploading with the ×.
Applied to every file in this batch. You can change channels per document later.
Each file is converted and indexed. Files that could not be read stay in the list with the reason so you can fix and retry.
## Tips
* Long files are usually best **retrieved** (Always include off). Pinning a 40 page manual sends the whole thing with every message.
* Files checked for **Voice** count against the voice budget in full. Leave long files off Voice.
* Uploading a new version of a file creates a new document; delete the old one when you are done.
# Context
Source: https://docs.clarky.ai/features/context/overview
Everything your agent knows, organized as documents you control per channel
## What is Context?
Context is your agent's knowledge base. Everything it knows about your business is a **document**: text you write, a file you upload, a page crawled from your website, or a question-and-answer pair. Each document is assigned to the channels where it should be used (chat, voice, text, email), so you can keep a sales playbook chat-only, give voice a short script, and let email see everything.
Open it from **Context** in your agent's sidebar.
Write text, pin the essentials, choose channels
Upload PDFs, Word docs, text and markdown
Crawl your site; every page becomes a document
FAQs, plus questions your agent could not answer
## How your agent uses it
There are two ways a document reaches your agent:
Pinned documents are included in every conversation on their channels, word for word. Use them for who you are, what you sell, hours, contact details, tone, and hard rules. Keep them short; they are sent with every message. Your **About** document (created from your website when you sign up) is pinned by default.
Everything else is split into passages and searched for each incoming message. Only the passages that match the customer's question are added, so a 200 page website or a long PDF only shows up when it is useful. This keeps replies focused and fast.
**Voice is different.** Phone calls have no per-message retrieval: the whole prompt is sent to the voice provider once when the call starts. Every document checked for Voice is included in full at that moment, pinned or not, up to a **voice budget** of about 40,000 characters. The budget exists mostly for latency; a bigger prompt means a longer pause before each spoken reply. Website pages are never used on Voice. See [Settings](/features/context/settings#voice-budget).
## Channels
Every document has four checkboxes: **Chat**, **Voice**, **Text**, **Email**. A document is only used on the channels you check. Defaults:
| Source | Default channels |
| --------------------------- | ----------------------------- |
| Text you write, files, Q\&A | All four |
| Website pages | Chat, Text, Email (Voice off) |
Turn a channel off to keep a document without using it there. Turn every channel off (or disable the document) to park it without deleting it.
## What replaced the old Knowledge screen
If you used Clarky before Context, the mapping is:
* **General knowledge** became a pinned document called *About \*, on all channels.
* **Chat / Voice / Text / Email knowledge** boxes each became a pinned *\ instructions* document on that one channel.
* **Website pages** are now regular documents you can search, edit, disable, or assign to channels one at a time.
* **Files** and **Q\&A** are real now.
Nothing was lost; open Context and you will see all of it as documents.
## Best practices
A short pinned About document plus longer retrieved documents beats one giant pinned wall of text. It is cheaper, faster, and answers are more precise.
"Refund policy", "Pricing 2026", "Sales playbook" retrieve better than a single mixed document, and they are easier to keep current.
Check **Context > Q\&A** now and then. Every question your agent could not answer is waiting there; answering it teaches the agent immediately.
**Context > Settings > Test retrieval** shows exactly which documents your agent would use for any question you type.
# Q&A
Source: https://docs.clarky.ai/features/context/qa
FAQs, and the questions your agent could not answer
## Two kinds of Q\&A
**Context > Q\&A** holds question-and-answer pairs. Some you write yourself (FAQs); some your agent brings you.
## Questions it could not answer
Whenever a customer asks a business question on chat, voice, text or email and your agent does not have the answer, the question is captured and added to Q\&A as **Needs an answer**. Each card shows the question (cleaned up into FAQ form), when and on which channel it was asked, how many times it has come up, and a link to the conversation.
Pending questions are listed first. The sidebar shows how many are waiting.
Short and direct works best. Press **Save answer** (or Cmd/Ctrl + Enter).
The pair goes live immediately on all channels. The next time a similar question comes up, your agent answers it.
Not a real question, or not something you want to answer? Click × to dismiss it. If it is asked again it will reappear with a higher count.
Questions are captured only when the agent lacked the information. Greetings, small talk, questions it did answer, requests to talk to a human and off-topic questions are ignored.
## Adding your own FAQs
**Add Q\&A** lets you write a question and its answer directly. Q\&A pairs are matched by question, so phrase them the way customers actually ask. Like any document they have channels and can be pinned, disabled or deleted.
# Context Settings
Source: https://docs.clarky.ai/features/context/settings
Tune retrieval, watch the voice budget, and test what your agent would use
## Retrieval
Documents that are not pinned are split into passages. For every incoming message the closest passages are added to the prompt.
* **Relevance threshold** (0 to 100%): how close a passage has to be to count. Lower finds more, higher is stricter. Around 30% works well for most sites.
* **Passages per message** (1 to 20): how many passages can be added. More gives more coverage and costs a little more per reply.
## Voice budget
Phone calls have no per-message retrieval. Everything checked for **Voice** is sent to the voice provider in full when a call starts, so on voice every document behaves like a pinned one. The budget (about 40,000 characters) keeps that prompt small, mostly for latency: a bigger prompt means a longer pause before each spoken reply, and a higher cost per minute.
The meter on this page (and on the Documents screen) shows how much of the budget your voice documents use. If you go over, the oldest documents are cut off on calls. Website pages never count; they are not used on voice.
## Test retrieval
Type a question a customer might ask and pick a channel. Clarky shows:
* **Always included**: the pinned documents that go with every message on that channel
* **Retrieved for this question**: the documents whose passages cleared the threshold, with a match score and the matched passage
If nothing is retrieved, lower the threshold or add a document that covers the topic. On a real conversation the same question would land in [Q\&A](/features/context/qa) as unanswered.
# Websites
Source: https://docs.clarky.ai/features/context/websites
Crawl your site so every page becomes a document your agent can use
## Connecting a website
When you create an agent from a domain, Clarky crawls the site right away. If your agent has no website yet, **Context > Websites** shows a box to connect one: enter the domain and Clarky starts the first crawl.
We follow links on your domain (up to 250 pages), keep the readable text of each page and drop navigation, images, scripts and forms.
## Pages are documents
Every crawled page shows up in **Context > Websites** (and in Documents under the Website filter) as its own document with the page title and URL. You can:
* **Search** pages by title or URL
* **Edit** the captured text (re-crawling replaces it)
* **Toggle channels** per page, or **Apply channels to all pages** from the site card
* **Disable** individual pages, or use the **Use website pages** switch to turn the whole site off and on
* **Re-scrape page** from a row's menu to refresh just that page
* **Remove** a page (it returns on the next crawl if it still exists)
Website pages default to Chat, Text and Email. Voice is off for pages: voice prompts are fixed at call start, so a whole site cannot be included. Put the essentials in a text document instead.
## Re-crawling
Click **Re-crawl** on the site card whenever your website changes. Pages that still exist are refreshed in place and keep the channels and settings you chose; pages that disappeared from your site are removed when the crawl finishes. Your existing knowledge stays live while the crawl runs.
Re-crawls are limited to once every 6 hours and are available on paid plans.
## Create a document from the website
**Documents > Add > Create from website** summarizes all crawled pages into a new pinned *About \* document. Useful right after a crawl or a big site update.
See how pages fit alongside text, files and Q\&A
# Activity Logging
Source: https://docs.clarky.ai/features/crm/activity
Log notes, calls, meetings, and tasks against contacts and companies
## What is Activity Logging?
Activity logging lets you keep a running record of every interaction you have with a contact or company. Use it to capture notes from a phone call, log a meeting you just wrapped up, schedule a follow-up task, or backdate something you forgot to record at the time.
Every activity you log shows up on the relevant timelines and in the workspace-wide activity feed, so your whole team has shared context on what's happening with each customer.
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
The same activity dialog works across contacts, companies, and the workspace feed
Set explicit dates and times so logs reflect when the activity actually happened
Log a single meeting or call against several contacts at once
Add due dates to keep upcoming follow-ups visible
## Where You Can Log Activity
There are three places to log activity, and they all share the same dialog and the same activity-type menu.
Open any contact and click **Add** at the top of the timeline. The contact you opened is automatically attached to the activity and locked in, so it can't be removed by accident.
Use this when the activity belongs clearly to one specific person.
Go to **CRM > Activity** to see the full workspace feed. Click **Add**, choose a type, and search for one or more contacts to tag.
Use this when you're catching up at the end of the day, logging a meeting that involved several people, or you don't want to navigate to a specific contact first.
Open any company and click **Add** on the timeline. You can log activity directly against the company, optionally tagging contacts who were involved.
Use this for things that are about the account as a whole, like a renewal conversation or a pricing review.
No matter which entry point you use, the **Add** button works the same way: pick a type from the dropdown, fill out the dialog, and save.
## Choosing an Activity Type
Clicking **Add** opens a dropdown of activity types. Picking a type sets the icon, label, and which extra fields show up in the dialog.
The supported types are:
A general written note. Use this for quick observations, internal context, or anything that doesn't fit a more specific type.
A phone call. The dialog shows a duration field so you can record how long the call lasted.
An in-person or video meeting. Like calls, meetings include a duration field.
A scheduled video conference. Includes a duration field.
Something you need to do. Tasks show a due date field so the work stays visible until it's complete.
A lightweight reminder for yourself or your team, with an optional due date.
A scheduled prompt to follow up at a specific time. Includes a due date field.
Pick the type that best matches what happened. The right type makes your timeline easier to scan and means the dialog only asks for the fields that matter.
## Filling Out the Dialog
Choose from the dropdown. The dialog opens preconfigured for that type.
The title is what shows up on the timeline at a glance. The description is where you capture the details.
By default, this is set to right now. Change it to log something that already happened, or to schedule something for the future.
For tasks, to-dos, and reminders, set a due date so the work stays on your radar.
For calls, meetings, and video calls, enter how long it lasted in minutes.
Search the workspace by name, email, or company, and select everyone involved. You must select at least one contact.
The activity appears on every relevant timeline and in the workspace feed.
## Activity Timestamps and Backdating
Every activity has its own date and time, separate from when you actually clicked **Save**. That means you can:
* Log a call you forgot to record yesterday
* Schedule a future follow-up so it shows up on the timeline at the right time
* Capture a meeting that happened last week with the correct date
Timelines and the workspace feed sort by the activity's own timestamp, not by when it was created. Backdated and future-dated activities slot into the right place automatically.
## Tagging Multiple Contacts
When you log activity from the workspace activity feed, you can tag more than one contact in a single entry. This is the right pattern for things like:
* A group sales call with two stakeholders
* A meeting where several people from the same account showed up
* A shared note that's relevant to a few different leads
### How Multi-Contact Activities Appear
Even though the activity is linked to multiple contacts, it shows up as **one event** in the workspace activity feed. The card shows contact badges for everyone tagged.
If you tag more than three contacts, the card shows the first few badges followed by a `+N more` indicator so the feed stays clean.
On individual contact and company timelines, multi-contact activities still appear normally — each tagged contact sees the activity on their own timeline.
## Field Rules at a Glance
Only for call, meeting, and video-call style activities. Other types don't display it.
Only for task, to-do, and reminder style activities.
From the contact timeline, the contact is filled in for you. From the workspace activity feed, you must tag at least one contact. From a company timeline, contacts are optional — you can log against the company alone.
Yes. From the workspace activity feed, you can tag any combination of contacts across the whole workspace.
## Editing Activities
The shared activity dialog is currently focused on creating new activities. Full in-dialog editing of existing activities is not yet available.
What you can do today:
* **Edit a description** on any existing activity through the contact timeline.
* **Re-open** existing activities to view details.
What's not yet supported:
* Changing the activity type, timestamp, due date, duration, or tagged contacts after the activity has been saved.
If you need to change something that isn't editable yet, the simplest workaround is to delete the activity and log a new one with the corrected details.
## Tips for Clean Activity History
"Pricing call — agreed on annual plan" beats "Call".
If you log activity later, set the timestamp to when it happened.
Pick the task type with a due date instead of a plain note.
For multi-stakeholder meetings, tag every contact so it shows up on each timeline.
## Next Steps
Back to the CRM overview
# Ask Clarky
Source: https://docs.clarky.ai/features/crm/ask-clarky
Chat with your CRM in natural language to find data and take action
## What is Ask Clarky?
Ask Clarky is an AI-powered chat interface built directly into your CRM. Instead of clicking through filters and tables to find what you need, you can simply ask. Ask Clarky understands your contacts, companies, pipeline, conversations, activities, and analytics, and can also take action on your behalf.
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
Find contacts, companies, and deals by describing what you want
Get pipeline summaries and KPIs without building a report
Send emails, send texts, move pipeline cards, log activities
Pick up where you left off in any past conversation
Prefer texting? On Standard plans and up you can reach Ask Clarky over iMessage, RCS, or SMS, and even book meetings from a group chat. See [Text Clarky](/features/crm/text-clarky).
## Where to find it
Clarky lives inside [Team Chat](/features/team-chat/overview) as a pinned conversation at the top of your **Direct messages**. Chat is the default screen after you log in, so Clarky is always one click away.
Click **Chat** in the sidebar (or just log in, Chat is the landing screen). **Clarky** is pinned at the top of the Direct messages group.
Type a question in the composer, or pick one of the starter prompts.
Want Clarky in a group conversation? Mention **@Clarky** in any Team Chat channel and it answers right there, visible to the whole room. See [Team Chat](/features/team-chat/overview).
Access to Ask Clarky requires the same CRM permission as the rest of the CRM. If you can view the CRM, you can use Ask Clarky.
## Starter prompts
Not sure what to ask? Open the starter prompts from the button in the composer to see a menu of ready-made questions, and pick one to send it.
You can also save your own custom prompts. They appear alongside the built-in ones, so the questions you ask every week are always one click away. Custom prompts are personal to you, not shared with the workspace.
## Things you can ask
Ask Clarky works best when you describe what you want in plain language. Here are examples grouped by what you're trying to do.
Find contacts, companies, conversations, and pipeline cards.
* "Show me all contacts that attended the AI workshop"
* "Which companies are in the SaaS industry?"
* "Find contacts in the Proposal stage with deal value over \$5,000"
* "Who did I add to the CRM this month?"
* "Look up Tyler Clark's contact details"
* "Show me recent conversations about pricing"
* "Find all pipeline cards in the Negotiation stage"
Ask for counts, totals, and pipeline summaries.
* "Give me a pipeline summary"
* "How many deals have been closed this year?"
* "What's the total value of deals in the Qualified stage?"
* "How many new contacts did we get last week?"
* "How many bookings happened this month?"
* "How many form submissions came in this quarter?"
* "Who should I follow up with this week?"
Ask Clarky to do something. You'll always confirm before it runs.
* "Send an email to Tyler Clark thanking him for the meeting"
* "Send a text to Sarah letting her know I'm running 5 minutes late"
* "Move the Acme Corp deal to the Closed Won stage"
* "Log a call activity on Jordan's contact with a note that we discussed pricing"
* "Email everyone in the Proposal stage with a follow-up"
You don't need to know exact tag names, stage names, or lead source labels. Ask Clarky already has your workspace's metadata in context, so phrases like "the AI workshop tag" or "the Proposal stage" map to the right values automatically.
## How results are displayed
Ask Clarky doesn't just dump text at you. Each kind of result is rendered with a purpose-built UI so you can scan and click through to the underlying records.
When you search for people or companies, results render as a clean table with name, email, company, and pipeline stage. Each row is a clickable link that takes you straight to the contact or company detail page.
Pipeline questions return a horizontal funnel showing each stage, how many cards are in it, and the total deal value at that stage.
Counts and totals (new contacts, deals, bookings, form submissions, activities) display as large stat cards so the number is easy to read at a glance.
Conversation results show the contact, channel, and a preview of the latest message. Activity results show the type (note, call, meeting, task), date, and details.
When Ask Clarky completes a write action, you get a clear success or error confirmation with the details of what happened, so there's no ambiguity about whether the email actually went out or the card actually moved.
While Ask Clarky is working, you'll see a small "Using..." indicator in the chat so you know what it's doing behind the scenes.
## Confirming write actions
Anything that changes data or sends a message requires your explicit go-ahead before it runs. This applies to:
* Sending an email
* Sending a text message (SMS)
* Moving a pipeline card
* Creating an activity (note, call, meeting, task)
Ask Clarky will describe exactly what it's about to do, including the recipient, message content, or destination stage, and wait for you to confirm. Nothing is sent or changed until you say so.
A typical flow looks like this:
"Send Tyler an email saying thanks for the call yesterday."
Ask Clarky responds with the recipient, subject, and body it plans to send.
Reply with "send it" to proceed, or ask for edits like "make it shorter" or "add a P.S. about next steps."
Once it runs, a success badge appears in the chat with the action details.
## Chat history
Every conversation with Ask Clarky is saved automatically, so you can return to past sessions any time.
Start a fresh conversation from a clean slate. Your previous chat is saved automatically.
Open the History popover to browse and reopen any past conversation.
Both buttons live in the top-right corner of the Clarky conversation. Past sessions are sorted with the most recent first, and each one is titled based on your opening message so you can find the right thread at a glance.
Chat history is private to you. Other workspace members can use Ask Clarky too, but they only see their own past conversations.
## Tips for great results
"Show me contacts in the Proposal stage with deal value over \$10,000" is more useful than "show me good leads."
Phrases like "this week," "last month," or "this quarter" are interpreted automatically. You don't need to spell out date ranges.
Ask a broad question, then narrow it. "Show me contacts from the AI workshop" then "of those, who hasn't been contacted in 30 days?" works just like a normal conversation.
"Find everyone in the Qualified stage and send each of them a follow-up email" is a valid request. Ask Clarky will preview the action before sending.
## Next steps
Back to the full CRM feature overview
# Companies
Source: https://docs.clarky.ai/features/crm/companies
Track and organize the companies behind your contacts
## What is the Companies section?
The Companies section groups your contacts by the organizations they belong to. Use it to see every contact at a given company, the total deal value tied to that company, and a unified activity timeline across all of their people.
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
Contacts are linked to companies based on their email domain
See the total deal value across every contact at a company
A single activity feed for everyone at the company
Track companies through your sales pipeline
## How companies are created
When a contact is added with a business email address, Clarky checks for an existing company matching that domain. If one exists, the contact is linked to it. If not, a new company record is created using the email domain.
Use the **New Company** button on the Companies page to create a company directly. You can fill in the name, website domain, industry, size, tags, and notes.
## The Companies list
Each row shows:
* **Name** — the company name
* **Domain** — the website / email domain used for matching
* **Industry** and **Size** — populated when known
* **Contacts** — how many people from this company are in your CRM
* **Total Deal Value** — sum of deal values across all contacts at the company
* **Pipeline Stage** — the stage assigned to the company itself
* **Last Activity** — most recent interaction with anyone at the company
You can search by name or domain, filter by columns, and sort by any field. Click a row to open the company detail view.
## Company detail page
Opening a company shows everything in one place:
Name, domain, industry, size, total deal value, pipeline stage, and tags.
Every contact linked to this company. Click through to any individual contact for their full profile.
A unified feed of activities across all contacts at the company. Add notes, calls, meetings, and tasks directly to the company record.
Move the company through your pipeline and watch the aggregated deal value update.
Logging an activity from the company timeline lets you tag one or more contacts at that company in a single entry — useful for meetings or calls with multiple stakeholders.
## Tips
Auto-grouping uses the email domain to match contacts. If a company has multiple domains (e.g., acme.com and acme-corp.com), you may end up with two separate company records. Merge them manually if needed.
Add tags like `enterprise`, `partner`, or `prospect` to group companies in custom ways beyond industry and size.
For account-based sales, use the company pipeline stage to track named accounts independently of individual contacts moving through their own stages.
## Next steps
Back to the CRM overview
Manage individual contacts
Log activities and view the unified feed
Track deals through your pipeline
# Contact Management
Source: https://docs.clarky.ai/features/crm/contact-management
Advanced contact management features
## Linking Conversations to Contacts
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
### Automatic Linking
Conversations are automatically linked to contacts when:
* Contact's email or phone matches
* Agent identifies them during conversation
* User is logged into their account
### Manual Linking
Link conversations manually:
View the conversation in your inbox.
Find the button in the conversation sidebar.
Select existing contact or create new one.
Conversation is linked and appears in contact's history.
## Contact Enrichment
Clarky can automatically enrich contact data:
* Company information
* Social media profiles
* Professional details
* Public data sources
Enable in **Settings > CRM > Data Enrichment**.
## Duplicate Management
Clarky automatically:
* Detects potential duplicates
* Suggests merges
* Prevents duplicate creation
Review and merge duplicates in **CRM > Duplicates**.
## Exporting Contacts
Export contact data:
* CSV format
* Excel spreadsheets
* vCard format
* Custom field selection
Use for:
* Backup purposes
* Migration to other systems
* Email marketing lists
* Reporting and analysis
## Integration with Conversations
When viewing a contact:
* Click to start new conversation
* See suggested responses based on history
* View sentiment trends
* Access all prior interactions
Return to CRM overview
# Contact Management
Source: https://docs.clarky.ai/features/crm/contacts
Organize and manage your customer contacts
## Table View
The Contacts Table provides a comprehensive view of all your contacts with sortable columns and powerful filtering.
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
### Search, Filters, and Saved Searches
One search bar covers names, emails, phone numbers, and companies, and results update as you type. Stack filter chips (tags, pipeline stage, source, and more) to narrow the list, and click any column header to sort.
Once you have a search and filter combination you like, save it:
Enter a search and apply any filters.
Open the saved searches menu and give it a name.
Keep the search personal, or share it so everyone in the workspace can use the same view.
### Bulk Actions and CSV Export
Selections survive pagination, so you can check contacts across multiple pages and act on all of them at once:
* **Add to list**: put the whole selection on a list for a campaign or a sequence
* **Export CSV**: download your selection, or the entire filtered result set, as a spreadsheet-ready CSV
The contact and company detail pages autosave as you type. There is no save button to forget.
### Contact Information
Each contact record includes:
Contact's full name
Email address
Phone number
Current pipeline stage (Lead, Qualified, Proposal, etc.)
Estimated deal value
Date of most recent interaction
How they found you (chat, voice, referral, etc.)
## Adding Contacts
### Automatic Creation
Contacts are created automatically when:
* Customer provides name and contact info in chat
* Phone call is completed
* SMS conversation includes identification
* Email is received from new address
### Manual Creation
Add contacts manually:
Button in the top-right of CRM view.
Enter name, email, phone, and any other details.
Place them in the appropriate stage.
Contact is immediately available in your CRM.
### Importing Contacts
Import existing contacts from:
* CSV files
* Other CRM systems
* Email contact lists
* Spreadsheets
Tick **Validate emails after import** in the import options to check every new address with [Email Validation](/features/crm/email-validation). The list arrives pre-badged, and Sequences will skip anything undeliverable. Each contact record also has a **Validate email** action for one-off checks.
### Business Card Scanner
Turn a paper business card into a contact in seconds:
In **CRM > People**, choose **Scan Card**.
Use your phone camera or upload an image of the card.
AI reads the card and prefills the name, title, company, email, and phone. Fix anything that needs it and save.
Great for conferences: scan a stack of cards from your phone and they all land in your CRM, ready for a follow-up sequence.
New contacts automatically inherit tags and address details from their company, so records created by hand, by scan, or by the AI stay consistent.
## Contact Details
Click any contact to see their detailed profile:
### Information Tab
* Full contact details
* Custom fields
* Tags and categories
* Creation date and source
### Conversations Tab
See all interactions:
* Complete conversation history
* Across all channels
* Searchable and filterable
* Linked to original conversations
### Activity Timeline
Chronological view of all activities:
* Conversations
* Status changes
* Notes added
* Emails sent
* Calls made
### Notes and Tasks
* Internal notes (not visible to contact)
* Assigned tasks and follow-ups
* Important dates and reminders
## Calling and Texting Contacts
### Click-to-Call
Tap any phone number on a contact record to place the call. Clarky logs a call activity on the contact's timeline automatically, so your history stays complete without manual notes.
### Phone Line Types
Clarky detects whether each number is a **mobile**, **landline**, or **VoIP** line and shows it next to the number. Use it to know who can receive texts before you send an SMS or launch a texting sequence.
## Organizing Contacts
### Tags
Apply custom tags to categorize contacts:
* **VIP**: High-value customers
* **Follow-up**: Needs attention
* **Interested**: Showed interest
* **Custom**: Create your own
Tags autocomplete from the vocabulary already used in your workspace, so the same tag never ends up spelled three different ways.
### Custom Fields
Add custom fields for your business needs:
* Industry
* Company size
* Budget
* Specific preferences
* Any data you track
## Next Steps
Move contacts through your sales process
# Email Validation
Source: https://docs.clarky.ai/features/crm/email-validation
Verify email deliverability with ZeroBounce so Sequences skip addresses that would bounce and your sender reputation stays protected
## What is Email Validation?
Email Validation checks whether an address can actually receive mail before you spend a send on it. Clarky verifies addresses with ZeroBounce, an industry-standard email verification service, and shows the result as a small status pill wherever emails appear: the People page, contact records, and Prospecting search results. Most importantly, **Sequences automatically skip addresses that fail validation**, so a stale contact list cannot burn your sender reputation with bounces.
**Plan availability:** Startup or higher. Email Validation is pay as you go: any paid plan can buy validation credits, and there is no subscription add-on. See [Plans & Billing](/features/settings/plans).
## How credits work
Email Validation runs on **validation credits**, purchased in **Settings > Email Validation**. One credit validates one address.
Pick a one-time pack of 1,000, 5,000, or 25,000 validations. Credits never expire and are shared by everyone in the workspace. Payment goes through Stripe on the card you already use for Clarky.
A credit is used only when an address is checked for the first time. Results are kept for 90 days, so re-validating the same address anywhere in Clarky during that window is free: launching a second sequence at the same list, re-importing a CSV, or viewing badges costs nothing.
Nothing breaks. Validation quietly pauses, badges stop appearing for new addresses, and emails send without a deliverability check, exactly as they did before this feature existed. Buy credits any time to switch protection back on.
## What the statuses mean
| Badge | Meaning |
| --------------------------- | --------------------------------------------------------------------------------------------------------------- |
| valid | The mailbox exists and accepts mail. Safe to send. |
| invalid | The address failed validation (dead mailbox, spam trap, or known complainer). Sequences skip it automatically. |
| catch-all | The mail server accepts everything, so delivery cannot be confirmed. Sends proceed, flagged for your awareness. |
| unverified | Deliverability could not be determined. Sends proceed. |
## Where validation shows up
The launch preview warns how many target emails are undeliverable, and the dispatcher skips them at send time. A contact stopped for a bad address shows an "Invalid email" status on the sequence detail page. Validation is on per sequence by default; the **Email validation** switch on the launch page's Sender section turns it off for that sequence.
The People table shows a status pill next to each contact's primary email, so you can spot unreachable contacts at a glance.
Every email on a contact record carries its badge, plus a **Validate email** action for an instant on-demand check.
Search results are validated in the background, so you know which prospects have a working email before you save them or launch outreach.
## Validating on CSV import
When importing contacts, tick **Validate emails after import** in the import options. Every new address in the file is checked in the background once the import finishes, so the list is fully badged before you launch a sequence at it.
Go to **Settings > Email Validation** and pick a pack. Credits never expire.
New addresses from imports (with the checkbox on), prospecting searches, and sequence launches are validated automatically.
The sequence launch preview shows how many addresses will be skipped, and the rest go out clean.
Validation protects the thing that is hardest to rebuild: your sending domain's reputation. If you run cold outreach from a warmed-up domain, validating a list before the first send is the cheapest insurance you can buy.
# MCP Server
Source: https://docs.clarky.ai/features/crm/mcp-server
Connect Claude, Codex, and other AI tools directly to your Clarky CRM
Clarky's MCP server lets AI tools you already use, like Claude and Codex, work with your CRM directly. Ask Claude about your pipeline, look up contacts, check analytics, or prepare an email draft without leaving your AI tool. It is the same brain as [Ask Clarky](/features/crm/ask-clarky), available everywhere MCP is supported.
Clarky implements the newest MCP specification (the 2026-07-28 revision) and remains backwards compatible with clients on earlier versions of the protocol.
**Plan availability:** Standard or higher (included with API Access). See [Plans & Billing](/features/settings/plans).
## What your AI tools can do
Once connected, your AI tool has live access to this workspace's CRM:
* **Contacts and companies**: search, filter by tags or lead source, and pull full contact details
* **Pipeline**: stage summaries, deal values, and moving cards between stages
* **Analytics**: contact counts, deal totals, conversations, bookings, and form submissions over any date range
* **Bookings and meetings**: upcoming and past meetings
* **Conversations and activities**: chat, email, text, and voice history plus logged notes, calls, and tasks
* **Drafts**: prepare email, text, and sequence drafts to review and send inside Clarky
AI tools can never send emails or texts through the MCP connection. Drafts always come back to Clarky, where you review and click Send yourself.
## Connect Claude (claude.ai and Claude Desktop)
In Claude, open Settings, then Connectors, and choose Add custom connector. Paste your server URL: `https://clarky.ai/api/mcp`
Claude opens a Clarky sign-in page. Log in with your normal Clarky account and pick the workspace you want to connect.
Review the requested access and click Allow. Claude can now use your CRM in any conversation.
## Connect Claude Code
Run this in your terminal:
```bash theme={null}
claude mcp add --transport http clarky https://clarky.ai/api/mcp
```
Then run `/mcp` inside Claude Code to sign in to Clarky.
## Connect Codex
```bash theme={null}
codex mcp add clarky https://clarky.ai/api/mcp
```
## Connect with an API key instead
For headless or shared setups where a sign-in flow is inconvenient, use a workspace API key as the bearer token. Create one in Settings under MCP Server, then:
```bash theme={null}
claude mcp add --transport http clarky https://clarky.ai/api/mcp --header "Authorization: Bearer ck_live_..."
```
Read-only keys are a good fit for shared or automated setups: the AI can look things up but cannot change pipeline stages or log activities.
## Managing connections
The MCP Server section in Settings shows every AI tool connected to your workspace, who connected it, and when it was last used. Disconnect any of them at any time; the tool will need to sign in again to regain access. API keys are managed separately in the API Keys section.
Access also ends automatically when a user is removed from the workspace.
## Tips for better answers
* Ask your AI tool to call `get-crm-context` first when a question mentions tags, pipeline stages, or lead sources by an approximate name. It returns the exact values in your workspace.
* If your workspace has more than one agent, mention which agent's CRM you mean, or ask for `list-agents` to see the options.
# CRM Overview
Source: https://docs.clarky.ai/features/crm/overview
Built-in customer relationship management for your AI agent
## What is the Clarky CRM?
Clarky includes a built-in CRM to track contacts, companies, deals, and activity, all automatically populated from your agent conversations. The CRM lives under **CRM** in the sidebar, and each part of your sales workflow (Activity, People, Companies, Lists, Sequences, Pipeline, Forms) appears as its own sidebar sub-section while you are in the CRM.
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
## CRM Sections
A unified feed of every interaction across your workspace
Individual contact records with full conversation history
Group contacts by the organizations they belong to
Visual kanban pipeline with drag-and-drop stages
Multi-touch outbound campaigns drafted by AI per contact
Capture leads with traditional forms or surveys
Chat with an AI that has tool access to your CRM
## Key Features
### Automatic Contact Creation
When customers provide their information during a conversation, Clarky automatically:
1. Creates a contact record
2. Captures name, email, and phone
3. Links the conversation history
4. Adds them to the appropriate pipeline stage
5. Groups them under a company based on email domain
### Unified Customer View
See everything about a contact in one place:
* Contact information and tags
* All conversation history across chat, voice, text, and email
* Pipeline stage and deal value
* Custom notes and activity timeline
* Form submissions and bookings
### Ask Clarky
Use natural language to query your CRM. Ask things like:
* "Show me all contacts that attended the AI workshop"
* "How many deals have closed this year?"
* "Who should I follow up with this week?"
Clarky returns clickable tables, pipeline summaries, and analytics cards inline. It can also take actions like sending an email, sending an SMS, or moving a pipeline card — always with a confirmation step before executing.
## Getting Started
Click **CRM** in the main navigation.
Contacts created from conversations appear in **People** automatically.
Open **Pipeline** and set up stages that match your sales process.
Build a form or survey to capture leads from your website.
Open **Ask Clarky** and ask anything about your CRM data.
## CRM Benefits
Contacts and companies are created automatically from conversations, forms, and bookings — no manual input needed.
See the full conversation history, activity timeline, and form submissions when following up with any contact.
Track deals at both the contact level and the company level through visual kanban stages.
Ask Clarky lets anyone on your team query the CRM without learning filters or building reports.
## Next Steps
See the unified activity feed
Open the People section
Group contacts by company
Set up your sales pipeline
Send a multi-touch outbound campaign
Capture leads from your website
Chat with your CRM data
# Prospecting
Source: https://docs.clarky.ai/features/crm/prospecting
Find new people to sell to by title, seniority, industry, company, and location, then save them straight into People and your lists
## What is Prospecting?
Prospecting is a people search built into the CRM. Describe who you want to reach (a title, a seniority level, an industry, a company size, a location) and Clarky searches People Data Labs, a database of hundreds of millions of professional profiles, for matches. Every result comes with name, current title, company, location, LinkedIn profile, and any work email or mobile phone on file. Save the ones you like into **People** with one click, optionally straight into a **List**, and they are ready for a Sequence.
Prospecting lives under **CRM > Prospecting**.
**Plan availability:** Startup or higher. Prospecting is pay as you go: any paid plan can buy prospect credits, and there is no subscription add-on. See [Plans & Billing](/features/settings/plans).
## How credits work
Prospecting runs on **prospect credits**. One credit reveals one person. The price of every search is shown on the button before you click it, so there are no surprises.
Click **Buy credits** for a one-time pack of 100, 500, or 2,000 credits. Credits never expire and are shared by everyone in the workspace. Payment goes through Stripe on the card you already use for Clarky.
Plans do not currently include monthly prospect credits; if a plan ever does, they are used before purchased credits and the balance pill shows both.
A credit is used for each person a search reveals, whether or not you save them. Everything after that is free: browsing people you already revealed (the **Prospects** tab), saving them to People, adding them to lists, and running Sequences against them. Clarky also skips people your workspace already holds, so re-running a search brings you new people instead of charging you twice for the same ones.
Start with **10 people per search** while you tune your filters, then move to 25 or 50 once results look right. The **Has work email** filter is on by default so every credit buys someone you can actually contact; switch it off if you are researching rather than reaching out.
## Running a search
In a hurry? Type a sentence into **Describe who you want** at the top of the filters ("owners of roofing companies in Tampa with an email") and click **Fill filters**. Clarky fills in the chips for you, free of charge; review them, then press Search.
Use the filter pane on the left. Every filter accepts several values (they are OR'd within a filter, AND'd across filters):
* **Job title**: free text, matched loosely ("head of sales" also finds "Head of Sales, North America"). Suggestions appear as you type.
* **Seniority**: C-level, Owner, Partner, VP, Director, Manager, Senior, Entry.
* **Department**: Sales, Marketing, Engineering, Operations, Finance, and so on.
* **Company**, **Company keyword** (a word that should appear in the company name, like "roofing"), **Company website**, **Industry**, **Company size**.
* **Country**, **State / region**, **City**, and **Skills**.
* **Has work email** and **Has mobile phone** toggles.
Choose 10, 25, or 50 people per search. The Search button shows exactly how many credits it will use.
Results appear in the table with name, title, company (with industry and size), location, email, and phone. Click the LinkedIn icon next to a name to open the profile. **Show more** at the bottom reveals the next page for the same price per person. With [Email Validation](/features/crm/email-validation) credits in the workspace, emails are checked in the background and a red **invalid** or amber **catch-all** pill appears next to addresses that may not be reachable.
Tick the people you want and click **Save to CRM**. Choose no list, an existing list, or type a name to create a new list on the spot. Clarky creates the contacts (and their companies), tags them `prospect`, and links anyone who was already in your CRM instead of duplicating them.
## Example: owners of small roofing companies in Texas
1. **Industry**: Construction
2. **Job title**: owner, roofing, president
3. **Seniority**: Owner, C-level
4. **Company size**: 1-10, 11-50
5. **Country**: United States, **State / region**: Texas
6. Leave **Has work email** on
The title list is what narrows a broad industry like Construction down to roofers; the seniority and size filters keep you on owner-operators rather than staff at large firms.
## Ask Clarky and MCP
You can prospect from Ask Clarky too: "Find me 10 roofing companies in Tampa" runs the same search, shows the people in the chat, and offers to save them or add them to a list. Ten people means ten credits, so Ask Clarky defaults to 10 and only goes higher when you name a number. If the workspace has no credits it tells you where to buy them. The same `find-prospects` and `save-prospects` tools are available to Claude, Codex, and other AI tools through the [MCP server](/features/crm/mcp-server) on a write-scoped connection.
## The Prospects tab
Everyone you have ever revealed lives in **Prospects**, free to browse and search. Come back later, tick a few, and save them, or open a saved person's contact record with the **In CRM** link.
## Saved contacts
Prospects saved into People arrive with:
* First and last name, title, company, LinkedIn URL, and location
* Work email and mobile phone when People Data Labs has them
* Lead source **prospecting** and the tag **prospect**, so you can filter or build saved searches on them
* A linked Company record (created if it did not exist, matched by website or name if it did)
If a contact with the same email or LinkedIn URL already exists, Clarky links to that record and fills in any blank fields rather than creating a duplicate.
## FAQ
Either fewer people match your filters, or you had fewer credits left than the page size. The result bar shows how many people match in total.
Yes, lists are capped at 1,000 contacts like everywhere else in the CRM. If a save would overflow a list, Clarky adds as many as fit and tells you how many did not.
People Data Labs, which aggregates public professional profiles and business contact data. Coverage is strongest for people with an established professional footprint online.
Empty searches are free: credits are only used for people actually revealed.
# Sales Pipeline
Source: https://docs.clarky.ai/features/crm/sales-pipeline
Visual pipeline for tracking deals and opportunities
## Pipeline View
The Sales Pipeline provides a Kanban-style board for visually tracking deals through your sales process.
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
## Default Pipeline Stages
Clarky includes these default stages:
Initial contact, early qualification phase
Confirmed fit, moving to proposal
Quote or proposal sent
Discussing terms and pricing
Deal completed successfully
Deal didn't close
## Customizing Stages
Modify stages to match your sales process:
1. Go to **CRM > Pipeline Settings**
2. Add, remove, or rename stages
3. Set stage colors
4. Define stage criteria
## Moving Contacts
### Drag and Drop
Simply drag contact cards between stages to update their status.
### Manual Update
Click a contact and change their stage manually in the details view.
### Automated Movement
Set up rules to automatically move contacts:
* After certain conversation topics
* Based on time in stage
* When specific actions occur
## Deal Tracking
Each contact card shows:
* Contact name
* Deal value
* Time in current stage
* Last interaction date
* Quick action buttons
## Pipeline Metrics
View key metrics at the top:
* **Total Pipeline Value**: Sum of all open deals
* **Conversion Rate**: Percentage moving through stages
* **Average Deal Size**: Typical deal value
* **Average Sales Cycle**: Time from lead to close
## Next Steps
Learn more about contact management
# Sequences
Source: https://docs.clarky.ai/features/crm/sequences
Multi-touch outbound campaigns drafted per contact by AI, then approved one-by-one before sending
## What is a Sequence?
A Sequence is a multi-step outbound campaign that reaches a list of contacts across email, SMS, and voice. Sequences come in two flavors: **AI-personalized**, where Clarky drafts every message for every contact from your goal and the contact's profile and you approve each one before it sends, and **fully authored**, where you write each step yourself with merge fields and skip the review queue entirely.
Sequences live under **CRM > Sequences** and pair with **Lists** for selecting recipients.
**Plan availability:** Pro or higher. See [Plans & Billing](/features/settings/plans).
## How a Sequence Works
Open **CRM > Lists**, build a list of contacts (or pick an existing one), then click **Generate Sequences**. You can also start a sequence from a single contact's detail page.
Define the goal ("Book a 15-minute intro call", "Re-engage", etc.), pick a tone, and lay out the steps — each step is a touch on email, SMS, or voice scheduled some number of days after the start.
Click **Generate drafts**. Clarky drafts each message for each contact in your list — so a 5-step sequence with 50 contacts produces 250 personalized drafts.
Walk the queue of contacts and approve, edit, or skip each draft per step. The sequence won't start sending until you approve the contacts you want included.
Configure the sender (your name and from-email), pick a start time, and launch. From that moment the cron schedules and sends each step on its assigned day in the contact's local timezone.
## Compose
The compose page is where you describe the sequence and lay out the steps.
### Goal
A short paragraph telling Clarky what the sequence is meant to accomplish. The clearer the goal, the more on-target each draft will be. Built-in starter prompts for common goals:
* **Book a meeting** — short hook + clear ask for time
* **Start a reply** — single specific question, no meeting ask
* **Re-engage** — fresh angle for a contact who went quiet
* **Renew** — customer-success toned renewal conversation
### Tone
Pick how the message should sound: **formal**, **warm**, **direct**, or **playful**. Drafts adopt the tone you choose.
### Steps (the timeline)
Each step is one touch on a specific channel, sent N days after the start. The middle column shows the timeline; click a step to open its details on the right:
* **Channel** — Email, Text, or Call
* **Name** — internal label (e.g. "Nice to meet you", "Quick call", "Breakup")
* **Send on day** — 0 means start day; 3 means three days after start
* **Send window** — local-time hours when this step is allowed to send
* **AI instructions** — extra guidance for this specific step (e.g. "Lead with a recent product announcement, ≤90 words")
Add or remove steps with the **Add step** button. Three steps spaced over a week is a good starting cadence; five over two weeks for a longer nurture.
### Save as template
Once you've shaped a sequence, save it as a template so the next launch is one click. Templates capture the goal, tone, and step blueprints — see [My Templates](#my-templates) below.
## Fully Authored Sequences
Prefer to control every word? Build a **fully authored** template instead of an AI-personalized one:
* Write the subject and body of each step yourself, once
* Personalize with merge fields such as `{{first_name|there}}`, where the part after the `|` is the fallback when a contact is missing that field
* No AI drafting, no per-contact review queue: launches are instant and auto-approve is on by default
* Every contact receives the same message with their own fields substituted
Fully authored templates are ideal for compliance-sensitive messaging, short transactional touches, and any campaign where the copy is already settled.
### Pre-launch preview
Before a launch generates or sends anything, Clarky shows a preview count: how many contacts on the list are **eligible**, how many are **already enrolled**, and how many are **suppressed**. AI-personalized launches also show an estimated drafting cost, so there are no surprises.
With [Email Validation](/features/crm/email-validation) credits in the workspace, the preview also reports how many target addresses are **undeliverable**. Those contacts are skipped automatically at send time and marked "Invalid email" on the sequence detail page, protecting your sender reputation from bounces.
## Review
When you click **Generate drafts**, Clarky writes each step for each contact and routes you to the review screen.
### Stepper + queue
The review screen has step tabs across the top (Step 1, Step 2, …) and a queue of contacts on the left. You can:
* Click a step tab to switch to that step (your selected contact stays the same)
* Click a contact in the queue to switch to that contact's draft
* Edit the day this step fires inline (next to the contact name) without going back to compose
### Approve / Skip / Edit
For each draft you can:
* **Approve** — locks the draft for this contact + step. Approved steps will send when the sequence launches.
* **Skip step** — skips just this contact for just this step. Other steps for the same contact still send.
* **Edit** — open the draft for in-place editing of subject, body, etc. Save before approving.
* **Customize with AI** *(coming soon)* — ask the model to rewrite the draft based on a short instruction.
The progress bar at the top shows total approved / total drafts.
## Launch
The launch screen confirms what's about to ship.
### Sender
* **From name** — overrides the bot's default outbound name for this sequence
* **From email** — a local part (e.g. `tyler`) plus a dropdown of every verified sending domain on your account
* **Sending domains** — select more than one verified domain and Clarky rotates enrollments across them to spread volume. Each contact is pinned to a single domain for the life of the sequence so threading and replies stay consistent
* **Reply-to and BCC** — set a custom reply-to address and BCC list for this sequence without changing your agent's global email settings
### When should it start?
* **Start now** — first messages queue immediately within each contact's send window
* **Schedule** — pick a specific date and time for the first touch
### Send rules
* **Respect each contact's timezone** — interpret send windows in the contact's local time, not yours
* **Only send during business hours (9a–5p)** — pause overnight sends and resume in the morning
* **Skip weekends** — Saturday/Sunday sends roll to Monday
Click **Launch sequence** and the cron takes over from there.
## Lists
Lists are reusable groups of contacts that you target with a sequence. Create them under **CRM > Lists**:
* **Static lists** — manually pick contacts, or bulk-add from a CSV import or a filtered People view
* **Member count** — visible on the list index so you know the size before you launch
* **Archive** — hide old lists from the picker without deleting them
Launch a sequence from a list with one click — every active member gets enrolled.
## Suppressions
Compliance is handled automatically. The **Suppressions** page (under CRM) shows every email/phone that's opted out, and the cron skips them everywhere.
Three sources fill the suppression list:
* **Unsubscribe link** — every outbound sequence email includes a one-click unsubscribe footer (RFC 8058 List-Unsubscribe header included)
* **STOP / UNSUBSCRIBE replies on SMS** — the Twilio STOP keyword is honored automatically
* **Manual entries** — paste an email or phone in the manual-add row
Suppressions can be scoped to a specific channel (email-only, SMS-only) or applied to all channels.
### SMS Consent
Text steps only send to contacts who have opted in to SMS. When a step is blocked because consent is missing, the step shows the reason and a **Record consent** action: capture how the contact opted in (verbal, form, written) and retry the step on the spot. Consent is stored on the contact so future sequences do not hit the same block.
## Trigger From Your Backend (API)
If your team operates from another system — a custom CRM, a marketing automation tool, your own form handler — you can start a sequence for a single contact via a public API call. This is the fastest way to wire **form-submitted-now-call-them-back** automations.
In one request, Clarky will:
* **Upsert the contact** (matched by primary email, falling back to phone). Notes from the request are appended to the contact's record so they survive across calls.
* **Generate a bespoke sequence** from one of your saved templates — emails are written for that specific recipient, in their language, referencing real context from the notes you sent.
* **Optionally launch immediately** — with `auto_approve: true`, the first step (call or email) fires within seconds of generation completing, no human review required. Use this for trusted automation pipelines.
* **Notify your admins** when `auto_approve: false` — the sequence is generated, parked in the review queue, and an email goes out to your workspace admins with a link to approve.
Templates encode which channels are allowed (email, voice, SMS), so you don't pick channels in the request — choose a template that uses the channels you want.
Use this for **inbound lead automation**: a prospect submits your contact form, your backend POSTs to `/api/v1/sequences/start` with the lead's details and a few notes ("Spanish speaker, asked about enterprise pricing"), and Clarky calls them within \~60 seconds in their native language.
See the full reference at [API Reference > Sequences](/api-reference/sequences).
## My Templates
Reusable recipes that save you time on the next launch. Templates capture the goal, tone, allowed channels, and step blueprints.
* Save any sequence as a template from the compose page
* Templates show up under **CRM > Sequences > My Templates** and inside the "Start a sequence" picker
* The picker also includes built-in starter templates (Founder-led outbound, Event handoff, Renewal runway, etc.) — those don't appear in My Templates because they're stock recipes
## Send Windows & Timezones
Sequence sends respect a few layers of guard rails:
* **Email** — never gated by quiet hours; sends during the per-step send window
* **SMS** — TCPA-compliant 8 AM – 9 PM local time
* **Voice** — Mon–Fri 9 AM – 6 PM local time (typical professional hours)
"Local time" is the contact's timezone. New contacts inherit the workspace timezone by default; you can override per contact from the contact detail page.
## Stop on Reply
When **Stop on reply** is enabled (default), an inbound reply from the contact halts the sequence for that enrollment so you don't keep emailing someone who's already responding. Replies thread back into the original conversation in the Inbox.
## Frequently Asked
The contact's enrollment shows a red badge with the reason. Click **Retry for this contact** to re-run just that contact's drafts, or **Regenerate all** to restart the whole batch.
Yes — the day editor is available on every step card from the review page (and the sequence detail page after launch). Pulling a step earlier is allowed even on running sequences. Editing message content requires pausing the enrollment first.
Yes. Each step card has a **Send now** button that pulls the schedule forward and tells the cron to send on the next tick. The 4-hour per-contact throttle is bypassed for manual sends.
No. Outbound sequence emails set proper `In-Reply-To` and `References` headers so replies thread into the same conversation. The Inbox uses Message-ID, References, and a sender-fallback to match replies to the right thread.
Yes — open the sequence detail page and click **Cancel sequence**. Every pending step is skipped immediately. The sequence record stays around for the audit trail.
## Next Steps
Back to the CRM hub
See every sequence send in the unified activity feed
Included with Pro or higher
How outbound email works behind the scenes
# Text Clarky
Source: https://docs.clarky.ai/features/crm/text-clarky
Text your CRM over iMessage, RCS, or SMS: ask questions, draft messages, and book meetings from a group chat
## What is Text Clarky?
Text Clarky puts [Ask Clarky](/features/crm/ask-clarky) in your Messages app. Text the Clarky number like you would a coworker and get answers about your contacts, companies, pipeline, meetings, and analytics, or have Clarky draft emails and texts that you approve with a single reply. You can even add Clarky to a group chat with a guest and let it find a time and book the meeting.
Clarky replies over iMessage when the recipient supports it, falling back to RCS and then SMS automatically, all on the same number. There is no app to install.
**Plan availability:** Standard or higher. See [Plans & Billing](/features/settings/plans).
The same CRM knowledge as Ask Clarky, from your phone
Add Clarky to a group text and it schedules the meeting for you
Drafted emails, texts, and bookings only go out after you approve
In group chats Clarky sticks to scheduling and never shares CRM data
## Getting Started
Clarky recognizes you by your phone number. Add it in either place:
* Click your avatar in the sidebar, choose **Edit Profile**, and enter your phone number. This applies to every workspace you belong to.
* Or have a workspace admin set it under **Settings, then Users**, using **Edit User** on your row.
A phone number can only belong to one Clarky account. If yours is already claimed by another account, you'll see an error when saving.
Open **Ask Clarky** in your CRM. The greeting shows the number you can text. Save it as a contact so it's easy to reach.
Text anything you'd ask in the web app: "How many deals closed this month?", "Catch me up on Rafael", "Who should I follow up with this week?"
## What You Can Do
Text Clarky can answer the same questions and take the same actions as Ask Clarky in the web app:
* Search contacts and companies, and pull up anyone's details and history
* Summarize your pipeline, analytics, and running sequences
* List today's or this week's meetings
* Draft an email or text to a contact, then send it after you reply YES
* Log notes, calls, and meetings
* Check availability, share your booking link, and book meetings
Replies are kept short and text-friendly. For big result sets, Clarky gives you the count and highlights instead of a wall of messages.
## Confirming Actions with YES or NO
Anything that sends or books is prepared as a draft first. Clarky texts you a recap and waits:
* Reply **YES** to send the email or text, or confirm the booking
* Reply **NO** to cancel
* Reply with anything else and the draft is discarded, so a stray "yes" later can never fire an old draft
Only you (the workspace admin) can approve emails and texts. Drafts also expire on their own after 30 minutes.
## Booking Meetings in a Group Chat
The fastest way to schedule with someone: start a group text that includes your guest and the Clarky number, then ask Clarky to find a time.
Create a group text with your guest (or guests) and the Clarky number, and say something like "Clarky, help us find 30 minutes next week."
Clarky checks your real availability, proposes two or three open slots, and shares your booking page link so the guest can also browse on their own.
When a time works, Clarky collects the guest's name and email, recaps the booking, and books it after a YES. The guest gets a confirmation email with the calendar invite, and it lands on your calendar like any other booking.
Group chats are strictly for scheduling. Clarky will not share contact records, pipeline data, or anything else from your CRM in a thread that includes guests.
Clarky can only reply to threads that message it first, so always start the group chat yourself and include the Clarky number from the beginning.
## Troubleshooting
Make sure your phone number is saved on your profile (avatar menu, then Edit Profile) and that your workspace is on the Standard plan or higher. If you text from a number Clarky doesn't recognize, it replies with instructions instead of answers.
Texts route to your default workspace. Switch your default workspace in the app to change where your texts go.
That's intentional. Group chats with guests are scheduling-only so your CRM data stays private. Text Clarky directly (1:1) for everything else.
Drafts expire after 30 minutes, and replying with anything other than YES or NO discards them. Just ask Clarky to draft it again.
# Dashboard Overview
Source: https://docs.clarky.ai/features/dashboard/overview
Monitor your AI agent's performance at a glance
## What is the Dashboard?
The Dashboard is your central hub for monitoring your AI agent's performance. Get real-time insights into conversations, key metrics, and overall agent effectiveness. With the Clarky 2 redesign, the Dashboard (along with Ask Clarky, Inbox, CRM, Calendar, Context, and Settings) is always one click away in the sidebar.
## Key Sections
View essential performance indicators
Dive deep into conversation data
Quick access to latest interactions
See who's currently chatting
## Accessing the Dashboard
Navigate to the Dashboard from any page:
From the workspace, choose the agent you want to monitor.
The Dashboard is usually the default landing page for each agent.
Scroll through to see all available insights.
## Dashboard Layout
### Top Overview Cards
The dashboard displays key metrics prominently at the top:
* **Total Conversations**: Count of all conversations in the selected time period
* **Average Response Time**: How quickly your agent responds
* **Resolution Rate**: Percentage of conversations resolved without human help
* **Active Now**: Number of users currently in conversation
### Conversation Timeline
Visual representation of conversation volume over time:
* See peaks and valleys in customer inquiries
* Identify busy times of day
* Plan staffing accordingly
* Track growth trends
### Channel Breakdown
View performance by channel:
* Number of chat conversations
* Average chat duration
* Most common questions
* User satisfaction ratings
* Total calls received
* Average call duration
* Call resolution rate
* Missed calls
* Text messages exchanged
* Response time
* Opt-out rate
* Popular topics
* Emails processed
* Response time
* Escalation rate
* Customer replies
## Time Range Selection
Filter data by different time periods:
* **Today**: Real-time data for the current day
* **Yesterday**: Previous day's performance
* **Last 7 Days**: Week-over-week trends
* **Last 30 Days**: Monthly overview
* **Last 90 Days**: Quarterly analysis
* **Custom Range**: Select specific dates
The time range selector affects all metrics and charts on the dashboard.
## Quick Actions
Access common tasks directly from the dashboard:
Jump to the full inbox to see all conversations
Quickly add to what your agent knows
Modify agent configuration
Access your CRM contacts
## Recent Activity Feed
See latest interactions:
* New conversations started
* Messages sent by the agent
* Human takeovers
* Escalations
* Completed conversations
Each activity item shows:
* **Timestamp**: When it occurred
* **Channel**: Where it happened (chat, voice, text, email)
* **Quick Preview**: Snippet of the conversation
* **Status**: Active, completed, or needs attention
Click any activity to view the full conversation.
## Performance Indicators
Visual indicators help you quickly assess performance:
### Status Indicators
* 🟢 **Green**: Everything operating normally
* 🟡 **Yellow**: Minor issues or areas needing attention
* 🔴 **Red**: Critical issues requiring immediate action
### Trend Arrows
* ↗️ **Up Arrow**: Metric increasing compared to previous period
* ↘️ **Down Arrow**: Metric decreasing
* → **Flat Arrow**: No significant change
## Notifications
The dashboard displays important notifications:
Conversations waiting for human takeover.
Questions the agent could not answer, waiting in Context > Q\&A.
Integration issues, payment problems, or configuration warnings.
Achievements like "1000th conversation" or high satisfaction ratings.
## Best Practices
Make the dashboard part of your daily routine to stay on top of agent performance.
Pay attention to trends over time rather than day-to-day fluctuations.
When you notice patterns (busy times, common questions), adjust your agent or staffing.
Look at performance across channels to see which are most effective for your business.
Track specific metrics relevant to your business goals (e.g., lead capture rate, resolution time).
## Customizing Your Dashboard
While the default dashboard layout works for most users, you can customize:
* Which metrics appear at the top
* Time range defaults
* Notification preferences
* Data refresh frequency
Customize your dashboard experience
## Mobile Access
Access your dashboard on mobile:
* Responsive design works on any device
* Mobile app provides optimized view
* Real-time notifications on your phone
* Quick actions available
Download the Clarky mobile app
## Exporting Data
Export dashboard data for reports:
* Download as CSV or Excel
* Schedule automated reports
* Share with stakeholders
* Integrate with BI tools
Data exports respect your selected time range and filters.
## Next Steps
Explore individual performance metrics
Deep dive into analytics
Review conversations
Enhance your agent's knowledge
# Embedding Forms
Source: https://docs.clarky.ai/features/forms/embedding
Embed forms on your website and pre-fill values with query parameters
## Sharing and Embedding Options
Every Clarky form has a public URL and a ready-to-paste iframe embed. You can use whichever is most convenient:
Share a direct link to the hosted form on `clarky.ai/f/[form-id]`.
Drop a snippet of HTML onto your own website to embed the form inline.
## The Public Form URL
Every form has a public, shareable URL of the form:
```
https://clarky.ai/f/[form-id]
```
You can find the URL and copy it from the form's view/preview page. It works in any browser and automatically renders the right experience based on the form's style — traditional or survey.
The public URL is great for sharing on social media, in emails, or in QR codes. No technical setup required.
### Short links and custom domains
Give the form a **URL slug** in Form Settings and the link becomes `https://clarky.ai/f/onboarding` instead of a long ID. On Pro and higher you can also serve the form from a domain you own, so the same form lives at `forms.yourcompany.com/onboarding`. The view page has a host selector that switches the public link and every embed snippet below between `clarky.ai` and your live custom domains.
Add your domain, set slugs, and brand each domain with a favicon and social preview image.
## Iframe Embed Code
The form editor's view page includes copy-paste embed code for both styles. Pick the snippet that matches your form.
Traditional forms work well at a fixed height inside an existing page layout:
```html theme={null}
```
The `?embed=true` flag adjusts the form for in-page embedding (no extra padding around the edges).
Surveys are full-screen experiences and need room to breathe. Give the iframe full width and a generous minimum height:
```html theme={null}
```
Replace `[form-id]` with the actual form ID. The form's view page already shows the snippet with the correct ID filled in — copy directly from there.
## Pre-Filling Values via Query Parameters
You can pre-populate any field by passing its ID as a query parameter on the form URL. This is incredibly useful for things like:
* Linking from a marketing email and pre-filling the recipient's name and email
* Tracking the source of a lead by pre-filling a custom "source" field
* Personalizing forms based on what a user clicked to get there
### Example
```
https://clarky.ai/f/[form-id]?first_name=John&emails=john@example.com
```
In this example, the **First name** and **Email** fields will be filled in with "John" and "[john@example.com](mailto:john@example.com)" before the user even sees the form.
### Standard Field IDs
Use these IDs for standard contact fields:
| Field | Query parameter |
| -------------- | --------------- |
| First name | `first_name` |
| Last name | `last_name` |
| Email | `emails` |
| Phone | `phone_numbers` |
| Company | `company` |
| Job title | `job_title` |
| Address line 1 | `address_line1` |
| Address line 2 | `address_line2` |
| City | `city` |
| State | `state` |
| Postal code | `postal_code` |
| Country | `country` |
### Custom Field IDs
Each custom field also has a unique ID (visible in the form editor). Pass that ID as a query parameter the same way:
```
https://clarky.ai/f/[form-id]?cf_referral_code=PROMO2025
```
Pre-filling works with both traditional and survey forms. On surveys, pre-filled answers appear when the user reaches the matching question.
## Common Embedding Patterns
Build the form URL dynamically in your email tool:
```
https://clarky.ai/f/[form-id]?first_name={{contact.first_name}}&emails={{contact.email}}
```
When recipients click through, their info is pre-filled — they only have to fill in what's missing.
Add a hidden custom field for "lead source" and pass it via query string from each landing page or campaign:
```
https://clarky.ai/f/[form-id]?cf_source=homepage-hero
```
Now every submission tells you exactly where the lead came from.
Drop the iframe snippet inside any landing page, blog post, or marketing site. The embedded form picks up the same submission flow as the public URL — contacts, pipeline stages, tags, and notifications all behave identically.
The public form URL works perfectly in QR codes for printed materials, business cards, or in-store signage. Surveys are especially good here because the full-screen experience feels native on mobile.
## Next Steps
See how your embedded form's responses are tracked
Build a standard form
Build a one-question-at-a-time experience
Back to the Forms overview
# Forms Overview
Source: https://docs.clarky.ai/features/forms/overview
Capture leads and survey responses with traditional and survey-style forms
## What are Forms?
Forms let you collect leads, gather feedback, and capture survey responses directly into your Clarky CRM. Every submission becomes a contact (or updates an existing one) and can automatically land on a pipeline stage with default tags applied.
Clarky offers two distinct form styles, so you can pick the experience that fits your audience and use case.
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
Standard multi-field forms with all questions visible at once
Typeform-style, one-question-at-a-time experience with keyboard shortcuts
Embed forms on your site and pre-fill values via query params
View, export, and manage submitted responses
## The Two Form Styles
A familiar, single-page form with all fields visible at the same time. Best for:
* Contact forms and lead capture
* Job applications
* Anything where users want to scan all the fields before answering
* Forms embedded inside an existing page layout
Traditional forms support standard contact fields (name, email, phone, address, company, job title) plus custom fields you define yourself.
A full-screen, one-question-at-a-time experience inspired by Typeform. Best for:
* Quizzes and questionnaires
* Multi-step lead qualification
* Feedback or NPS-style surveys
* High-engagement experiences where you want focus on one question
Survey forms include a progress bar, keyboard shortcuts, auto-advance, and seven question types including a powerful nested form-fields question.
## What Happens on Submission
Required fields, email formats, and phone numbers (10+ digits) are validated.
Clarky dedupes by email and phone. New contacts are created automatically; existing ones are updated.
If the form has a default pipeline stage, the contact lands there with any default deal value and tags applied.
The full submission is saved to the form's submissions table for review and export.
Team members receive an email summary with all submitted answers.
The submitter sees your custom success message, or is redirected to a URL you configure.
## Form Defaults
Each form can be configured with defaults that apply to every new contact it creates:
Choose the stage where new contacts will land. Useful for routing form leads directly into a "New Lead" or "Inbound" stage.
Pre-populate a deal value on the pipeline card. Helpful when a specific form (like a "Request a Quote" page) corresponds to a known average deal size.
Apply tags automatically to new contacts. Great for tracking lead source ("webinar-signup", "homepage-form", etc.).
Customize the submit button label.
Show a custom thank-you message or send users to any URL after they submit.
## Getting Started
Navigate to **CRM > Forms** in your workspace.
Click **New Form** and pick a name and description.
Switch between **Traditional** and **Survey** at the top of the editor.
Add standard fields, custom fields, or survey questions.
Set a pipeline stage, default tags, and your success message.
Copy the embed code or share the public form URL.
You can preview any form before publishing. Test submissions are flagged with an internal badge in the submissions table so they don't pollute your real data.
## Next Steps
Standard fields and custom field types
Question types, shortcuts, and auto-advance
Iframe code and pre-fill via URL
Export to JSON or CSV
# Form Submissions
Source: https://docs.clarky.ai/features/forms/submissions
View, manage, and export form responses
## The Submissions Table
Every form has its own submissions page where you can review every response that's come in. Open it from the form editor or from **CRM > Forms**, then click the **Submissions** link on the form you want to review.
The submissions table shows all responses with sortable columns, an internal/test badge, quick links to the contact record, and an export menu.
## What's in the Table
### Standard Columns
Every submissions table includes these columns by default:
* **Submitted** — date and time of the submission
* **Contact name** — name of the contact created or updated
* **Email** — email captured from the submission
* **Phone** — phone number captured from the submission
### Response Columns
The remaining columns depend on the form's style:
A column for each custom field on the form. Standard contact fields populate the existing name/email/phone columns.
A column for each question. Form fields questions are automatically expanded — each standard or custom field inside a form fields question becomes its own column, so you can see all the data at a glance instead of a single nested blob.
### Internal Submission Badge
Submissions made through the **preview** in the form editor are tagged with an **Internal** badge in the table. This makes it easy to identify test data and keep it separate from real responses.
Filter or visually scan for the Internal badge when you're reviewing real lead activity. Test submissions never trigger external automations like notifications.
## Actions on Each Submission
For each row in the submissions table you can:
Jump straight to the contact's record in the CRM to see their full history
Remove a submission you no longer want to keep
Deleting a submission removes the response record but doesn't remove the contact it created. Use the CRM if you also want to delete the contact.
## Exporting Submissions
The submissions page has an **Export** dropdown with two formats:
Downloads all submissions as a JSON array, formatted for readability. Use this when you want a structured, machine-readable snapshot of all responses.
Downloads all submissions as a CSV file that opens cleanly in Excel, Numbers, or Google Sheets. Use this for spreadsheet analysis or sharing with non-technical teammates.
Both formats include:
* Submitted date and time
* Contact name, email, and phone
* The internal/test flag
* Every response column, including form fields expanded into individual fields
## Contact Creation Behavior
Every submission either creates a new contact or updates an existing one:
Clarky checks the submission's email and phone against existing contacts.
If a match is found, the existing contact is updated with any new info from the submission. If not, a brand-new contact is created.
For new contacts, the form's default tags are added.
If the form has a default pipeline stage, a pipeline card is created (with the default deal value, if set).
Updates only add or refresh information — they don't overwrite tags or pipeline stages on contacts that already exist. This protects long-term contacts from being reset every time they fill out a form.
## Email Notifications
When notifications are enabled for a form, your team gets an email every time someone submits. The email includes:
* The form name and submitter's contact info
* All submitted answers with proper formatting
* Each question and answer pair on its own line for easy scanning
* Form fields questions broken out field-by-field (no nested blobs)
Make sure each form's notifications are routed to the right team. A "Contact Sales" form should notify your sales team; a "Customer Feedback" form might notify support.
## Pipeline Cards from Submissions
If you set a **default pipeline stage** on the form, every new contact created from a submission will automatically appear as a card on that stage in your sales pipeline.
The card includes:
* Contact name
* Default deal value (if configured)
* Default tags (if configured)
* A link back to the contact and the original submission
This is the fastest path from "lead form on website" to "card in your pipeline" — no manual data entry required.
## Next Steps
See how form submissions land on your pipeline
Work with the contacts your forms create
Get more responses by embedding on your site
Back to the Forms overview
# Survey Forms
Source: https://docs.clarky.ai/features/forms/survey
Build Typeform-style, one-question-at-a-time experiences with keyboard shortcuts and auto-advance
## What is a Survey Form?
A survey form presents one question at a time in a full-screen, focused experience. It's modeled after Typeform: progress bar at the top, big readable text, smooth keyboard navigation, and auto-advance on single-choice questions. Survey forms are great for quizzes, lead qualification flows, onboarding questionnaires, and feedback surveys.
## Building a Survey
Go to **CRM > Forms** and click **New Form**.
At the top of the editor, switch to the **Survey** tab.
Use the **Add Question** dropdown to add any of the seven question types.
Drag or use up/down arrows to reorder. Edit each question's text, subtitle, choices, and required setting.
Set the pipeline stage, default tags, and success message.
Save the form, then embed it or share the public link.
## Editor View Modes
The survey editor has two view modes you can toggle between:
Edit one question at a time, just like respondents will see it. This is the default view and is best for fine-tuning copy and choice wording.
See all questions at once in a stacked layout. Best for reordering, adding, or removing questions quickly.
Your view mode preference is remembered between sessions.
## Question Types
Radio-style selection. Auto-advances after the user picks an option.
Checkbox-style. User picks any number of options and clicks **OK** to continue.
Single-line text input.
Multi-line textarea for longer responses.
Validated email field.
Validated phone field (10+ digits).
Embed a full traditional form (multiple fields) inside a single survey question.
### Single Choice
Single choice questions show a list of options. The user picks one, and the survey automatically advances to the next question.
* Up to **8 choices** per question
* Each choice gets an **auto-assigned letter shortcut** (A through H)
* Smart Yes/No detection: if your choices are exactly "Yes" and "No", the shortcuts switch to **Y** and **N** for a more natural experience
### Multiple Choice
Use multiple choice when respondents can pick more than one option:
* Selected items show a checkmark
* The hint "Choose as many as you like" appears below
* The user clicks **OK** (or presses Enter) to advance — there's no auto-advance
* Letter shortcuts (A-H) toggle each choice on or off
### Text, Long Text, Email, Phone
Text-based questions show a clean underlined input field. Email and phone fields are validated automatically — invalid entries can't proceed.
## Auto-Advance
When a respondent picks a single-choice option, Clarky automatically moves them to the next question:
The choice is saved as soon as the user clicks or presses its shortcut key.
The options visually lock for 700ms so the user can see what they picked and avoid accidental double-taps.
The survey transitions to the next question automatically.
Auto-advance only applies to **single choice** questions. Text, multiple choice, and form-fields questions all wait for the user to confirm before advancing.
## Keyboard Shortcuts
The survey experience is fully keyboard-navigable. This is one of the biggest reasons respondents enjoy survey-style forms — they can blast through them quickly.
| Key | Action |
| -------------- | ----------------------------------------------------- |
| **A** – **H** | Select a choice by its letter shortcut |
| **Y** / **N** | Select Yes or No (on auto-detected Yes/No questions) |
| **Enter** | Advance to the next question, or submit on the last |
| **Arrow Up** | Go back to the previous question |
| **Arrow Down** | Advance to the next question (if the answer is valid) |
Letter shortcuts work for both single choice and multiple choice questions. On multiple choice, pressing the shortcut toggles that option on or off.
### Smart Yes/No Shortcuts
If a question has exactly two choices labeled "Yes" and "No" (case-insensitive), the shortcuts automatically switch from A/B to **Y**/**N**. This is much more intuitive for binary questions and overrides any letter shortcuts that would otherwise apply.
## The Form Fields Question Type
The **form fields** question type is unique to survey forms — it lets you embed a full traditional-style form into a single survey slide. Instead of asking one question, you ask several at once, all on the same screen.
### When to Use Form Fields
Form fields questions are perfect for:
* Capturing all contact info (name, email, phone, company) at the end of a survey
* Collecting an address as a group of fields
* Any moment in a survey where breaking up multiple short fields into separate slides would feel tedious
### What You Can Add
Inside a form fields question, you have access to the same fields available in traditional forms:
All standard contact fields, including first name, last name, email, phone, company, job title, and the full address fields. These map directly to the contact record on submission.
All six custom field types: text, textarea, dropdown, radio, checkbox, and checkbox group. Each can be marked required and reordered independently.
### Configuring a Form Fields Question
From the **Add Question** dropdown, choose **Form Fields**.
Use the standard-fields dropdown to add any of the built-in contact fields. Only fields you haven't added yet appear in the dropdown.
Use the custom-fields dropdown to add new custom fields by type. Set the label, placeholder, options (if applicable), and required toggle for each.
Use up/down arrows to put fields in the right order.
Toggle the required switch for each field individually. The question-level required setting doesn't apply here.
On a form fields question, **required is set per field**, not on the question as a whole. This gives you fine-grained control over which inputs are mandatory.
## Survey-Wide Settings
Just like traditional forms, survey forms support form-level defaults:
* **Submit button text** (shown on the final question)
* **Success message** displayed after submission
* **Redirect URL** to send respondents elsewhere after submitting
* **Pipeline stage** for new contacts
* **Default deal value** and **default tags**
## Previewing Your Survey
The form editor includes a live survey preview so you can experience the survey exactly as a respondent will, including keyboard shortcuts and auto-advance. Test submissions are flagged with an internal badge in the submissions table.
Run through your survey on a phone before publishing. Surveys are mobile-first and look great on small screens, but it's worth confirming each question reads well before you ship.
## Next Steps
Iframe code and pre-fill via query parameters
Standard multi-field forms
View and export survey responses
Back to the Forms overview
# Traditional Forms
Source: https://docs.clarky.ai/features/forms/traditional
Build standard multi-field forms with standard and custom fields
## What is a Traditional Form?
A traditional form shows all of its fields on a single page, exactly the way you'd expect a typical web form to behave. Visitors can scan every field, fill them out in any order, and submit when they're ready.
Traditional forms are ideal for contact forms, lead capture, applications, or anywhere you want a familiar, scannable layout.
## Building a Traditional Form
Go to **CRM > Forms** and click **New Form**.
At the top of the editor, make sure the **Traditional** tab is selected.
Pick from Clarky's pre-built contact fields (these map directly to your CRM).
Define any additional fields your form needs.
Set a pipeline stage, default tags, success message, and optional redirect URL.
Save the form and copy the embed code or share the public link.
## Standard Fields
Standard fields are pre-built fields that map directly to contact records in your CRM. Because they're standardized, the values flow into the right place automatically.
* **First name**
* **Last name**
* **Email** — validated for proper email format
* **Phone** — validated for at least 10 digits
* **Company**
* **Job title**
* **Address line 1**
* **Address line 2**
* **City**
* **State**
* **Postal code**
* **Country**
For each standard field you can:
* Customize the **label** and **placeholder**
* Toggle whether it's **required**
* Reorder it relative to other fields
Always include either an email or phone field on lead-capture forms. Clarky uses these to dedupe contacts, so without them every submission creates a brand-new contact.
## Custom Fields
Custom fields let you collect information beyond the standard contact data. Each custom field has a label, optional placeholder, required toggle, and a type.
### Available Custom Field Types
Single-line text input. Good for short answers like a referral code or website URL.
Multi-line text input. Use for longer responses, like "How can we help?"
A select menu where users pick one option from a list you define.
Radio button group — one selection from a visible list of options.
A single yes/no checkbox. Useful for terms acceptance or opt-ins.
Multiple checkboxes — users can select any number of options.
### Configuring Options for Choice Fields
Dropdown, radio, and checkbox group fields require a list of options. In the field editor, enter one option per line in the options textarea.
Single checkboxes don't take options — they're a simple yes/no toggle.
## Form Defaults
Configure what happens when a contact submits the form:
Change the default "Submit" label to something more specific like "Get a Quote" or "Sign Me Up".
The message shown after submission. Keep it short and clear.
Optionally redirect users to a thank-you page or a related resource after they submit.
Choose which CRM pipeline stage new contacts land on.
Pre-populate a deal value on the new pipeline card.
Tags applied automatically to every contact created by this form.
## Previewing and Testing
The form editor includes a live preview where you can fill out and submit the form to see exactly how it behaves. Submissions made through the preview are flagged with an internal badge so you can keep test data separate from real responses.
Always submit at least one test entry to confirm validation, your success message, and that the new contact lands in the right pipeline stage.
## Next Steps
Iframe code and pre-fill via query parameters
One-question-at-a-time experience
View and export form responses
Where new contacts land in your pipeline
# Managing Conversations
Source: https://docs.clarky.ai/features/inbox/conversations
View, respond to, and organize customer conversations
## Viewing Conversations
Each conversation displays:
* **Complete message history** - All messages in chronological order
* **Customer information** - Name, contact details, previous interactions
* **Conversation metadata** - Channel, timestamp, duration, status
* **AI confidence scores** - How confident the agent was in responses
## Message Types
Conversations can include various message types:
Standard text communication with formatting support
Visual content shared by users or agent
Automated notifications (user joined, transferred, etc.)
Button-based responses for easy selection
## Conversation Actions
### Quick Actions
Perform common tasks directly from the conversation view:
Assume control of the conversation
Create or link a CRM contact
Attach internal notes
Close the conversation
### Responding to Messages
When you take over a conversation:
1. Agent pauses automatic responses
2. You type and send messages manually
3. User sees smooth transition
4. You can hand back to AI when done
## Organizing Conversations
### Tags
Add custom tags to categorize conversations:
* **By Topic**: billing, support, sales
* **By Priority**: urgent, normal, low
* **By Outcome**: resolved, escalated, pending
* **Custom Tags**: Create your own categories
### Notes
Add internal notes that customers don't see:
* Context about the conversation
* Follow-up requirements
* Special customer needs
* Resolution details
## Next Steps
Master taking over conversations
# Search and Filtering
Source: https://docs.clarky.ai/features/inbox/filtering
Find conversations quickly with powerful search
## Search Functionality
Find any conversation instantly using the search bar.
### Search By
* **Customer Name**: Find all conversations with a specific person
* **Email or Phone**: Search by contact information
* **Keywords**: Search message content
* **Conversation ID**: Look up specific conversation
* **Date Range**: Find conversations in a time period
### Search Examples
```
Search: "billing issue"
Results: All conversations mentioning billing issues
Search: john@example.com
Results: All conversations with that email
Search: after:2024-01-01
Results: Conversations since January 1, 2024
```
## Filters
Narrow down conversations using filters:
### By Channel
* Chat
* Voice
* Text/SMS
* Email
### By Status
* Active
* Completed
* Needs Attention
* Escalated
* Archived
### By Date
* Today
* Yesterday
* Last 7 days
* Last 30 days
* Custom range
### By Rating
* 5 stars
* 4 stars
* 3 stars or below
* Unrated
### By Tags
Filter by any custom tags you've created.
## Saved Filters
Create and save commonly used filter combinations:
Apply the filters you want to save.
Give it a descriptive name.
Your saved filter appears in the sidebar for quick access.
### Common Saved Filters
* "Needs My Attention" - Escalated conversations
* "High Priority" - Urgent tagged conversations
* "This Week's Chats" - Recent chat conversations
* "Unresolved" - Open conversations
## Sorting Options
Sort conversations by:
* **Most Recent**: Newest first (default)
* **Oldest First**: Address old conversations
* **Rating**: Highest or lowest rated first
* **Duration**: Longest or shortest conversations
* **Channel**: Group by communication method
Combine search, filters, and sorting to find exactly what you need quickly.
## Bulk Actions
Select multiple conversations to:
* Apply tags in bulk
* Mark as complete
* Export data
* Assign to team members
Return to Inbox overview
# Human Takeover
Source: https://docs.clarky.ai/features/inbox/human-takeover
Seamlessly take control of conversations when needed
## What is Human Takeover?
Human takeover allows you to step into an ongoing conversation with your AI agent, providing personalized assistance when needed.
**Plan availability:** Standard or higher. See [Plans & Billing](/features/settings/plans).
## When to Take Over
Consider taking over when:
* Customer explicitly requests a human
* Issue is complex or sensitive
* Agent confidence is low
* Special circumstances arise
* Upsell or sales opportunity
## How to Take Over
Conversations needing attention are highlighted in your inbox.
Select the "Take Over" button in the conversation view.
Read the full conversation history quickly.
Type your message - the customer sees it's from a human.
## Auto-Escalation Triggers
Configure your agent to automatically request human help when:
* Negative sentiment detected
* Multiple failed response attempts
* Specific keywords mentioned ("speak to manager")
* Complex scenarios identified
* High-value customer detected
Set up in **Settings > Agent > Escalation Rules**.
## Best Practices
When you take over, respond within 1-2 minutes. Users expect faster responses from humans.
Start with "Hi, I'm \[Name] from the team. I'm here to help you with..."
Review what the agent already discussed to avoid repeating questions.
Once resolved, you can hand back to the AI for follow-up questions.
## Collaboration Features
* **Team Notifications**: Alert specific team members
* **Internal Chat**: Discuss with colleagues without customer seeing
* **Transfer**: Pass conversation to another team member
* **Consult Mode**: Get help from AI while you control the conversation
Set up human takeover alerts
# Inbox Overview
Source: https://docs.clarky.ai/features/inbox/overview
Manage all your customer conversations in one place
## What is the Inbox?
The Inbox is your central hub for viewing and managing all customer conversations across chat, voice, text/SMS, and email channels. Every interaction is organized, searchable, and easily accessible.
## Key Features
All channels in one place
See conversations as they happen
Jump into conversations when needed
Find any conversation quickly
## Inbox Layout
### Conversation List
The left panel shows all conversations:
* **Most Recent First**: Newest conversations appear at the top
* **Channel Icons**: Identify the communication channel
* **Preview Text**: See the latest message
* **Unread Counts**: Number of unread messages
### Conversation View
The main panel displays the selected conversation:
* **Full Message History**: Complete conversation thread
* **Customer Info**: Contact details and history
* **Quick Actions**: Take over, link to CRM, add notes
* **Channel Context**: Specific details for the channel
### Sidebar
The right panel shows contextual information:
* **Sentiment Analysis**: Conversation sentiment over time
* **Contact Profile**: Customer name, email, phone
* **Conversation Details**: Duration, status, channel
* **CRM Link**: Associated contact record
* **Tags and Notes**: Custom labels and annotations
## Accessing the Inbox
Click **"Inbox"** in the main navigation.
Scroll through the list or use search and filters.
Click any conversation to view the full details.
## Real-Time Features
### Live Conversation Indicators
See when users are actively chatting:
* **Active**: User is currently in the conversation
* **Typing Indicator**: Agent or user is typing
* **Last Seen**: Time of last message
### Notifications
Get notified when:
* New conversation starts
* User sends a message in an active conversation
* Conversation needs human attention
* User has been waiting too long
Configure notifications in **Settings > Notifications**.
## Next Steps
Learn about managing conversations
Take control when needed
Find conversations quickly
Connect conversations to contacts
# A2P 10DLC Registration
Source: https://docs.clarky.ai/features/settings/a2p
Register your business to send compliant SMS in the United States
**Plan availability:** Standard or higher. See [Plans & Billing](/features/settings/plans).
A2P 10DLC ("Application-to-Person on 10-digit long codes") is the registration program every US business has to complete before sending text messages to customers. Clarky walks you through it on the **Texting** settings page and previews exactly what to copy into Twilio.
## Why It's Required
US mobile carriers require every business that texts consumers to register their brand and the kinds of messages they plan to send. The goal is to cut down on spam and to give customers a reliable way to opt out.
If you send messages without registering, carriers will filter or block your texts and Twilio may suspend your number. Complete A2P registration before launching any SMS use case.
## What You'll Need
Before you start, gather:
Legal business name as it appears on your IRS EIN documents, plus a DBA / brand name if you use one.
Whether your business is a private company, public company, non-profit, sole proprietor, or government entity.
A live website with a Privacy Policy and Terms of Service page. Required.
A support email and phone number customers can reach you at.
The vertical that best describes your business (healthcare, retail, real estate, etc.).
What kind of messages you'll send (marketing, customer care, or both), how often, and how customers opt in.
## Filling Out the Form
This must match the entity type on your IRS EIN documentation exactly.
If your customers know you by a different name than your legal name, mark "Yes, I use a DBA" and provide the public brand name.
A few sentences about what you do. Click **Generate from Context** to have Clarky draft a description from your agent's Context documents — you can edit it from there.
Search the list and choose the industry that best fits. Healthcare verticals trigger an extra HIPAA reminder.
Make sure your site has reachable Privacy Policy and Terms of Service pages before submitting.
Website form, paper form, Facebook lead form, QR code, kiosk, or verbal. Pick whichever matches reality.
Most businesses send both marketing and customer care messages. Selecting both keeps you flexible.
"Low Volume Mixed" is the recommended option for most small businesses.
Pick a slightly higher tier than you think you need to stay compliant if volume grows.
Clarky stores your registration, generates a compliant opt-in form for you, and shows the exact Twilio fields to copy in the live preview panel.
## Live Twilio Preview
As you fill out the form, Clarky shows the exact text to paste into each Twilio field on the right side of the page:
* A2P Campaign Use Case
* Campaign Description
* Two sample messages
* Consent description ("How do end-users consent?")
* Privacy Policy and Terms of Service URLs
* Opt-in keywords, opt-in message, STOP response, HELP response
Click any field to copy it, then paste it into the matching field in the [Twilio A2P onboarding](https://console.twilio.com/us1/develop/sms/regulatory-compliance/a2p-onboarding) console.
## Approval Timing
Once submitted to Twilio, brand verification typically takes a few business days, and campaign approval typically takes another few days on top of that. Carriers occasionally take longer during high-volume periods.
Start the registration process before you actually need to send messages. Approval can take a week or more end-to-end.
## Healthcare and HIPAA
If you select a healthcare-related industry, Clarky shows a HIPAA reminder. Never include Protected Health Information (PHI) in SMS — appointment reminders and replies should stay generic ("You have an appointment tomorrow at 2 PM" rather than anything diagnostic).
Return to Texting Settings
# Agent Settings
Source: https://docs.clarky.ai/features/settings/agent
Configure your AI agent's properties and behavior
## Agent Properties
### Basic Information
Your agent's display name (e.g., "Support Bot", "Sales Assistant")
Internal description for your reference
URL-friendly identifier for your agent
## Human Takeover
Enable/disable human agents taking over conversations
## Advanced Settings
Maximum time agent takes to generate a response (default: 30 seconds)
How many previous messages to consider (default: 10 messages)
Show confidence scores to human agents (hidden from customers)
Connect your business tools
# Sentiment Analysis & Escalation
Source: https://docs.clarky.ai/features/settings/analysis
Detect frustrated users, hand off to humans, and act before conversations go sideways
**Plan availability:** Startup or higher for sentiment analysis. Escalation detection and human takeover require Standard or higher. See [Plans & Billing](/features/settings/plans).
## Overview
The Analysis settings page brings together three related features that help you keep an eye on conversations and step in when it matters:
Score each conversation and alert you when the mood turns negative.
Notice when a user explicitly asks for a human and trigger an alert.
Let a teammate jump into the conversation and take over from the AI.
You'll find all of these under **Settings > Analysis** for the agent you want to configure.
## Sentiment Analysis
Clarky analyzes the tone of every conversation in the background and assigns a **sentiment score** from 0 (very negative) to 100 (very positive). When a conversation drops below the threshold you set, Clarky raises a **bad sentiment alert** so you can review what went wrong — or reach out before the user churns.
### Enabling Sentiment Analysis
Go to **Settings > Analysis** for the agent you want to configure.
Use the switch next to **Sentiment Analysis**. It's on by default for most agents.
Drag the **Positive Sentiment Threshold** slider to set the score below which a conversation is flagged. The default is **60**, and the slider runs from 1 to 100.
Click **Save** at the bottom of the page once you're happy with the values.
### Choosing a Threshold
* **Lower values (around 30–50)** flag only clearly negative conversations. Good if you only want alerts for serious issues.
* **Default (60)** is a balanced starting point — flags conversations that are noticeably frustrated or unsatisfied.
* **Higher values (70–80)** flag anything that isn't clearly positive. Good for high-touch customer success teams who want to follow up on lukewarm conversations.
You can reset the threshold to the default value of 60 at any time using the **Reset to default** button in the upper-right corner of the section.
### What Happens When a Conversation Is Flagged
When a conversation's sentiment score drops below your threshold:
* It's marked as a **bad sentiment** conversation in the inbox
* A notification can be sent to your team (configured in [Notifications](/features/settings/notifications))
* A `conversation.bad_sentiment` event fires, which can trigger a [webhook](/features/settings/webhooks)
## Escalation Detection
Escalation detection requires the **Standard** plan or higher.
Even when an agent is doing its job well, some users specifically want to talk to a human. **Escalation Detection** watches conversations for those moments and raises an alert so a teammate can jump in.
### Enabling Escalation Detection
Toggle the **Escalation Detection** switch on. By default, Clarky uses its built-in rules to recognize phrases like "Can I talk to a human?" or "Is there an agent available?"
When triggered:
* The conversation is flagged in the inbox
* An `conversation.escalation_requested` event fires for [webhooks](/features/settings/webhooks)
* Notifications are sent according to your [Notifications](/features/settings/notifications) preferences
### Custom Detection Rules
If the default rules are too sensitive — or not sensitive enough — you can replace them with your own.
Inside the Escalation Detection section, switch on **Custom Detection Rules**. The text area pre-fills with Clarky's default rules so you have a starting point.
Update the conditions to match how you want escalations to work. Be explicit — describe the kinds of phrases or situations that should and shouldn't count as a request for a human.
Click **Save** to apply your custom rules.
If you want to go back to the defaults, simply turn the **Custom Detection Rules** toggle off — Clarky will resume using the built-in rules.
### Timeout Message
When a user asks for a human and no teammate responds quickly, you can have Clarky send an automated reassurance message so the user isn't left hanging.
Inside the Escalation Detection section, toggle **Timeout Message** on.
Choose how long Clarky should wait before sending the message. Allowed values are **1 to 10 minutes**.
Enter the text the agent should send if no human joins in time. A common pattern:
> I'm sorry we haven't responded yet. We have your contact information and someone will be in touch shortly.
Click **Save**. The message is sent automatically as an assistant response when the wait time elapses without a human takeover.
If you clear the message field and save, the timeout feature is automatically disabled — there's no separate "off" state to manage.
## Human Takeover
Human takeover requires the **Standard** plan or higher.
**Human Takeover** allows a teammate to step into a live conversation and respond as a human, pausing the AI agent. It's the natural pairing for escalation detection — once you know a user wants a human, your team needs a way to step in.
### Enabling Human Takeover
In the Human Takeover section, toggle the **Human Takeover** switch on, then click **Save**.
When enabled:
* Teammates can take over any active conversation from the inbox
* The AI pauses while a human is actively responding
* The user sees messages from the human teammate in the same conversation thread
* Either the human can hand control back to the AI, or the conversation can simply end
Pair Human Takeover with **Escalation Detection** and a **Timeout Message** for the smoothest workflow: Clarky catches escalation requests, alerts your team, sends a holding message if no one responds in time, and lets a teammate take over the moment they're available.
## Saving Changes
Changes on the Analysis page are batched. A **Save** button only appears when you have unsaved changes — once you click it, the new settings take effect immediately for new conversations.
Forward bad sentiment and escalation events to Slack, Zapier, or your own systems.
Decide which alerts go to your inbox, mobile app, or browser.
Return to Settings overview
# CRM Basics & Custom Fields
Source: https://docs.clarky.ai/features/settings/crm-basics
Control how contacts are captured and define custom fields for contacts and companies
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
CRM Basics controls how your agent captures people who contact you and lets you tailor the data you keep on contacts and companies.
## Contact Scope
Choose whether contacts are shared across every agent in the workspace or kept private to a single agent.
Every agent in this workspace sees the same contacts. Useful when multiple agents serve the same customers and you want a unified record.
Contacts are isolated to this agent only. Useful when agents serve completely separate audiences and you don't want their records mixed.
Most teams should start with **Workspace** so a customer who calls one agent and texts another shows up as a single contact.
## Auto-Capture Settings
Toggle whether the agent automatically saves a new contact whenever someone reaches out on a given channel.
When enabled, an inbound call will create a contact using the caller's phone number. The contact is saved even if the call is brief.
When enabled, an inbound text creates a contact using the sender's phone number.
When enabled, an inbound email creates a contact using the sender's email address. Their name is captured too if it's available in the message.
Auto-capture only adds the basics — phone number or email. Richer details (full name, company, custom fields) are filled in by the agent during the conversation or by you on the contact page.
## Custom Fields
Custom fields let you store extra information on contacts and companies that's specific to your business — things like lead score, account type, or referral source.
### Field Types
Single-line text
Numeric values
A date
A specific date and time
Pick one option from a list you define
Pick multiple options from a list you define
A simple yes / no toggle
A web address
An email address
A phone number
### Adding a Custom Field
Find the **Contact Custom Fields** or **Company Custom Fields** card.
A dialog opens for the new field.
Enter a clear label (e.g., "Lead Score" or "Account Type") and an optional description to help your team understand when to use it.
Choose the type that matches the data you'll store. For Dropdown or Multi-select, list each option on its own line.
Toggle "Required field" if the field must be filled in to save a contact or company.
The field appears immediately on every contact or company in the workspace.
### Editing and Deleting Fields
You can rename a field, edit its description, change its options (for dropdowns), or toggle whether it's required at any time. The field type itself can't be changed once created — delete the field and create a new one if you need a different type.
Deleting a field removes it from your forms and contact pages. Existing values stored in that field are preserved on each record but become read-only.
Return to Settings overview
# Custom Domains
Source: https://docs.clarky.ai/features/settings/custom-domains
Serve your forms, surveys, and chat pages from a domain you own, with your own branding
**Plan availability:** Pro or higher. See [Plans & Billing](/features/settings/plans).
## What Are Custom Domains?
By default, public Clarky pages live at `clarky.ai`. With a custom domain you point a hostname you own, such as `forms.yourcompany.com`, at Clarky and your forms, surveys, and chat pages are served from it instead. Visitors see your brand in the address bar, links are short and easy to remember, and nothing on the page references Clarky.
Once a domain is live, these URLs work on it:
| URL | What it shows |
| ----------------------------- | ---------------------------------------------------------------- |
| `yourdomain.com/` | The home page you choose for the domain (a form or a chat agent) |
| `yourdomain.com/onboarding` | The form or survey whose URL slug is `onboarding` |
| `yourdomain.com/c/your-agent` | A full-screen chat page for one of your agents |
Custom domains only serve public pages. The admin app and your Clarky login always stay at `clarky.ai`.
## Adding a Domain
Go to **Settings > Custom Domains** and click **Add domain**.
Type the domain or subdomain you control, for example `forms.yourcompany.com`. Subdomains are the easiest to set up. Root domains (`yourcompany.com`) work too, but require an A record instead of a CNAME.
Clarky shows the exact record to add at your domain provider (GoDaddy, Cloudflare, Namecheap, and so on). Every field is click-to-copy.
* **Subdomain**: a `CNAME` record pointing at `cname.vercel-dns.com`
* **Root domain**: an `A` record pointing at `76.76.21.21`
If the domain is already registered with another hosting account, Clarky may also ask for a `TXT` record to prove you own it.
DNS changes usually take a few minutes to propagate. Click the refresh icon next to the domain to re-check. The badge changes from **Pending DNS** to **Live** as soon as the record is detected, and Clarky provisions an SSL certificate automatically.
You can add more than one domain. A recruiting team might use `apply.yourcompany.com` for application forms and `help.yourcompany.com` for a chat agent.
## Choosing a Home Page
Each domain has a **Home page** setting that controls what loads at the root URL. Pick any form, survey, or chat agent in your workspace. If you leave it empty, the root returns a not-found page and only the specific form and chat paths respond.
## Form URL Slugs
Forms and surveys can have a short URL slug so the link reads `forms.yourcompany.com/onboarding` instead of a long ID.
Go to **CRM > Forms** and open the form you want to share.
In the **Form Settings** card, enter a slug made of lowercase letters, numbers, and hyphens (for example `onboarding` or `event-rsvp`). Slugs must be unique within your workspace.
The **View** tab shows the public link. Use the host selector to switch between `clarky.ai` and any of your live custom domains; the link, iframe snippet, and script snippet all update to match.
A few words are reserved and cannot be used as slugs because Clarky uses them for routing: `f`, `c`, `api`, `cd`, `form`, `embed`, `b`, `p`, and `admin`.
## Branding Each Domain
Under each live domain you can set what visitors and link previews see:
The name shown in browser tabs and link previews. Defaults to the hostname.
The small icon in the browser tab. Upload a 512 x 512 PNG.
The image shown when the link is shared on LinkedIn, Slack, iMessage, and similar. Upload a 1200 x 630 PNG or JPG.
If you do not upload a favicon or preview image, the page simply has none. Clarky never substitutes its own branding on a custom domain.
## Powered by Clarky
Public chat pages, the chat widget, forms, and surveys show a small "Powered by Clarky" link by default. On Pro and higher you can hide it:
* **Chat**: the **Powered by Clarky** card at the bottom of **Settings > Custom Domains** has a **Show on chat** switch for the current agent.
* **Forms and surveys**: open the form, then **Form Settings > Design and Branding**, and turn off the branding switch for that form.
The switch works on `clarky.ai` links as well as custom domains, so you can go white-label either way.
## Embedding From Your Domain
The share and embed screens are domain-aware:
* **Forms**: the **View** tab of a form has a host selector. Choose a custom domain and the public link, iframe embed, and script embed all use it. The embed script itself is served from your domain.
* **Chat**: **Settings > Share / Embed** has the same selector for the chat page link and the `chat.js` embed tag.
Embed code copied this way never mentions `clarky.ai`, so the pages you paste it into stay fully on-brand.
Most often the record has not propagated yet, or it was added on the wrong name (for example `forms.yourcompany.com.yourcompany.com`). Double-check the **Name** and **Value** fields against what Clarky shows, wait a few minutes, and re-check. Some providers cache DNS for up to an hour.
Not yet. Custom domains currently cover forms, surveys, and chat pages. Booking pages continue to use `clarky.ai` links.
Domains stay saved, but they stop serving pages until the workspace is back on a plan that includes custom domains. Your `clarky.ai` links keep working the whole time.
Clarky detaches it from hosting and deletes any favicon or preview image you uploaded for it. Links on that domain stop working immediately; the underlying forms and agents are untouched.
Public URLs, iframe, and script embeds for forms and surveys.
Chat page links and the chat widget embed.
# Email Settings
Source: https://docs.clarky.ai/features/settings/email-setup
Set up inbound and outbound email for your agent
**Plan availability:** Standard or higher. See [Plans & Billing](/features/settings/plans).
The Email Settings page configures both halves of your agent's email channel: receiving messages (inbound) and sending replies (outbound).
## Inbound Email
Every agent gets a unique inbound email address you can forward messages to. Anything sent to that address shows up as a conversation in Clarky and can be answered by the agent or by you.
Toggle the switch on. Inbound is on by default.
Click the copy button next to the address.
Set up forwarding from your existing inbox (Gmail, Outlook, your support address, etc.) to your agent's address — or hand the address out directly to customers.
A common pattern is forwarding `support@yourdomain.com` to your agent's address. The agent triages incoming messages, replies to the easy ones, and lets you take over the rest.
## Outbound Email
To let your agent send email replies, connect a [Resend](https://resend.com) account. Resend handles delivery from your own verified domain, which means recipients see emails coming from `you@yourdomain.com` rather than a generic Clarky address.
### Connect Resend
Switch on **Enable Outbound Email**. The configuration form appears.
Get a key from [resend.com/api-keys](https://resend.com/api-keys). The key needs **full access** so Clarky can verify your domain and send on your behalf.
The name that shows up in the "From" field — e.g., "John Smith" or "Acme Support."
A real address on a domain you've verified in Resend. When you click out of the field, Clarky verifies the domain automatically.
Once the domain shows as verified, the Save button is enabled.
### Verifying Your Domain
The sender email has to be on a domain you've verified in Resend. If verification fails, head to [resend.com/domains](https://resend.com/domains), add the DNS records Resend provides, and try again once they've propagated.
Outbound won't save until the domain is verified. This protects your deliverability — sending from an unverified domain is a fast track to the spam folder.
### AI Auto-Reply
Once outbound is configured, you can toggle **AI Auto-Reply** on. With it enabled, your agent will automatically reply to inbound emails when it has a confident answer based on its knowledge base. Anything ambiguous still goes to your inbox so a human can take over.
Start with auto-reply off, watch your inbound conversations for a few days, and turn it on once you're comfortable with the answers your agent is drafting.
## Disabling Outbound
Turning off outbound clears your saved Resend API key, sender name, and sender email. You'll need to re-enter them if you turn it back on later. Inbound email continues to work either way.
Return to Settings overview
# Integrations
Source: https://docs.clarky.ai/features/settings/integrations
Connect Clarky to your business tools
## Available Integrations
Clarky integrates with popular business tools to enhance your agent's capabilities.
**Plan availability:** Startup or higher. See [Plans & Billing](/features/settings/plans).
## E-commerce
### Shopify
Connect your Shopify store:
* Check order status
* Track shipments
* Process returns
* Answer product questions
In Settings > Integrations
Log in to your Shopify admin and approve access
Choose what data the agent can access
## CRM
### GoHighLevel
Integrate with GoHighLevel:
* Create contacts
* Log activities
* Trigger workflows
* Access customer data
## Email
Connect Gmail or Google Workspace:
* Send and receive emails
* Access contact lists
* Calendar integration
Connect Outlook or Office 365:
* Email management
* Contact sync
* Calendar access
## Calendar
### Google Calendar
Enable appointment booking:
* Check availability
* Schedule appointments
* Send confirmations
* Handle rescheduling
### Calendly
Connect Calendly for:
* Share booking links
* Check availability
* Manage event types
### Cal.com
Integrate Cal.com:
* Booking management
* Multiple calendar support
* Team scheduling
## Communication
### Phone (Built-in)
Twilio integration for voice and SMS:
* Automatic provisioning
* No configuration needed
* Included in subscription
## Custom Integrations
Need a custom integration?
* API access available
* Webhook support
* Custom tool creation
* Contact support for assistance
Return to Settings overview
# Interface Settings
Source: https://docs.clarky.ai/features/settings/interface
Customize your chat widget appearance
## Chat Widget Customization
Make your chat widget match your brand.
**Plan availability:** Standard or higher. See [Plans & Billing](/features/settings/plans).
## Widget Layout
Choose how the chat presents itself on your website when embedded. Colors, greeting, avatar, and starters apply to every layout.
A round launcher in the bottom-right corner that opens the chat panel.
An always-visible "Ask a question" bar centered at the bottom of the page. The conversation rises above it once a visitor asks something. Cmd+I (Ctrl+I on Windows) focuses the bar from anywhere on the page.
A "Chat with ..." tab flush with the bottom edge of the page that expands into a panel anchored to the bottom-right corner.
The layout applies to the embedded widget on your site. The shareable full-screen chat page always uses the standard chat view.
## Colors
Background color of the chat widget header
Text color in the header
Primary accent color for buttons and highlights
Main chat background color
## Branding
### Avatar
Upload a custom avatar image:
* Recommended size: 200x200px
* Formats: PNG, JPG, GIF
* Appears next to agent messages
### Chat Greeting
Customize the initial message users see:
```
👋 Hi there! I'm here to help. What can I assist you with today?
```
### Welcome Message
Set what appears before users start chatting:
```
Welcome to Acme Support! Ask me anything about our products and services.
```
## Starter Prompts
Add quick-click options for common questions:
Go to Settings > Interface
Enter suggested questions users can click
Prompts appear in the chat widget
### Example Starters
* "What are your hours?"
* "Tell me about your services"
* "I need help with an order"
* "How do I contact you?"
## Preview
Use the live preview to see changes in real-time before saving.
Get embed code for your website
# Mobile App
Source: https://docs.clarky.ai/features/settings/mobile-app
Install and use the Clarky Progressive Web App (PWA)
## Clarky Mobile App
Stay connected to your agent's conversations on the go with the Clarky Progressive Web App (PWA). The Clarky mobile app is not available in app stores—it's a PWA that you can install directly on your device.
## Features
Get instant alerts for new conversations
Jump into chats from your phone
Monitor performance anywhere
Access contacts and pipeline
## Install the PWA
The Clarky mobile app is a Progressive Web App (PWA) that you can install on iPhone, Android, iPad, Mac, and Windows. It's not available in app stores—you install it directly from your browser.
Install on iOS:
1. Open Safari and navigate to your Clarky workspace
2. Tap the Share button (square with arrow)
3. Scroll down and tap "Add to Home Screen"
4. Tap "Add" to confirm
5. The app icon will appear on your home screen
6. Tap the icon to open the PWA
Install on Android:
1. Open Chrome and navigate to your Clarky workspace
2. Tap the menu (three dots) in the top right
3. Tap "Add to Home screen" or "Install app"
4. Tap "Install" to confirm
5. The app icon will appear on your home screen
6. Tap the icon to open the PWA
Install on Desktop:
1. Open Chrome, Edge, or Safari and navigate to your Clarky workspace
2. Look for the install icon in the address bar (or menu)
3. Click "Install" or "Add to Home Screen"
4. The app will open in its own window
5. You can pin it to your taskbar or dock for quick access
## Setting Up the App
Follow the installation steps for your device (iPhone, Android, iPad, Mac, or Windows) above
Use your Clarky account credentials
Allow push notifications for real-time alerts
Choose which workspace to monitor
## Mobile Features
### Conversation Management
* View all conversations
* Respond to messages
* Take over from AI agent
* Add notes and tags
### Notifications
Configure mobile-specific notifications:
* New conversations
* Human takeover requests
* Mentions and escalations
* Daily summaries
### Quick Actions
Fast access to common tasks:
* View active conversations
* Check today's metrics
* Search contacts
* Access knowledge base
## Security
Your data is secure:
* End-to-end encryption
* Biometric login (Face ID / Touch ID / Fingerprint)
* Automatic session timeout
* Remote device management
## Troubleshooting
1. Check app notification settings
2. Verify notification preferences in Clarky dashboard
3. Ensure "Do Not Disturb" is off
4. Restart the app
1. Verify your credentials
2. Check internet connection
3. Try resetting password
4. Contact support if issues persist
1. Clear browser cache and data
2. Refresh the PWA (pull down on mobile or refresh on desktop)
3. Restart device
4. Reinstall the PWA if necessary
Set up your notification preferences
# Notifications
Source: https://docs.clarky.ai/features/settings/notifications
Configure alert preferences
## Notification Types
Choose what notifications you want to receive.
## Email Notifications
New conversation started
Agent requests human help
Negative sentiment detected
Daily performance summary
## Push Notifications
Mobile and browser push notifications:
When users are actively chatting
When conversations need attention
When you're mentioned by team members
Messages, DMs, and @mentions in [Team Chat](/features/team-chat/overview)
AI prep briefs before meetings, for event types with [Meeting Briefs](/features/booking/meeting-briefs) turned on
Team Chat also respects your per-channel notification level (all messages, mentions only, or muted). If you're DMed or @mentioned and have no push device set up, Clarky emails you instead, at most once per channel every 30 minutes.
## Notification Channels
Configure how you receive notifications:
* **Email**: Sent to your account email
* **Mobile App**: Push notifications on your phone
* **Browser**: Desktop browser notifications
* **SMS**: Text message alerts (premium)
Download the Clarky mobile app
# Settings Overview
Source: https://docs.clarky.ai/features/settings/overview
Configure your AI agent, channels, CRM, and workspace
## Settings Navigation
Settings are organized by topic. Below is the full landscape — most pages are scoped to the current bot, but **Workspace**, **Users**, and **Plans & Billing** are shared across the workspace.
### Agent
Name, behavior, and core configuration
Working hours and after-hours behavior
Sentiment analysis, escalation rules, and human takeover
Connect to third-party tools and services
Send real-time event notifications to external systems
### CRM & Analytics
Auto-capture, contact scope, and custom fields
Configure visitor analytics and blocked paths
### Chat Widget
Customize chat widget appearance
Get embed code and sharing options
Privacy and data handling settings
### Voice, Text & Email
Phone numbers, greetings, and voices
SMS/MMS channel configuration
Register your business for SMS sending in the US
Connect Resend for inbound and outbound email
### Workspace
Workspace name and configuration
Team member management
Subscription, pricing, and the feature matrix
Alert preferences
Push notifications and the mobile experience
## Plan availability
Some settings only appear once your workspace is on the right plan. Each gated page has a callout at the top showing its minimum plan. The full feature matrix is on [Plans & Billing](/features/settings/plans).
## Quick Settings
Access frequently used settings quickly:
* **Agent Name**: Click to edit from the dashboard
* **Status**: Enable/disable your agent from Settings, under Properties
* **Quick Actions**: Every section (Inbox, CRM, Calendar, Context, Settings) is one click away in the sidebar
## Settings Changes
Most settings changes take effect immediately. Some may require:
* Refreshing your chat widget
* Re-deploying the embed code
* Clearing browser cache
* Waiting for cache expiration (under 5 minutes)
Changes to agent knowledge and behavior are instant. Interface changes may take a few minutes to propagate.
# Pixel Tracking
Source: https://docs.clarky.ai/features/settings/pixel-tracking
Track visitor analytics and build profiles before they start chatting
**Plan availability:** Standard or higher. See [Plans & Billing](/features/settings/plans).
## What Pixel Tracking Does
When pixel tracking is enabled, the Clarky widget on your website acts like a lightweight analytics tool — similar to HubSpot or other visitor intelligence platforms. It quietly observes how people use your site so your agent has rich context the moment they start a conversation, and so you can review traffic trends in the [Traffic dashboard](/features/traffic/overview).
Pixel tracking captures:
Every page a visitor views on your website.
When visitors open, close, or interact with the chat widget.
Comprehensive profiles built across multiple sessions.
First-touch and last-touch marketing attribution.
IP-based country, region, and city.
Browser, OS, screen size, and connection type.
## Enabling Pixel Tracking
Go to **Settings > Traffic > Pixel Tracking**.
Flip the **Pixel Tracking** switch. The status badge updates to **Enabled** and tracking begins on the next page load.
Visit the [Traffic dashboard](/features/traffic/overview) to see incoming page views, visitor profiles, and attribution data.
You can disable pixel tracking at any time by toggling the switch off. New page views stop being recorded immediately, but historical data is preserved unless you delete it explicitly (see [Blocked Paths](#blocked-paths)).
## Blocked Paths
Some pages shouldn't be tracked — admin areas, internal staging routes, or pages where tracking would be inappropriate. Blocked paths let you exclude specific URLs or URL patterns from analytics.
### Adding a Blocked Path
In the **Blocked Paths** section, type a path into the input field. Paths must start with `/` (a literal path) or `*` (a wildcard pattern).
The path is added to the list and immediately excluded from tracking.
### Pattern Examples
`/admin/*` blocks `/admin`, `/admin/users`, `/admin/settings`, and any other path under `/admin`.
`/internal/*` blocks every URL beginning with `/internal/`.
`*/preview` blocks any URL ending in `/preview` — useful for content preview routes.
`*staging*` blocks any URL that contains the word "staging" anywhere in the path.
### Removing a Blocked Path
Click the **X** icon next to a path to remove it from the block list. Tracking resumes for matching pages on the next visit.
### Deleting Existing Data
Adding a blocked path stops *future* tracking — it does not retroactively remove data. If you want to clear historical analytics for a path you've blocked, click **Delete Data** next to it. Clarky will permanently remove all page views matching that pattern.
Deleting analytics data cannot be undone. Make sure you really want to remove the historical record before confirming.
## Privacy Considerations
Pixel tracking collects visitor data — including IP addresses for geolocation — that may be regulated in your jurisdiction.
Make sure your privacy policy reflects this data collection. Depending on where your visitors are located, you may need to obtain consent under regulations such as GDPR or CCPA before tracking is enabled.
For controls on what your agent stores about individual users (email, phone, name), see [Privacy Settings](/features/settings/privacy).
See the visitor data you've collected.
Return to Settings overview
# Plans & Billing
Source: https://docs.clarky.ai/features/settings/plans
Choose the plan that fits your business and manage your subscription
## Plan Tiers
Clarky offers five plan tiers, each unlocking additional features and higher limits.
Get started with chat, booking, and the core agent
Add the CRM, integrations, and sentiment analysis
Unlock voice, text, email, human takeover, and pixel tracking
Webhooks, multiple websites, and advanced control
White-label, custom solutions, dedicated support
## Feature Matrix
The table below shows which plan unlocks each feature. Each higher tier includes everything from the tiers below it.
| Feature | Free | Startup | Standard | Pro | Enterprise |
| -------------------------------------------------------------------------------------------------------------------- | :-------: | :-------: | :-------: | :-------: | :--------: |
| **Chat channel** | | | | | |
| **Booking** | | | | | |
| **Clarky Notetaker** (built-in AI meeting recorder: joins Meet, Zoom, and Teams calls, records, and writes AI notes) | — | — | | | |
| **Meeting Recording Support** (via notetaker apps like Fellow: sync, transcripts, AI meeting chat) | | | | | |
| **AI Meeting Briefs** (pre-meeting research on every guest, delivered before the call) | — | — | | | |
| **CRM** (Contacts, Companies, Pipeline, Forms, Activity, Ask Clarky) | — | | | | |
| **Integrations** (Gmail, Outlook, Calendly, Cal.com, Google Calendar, etc.) | — | | | | |
| **Sentiment Analysis** | — | | | | |
| **Voice Calls** | — | — | | | |
| **Text / SMS** | — | — | | | |
| **Email** | — | — | | | |
| **Sequences** | — | — | — | | |
| **Prospecting** (People Data Labs search; pay-as-you-go prospect credits, packs on any paid plan) | — | | | | |
| **Email Validation** (ZeroBounce deliverability checks; pay-as-you-go credits, packs on any paid plan) | — | | | | |
| **Human Agent Takeover** | — | — | | | |
| **Widget Customization** | — | — | | | |
| **Advanced Analytics** | — | — | | | |
| **Pixel Tracking / Traffic Analytics** | — | — | | | |
| **API Access** (`/api/v1/*`) | — | — | | | |
| **MCP Server** (Claude, Codex & AI tools) | — | — | | | |
| **Text Clarky** (text your CRM over iMessage, RCS, or SMS; group-chat meeting booking) | — | — | | | |
| **Team Chat** (Slack-style channels, DMs, threads, files, @Clarky in channels) | Limited | | | | |
| **Webhooks** | — | — | — | | |
| **Multiple Websites** | — | — | — | | |
| **Custom Domains** (forms, surveys, and chat pages on your own hostname) | — | — | — | | |
| **Remove Clarky Branding** | — | — | — | | |
When a feature requires a higher plan, the relevant settings page shows an upgrade prompt with a link to plans. On the Free plan, Team Chat is limited to 3 public channels and the last 30 days of history, without file sharing or @Clarky. See [Team Chat](/features/team-chat/overview).
## Free Trial
Every new workspace starts with a free trial that includes all features. No credit card is required to start. You can upgrade to a paid plan at any time during or after the trial.
## Upgrading Your Plan
Navigate to **Settings > Plans & Billing** in your workspace.
Compare plans and pick the one that matches your needs.
Add a credit card. Subscriptions are managed by Stripe.
Your new plan takes effect immediately and gated features unlock right away.
## Billing & Invoices
From **Settings > Plans & Billing** you can:
* View your current plan and renewal date
* Update your payment method
* Switch between monthly and annual billing
* Download past invoices as PDF
* Update billing email and tax info
## Usage Tracking
Some plans include conversation, message, and call limits. Your current usage and percentage-of-limit are shown on the Plans page so you know when to consider upgrading.
## Cancellation
You can cancel anytime from **Settings > Plans & Billing**. Your plan stays active until the end of the current billing period, after which the workspace returns to the Free tier (gated features become read-only).
Have questions about a custom Enterprise quote, volume pricing, or migration? Contact us at [support@clarky.ai](mailto:support@clarky.ai).
Return to Settings overview
# Privacy Settings
Source: https://docs.clarky.ai/features/settings/privacy
Control privacy and data handling
## Privacy Controls
Configure how your agent handles customer data.
## Data Collection
Allow agent to ask for and store email addresses
Allow agent to ask for and store phone numbers
Allow agent to ask for and store customer names
## Privacy Policy
Link to your privacy policy
Display privacy notice in chat widget
## Data Retention
How long to keep conversation data:
* 30 days
* 90 days
* 1 year
* Forever
## GDPR Compliance
Enable GDPR features:
* Cookie consent banner
* Right to be forgotten
* Data export requests
* Opt-out options
## User Consent
Require users to accept terms before chatting
Consult with legal counsel to ensure compliance with applicable privacy laws in your jurisdiction.
Return to Settings overview
# Schedule
Source: https://docs.clarky.ai/features/settings/schedule
Set your agent's working hours, timezone, and time off
The Schedule page tells your agent when your business is open. The agent uses these hours when deciding how to handle calls, texts, and emails outside of business hours, and when offering appointment times.
## Timezone
Pick the timezone your business operates in. All working hours and time-off dates are interpreted in this timezone.
Available timezones:
* Eastern Time (ET)
* Central Time (CT)
* Mountain Time (MT)
* Pacific Time (PT)
* Alaska Time (AKT)
* Hawaii Time (HT)
Clarky picks a sensible default based on your browser timezone the first time you visit the page. You can change it any time.
## Working Hours
Set the days you're open and the start and end time for each day.
Use the switch next to each day to mark it as a working day. Disabled days are treated as closed.
Each enabled day defaults to 9:00 AM – 5:00 PM. Adjust the time pickers to match your hours.
The Save button appears at the bottom of the page once you've made changes.
### What Happens Outside Business Hours
When someone reaches out outside your working hours, the agent is aware that you're closed and can change its behavior accordingly:
* **Voice calls** can be routed to voicemail or a fallback message instead of going through the full conversation flow.
* **Booking** flows only offer appointment times that fall inside your working hours.
* **Text and email replies** still work, but the agent can let the customer know you're closed and set expectations on response time.
Working hours describe when your business is open — not when the agent is "running." The agent itself is always available; the schedule simply gives it context about when humans are around.
## Time Off
Add specific dates when you're closed even though they fall on a normal working day — holidays, company offsites, planned closures, etc.
Use the date picker in the Time Off card.
A short label like "Thanksgiving" or "Office closed" is enough.
The date appears in the list, sorted chronologically.
Past time-off dates are cleaned up automatically when you save, so the list stays focused on what's still ahead.
Time off behaves the same way as a closed day — the agent treats those dates as outside business hours, including for booking availability.
Return to Settings overview
# Share Settings
Source: https://docs.clarky.ai/features/settings/share
Get embed code and sharing options
## Embed Code
Get the code to add Clarky to your website.
### Standard Embed
```html theme={null}
```
Click "Copy" to copy the embed code
Add the code just before the closing `