History of changes
This page lists the changes to REST API v2 that affect existing integrations. New attributes and endpoints that do not change existing behavior are documented on the resource pages and in the release notes.
2026-08-24 - Tenant branding endpoints
REST API v2 exposes tenant branding (colors, custom CSS, and logo images) under the new branding
permission resource with view and edit actions:
GETandPUT /api/v2/tenants/<tenant-id>/branding.jsonread and update the branding configuration.GET,PUT, andDELETE /api/v2/tenants/<tenant-id>/branding/logo/<location>download, upload, and delete the logo image of the Sign-In page (login_page) or the top navigation bar (header_menu).
The advanced search of calls gains the call note parameters note, note_created_at,
note_is_pinned, note_is_resolved, note_pos_begin, note_pos_end, note_user, and
note_user_id, and the counters notes_count_excluding_replies and notes_count_replies.
notes_count now includes replies. See
Advanced search.
2026-06-13 - Report run data format, evaluation report feedback, search filter types
Report run data
GET /api/v2/reports/<report-id>/runs/<run-id>/data.json returns a new shape. The
parent_row_id parameter is removed. See View report run data.
Before:
{
"headers": ["group_name", "count_calls", "minutes_total"],
"rows": [
{"name": "SUMMARY", "count_calls": 230, "minutes_total": 1200, "n_rows": 5, "row_type": "summary"},
{"name": "Administrators", "group_id": "28d20df6-...", "group_name": "Administrators",
"count_calls": 4, "minutes_total": 20, "row_type": "group_calls"},
{"name": "Home Office", "group_id": "afef22c4-...", "group_name": "Home Office",
"count_calls": 14, "minutes_total": 75, "row_type": "group_calls"}
]
}
After:
{
"headers": [
{"name": "group_id", "header": "Group - ID", "super_header": null, "hidden": true, "type": "uuid"},
{"name": "group_name", "header": "Group - Name", "super_header": null, "hidden": false, "type": "str"},
{"name": "count_calls", "header": "Calls - Total", "super_header": null, "hidden": false, "type": "int"},
{"name": "minutes_total", "header": "Minutes - Total", "super_header": null, "hidden": false, "type": "float"}
],
"summary": {"count_calls": 230, "minutes_total": 1200.0, "n_rows": 5},
"data": [
["28d20df6-...", "Administrators", 4, 20.0],
["afef22c4-...", "Home Office", 14, 75.0]
]
}
To migrate an integration:
- Read
headersas a list of objects and take the column key fromname(headers[i].nameinstead ofheaders[i]). Usehiddento skip helper columns the web portal does not show, andtypeto parse the values. - Read each row of
dataas a positional array: the value of columnheaders[i]isrow[i]. Rows are no longer objects keyed by column name. - Read the summary from the top-level
summaryobject instead of the row withrow_type: "summary". When the template has no summary,summaryis{}. - Drop any use of
row_type,name, andparent_row_id. Nested rows are not returned; every row is a leaf. - Durations (
type: "timedelta") are numbers of seconds, dates and times are ISO 8601 strings, UUIDs are strings.
Evaluation reports
- The
commentattribute of an evaluation report is renamedadditional_feedback, andstrengths_feedbackandimprovement_feedbackare added. Update integrations that readcomment. See View an evaluation report. - In the advanced search of calls, the parameter
evaluation_report_commentbecomesevaluation_report_feedback(searches all three feedback fields), plus the split parametersevaluation_report_strengths_feedback,evaluation_report_improvement_feedback, andevaluation_report_additional_feedback. Saved searches are migrated automatically, and requests that still sendevaluation_report_commentare accepted and mapped toevaluation_report_feedback.
Advanced search filter types
- The filter types
set,string_set, andmulti_param_setare renamedchoice,text_choice, andmulti_param_choice. The date and datetime operatorsolder_thanandnewer_thanare renamedbeforeandafter. Legacy operator names are still accepted, so existing requests keep working. - Every filter that offers
betweenalso offersnot_between. - An invalid UUID in a search value returns 400 Bad Request instead of being ignored.
See Advanced search.
Custom fields
Custom field settings moved into typed fieldsets (fieldset_text_value_settings,
fieldset_integer_value_settings, fieldset_dropdown_value_settings,
fieldset_display_settings). The former top-level attributes and the fieldset_options and
fieldset_thresholds fieldsets are still accepted in requests but are not returned. See
Custom field attributes.
2024-07-21 - Call object
file_pathis removed from the files of a call. Use Retrieve file for playback to get the audio.matched_topics,custom_fields, and the transcripts infiles[].speech_analyticsare added to the call object. See Call object fields.
2024-05-28 - Rate limits
Per-tenant API request limits are enforced. Requests over the limit are rejected with
429 Too Many Requests, and every response carries RateLimit-* headers. See
Rate limits.
2022-02 - User screen recording settings
screen_recording_login moved from fieldset_recording to the new fieldset_screen_recording
of the user object. The old location is still accepted in requests.
2018-07-07 - Tenant licensing
Per-tenant license configuration is improved. Previously, only call recording licenses could use the "first-come, first-served" (dynamic) mode; other licenses were always fixed. All licenses can now be dynamic or fixed.
In tenant.fieldset_licensing:
license_modeis deprecated. It is ignored in PUT and POST requests and is not returned in GET responses.- Any license type can be set to
null, which means no limit (dynamic allocation).
Before:
{
"tenant": {
"fieldset_licensing": {
"license_mode": "dynamic",
"recording_seats": -1,
"screen_recording_seats": 0,
"monitoring_seats": 10,
"evaluation_seats": 20,
"speech_analytics": 20
},
...
Now:
{
"tenant": {
"fieldset_licensing": {
"recording_seats": null,
"screen_recording_seats": 0,
"monitoring_seats": 10,
"evaluation_seats": 20,
"speech_analytics": 20
},
...