The skill catalog
Skills drive ACD routing: a queue declares the tags it needs, an agent carries the tags they hold, and the dispatcher only bridges a waiting call onto a member whose skills cover the queue’s requirement. That matching only works if every skill label means the same thing everywhere. The skill catalog is the tenant-scoped list of skills that routing accepts — queues and agents are configured against it, so a misspelled tag is rejected at write time instead of silently deadlocking your queue. Catalog rows scoped to your organization live under one API group,/api/v1/voice/skill-catalog. The dispatcher treats any tag not on the active list as unmatchable, and the write paths treat it as an error. This page covers the validation boundary, the endpoints that manage the list, and the two lifecycle layers on top of it: certifications and proficiency decay.
1. Why routing needs a canonical list
Without a catalog, any submitted skill string is accepted into a queue’s or agent’sskills[] array. The dispatcher intersects tags purely on string equality, so a queue that requires spainsh never matches an agent tagged spanish — the caller waits untouched until overflow routes them out, and nothing raises an error.
The catalog closes that class of failure at the configuration boundary. Define the skill universe once per organization; every queue or agent write that names an unknown tag fails with a 422 validation error. Soft-delete a skill and queued writes that still name it fail the same way. Skills are validated — not attracted through a global list — so each tenant governs its own vocabulary.
2. Where the validation boundary sits
Two parts of the write surface checkskills[] against the active catalog before persisting:
- Queue configuration — creating a queue or updating its skill set validates every tag. An unknown or soft-deleted slug returns
422 UNKNOWN_SKILLwith the rejected tags named in the error, and the queue is not written. - Agent skill assignment — updating an agent’s skill list applies the same check, so a typo never reaches the dispatcher’s eligibility filter.
skills[] array is valid — it is the wildcard “any skill” membership the dispatch model describes (see The ACD queue model). The gate only rejects unknown tags, never an empty list.
The error response identifies the exact rejected tags (capped at ten in the message, with the full set in the error details) so the setup toast or API client can name them inline:
3. Managing the catalog
Four endpoints under/api/v1/voice/skill-catalog:
Example — register a skill:
4. Skill certifications — enforceable windows
Certifications put a time bound on a skill membership: regulated queues (HIPAA handling, financial-services licensing, insurance producer lines) must only dispatch to agents whose certification for the required skill is still current. The endpoints under/api/v1/voice/skill-certifications:
Every certification names a skill that must already exist in the catalog — a certificate for an unregistered slug is meaningless, so it is rejected with the same 422 the queue and agent writes raise. Certify the tag, then configure certification.
5. Proficiency decay — skill atrophy as a policy
Agents carry a 1–5 proficiency level per skill. If a proficiency decays — an agent sits off-shift or rotates to other queues — the skill’s routing weight should fall below its certified peak until the agent is recertified. The decay policy automates that: a scheduled sweep reads the tenant policy and steps each drifting level down through configurable bands. Read the current policy withGET /api/v1/voice/skill-proficiency-decay and replace it with PUT on the same path:
enabled— opt-in toggle, default off. Nothing decays until you turn it on.bands— the step-down schedule. When a level’s remaining fraction of its validity window falls at or below a band bound, its cap applies. Omitbandsto use the defaults shown on GET.exemptSkills— slugs the sweep never decays (regulated skills whose proficiency must stay pinned at the certified level).