﻿<a id="account-xml"></a>

# Account XML

SIP Accounts are specified in an XML format, where SIP credentials and various other options are specified. Below is the
description of the recognized XML nodes and their possible values.

<div class="section-index" markdown>
**Quick navigation**

- [Credentials](#credentials)
- [SIPIS](#sipis)
- [Proxies](#proxies)
- [Voicemail](#voicemail)
- [Audio Codecs](#audio-codecs)
- [Opus codec options](#opus-codec-options)
- [Jitter buffer options](#jitter-buffer-options)
- [Video Codecs](#video-codecs)
- [DTMF](#dtmf)
- [NAT Traversal](#nat-traversal)
- [Custom SIP Headers](#custom-sip-headers)
- [Do Not Disturb](#do-not-disturb)
- [Number Rewriting](#number-rewriting)
- [Incoming Calls](#incoming-calls)
- [Secure Calls](#secure-calls)
- [External Provisioning](#external-provisioning)
- [Balance Checking](#balance-checking)
- [Web Callback](#web-callback)
- [Call Through](#call-through)
- [Call Forwarding](#call-forwarding)
- [Call Waiting](#call-waiting)
- [Miscellaneous](#miscellaneous)
- [Call Tones](#call-tones)
- [Auto Answer](#auto-answer)
- [Busy Lamp Field](#busy-lamp-field)
- [CardDav](#carddav)
- [Push Options](#push-options)
- [Desktop Options](#desktop-options)
- [Video Conferencing](#video-conferencing)
- [Account Example](#account-example)
</div>

## Credentials

### title { .reference-entry }

```xml
<title>Account Title</title>
```

**Default**:
empty

**Description**:
The title of the account. It is shown at various places in the GUI and it must have a non-empty value.
It is normally populated from Cloud Softphone portal or filled-in by user in the edit account forms. In
case you set the value via provisioning, make sure it's not empty, otherwise the account validation will
fail and the account won't be saved.

### username { .reference-entry }

```xml
<username>johndoe</username>
```

**Default**:
No default value

**Description**:
SIP user name

### password { .reference-entry }

```xml
<password>secretPhrase</password>
```

**Default**:
No default value

**Description**:
SIP password

### cloud_username and cloud_password { .reference-entry }

```xml
<cloud_username>johndoe@company.org</cloud_username>
<cloud_password>secretPhrase2</cloud_password>
```

**Default**:
No default value

**Description**:
Many providers prefer to use different credentials to log in to the app than for the SIP credentials.
If you return values for these, they can be used for authorizing external provisioning requests or other web service request as described here
:ref: client-api-intro.

### networkId { .reference-entry }

```xml
<networkid>subdomain</networkid>
```

**Default**:
No default value

**Description**:
Network ID is used to partition users into subdomains in multi-tenant applications that use
Acrobits services such as Conferencing or Turnkey Messaging.

### userDisplayName { .reference-entry }

```xml
<userdisplayname>John Doe</userdisplayname>
```

**Default**:
empty string

**Description**:
SIP display user name, comes quoted in front of SIP uri.

### authUsername { .reference-entry }

```xml
<authusername>johndoe</authusername>
```

**Default**:
empty string

**Description**:
Username used in SIP authorization headers. If left empty, the username is used.

### host { .reference-entry }

```xml
<host>sip.example.com[:port]</host>
```

**Default**:
No default value.

**Description**:
SIP domain, used in SIP URIs as username@host. The SIP domain is also used as a SIP server to connect
to, in case `<proxy>` is not specified. If no port is specified, 5060 is the default for non-encrypted
transports, 5061 for tls transports.

### transport { .reference-entry }

```xml
<transport>udp</transport>
```

**Default**:
udp

**Valid values**:
udp, tcp, tls and tls+sip:

**Description**:
The transport protocol to use when communicating with SIP server. Transport tls uses sips: URIs in
headers and the traffic is protected by TLS. tls+sip: is also TLS-protected, but uses sip: URIs.

### userCallerId { .reference-entry }

```xml
<usercallerid>John Doe</usercallerid>
```

**Default**:
empty string

**Description**:
If set, this value will be sent in the From: field in outgoing INVITE requests. In case it's left
empty, username will be used.

### expires { .reference-entry }

```xml
<expires>600</expires>
```

**Default**:
600

**Valid values**:
integer larger or equal to 30

**Description**:
value for the Expires: header in SIP REGISTER packet.

!!! note
    Servers may reject registration with too low value in Expires: header and negotiate a higher value.

!!! warning
    If you're using Acrobits Cloud solution for incoming calls, the Acrobits' Sipis servers may reject/ban instances that require
    an expiration interval shorter than 300 seconds.
    Ask an Acrobits representative about the option of hosting your own Sipis servers in case your deployment requires a more frequent registration refresh.

### subscriptionExpires { .reference-entry }

```xml
<subscriptionexpires>300</subscriptionexpires>
```

**Default**:
300

**Valid values**:
integer larger or equal to 30

**Description**:
value for the Expires: header in SUBSCRIBE packets.

### allowMessage { .reference-entry }

```xml
<allowmessage>1</allowmessage>
```

**Default**:
0

**Valid values**:
0 and 1

**Description**:
When set, MESSAGE will be added to the Allow: list in SIP REGISTER packets.
SIP/SIMPLE messaging won't work without this set.

## SIPIS

### sipisHost { .reference-entry }

```xml
<sipishost>sipis.example.com</sipishost>
```

**Default**:
sipis.acrobits.cz

**Valid values**:
domain name or IP address

**Description**:
Specifies the SIPIS server which the app should connect to.

### sipisRegServer { .reference-entry }

```xml
<sipisregserver>sipis.example.com</sipisregserver>
```

**Default**:
reg.acrobits.cz

**Valid values**:
domain name or IP address

**Description**:
Specifies the server which the app will use to transfer the account credentials to SIPIS. Typically it
will be the same address as in sipisHost

### authUsernameForSipis { .reference-entry }

```xml
<authusernameforsipis>sipis-auth-user</authusernameforsipis>
```

**Default**:
empty string

**Description**:
SIP authentication username used by SIPIS instead of the account's regular [authUsername](#authusername). Use this when SIPIS should register with separate authentication credentials, for example when the PBX or provider requires a dedicated SIP identity for push registration.

If left empty, SIPIS uses the regular SIP authentication credentials from the mobile device account.

### passwordForSipis { .reference-entry }

```xml
<passwordforsipis>secretPhraseForSipis</passwordforsipis>
```

**Default**:
empty string

**Description**:
SIP authentication password used by SIPIS instead of the account's regular [password](#password). Use this together with `authUsernameForSipis` and/or `usernameForSipis` when SIPIS must register as a different SIP account than the foreground app, which can help in deployments that do not allow concurrent or overlapping registrations on the same SIP identity.

If left empty, SIPIS uses the regular SIP authentication credentials from the mobile device account.

### sipisHostPrefixLength { .reference-entry }

```xml
<sipishostprefixlength>0</sipishostprefixlength>
```

**Default**:
1

**Valid values**:
nonnegative integer values

**Description**:
Used for load-balancing of SIPIS servers. In case it's greater than zero, the actual sipisHost value is
constructed by prefixing s-X. to address in sipisHost. The X is taken from account selector, which is
SHA1(username:password:host). The value in sipisHostPrefixLength specifies how many letters from the
hex-digit representation of selector to use. For example, with `sipisHostPrefixLength=1`, the app will use
servers s-0.sipis.example.com - s-F.sipis.example.com. You will need to set up the DNS and deploy
multiple SIPIS servers to make load balancing work.

!!! note
    Note that the default value is 1. If you want to use a single SIPIS server (which is OK for
    up to 20,000 users on any reasonable machine), you will need to set this explicitly to 0.

### udpFromUnknownAddresses { .reference-entry }

```xml
<udpfromunknownaddresses>0</udpfromunknownaddresses>
```

**Default**:
1 in older builds, 0 starting May 2024

**Valid values**:
1 or 0

**Description**:
Disabling this setting causes the app and SIPIS to ignore UDP traffic from IP addresses that are not explicitly
associated with your SIP domain. The list of trusted addresses is determined by performing DNS SRV and DNS A/AAAA
record lookups on your configured SIP domain name. Disabling this option can be useful if you are receiving unwanted
calls (spam/ghost calls) that you believe are not originating from your SIP server.

!!! warning
    Do not disable this setting if you expect to receive incoming calls from proxies that the app and/or SIPIS has not previously communicated with. SIPIS or the app might not recognize the proxy's IP address and would therefore block the call.

### enableSipViaAlias { .reference-entry }

```xml
<enablesipviaalias>1</enablesipviaalias>
```

**Default**:
1

**Valid values**:
1 or 0

**Description**:
Controls whether the app adds the `alias` parameter to the `Via` header for SIP requests sent over TCP or TLS, as defined by RFC 5923.

When enabled, servers and proxies can explicitly treat the existing TCP/TLS connection as reusable for subsequent in-dialog requests.

Set this to 0 only if your SIP infrastructure is incompatible with `Via;alias`.

## Proxies

### proxy { .reference-entry }

```xml
<proxy>proxy.example.com[:port]</proxy>
```

**Default**:
empty string

**Description**:
Address of SIP proxy server to connect to. If no port is specified, 5060 is used.

### outboundProxy_enabled { .reference-entry }

```xml
<outboundproxy_enabled>0</outboundproxy_enabled>
```

**Default**:
empty string

**Description**:
when set to 1, all SIP traffic is routed through outboundProxy_host using outboundProxy_transport

### outboundProxy_host { .reference-entry }

```xml
<outboundproxy_host>proxy.example.com[:port]</outboundproxy_host>
```

**Default**:
empty string

**Description**:
Address through which all SIP traffic is routed. If no port is specified, 5060 is used. outboundProxy_enabled
needs to be set to 1 for this option to take effect.

### outboundProxy_transport { .reference-entry }

```xml
<outboundproxy_transport>udp</outboundproxy_transport>
```

**Default**:
udp

**Description**:
Transport to use for outboud proxy. All values described in transport field may be used.
outboundProxy_enabled needs to be set to 1 for this option to take effect.

!!! note
    The final address of the SIP server is determined as follows:

    * **if** outbound proxy is enabled and its host is filled it, all traffic is routed through it
    * **if** `<proxy>` is empty, address = `<host>`, otherwise address = `<proxy>`
    * **if** address is not numeric (a.b.c.d) and port is not specified in address, do a SRV DNS resolution for
    _sip._udp.address (or _sip._tcp.address, depending on the transport used)

    > + **if** SRV record exists, address = DNSResultAddress:DNSResultPort
    > 	+ **else** use address

## Voicemail

### voiceMailNumber { .reference-entry }

```xml
<voicemailnumber>*69</voicemailnumber>
```

**Default**:
empty string

**Description**:
The number which is dialed when the "voice mail" button is pressed.

### subscribeForVoicemail { .reference-entry }

```xml
<subscribeforvoicemail>1</subscribeforvoicemail>
```

**Default**:
0

**Valid values**:
1 or 0

**Description**:
Set to send SUBSCRIBE for voice mail

### pushVoicemail { .reference-entry }

```xml
<pushvoicemail>1</pushvoicemail>
```

**Default**:
0

**Valid values**:
1 or 0

**Description**:
Set to 1 if you want new voicemails reported to SIPIS to trigger a push notification to the device.

## Audio Codecs

### codecOrder { .reference-entry }

```xml
<codecorder>103,9,0,8,18,102,3</codecorder>
```

**Default**:
103,9,0,8,18,102,3

**Valid values**:
comma separated list of codec numbers.

**Description**:
The order of codecs, as it will be offered in SDP for calls made over Wifi network.

Supported codecs are:

```
0   :  G711 μ-law
3   :  GSM
8   :  G711 a-law
9   :  G722 wideband codec
102 :  iLBC
18  :  G729
103 :  Opus
```

### codecOrder3G { .reference-entry }

```xml
<codecorder3g>18,103,102,3,9,0,8</codecorder3g>
```

**Default**:
18,103,102,3,9,0,8

**Valid values**:
comma separated list of codec numbers.

**Description**:
The order of codecs, as it will be offered in SDP for calls made over cellular network. See the
[codecOrder](#codecorder) field above for the list of valid codec payloads.

### honorTheirCodecListWiFi { .reference-entry }

```xml
<honortheircodeclistwifi>0</honortheircodeclistwifi>
```

**Default**:
1

**Valid values**:
0 or 1

**Description**:
Forces the application to use the first codec offered by the remote side for calls over Wifi

### honorTheirCodecList3G { .reference-entry }

```xml
<honortheircodeclist3g>0</honortheircodeclist3g>
```

**Default**:
0

**Valid values**:
0 or 1

**Description**:
Forces the application to use the first codec offered by the remote side for calls over 3G

!!! warning
    It's not recommended to change [honorTheirCodecList3G](#honortheircodeclist3g) and [honorTheirCodecListWiFi](#honortheircodeclistwifi) defaults.

!!! note
    Consider an incoming INVITE with codecs "0,18" in SDP. SIP account is configured with [codecOrder](#codecorder) set to
    "0,18" and [codecOrder3G](#codecorder3g) "18,0".

    If we're on cellular network, it makes sense to ignore the remote's preference of codec "0" (μ-law), because
    we know our bandwidth is limited. This is why [honorTheirCodecList3G](#honortheircodeclist3g) if 0 by default - with this
    setting, we pick the first codec on our list, which is also supported by the remote side ("18"-G.729\)

    On the other hand, when on wifi connection, we assume that we have enough bandwidth to honor the remote's
    preference, therefore the default value is 1.

### ptime { .reference-entry }

```xml
<ptime>20</ptime>
```

**Default**:
20

**Description**:
packet time in milliseconds, to be used with WiFi codec set.

### ptime3G { .reference-entry }

```xml
<ptime3g>30</ptime3g>
```

**Default**:
30

**Description**:
packet time in milliseconds, to be used with 3G codec set.

### forcePtime { .reference-entry }

```xml
<forceptime>0</forceptime>
```

**Default**:
0

**Valid values**:
0 or 1

**Description**:
If set to 1, the [ptime](#ptime) parameter will be used even if the remote side requests a different value.

### forcePtime3G { .reference-entry }

```xml
<forceptime3g>0</forceptime3g>
```

**Default**:
0

**Valid values**:
0 or 1

**Description**:
If set to 1, the [ptime3G](#ptime3g) parameter will be used even if the remote side requests a different value.

## Opus codec options

Opus codec parameters may be fine-tuned via several keys. The keys start either with opusOptions. or opusOptions3G. for WiFi or cellular calling respectively.

You can either just set the [opusOptions.class](#opusoptions-class) which can be nb for narrowband, wb for wideband, or fb for fullband.

Alternatively you can finetune all the opus parameters.
In this case the [opusOptions.class](#opusoptions-class) parameter need to be set to the empty string. Then you can set [opusOptions.bandwidth](#opusoptions-bandwidth), [opusOptions.complexity](#opusoptions-complexity), [opusOptions.bitrate](#opusoptions-bitrate), [opusOptions.fec](#opusoptions-fec), [opusOptions.vbr](#opusoptions-vbr), [opusOptions.dtx](#opusoptions-dtx), and [opusOptions.expectedPacketLoss](#opusoptions-expectedpacketloss).

Example:

```xml
<opusoptions3g.class>nb</opusoptions3g.class>

or

<opusoptions.class></opusoptions.class>
<opusoptions.bandwidth>fb</opusoptions.bandwidth>
<opusoptions.complexity>5</opusoptions.complexity>
<opusoptions.bitrate>300000</opusoptions.bitrate>
<opusoptions.fec>1</opusoptions.fec>
<opusoptions.dtx>0</opusoptions.dtx>
<opusoptions.vbr>0</opusoptions.vbr>
```

<a id="opusoptions-class"></a>

### opusOptions.class { .reference-entry }

```xml
<opusoptions.class>wb</opusoptions.class>
<opusoptions3g.class>nb</opusoptions3g.class>
```

**Default**:
wb

**Valid values**:
nb, wb, fb or empty string

**Description**:
If set to nb, it's equivalent to setting:

* [opusOptions.bandwidth](#opusoptions-bandwidth) to nb
* [opusOptions.complexity](#opusoptions-complexity) to empty string
* [opusOptions.bitrate](#opusoptions-bitrate) to 15500
* [opusOptions.fec](#opusoptions-fec) to 1
* [opusOptions.dtx](#opusoptions-dtx) to 1
* [opusOptions.vbr](#opusoptions-vbr) to 1
* [opusOptions.expectedPacketLoss](#opusoptions-expectedpacketloss) to 5

If set to wb, it's equivalent to setting:

* [opusOptions.bandwidth](#opusoptions-bandwidth) to wb
* [opusOptions.complexity](#opusoptions-complexity) to empty string
* [opusOptions.bitrate](#opusoptions-bitrate) to 24000
* [opusOptions.fec](#opusoptions-fec) to 1
* [opusOptions.dtx](#opusoptions-dtx) to 1
* [opusOptions.vbr](#opusoptions-vbr) to 1
* [opusOptions.expectedPacketLoss](#opusoptions-expectedpacketloss) to 5

If set to fb, it's equivalent to setting:

* [opusOptions.bandwidth](#opusoptions-bandwidth) to fb
* [opusOptions.complexity](#opusoptions-complexity) to empty string
* [opusOptions.bitrate](#opusoptions-bitrate) to 64000
* [opusOptions.fec](#opusoptions-fec) to 1
* [opusOptions.dtx](#opusoptions-dtx) to 1
* [opusOptions.vbr](#opusoptions-vbr) to 1
* [opusOptions.expectedPacketLoss](#opusoptions-expectedpacketloss) to 5

If set to empty string, you need to set other options yourself

<a id="opusoptions-bandwidth"></a>

### opusOptions.bandwidth { .reference-entry }

```xml
<opusoptions.bandwidth>wb</opusoptions.bandwidth>
<opusoptions3g.bandwidth>nb</opusoptions3g.bandwidth>
```

**Default**:
wb

**Valid values**:
nb, wb, fb

**Description**:
Limits the band width of the codec.

* nb for narrowband i.e. 8kHz
* wb for wideband i.e. 16kHz
* fb for fullband i.e. 48kHz
* any other value is treated as wb

The hertz value will be signalled in SDP as maxplaybackrate. Encoder will be set to the minimum of this setting and the value received in the SDP.

<a id="opusoptions-complexity"></a>

### opusOptions.complexity { .reference-entry }

```xml
<opusoptions.complexity></opusoptions.complexity>
<opusoptions3g.complexity>5</opusoptions3g.complexity>
```

**Default**:
empty string

**Valid values**:
0 to 10 or empty string

**Description**:
Configures the encoder's computational complexity. The supported range is 0-10 inclusive with 10
representing the highest complexity. When not specified, use Opus default.

<a id="opusoptions-bitrate"></a>

### opusOptions.bitrate { .reference-entry }

```xml
<opusoptions.bitrate>20500</opusoptions.bitrate>
<opusoptions3g.bitrate>15500</opusoptions3g.bitrate>
```

**Default**:
empty string

**Valid values**:
integers between 6000 and 510000, empty string value, -1000, or -1

**Description**:
Desired encoder bitrate in bits per second.

Values between 6000 and 510000 are meaningful. Empty string or -1000 means automatic bitrate. Value -1 means maximum bitrate.
This value will be signalled in SDP. If received in SDP as maxaveragebitrate, the value from SDP will be used for encoder.

<a id="opusoptions-fec"></a>

### opusOptions.fec { .reference-entry }

```xml
<opusoptions.fec>1</opusoptions.fec>
<opusoptions3g.fec>1</opusoptions3g.fec>
```

**Default**:
0

**Valid values**:
1 or 0

**Description**:
Forward error correction. When enabled, encoder transmits redundant information which makes it possible
to reconstruct lost packets on the received side. If enabled `useinbandfec=1` is signalled in SDP. The FEC for the encoder is enabled only if `useinbandfec=1` is received in SDP. Otherwise it is disabled.

<a id="opusoptions-dtx"></a>

### opusOptions.dtx { .reference-entry }

```xml
<opusoptions.dtx>1</opusoptions.dtx>
<opusoptions3g.dtx>1</opusoptions3g.dtx>
```

**Default**:
0

**Valid values**:
1 or 0

**Description**:
Enables discontinuous transmission (DTX). If enabled `usedtx=1` is signalled in SDP. The DTX for the encoder is enabled only if `usedtx=1` is received in SDP. Otherwise it is disabled.

<a id="opusoptions-vbr"></a>

### opusOptions.vbr { .reference-entry }

```xml
<opusoptions.vbr>1</opusoptions.vbr>
<opusoptions3g.vbr>1</opusoptions3g.vbr>
```

**Default**:
1

**Valid values**:
1 or 0

**Description**:
Enables variable bit rate. Note it's not recommended to use VBR for secure calls. If disabled `cbr=1` is signalled in SDP. The VBR for the encoder is disabled if `cbr=1` is received in SDP. Otherwise it is enabled.

<a id="opusoptions-expectedpacketloss"></a>

### opusOptions.expectedPacketLoss { .reference-entry }

```xml
<opusoptions.expectedpacketloss>5</opusoptions.expectedpacketloss>
<opusoptions3g.expectedpacketloss>5</opusoptions3g.expectedpacketloss>
```

**Default**:
0

**Valid values**:
0 - 100

**Description**:
Specifies the expected percentage of packet loss. Higher values will allocate more of the bit rate for
redundant data to be used to reconstruct lost packets, which may degrade quality in the loss-less case
(but will provide better quality in situations with lost packets)

## G.722 codec options

G.722 has two configurable settings: `implementation` and `shiftValue`. Each setting is available in two variants:

* `g722Options.*` for WiFi calling
* `g722Options3G.*` for cellular calling

<a id="g722options-implementation"></a>

### g722Options.implementation { .reference-entry }

```xml
<g722options.implementation>ReferenceModernized</g722options.implementation>
<g722options3g.implementation>ReferenceModernized</g722options3g.implementation>
```

**Default**:
ReferenceModernized

**Valid values**:
ReferenceModernized, Reference, Original

**Description**:
Selects which internal G.722 encoder/decoder implementation is used locally. This does not change codec negotiation; it only changes the internal processing path for G.722 audio.

* `ReferenceModernized` uses the modernized G.722 reference implementation. This is the default and recommended option because it preserves reference behavior while improving robustness.
* `Reference` uses the legacy reference-style implementation. Intended mainly for compatibility testing and behavioral comparison with older builds.
* `Original` uses the oldest implementation. Kept mainly for backward compatibility and low-level troubleshooting; less robust with corrupted or unusual input.

<a id="g722options-shiftvalue"></a>

### g722Options.shiftValue { .reference-entry }

```xml
<g722options.shiftvalue>2</g722options.shiftvalue>
<g722options3g.shiftvalue>2</g722options3g.shiftvalue>
```

**Default**:
2

**Valid values**:
2, 1, 0

**Description**:
Defines the PCM level range used by the local G.722 encoder and decoder. Internally, the app scales samples before encoding and scales them back after decoding.

* `2` uses the 14-bit signal range defined by the G.722 specification. This is the default and recommended setting.
* `1` uses a 15-bit signal range. Provided for compatibility with older app versions.
* `0` uses the full 16-bit PCM range without downscaling. This is a non-standard troubleshooting option for endpoints that expect full-scale input.

## Jitter buffer options

These settings control the audio jitter buffer limits for WiFi and cellular calls, plus an optional diagnostic logging switch.

### jbMinDelayWiFi { .reference-entry }

```xml
<jbmindelaywifi>30</jbmindelaywifi>
```

**Default**:
30

**Valid values**:
any positive integer value in milliseconds

**Description**:
Defines the minimum audio jitter buffer delay used on WiFi connections. The jitter buffer may adapt dynamically, but it will not go below this value.

### jbMaxDelayWiFi { .reference-entry }

```xml
<jbmaxdelaywifi>900</jbmaxdelaywifi>
```

**Default**:
900

**Valid values**:
any positive integer value in milliseconds

**Description**:
Defines the maximum audio jitter buffer delay used on WiFi connections. The jitter buffer may adapt dynamically, but it will not grow beyond this value.

### jbMinDelay3G { .reference-entry }

```xml
<jbmindelay3g>30</jbmindelay3g>
```

**Default**:
30

**Valid values**:
any positive integer value in milliseconds

**Description**:
Defines the minimum audio jitter buffer delay used on 3G connections. The jitter buffer may adapt dynamically, but it will not go below this value.

### jbMaxDelay3G { .reference-entry }

```xml
<jbmaxdelay3g>900</jbmaxdelay3g>
```

**Default**:
900

**Valid values**:
any positive integer value in milliseconds

**Description**:
Defines the maximum audio jitter buffer delay used on 3G connections. The jitter buffer may adapt dynamically, but it will not grow beyond this value.

### enableRtpJitterBufferLogging { .reference-entry }

```xml
<enablertpjitterbufferlogging>0</enablertpjitterbufferlogging>
```

**Default**:
0

**Valid values**:
0 or 1

**Description**:
Enables detailed RTP jitter buffer logging for diagnostics and troubleshooting. This setting does not change jitter buffer behavior.

* `0` disables detailed RTP jitter buffer logging.
* `1` enables detailed RTP jitter buffer logging.

## Video Codecs

### allowVideo { .reference-entry }

```xml
<allowvideo>1</allowvideo>
```

**Default**:
1

**Valid values**:
1 or 0

**Description**:
Value 1 enables video calls in the application, 0 disables video calls.

### videoCodecOrder { .reference-entry }

```xml
<videocodecorder>108,99</videocodecorder>
```

**Default**:
108,99

**Valid values**:
comma separated list of codec numbers

**Description**:
The order of video codecs, as it will be offered in SDP for calls made with Wifi codec set.

Supported codecs are:

```
108 : VP8
99  : H264
```

### videoCodecOrder3G { .reference-entry }

```xml
<videocodecorder3g>108,99</videocodecorder3g>
```

**Default**:
108,99

**Valid values**:
comma separated list of codec numbers

**Description**:
The order of video codecs, as it will be offered in SDP for calls made with 3G codec set.

### videoMinKbpsWifi and videoMaxKbpsWifi { .reference-entry }

```xml
<videominkbpswifi>64</videominkbpswifi>
<videomaxkbpswifi>384</videomaxkbpswifi>
```

**Default**:
64 - 384

**Description**:
The values are in kilobits per second. Bandwidth range for video in case it's being sent over wifi.
The encoder is initially configured to produce bitrate in the middle of the given range and adjusts the
bitrate adaptively towards either end of the range depending on the network conditions.

### videoMinKbps3G and videoMaxKbps3G { .reference-entry }

```xml
<videominkbps3g>64</videominkbps3g>
<videomaxkbps3g>384</videomaxkbps3g>
```

**Default**:
64 - 192

**Description**:
The values are in kilobits per second. Bandwidth range for video in case it's being sent over cellular
network. See [videoMinKbpsWifi and videoMaxKbpsWifi](#videominkbpswifi-and-videomaxkbpswifi) for more details.

### videoDimsWifi { .reference-entry }

```xml
<videodimswifi>qcif</videodimswifi>
```

**Default**:
qcif

**Description**:
Specifies video resolution to be sent over wifi

**Valid values**:
one of the resolution names, specified in table below:

| resolution name | frame dimensions |
| --- | --- |
| qcif | 176 × 144 |
| cif | 352 × 288 |
| vga | 640 x 480 |
| cif4 | 704 × 576 |
| cif16 | 1408 × 1152 |
| 720p | 1280 × 720 |
| 1080p | 1920 x 1080 |

!!! note
    H264 and VP8 support all resolutions and in case the device changes orientation from landscape to portrait or
    vice-versa, the resolution is automatically transposed.

### videoDims3G { .reference-entry }

```xml
<videodims3g>qcif</videodims3g>
```

**Default**:
qcif

**Description**:
Specifies video resolution to be sent over cellular networks

**Valid values**:
same as for [videoDimsWifi](#videodimswifi)

### videoFPSWifi { .reference-entry }

```xml
<videofpswifi>15</videofpswifi>
```

**Default**:
empty string

**Description**:
Frame rate in frames-per-second which the video encoder should use to encode video streams transferred
over Wifi.

!!! note
    When left empty, the library chooses the pre-defined value for the current device, which will be 20 FPS on all modern devices.

### videoFPS3G { .reference-entry }

```xml
<videofps3g>15</videofps3g>
```

**Default**:
empty string

**Description**:
Frame rate in frames-per-second which the video encoder should use to encode video streams transferred
over cellular networks.

### autoSendVideoWifi { .reference-entry }

```xml
<autosendvideowifi>1</autosendvideowifi>
```

**Default**:
empty string

**Valid values**:
0, 1 or empty string

**Description**:
when set to empty string, the outgoing video stream is added to the call based on global app settings.
Specifying 0 or 1 will override these settings for this particular account. When set to 1,
video stream will be added into SDP when making general call (dialAction: "autoCall") over wifi network
or when answering incoming call without explicitly specifying media type (for example, by clicking on
notification about incoming call)

!!! note
    You can always explicitly request a video call by using "videoCall" dialAction, or voice-only call by "voiceCall" dialAction. Also note that even if the call is started without video, it can be added later.

### autoSendVideo3G { .reference-entry }

```xml
<autosendvideo3g>1</autosendvideo3g>
```

**Default**:
empty string

**Valid values**:
0, 1 or empty string

**Description**:
Automatically add outgoing video stream into SDP when making call over cellular network.
See [autoSendVideoWifi](#autosendvideowifi) for more details.

### autoReceiveVideoWifi { .reference-entry }

```xml
<autoreceivevideowifi>1</autoreceivevideowifi>
```

**Default**:
empty string

**Valid values**:
0, 1 or empty string

**Description**:
Automatically allow incoming video stream when for calls over wifi. See [autoSendVideoWifi](#autosendvideowifi)
for more details.

### autoReceiveVideo3G { .reference-entry }

```xml
<autoreceivevideo3g>1</autoreceivevideo3g>
```

**Default**:
empty string

**Valid values**:
0, 1 or empty string

**Description**:
Automatically allow incoming video stream when for calls over cellular networks. See [autoSendVideoWifi](#autosendvideowifi)
for more details.

## DTMF

### dtmfOrder { .reference-entry }

```xml
<dtmforder>rfc2833,info,audio</dtmforder>
```

**Default**:
rfc2833,info,audio

**Valid values**:
comma separated list of: rfc2833, info and audio.

**Description**:
The methods to use when generating DTMF events. The methods are tried in the order specified here.
RFC 2833 method is only used when the remote side supports telephone-event RTP payload.

!!! note
    To disable a method, simply don't put it on the list. The list may have only a single item.

### dtmfAll { .reference-entry }

```xml
<dtmfall>0</dtmfall>
```

**Default**:
0

**Valid values**:
0 and 1

**Description**:
When set, all supported DTMF modes will be sent together. Not recommended.

### rfc2833NegotiateOnly8kHzClockRate { .reference-entry }

```xml
<rfc2833negotiateonly8khzclockrate>1</rfc2833negotiateonly8khzclockrate>
```

**Default**:
1

**Valid values**:
0 and 1

**Description**:
In theory, the RFC 2833 DTMF RTP packets should use the same clock rate
as the selected audio codec:

"DTMF digits and named telephone events are carried as part of the
audio stream, and MUST use the same sequence number and time-stamp
base as the regular audio channel to simplify the generation of audio
waveforms at a gateway."


—RFC 2833

This means that if an application offers audio codecs with distinct
clock rates (e.g. PCMU/8000 and opus/48000/2\), it should also offer
*multiple telephone-event payload types, each with a corresponding
distinct clock rate* (e.g. telephone-event/8000 and telephone-event/48000\).
And depending on the final outcome of the audio codec negotiation,
the application should then use proper payload number, corresponding
to either telephone-event/8000 or telephone-event/48000 when generating
RFC 2833 DTMF RTP packets.

In practice, however, many systems cannot deal with anything else
than "telephone-event/8000" regardless of the selected audio codec
and its clock rate.

This option therefore allows switching between RFC 2833 conforming mode
(value 0), in which the application offers multiple telephone-event
payload types, and legacy mode (value 1) in which only "telephone-event/8000"
is offered and recognized.

### rfc2833EnforceDurationIn8KHzTimestampUnits { .reference-entry }

```xml
<rfc2833enforcedurationin8khztimestampunits>0</rfc2833enforcedurationin8khztimestampunits>
```

**Default**:
0

**Valid values**:
0 and 1

**Description**:
In case the [rfc2833NegotiateOnly8kHzClockRate](#rfc2833negotiateonly8khzclockrate) option is enabled
and the clock rate of the negotiated audio codec differs from 8 kHz,
the app can populate the duration field of RFC 2833 DTMF RTP packets
with either unmodified timestamp units corresponding to the audio codec
clock rate (value 0), or it can adjust the timestamp units
to correspond to 8 kHz clock rate (value 1).

## NAT Traversal

### STUN { .reference-entry }

```xml
<stun>stun.example.com:[port]</stun>
```

**Default**:
empty string

**Description**:
STUN server to use. When empty, libsoftphone will use stun.acrobits.cz.
If no port is specified, 3478 is used.

### STUNUsername { .reference-entry }

```xml
<stunusername>user</stunusername>
```

**Default**:
empty string

**Description**:
Username for STUN/TURN server. If filled in, we'll consider the STUN server TURN-capable.

### STUNPassword { .reference-entry }

```xml
<stunpassword>password</stunpassword>
```

**Default**:
empty

**Description**:
Password for STUN/TURN server.

### natTraversal { .reference-entry }

```xml
<nattraversal>auto</nattraversal>
```

**Default**:
auto

**Valid values**:
off, auto, stunOnly, turnAlways, ice

**Description**:
Specifies the NAT traversal mode to use. This setting controls which addresses will be put into SDP. The options are described in detail below:

off:
will always send local/private IP address detected from local network interface. No public address resolution is done.

auto:
will do a STUN query for a public address. If symmetric NAT is not detected, the global address is used. In case of symmetric NAT, TURN server is used if STUNUsername is filled in, otherwise private/local address is used.

stun:
will do a STUN query and always use the obtained public address (unless symmetric NAT is detected or if [ignoreSymmetricNat](#ignoresymmetricnat) is set to 1\)

turnAlways:
will always use TURN server

ice:
will use the ICE process to choose the best address

### enableWmsSemantic { .reference-entry }

```xml
<enablewmssemantic>1</enablewmssemantic>
```

**Default**:
0

**Valid values**:
0 and 1

**Description**:
Enables WMS/MSID SDP semantics for media streams. If enabled, the SDK includes `a=msid-semantic: WMS`
at the session level and adds per-media MSID/SSRC labeling attributes used to identify media streams.

### enableRtcpMux { .reference-entry }

```xml
<enablertcpmux>1</enablertcpmux>
```

**Default**:
0

**Valid values**:
0 and 1

**Description**:
Enables RTP/RTCP multiplexing (`a=rtcp-mux` in SDP). If enabled, the SDK negotiates `rtcp-mux` and,
when supported by the peer, sends RTP and RTCP over the same port; otherwise it falls back to separate
RTP and RTCP ports.

### ignoreSymmetricNat { .reference-entry }

```xml
<ignoresymmetricnat>1</ignoresymmetricnat>
```

**Default**:
0

**Valid values**:
0 and 1

**Description**:
if set, it will not check for symmetric NAT and will use the public IP if instructed so even when on
symmetric NAT. Setting it to 1 is not recommended, since the IP:port detected will most likely not be accessible
from outside, but sometimes it may be necessary to send the public IP even though the port is wrong.

### symmetricNatSubstituteAddress { .reference-entry }

```xml
<symmetricnatsubstituteaddress>10.20.30.40</symmetricnatsubstituteaddress>
```

**Default**:
10.20.30.40

**Valid values**:
IP address or empty

**Description**:
Specifies a substitute address to use when symmetric NAT is detected.

If this value is set, the RTP stack uses it instead of a non-private local public address when building media
addresses for a network path detected as symmetric NAT. In practice, this is used to force a private/local
address in SDP instead of an unusable public address learned through NAT discovery.

Setting the value to an empty string disables this substitution.

### iceDefaultCandidateOrder { .reference-entry }

```xml
<icedefaultcandidateorder>relay,srflx,host</icedefaultcandidateorder>
```

**Default**:
relay,srflx,host

**Valid values**:
comma-separated list of "relay","srflx","host"

**Description**:
You can prioritise one default ICE candidate over others.

For example to prefer server reflexive address over relay address, set it to srflx,host,relay. To prefer host
address, set it to host,srflx,relay.

### contactIP { .reference-entry }

```xml
<contactip>internal</contactip>
```

**Default**:
internal

**Valid values**:
internal, external, static

**Description**:
Specifies which address to use in Contact and Via SIP headers:

internal:
will use the local/private in the Contact and Via SIP header.

external:
will try to determine the public address using STUN ping, OPTIONS packet or STUN server and use it in Contact and Via header.

static:
will use a static address in Contact and Via header, the address is specified in [forcedContact](#forcedcontact) node.

### forcedContact { .reference-entry }

```xml
<forcedcontact>192.168.100.100:7777</forcedcontact>
```

**Default**:
empty string

**Description**:
This IP address will be used in Contact and Via headers in case [contactIP](#contactip) is set to "static".

### sendAudioBack { .reference-entry }

```xml
<sendaudioback>0</sendaudioback>
```

Defalut:
1

**Valid values**:
0 and 1

**Description**:
If set to 1, we will always send the audio back to the address from which we receive the audio from
the other side.

### keepAlive { .reference-entry }

```xml
<keepalive>1</keepalive>
```

**Default value**:
0

**Valid values**:
0 and 1

**Description**:
When set, libSoftphone periodically sends keep-alive packet to SIP server, to keep the connection active
and NAT port mappings open.

### keepAlivePeriod { .reference-entry }

```xml
<keepaliveperiod>30</keepaliveperiod>
```

**Default value**:
30

**Valid values**:
integer number. The value is in seconds, the minimum allowed value is 5

**Description**:
Specifies the amount of seconds between two keep-alive packets

### rtpPortRangeStart and rtpPortRangeEnd { .reference-entry }

```xml
<rtpportrangestart>10000<rtpportrangestart>
<rtpportrangeend>65530<rtpportrangeend>
```

**Default**:
10000 and 65535.

**Valid values**:
integer numbers between 1025 and 65535 (inclusive). There should be at least 4 ports between these values

**Description**:
The port range to use for RTP sockets.

### listeningPort { .reference-entry }

```xml
<listeningport>5060</listeningport>
```

**Default**:
empty string

**Description**:
The local port which the SIP stack will bind to:

**Valid values**:
integer numbers between 1025 and 65535 (inclusive)



* If left empty, the SIP stack will choose a random port number and will bind to it. This number will remain the
same for at least one day. If the client is restarted and re-registers repeatedly, it will remember its rinstance,
callId and CSeq numbers, port will remain the same and therefore it should always occupy the same registration slot
on the server.
* If set to 0, a random port will be chosen every time the client registers.
* If set to a specific numeric value, the SIP stack will always bind to that port.

!!! warning
    On iOS, setting [listeningPort](#listeningport) for TCP and TLS SIP transports has no effect. Specifying a port to bind
    to for TCP is not supported by iOS platform.

### maxTimeToWaitForWorkingNetworkInMilliseconds { .reference-entry }

```xml
<maxtimetowaitforworkingnetworkinmilliseconds>15000</maxtimetowaitforworkingnetworkinmilliseconds>
```

**Default**:
15000

**Description**:
the time in milliseconds for which the client keeps calls in established state after the network is lost.
When this time expires and there is still no network, the call is hung up.

### allowToHeaderMismatch { .reference-entry }

```xml
<allowtoheadermismatch>1</allowtoheadermismatch>
```

**Default**:
1

**Valid values**:
`1`: Accept the call despite the mismatch.
`0`: Silently reject the call.

**Description**:
Controls whether an incoming SIP `INVITE` is accepted when the `To:` header URI does not match the configured account identity.

The comparison uses the account username and domain. Username matching is case-insensitive; an empty user part in `To:` is treated as matching; and the check also accepts usernames when either value ends with the other. The domain is considered mismatched only when both values are hostnames and differ, or both are IP addresses and differ.

## Custom SIP Headers

```xml
<headers>
    <header method="INVITE" name="X-CustomHeader" value="value"></header>
    <header method="*" name="X-OtherHeader" value="12345"></header>
…
</headers>
```

Specify custom headers to be added into SIP packets. The headers should be stored in their own node named "headers" as
sub-nodes with name "header". The attributes are:

method:
SIP request method. The custom header will be added only to SIP packets of the specified method. Use `method="*"` to add the header to all SIP packets.



name:
header name



value:
header value

<a id="dnd"></a>

## Do Not Disturb

Do Not Disturb (DND), also called Zen Mode in Android Developers Documentation, mutes all events when the user does
not want to be disturbed. DND rules can be provisioned using the XML format described below. Here is an example:

```xml
<donotdisturb gmtoffsetinminutes="60">
  <dndentry>
    <from>08:00</from>
    <to>10:00</to>
    <weekdays>31</weekdays>
    <contacts>
      <contactinfo name="+1 (222) 333-4455" phone="+12223334455" identifier="" source=""></contactinfo>
    </contacts>
  </dndentry>
  <dndentry>
    <from>00:00</from>
    <to>23:59</to>
    <weekdays>96</weekdays>
    <contacts></contacts>
    <enabled>1</enabled>
    <comment>Do not disturb on weekends</comment>
  </dndentry>
</donotdisturb>
```

The DND XML is wrapped in an `<donotdisturb>` node. The optional attribute `gmtOffsetInMinutes` defines the timezone for
the time values in DND entries. Inside this XML node, there is a list of `<dndentry>` child nodes.

`<from>` and `<to>` elements define the start and end time when the DND rule applies. The format is HH:MM and the
hours are in 24h format. Both are required, if you want all-day rule, it should be `<from>00:00</from>` and
`<to>23:59</to>`.

`<weekdays>` is a bit mask which defines for which days in the week the rule applies. The values are as follows:

| bit | value | day |
| --- | --- | --- |
| 0 | 1 | Monday |
| 1 | 2 | Tuesday |
| 2 | 4 | Wednesday |
| 3 | 8 | Thursday |
| 4 | 16 | Friday |
| 5 | 32 | Saturday |
| 6 | 64 | Sunday |

If you are not familiar with bitwise arithmetics, all you need to do is to sum the values for days when you want the
rule to apply. For example, weekends are Saturday and Sunday, i.e. `32+64 = 96`. Workdays would be `1+2+4+8+16 = 31`.
Note that if you set this to 0, the rule will never be applied; to match any day, you need to set it to 127.

`<contacts>` is a list of `<contactinfo>` child nodes. In case there are no `<contactinfo>` child nodes, the
rule will match for any incoming number. In case the list is not empty, the rule applies only if the incoming party
matches some of the `<contactinfo>` child nodes.

In case the `<contactinfo>` element has non-empty fields `<identifier>` and `<source>`, the rule will apply in
case the incoming phone number matches address book contact from the given source and with the given identifier. For
provisioning, you will typically not know these identifiers, so these will be usually left empty (you can also omit
them). In such case, the app uses the value in field `<phone>` to match against the incoming call and the rule
applies only when these two are equivalent; it should be in E.164 format. The field `<name>` is only
a display name shown in DND rule editor GUI.

`<enabled>` is an optional tag. If not present or if its value is `<enabled>1</enabled>`, the rule is enabled,
otherwise it is disabled.

Optional tag `<comment>` can be used to add a comment to the rule. This is displayed in the GUI.

In the example above, this DND setup will reject all calls coming from number +1 (222\) 333-4455 between 8AM and
10AM (GMT+1\) on workdays, and it will reject all calls from anyone on weekends.

## Number Rewriting

```xml
<rewriting>
   <rule>
     <conditions>
       <condition type="doesntStartWith" param="+"></condition>
       <condition type="longerThan" param="8"></condition>
     </conditions>
     <actions>
       <action type="prepend" param="+420"></action>
     </actions>
   </rule>
   <rule>
     … another rule …
   </rule>
 …
</rewriting>
```

**Default**:
none.

Rules are examined in sequence until all conditions of a rule match the dialed number. Then all the actions are applied
to the number. If neither of the actions is continue the transformation ends. However, if one of the actions of the
rule is continue, another rule is examined and the conditions are now matched against the transformed number (not the
originally dialed number).

The example above means: Add +420 to numbers not starting with + that are longer than 8 digits.

Condition nodes have two attributes: type (see below) and param - the parameter of the condition

1. `startsWith`
   matches numbers that start with the parameter
2. `doesntStartWith`
   matches numbers that don't start with the parameter
3. `equals`
   the dialed number is exactly the same as the parameter
4. `lengthEquals`
   the length of the dialed number equals the parameter
5. `shorterThan`
   the length of the dialed number is shorter than the parameter
6. `longerThan`
   the length of the dialed number is longer than the parameter
7. `networkType`
   parameter is one of `wifi`, `cellular`, `any`, `none`. Matches if the current network is the one specified by `parameter`.
8. `ssid`
   matches if the current Wi-Fi SSID is the one specified in `parameter`
9. `contactIsFromSource`
   parameter is one of `ab` (native Address Book), `dav` (CardDAV), `ws` (Web Service), `google` (Google), `office365` (Microsoft 365), or `qd` (QuickDial). Matches if the contact is from the source specified by `parameter`.
10. `contactIsNotFromSource`
   parameter is one of `ab` (native Address Book), `dav` (CardDAV), `ws` (Web Service), `google` (Google), `office365` (Microsoft 365), or `qd` (QuickDial). Matches if the contact is not from the source specified by `parameter`, so it can be from any other source or not included in the contact list at all.
11. `contactLabelMatches`
   parameter is a string identifier of a contact label. Matches if the contact label matches the parameter.
12. `contactLabelDoesNotMatch`
   parameter is a string identifier of a contact label. Matches if the contact label does not match the parameter. Either the contact is not included in the contact list at all or it is included but the label does not match the parameter.


Action nodes have two attributes: type (see below) and optional param - the parameter of the action.

1. `replace`
   applicable only to `startsWith` and `equals`. Replaces the matched part with `parameter`.
2. `prepend`
   prepends the parameter to the dialed number
3. `append`
   appends the parameter to the dialed number
4. `continue`
   no parameter, try following rules as well
5. `recordCall`
   turns on call recording for this call
6. `dialOut`
   overrides the dial-out account. In multi-account clients, this action makes it possible to route certain numbers through a specific account, for example emergency numbers via a cellular account.
7. `confirm`
   unused
8. `drop`
   unused
9. `callThrough`
   forces a call-through dial action for the matching number
10. `overrideDialAction`
   changes the dialAction to the one specified in `param`. This can be used to dial certain numbers using call-through, native GSM calling, or a list of options. See [dialactions](../calls/dialactions.md#dialactions) for more details.
11. `setHeader`
   sets a SIP header for the outgoing SIP call. The `param` contains the header to be set, for example `<action type="setHeader" param="X-Condition-Matched: true"></action>`.
12. `rejectCall`
   used in Incoming Call Rewriter. Rejects the call (`486 Busy Here`).
13. `forwardCall`
   used in Incoming Call Rewriter. Forwards the call to the number specified in the `param` attribute.
14. `answerImmediately`
   used in Incoming Call Rewriter. Answers the incoming call immediately, without any user interaction.

<a id="footnote-reference-1"></a>

## Incoming Calls

### icm_auto { .reference-entry }

See icm instead.

```xml
<icm_auto>1</icm_auto>
```


Valid values: 0,1


Determines whether or not to use the global setting for incoming calls.


Default value is 1 which means the global setting for incoming calls will be used.

### incomingDisabled { .reference-entry }

See icm instead.

```xml
<incomingdisabled>1</incomingdisabled>
```


Valid Values: 0,1


Default Value: N/A

### pushMethod { .reference-entry }

See icm instead.

```xml
<pushmethod>tunnel</pushmethod>
```


Valid Values: off, tunnel


Enables Push Notifications for incoming calls.


Default: N/A

### bgrEnabled { .reference-entry }

See icm instead.

```xml
<bgrenabled>1</bgrenabled>
```


Valid Values: 0,1


Enables backgrounding for incoming calls (1 is enabled).


Default Value: N/A


Note: The transport protocol must be TCP or TLS for backgrounding to work.

### forceRegistration { .reference-entry }

See icm instead.

```xml
<forceregistration>1</forceregistration>
```


Valid Values: 0,1


Forces registration when incoming calls are off. Use 1 to force registration, only necessary if using incoming calls off with registration.


Default Value: N/A

!!! note
    Only required properties are necessary. E.g., to set incoming calls to Push Notifications you would add:

    ```
    <icm_auto>0</icm_auto>
    <pushmethod>tunnel</pushmethod>
    ```

    It is not necessary to add the other properties.

<a id="footnote-1"></a>

[*] Not needed for external provisioning in the Cloud Softphone. Cloud Softphone providers should contact us through the [Cloud Softphone web portal](https://providers.cloudsoftphone.com/) if they have any questions on how to set incoming calls.

### icm { .reference-entry }

```xml
<icm>auto</icm>
```


From Dec 2016, the incoming call mode configuration has been greatly simplified. The properties above have been
deprecated (if you set them, the apps will still migrate them to the icm property though.


Valid Values: auto, push, keepAwake, off


Specifies the incoming call mode to be used for this account. If "auto" is set, the mode is taken from global app
settings.


Default Value: auto

### requiresRegistrationForOutgoingCalls { .reference-entry }

```xml
<requiresregistrationforoutgoingcalls>1</requiresregistrationforoutgoingcalls>
```


Valid Values: 0,1


When icm is set to off, the app will not register for incoming calls. When it makes an outgoing call, some
SIP backends will reject it because they only accept call attempts from registered endpoints.


In case this parameter is set to 1, we will register the account when the outgoing call is made and keep it
registered for the duration of the call.


Default Value: 1

### remoteContact { .reference-entry }

```xml
<remotecontact>pai,from,rpid,ppi</remotecontact>
```


Default value: as above


Specifies where in the incoming INVITE packet should we look for calling party identification. The value is a coma-
separated list of identifiers described below. When incoming INVITE packet is received, we look for the remote party
identification at places defined by the order here and use the first found value:




| identifier | SIP header |
| --- | --- |
| pai | **P-Asserted-Identity** header |
| from | **From** header |
| rpid | **Remote-Party-ID** header |
| ppi | **P-Preferred-Identity** header |

## Secure Calls

**Properties**:



```
sdesIncoming
sdesOutgoing
zrtpIncoming
zrtpOutgoing
dtlsIncoming
dtlsOutgoing
```


Valid values: `enabled`, `required`, `<empty>`


Defalut: N/A


Example: `<sdesincoming>enabled</sdesincoming>`


When set to enabled, the app will use best-effort to establish the secure call using the selected technology if
the other side supports it as well, but will fall back to unprotected call if it fails.


In case of required, the call will be dropped if security can't be established.


If not set (left empty), secure calls using the corresponding technology won't be enabled even if the other side
supports them - our side will behave as if the security protocol is not supported.

### enableSdesOverUnencryptedChannel { .reference-entry }

```xml
<enablesdesoverunencryptedchannel>1</enablesdesoverunencryptedchannel>
```

**Default**:
0

**Valid values**:
0 and 1

**Description**:
Controls whether SRTP SDES may be negotiated when the SIP signaling channel itself is not encrypted.

When set to `0`, the app only allows SDES on an encrypted signaling channel, such as TLS. If the signaling
channel is not encrypted, SDES is removed from the SDP offer or answer. If a media stream uses `RTP/SAVP` or
`RTP/SAVPF` with SDES as its only key exchange mechanism, that whole stream is disabled.

When set to `1`, the app keeps SDES in SDP even on an unencrypted signaling channel.

### dtlsCertificateType { .reference-entry }

```xml
<dtlscertificatetype>Rsa</dtlscertificatetype>
```


Valid values: `Rsa`, `Ecc`


Default value: `Rsa`


Selects the certificate type used for automatically generated DTLS-SRTP certificates.


Use `Rsa` to generate an RSA certificate. Use `Ecc` to generate an elliptic-curve certificate.


This setting is applied to both incoming and outgoing DTLS. When `Ecc` is selected, the elliptic curve is taken
from `dtlsCertificateEllipticCurve`. If `dtlsCertificateAndPrivateKey` is provided, the supplied certificate is
used instead of generating a new one.

### dtlsCertificateEllipticCurve { .reference-entry }

```xml
<dtlscertificateellipticcurve>secp256r1</dtlscertificateellipticcurve>
```


Default value: `secp256r1`


Selects the elliptic curve used for automatically generated DTLS-SRTP certificates when
`dtlsCertificateType` is set to `Ecc`.


The value should be a TLS named elliptic curve identifier such as `secp256r1`.


This setting is applied to both incoming and outgoing DTLS. If the value is not recognized, the app falls back to
the first enabled elliptic curve from the TLS configuration. If `dtlsCertificateAndPrivateKey` is provided, the
supplied certificate is used instead of generating a new one.

## External Provisioning

### extProvUrl { .reference-entry }

```xml
<extprovurl>https://my.server.com/prov.php?u=%account[username]%&p=%account[password]%</extprovurl>
```


Default value: empty.


Reprovisioning URL, the app will ask this URL for complete account details. The service is expected to return `<account>` with all the required properties.

### extProvInterval { .reference-entry }

```xml
<extprovinterval>3600</extprovinterval>
```


Default value: 0


How often (in seconds) will the app ask the reprovisioning service for account updates. If the value is 0, the periodic reprovisioning is disabled and reprovisioning URL is contacted only when saving the account on Edit Account screen.

## Balance Checking

See [balance_checker](../calls/balance_checker.md#balance_checker) for detailed description.

**Properties**:



```
genericBalanceCheckUrl
genericBalanceCheckPostData
genericBalanceCheckContentType
balanceCheckIntervalInSeconds
balanceCheckDelayInSeconds
```

## Web Callback

See [web_callback](../calls/web_callback.md#web_callback) for detailed description.

### wcb_enabled { .reference-entry }

```xml
<wcb_enabled>1</wcb_enabled>
```


Default value: 0


This node is used to enable/disable web callback web service.

**Other properties**:

```
wcb_url
wcb_method
wcb_contentType
wcb_postData
wcb_customHeaders
```

## Call Through

### cth_enabled { .reference-entry }

```xml
<cth_enabled>1</cth_enabled>
```


Default value: 0


This node is used to enable/disable callthrough service.

### cth_dialString { .reference-entry }

```xml
<cth_dialstring>+1555123456,%targetNumber%</cth_dialstring>
```


Default value: 0


This dial string to dial via GSM for callthrough service. The dial string may use placeholder replacement described
in [global-params](../reporting/intro.md#global-params) and [account-params](../reporting/intro.md#account-params) scopes.

### cth_ws_enabled { .reference-entry }

```xml
<cth_ws_enabled>1</cth_ws_enabled>
```


Default value: 0


This node is used to enable/disable callthrough service via a web service. The web service and its parameters are
described in detail in [web_callthrough](../calls/web_callthrough.md#web_callthrough) page.


**Properties**:



```
cth_ws_url
cth_ws_method
cth_ws_contentType
cth_ws_postData
cth_ws_customHeaders
```

## Call Forwarding

### forwardingEnabled { .reference-entry }

```xml
<forwardingenabled>1</forwardingenabled>
```


Default value: 0


When set to 1, any incoming call will be automatically forwarded to the number defined in forwardingNumber field.

### forwardingNumber { .reference-entry }

```xml
<forwardingnumber>500</forwardingnumber>
```


Default value: empty.


All incoming calls are redirected to the number you specify.

## Call Waiting

### callWaiting { .reference-entry }

```xml
<callwaiting>1</callwaiting>
```


Default value: based on whether business features are enabled.
With business features enabled, the default is set to 1. With business features disabled, the default is 0.


Enables/disables call waiting. When set to 0, incoming calls will be rejected if user is already on an active call.

## Miscellaneous

### vpnStartupUrl { .reference-entry }

```xml
<vpnstartupurl>https://my.server.com/dummy</vpnstartupurl>
```


Default value: empty


If non empty, the web service is called before every registration attempt.
Sometimes it's required to bring VPN up.

### customActionUrl { .reference-entry }

```xml
<customactionurl>https://example.com/action?uri=%uri%&user=%account[username]%</customactionurl>
```


Default value: empty


Defines the URL which is opened in external browser in case the openUrl Dial Action is invoked on a number or
SIP uri. The placeholder %uri% is replaced by the actual dialed number. See [dialactions](../calls/dialactions.md#dialactions) for more details
and also [client-api-intro](../reporting/intro.md#client-api-intro) about web service parameter placeholders.

## Call Tones

These are tones played locally to indicate call progress or status. The tones may be composed from elementary tones using periodic and compound operations. Durations are always in milliseconds, amplitudes can be either positive numbers, in which case they are used directly as amplitude of 16bit samples, or as negative values, interpreted as decibels (ITU-T recommendation is to use -24dBm0. Frequencies are in Hertz. Characters after digits are ignored, so it's a good idea to write the units after the number for clarity (see examples below).

### Elementary Tones { .reference-entry }

`sine( duration, amplitude, freqs… )`
Creates a sine wave of given duration and amplitude. In case more than one frequency is specified, the tone will play the sine waves of given frequencies simultaneously.

`silence( duration )`
Plays a silence of given duration.

`wav( "filenameWithExtension" )`
Plays a WAV or CAF file. The files should be PCM or ADPCM (ima4\) encoded, 8 or 16KHz. Stereo files are converted to mono.

On iOS, it should specify filename with extension, the library will first search in NSApplicationSupportDirectory, if not found, then in bundle resourcePath.

On Android, the parameter should be asset filename.

### Tone Operators { .reference-entry }

`periodic( tones... )`
Plays the given tone segments in a loop. Tones may be any elementary tones, or compound tone.

`compound( tones... )`
Plays the given tones simultaneously. For simultaneous sine waves, a shortcut syntax of `sine(...)` with multiple frequencies is easier to write.

`tryingTone`

```xml
<tryingtone>periodic(sine(50ms,500,440Hz),silence(40ms))</tryingtone>
```

Played when outgoing call is being establishes, before we get Ringing notification from the remote side.

`ringingTone`

```xml
<ringingtone>periodic(sine(2000ms,2500,440Hz),silence(4000ms))</ringingtone>
```

Played when outgoing call is ringing at the remote side.

For examples of common ringback tones refer to table below:

| Country | Tone definition |
| --- | --- |
| Canada | periodic(sine(2000ms,2500,440Hz,480Hz),silence(4000ms)) |
| Italy | periodic(sine(1000ms,2500,425Hz),silence(4000ms)) |
| Japan | periodic(sine(1000ms,2500,400Hz,416Hz),silence(2000ms)) |
| UK | periodic(sine(400ms,2500,400Hz,450Hz),silence(200ms),sine(400ms,2500,400Hz,450Hz),silence(2000ms)) |
| US | periodic(sine(2000ms,2500,440Hz,480Hz),silence(4000ms)) |

`endCallTone`

```xml
<endcalltone>periodic(sine(300ms,1000,400Hz),silence(400ms),sine(300ms,1000,400Hz),silence(400ms),sine(300ms,1000,400Hz),silence(700000ms))</endcalltone>
```

Played to notify local user that the remote party hung up the call.

`busyTone`

```xml
<busytone>periodic(sine(500ms,2000,400Hz),silence(500ms))</busytone>
```

Played when we receive “Busy” answer on outgoing call.

For examples of common busy tones refer to table below:

| Country | Tone definition |
| --- | --- |
| UK | periodic(sine(375ms,2500,400Hz,450Hz),silence(375ms)) |
| US | periodic(sine(500ms,2500,480Hz,620Hz),silence(500ms)) |

`callWaitingTone`

```xml
<callwaitingtone>periodic(silence(1000ms),sine(300ms,7500,440Hz),silence(9000ms))</callwaitingtone>
```

Played in case there is an established call and another incoming call is waiting to be answered.

`zrtpHandshakeTone`

```xml
<zrtphandshaketone>periodic(sine(50ms,500,400Hz,450Hz),silence(80ms))</zrtphandshaketone>
```

Played during ZRTP handshake.

## Auto Answer

!!! note
    If callkit is enabled on iOS we are unable to auto-answer the calls on lock screen or in background.

### appInitiatedAutoAnswerEnabled { .reference-entry }

```xml
<appinitiatedautoanswerenabled>1</appinitiatedautoanswerenabled>
```

**Default**:
0

**Description**:
Determines if the incoming call should be answered automatically. The application waits the amount of seconds configured via [autoAnswerTimeoutInSeconds](#autoanswertimeoutinseconds) before answering the call automatically.

### autoAnswerTimeoutInSeconds { .reference-entry }

```xml
<autoanswertimeoutinseconds>5</autoanswertimeoutinseconds>
```

**Default**:
0

**Description**:
If [appInitiatedAutoAnswerEnabled](#appinitiatedautoanswerenabled) is 1, the amount of time to wait before answering the call automatically. A value of 0 means the call is immediately answered.

### sipInitiatedAutoAnswerEnabled { .reference-entry }

```xml
<sipinitiatedautoanswerenabled>1</sipinitiatedautoanswerenabled>
```

**Default**:
0

**Description**:
If enabled (value `1`), the call is honoring the incoming SIP call header `Call-Info:` with `answer-after=xx`, the timeout will be taken from this SIP header.

## Busy Lamp Field

Busy Lamp Field allows to observe status of some phone extension on your device. For example, you can create a quick
dial (favorite) entry and check that you are interested in Busy Lamp Field status. The app then shows an indicator
whether this extension is on-hook or off-hook.

On SIP level, the app has to SUBSCRIBE to on-hook and off-hook events from this extension (dialog-info event
package). The app therefore only receives info about subscribed extensions. The extensions to subscribe to are stored
in account XML, in a format described below.

### blf { .reference-entry }

```xml
<blf>
    <uri>1001</uri>
    <uri>1002</uri>
    <uri>5000</uri>
</blf>
```

**Default**:
`<empty>`

**Description**:
blf node contains list of uris/extensions. The app will subscribe to the listed uris for dialog-info events.

!!! note
    For [external-provisioning](../provisioning/external_provisioning.md#external-provisioning), if the incoming XML contains the `<blf>` node with some `<uri>` entries, the list
    from incoming XML replaces the existing list, discarding any previous values (if the priorities allow that, see
    [mergeable-xml](mergeable_xml.md#mergeable-xml). It is also possible to provision using "union" operation, as in:
    `<blf priority="40" operation="subnode-union">....</blf>` in which case the lists are merged together.

## CardDav

### cardDavTitle { .reference-entry }

```xml
<carddavtitle>My CardDav</carddavtitle>
```

**Default**:
No default value

**Description**:
Title shown in the app for CardDav contacts, in Contacts tab.

### cardDavPrincipalUrl { .reference-entry }

```xml
<carddavprincipalurl>somecarddavurl.com</carddavprincipalurl>
```

**Default**:
No default value

**Description**:
CardDAV principal URL. You can use placeholders like %account\[username]% in the URL for any fields from Account XML.

### cardDavRefresh { .reference-entry }

```xml
<carddavrefresh>180</carddavrefresh>
```

**Default**:
180

**Description**:
CardDAV refresh period in seconds. The app will check for any changes on the server periodically.

### cardDavUsername { .reference-entry }

```xml
<carddavusername>johndoe</carddavusername>
```

**Default**:
No default value

**Description**:
Username for CardDav. If not sent, will default to use SIP username.

### cardDavPassword { .reference-entry }

```xml
<carddavpassword>secrete</carddavpassword>
```

**Default**:
No default value

**Description**:
Password for CardDav. If not sent, will default to use SIP password.

## Push Options

!!! warning
    The settings here are designed to fine-tune your account to avoid specific push call related issues with some SIP servers.
    Modifying them without encountering any problems may inadvertently cause new issues.
    It's strongly advised to only adjust these settings upon recommendation from Acrobits Support Team or if you have a thorough understanding of the implications for your SIP account.
    Proceed with caution.

### taglessSelector { .reference-entry }

```xml
<taglessselector>0</taglessselector>
```

**Default**:
0

**Description**:
By default, each registration on SIPIS for an account configured on multiple devices has its own selector.
Setting to 1 will combine all instances into a single one with tokens for every device.
This can help get calls to all devices provisioned with the same account even if you don’t support call forking/multiple registrations, but cannot solve all problem scenarios. e.g. there will still be multiple registrations if the app is open on any of the devices configured with the account.

### pushBlockReg { .reference-entry }

```xml
<pushblockreg>0</pushblockreg>
```

**Default**:
0

**Valid values**:
1 or 0

**Description**:
By default, the app will register when it receives a pushed call.
Setting to 1 will force the app to delay the registration until the pushed call is over.
This can help with SIP servers that can’t handle new registrations (the app) while there is an active call on a different registration (SIPIS).

### pushNAT { .reference-entry }

```xml
<pushnat>1</pushnat>
```

**Default**:
1

**Valid values**:
1 or 0

**Description**:
By default, SIPIS *pretends* to be behind NAT (even though it isn’t) because most SIP servers handle audio for pushed calls better in this case.
Setting to 0 means that SIPIS will register using its public IP address.
This can help with SIP servers that want the public IP in contact headers and rely on STUN.

### sipisMustUnregister { .reference-entry }

```xml
<sipismustunregister>0</sipismustunregister>
```

**Default**:
0

**Valid values**:
1 or 0

**Description**:
By default, SIPIS does not unregister, it just lets registrations expire.
Setting to 1 will force SIPIS to unregister before the app registers when it enters the foreground.
This can help with SIP servers that need old registrations to unregister (SIPIS), before new ones are done (the app).
Note: This is not normally needed even if the SIP server doesn’t support call forking or multiple registrations.
As long as the SIP server sends the INVITE to the most recent registration (the normal behavior for servers that don’t support multiple registrations/call forking), push will work fine without setting this to 1.
It will also add a slight delay to the registration from the app (since it must wait for SIPIS to unregister first).

### pushProxy { .reference-entry }

```xml
<pushproxy>pushproxy.com:[port]</pushproxy>
```

**Description**:
Allows you to set a different proxy for SIPIS than the one the app uses in the foreground.

## Desktop Options

### genericSmsFetchInterval { .reference-entry }

```xml
<genericsmsfetchinterval>8000</genericsmsfetchinterval>
```

**Default**:
8000

**Description**:
The time in milliseconds for polling interval of [fetching web messages](../messaging/fetch_messages.md).

### genericSmsFetchInBackgroundInterval { .reference-entry }

```xml
<genericsmsfetchinbackgroundinterval>20000</genericsmsfetchinbackgroundinterval>
```

**Default**:
30000

**Description**:
The time in milliseconds for polling interval of [fetching web messages](../messaging/fetch_messages.md) when the Desktop app is in the background.

## Video Conferencing

### conferencingEnabled { .reference-entry }

```xml
<conferencingenabled>0</conferencingenabled>
```

**Default**:
1

**Description**:
When the value in the account.xml is set to "0" then Video Conferencing is explicitly disabled for the device. In case of more account.xmls at least one of these account.xmls must have value set to "0" to disable Video Conferencing for the device.

## Account Example

```
<account>
    <username>xxx</username>
    <password>secret</password>
    <host>1.2.3.4</host>
    <codecorder>9,0,8,102,3</codecorder>
    <codecorder3g>102,3,9,0,8</codecorder3g>
</account>
```