Developer Documentation

Deskwoot REST API

Build integrations, automate workflows, and manage your entire Deskwoot account programmatically. All endpoints use JSON and return standard HTTP status codes.

Base URL: https://deskwoot.com/api/v1

Authentication

The Deskwoot API uses bearer token authentication. API tokens can be created in your account settings under Settings > API Tokens. API access requires the Enterprise plan.

Include your API token in the Authorization header of every request:

curl https://deskwoot.com/api/v1/accounts/{account_id}/contacts \
  -H "Authorization: Bearer dw_your_api_token_here" \
  -H "Content-Type: application/json"

Token format

All API tokens start with the prefix dw_ followed by 64 hex characters. Tokens are shown only once at creation time. Store them securely.

Scopes

Each token has one or more scopes that control which resources it can access. The broad read and write scopes cover all resources. Use narrow scopes for least-privilege access.

ParameterTypeRequiredDescription
readscopeOptionalRead access to all resources
writescopeOptionalWrite access to all resources
contacts:readscopeOptionalRead contacts only
contacts:writescopeOptionalCreate and update contacts
conversations:readscopeOptionalRead conversations and messages
conversations:writescopeOptionalUpdate conversations and send messages

Errors

The API returns standard HTTP status codes. Errors include a JSON body with an error field describing the problem.

ParameterTypeRequiredDescription
200OKOptionalRequest succeeded
201CreatedOptionalResource created
400Bad RequestOptionalInvalid parameters or missing required fields
401UnauthorizedOptionalMissing or invalid API token
403ForbiddenOptionalToken lacks required scope or feature not available on your plan
404Not FoundOptionalResource does not exist
409ConflictOptionalResource already exists (e.g. duplicate email)
500Server ErrorOptionalUnexpected error on our side

Error response example

{
  "error": "Label with this title already exists"
}

Conversations

GET/v1/conversations/{conversationId}

Retrieve a single conversation with its contact, inbox, assignee, team, labels, and messages.

Auth: Bearer token (conversations:read) or session

Response

{
  "id": "clx1abc...",
  "status": "OPEN",
  "priority": "MEDIUM",
  "inboxId": "clx2def...",
  "contactId": "clx3ghi...",
  "assigneeId": "clx4jkl...",
  "teamId": null,
  "muted": false,
  "lastActivityAt": "2026-03-14T10:30:00Z",
  "createdAt": "2026-03-13T08:00:00Z",
  "contact": { "id": "...", "name": "Lisa", "email": "lisa@example.com" },
  "inbox": { "id": "...", "name": "Live Chat", "channelType": "WEB" },
  "assignee": { "id": "...", "name": "Jan", "email": "jan@deskwoot.com" },
  "labels": [{ "id": "...", "title": "VIP", "color": "#6366F1" }],
  "messages": [...]
}
PATCH/v1/conversations/{conversationId}

Update a conversation's status, priority, assignee, or team.

Auth: Bearer token (conversations:write) or session

ParameterTypeRequiredDescription
statusstringOptionalOPEN, RESOLVED, PENDING, or SNOOZED
prioritystring | nullOptionalURGENT, HIGH, MEDIUM, LOW, or null to clear
assigneeIdstring | nullOptionalAgent ID to assign, or null to unassign
teamIdstring | nullOptionalTeam ID to assign, or null to unassign
mutedbooleanOptionalMute notifications for this conversation

Example

curl -X PATCH https://deskwoot.com/api/v1/conversations/{id} \
  -H "Authorization: Bearer dw_your_token" \
  -H "Content-Type: application/json" \
  -d '{"status": "RESOLVED", "priority": null}'
POST/v1/accounts/{accountId}/conversations/bulk

Update multiple conversations at once. Supports status changes, assignments, priority, labels, and muting.

Auth: Bearer token (conversations:write) or session

ParameterTypeRequiredDescription
conversationIdsstring[]RequiredArray of conversation IDs
actionstringRequiredchange_status, assign_agent, assign_team, change_priority, add_label, or mute
valuestring | nullOptionalThe target value for the action

Example

curl -X POST https://deskwoot.com/api/v1/accounts/{accountId}/conversations/bulk \
  -H "Authorization: Bearer dw_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "conversationIds": ["conv_1", "conv_2", "conv_3"],
    "action": "change_status",
    "value": "RESOLVED"
  }'

Messages

GET/v1/conversations/{conversationId}/messages

List all messages in a conversation, including sender info and attachments.

Auth: Bearer token (conversations:read) or session

Response

[
  {
    "id": "clx5mno...",
    "content": "Hi, I need help with my order.",
    "messageType": "INCOMING",
    "private": false,
    "createdAt": "2026-03-14T10:00:00Z",
    "sender": { "id": "...", "name": "Lisa", "type": "contact" },
    "attachments": []
  },
  {
    "id": "clx6pqr...",
    "content": "Sure, let me look into that for you!",
    "messageType": "OUTGOING",
    "private": false,
    "createdAt": "2026-03-14T10:02:00Z",
    "sender": { "id": "...", "name": "Jan", "type": "user" },
    "attachments": []
  }
]
POST/v1/conversations/{conversationId}/messages

Send a new message in a conversation. The message is delivered to the customer through the original channel.

Auth: Bearer token (conversations:write) or session

ParameterTypeRequiredDescription
contentstringRequiredMessage text
privatebooleanOptionalIf true, the message is only visible to agents (internal note). Default: false
messageTypestringOptionalOUTGOING (default) or INCOMING

Example

curl -X POST https://deskwoot.com/api/v1/conversations/{id}/messages \
  -H "Authorization: Bearer dw_your_token" \
  -H "Content-Type: application/json" \
  -d '{"content": "Your order has been shipped!", "private": false}'
POST/v1/conversations/{conversationId}/attachments

Upload a file attachment to a conversation. Max file size: 10 MB.

Auth: Bearer token (conversations:write) or session

Example

curl -X POST https://deskwoot.com/api/v1/conversations/{id}/attachments \
  -H "Authorization: Bearer dw_your_token" \
  -F "file=@invoice.pdf" \
  -F "content=Here is your invoice."
POST/v1/conversations/{conversationId}/labels

Add a label to a conversation.

Auth: Bearer token (conversations:write) or session

ParameterTypeRequiredDescription
labelIdstringRequiredThe label ID to add
DELETE/v1/conversations/{conversationId}/labels?labelId={labelId}

Remove a label from a conversation.

Auth: Bearer token (conversations:write) or session

Contacts

GET/v1/accounts/{accountId}/contacts

List contacts with optional search and segment filtering. Supports pagination.

Auth: Bearer token (contacts:read) or session

ParameterTypeRequiredDescription
searchstringOptionalSearch by name, email, or phone number
segmentstringOptionalFilter: active-7d, active-30d, no-email, has-email, has-phone, new
pagenumberOptionalPage number (default: 1)
pageSizenumberOptionalItems per page (default: 25)

Response

{
  "contacts": [
    {
      "id": "clx7stu...",
      "name": "Lisa Schmidt",
      "email": "lisa@example.com",
      "phone": "+49 170 1234567",
      "avatarUrl": null,
      "company": "Acme GmbH",
      "lastActivityAt": "2026-03-14T09:00:00Z",
      "createdAt": "2026-01-15T12:00:00Z"
    }
  ],
  "total": 142,
  "page": 1,
  "pageSize": 25
}
POST/v1/accounts/{accountId}/contacts/merge

Merge two contact records into one. The primary contact keeps its data; the secondary contact's conversations are moved over.

Auth: Bearer token (contacts:write) or session

ParameterTypeRequiredDescription
primaryContactIdstringRequiredThe contact to keep
secondaryContactIdstringRequiredThe contact to merge and delete

Inboxes

GET/v1/accounts/{accountId}/inboxes

List all inboxes in your account.

Auth: Bearer token (read) or session

Response

[
  {
    "id": "clx8uvw...",
    "name": "Website Chat",
    "channelType": "WEB",
    "greeting": "Hi! How can we help?",
    "greetingEnabled": true,
    "enableAutoAssign": true,
    "csatEnabled": true,
    "createdAt": "2026-01-01T00:00:00Z"
  },
  {
    "id": "clx9xyz...",
    "name": "Support Email",
    "channelType": "EMAIL",
    "emailAddress": "support@acme.com",
    "createdAt": "2026-01-01T00:00:00Z"
  }
]
POST/v1/accounts/{accountId}/inboxes

Create a new inbox. Supported channel types: WEB, EMAIL, TELEGRAM, WHATSAPP, SMS, LINE, TWITTER.

Auth: Session (permission: settings.manage_inboxes)

ParameterTypeRequiredDescription
namestringRequiredDisplay name for the inbox
channelTypestringRequiredWEB, EMAIL, TELEGRAM, WHATSAPP, SMS, LINE, or TWITTER
greetingstringOptionalWelcome message shown to visitors
greetingEnabledbooleanOptionalShow greeting message (default: false)
enableAutoAssignbooleanOptionalAuto-assign to available agents (default: true)
botEnabledbooleanOptionalEnable AI bot for this inbox
agentBotIdstringOptionalBot ID to use when botEnabled is true

Example: Create Telegram inbox

curl -X POST https://deskwoot.com/api/v1/accounts/{accountId}/inboxes \
  -H "Authorization: Bearer dw_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Telegram Support",
    "channelType": "TELEGRAM",
    "telegramBotToken": "123456:ABC-DEF..."
  }'
GET/v1/accounts/{accountId}/inboxes/{inboxId}

Get full details for a single inbox.

Auth: Bearer token (read) or session

PATCH/v1/accounts/{accountId}/inboxes/{inboxId}

Update inbox settings such as name, greeting, auto-assign mode, CSAT, business hours, widget color, and bot configuration.

Auth: Session (permission: settings.manage_inboxes)

DELETE/v1/accounts/{accountId}/inboxes/{inboxId}

Delete an inbox and all associated data. This action cannot be undone.

Auth: Session (permission: settings.manage_inboxes)

Agents

GET/v1/accounts/{accountId}/agents

List all agents (team members) in your account, including their role and custom role.

Auth: Bearer token (read) or session

Response

{
  "agents": [
    {
      "user": {
        "id": "clx_user1",
        "name": "Jan",
        "email": "jan@deskwoot.com",
        "avatarUrl": null
      },
      "role": "ADMINISTRATOR",
      "customRole": null
    }
  ],
  "maxAgents": 10,
  "plan": "ENTERPRISE"
}
POST/v1/accounts/{accountId}/agents

Invite a new agent to your account. An invitation email is sent automatically.

Auth: Session (admin only)

ParameterTypeRequiredDescription
namestringRequiredFull name of the new agent
emailstringRequiredEmail address
rolestringOptionalAGENT (default) or ADMINISTRATOR
customRoleIdstringOptionalID of a custom role to assign
PATCH/v1/accounts/{accountId}/agents/{agentId}

Update an agent's role.

Auth: Session (admin only)

ParameterTypeRequiredDescription
rolestringOptionalAGENT or ADMINISTRATOR
customRoleIdstring | nullOptionalCustom role ID or null to remove
DELETE/v1/accounts/{accountId}/agents/{agentId}

Remove an agent from your account.

Auth: Session (admin only)

Teams

Teams require the Business plan or higher.

GET/v1/accounts/{accountId}/teams

List all teams with their member count.

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/teams

Create a new team.

Auth: Session (permission: settings.manage_teams)

ParameterTypeRequiredDescription
namestringRequiredTeam name
descriptionstringOptionalTeam description
allowAutoAssignbooleanOptionalAllow auto-assignment to this team (default: true)
GET/v1/accounts/{accountId}/teams/{teamId}

Get a team with its full member list.

Auth: Bearer token (read) or session

PATCH/v1/accounts/{accountId}/teams/{teamId}

Update team name, description, or auto-assign setting.

Auth: Session (permission: settings.manage_teams)

DELETE/v1/accounts/{accountId}/teams/{teamId}

Delete a team.

Auth: Session (permission: settings.manage_teams)

POST/v1/accounts/{accountId}/teams/{teamId}/members

Add an agent to a team.

Auth: Session (permission: settings.manage_teams)

ParameterTypeRequiredDescription
userIdstringRequiredThe agent's user ID
DELETE/v1/accounts/{accountId}/teams/{teamId}/members

Remove an agent from a team.

Auth: Session (permission: settings.manage_teams)

ParameterTypeRequiredDescription
userIdstringRequiredThe agent's user ID

Labels

GET/v1/accounts/{accountId}/labels

List all labels in your account.

Auth: Bearer token (read) or session

Response

[
  {
    "id": "clx_label1",
    "title": "VIP",
    "color": "#6366F1",
    "description": "High-value customers",
    "showOnSidebar": true
  }
]
POST/v1/accounts/{accountId}/labels

Create a new label.

Auth: Session (permission: settings.manage_labels)

ParameterTypeRequiredDescription
titlestringRequiredLabel name
colorstringOptionalHex color code (default: "#6366F1")
descriptionstringOptionalLabel description
showOnSidebarbooleanOptionalShow in sidebar filter (default: true)
PATCH/v1/accounts/{accountId}/labels/{labelId}

Update a label's title, color, description, or visibility.

Auth: Session (permission: settings.manage_labels)

DELETE/v1/accounts/{accountId}/labels/{labelId}

Delete a label. It will be removed from all conversations.

Auth: Session (permission: settings.manage_labels)

Canned Responses

GET/v1/accounts/{accountId}/canned-responses

List all canned responses.

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/canned-responses

Create a canned response. Agents can use it by typing the short code in the message input.

Auth: Session (permission: settings.manage_canned_responses)

ParameterTypeRequiredDescription
shortCodestringRequiredTrigger shortcode (e.g. 'greeting')
contentstringRequiredResponse text. Supports {{contact.name}} variables.
PATCH/v1/accounts/{accountId}/canned-responses/{cannedResponseId}

Update a canned response.

Auth: Session (permission: settings.manage_canned_responses)

DELETE/v1/accounts/{accountId}/canned-responses/{cannedResponseId}

Delete a canned response.

Auth: Session (permission: settings.manage_canned_responses)

Macros

GET/v1/accounts/{accountId}/macros

List all public macros and your personal macros.

Auth: Bearer token (read) or session

Response

{
  "data": [
    {
      "id": "clx_macro1",
      "name": "Close and resolve",
      "visibility": "PUBLIC",
      "actions": [
        { "type": "change_status", "value": "RESOLVED" },
        { "type": "send_message", "value": "Thanks for reaching out! Closing this now." }
      ]
    }
  ]
}
POST/v1/accounts/{accountId}/macros

Create a new macro with one or more actions.

Auth: Bearer token (write) or session

ParameterTypeRequiredDescription
namestringRequiredMacro name
actionsarrayOptionalArray of action objects with type and value
visibilitystringOptionalPERSONAL (default) or PUBLIC
PATCH/v1/accounts/{accountId}/macros/{macroId}

Update a macro.

Auth: Bearer token (write) or session

DELETE/v1/accounts/{accountId}/macros/{macroId}

Delete a macro.

Auth: Bearer token (write) or session

Automation Rules

Automation rules require the Business plan or higher.

GET/v1/accounts/{accountId}/automation-rules

List all automation rules.

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/automation-rules

Create an automation rule with conditions and actions.

Auth: Session (permission: settings.manage_automation)

ParameterTypeRequiredDescription
namestringRequiredRule name
eventNamestringRequiredTrigger event: conversation_created, conversation_updated, or message_created
conditionsarrayOptionalArray of condition objects (attribute, operator, value)
actionsarrayOptionalArray of action objects (type, value)
activebooleanOptionalEnable the rule (default: true)

Example

curl -X POST https://deskwoot.com/api/v1/accounts/{accountId}/automation-rules \
  -H "Authorization: Bearer dw_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Auto-assign VIP to senior team",
    "eventName": "conversation_created",
    "conditions": [
      { "attribute": "label", "operator": "contains", "value": "VIP" }
    ],
    "actions": [
      { "type": "assign_team", "value": "senior-support-team-id" }
    ]
  }'
PATCH/v1/accounts/{accountId}/automation-rules/{ruleId}

Update an automation rule.

Auth: Session (permission: settings.manage_automation)

DELETE/v1/accounts/{accountId}/automation-rules/{ruleId}

Delete an automation rule.

Auth: Session (permission: settings.manage_automation)

Campaigns

Campaigns require the Business plan or higher.

GET/v1/accounts/{accountId}/campaigns

List all campaigns (ongoing and one-off).

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/campaigns

Create a new campaign.

Auth: Session (permission: settings.manage_campaigns)

ParameterTypeRequiredDescription
titlestringRequiredCampaign title
messagestringRequiredMessage content
campaignTypestringOptionalONGOING or ONE_OFF (default: ONGOING)
inboxIdstringOptionalInbox to send from
scheduledAtstringOptionalISO date for one-off campaigns
audienceobjectOptionalAudience targeting rules
GET/v1/accounts/{accountId}/campaigns/{campaignId}

Get campaign details.

Auth: Bearer token (read) or session

PATCH/v1/accounts/{accountId}/campaigns/{campaignId}

Update a campaign.

Auth: Session (permission: settings.manage_campaigns)

POST/v1/accounts/{accountId}/campaigns/{campaignId}/send

Send a one-off campaign immediately.

Auth: Session (permission: settings.manage_campaigns)

DELETE/v1/accounts/{accountId}/campaigns/{campaignId}

Delete a campaign.

Auth: Session (permission: settings.manage_campaigns)

Webhooks

Webhooks let you receive real-time HTTP notifications when events happen in your Deskwoot account. Every webhook payload is signed with HMAC-SHA256 so you can verify authenticity.

Verifying webhook signatures

Each webhook request includes an X-Deskwoot-Signature header. Compute the HMAC-SHA256 of the raw request body using your webhook secret, and compare it to the header value.

Verification example (Node.js)

import crypto from "crypto";

function verifyWebhook(body, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(body)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

Event types

ParameterTypeRequiredDescription
message.createdeventOptionalA new message was sent or received in a conversation
conversation.updatedeventOptionalA conversation's status, assignee, team, or priority changed
conversation.createdeventOptionalA new conversation was started
contact.createdeventOptionalA new contact was created
contact.updatedeventOptionalA contact's details were updated
GET/v1/accounts/{accountId}/webhooks

List all webhooks.

Auth: Session (admin only)

POST/v1/accounts/{accountId}/webhooks

Create a webhook. A signing secret is generated automatically and returned in the response.

Auth: Session (admin only)

ParameterTypeRequiredDescription
urlstringRequiredThe HTTPS URL to receive webhook events
subscriptionsstring[]OptionalEvent types to subscribe to (default: all events)

Example

curl -X POST https://deskwoot.com/api/v1/accounts/{accountId}/webhooks \
  -H "Authorization: Bearer dw_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-app.com/webhooks/deskwoot",
    "subscriptions": ["message.created", "conversation.updated"]
  }'

Response

{
  "id": "clx_wh1",
  "url": "https://your-app.com/webhooks/deskwoot",
  "subscriptions": ["message.created", "conversation.updated"],
  "secret": "whsec_a1b2c3d4e5f6...",
  "createdAt": "2026-03-14T12:00:00Z"
}
PATCH/v1/accounts/{accountId}/webhooks/{webhookId}

Update a webhook's URL or subscriptions.

Auth: Session (admin only)

DELETE/v1/accounts/{accountId}/webhooks/{webhookId}

Delete a webhook.

Auth: Session (admin only)

API Tokens

API tokens require the Enterprise plan.

GET/v1/accounts/{accountId}/api-tokens

List all API tokens. The actual token value is not included for security.

Auth: Session (admin only)

Response

[
  {
    "id": "clx_tk1",
    "name": "Production Integration",
    "scopes": ["read", "write"],
    "lastUsedAt": "2026-03-14T10:00:00Z",
    "expiresAt": null,
    "createdAt": "2026-02-01T00:00:00Z"
  }
]
POST/v1/accounts/{accountId}/api-tokens

Create a new API token. The token value is only shown once in the response.

Auth: Session (admin only)

ParameterTypeRequiredDescription
namestringOptionalA descriptive name for the token
scopesstring[]OptionalArray of scopes (default: ["read", "write"])
expiresAtstringOptionalISO date when the token expires (optional, never expires if omitted)
DELETE/v1/accounts/{accountId}/api-tokens/{tokenId}

Revoke an API token. It will immediately stop working.

Auth: Session (admin only)

Bots

GET/v1/accounts/{accountId}/bots

List all AI bots. API keys are masked in the response.

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/bots

Create a new AI bot.

Auth: Session (permission: bots.manage)

ParameterTypeRequiredDescription
namestringRequiredBot name
aiProviderstringOptionalAI provider: openai, anthropic, google, groq, or custom
aiApiKeystringOptionalYour AI provider API key
aiModelstringOptionalModel name (e.g. gpt-4o, claude-sonnet-4-20250514)
systemPromptstringOptionalCustom instructions for the bot
useHelpCenterbooleanOptionalLet the bot use your help center articles as context
temperaturenumberOptionalCreativity level 0-1 (default: 0.3)
maxTokensnumberOptionalMax response length 100-2000 (default: 500)
PATCH/v1/accounts/{accountId}/bots/{botId}

Update a bot's settings.

Auth: Session (permission: bots.manage)

DELETE/v1/accounts/{accountId}/bots/{botId}

Delete a bot.

Auth: Session (permission: bots.manage)

POST/v1/accounts/{accountId}/bots/test

Test a bot's response with a sample message.

Auth: Session (permission: bots.manage)

ParameterTypeRequiredDescription
botIdstringRequiredBot ID to test
messagestringRequiredTest message

Custom Attributes

Custom attributes require the Business plan or higher.

GET/v1/accounts/{accountId}/custom-attributes

List custom attribute definitions. Use ?model=CONVERSATION or ?model=CONTACT to filter.

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/custom-attributes

Create a custom attribute definition.

Auth: Session (admin only)

ParameterTypeRequiredDescription
attributeDisplayNamestringRequiredDisplay name shown in the UI
attributeKeystringRequiredUnique key used in API (snake_case)
attributeDisplayTypestringOptionalTEXT, NUMBER, LINK, DATE, LIST, or CHECKBOX (default: TEXT)
attributeModelstringOptionalCONVERSATION or CONTACT (default: CONVERSATION)
attributeValuesstring[]OptionalPredefined values for LIST type
PATCH/v1/accounts/{accountId}/custom-attributes/{attributeId}

Update a custom attribute.

Auth: Session (admin only)

DELETE/v1/accounts/{accountId}/custom-attributes/{attributeId}

Delete a custom attribute.

Auth: Session (admin only)

Custom Roles

GET/v1/accounts/{accountId}/custom-roles

List all custom roles with their permissions.

Auth: Session (admin only)

POST/v1/accounts/{accountId}/custom-roles

Create a custom role with granular permissions.

Auth: Session (admin only)

ParameterTypeRequiredDescription
namestringRequiredRole name
descriptionstringOptionalRole description
permissionsobjectOptionalPermission flags (e.g. conversations.manage, settings.manage_inboxes)
PATCH/v1/accounts/{accountId}/custom-roles/{roleId}

Update a custom role.

Auth: Session (admin only)

DELETE/v1/accounts/{accountId}/custom-roles/{roleId}

Delete a custom role.

Auth: Session (admin only)

SLA Policies

SLA policies require the Business plan or higher.

GET/v1/accounts/{accountId}/sla-policies

List all SLA policies with conversation counts.

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/sla-policies

Create an SLA policy.

Auth: Session (admin only)

ParameterTypeRequiredDescription
namestringRequiredPolicy name
descriptionstringOptionalPolicy description
firstResponseTimeThresholdnumberOptionalMax seconds for first response
nextResponseTimeThresholdnumberOptionalMax seconds between responses
resolutionTimeThresholdnumberOptionalMax seconds to resolve
onlyDuringBusinessHoursbooleanOptionalOnly count time during business hours (default: false)
PATCH/v1/accounts/{accountId}/sla-policies/{policyId}

Update an SLA policy.

Auth: Session (admin only)

DELETE/v1/accounts/{accountId}/sla-policies/{policyId}

Delete an SLA policy.

Auth: Session (admin only)

Business Hours

GET/v1/accounts/{accountId}/business-hours

Get your account's business hours configuration.

Auth: Bearer token (read) or session

Response

{
  "enabled": true,
  "timezone": "Europe/Berlin",
  "schedule": [
    { "day": "monday", "enabled": true, "openHour": 9, "openMinute": 0, "closeHour": 17, "closeMinute": 0 },
    { "day": "tuesday", "enabled": true, "openHour": 9, "openMinute": 0, "closeHour": 17, "closeMinute": 0 },
    { "day": "saturday", "enabled": false, "openHour": 0, "openMinute": 0, "closeHour": 0, "closeMinute": 0 },
    { "day": "sunday", "enabled": false, "openHour": 0, "openMinute": 0, "closeHour": 0, "closeMinute": 0 }
  ]
}
PUT/v1/accounts/{accountId}/business-hours

Set business hours. Provide the full schedule.

Auth: Session (permission: settings.manage_account)

Help Center (Portals)

GET/v1/accounts/{accountId}/portals

List your help center portals with article and category counts.

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/portals

Create a new help center portal.

Auth: Session only

ParameterTypeRequiredDescription
namestringRequiredPortal name
slugstringRequiredURL slug (e.g. 'help')
headerTextstringOptionalHeader text shown on the portal
brandColorstringOptionalBrand color hex (default: "#2563EB")
customDomainstringOptionalCustom domain for the portal
GET/v1/accounts/{accountId}/portals/{portalId}/articles

List articles in a portal.

Auth: Bearer token (read) or session

POST/v1/accounts/{accountId}/portals/{portalId}/articles

Create a new help center article.

Auth: Session only

ParameterTypeRequiredDescription
titlestringRequiredArticle title
contentstringRequiredArticle body (HTML supported)
slugstringOptionalURL slug (auto-generated from title if omitted)
categoryIdstringOptionalCategory to place the article in
statusstringOptionalDRAFT or PUBLISHED (default: DRAFT)
PATCH/v1/accounts/{accountId}/portals/{portalId}/articles/{articleId}

Update an article.

Auth: Session only

DELETE/v1/accounts/{accountId}/portals/{portalId}/articles/{articleId}

Delete an article.

Auth: Session only

Public Portal API (no authentication required)

These endpoints are publicly accessible and designed for embedding your help center in external websites or apps.

GET/v1/public/portals/{portalSlug}

Get public portal info with categories and article count.

Auth: None

GET/v1/public/portals/{portalSlug}/articles

List published articles. Supports search and pagination.

Auth: None

ParameterTypeRequiredDescription
categoryIdstringOptionalFilter by category
searchstringOptionalSearch articles by title or content
pagenumberOptionalPage number (default: 1)
limitnumberOptionalItems per page (default: 20, max: 50)
GET/v1/public/portals/{portalSlug}/articles/{articleSlug}

Get a single published article by slug.

Auth: None

Account Settings

GET/v1/accounts/{accountId}/settings

Get account settings including name, locale, timezone, plan, and feature flags.

Auth: Bearer token (read) or session

Response

{
  "id": "clx_acc1",
  "name": "Acme Support",
  "locale": "en",
  "timezone": "Europe/Berlin",
  "plan": "ENTERPRISE",
  "autoResolveEnabled": true,
  "autoResolveDuration": 48,
  "brandColor": "#2563EB",
  "liveTranslateEnabled": true,
  "liveTranslateTargetLang": "en",
  "createdAt": "2026-01-01T00:00:00Z"
}
PATCH/v1/accounts/{accountId}/settings

Update account settings.

Auth: Session (permission: settings.manage_account)

ParameterTypeRequiredDescription
namestringOptionalAccount name
localestringOptionalDefault locale (e.g. en, de)
timezonestringOptionalIANA timezone (e.g. Europe/Berlin)
autoResolveEnabledbooleanOptionalAuto-resolve inactive conversations
autoResolveDurationnumberOptionalHours of inactivity before auto-resolve
brandColorstringOptionalBrand color hex code
liveTranslateEnabledbooleanOptionalEnable live translation
liveTranslateTargetLangstringOptionalTarget language for translation

Notifications

GET/v1/accounts/{accountId}/notifications

Get paginated notifications for the current user.

Auth: Session only

Response

{
  "data": [
    {
      "id": "clx_notif1",
      "type": "conversation_assigned",
      "read": false,
      "createdAt": "2026-03-14T10:00:00Z",
      "conversation": { "id": "...", "contactName": "Lisa" }
    }
  ],
  "meta": {
    "page": 1,
    "pageSize": 20,
    "total": 45,
    "unreadCount": 3
  }
}
PATCH/v1/accounts/{accountId}/notifications

Mark notifications as read.

Auth: Session only

ParameterTypeRequiredDescription
markAllReadbooleanOptionalSet to true to mark all as read
notificationIdstringOptionalOr mark a single notification as read

Audit Logs

Audit logs require the Enterprise plan.

GET/v1/accounts/{accountId}/audit-logs

Get paginated audit logs for your account. Admin only.

Auth: Session (admin only)

ParameterTypeRequiredDescription
pagenumberOptionalPage number (default: 1)

Response

{
  "data": [
    {
      "id": "clx_log1",
      "action": "inbox.created",
      "actor": { "name": "Jan", "email": "jan@deskwoot.com" },
      "details": { "inboxName": "WhatsApp" },
      "createdAt": "2026-03-14T08:00:00Z"
    }
  ],
  "meta": { "page": 1, "pageSize": 25, "total": 200, "totalPages": 8 }
}

Billing

GET/v1/accounts/{accountId}/billing

Get billing information for your account.

Auth: Session (permission: settings.manage_billing)

Response

{
  "plan": "ENTERPRISE",
  "status": "ACTIVE",
  "agentSeats": 10,
  "activeAgents": 4,
  "trialEndsAt": null,
  "currentPeriodEnd": "2026-04-01T00:00:00Z"
}

Rate limits

API requests are limited to 60 requests per minute per API token. If you exceed the limit, you will receive a 429 Too Many Requests response. Wait and retry after the window resets.

Need higher limits? Contact us to discuss your requirements.

Need help?

If you have questions about the API or need help with your integration, reach out to support@deskwoot.com or use the live chat on our website.