Overview

Asterisk ARI (Asterisk REST Interface) allows you to connect VR3 AI voice agents to your existing Asterisk PBX. ARI provides a WebSocket-based event model for controlling calls via Stasis applications, giving VR3 AI full control over call flow and audio streaming. This guide focuses on the VR3 AI-specific configuration. For general Asterisk installation and administration, refer to the official Asterisk documentation.

Prerequisites

Before setting up the ARI integration, ensure you have:
  • A running Asterisk instance with chan_websocket and res_websocket_client modules available. Known-working setups: (a) Asterisk 22+, (b) Asterisk 20 LTS with these modules included
  • ARI module enabled in Asterisk
  • chan_websocket (WebSocket channel driver) and res_websocket_client (loads websocket_client.conf) enabled in your Asterisk build. Verify with asterisk -rx "module show like chan_websocket" and asterisk -rx "module show like res_websocket_client" — both should report Running.
  • Network connectivity between your VR3 AI instance and Asterisk
  • VR3 AI instance running and accessible
If you compiled Asterisk from source, ensure both chan_websocket and res_websocket_client are included during the build. These modules are required for external media streaming between Asterisk and VR3 AI. Refer to the Asterisk build system documentation for details on enabling modules.

Asterisk Configuration

The following Asterisk configuration files need to be set up to work with VR3 AI. These are minimal examples focused on the VR3 AI integration — refer to the Asterisk documentation for full configuration details.

Enable ARI (ari.conf)

Create an ARI user that VR3 AI will use to authenticate:
[general]
enabled = yes

[vr3ai]
type = user
read_only = no
password = your_secure_password
The username (section name, e.g., vr3ai) and password here must match the Stasis App Name and App Password you configure in VR3 AI.

Enable the HTTP Server (http.conf)

ARI requires the Asterisk HTTP server to be enabled:
[general]
enabled = yes
bindaddr = 0.0.0.0
bindport = 8088

Configure the Stasis Dialplan (extensions.conf)

Route incoming calls to your Stasis application so VR3 AI can handle them:
[from-external]
exten => _X.,1,NoOp(Incoming call to ${EXTEN})
 same => n,Stasis(vr3ai)
 same => n,Hangup()
Replace vr3ai with the app name you configured in ari.conf and in VR3 AI.

Configure External Media Streaming (websocket_client.conf)

VR3 AI uses Asterisk’s external media streaming to send and receive audio over WebSocket. Configure a WebSocket client connection that points to your VR3 AI instance:
[vr3ai]
type = websocket_client
uri = wss://vr3ai.tapcloud.org/api/v1/telephony/ws/ari
protocols = media
tls_enabled = yes
ca_list_file = /etc/ssl/certs/ca-certificates.crt
tls_enabled = yes is required even though the URI scheme is wss:// — without it Asterisk will not negotiate TLS and the connection will fail. The ARI credentials (Stasis App Name and App Password) must match what you configure in the VR3 AI dashboard under Telephony Settings.
The section name (e.g., vr3ai) is the WebSocket Client Name you’ll enter in the VR3 AI telephony configuration. This name tells Asterisk which WebSocket connection to use for external media streaming during calls.
VR3 AI’s external media channel uses G.711 μ-law (ulaw). Make sure any PJSIP endpoint or SIP trunk that places or receives calls through VR3 AI allows ulaw (e.g. allow=ulaw in the endpoint config).
Refer to the Asterisk WebSocket documentation for additional websocket_client.conf options and TLS configuration.

Apply the configuration changes

After editing any of the files above, reload the affected Asterisk modules from the Asterisk CLI (asterisk -rvvv):
ari reload                                 # picks up ari.conf changes
dialplan reload                            # picks up extensions.conf changes
module reload res_websocket_client.so      # picks up websocket_client.conf changes
Changes to http.conf require a full Asterisk reload (core reload) or a service restart.

Configuration in VR3 AI

Step 1: Navigate to Telephony Settings

  1. Navigate to /telephony-configurations and click Add configuration
  2. Select Asterisk ARI as your provider

Step 2: Enter Your ARI Credentials

Configure the following fields:
FieldDescriptionExample
ARI Endpoint URLHTTP base URL of your Asterisk ARI serverhttp://asterisk.example.com:8088
Stasis App NameThe ARI username configured in ari.confvr3ai
App PasswordThe ARI password configured in ari.confyour_secure_password
WebSocket Client NameThe connection name from websocket_client.confvr3ai
From ExtensionsOptional SIP extensions or trunk numbers for outbound callsPJSIP/6001 or 6001

Step 3: Save and Add Extensions

  1. Click Save Configuration
  2. Open the configuration you just created and add each SIP extension that should be reachable as a phone number (e.g. 8000). For inbound, you’ll assign a workflow to each extension separately — see Inbound Calling below.
  3. Create a test workflow and initiate a test call to verify the connection.

Inbound Calling

Unlike other telephony providers that use HTTP webhooks for inbound calls, ARI delivers inbound calls as StasisStart events on the ARI WebSocket. VR3 AI automatically detects these events and activates the workflow assigned to the called extension.

How It Works

  1. An external call arrives at Asterisk and the dialplan routes it to Stasis(vr3ai)
  2. Asterisk fires a StasisStart event over the ARI WebSocket with the channel in Ring state and the dialed extension in the dialplan context
  3. VR3 AI looks up the called extension in your telephony configuration’s phone numbers, finds the assigned workflow, validates quota, and creates a workflow run
  4. The call is answered, bridged to an external media channel, and your voice agent workflow begins
Workflow assignment is per extension, so different extensions on the same Asterisk can route to different agents.

Setting Up Inbound Calls

Step 1: Configure the Asterisk dialplan Ensure your dialplan routes the extensions you care about into the Stasis application. Either route a specific extension:
[from-external]
exten => 8000,1,NoOp(Incoming call to 8000)
 same => n,Stasis(vr3ai)
 same => n,Hangup()
…or use a pattern that catches every extension you’ll register in VR3 AI:
[from-external]
exten => _X.,1,NoOp(Incoming call to ${EXTEN})
 same => n,Stasis(vr3ai)
 same => n,Hangup()
Replace vr3ai with the app name you configured in ari.conf and in VR3 AI. Step 2: Add the extension as a phone number in VR3 AI
  1. Go to /telephony-configurations and open your Asterisk ARI configuration
  2. In the Phone numbers section, add a phone number whose address is the SIP extension (e.g. 8000)
  3. Set its Inbound workflow to the agent that should answer
  4. Save
    Adding the extension in VR3 AI doesn’t change Asterisk’s dialplan — that’s what Step 1 is for. The VR3 AI entry tells the StasisStart handler which workflow to run when a call to that extension reaches the Stasis app.
Repeat Step 2 for each extension that should reach a voice agent. Step 3: Test an inbound call Place a call to one of the extensions you configured. You should see the assigned workflow activate and the voice agent respond.

Inbound Call Context

When an inbound call activates a workflow, the following context is available to your workflow:
FieldDescription
caller_numberThe caller’s phone number or extension
called_numberThe dialed number or extension
directionAlways inbound
call_idThe Asterisk channel ID
providerAlways ari

Troubleshooting

  • Verify the ARI endpoint URL is correct and reachable from your VR3 AI instance
  • Check that the Asterisk HTTP server is running (http.conf has enabled = yes)
  • Ensure firewall rules allow traffic on the ARI port (default: 8088)
  • Confirm the ARI module is loaded: run module show like res_ari in the Asterisk CLI
  • Verify the Stasis App Name matches the ARI user section name in ari.conf
  • Check the App Password matches the password in ari.conf
  • Ensure there are no extra spaces in the credentials
  • Verify chan_websocket is loaded: run module show like chan_websocket in the Asterisk CLI
  • Check that websocket_client.conf is correctly configured with the right VR3 AI URI
  • Ensure the WebSocket Client Name in VR3 AI matches the section name in websocket_client.conf
  • Verify network connectivity and firewall rules allow WebSocket traffic between Asterisk and VR3 AI
  • Ensure the dialplan routes calls to Stasis(your_app_name)
  • Verify the app name in the dialplan matches the ARI user in ari.conf
  • Check Asterisk CLI for errors: asterisk -rvvv
  • Confirm the ARI WebSocket connection is active
  • Verify the called extension is added as a phone number under your ARI configuration in /telephony-configurations and has an Inbound workflow assigned
  • Confirm the workflow exists and belongs to the same organization as the ARI config
  • Check that your organization has available quota
  • Review VR3 AI logs for warnings like “no matching phone number registered for config” or “has no inbound_workflow_id assigned”
  • Check the URI in websocket_client.conf points to the correct VR3 AI host and port
  • Verify the VR3 AI instance is running and accepting WebSocket connections
  • If using TLS, ensure certificates are correctly configured on both sides

Best Practices

  • Keep your Asterisk instance on the same network or a low-latency connection to VR3 AI for optimal audio quality
  • Use strong passwords for ARI authentication
  • Restrict ARI access to known IP addresses using firewall rules
  • Monitor Asterisk logs alongside VR3 AI logs when debugging call issues
  • Keep Asterisk updated to the latest stable version for security and compatibility

Further Reading