User Call Forwarding Targets
A user call forwarding target refers to an external phone number, a device, or a co-worker (another user extension within the same account) that will ring—either sequentially or simultaneously—when the user receives an incoming call, in addition to the user’s own devices and RingCentral apps (mobile and desktop app).
This feature allows users to answer incoming calls on the device or app that best suits their needs. For example, a user can set their personal mobile number as a forwarding target, ensuring that their mobile phone rings alongside their RingCentral business number—even if the RingCentral mobile app is not installed on their mobile phone.
Common use cases include:
- External phone number – Forward incoming calls to an external phone number — for example, the user’s personal mobile number — allowing the user to answer calls without installing the RingCentral mobile app on their personal device.
- Co-worker’s extension – Forward calls to a colleague’s extension to ensure coverage when the user is temporarily having access to the colleague's business phone, or expects the co-worker to answer incoming calls on their behalf.
Call forwarding targets can be set separately for the following user call handling rules:
- The “work-hours” state call handling rule.
- The “after-hours” state call handling rule.
- The “agent” state call handling rule.
- Any custom call handling rule.
With the ability to configure different call forwarding targets for different call handling rules, users can optimize how their incoming calls are managed in various scenarios. This flexibility ensures that calls are answered in the most effective way based on the user’s schedule and preferences.
Notes
- Call forwarding target is not the same as call forwarding destination which can be set via the “Forward the call” action configuration in the Do-not-disturb, or “Forward all calls" states, or in other call handling rules when a user is not available to answer incoming calls.
- When a call is answered by an external number or a co-worker instead of the user’s own RingCentral app or device, the user’s presence status is set to “busy” and the user's telephony status is set to "CallConnected", even if the user is not actually on the call.
- When a call is answered by a co-worker app or device instead of the user’s own RingCentral app or device, the co-worker’s presence status and the telephony status is unchanged, even if the co-worker is actually on the call.
Call forwarding target configurations are managed through the “Ring Settings” of a call handling rule. These settings allow users to add or remove targets, define the ringing duration, group or ungroup the targets, enable or disable specific targets, and choose the ringing mode—either ringing all targets simultaneously or in a predefined order.
There is a special setting for desktop and mobile app targets that ensures they always ring for incoming calls alongside other enabled ring group targets, regardless of whether the dispatching type is set to "RingAtOnce" or "RingInOrder".
Example use case 1: Work hours vs. call queue
Alex works at a financial institution and uses both a RingCentral desk phone and a laptop with the RingCentral app installed. During work hours, Alex sits at his desk and can receive incoming calls on either device. In addition, Alex is a member of a call queue that handles new inquiries together with his colleagues, so he receives calls either directly to his business number or through the call queue.
To quickly distinguish between direct calls and call queue calls, Alex configures the call handling rules for the work-hours state and the agent state as follows:
- Work-hours state ring settings rule – Direct business calls ring only the RingCentral app on his laptop.
- Agent state ring settings rule – Call queue calls ring only his RingCentral desk phone.
This setup helps Alex easily identify the type of incoming call and respond appropriately.
Example use case 2: After hours
Outside of work hours, Alex wants to ensure he can still receive urgent direct calls without being tied to his desk, but he does not have the RingCentral mobile app installed on his personal phone. To address this, he sets up an after-hours rule so that incoming direct business calls ring his personal mobile phone. This allows Alex to stay reachable for important calls while maintaining flexibility after leaving the office. He also configures the rule to prevent his RingCentral desk phone from ringing after hours, which could disturb colleagues sitting nearby.
- After-hours state ring settings rule:
Configure call forwarding targets and ring settings via API
All of the configurations demonstrated in the examples above can be set programmatically through the platform APIs. This is done using the User Call Handling Configuration APIs, which allow developers to define state-based rules (e.g., work hours, after hours, agent state) as well as custom rules tailored to specific call handling requirements.
A call forwarding target's parameters are specified within a “RingGroupAction” dispatching action object. The "RingGroupAction" action is an object which contains information about a call forwarding target, where the target can be set enabled or disabled and the specified ringing duration.
Example of a “RingGroupAction” object
{
"type": "RingGroupAction",
"enabled": true,
"targets": [
{
"type": "PhoneNumberRingTarget",
"destination": {
"phoneNumber": "+12093151072"
},
"name": "Personal Number"
}],
"duration": 20
}
RingGroupAction Object
Parameter | Type | Values/description |
---|---|---|
type |
String | ”RingGroupAction” |
enabled |
Boolean | true Or false. If true, this target will ring. |
targets |
List | An array containing one or more target objects that define call forwarding target information. If the targets array includes multiple objects, they form a ring group, and all specified targets will be collectively enabled or disabled based on the enabled flag setting. See the Targets object for more details. |
duration |
Integer | A number that defines the ringing duration at this target. One ringing equals 5 seconds. |
Ring group targets
Object
The targets
object can be specified with one of the following target types:
- "AllDesktopRingTarget"
- "AllMobileRingTarget"
- "CoworkerRingTarget"
- "PhoneNumberRingTarget"
- "DeviceRingTarget"
- "HotdeskRingTarget"
- "ImsPhoneNumberRingTarget"
- "IntegrationRingTarget"
AllDesktopRingTarget object
Refers to all RingCentral apps (desktop, laptop, and web). This forwarding target is automatically created by the system as the user’s personal default forwarding target. It cannot be removed or deleted from the user’s personal call forwarding list; however, it can be enabled or disabled, and its ring duration can be modified.
This type of forwarding target can be added or removed when configured as a co-worker forwarding target. See the Requirements section for details on setting it up as a co-worker forwarding target.
Parameter | Type | Values/Description |
---|---|---|
type |
String | "AllDesktopRingTarget" |
name |
String | The name of the desktop app. The default value is "My desktop", and it is read-only. |
extension |
Object | An object contains the extension ID of the target extension. Required only for co-worker forwarding targets. See the Extension object for details. |
AllMobileRingTarget object
Refers to all RingCentral mobile apps (Android and iOS). This forwarding target is automatically created by the system as the user’s personal default forwarding target. It cannot be removed or deleted from the user’s personal call forwarding list; however, it can be enabled or disabled, and its ring duration can be modified.
This type of forwarding target can be added or removed when configured as a co-worker forwarding target. See the Requirements section for details on setting it up as a co-worker forwarding target.
Parameter | Type | Values/Description |
---|---|---|
type |
String | "AllMobileRingTarget" |
name |
String | The name of the mobile app. The default value is "My mobile apps", and it is read-only. |
extension |
Object | An object contains the extension ID of the target extension. Required only for co-worker forwarding targets. See the Extension object for details. |
PhoneNumberRingTarget object
Refers to an external PSTN phone number.
Parameter | Type | Values/Description |
---|---|---|
type |
String | "PhoneNumberRingTarget" |
destination |
Object | An object contains the external phone number as the target. See the Destination object for details. |
name |
String | The label of the phone number. |
CoworkerRingTarget object
Refers to a user extension within the same RingCentral account.
Parameter | Type | Values/Description |
---|---|---|
type |
String | "CoworkerRingTarget" |
extension |
Object | An object contains the extension ID of the target extension. See the Extension object for details. |
DeviceRingTarget object
Refers to a hard phone (a SIP device) registered and assigned to a user extension within the same RingCentral account.
This forwarding target is automatically created by the system as the user’s personal default forwarding target if a user is assigned with a device (usually a desk phone). It cannot be removed or deleted from the user’s personal call forwarding list; however, it can be enabled or disabled, and its ring duration can be modified.
This type of forwarding target can be added or removed when configured as a co-worker forwarding target. See the Requirements section for details on setting it up as a co-worker forwarding target.
Parameter | Type | Values/Description |
---|---|---|
type |
String | "DeviceRingTarget" |
device |
Object | An object contains the info of the target device. See the Device object for details. |
extension |
Object | An object contains the extension ID of the extension that owns the device. Required only for co-worker forwarding targets. See the Extension object for details. |
name |
String | The name of the device. |
HotdeskRingTarget object
Refers to a Hot Desk phone registered within the same RingCentral account.
Parameter | Type | Values/Description |
---|---|---|
type |
String | "HotdeskRingTarget" |
device |
Object | An object contains the info of the target device. See the Device object for details. |
name |
String | The name of the hot desk device. |
ImsPhoneNumberRingTarget object
Refers to an IMS phone number. Requires the user to have an active IMS phone number.
Parameter | Type | Values/Description |
---|---|---|
type |
String | "ImsPhoneNumberRingTarget" |
destination |
Object | An object contains the integration info of the target. See the Destination object for details. |
name |
String | The label of the phone number. |
IntegrationRingTarget object
Refers to an integration (MS-Team or FMC Lite). Required account special configurations!
Parameter | Type | Values/Description |
---|---|---|
type |
String | "IntegrationRingTarget" |
integration |
Object | An object contains the integration info of the target. See the Integration object for details. |
name |
String | The label of the phone number. |
Destination object
Refers to a PSTN phone number target
Parameter | Type | Values/Description |
---|---|---|
phoneNumber |
String | The PSTN phone number. Number is in E.164 format. |
Extension object
Refers to a user extension who owns the forwarding target.
Parameter | Type | Values/Description |
---|---|---|
id |
String | The internal identifier of the extension. |
Device object
Refers to a user own device or a co-worker device
Parameter | Type | Values/Description |
---|---|---|
id |
String | The internal identifier of the device. |
name |
String | The name of the device. This is a read-only value. |
phoneNumber |
String | The phone number assigned to the device. This is a read-only value. |
Integration object
Parameter | Type | Values/Description |
---|---|---|
type |
String | The integration identifier. Can be either "MsTeamDirectRouting" or "FmcLite". |
phoneNumber |
String | The phone number to be ringing. |
RingAlwaysGroupAction Object
Refers to the user's own desktop app or mobile app configured to always ring.
Parameter | Type | Values/description |
---|---|---|
type |
String | RingAlwaysGroupAction |
enabled |
Boolean | true Or false. If true, this target will ring. |
targets |
List | An array containing one or more target objects that define call forwarding target information. If the targets array includes multiple objects, they form a ring group, and all specified targets will be collectively enabled or disabled based on the enabled flag setting. See the Targets object for more details. |
Ring always group targets object
The targets
object within a "RingAlwaysGroupAction" object can be specified with one of the following target types:
- "AllDesktopRingTarget". See the AllDesktopRingTarget object
- "AllMobileRingTarget". See the AllMobileRingTarget object
Notes
When the "RingAlwaysGroupAction" is applied to the "AllDesktopRingTarget" or "AllMobileRingTarget", the corresponding "RingGroupAction" configuration for that target must be removed from the call handling settings.
Read user call forwarding target configurations
As user’s call forwarding targets are set per call handling rule, developers can read the user's call forwarding targets for their "work-hours", "after-hours" and "agent" state-based rules and custom rules using the following APIs:
Read state-base rules:
GET /restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours
GET /restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/after-hours
GET /restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/agent
Read a custom rule:
GET /restapi/v2/accounts/~/extensions/~/comm-handling/voice/interaction-rules/{ruleId}
Example response with "RingGroupAction" and "RingAlwaysGroupAction" info
...
{
"type": "RingGroupAction",
"enabled": true,
"targets": [
{
"type": "AllDesktopRingTarget",
"name": "My desktop"
}
],
"duration": 20
},
{
"type": "RingGroupAction",
"enabled": false,
"targets": [
{
"type": "PhoneNumberRingTarget",
"destination": {
"phoneNumber": "+16501234567"
},
"name": "Temporary number"
}
],
"duration": 30
},
{
"type": "RingGroupAction",
"enabled": false,
"targets": [
{
"type": "CoworkerRingTarget",
"extension": {
"id": "2465164005"
}
}
],
"duration": 20
},
{
"type": "RingAlwaysGroupAction",
"enabled": true,
"targets": [
{
"type": "AllMobileRingTarget",
"name": "My mobile apps"
}
]
}
...
Set user call forwarding target configurations
As user’s call forwarding targets are set per call handling rule, developers can update the user's call forwarding targets for their "work-hours", "after-hours" and "agent" state-based rules and custom rules using the following APIs:
Update state-base rules:
PATCH /restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours
PATCH /restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/after-hours
PATCH /restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/agent
Update a custom rule:
PATCH /restapi/v2/accounts/~/extensions/~/comm-handling/voice/interaction-rules/{ruleId}
The recommended approach to updating call forwarding targets is to first retrieve the current call handling settings, then modify, add, or remove the "RingGroupAction" or "RingAlwaysGroupAction" within the actions list as needed, and finally update the entire call handling dispatching
object.
Example of setting the work-hours state-based call forwarding targets
The following example demonstrates how to add a new call forwarding target of type "PhoneNumberRingTarget" to the work-hours state-based rule.
Running the code
If you have tried the RingOut quick start, you can just copy all the functions below and add them to the quick start project then call the read_user_workhours_state_rules() function. Otherwise, edit the variables in ALL CAPS with your app and user credentials before running the code.
- 'RC_APP_CLIENT_ID' : Your app client ID
- 'RC_APP_CLIENT_SECRET': Your app client secret
- 'RC_USER_JWT': The user's JWT
Install RingCentral JavaScript SDK
$ npm install @ringcentral/sdk --save
Create and edit a update-wh-state-call-forwarding-targets.js file
Create a file named update-wh-state-call-forwarding-targets.js
, then copy and paste the following code into the file.
const RC = require('@ringcentral/sdk').SDK
// Instantiate the SDK and get the platform instance
var rcsdk = new RC({
server: 'https://platform.ringcentral.com',
clientId: 'RC_APP_CLIENT_ID',
clientSecret: 'RC_APP_CLIENT_SECRET'
});
var platform = rcsdk.platform();
/* Authenticate a user using a personal JWT token */
platform.login({ jwt: 'RC_USER_JWT' })
platform.on(platform.events.loginSuccess, () => {
read_user_workhours_state_rules()
})
platform.on(platform.events.loginError, function(e){
console.log("Unable to authenticate to platform. Check credentials.", e.message)
process.exit(1)
});
/*
* Read existing rules
*/
async function read_user_workhours_state_rules() {
try {
let endpoint = '/restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours'
var resp = await platform.get(endpoint)
var jsonObj = await resp.json()
await update_user_workhours_state_rules(jsonObj.dispatching)
} catch (e) {
console.log("Unable to read user Work-Hours state rules. ", e.message);
}
}
/*
* Update the Work-Hours state rules with new values
*/
async function update_user_workhours_state_rules(dispatching){
try {
// new phone number forwarding target
let newTarget = {
type: "RingGroupAction",
enabled: true,
targets: [
{
type: "PhoneNumberRingTarget",
destination: {
phoneNumber: "+13121234567"
},
name: "Temporary number"
}
],
duration: 25 // 5 rings
}
dispatching.actions.unshift(newTarget)
// Update the entire dispatching configurations
console.log(JSON.stringify(dispatching, null, 4))
let bodyParams = {
dispatching: dispatching
}
let endpoint = '/restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours'
var resp = await platform.patch(endpoint, bodyParams)
var jsonObj = await resp.json()
console.log(JSON.stringify(jsonObj, null, 4))
} catch (e) {
console.log("Unable to update user Work-Hours state rules. ", e.message);
}
}
Install RingCentral PHP SDK
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar require ringcentral/ringcentral-php
Create and edit a update-wh-state-call-forwarding-targets.php file
Create a file named update-wh-state-call-forwarding-targets.php
, then copy and paste the following code into the file.
<?php
require('vendor/autoload.php');
// Instantiate the SDK and get the platform instance
$rcsdk = new RingCentral\SDK\SDK( 'RC_APP_CLIENT_ID', 'RC_APP_CLIENT_SECRET', 'https://platform.ringcentral.com' );
$platform = $rcsdk->platform();
/* Authenticate a user using a personal JWT token */
$platform->login(["jwt" => 'RC_USER_JWT']);
read_user_workhours_state_rules();
/*
* Read existing rules
*/
function read_user_workhours_state_rules() {
global $platform;
try {
$endpoint = "/restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours";
$resp = $platform->get($endpoint);
update_user_workhours_state_rules($resp->json()->dispatching);
}catch (\RingCentral\SDK\Http\ApiException $e) {
// Getting error messages using PHP native interface
print 'HTTP Error: ' . $e->getMessage() . PHP_EOL;
// Another way to get message, but keep in mind, that there could be no response if request has failed completely
print "Unable to read user Work-Hours state rules. " . $e->apiResponse->response()->error() . PHP_EOL;
}
}
/*
* Update the Work-Hours state rules with new values
*/
function update_user_workhours_state_rules($dispatching){
global $platform;
try {
// new phone number forwarding target
$newTarget = [
"type" => "RingGroupAction",
"enabled" => true,
"targets" => [
[
"type" => "PhoneNumberRingTarget",
"destination" => [
"phoneNumber" => "+13121234567"
],
"name" => "Temporary number"
]
],
"duration" => 25 // 5 rings
];
array_unshift($dispatching->actions, $newTarget);
$bodyParams = array( 'dispatching' => $dispatching );
$endpoint = "/restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours";
$resp = $platform->patch($endpoint, $bodyParams);
print_r ($resp->json());
}catch (\RingCentral\SDK\Http\ApiException $e) {
// Getting error messages using PHP native interface
print 'HTTP Error: ' . $e->getMessage() . PHP_EOL;
// Another way to get message, but keep in mind, that there could be no response if request has failed completely
print "Unable to update user Work-Hours state rules. " . $e->apiResponse->response()->error() . PHP_EOL;
}
}
?>
Install RingCentral Python SDK
$ pip install ringcentral
Create and edit a update-wh-state-call-forwarding-targets.py file
Create a file named update-wh-state-call-forwarding-targets.py
, then copy and paste the following code into the file.
from ringcentral import SDK
import json
#
# Read existing rules
#
def read_user_workhours_state_rules():
try:
endpoint = '/restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours'
resp = platform.get(endpoint)
jsonObj = resp.json_dict()
update_user_workhours_state_rules(jsonObj['dispatching'])
except Exception as e:
print ("Unable to read user Work-Hours state rules. " + str(e))
#
# Update the Work-Hours state rules with new values
#
def update_user_workhours_state_rules(dispatching):
try:
# new phone number forwarding target
newTarget = {
"type": "RingGroupAction",
"enabled": True,
"targets": [
{
"type": "PhoneNumberRingTarget",
"destination": {
"phoneNumber": "+13121234567"
},
"name": "Temporary number"
}
],
"duration": 25 # 5 rings
}
dispatching['actions'].insert(0, newTarget)
bodyParams = {
'dispatching': dispatching
}
endpoint = '/restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours'
resp = platform.patch(endpoint, bodyParams)
jsonObj = resp.json_dict()
print(json.dumps(jsonObj, indent=2, sort_keys=True))
except Exception as e:
print ("Unable to update user Work-Hours state rules. " + str(e))
# Authenticate a user using a personal JWT token
def login():
try:
platform.login( jwt= "RC_USER_JWT" )
read_user_workhours_state_rules()
except Exception as e:
print ("Unable to authenticate to platform. Check credentials. " + str(e))
# Instantiate the SDK and get the platform instance
rcsdk = SDK("RC_APP_CLIENT_ID", "RC_APP_CLIENT_SECRET", "https://platform.ringcentral.com")
platform = rcsdk.platform()
login()
Install RingCentral Ruby SDK
$ gem install ringcentral-sdk dotenv
Create and edit a update-wh-state-call-forwarding-targets.rb file
Create a file named update-wh-state-call-forwarding-targets.rb
, then copy and paste the following code into the file.
require 'ringcentral'
#
# Read existing rules
#
def read_user_workhours_state_rules()
begin
endpoint = '/restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours'
resp = $platform.get(endpoint)
jsonObj = resp.body()
update_user_workhours_state_rules(jsonObj['dispatching'])
rescue StandardError => e
puts ("Unable to read user Work-Hours state rules. " + e.to_s)
end
end
#
# Update the Work-Hours state rules with new values
#
def update_user_workhours_state_rules(dispatching)
begin
# new phone number forwarding target
newTarget = {
"type" => "RingGroupAction",
"enabled" => true,
"targets" => [
{
"type" => "PhoneNumberRingTarget",
"destination" => {
"phoneNumber" => "+13121234567"
},
"name" => "Temporary number"
}
],
"duration" => 25 # 5 rings
}
dispatching["actions"].unshift(newTarget)
bodyParams = {
dispatching: dispatching
}
endpoint = '/restapi/v2/accounts/~/extensions/~/comm-handling/voice/state-rules/work-hours'
resp = $platform.patch(endpoint, payload: bodyParams)
puts(resp.body)
rescue StandardError => e
puts ("Unable to update user Work-Hours state rules. " + e.to_s)
end
end
# Authenticate a user using a personal JWT token
def login()
begin
$platform.authorize( jwt: "RC_USER_JWT" )
read_user_workhours_state_rules()
rescue StandardError => e
puts ("Unable to authenticate to platform. Check credentials. " + e.to_s)
end
end
# Instantiate the SDK and get the platform instance
$platform = RingCentral.new( "RC_APP_CLIENT_ID", "RC_APP_CLIENT_SECRET", "https://platform.ringcentral.com" )
login()
Sample response
{
"id": "work-hours",
"displayName": "Work Hours",
"dispatching": {
"actions": [
{
"type": "PlayWelcomePromptAction",
"greeting": {
"effectiveGreetingType": "Preset",
"preset": {
"id": "66048"
}
},
"enabled": true
},
...
{
"type": "RingGroupAction",
"enabled": true,
"targets": [
{
"type": "PhoneNumberRingTarget",
"destination": {
"phoneNumber": "+13121234567"
},
"name": "Temporary number"
}
],
"duration": 25
},
...
Co-worker forwarding target configurations requirements
To configure co-worker forwarding targets for the following target types, the "CoworkerLineAndAppsForwarding" feature must be enabled on the account before these targets can be set up:
- "AllMobileRingTarget"
- "AllDesktopRingTarget"
- "DeviceRingTarget"
The following API allows developers to verify whether the required feature is enabled for their account.
GET `/restapi/v1.0/account/~/extension/[extId]/features?featureId=CoworkerLineAndAppsForwarding`
Example response
{
"records" : [ {
"id" : "CoworkerLineAndAppsForwarding",
"available" : false,
"reason" : {
"code" : "AccountLimitation",
"message" : "The feature is turned off for the current account"
}
} ]
}
To enable this feature for an account, the customer can submit a request to RingCentral Customer Support or contact their RingCentral Account Manager.
Read user call forwarding targets
To list all call forwarding targets configured across a user’s state-based and custom call handling rules, developers can use the Get Forwarding Targets API. This endpoint returns detailed information about each forwarding target; however, it does not include the associated rule identity.
Delete user call forwarding targets
If a call forwarding target is no longer available or no longer needed, it can be removed from the user's call forwarding targets list.
While a call forwarding target can be removed from an individual call handling rule (state-based or custom) using the User Call Handling Rule API, developers can remove the target from all rules (if configured for multiple rules) by calling the Delete Forwarding Targets API. This is equivalent to selecting “Yes, all rules” in the RingCentral app (Settings -> Phone -> Incoming call rules) or user admin portal when manually deleting a forwarding target.
Notes
Please notice that the following user's personal forwarding targets cannot be deleted:
- "AllMobileRingTarget"
- "AllDesktopRingTarget"
- "DeviceRingTarget"