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.
| Field | Type | Label | Description |
|---|
| id | string | | customer / account id |
| name | string | | company / display name |
| current | bool | | the 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.
AgentInfo
AgentInfo is the agent block of the view (identity + live presence + caps).
| Field | Type | Label | Description |
|---|
| id | string | | Agent UUID (hyphen-normalized) |
| name | string | | |
| number | string | | |
| presence | AgentState | | |
| webrtc_enabled | bool | | |
| display_as | string | | currently selected outbound number |
| available_numbers | string | repeated | |
| can_record | bool | | |
| presence_options | PresenceOption | repeated | Presence 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_name | string | | current presence name, e.g. "available", "break" |
| presence_label | string | | current presence label, e.g. "Available", "Break" |
| available_tags | string | repeated | recording tags the agent may apply |
| phonebook | PhonebookEntry | repeated | dial-from contacts + recent numbers |
| always_record_outbound | bool | | account records every outbound automatically |
| username | string | | Identity 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.
| Field | Type | Label | Description |
|---|
| agent | AgentInfo | | |
| active_calls | CallState | repeated | calls currently in flight for this agent |
| wrap_up | WrapUpStatus | | |
| sms | SmsConversation | repeated | SMS thread summaries (full history on demand) |
| conferences | Conference | repeated | active multi-party conferences (usually 0 or 1) |
| config | AppConfig | | which surfaces this deployment/account shows |
AnswerCall
| Field | Type | Label | Description |
|---|
| call_id | string | | the RINGING call's id |
| sdp | string | | WebRTC 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.
AuthenticateRequest
| Field | Type | Label | Description |
|---|
| token | string | | Optional: token may instead be supplied via "authorization" metadata. |
CallRecord
CallRecord is one past call for the history list (a flattened conversation).
CallState
CallState is one call as the server sees it. Replace-by-id on upsert.
| Field | Type | Label | Description |
|---|
| id | string | | server call id |
| direction | CallDirection | | |
| state | CallLifecycle | | |
| source | CallSource | | |
| from | string | | |
| to | string | | |
| queue_name | string | | |
| established_at | int64 | | unix seconds when the call bridged (0 until then) |
| muted | bool | | |
| on_hold | bool | | |
| recording | bool | | |
| anonymous | bool | | |
| webrtc_offer | string | | SDP offer the client answers; set while RINGING |
| recording_id | string | | active recording id (for stop/flag/tags) |
| recording_tags | string | repeated | |
| recording_flagged | bool | | |
| ice_servers | IceServer | repeated | STUN/TURN servers the client applies; for off-host NAT traversal |
| can_transfer_to_application | bool | | can_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.
CampaignMetrics
CampaignMetrics is the campaign's live pacing snapshot — always this exact
6-key subset, never more.
| Field | Type | Label | Description |
|---|
| agents_in_calls | int32 | | agents.in_calls |
| agents_in_disp | int32 | | agents.in_disp |
| agents_paused | int32 | | agents.paused |
| agents_waiting | int32 | | agents.waiting |
| calls_being_placed | int32 | | calls.being_placed |
| calls_ringing | int32 | | calls.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.
| Field | Type | Label | Description |
|---|
| campaign_id | string | | |
| campaign_name | string | | |
| state | CampaignMemberState | | |
| paused | bool | | |
| last_reason | string | | |
| since | int64 | | unix seconds this state was entered/last confirmed |
| lead | Lead | | lead 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. |
| metrics | CampaignMetrics | | metrics 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
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.
| Field | Type | Label | Description |
|---|
| id | string | | conference id |
| state | string | | created |
| members | ConferenceMember | repeated | all members incl. the moderator and me |
| i_am_moderator | bool | | resolved server-side: is this agent the moderator? |
| my_member_id | string | | the 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).
| Field | Type | Label | Description |
|---|
| id | string | | member id |
| state | string | | pending |
| display | string | | resolved participant label |
| moderator | bool | | this member is the conference moderator |
| is_me | bool | | this member is the current agent |
| call_id | string | | the member's call leg id |
| on_hold | bool | | member is on hold |
| agent_id | string | | agent UUID when the member is an agent |
| number | string | | phone 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.
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
| Field | Type | Label | Description |
|---|
| code | string | | |
| message | string | | |
| call_id | string | | optional: the call the rejected command targeted |
FeatureAccount
FeatureAccount gates the Account tab and its sections.
| Field | Type | Label | Description |
|---|
| enabled | bool | | |
| allow_device_switch | bool | | browser/telephone selector + agent-number field |
| show_status | bool | | the Status/About section |
| allow_account_switch | bool | | the multi-account switcher (ACC-E2) |
| allow_status_change | bool | | Agents 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.
| Field | Type | Label | Description |
|---|
| enabled | bool | | |
| allow_transfer | bool | | cold transfer action |
| allow_conference | bool | | conference action (own bucket later when that surface lands) |
FeatureCti
FeatureCti gates CTI/integration behavior (screen-pop + app→host call events).
| Field | Type | Label | Description |
|---|
| enabled | bool | | |
| emit_call_events | bool | | emit cti.call to an embedding host on each transition |
| screen_pop | bool | | surface screen-pop notifications |
FeatureHistory
| Field | Type | Label | Description |
|---|
| enabled | bool | | |
FeatureMessaging
| Field | Type | Label | Description |
|---|
| enabled | bool | | |
FeatureOutbound
| Field | Type | Label | Description |
|---|
| enabled | bool | | |
FeaturePhonebook
| Field | Type | Label | Description |
|---|
| enabled | bool | | |
FlagRecording
FlagRecording toggles the "flagged" mark on the call's active recording.
| Field | Type | Label | Description |
|---|
| call_id | string | | |
GetStateRequest
GetStateRequest fetches the current AgentView (the unary "get current state").
Empty; the bearer token rides in "authorization" metadata like every call.
Hangup
| Field | Type | Label | Description |
|---|
| call_id | string | | |
HistoryRequest
HistoryRequest pages the agent's call history (newest first).
| Field | Type | Label | Description |
|---|
| max | int32 | | page size (default 50) |
| page | int32 | | 1-based page (default 1) |
HistoryResponse
HistoryResponse is one page of past calls.
Hold
HoldConferenceMember
HoldConferenceMember holds or unholds an individual member (moderator only).
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.
| Field | Type | Label | Description |
|---|
| urls | string | repeated | e.g. ["turn:host:3478?transport=tcp"] |
| username | string | | |
| credential | string | | |
Identity
| Field | Type | Label | Description |
|---|
| agent_id | string | | Agent UUID, hyphen-normalized |
| account | string | | customer / account id |
| number | string | | agent's number, if any |
| username | string | | |
| state | AgentState | | current presence |
| account_name | string | | account / company display name, when known (ACC-E1) |
| accounts | Account | repeated | accounts 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.
| Field | Type | Label | Description |
|---|
| campaign_id | string | | |
| paused | bool | | |
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).
| Field | Type | Label | Description |
|---|
| member_id | string | | |
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.
| Field | Type | Label | Description |
|---|
| id | string | | internal lead-list-item id (uuid); may be empty |
| uid | string | | customer-provided lead identifier — the UI's "id" |
| number | string | | |
| rank | int32 | | |
| data | Lead.DataEntry | repeated | arbitrary customer-supplied key/values |
Lead.DataEntry
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
| Field | Type | Label | Description |
|---|
| campaigns | Campaign | repeated | |
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
| Field | Type | Label | Description |
|---|
| reasons | string | repeated | raw codes, e.g. "no_answer", "callback" |
MarkConversationRead
MarkConversationRead clears the unread count on an SMS conversation (the agent
opened its thread).
| Field | Type | Label | Description |
|---|
| conversation_id | string | | |
Mute
MuteConferenceMember
MuteConferenceMember mutes or unmutes an individual member (moderator only).
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.
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.
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.
| Field | Type | Label | Description |
|---|
| on | bool | | |
PhonebookEntry
PhonebookEntry is one dialable contact (or a recent number) for the dialer's
autocomplete.
| Field | Type | Label | Description |
|---|
| label | string | | contact name, or "recent" for a recently dialed number |
| number | string | | |
PhonebookRequest
PhonebookRequest / PhonebookResponse re-pull the agent's merged contacts +
recent numbers on demand (refresh). query filters by label/number server-side.
| Field | Type | Label | Description |
|---|
| max | int32 | | page size (default 200) |
| page | int32 | | 1-based page (default 1) |
| query | string | | optional label/number filter |
PhonebookResponse
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.)
| Field | Type | Label | Description |
|---|
| seq | uint64 | | |
PlaceCall
| Field | Type | Label | Description |
|---|
| to | string | | |
| display_as_to | string | | service number shown to the consumer |
| display_as_from | string | | number shown to the agent |
| record | bool | | start recording the call from answer (recording.autostart) |
| session | PlaceCall.SessionEntry | repeated | opaque CTI/embedding correlation (from session.set) |
PlaceCall.SessionEntry
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.)
| Field | Type | Label | Description |
|---|
| seq | uint64 | | |
PresenceOption
PresenceOption is one selectable agent presence — "Available" or a configured
pause reason. available is whether the agent can receive calls in it.
| Field | Type | Label | Description |
|---|
| name | string | | e.g. "available", "break" |
| label | string | | e.g. "Available", "Break" |
| available | bool | | |
Register
| Field | Type | Label | Description |
|---|
| capabilities | string | repeated | advisory, e.g. ["webrtc"] |
ResetLineStatus
ResetLineStatus clears a blocked line state (busy/unreachable/declined) so the
agent can receive calls again.
SendDigits
| Field | Type | Label | Description |
|---|
| call_id | string | | |
| digits | string | | DTMF, 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.
SendSmsRequest.SessionEntry
SetAgentNumber
SetAgentNumber sets the external phone number the agent's calls bridge to.
| Field | Type | Label | Description |
|---|
| number | string | | |
SetConversationOpen
SetConversationOpen opens (reopens) or closes (resolves) an SMS conversation.
The server flips SmsConversation.open optimistically and re-confirms.
| Field | Type | Label | Description |
|---|
| conversation_id | string | | |
| open | bool | | |
SetDisplayAs
| Field | Type | Label | Description |
|---|
| number | string | | outbound number to present |
SetPresence
| Field | Type | Label | Description |
|---|
| name | string | | presence to switch to, e.g. "available" or a pause reason |
SetRecordingTags replaces the tags on the call's active recording.
SetWebrtc
SetWebrtc enables or disables the browser phone (WebRTC). Off = bridge calls to
the external-telephone number instead.
| Field | Type | Label | Description |
|---|
| on | bool | | |
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.
| Field | Type | Label | Description |
|---|
| id | string | | conversation id |
| peer | string | | the other party's number |
| last_direction | CallDirection | | INBOUND = received, OUTBOUND = sent |
| last_text | string | | latest message preview |
| last_ts | int64 | | unix seconds of the latest message |
| unread | uint32 | | unread message count |
| contact_label | string | | phonebook label for the peer, if known |
| open | bool | | conversation 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.
SmsThreadRequest
SmsThreadRequest / SmsThreadResponse page the messages of one SMS conversation.
| Field | Type | Label | Description |
|---|
| conversation_id | string | | |
| max | int32 | | page size (default 50) |
| page | int32 | | 1-based page (default 1) |
SmsThreadResponse
| Field | Type | Label | Description |
|---|
| messages | SmsMessage | repeated | |
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.
| Field | Type | Label | Description |
|---|
| hold | bool | | |
StartRecording
StartRecording begins recording the given call.
| Field | Type | Label | Description |
|---|
| call_id | string | | |
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.
StopRecording
StopRecording ends the call's active recording.
| Field | Type | Label | Description |
|---|
| call_id | string | | |
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).
| Field | Type | Label | Description |
|---|
| call_id | string | | |
| to | string | | external number target |
| warm | bool | | true = attended/warm, false = blind/cold |
| agent_id | string | | transfer to another agent |
| application_id | string | | transfer 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.
| Field | Type | Label | Description |
|---|
| id | string | | |
| kind | TransferTargetKind | | |
| label | string | | |
| number | string | | NUMBER kind, and AGENT kind when it has a PSTN number |
| category | string | | APPLICATION only: the IVR module name |
| browser | bool | | AGENT 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).
| Field | Type | Label | Description |
|---|
| query | string | | |
TransferTargetsResponse
WrapUpCancel
WrapUpCancel ends the agent's after-call-work early.
WrapUpExtend
WrapUpExtend adds time to the agent's after-call-work countdown.
| Field | Type | Label | Description |
|---|
| seconds | int32 | | extra wrap-up seconds to add (e.g. 30) |
WrapUpStatus
WrapUpStatus is the after-call-work countdown.
AgentState
| Name | Number | Description |
|---|
| AGENT_STATE_UNSPECIFIED | 0 | |
| AGENT_STATE_OFFLINE | 1 | |
| AGENT_STATE_AVAILABLE | 2 | |
| AGENT_STATE_IN_CALL | 3 | |
| AGENT_STATE_WRAP_UP | 4 | |
| AGENT_STATE_PAUSED | 5 | |
| AGENT_STATE_RINGING | 6 | |
| AGENT_STATE_BUSY | 7 | |
CallDirection
| Name | Number | Description |
|---|
| CALL_DIRECTION_UNSPECIFIED | 0 | |
| CALL_DIRECTION_INBOUND | 1 | |
| CALL_DIRECTION_OUTBOUND | 2 | |
CallLifecycle
| Name | Number | Description |
|---|
| CALL_LIFECYCLE_UNSPECIFIED | 0 | |
| CALL_LIFECYCLE_INIT | 1 | |
| CALL_LIFECYCLE_RINGING | 2 | offer present; client should answer |
| CALL_LIFECYCLE_IN_PROGRESS | 3 | |
| CALL_LIFECYCLE_BRIDGED | 4 | media flowing both ways |
| CALL_LIFECYCLE_COMPLETED | 5 | |
| CALL_LIFECYCLE_FAILED | 6 | |
CallSource
| Name | Number | Description |
|---|
| CALL_SOURCE_UNSPECIFIED | 0 | |
| CALL_SOURCE_API | 1 | |
| CALL_SOURCE_WEBRTC | 2 | |
| CALL_SOURCE_QUEUE | 3 | |
| CALL_SOURCE_TRANSFER | 4 | |
| CALL_SOURCE_DIALER | 5 | |
| CALL_SOURCE_CONFERENCE | 6 | |
| CALL_SOURCE_CALLBACK | 7 | |
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.
| Name | Number | Description |
|---|
| CAMPAIGN_MEMBER_STATE_UNSPECIFIED | 0 | |
| CAMPAIGN_MEMBER_STATE_OFFLINE | 1 | |
| CAMPAIGN_MEMBER_STATE_LOGGING_IN | 2 | |
| CAMPAIGN_MEMBER_STATE_WAITING | 3 | |
| CAMPAIGN_MEMBER_STATE_IDLE | 4 | paused |
| CAMPAIGN_MEMBER_STATE_IN_PROGRESS | 5 | |
| CAMPAIGN_MEMBER_STATE_DISPOSITION | 6 | |
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).
| Name | Number | Description |
|---|
| TRANSFER_TARGET_KIND_UNSPECIFIED | 0 | |
| TRANSFER_TARGET_KIND_AGENT | 1 | |
| TRANSFER_TARGET_KIND_NUMBER | 2 | |
| TRANSFER_TARGET_KIND_APPLICATION | 3 | |
Agent
| Method Name | Request Type | Response Type | Description |
|---|
| Authenticate | AuthenticateRequest | Identity | Authenticate validates the caller's bearer token and returns the resolved agent identity (id, account, presence). |
| Subscribe | SubscribeRequest | StateUpdate stream | Subscribe + 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. |
| Send | Command | Ack | |
| GetHistory | HistoryRequest | HistoryResponse | GetHistory 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. |
| GetSmsThread | SmsThreadRequest | SmsThreadResponse | GetSmsThread 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. |
| GetPhonebook | PhonebookRequest | PhonebookResponse | GetPhonebook 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. |
| GetTransferTargets | TransferTargetsRequest | TransferTargetsResponse | GetTransferTargets 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). |
| GetState | GetStateRequest | AgentView | GetState 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. |
| SendSms | SendSmsRequest | SmsConversation | SendSms 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. |
| ListCampaigns | ListCampaignsRequest | ListCampaignsResponse | ListCampaigns lists the outbound-dialer campaigns the agent may join (the Outbound tab's campaign picker) — on-demand reference data like GetPhonebook/GetTransferTargets. |
| ListDispositions | ListDispositionsRequest | ListDispositionsResponse | ListDispositions 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 Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby |
|---|
| double | | double | double | float | float64 | double | float | Float |
| float | | float | float | float | float32 | float | float | Float |
| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum |
| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) |
| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) |
| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum |
| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) |
| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum |
| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum |
| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass |
| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) |
| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) |