Agent Disposition Notes
Agent disposition notes capture the outcome and free-text notes an agent records for an interaction. Use these endpoints to set notes while a call is being dispositioned, read notes after a call is archived, or update notes for an outbound campaign pass.
Choose an Endpoint
| Goal | Endpoint |
|---|---|
| Set disposition and notes for a live call | POST /voice/api/v1/admin/accounts/{accountId}/activeCalls/{uii}/dispositionCall |
| Read disposition and notes after a call is archived | GET /voice/api/v1/admin/accounts/{accountId}/callHistory/{uii} |
| List outbound campaign passes for a lead | GET /voice/api/v1/admin/accounts/{accountId}/dialGroups/{dialGroupId}/campaigns/{campaignId}/leads/{leadId}/passes |
| Update disposition and notes for an outbound campaign pass | PUT /voice/api/v1/admin/accounts/{accountId}/dialGroups/{dialGroupId}/campaigns/{campaignId}/leads/{leadId}/passes/{passUii}/agentNotesAndDisposition |
Requirements
- Use a RingCX access token. For authentication details, see RingCentral authentication.
- Use the RingCX sub-account ID as
accountId. - Obtain the UII from Listing Active Calls while the call is active, and retain it for call-level updates and archived call-history retrieval.
- Disposition values must already exist in the account, queue, or campaign configuration that applies to the interaction.
- URL-encode query parameter values, especially free-text notes.
SDK Setup
SDK examples in this article use JWT authentication and load credentials from environment variables.
npm install ringcentral-engage-voice-client dotenv
pip3 install ringcentral_engage_voice python-dotenv
Create a .env file in the directory where you run the sample:
RC_CLIENT_ID=<clientId>
RC_CLIENT_SECRET=<clientSecret>
RC_JWT=<jwt>
The SDK wrapper reads these values, signs in with RingCentral, and exchanges the RingCentral access token for a RingCX access token before calling RingCX APIs.
Read Notes for an Archived Call
After a call is archived, use the call history endpoint to retrieve the disposition and notes associated with the UII.
GET https://ringcx.ringcentral.com/voice/api/v1/admin/accounts/{accountId}/callHistory/{uii}
Authorization: Bearer <ringcxAccessToken>
Accept: application/json
const EngageVoice = require("ringcentral-engage-voice-client").default;
require("dotenv").config();
async function main() {
const ev = new EngageVoice({
clientId: process.env.RC_CLIENT_ID,
clientSecret: process.env.RC_CLIENT_SECRET
});
await ev.authorize({ jwt: process.env.RC_JWT });
const response = await ev.get(
"/api/v1/admin/accounts/{accountId}/callHistory/{uii}"
);
console.log(response.data);
}
main().catch(console.error);
import os
from dotenv import load_dotenv
from ringcentral_engage_voice import RingCentralEngageVoice
load_dotenv()
ev = RingCentralEngageVoice(
os.environ["RC_CLIENT_ID"],
os.environ["RC_CLIENT_SECRET"],
)
ev.authorize(jwt=os.environ["RC_JWT"])
response = ev.get("/api/v1/admin/accounts/{accountId}/callHistory/{uii}")
print(response.json())
The response includes call-level fields such as agentDisposition and session-level history in activeCallSessionHistories. Session history records can include agentNotes.
Response example
{
"accountId": "12345678",
"uii": "202605051013071101050000000902",
"agentDisposition": "SALE",
"activeCallSessionHistories": [
{
"sessionId": "1",
"agentNotes": "Customer requested follow-up."
}
]
}
Set Notes for a Live Call
Use dispositionCall when an active or pending-disposition call needs to be completed with an agent disposition and optional notes.
POST https://ringcx.ringcentral.com/voice/api/v1/admin/accounts/{accountId}/activeCalls/{uii}/dispositionCall?disposition=SALE&callback=false¬es=Customer%20requested%20follow-up
Authorization: Bearer <ringcxAccessToken>
Accept: application/json
| Parameter | Requirement | Description |
|---|---|---|
disposition |
Required | Preconfigured disposition value to store on the call. |
callback |
Required | Use true when the disposition schedules a callback. |
callBackDTS |
Required when callback=true |
Callback date and time in yyyyMMddHHmmss format. |
notes |
Optional | Free-text notes to store with the disposition record. |
The endpoint returns true when the update succeeds.
Response example
true
Read or Update Outbound Campaign Pass Notes
For outbound campaign leads, notes can also be stored on a campaign pass. List passes for the lead first, then update the target passUii.
GET https://ringcx.ringcentral.com/voice/api/v1/admin/accounts/{accountId}/dialGroups/{dialGroupId}/campaigns/{campaignId}/leads/{leadId}/passes
Authorization: Bearer <ringcxAccessToken>
Accept: application/json
Response example
[
{
"passUii": "202605051013071101050000000902",
"agentDisposition": "SALE",
"agentNotes": "Customer requested follow-up."
}
]
To update a pass:
PUT https://ringcx.ringcentral.com/voice/api/v1/admin/accounts/{accountId}/dialGroups/{dialGroupId}/campaigns/{campaignId}/leads/{leadId}/passes/{passUii}/agentNotesAndDisposition?agentDisposition=SALE&agentNotes=Customer%20requested%20follow-up
Authorization: Bearer <ringcxAccessToken>
Accept: application/json
The response is the updated CampaignPass.
Permissions
| Endpoint | Required RingCX permission |
|---|---|
POST /activeCalls/{uii}/dispositionCall |
READ on Account (Permission Override) |
GET /callHistory/{uii} |
READ on Account |
GET /passes |
READ on Campaign |
PUT /agentNotesAndDisposition |
UPDATE on Campaign |
Examples
PUT https://ringcx.ringcentral.com/voice/api/v1/admin/accounts/12345678/dialGroups/1001/campaigns/2002/leads/3003/passes/202605051013071101050000000902/agentNotesAndDisposition?agentDisposition=SALE&agentNotes=Customer%20requested%20follow-up
Authorization: Bearer <ringcxAccessToken>
Accept: application/json
import os
import requests
base_url = "https://ringcx.ringcentral.com/voice/api/v1/admin/accounts"
token = os.environ["RINGCX_ACCESS_TOKEN"]
account_id = "12345678"
dial_group_id = 1001
campaign_id = 2002
lead_id = 3003
pass_uii = "202605051013071101050000000902"
url = (
f"{base_url}/{account_id}/dialGroups/{dial_group_id}"
f"/campaigns/{campaign_id}/leads/{lead_id}"
f"/passes/{pass_uii}/agentNotesAndDisposition"
)
params = {
"agentDisposition": "SALE",
"agentNotes": "Customer requested follow-up.",
}
headers = {"Authorization": f"Bearer {token}", "Accept": "application/json"}
response = requests.put(url, params=params, headers=headers)
response.raise_for_status()
print(response.json())
const baseUrl = "https://ringcx.ringcentral.com/voice/api/v1/admin/accounts";
const token = process.env.RINGCX_ACCESS_TOKEN;
const accountId = "12345678";
const dialGroupId = 1001;
const campaignId = 2002;
const leadId = 3003;
const passUii = "202605051013071101050000000902";
const url = new URL(
`${baseUrl}/${accountId}/dialGroups/${dialGroupId}` +
`/campaigns/${campaignId}/leads/${leadId}` +
`/passes/${passUii}/agentNotesAndDisposition`
);
url.search = new URLSearchParams({
agentDisposition: "SALE",
agentNotes: "Customer requested follow-up.",
});
const response = await fetch(url, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json",
},
});
if (!response.ok) {
throw new Error(`Request failed: ${response.status}`);
}
console.log(await response.json());