> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes.
# Technical reference
> Complete reference for Click-to-Call configuration options and parameters
This page provides a comprehensive reference for Click-to-Call, including all available configuration parameters and their usage.
## Snippet structure
The Click-to-Call snippet consists of two main parts that work together to create a fully functional Click-to-Call widget on your website:
### Async loader (IIFE)
The first part is an Immediately Invoked Function Expression (IIFE) that handles:
* Loading the required JavaScript resources
* Authentication with SignalWire services
* Setting up the necessary namespaces and methods
```javascript
// Async Loader IIFE - Do not modify this section except for the API key if necessary
(a => {
// Loader implementation
// ...
})({ apiKey: "c2c_XXXXXXXXXXXXXXXXXXXXX", v: "0.0.1" });
```
> **Only modify the API key if necessary**
>
> * Never modify the Async Loader code except for the API key if necessary
> * The API key is linked to your SignalWire account and specific permissions
> * If you need to change the API key, ensure the new key has permissions for the destinations you plan to use
> * If your key doesn't have access to the destination resources, calls will fail to connect
The loader initializes a global `sw` namespace in your browser window, with a nested `c2c` namespace that contains
all the methods needed to work with the Click-to-Call widget.
### Component initialization
The second part calls the `spawn` method to configure and render the widget:
```javascript
// Component initialization - Can be customized
sw.c2c.spawn('C2CButton', {
// Configuration parameters
destination: '/public/example',
buttonParentSelector: '#click2call',
callParentSelector: '#call',
// Additional parameters as needed
});
```
When you create a Click-to-Call widget in the SignalWire Dashboard, both parts are generated together as a single code snippet.
You can copy this entire snippet into your website's HTML, and the Click-to-Call widget will be initialized immediately when the
page loads.
> **Tip**
>
> In some cases, you might want to delay the initialization of the Click-to-Call widget until a specific user action or page event.
> You can achieve this by:
>
> 1. Including only the Async Loader part of the script in your page's head or early in the body
> 2. Calling the component initialization method later when you want to initialize the widget
## Methods
### `spawn`
The `spawn` method is used to initialize the C2C widget. It will use the CSS selectors provided in `buttonParentSelector` and
`callParentSelector` to render the call button and widget.
#### Syntax
```javascript
sw.c2c.spawn('componentName', options)
```
#### Parameters
**`componentName`** `string` — required
The component to initialize. Currently only `'C2CButton'` is supported.
---
**`options`** `object` — required
An object of configuration options that control the behavior and appearance of the C2C widget.
---
**`destination`** `string` — required
The destination address to call, using SignalWire Address format. Bound to the destination(s) selected when the snippet was created in the dashboard — if the destination is not valid, the call will not connect.
> **Warning**
>
> The `destination` must reference a valid destination that was selected when creating the C2C widget in the dashboard. If the destination is not valid, the call will not connect.
```javascript
sw.c2c.spawn('C2CButton', {
destination: '/public/support',
});
```
---
**`buttonParentSelector`** `string` — required, default: #click2call
CSS selector for the HTML element where the call button will be rendered. This element must exist in the DOM when `sw.c2c.spawn` is called.
```javascript
sw.c2c.spawn('C2CButton', {
buttonParentSelector: '#my-call-button-container',
});
```
---
**`callParentSelector`** `string` — required, default: #call
CSS selector for the HTML element where the call widget will be displayed when a call is active. This element must exist in the DOM when `sw.c2c.spawn` is called.
```javascript
sw.c2c.spawn('C2CButton', {
callParentSelector: '#my-call-widget-container',
});
```
---
**`innerHTML`** `string`
Optional HTML markup to render a custom call button. If not provided, a default button will be used. Allows you to fully customize the button appearance to match your website's design.
```javascript
sw.c2c.spawn('C2CButton', {
innerHTML: '',
});
```
---
**`beforeCallStartFn`** `function`
Called when the user clicks to start a call, before call setup begins. Return `true` to proceed with the call or `false` to cancel.
Common uses: validating form data, performing business hours checks, showing loading indicators, confirming with the user.
```javascript
sw.c2c.spawn('C2CButton', {
beforeCallStartFn: () => {
const hour = new Date().getHours();
if (hour < 9 || hour >= 17) {
alert('Our call center is only available from 9 AM to 5 PM.');
return false;
}
document.getElementById('loading').style.display = 'block';
return true;
},
});
```
---
**`afterCallStartFn`** `function`
Called after call setup completes and the connection is established. Useful for updating UI elements or tracking call start events.
Common uses: hiding the call button, updating UI to reflect active call state, triggering analytics events.
```javascript
sw.c2c.spawn('C2CButton', {
afterCallStartFn: () => {
document.getElementById('loading').style.display = 'none';
document.getElementById('call-button-container').style.display = 'none';
console.log('Call connected successfully');
},
});
```
---
**`beforeCallLeaveFn`** `function`
Called when the user or system initiates call end, before teardown begins. Return `true` to proceed with hanging up or `false` to cancel.
Common uses: showing confirmation dialogs, performing cleanup operations.
```javascript
sw.c2c.spawn('C2CButton', {
beforeCallLeaveFn: () => {
return confirm('Are you sure you want to end this call?');
},
});
```
---
**`afterCallLeaveFn`** `function`
Called after the call has fully ended and the widget is removed from view.
Common uses: restoring UI elements to their pre-call state, showing feedback forms, triggering analytics events.
```javascript
sw.c2c.spawn('C2CButton', {
afterCallLeaveFn: () => {
document.getElementById('call-button-container').style.display = 'block';
document.getElementById('call-feedback').style.display = 'block';
console.log('Call ended');
},
});
```
---
**`onCallError`** `function`
Called if any error occurs during the call setup process. Receives the error object as a parameter.
Common uses: displaying user-friendly error messages, logging errors, hiding loading indicators, implementing retry logic.
```javascript
sw.c2c.spawn('C2CButton', {
onCallError: (error) => {
console.error('Call error:', error);
document.getElementById('loading').style.display = 'none';
if (error.name === 'MediaDeviceError') {
alert('Please ensure your microphone is connected and you have granted permission to use it.');
} else {
alert('Sorry, we couldn\'t connect your call. Please try again later.');
}
},
});
```
---
## Complete example
Here's a complete example that demonstrates all available configuration parameters:
```javascript
sw.c2c.spawn('C2CButton', {
// Core parameters
destination: '/public/support',
buttonParentSelector: '#click2call',
callParentSelector: '#call',
innerHTML: '',
// Callback parameters
beforeCallStartFn: () => {
console.log('Preparing to start call...');
document.getElementById('loading').style.display = 'block';
return true;
},
afterCallStartFn: () => {
console.log('Call connected!');
document.getElementById('loading').style.display = 'none';
document.getElementById('click2call').style.display = 'none';
},
beforeCallLeaveFn: () => {
return confirm('Are you sure you want to end this call?');
},
afterCallLeaveFn: () => {
console.log('Call ended.');
document.getElementById('click2call').style.display = 'block';
document.getElementById('feedback-form').style.display = 'block';
},
onCallError: (error) => {
console.error('Call error:', error);
document.getElementById('loading').style.display = 'none';
alert('Sorry, we couldn\'t connect your call. Please try again later.');
}
});
```
> Complete reference for Click-to-Call configuration options and parameters