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 ReferenceThe same endpoints are available in the API Reference, where requests can be built and sent with Try It.
Overview
| Base URL | https://<hostname>.xima.cloud/rest/api |
| Authentication | Bearer token from an API Service User |
| Request and response format | JSON. Request-level errors use the { "exception", "message" } shape — see Error |
| Limits | Up 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 SkillsThere 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
| Method | Path | Summary |
|---|---|---|
GET | /v1/skills | List all skills |
GET | /v1/skills/{id} | Read one skill in full |
POST | /v1/skills/create | Create a skill |
PATCH | /v1/skills/{id} | Edit a skill |
PATCH | /v1/skills | Create 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization | header | string | Yes | Bearer <api_bearer_token> |
Responses
| Code | Description |
|---|---|
200 OK | A SkillList |
401 Unauthorized | Missing 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
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | The skill's id |
Authorization | header | string | Yes | Bearer <api_bearer_token> |
Responses
| Code | Description |
|---|---|
200 OK | A SkillDetail |
401 Unauthorized | Missing or invalid token |
404 Not Found | No skill with that id |
Example Response — 200 OK
200 OKThe 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization | header | string | Yes | Bearer <api_bearer_token> |
Content-Type | header | string | Yes | application/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
| Code | Description |
|---|---|
200 OK | A WriteResponse with one CREATED result. The new skill's id is in results[0].id |
400 Bad Request | skillName 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 Unauthorized | Missing or invalid token |
409 Conflict | A skill with that name already exists, or the extension is already in use |
429 Too Many Requests | Another 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | The skill's id |
Authorization | header | string | Yes | Bearer <api_bearer_token> |
Content-Type | header | string | Yes | application/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
| Code | Description |
|---|---|
200 OK | A WriteResponse with one UPDATED result |
400 Bad Request | A rename was attempted, no body supplied, or the body or agents list could not be read |
401 Unauthorized | Missing or invalid token |
404 Not Found | No skill with that id |
409 Conflict | The extension is already in use by another skill |
429 Too Many Requests | Another 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 SkillsEach 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization | header | string | Yes | Bearer <api_bearer_token> |
Content-Type | header | string | Yes | application/json |
Request Body
{
"skills": [
{
"settings": {
"skillName": "Overflow Team",
"extension": "2400"
}
},
{
"id": "70f9cf55-0963-44b7-88de-cb154f1dc598",
"settings": {
"priority": 5
},
"agents": [
{
"agent": "Agent Kelly(556)",
"skillLevel": 8
}
]
}
]
}Responses
| Code | Description |
|---|---|
200 OK | A WriteResponse with one result per item, in request order. Check each status and summary.rejected |
400 Bad Request | No skills supplied |
401 Unauthorized | Missing or invalid token |
413 Payload Too Large | More than 500 items. Split into smaller batches |
429 Too Many Requests | Another 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | The skill's id |
Authorization | header | string | Yes | Bearer <api_bearer_token> |
Content-Type | header | string | Yes | application/json |
Request Body
{
"extension": "2101"
}Responses
| Code | Description |
|---|---|
200 OK | A WriteResponse with one DELETED result |
400 Bad Request | No body, or the confirmation does not match the skill |
401 Unauthorized | Missing or invalid token |
404 Not Found | No skill with that id |
409 Conflict | Blocked 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 Requests | Another write is in progress. Retry |
Deleting a Skill Affects Historical ReportingSkills 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
| Field | Type | Description |
|---|---|---|
skills | array of SkillSummary | Every skill, sorted by name |
SkillSummary
| Field | Type | Description |
|---|---|---|
id | string | The skill's id |
name | string | The skill's name |
extension | string | The skill's extension. Omitted for a skill that has none |
isDefault | boolean | Whether this is the tenant's default skill |
SkillDetail
| Field | Type | Description |
|---|---|---|
id, name, extension, isDefault | As in SkillSummary | |
settings | SkillSettings | The skill's settings, in the shape the write endpoints accept |
agents | array of AgentMembership | Agents who are both assigned to the skill (skill level above 0) and currently licensed |
SkillSettings
All fields are optional except skillName on a create.
| Field | Type | Description |
|---|---|---|
skillName | string | Required on create. Must be unique. Cannot be changed |
extension | string | Must be unique. Can be changed |
aliasNumbers | array of string | Additional numbers or extensions routing to this skill |
priority | integer | Higher wins when an agent serves several skills |
recordingMode | string | UNDEFINED · AUTOMATIC · AUTOMATIC_PAUSING_PROHIBITED · MANUAL · NEVER. Omit to defer to each agent's own mode |
voiceSettings | VoiceSettings | Routing, queue, and voicemail settings |
callbackSettings | CallbackSettings | Queue callback settings |
messagingSettings | MessagingSettings | Chat and messaging settings |
VoiceSettings
| Field | Type | Description |
|---|---|---|
routingAlgorithm | string | MOST_IDLE · CIRCULAR · LINEAR · HIGHEST_SKILL · NO_ROUTING |
availabilityTiers | object | { "tiers": [] } — empty offers to all eligible agents at once |
languagePackId | string | Language for system prompts |
queueAnnouncements | object | announcements (each with startTimeSeconds, repeatIntervalSeconds, repeatLimit, announcementName, isCallbackRelated) and endOfQueueAnnouncement. A repeatLimit of 2147483647 repeats indefinitely |
queueMusic | string | Queue music name — see Manage Music Files |
queueTimeout | object | timeoutMillis plus a Destination |
queueOverflow | object | overflowCondition (NEVER · NO_AGENTS_ENABLED · NO_AGENTS_READY), checkFrequencySeconds, plus a Destination |
maxCallsInQueue | object | maxAllowed plus a Destination. 0 means uncapped |
clearCallsAtEndOfDay | object | endOfDayInSeconds plus a Destination; 0 disables |
digitActions | object | Keypress options while queued, keyed by digit, each a Destination. <Queued Callback Module> with NUMBER hands the caller to the queued-callback flow |
webrtcAutoAnswer | boolean | Connect browser agents without them answering |
agentRingTimeSeconds | integer | How long one agent rings before moving on |
transcriptLanguage | string | ENGLISH_US · ENGLISH_UK · ENGLISH_AU · FRENCH · FRENCH_CANADIAN · SPANISH · ITALIAN · DUTCH · DENMARK_DANISH · CHINESE_MANDARIN · CHINESE_CANTONESE |
skillVoicemail | object | enabled, greeting (audio id), emailAddresses |
Destination
Used by queueTimeout, queueOverflow, maxCallsInQueue, clearCallsAtEndOfDay, and digitActions.
| Field | Type | Description |
|---|---|---|
destinationType | string | SKILL · NUMBER · IVR · SKILL_VOICEMAIL |
destination | string | Another 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 RoutingA
SKILLdestination naming a skill that does not exist is cleared, which disables that routing entirely. The write succeeds with aCLEAREDwarning whoseeffectfield says so.
CallbackSettings
| Field | Type | Description |
|---|---|---|
callbackStrategy | string | NO_QCB (off) · WAIT_IN_QUEUE · RESERVE_AGENT |
callbackSnoozeSeconds | integer | Wait before retrying a failed attempt |
outboundDialCode | string | Prefix when dialing out — for example, "9" |
callbackOfferWindow | object | startSecondOfDay / endSecondOfDay. 0–86400 is all day |
callbackAttemptWindow | object | Same shape as callbackOfferWindow |
maxPendingCallbacks | integer | Maximum number of pending callbacks |
clearPendingCallbacks | string | NEVER · NIGHTLY · MIDNIGHT · AM_1–AM_11 · PM_12 · PM_1–PM_11 |
maxCallbackAttempts | integer | 0 is unlimited |
attemptToGuessNumber | boolean | Infer the callback number from caller ID |
includeEstimatedWaitTime | boolean | Speak the wait estimate when offering |
MessagingSettings
| Field | Type | Description |
|---|---|---|
inviteHeaderText | string | Header text on the chat invite |
whenAllAgentsBusy | object | option (HIDE · OFFER_EMAIL · OFFER_QUEUE), plus titleText and emailAddress |
whenNoAgentsLoggedIn | object | option (HIDE · OFFER_EMAIL) |
cannedMessages | array | Each with title, body, and isInitialMessage. $customerName and $agentName are substituted at send time. Keep at most one isInitialMessage: true |
customChatText | object | { "customizations": {} } — chat widget text overrides |
agentResponseTimeoutSeconds | integer | Idle agent before the chat is reclaimed |
externalPartyTimeoutSeconds | integer | Idle customer before the chat closes |
autoAnswer | boolean | Automatically 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.
| Field | Type | Description |
|---|---|---|
agent | string | The name(extension) key, exactly as Read One Skill returns it. The unambiguous option |
name + extension | string | Alternative to agent. Use both together |
skillLevel | integer | 1–10 to assign, 0 to remove. Required when adding an agent who is not already in the skill |
maxSimultaneousSessions | integer | Concurrent interactions |
voiceEnabled / chatEnabled / emailEnabled | boolean | Per-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
| Field | Type | Description |
|---|---|---|
skills | array | Required. Up to 500 items, each with id (present to edit, absent to create), settings (SkillSettings), and optional agents (array of AgentMembership) |
SkillDeleteConfirmation
| Field | Type | Description |
|---|---|---|
extension | string | The skill's extension, as confirmation |
name | string | The skill's name — used instead of extension for a skill that has no extension |
WriteResponse
Returned by every write, single or bulk.
| Field | Type | Description |
|---|---|---|
results | array | One 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 |
summary | object | Counts: created, updated, deleted, rejected |
Warning
A part of the write that was adjusted; the rest of the write happened.
| Field | Type | Description |
|---|---|---|
field | string | The field that was adjusted |
submitted | string | The value sent |
action | string | DEFAULTED — 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 |
resolvedTo | string | The value applied instead, for DEFAULTED |
reason | string | Why the value was adjusted |
effect | string | What the adjustment means for routing, for CLEARED |
Error
The body of a request-level failure. Nothing was written.
| Field | Type | Description |
|---|---|---|
exception | string | The server's exception class name — for example, ApiConflictException |
message | string | For people |
Limits
| Limit | Description |
|---|---|
| Bulk size | 500 skills per request. More returns 413 |
| Concurrency | One write at a time across the whole tenant. Others get 429 — retry after a short wait, and never send writes in parallel |
| Rename | Not supported |
| Agent removal | Requires an explicit skillLevel: 0 |
See API Limits & Statuses for statuses shared by every CCaaS API.
Related Pages
- Skill Management APIs — behavior and integration recipes
- Data API — Agents
- Manage Skills
- API Service Users
- API Limits & Statuses
Updated about 1 hour ago
