Skip to main content

gRPC / proto contract

The generated reference for the babelconnect.v1 gRPC contract: every message, enum, and the Agent service. Both the TypeScript and Go SDKs re-export these exact types, so this doubles as the canonical data-model reference (AgentView, CallState, Command, …).

Where to start. You'll normally use an SDK rather than read this end-to-end. The three types to anchor on are AgentView (the state you render), Command (the intents you send), and the Agent service (the RPCs). For the model in prose, read State & events and the Intents reference; this page is the exhaustive field-level reference behind them.

Table of Contents

babelconnect/v1/babelconnect.proto

Account

Account is one tenant the signed-in agent can operate in — the switchable set (agent-role only) surfaced for the account picker.

FieldTypeLabelDescription
idstringcustomer / account id
namestringcompany / display name
currentboolthe account this session is currently scoped to

Ack

Ack is the empty reply to Send. It only confirms the server accepted the command for processing — the resulting state (or an Error) is delivered on the Subscribe stream, never in this reply.

AddConferenceMember

AddConferenceMember invites a participant — exactly one of agent_id / number. Starts a conference first if none is active. hold_others parks every other live, non-held member of the CURRENT conference before the invite goes out (default off) so they don't overhear the new invitee ringing; the server unholds them again once the invitee reaches a terminal state (added = joined, or failed/removed = rejected/timed out). No effect when starting a brand-new conference: StartConference(hold=true) already parks the original party unconditionally in that case.

FieldTypeLabelDescription
agent_idstring
numberstring
hold_othersbool

AgentInfo

AgentInfo is the agent block of the view (identity + live presence + caps).

FieldTypeLabelDescription
idstringAgent UUID (hyphen-normalized)
namestring
numberstring
presenceAgentState
webrtc_enabledbool
display_asstringcurrently selected outbound number
available_numbersstringrepeated
can_recordbool
presence_optionsPresenceOptionrepeatedPresence selector: the options the agent may switch to (AVAILABLE plus any configured pause reasons), and the current presence's exact name+label. The presence enum above stays the coarse bucket for icons/colors; these carry the precise presence name+label the client renders + selects.
presence_namestringcurrent presence name, e.g. "available", "break"
presence_labelstringcurrent presence label, e.g. "Available", "Break"
available_tagsstringrepeatedrecording tags the agent may apply
phonebookPhonebookEntryrepeateddial-from contacts + recent numbers
always_record_outboundboolaccount records every outbound automatically
usernamestringIdentity for the shell/Status surface (resolved at auth, no extra fetch).

login / email | | account_id | string | | customer / account id | | account_name | string | | account / company display name, when known | | line_blocked | bool | | Involuntary line block: the ACD/platform marked the agent busy / unreachable / declined (a recoverable state cleared via ResetLineStatus) — distinct from a chosen "busy" presence the agent (or sign-out-as-busy) selected. Drives the line-blocked banner + Reset; a voluntary busy presence leaves this false. | | accounts | Account | repeated | Accounts this agent may switch to without re-logging-in (agent-role only, resolved at auth). One is marked current. Drives the Account tab's switcher; empty/single ⇒ no picker. | | email | string | | The agent's own email — distinct from username, which is the login identity and may differ. Populated for the embedding bridge's legacy-shaped agent.loaded payload so host pages can match/route on it. | | sms_capable_numbers | string | repeated | Subset of available_numbers the platform marks SMS-capable. Drives the SMS composer's From picker; empty/unknown ⇒ client falls back to available_numbers. | | campaign_status | CampaignStatus | | Outbound-dialer (predictive campaign) membership state, kept live by the server. Unset/UNSPECIFIED means the agent has never touched a campaign this session; explicit OFFLINE means they left/aren't in one. |

AgentView

AgentView is the complete per-agent state the server owns and renders to. A snapshot carries the whole view; patches carry entity-level deltas.

FieldTypeLabelDescription
agentAgentInfo
active_callsCallStaterepeatedcalls currently in flight for this agent
wrap_upWrapUpStatus
smsSmsConversationrepeatedSMS thread summaries (full history on demand)
conferencesConferencerepeatedactive multi-party conferences (usually 0 or 1)
configAppConfigwhich surfaces this deployment/account shows

AnswerCall

FieldTypeLabelDescription
call_idstringthe RINGING call's id
sdpstringWebRTC SDP answer

AppConfig

AppConfig is the server-resolved, per-agent feature configuration the client renders against (UI = f(view)): which surfaces are shown and their per-feature settings. Resolved server-side per deployment + account, so the client is a pure renderer. Carried on the snapshot (no patch) — config applies on next connect.

FieldTypeLabelDescription
callsFeatureCalls
messagingFeatureMessaging
historyFeatureHistory
accountFeatureAccount
outboundFeatureOutbound
ctiFeatureCti
phonebookFeaturePhonebookContacts (phonebook) tab
server_versionstringbuild version for the Status/About surface; reserve 8–14

AuthenticateRequest

FieldTypeLabelDescription
tokenstringOptional: token may instead be supplied via "authorization" metadata.

CallRecord

CallRecord is one past call for the history list (a flattened conversation).

FieldTypeLabelDescription
idstring
directionCallDirection
fromstring
tostring
contactstringphonebook label for the other party, if known
timeint64unix seconds of the call
duration_msint32
has_recordingbool
recording_urlstringplayback URL when a recording exists

CallState

CallState is one call as the server sees it. Replace-by-id on upsert.

FieldTypeLabelDescription
idstringserver call id
directionCallDirection
stateCallLifecycle
sourceCallSource
fromstring
tostring
queue_namestring
established_atint64unix seconds when the call bridged (0 until then)
mutedbool
on_holdbool
recordingbool
anonymousbool
webrtc_offerstringSDP offer the client answers; set while RINGING
recording_idstringactive recording id (for stop/flag/tags)
recording_tagsstringrepeated
recording_flaggedbool
ice_serversIceServerrepeatedSTUN/TURN servers the client applies; for off-host NAT traversal
can_transfer_to_applicationboolcan_transfer_to_application is server-computed: true for inbound calls and taken callbacks (source == CALL_SOURCE_CALLBACK), false otherwise. Plain outbound calls must not be offered application (IVR module) transfer targets — forwarding them into a queue module strands the agent (DEV-549/B2-526). Clients gate the "App" transfer-target segment on this flag instead of re-deriving the rule from direction/source themselves.

Campaign

Campaign is one outbound-dialer campaign the agent may join (the picker's entries). test_mode drives the "name (live)" / "name (test)" label.

FieldTypeLabelDescription
idstring
namestring
test_modebool
activebool

CampaignMetrics

CampaignMetrics is the campaign's live pacing snapshot — always this exact 6-key subset, never more.

FieldTypeLabelDescription
agents_in_callsint32agents.in_calls
agents_in_dispint32agents.in_disp
agents_pausedint32agents.paused
agents_waitingint32agents.waiting
calls_being_placedint32calls.being_placed
calls_ringingint32calls.ringing

CampaignStatus

CampaignStatus is the agent's outbound-dialer campaign membership envelope, kept live by the server. last_reason is the platform's last dial-outcome as a lowercase string (e.g. "unreachable", "no_answer", "busy", "answer", "hungup", "none") — a string rather than a wire enum on purpose. paused is a convenience mirror of state == CAMPAIGN_MEMBER_STATE_IDLE. The lead the agent is currently dialing, disposition reasons, and live campaign metrics are additive fields below, layered on top of this envelope.

FieldTypeLabelDescription
campaign_idstring
campaign_namestring
stateCampaignMemberState
pausedbool
last_reasonstring
sinceint64unix seconds this state was entered/last confirmed
leadLeadlead is the customer the dialer connected the agent to — set while a lead is being worked (IN_PROGRESS/DISPOSITION), unset otherwise. Updated the moment the dialer connects a lead.
metricsCampaignMetricsmetrics is the campaign's live pacing snapshot (OBDD1), refreshed alongside the enrichment read while state == IDLE (paused) — the only state the Outbound tab shows it in; unset otherwise (and left unset if the GET /agent/outbound/metrics read 404s, e.g. between polls).

Command

FieldTypeLabelDescription
registerRegisterannounce reachability for this session
place_callPlaceCallplace an outbound call
answerAnswerCallSDP answer to a RINGING CallState
hangupHangup
muteMute
holdHold
dtmfSendDigits
set_display_asSetDisplayAs
transferTransfer
set_presenceSetPresenceswitch the agent's presence (selector)
wrap_up_extendWrapUpExtendadd time to the after-call-work countdown
wrap_up_cancelWrapUpCancelend after-call-work early
reset_line_statusResetLineStatusclear a blocked line (busy/unreachable)
start_recordingStartRecording
stop_recordingStopRecording
flag_recordingFlagRecordingtoggle the "flagged" tag on the recording
set_recording_tagsSetRecordingTags
set_webrtcSetWebrtcbrowser phone (webrtc) on/off
set_agent_numberSetAgentNumberthe external-telephone number to bridge to
send_smsSendSmsRequestsend an SMS (same as the SendSms RPC)
start_conferenceStartConferenceopen a conference around the current call
add_conference_memberAddConferenceMemberinvite an agent or number
kick_conference_memberKickConferenceMembermoderator removes a member
end_conferenceEndConferencemoderator ends the whole conference
leave_conferenceLeaveConferencehang up only my own leg
hold_conference_memberHoldConferenceMembermoderator holds/unholds a member
mute_conference_memberMuteConferenceMembermoderator mutes/unmutes a member
set_conversation_openSetConversationOpenopen/close (resolve) an SMS conversation
mark_conversation_readMarkConversationReadclear unread on an SMS conversation
pongPongreply to a server Ping (liveness + RTT); echoes Ping.seq
join_campaignJoinCampaignOutbound-dialer campaign controls (OBDA1–3 CORE).

enter a campaign (the picker's "Enter") | | leave_campaign | LeaveCampaign | | leave the campaign (selector row or in-call) | | pause_campaign | PauseCampaign | | pause (on=true) / resume (on=false) the campaign | | end_campaign_call | EndCampaignCall | | Outbound-dialer call/disposition controls (OBDB2/OBDC1/OBDC2 follow-up).

end the live campaign call (OBDB2) | | dispose_call | DisposeCall | | record the call outcome, optionally with a callback (OBDC1/OBDC2) |

Conference

Conference is one multi-party call the agent is in. The server folds multi-party call updates into this entity and emits conference_upsert/remove patches. The client is a dumb renderer that shows the participant panel and sends conference intents. Usually 0 or 1 per agent. Upsert-by-id; removed when the conference finishes or the agent's own member leaves.

FieldTypeLabelDescription
idstringconference id
statestringcreated
membersConferenceMemberrepeatedall members incl. the moderator and me
i_am_moderatorboolresolved server-side: is this agent the moderator?
my_member_idstringthe agent's own member id (used for Leave)

ConferenceMember

ConferenceMember is one participant. display is the resolved label (agent name, else the caller/dialed number, else "Anonymous"). state drives the UI: pending = ringing, added = live, removing/removed/failed = gone (clients filter removed/failed out of the participant list).

FieldTypeLabelDescription
idstringmember id
statestringpending
displaystringresolved participant label
moderatorboolthis member is the conference moderator
is_meboolthis member is the current agent
call_idstringthe member's call leg id
on_holdboolmember is on hold
agent_idstringagent UUID when the member is an agent
numberstringphone number when the member is an external party

DisposeCall

DisposeCall records the outcome of a campaign call. code is one of ListDispositionsResponse's codes (e.g. "no_answer", "callback"). callback_date is ISO YYYY-MM-DDTHH:mmZZ and is set ONLY for the "callback" disposition — omitted (empty) otherwise.

FieldTypeLabelDescription
codestring
callback_datestring

EndCampaignCall

EndCampaignCall ends the agent's live campaign call. Deliberately distinct from the generic Hangup: it also releases the dialer's channel and drives the campaign member-state transition to DISPOSITION, neither of which a plain media-plane hangup would trigger.

EndConference

EndConference tears down the whole conference (moderator only).

Error

FieldTypeLabelDescription
codestring
messagestring
call_idstringoptional: the call the rejected command targeted

FeatureAccount

FeatureAccount gates the Account tab and its sections.

FieldTypeLabelDescription
enabledbool
allow_device_switchboolbrowser/telephone selector + agent-number field
show_statusboolthe Status/About section
allow_account_switchboolthe multi-account switcher (ACC-E2)
allow_status_changeboolAgents may change their own presence via the status picker. When false the picker is locked: still visible, shows the current status, but not interactive. Defaults to allowed.

FeatureCalls

FeatureCalls gates the call surface (Phone tab) and its in-call actions. Recording stays gated by AgentInfo.can_record (not duplicated here); device (browser/telephone) by AgentInfo.webrtc_enabled.

FieldTypeLabelDescription
enabledbool
allow_transferboolcold transfer action
allow_conferenceboolconference action (own bucket later when that surface lands)

FeatureCti

FeatureCti gates CTI/integration behavior (screen-pop + app→host call events).

FieldTypeLabelDescription
enabledbool
emit_call_eventsboolemit cti.call to an embedding host on each transition
screen_popboolsurface screen-pop notifications

FeatureHistory

FieldTypeLabelDescription
enabledbool

FeatureMessaging

FieldTypeLabelDescription
enabledbool

FeatureOutbound

FieldTypeLabelDescription
enabledbool

FeaturePhonebook

FieldTypeLabelDescription
enabledbool

FlagRecording

FlagRecording toggles the "flagged" mark on the call's active recording.

FieldTypeLabelDescription
call_idstring

GetStateRequest

GetStateRequest fetches the current AgentView (the unary "get current state"). Empty; the bearer token rides in "authorization" metadata like every call.

Hangup

FieldTypeLabelDescription
call_idstring

HistoryRequest

HistoryRequest pages the agent's call history (newest first).

FieldTypeLabelDescription
maxint32page size (default 50)
pageint321-based page (default 1)

HistoryResponse

HistoryResponse is one page of past calls.

FieldTypeLabelDescription
callsCallRecordrepeated

Hold

FieldTypeLabelDescription
call_idstring
onbool

HoldConferenceMember

HoldConferenceMember holds or unholds an individual member (moderator only).

FieldTypeLabelDescription
member_idstring
onbool

IceServer

IceServer is a STUN/TURN server the client applies to its WebRTC peer connection (RTCIceServer shape). Carried on CallState so an off-host client (e.g. a phone) can relay media through TURN when it can't reach the server's host ICE candidates. Empty in the in-cluster/LAN case.

FieldTypeLabelDescription
urlsstringrepeatede.g. ["turn:host:3478?transport=tcp"]
usernamestring
credentialstring

Identity

FieldTypeLabelDescription
agent_idstringAgent UUID, hyphen-normalized
accountstringcustomer / account id
numberstringagent's number, if any
usernamestring
stateAgentStatecurrent presence
account_namestringaccount / company display name, when known (ACC-E1)
accountsAccountrepeatedaccounts this agent may switch to (ACC-E2)

JoinCampaign

JoinCampaign enters a campaign. The client normally sends paused false so the agent starts waiting for a lead right away.

FieldTypeLabelDescription
campaign_idstring
pausedbool

Keepalive

Keepalive is an empty heartbeat frame sent on the Subscribe stream so idle connections through proxies/LBs are not closed as idle. Notably the AWS Classic ELB in front of ingress-nginx (dev/prod EKS) has a 300s connection idle timeout; without these frames a quiet agent's gRPC-web server-stream is killed after 5 min. The server sends one every ~15s. It carries no state and does NOT advance seq; client caches treat a keepalive StateUpdate as a no-op.

KickConferenceMember

KickConferenceMember removes a member from the conference (moderator only).

FieldTypeLabelDescription
member_idstring

Lead

Lead is the customer the outbound dialer connected the agent to. id/rank are only present on the richer (list-enriched) form some reads return. id is the internal lead-list-item id — DISTINCT from uid, the customer-provided identifier shown as the lead's id in the UI.

FieldTypeLabelDescription
idstringinternal lead-list-item id (uuid); may be empty
uidstringcustomer-provided lead identifier — the UI's "id"
numberstring
rankint32
dataLead.DataEntryrepeatedarbitrary customer-supplied key/values

Lead.DataEntry

FieldTypeLabelDescription
keystring
valuestring

LeaveCampaign

LeaveCampaign exits the current campaign (the server resolves which one). Available both from the campaign selector row and from within an active call.

LeaveConference

LeaveConference hangs up only the agent's own leg; the others stay connected.

ListCampaignsRequest

ListCampaignsRequest / ListCampaignsResponse back the campaign picker (OBDA1). Empty request: the server always asks the backend for active campaigns only (?active=true) — there is no agent-facing use for inactive ones.

ListCampaignsResponse

FieldTypeLabelDescription
campaignsCampaignrepeated

ListDispositionsRequest

ListDispositionsRequest / ListDispositionsResponse back the disposition picker (OBDC1). Empty request: the list is a static global on the backend, not campaign- or agent-scoped.

ListDispositionsResponse

FieldTypeLabelDescription
reasonsstringrepeatedraw codes, e.g. "no_answer", "callback"

MarkConversationRead

MarkConversationRead clears the unread count on an SMS conversation (the agent opened its thread).

FieldTypeLabelDescription
conversation_idstring

Mute

FieldTypeLabelDescription
call_idstring
onbool

MuteConferenceMember

MuteConferenceMember mutes or unmutes an individual member (moderator only).

FieldTypeLabelDescription
member_idstring
onbool

Notification

Notification is a transient one-shot the client surfaces (a CTI screen-pop / pushed agent data). It is NOT stored in the AgentView snapshot — it fires once.

FieldTypeLabelDescription
kindstringe.g. "cti.message"
titlestring
bodystring
data_jsonstringarbitrary pushed payload, JSON-encoded
tsint64

Patch

Patch is an entity-level delta applied mechanically by the client cache: replace the agent block, upsert/remove a call by id, or set wrap-up.

FieldTypeLabelDescription
agentAgentInfo
call_upsertCallState
call_removestringcall id to drop
wrap_upWrapUpStatus
notificationNotificationtransient CTI screen-pop (not part of the view)
sms_upsertSmsConversationupsert an SMS thread summary by id
sms_removestringSMS conversation id to drop
conference_upsertConferenceupsert a conference by id
conference_removestringconference id to drop (finished/left)
configAppConfigresolved feature config (emitted on register)

PauseCampaign

PauseCampaign pauses (on=true, POST .../pause) or resumes (on=false, POST .../unpause) the campaign — no request body either way (OBDA2), same on/off shape as Mute/Hold.

FieldTypeLabelDescription
onbool

PhonebookEntry

PhonebookEntry is one dialable contact (or a recent number) for the dialer's autocomplete.

FieldTypeLabelDescription
labelstringcontact name, or "recent" for a recently dialed number
numberstring

PhonebookRequest

PhonebookRequest / PhonebookResponse re-pull the agent's merged contacts + recent numbers on demand (refresh). query filters by label/number server-side.

FieldTypeLabelDescription
maxint32page size (default 200)
pageint321-based page (default 1)
querystringoptional label/number filter

PhonebookResponse

FieldTypeLabelDescription
entriesPhonebookEntryrepeated

Ping

Ping is a liveness probe the server sends on the heartbeat tick (replacing the bare Keepalive frame). The client echoes seq back in a Pong command; the server measures round-trip time (RTT) from the reply and tracks per-session liveness. Like Keepalive it keeps the connection warm, carries no state, and does NOT advance seq — caches ignore it, and the reply is handled in the client's stream loop, not the state reducer. (APP-A5/CALL-M6.)

FieldTypeLabelDescription
sequint64

PlaceCall

FieldTypeLabelDescription
tostring
display_as_tostringservice number shown to the consumer
display_as_fromstringnumber shown to the agent
recordboolstart recording the call from answer (recording.autostart)
sessionPlaceCall.SessionEntryrepeatedopaque CTI/embedding correlation (from session.set)

PlaceCall.SessionEntry

FieldTypeLabelDescription
keystring
valuestring

Pong

Pong replies to a server Ping (StateUpdate.ping), echoing its seq so the server can match it to the outstanding ping and compute RTT. Sent automatically by the SDK from its stream-receive loop — not a user intent. (APP-A5/CALL-M6.)

FieldTypeLabelDescription
sequint64

PresenceOption

PresenceOption is one selectable agent presence — "Available" or a configured pause reason. available is whether the agent can receive calls in it.

FieldTypeLabelDescription
namestringe.g. "available", "break"
labelstringe.g. "Available", "Break"
availablebool

Register

FieldTypeLabelDescription
capabilitiesstringrepeatedadvisory, e.g. ["webrtc"]

ResetLineStatus

ResetLineStatus clears a blocked line state (busy/unreachable/declined) so the agent can receive calls again.

SendDigits

FieldTypeLabelDescription
call_idstring
digitsstringDTMF, e.g. "1", "#"

SendSmsRequest

SendSmsRequest sends an SMS. from defaults to the agent's SMS-capable number when empty. session carries opaque CTI/embedding correlation keys (e.g. from session.set), like PlaceCall.

FieldTypeLabelDescription
tostring
textstring
fromstring
sessionSendSmsRequest.SessionEntryrepeated

SendSmsRequest.SessionEntry

FieldTypeLabelDescription
keystring
valuestring

SetAgentNumber

SetAgentNumber sets the external phone number the agent's calls bridge to.

FieldTypeLabelDescription
numberstring

SetConversationOpen

SetConversationOpen opens (reopens) or closes (resolves) an SMS conversation. The server flips SmsConversation.open optimistically and re-confirms.

FieldTypeLabelDescription
conversation_idstring
openbool

SetDisplayAs

FieldTypeLabelDescription
numberstringoutbound number to present

SetPresence

FieldTypeLabelDescription
namestringpresence to switch to, e.g. "available" or a pause reason

SetRecordingTags

SetRecordingTags replaces the tags on the call's active recording.

FieldTypeLabelDescription
call_idstring
tagsstringrepeated

SetWebrtc

SetWebrtc enables or disables the browser phone (WebRTC). Off = bridge calls to the external-telephone number instead.

FieldTypeLabelDescription
onbool

SmsConversation

SmsConversation is one SMS thread summary carried in the AgentView (the full thread history is fetched on demand, not held in the snapshot). Upsert-by-id; the reducer keeps the list sorted by last_ts descending.

FieldTypeLabelDescription
idstringconversation id
peerstringthe other party's number
last_directionCallDirectionINBOUND = received, OUTBOUND = sent
last_textstringlatest message preview
last_tsint64unix seconds of the latest message
unreaduint32unread message count
contact_labelstringphonebook label for the peer, if known
openboolconversation open (unresolved) vs closed

SmsMessage

SmsMessage is one message inside a conversation thread, fetched on demand via GetSmsThread (the AgentView only carries the lightweight SmsConversation summary, not the full history). Oldest-first; the client bubbles it by direction. state is the message status (received/sent/delivered/failed/ scheduled) for display only.

FieldTypeLabelDescription
idstring
directionCallDirectionINBOUND = received, OUTBOUND = sent
fromstring
tostring
textstring
tsint64unix seconds (dateCreated)
statestringreceived/sent/delivered/failed/scheduled (display only)

SmsThreadRequest

SmsThreadRequest / SmsThreadResponse page the messages of one SMS conversation.

FieldTypeLabelDescription
conversation_idstring
maxint32page size (default 50)
pageint321-based page (default 1)

SmsThreadResponse

FieldTypeLabelDescription
messagesSmsMessagerepeated

StartConference

StartConference opens a conference around the agent's current call. hold puts the existing party on hold while the first new member is dialed.

FieldTypeLabelDescription
holdbool

StartRecording

StartRecording begins recording the given call.

FieldTypeLabelDescription
call_idstring

StateUpdate

StateUpdate is the single server → client message on the Subscribe stream. On open the client receives a snapshot; thereafter partial patches. seq is monotonic across snapshot+patch — a gap means the client should resubscribe for a fresh snapshot. error is an out-of-band notice (command rejection / server warning) and does NOT advance seq. keepalive is an empty transport heartbeat (see Keepalive) that likewise does NOT advance seq and carries no state — client caches must ignore it.

FieldTypeLabelDescription
sequint64
snapshotAgentView
patchPatch
errorError
keepaliveKeepalive
pingPing

StopRecording

StopRecording ends the call's active recording.

FieldTypeLabelDescription
call_idstring

SubscribeRequest

SubscribeRequest opens the StateUpdate stream for the authenticated agent (the bearer token rides in "authorization" metadata, like every call). Empty today; reserved for future subscription filters.

Transfer

Transfer hands the current call to a target. Exactly one target is set: to (external number), agent_id (another agent), or application_id (a queue/voice application). warm selects attended (consult-then-drop) vs blind/cold (single action).

FieldTypeLabelDescription
call_idstring
tostringexternal number target
warmbooltrue = attended/warm, false = blind/cold
agent_idstringtransfer to another agent
application_idstringtransfer to a queue / voice application

TransferTarget

TransferTarget is one autocomplete result for a blind transfer / add-member pick. id is the backend id to pass back on Transfer/AddConferenceMember (an agent or application UUID; for a synthetic NUMBER result it is the raw query, not a stable id — clients should send number, not id, for that kind). category is the IVR module name (APPLICATION only, e.g. "simpleMenu"); browser marks an agent reachable only via browser phone (no PSTN number) — AGENT only.

FieldTypeLabelDescription
idstring
kindTransferTargetKind
labelstring
numberstringNUMBER kind, and AGENT kind when it has a PSTN number
categorystringAPPLICATION only: the IVR module name
browserboolAGENT only: browser-phone-reachable, no PSTN number

TransferTargetsRequest

TransferTargetsRequest / TransferTargetsResponse back the transfer-target autocomplete (blind transfer + add-member dialogs). query filters server-side; empty returns the default result set (a synthetic NUMBER target only appears once query looks like a number).

FieldTypeLabelDescription
querystring

TransferTargetsResponse

FieldTypeLabelDescription
targetsTransferTargetrepeated

WrapUpCancel

WrapUpCancel ends the agent's after-call-work early.

WrapUpExtend

WrapUpExtend adds time to the agent's after-call-work countdown.

FieldTypeLabelDescription
secondsint32extra wrap-up seconds to add (e.g. 30)

WrapUpStatus

WrapUpStatus is the after-call-work countdown.

FieldTypeLabelDescription
activebool
remaining_secondsint32
last_call_typestring
can_cancelbool
can_extendbool

AgentState

NameNumberDescription
AGENT_STATE_UNSPECIFIED0
AGENT_STATE_OFFLINE1
AGENT_STATE_AVAILABLE2
AGENT_STATE_IN_CALL3
AGENT_STATE_WRAP_UP4
AGENT_STATE_PAUSED5
AGENT_STATE_RINGING6
AGENT_STATE_BUSY7

CallDirection

NameNumberDescription
CALL_DIRECTION_UNSPECIFIED0
CALL_DIRECTION_INBOUND1
CALL_DIRECTION_OUTBOUND2

CallLifecycle

NameNumberDescription
CALL_LIFECYCLE_UNSPECIFIED0
CALL_LIFECYCLE_INIT1
CALL_LIFECYCLE_RINGING2offer present; client should answer
CALL_LIFECYCLE_IN_PROGRESS3
CALL_LIFECYCLE_BRIDGED4media flowing both ways
CALL_LIFECYCLE_COMPLETED5
CALL_LIFECYCLE_FAILED6

CallSource

NameNumberDescription
CALL_SOURCE_UNSPECIFIED0
CALL_SOURCE_API1
CALL_SOURCE_WEBRTC2
CALL_SOURCE_QUEUE3
CALL_SOURCE_TRANSFER4
CALL_SOURCE_DIALER5
CALL_SOURCE_CONFERENCE6
CALL_SOURCE_CALLBACK7

CampaignMemberState

CampaignMemberState is the predictive-dialer campaign membership lifecycle: offline -> logging_in -> waiting -> in_progress -> disposition (-> waiting for the next lead), with idle as the paused branch (waiting/logging_in <-> idle via pause/resume) and leave returning to offline from any state.

NameNumberDescription
CAMPAIGN_MEMBER_STATE_UNSPECIFIED0
CAMPAIGN_MEMBER_STATE_OFFLINE1
CAMPAIGN_MEMBER_STATE_LOGGING_IN2
CAMPAIGN_MEMBER_STATE_WAITING3
CAMPAIGN_MEMBER_STATE_IDLE4paused
CAMPAIGN_MEMBER_STATE_IN_PROGRESS5
CAMPAIGN_MEMBER_STATE_DISPOSITION6

TransferTargetKind

TransferTargetKind discriminates a TransferTarget. The wire type only ever carries agent / number / application (a UI may group results differently, e.g. a "phonebook" section, but that is presentation only).

NameNumberDescription
TRANSFER_TARGET_KIND_UNSPECIFIED0
TRANSFER_TARGET_KIND_AGENT1
TRANSFER_TARGET_KIND_NUMBER2
TRANSFER_TARGET_KIND_APPLICATION3

Agent

Method NameRequest TypeResponse TypeDescription
AuthenticateAuthenticateRequestIdentityAuthenticate validates the caller's bearer token and returns the resolved agent identity (id, account, presence).
SubscribeSubscribeRequestStateUpdate streamSubscribe + Send are the control stream, split into its server→client and client→server halves — the one shape every client uses (RPC-A4 retired the earlier bidi Session RPC, which needed HTTP/2 end-to-end and couldn't ride gRPC-web or a plain HTTP/1.1 ingress). Subscribe is the server→client half (StateUpdate: one snapshot on open, then entity-level patches; UI = f(AgentView)). Send is the client→server half (one Command per unary call). Together they key to the agent's one state store. Command rejections arrive as an Error on the Subscribe stream, never on Send's reply.
SendCommandAck
GetHistoryHistoryRequestHistoryResponseGetHistory returns the agent's past calls (the History tab). A unary query — history is on-demand reference data, not part of the live AgentView snapshot.
GetSmsThreadSmsThreadRequestSmsThreadResponseGetSmsThread returns the messages of one SMS conversation (the chat thread). A unary query like GetHistory — the live AgentView carries only the SmsConversation summary; the full thread is fetched on demand. conversation_id is a query param (it can be a peer phone number when no conversation id is available), so this stays distinct from the POST /v1/agent/sms send.
GetPhonebookPhonebookRequestPhonebookResponseGetPhonebook returns the agent's dial-from contacts + recent numbers (the Contacts tab). A unary query like GetHistory: the live AgentView carries a phonebook snapshot frozen at register (AgentInfo.phonebook); this re-pulls the merged contacts+recents list on demand (refresh) so a long-running session can see new contacts. query filters by label/number.
GetTransferTargetsTransferTargetsRequestTransferTargetsResponseGetTransferTargets autocompletes blind-transfer / add-member targets as the agent types — agents, raw numbers, and IVR applications. query filters server-side (substring across name/email/number for agents, name for applications); the lookup has no call-context param, so eligibility by call direction is a separate, already-server-computed flag the client applies itself (CallState.can_transfer_to_application hides APPLICATION results).
GetStateGetStateRequestAgentViewGetState returns the agent's current AgentView as a single unary call — the REST/web "get current state" (the Subscribe stream is the realtime twin). When no live session backs the caller, the server builds the snapshot on demand (agent + presence + wrap-up); live call state requires a stream.
SendSmsSendSmsRequestSmsConversationSendSms sends an SMS and returns the (upserted) conversation summary. Exposed over REST as POST /v1/agent/sms and as the Command.send_sms intent on the stream — both send the same message.
ListCampaignsListCampaignsRequestListCampaignsResponseListCampaigns lists the outbound-dialer campaigns the agent may join (the Outbound tab's campaign picker) — on-demand reference data like GetPhonebook/GetTransferTargets.
ListDispositionsListDispositionsRequestListDispositionsResponseListDispositions lists the available call-outcome codes for the disposition picker — on-demand reference data like ListCampaigns. The list is a static global, not campaign-scoped, so the request carries no campaign id.

Scalar Value Types

.proto TypeNotesC++JavaPythonGoC#PHPRuby
doubledoubledoublefloatfloat64doublefloatFloat
floatfloatfloatfloatfloat32floatfloatFloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32intintegerBignum or Fixnum (as required)
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/longint64longinteger/stringBignum
uint32Uses variable-length encoding.uint32intint/longuint32uintintegerBignum or Fixnum (as required)
uint64Uses variable-length encoding.uint64longint/longuint64ulonginteger/stringBignum or Fixnum (as required)
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32intintegerBignum or Fixnum (as required)
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/longint64longinteger/stringBignum
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intintuint32uintintegerBignum or Fixnum (as required)
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/longuint64ulonginteger/stringBignum
sfixed32Always four bytes.int32intintint32intintegerBignum or Fixnum (as required)
sfixed64Always eight bytes.int64longint/longint64longinteger/stringBignum
boolboolbooleanbooleanboolboolbooleanTrueClass/FalseClass
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicodestringstringstringString (UTF-8)
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteByteStringstringString (ASCII-8BIT)