makeCall, holdCall,
singleStepTransfer, and setAgentState, as short request/reply lines. State
changes come back to you as a live event stream.
What CSTA is
ECMA CSTA (Computer-Supported Telecommunications Applications, standardized as ECMA-269) is the long-established vendor-neutral API for third-party call control. It defines the operations that an external application uses to observe and manipulate calls and agents on a telephony system: make a call, clear a connection, hold, retrieve, transfer, consult, set agent state, and register as a route point. The application does not own the media itself. ClutchCall implements those operations as wire verbs on a control leg into the engine. The verb names map one-to-one to CSTA operations. If you drove CSTA before, the model is familiar. Your app sends a verb and gets a reply. It separately subscribes to a stream of CSTA events that describe what happened to the calls and agents that you touched.This API is the engine twin of the routing engine that the operator
console uses for its own agent workstation. Both surfaces speak the same
verbs. The console drives its built-in workstation. This API is for your
external ISV or SDK client. There is no behavioral fork. It is the same call
control, exposed for third parties.
When to use it
Third-party call control
Your backend or app must originate, hold, transfer, or clear live calls
programmatically. It does not run the AI pipeline; it controls the call.
Agent workstations
You build a custom softphone or agent desktop. You must set agent work
state (ready / not-ready / after-call-work) and pop calls on screen.
Route point / ACD brain
Your app registers as a route point and makes the routing decision. It
receives route requests and selects the destination, ACD-style.
CRM / ISV integration
You integrate an existing contact-center or CRM product. You want a
standards-based CTI link, not a proprietary one.
Connect
The CTI control leg runs on the engine over one of two transports. Both carry the same length-prefixed, correlated request/reply lines. Pick the one that fits your client.- WebSocket (wss)
- WebTransport (QUIC)
Open a secure WebSocket to the engine with the subprotocol
cti. This
is the simplest client to write. It works from any language with a
WebSocket library.<verb>\t<args-json>. Every request carries
a correlation id, so its reply can be matched. The very first line that you
send must be auth. The connection stays unauthenticated until auth
succeeds, and the engine refuses every other verb before that.
1
Mint a CTI token
Ask the control-plane API for a short-lived signed CTI token for the
tenant, with the scopes that your app needs (see below). Treat it like any
bearer credential. It is short-lived by design. Refresh and reconnect
before it expires.
2
Open the control leg
Connect over
cti (wss) or WebTransport /cti as above.3
Authenticate on the first line
Send
auth with the token as the first request. On success, the reply
confirms the connection and the granted scopes. On failure, the engine
closes the connection.First line
4
Drive verbs and subscribe to events
Issue call-control, agent-state, or routing verbs. Subscribe to the CSTA
event track (below) to observe state changes.
Auth and scopes
Authorization is a short-lived signed CTI token that the control-plane API mints. It carries ascopes claim. The claim gates which families of
verbs the connection may use. The engine refuses a verb whose scope is not
present in the token. Request only the scopes that your app needs.
scope
The call-control verbs:
makeCall, clearConnection, holdCall, retrieveCall, singleStepTransfer, consultationCall, transferCall, cancelConsultation, generateDigits.scope
Agent work-state control:
setAgentState (login / logout / ready / not-ready with an aux reason / after-call-work).scope
Route-point registration:
routeRegister, to receive route requests and select the destination.Events ride a durable track
Verbs are request/reply. You send an operation and get an acknowledgement. The resulting state changes arrive separately as CSTA events on a durablecti/<tenant> track. Your SDK subscribes to that
track directly. Because the track is durable, a client that reconnects can
resume the event stream. It does not miss what happened while it was away.
The event stream reports the CSTA lifecycle of the calls and agents that you
touch:
The pattern is: issue a verb, then watch the event track for the resulting
state. For example,
makeCall acknowledges immediately. You learn that the
far end rings from delivered, and that it answered from established.
The verb families
Call Control
Originate, clear, hold/retrieve, blind and consultative transfer, consult,
and DTMF:
makeCall, holdCall, singleStepTransfer, and the rest.Agent State
Log agents in and out. Move them between ready, not-ready (with an aux
reason), and after-call-work with
setAgentState.Routing & Events
Register as a route point with
routeRegister and subscribe to the
cti/<tenant> CSTA event track.Client surface today. CTI is a wire protocol that you speak from any
WebSocket or WebTransport client. There is no dedicated single-purpose
polyglot CTI SDK wrapper yet. The verbs, framing, auth, and event track
documented here are the contract. Build against them directly, or over the
transport that the rest of the SDK already gives you.
Related
High Availability
Run more than one engine node, so the CTI control plane and call routing
survive a node failure. CTI pairs with the enterprise HA story.
Deployment Models
See where the engine runs (managed cloud or on-prem) and how the control
leg reaches it.
On-Prem Quickstart
Stand up the engine in your own environment, the common home for an
enterprise CTI integration.
Transport to Telephony
Learn how calls enter and leave over SIP — the calls that your CTI app
then controls.

