Data API — Skills

API reference for listing, reading, creating, editing, and deleting CCaaS skills, including their voice, callback, and messaging settings and agent membership.

The Skills API lets an external system read and maintain CCaaS skills — their settings and which agents belong to them — one skill at a time or up to 500 per request. This page is the endpoint-by-endpoint reference. For how writes behave and integration recipes, see Skill Management APIs.

📘

Interactive Reference

The same endpoints are available in the API Reference, where requests can be built and sent with Try It.


Overview

Base URLhttps://<hostname>.xima.cloud/rest/api
AuthenticationBearer token from an API Service User
Request and response formatJSON. Request-level errors use the { "exception", "message" } shape — see Error
LimitsUp to 500 skills per bulk request, and one skill write at a time per tenant — see Limits

Authentication

Every request requires a Service User bearer token in the Authorization header:

Authorization: Bearer <api_bearer_token>

Service Users are created under API Enablement > API Service Users. See API Service Users.

⚠️

Any Valid Token Can Write Skills

There is no separate permission for skill administration. Any valid Service User token can create, edit, and delete skills, including tokens issued for other integrations. Every change is recorded in the settings audit log against the Service User that made it.

Identifying a Skill

Skills are addressed by their id (a UUID), not by name. List Skills returns every skill's id.

Endpoints

MethodPathSummary
GET/v1/skillsList all skills
GET/v1/skills/{id}Read one skill in full
POST/v1/skills/createCreate a skill
PATCH/v1/skills/{id}Edit a skill
PATCH/v1/skillsCreate and edit up to 500 skills at once
DELETE/v1/skills/{id}Delete a skill

List Skills

GET /v1/skills

Lists every skill, sorted by name.

Parameters

NameInTypeRequiredDescription
AuthorizationheaderstringYesBearer <api_bearer_token>

Responses

CodeDescription
200 OKA SkillList
401 UnauthorizedMissing or invalid token

Example Request

curl -L -X GET 'https://<hostname>.xima.cloud/rest/api/v1/skills' \
-H 'Authorization: Bearer <api_bearer_token>'

Example Response — 200 OK

{
  "skills": [
    {
      "id": "70f9cf55-0963-44b7-88de-cb154f1dc598",
      "name": "CC Sales",
      "extension": "2101",
      "isDefault": false
    },
    {
      "id": "28c4f023-a442-4f35-9a63-d65d82d6901d",
      "name": "CC Support",
      "extension": "2102",
      "isDefault": true
    }
  ]
}

Read One Skill

GET /v1/skills/{id}

Returns one skill in full — its settings and its agents. The settings object is the same shape the write endpoints accept, so a skill can be read, changed, and sent back.

Parameters

NameInTypeRequiredDescription
idpathstringYesThe skill's id
AuthorizationheaderstringYesBearer <api_bearer_token>

Responses

CodeDescription
200 OKA SkillDetail
401 UnauthorizedMissing or invalid token
404 Not FoundNo skill with that id

Example Response — 200 OK

The following example abbreviates settings:

{
  "id": "70f9cf55-0963-44b7-88de-cb154f1dc598",
  "name": "CC Sales",
  "extension": "2101",
  "isDefault": false,
  "settings": {
    "skillName": "CC Sales",
    "extension": "2101",
    "aliasNumbers": [],
    "priority": 10,
    "voiceSettings": {
      "routingAlgorithm": "LINEAR",
      "agentRingTimeSeconds": 30
    },
    "callbackSettings": {
      "callbackStrategy": "WAIT_IN_QUEUE"
    },
    "messagingSettings": {
      "inviteHeaderText": "Tell us about yourself"
    }
  },
  "agents": [
    {
      "agent": "Agent Kelly(556)",
      "name": "Agent Kelly",
      "extension": "556",
      "skillLevel": 10,
      "maxSimultaneousSessions": 2,
      "voiceEnabled": true,
      "chatEnabled": true,
      "emailEnabled": true
    }
  ]
}

Create a Skill

POST /v1/skills/create

Creates one skill. Only skillName is required; everything else takes a product default.

Parameters

NameInTypeRequiredDescription
AuthorizationheaderstringYesBearer <api_bearer_token>
Content-TypeheaderstringYesapplication/json

Request Body

A SkillSettings object, optionally with an agents array of AgentMembership entries.

{
  "skillName": "Customer Care",
  "extension": "2091",
  "priority": 10,
  "voiceSettings": {
    "routingAlgorithm": "LINEAR",
    "agentRingTimeSeconds": 30
  },
  "callbackSettings": {
    "callbackStrategy": "WAIT_IN_QUEUE"
  },
  "agents": [
    {
      "agent": "Agent Kelly(556)",
      "skillLevel": 10
    }
  ]
}

Responses

CodeDescription
200 OKA WriteResponse with one CREATED result. The new skill's id is in results[0].id
400 Bad RequestskillName missing, no body, the body could not be read (for example, a value that is not a valid choice for its field), or the agents list could not be read
401 UnauthorizedMissing or invalid token
409 ConflictA skill with that name already exists, or the extension is already in use
429 Too Many RequestsAnother write is in progress. Retry

Example Request

curl -L -X POST 'https://<hostname>.xima.cloud/rest/api/v1/skills/create' \
-H 'Authorization: Bearer <api_bearer_token>' \
-H 'Content-Type: application/json' \
-d '{"skillName":"Customer Care","extension":"2091"}'

Edit a Skill

PATCH /v1/skills/{id}

Edits one skill. Only the fields present change, at every level of nesting; an explicit null clears an optional setting. Lists and maps (aliasNumbers, cannedMessages, customChatText.customizations) are replaced whole. A skillName that differs from the current name is refused — skills cannot be renamed.

Parameters

NameInTypeRequiredDescription
idpathstringYesThe skill's id
AuthorizationheaderstringYesBearer <api_bearer_token>
Content-TypeheaderstringYesapplication/json

Request Body

A SkillSettings object containing only the fields to change, optionally with an agents array of AgentMembership entries.

{
  "callbackSettings": {
    "callbackStrategy": "NO_QCB"
  }
}

Responses

CodeDescription
200 OKA WriteResponse with one UPDATED result
400 Bad RequestA rename was attempted, no body supplied, or the body or agents list could not be read
401 UnauthorizedMissing or invalid token
404 Not FoundNo skill with that id
409 ConflictThe extension is already in use by another skill
429 Too Many RequestsAnother write is in progress. Retry

Create and Edit Many Skills

PATCH /v1/skills

Creates and edits up to 500 skills in one request. In each item, id present means edit and id absent means create. A failing item does not stop the others, and skill destinations are resolved after every skill in the request has been applied, so items do not need to be ordered.

✅

Use the Bulk Endpoint for More Than a Couple of Skills

Each write triggers a full configuration save and, on NetSapiens tenants, a complete dial-plan reconciliation. A bulk request does that once regardless of how many skills it carries.

Parameters

NameInTypeRequiredDescription
AuthorizationheaderstringYesBearer <api_bearer_token>
Content-TypeheaderstringYesapplication/json

Request Body

A SkillBulkWrite.

{
  "skills": [
    {
      "settings": {
        "skillName": "Overflow Team",
        "extension": "2400"
      }
    },
    {
      "id": "70f9cf55-0963-44b7-88de-cb154f1dc598",
      "settings": {
        "priority": 5
      },
      "agents": [
        {
          "agent": "Agent Kelly(556)",
          "skillLevel": 8
        }
      ]
    }
  ]
}

Responses

CodeDescription
200 OKA WriteResponse with one result per item, in request order. Check each status and summary.rejected
400 Bad RequestNo skills supplied
401 UnauthorizedMissing or invalid token
413 Payload Too LargeMore than 500 items. Split into smaller batches
429 Too Many RequestsAnother write is in progress. Retry

Delete a Skill

DELETE /v1/skills/{id}

Deletes one skill. The skill's extension must be sent in the body as confirmation — or, for a skill with no extension, its name.

Parameters

NameInTypeRequiredDescription
idpathstringYesThe skill's id
AuthorizationheaderstringYesBearer <api_bearer_token>
Content-TypeheaderstringYesapplication/json

Request Body

A SkillDeleteConfirmation.

{
  "extension": "2101"
}

Responses

CodeDescription
200 OKA WriteResponse with one DELETED result
400 Bad RequestNo body, or the confirmation does not match the skill
401 UnauthorizedMissing or invalid token
404 Not FoundNo skill with that id
409 ConflictBlocked by a guard: the skill is the tenant's default skill, has calls in queue, or is routed to by another skill (queue timeout, queue overflow, max calls in queue, or end-of-day overflow). The message names the referring skills
429 Too Many RequestsAnother write is in progress. Retry
⚠️

Deleting a Skill Affects Historical Reporting

Skills are recorded by name on completed interactions, so reports filtered on a deleted skill's name keep their history but gain no new data. IVR call flows that route to the skill are not checked before deletion.


Models

SkillList

FieldTypeDescription
skillsarray of SkillSummaryEvery skill, sorted by name

SkillSummary

FieldTypeDescription
idstringThe skill's id
namestringThe skill's name
extensionstringThe skill's extension. Omitted for a skill that has none
isDefaultbooleanWhether this is the tenant's default skill

SkillDetail

FieldTypeDescription
id, name, extension, isDefaultAs in SkillSummary
settingsSkillSettingsThe skill's settings, in the shape the write endpoints accept
agentsarray of AgentMembershipAgents who are both assigned to the skill (skill level above 0) and currently licensed

SkillSettings

All fields are optional except skillName on a create.

FieldTypeDescription
skillNamestringRequired on create. Must be unique. Cannot be changed
extensionstringMust be unique. Can be changed
aliasNumbersarray of stringAdditional numbers or extensions routing to this skill
priorityintegerHigher wins when an agent serves several skills
recordingModestringUNDEFINED · AUTOMATIC · AUTOMATIC_PAUSING_PROHIBITED · MANUAL · NEVER. Omit to defer to each agent's own mode
voiceSettingsVoiceSettingsRouting, queue, and voicemail settings
callbackSettingsCallbackSettingsQueue callback settings
messagingSettingsMessagingSettingsChat and messaging settings

VoiceSettings

FieldTypeDescription
routingAlgorithmstringMOST_IDLE · CIRCULAR · LINEAR · HIGHEST_SKILL · NO_ROUTING
availabilityTiersobject{ "tiers": [] } — empty offers to all eligible agents at once
languagePackIdstringLanguage for system prompts
queueAnnouncementsobjectannouncements (each with startTimeSeconds, repeatIntervalSeconds, repeatLimit, announcementName, isCallbackRelated) and endOfQueueAnnouncement. A repeatLimit of 2147483647 repeats indefinitely
queueMusicstringQueue music name — see Manage Music Files
queueTimeoutobjecttimeoutMillis plus a Destination
queueOverflowobjectoverflowCondition (NEVER · NO_AGENTS_ENABLED · NO_AGENTS_READY), checkFrequencySeconds, plus a Destination
maxCallsInQueueobjectmaxAllowed plus a Destination. 0 means uncapped
clearCallsAtEndOfDayobjectendOfDayInSeconds plus a Destination; 0 disables
digitActionsobjectKeypress options while queued, keyed by digit, each a Destination. <Queued Callback Module> with NUMBER hands the caller to the queued-callback flow
webrtcAutoAnswerbooleanConnect browser agents without them answering
agentRingTimeSecondsintegerHow long one agent rings before moving on
transcriptLanguagestringENGLISH_US · ENGLISH_UK · ENGLISH_AU · FRENCH · FRENCH_CANADIAN · SPANISH · ITALIAN · DUTCH · DENMARK_DANISH · CHINESE_MANDARIN · CHINESE_CANTONESE
skillVoicemailobjectenabled, greeting (audio id), emailAddresses

Destination

Used by queueTimeout, queueOverflow, maxCallsInQueue, clearCallsAtEndOfDay, and digitActions.

FieldTypeDescription
destinationTypestringSKILL · NUMBER · IVR · SKILL_VOICEMAIL
destinationstringAnother skill's name (not its id) for SKILL; a phone number or extension for NUMBER; an IVR call flow name for IVR; nothing for SKILL_VOICEMAIL, which requires skillVoicemail.enabled
⚠️

Missing Skill Destinations Disable Routing

A SKILL destination naming a skill that does not exist is cleared, which disables that routing entirely. The write succeeds with a CLEARED warning whose effect field says so.

CallbackSettings

FieldTypeDescription
callbackStrategystringNO_QCB (off) · WAIT_IN_QUEUE · RESERVE_AGENT
callbackSnoozeSecondsintegerWait before retrying a failed attempt
outboundDialCodestringPrefix when dialing out — for example, "9"
callbackOfferWindowobjectstartSecondOfDay / endSecondOfDay. 0–86400 is all day
callbackAttemptWindowobjectSame shape as callbackOfferWindow
maxPendingCallbacksintegerMaximum number of pending callbacks
clearPendingCallbacksstringNEVER · NIGHTLY · MIDNIGHT · AM_1–AM_11 · PM_12 · PM_1–PM_11
maxCallbackAttemptsinteger0 is unlimited
attemptToGuessNumberbooleanInfer the callback number from caller ID
includeEstimatedWaitTimebooleanSpeak the wait estimate when offering

MessagingSettings

FieldTypeDescription
inviteHeaderTextstringHeader text on the chat invite
whenAllAgentsBusyobjectoption (HIDE · OFFER_EMAIL · OFFER_QUEUE), plus titleText and emailAddress
whenNoAgentsLoggedInobjectoption (HIDE · OFFER_EMAIL)
cannedMessagesarrayEach with title, body, and isInitialMessage. $customerName and $agentName are substituted at send time. Keep at most one isInitialMessage: true
customChatTextobject{ "customizations": {} } — chat widget text overrides
agentResponseTimeoutSecondsintegerIdle agent before the chat is reclaimed
externalPartyTimeoutSecondsintegerIdle customer before the chat closes
autoAnswerbooleanAutomatically answer chats

AgentMembership

One agent's membership in a skill. In a write, listed agents are added or updated and unlisted agents are left alone; send skillLevel: 0 to remove an agent.

FieldTypeDescription
agentstringThe name(extension) key, exactly as Read One Skill returns it. The unambiguous option
name + extensionstringAlternative to agent. Use both together
skillLevelinteger1–10 to assign, 0 to remove. Required when adding an agent who is not already in the skill
maxSimultaneousSessionsintegerConcurrent interactions
voiceEnabled / chatEnabled / emailEnabledbooleanPer-channel participation

An agent entry that matches more than one agent, or no licensed agent, is skipped with an IGNORED warning; the rest of the skill still writes.

SkillBulkWrite

FieldTypeDescription
skillsarrayRequired. Up to 500 items, each with id (present to edit, absent to create), settings (SkillSettings), and optional agents (array of AgentMembership)

SkillDeleteConfirmation

FieldTypeDescription
extensionstringThe skill's extension, as confirmation
namestringThe skill's name — used instead of extension for a skill that has no extension

WriteResponse

Returned by every write, single or bulk.

FieldTypeDescription
resultsarrayOne per item, in request order, each with index, id, name, status (CREATED · UPDATED · DELETED · REJECTED), warnings, and errors. A rejected: true/false field may also appear; it duplicates status and can be ignored
summaryobjectCounts: created, updated, deleted, rejected

Warning

A part of the write that was adjusted; the rest of the write happened.

FieldTypeDescription
fieldstringThe field that was adjusted
submittedstringThe value sent
actionstringDEFAULTED — the value did not resolve, so the product default was applied (resolvedTo says what). CLEARED — the value did not resolve and there is no default, so the setting was left unset (read effect). IGNORED — the field name was not recognized, or an agent entry could not be matched
resolvedTostringThe value applied instead, for DEFAULTED
reasonstringWhy the value was adjusted
effectstringWhat the adjustment means for routing, for CLEARED

Error

The body of a request-level failure. Nothing was written.

FieldTypeDescription
exceptionstringThe server's exception class name — for example, ApiConflictException
messagestringFor people

Limits

LimitDescription
Bulk size500 skills per request. More returns 413
ConcurrencyOne write at a time across the whole tenant. Others get 429 — retry after a short wait, and never send writes in parallel
RenameNot supported
Agent removalRequires an explicit skillLevel: 0

See API Limits & Statuses for statuses shared by every CCaaS API.


Related Pages