Public Integration Package for connecting VICIdial call centers with DID Optimizer Pro service.
This is the standalone public integration repository. The main DID Optimizer application is proprietary software available at https://dids.amdy.io
📦 Repository: https://github.com/nikvb/vicidial-integration 🌐 Web Application: https://dids.amdy.io 📖 Full Documentation: https://docs.amdy.io
agi/vicidial-did-optimizer.agi- Production AGI script for real-time DID selection- Runs during call flow in Asterisk
- Reads configuration from
/etc/asterisk/dids.conf - Makes API requests to DID Optimizer for optimal DID selection
- Sets
${OPTIMIZER_DID}channel variable - Comprehensive logging and error handling
- File-based caching for performance
scripts/AST_DID_optimizer_sync.pl- Syncs VICIdial call outcomes to DID Optimizer- Polls
vicidial_logtable every minute - Reports call results (answered, busy, no-answer, etc.)
- Tracks call duration and disposition
- Used for AI training and performance analytics
- Auto-configured from VICIdial database
- Installs to
/usr/share/astguiclient/(standard VICIdial location)
- Polls
scripts/install-agi.sh- One-command AGI installerscripts/install-call-results-sync.sh- One-command sync installerscripts/install-vicidial-integration.sh- Complete installation
config/dids.conf- API credentials and settings templateconfig/vicidial-dialplan-agi.conf- Dialplan integration exampleconfig/vicidial-dialplan-simple.conf- Simple dialplan example
docs/CENTOS7_INSTALLATION.md- CentOS 7 specific instructionsdocs/CENTOS7_QUICKSTART.md- Quick start for CentOS 7
Log in to VICIdial Admin interface:
- Go to Admin → Users
- Create or modify API user:
- User Level: 8 or higher
- User Group: Default or custom
- Enable "View Reports" permission
- Go to Admin → User Groups
- Edit the user group
- Set Allowed Campaigns to exactly:
-ALL⚠️ Must be exactly-ALL(including the dash)- This grants access to all campaigns
- Log in to https://dids.amdy.io
- Navigate to Settings → VICIdial Integration
- Enter VICIdial connection details:
- Server Address: Your VICIdial hostname or IP
- Username: API user created in Step 1
- Password: API user password
- Click Test Connection button
- Once connected, click Sync Campaigns button
- Verify campaigns appear in the interface
- In Settings → VICIdial Integration, scroll to "Step 1: Download Configuration"
- Click Download dids.conf button
- Upload to your VICIdial server:
# Upload the file scp dids.conf root@your-vicidial-server:/etc/asterisk/dids.conf # Set proper permissions (important!) sudo chmod 600 /etc/asterisk/dids.conf sudo chown asterisk:asterisk /etc/asterisk/dids.conf
On your VICIdial server, run:
cd /tmp
wget https://raw.githubusercontent.com/nikvb/vicidial-integration/main/scripts/install-agi.sh
chmod +x install-agi.sh
sudo ./install-agi.shWhat it does:
- ✅ Checks VICIdial environment
- ✅ Installs required Perl modules (LWP::UserAgent, JSON, etc.)
- ✅ Downloads AGI script to
/var/lib/asterisk/agi-bin/ - ✅ Sets proper permissions (755)
- ✅ Creates log directory
- ✅ Verifies installation
- In VICIdial Admin, go to Admin → Carriers
- Select your carrier
- Copy the entire Dialplan Entry content
- Go to https://dids.amdy.io → Settings → VICIdial Integration
- Scroll to "Step 2: Generate Modified Dialplan"
- Paste your carrier's dialplan into the text area
- Click Generate Modified Dialplan button
- The generator automatically inserts AGI calls at the correct position
- Click Copy button to copy generated dialplan
- Return to VICIdial Admin → Carriers
- Replace your carrier's Dialplan Entry with generated version
- Click Submit
Why use the generator?
- ✅ Automatically inserts AGI calls at correct position
- ✅ Preserves all existing VICIdial functionality
- ✅ Handles different dialplan patterns
- ✅ No syntax errors
- ✅ Includes proper variable passing
VICIdial automatically reloads the dialplan - no Asterisk restart needed!
# Monitor logs in real-time
tail -f /var/log/astguiclient/did-optimizer.log
# Make a test call through VICIdial
# You should see logs showing DID selection
# Verify in dashboard
# Go to https://dids.amdy.io dashboard
# Check for call records appearingThis syncs VICIdial call outcomes back to DID Optimizer for AI training and performance analytics.
One-line installer:
curl -fsSL https://raw.githubusercontent.com/nikvb/vicidial-integration/main/scripts/install-call-results-sync.sh | sudo bashWhat it does:
- Installs Perl dependencies (DBI, DBD::mysql, LWP::UserAgent, JSON)
- Downloads sync script to
/usr/share/astguiclient/ - Creates cron job (runs every minute)
- Reads config from
/etc/asterisk/dids.conf - Logs to
/var/log/astguiclient/did-optimizer-sync.log
Monitor sync activity:
# View real-time sync logs
tail -f /var/log/astguiclient/did-optimizer-sync.log
# Check recent syncs
grep 'Summary:' /var/log/astguiclient/did-optimizer-sync.log | tail -5
# Check for errors
grep 'ERROR\|Failed' /var/log/astguiclient/did-optimizer-sync.logFor advanced users who prefer command-line configuration:
-
Install AGI Script
cd /tmp wget https://raw.githubusercontent.com/nikvb/vicidial-integration/main/scripts/install-agi.sh chmod +x install-agi.sh sudo ./install-agi.sh -
Get API Key from Website
- Log in to https://dids.amdy.io
- Go to Settings → API Keys
- Click Create API Key
- Copy the generated key (save it - shown only once!)
-
Configure dids.conf
sudo nano /etc/asterisk/dids.conf
Update required settings:
[general] api_base_url=https://dids.amdy.io api_key=did_YOUR_ACTUAL_API_KEY_HERE fallback_did=+18005551234 # Database settings (usually auto-detected from /etc/astguiclient.conf) db_host=localhost db_user=cron db_pass=1234 db_name=asterisk
-
Generate Dialplan Using Website
Even for command-line installation, use the web-based dialplan generator!
- Go to https://dids.amdy.io → Settings → VICIdial Integration
- Copy your carrier's dialplan from VICIdial Admin → Carriers
- Paste into dialplan generator
- Click Generate Modified Dialplan
- Copy generated dialplan back to VICIdial Admin
- Click Submit
DO NOT manually edit dialplan files - the generator ensures correct integration.
[general]
# API Configuration (REQUIRED)
api_base_url=https://dids.amdy.io
api_key=did_YOUR_API_KEY_HERE
api_timeout=10
max_retries=3
# Fallback DID (REQUIRED - used when API unavailable)
fallback_did=+18005551234
# Logging
log_file=/var/log/astguiclient/did-optimizer.log
debug=1
# Database Configuration (usually auto-detected from /etc/astguiclient.conf)
db_host=localhost
db_user=cron
db_pass=1234
db_name=asterisk
db_port=3306
# Performance Settings
daily_usage_limit=200
max_distance_miles=500
# Geographic Settings
enable_geographic_routing=1
enable_state_fallback=1
enable_area_code_detection=1- Customer call initiated through VICIdial
- Asterisk executes dialplan which calls the AGI script
- AGI script reads configuration from
/etc/asterisk/dids.conf - API request made to DID Optimizer with:
- Customer phone number
- Campaign ID
- Agent ID (if available)
- Customer state/ZIP (from VICIdial database)
- Optimal DID selected based on:
- Geographic proximity to customer
- Rotation rules and daily limits
- Reputation scores
- Campaign-specific settings
- Caller ID set to selected DID via
${OPTIMIZER_DID}variable - Call proceeds with optimized caller ID
- Call tracked in DID Optimizer dashboard
- Customer Phone Number: Area code and geographic detection
- Campaign ID: Campaign-specific rotation rules
- Agent ID: Agent-specific tracking
- Customer Location: State and ZIP code (from VICIdial database)
- Time of Day: For pattern analysis
- Call History: Previous outcomes and performance
- DID Reputation: Spam scores and carrier filtering status
# Test with sample data
sudo -u asterisk /var/lib/asterisk/agi-bin/vicidial-did-optimizer.agi TEST001 1001 4155551234
# Expected output: Selected DID and debug information# Real-time log monitoring
tail -f /var/log/astguiclient/did-optimizer.log
# Search for errors
grep ERROR /var/log/astguiclient/did-optimizer.log
# View recent DID selections
grep "Selected DID" /var/log/astguiclient/did-optimizer.log | tail -20curl -H "x-api-key: did_YOUR_API_KEY" https://dids.amdy.io/api/v1/health- Make a test call through VICIdial
- Check Asterisk logs:
asterisk -rx "core show channels verbose" - Verify caller ID shows optimized DID
- Check DID Optimizer dashboard for call record at https://dids.amdy.io
Check AGI script exists and is executable:
ls -la /var/lib/asterisk/agi-bin/vicidial-did-optimizer.agi
# Should show: -rwxr-xr-x (755 permissions)Check Perl modules:
perl -e 'use LWP::UserAgent; use JSON; use URI::Escape; use Cache::FileCache; use Asterisk::AGI; print "OK\n"'Check logs:
tail -100 /var/log/astguiclient/did-optimizer.logVerify configuration:
grep -E "^(api_base_url|api_key)" /etc/asterisk/dids.confTest connectivity:
curl -v -H "x-api-key: YOUR_API_KEY" https://dids.amdy.io/api/v1/healthCheck firewall:
# Ensure outbound HTTPS (port 443) is allowed
sudo iptables -L OUTPUT -n | grep 443Possible causes:
- No DIDs loaded in DID Optimizer database
- All DIDs at daily usage limit (200 calls/day default)
- Reputation scores too low (< 50 filtered out)
- Geographic filters too restrictive
Check in DID Optimizer:
- Go to DID Management page at https://dids.amdy.io
- Verify DIDs are active and have good reputation scores
- Check usage statistics
# Verify file exists with correct permissions
ls -la /etc/asterisk/dids.conf
# Should show: -rw------- (600 permissions)
# Re-download from web interface if missing
# Or get template: https://github.com/nikvb/vicidial-integration/blob/main/config/dids.confCheck VICIdial database config:
cat /etc/astguiclient.conf | grep VARDBTest database connection:
mysql -h localhost -u cron -p1234 asterisk -e "SELECT COUNT(*) FROM vicidial_list LIMIT 1"Check if sync is installed:
ls -la /usr/share/astguiclient/AST_DID_optimizer_sync.pl
crontab -l | grep AST_DID_optimizer_syncMonitor sync activity:
# View real-time logs
tail -f /var/log/astguiclient/did-optimizer-sync.log
# Check recent syncs
grep 'Summary:' /var/log/astguiclient/did-optimizer-sync.log | tail -10Manual test:
sudo perl /usr/share/astguiclient/AST_DID_optimizer_sync.plAfter installation:
Core Files:
- AGI Script:
/var/lib/asterisk/agi-bin/vicidial-did-optimizer.agi - Configuration:
/etc/asterisk/dids.conf - Logs:
/var/log/astguiclient/did-optimizer.log - Cache:
/tmp/did_optimizer/(auto-created)
Call Results Sync (if installed):
- Sync Script:
/usr/share/astguiclient/AST_DID_optimizer_sync.pl - Sync Logs:
/var/log/astguiclient/did-optimizer-sync.log - State File:
/tmp/did-optimizer-last-check.txt - Cron Job: Runs every minute via root crontab
Installation complete when:
Web Interface Setup:
- VICIdial API user created (level 8+)
- Allowed Campaigns set to
-ALL - VICIdial connection tested in web interface
- Campaigns synced from VICIdial
- dids.conf downloaded from web interface
Server Installation:
- dids.conf uploaded to
/etc/asterisk/dids.conf - dids.conf permissions set to 600
- AGI script installed at
/var/lib/asterisk/agi-bin/vicidial-did-optimizer.agi - AGI script has 755 permissions
- Perl dependencies installed successfully
Dialplan Integration:
- Dialplan generated using web interface
- Generated dialplan applied in VICIdial Carriers
- Test call completed successfully
- Logs showing DID selection activity
Verification:
- Dashboard showing call records at https://dids.amdy.io
- Caller ID showing optimized DIDs on test calls
Optional (Recommended):
- Call results sync installed
- Sync cron job running every minute
- Sync logs showing successful uploads
- 📖 Full Documentation: https://docs.amdy.io
- 🌐 Web Application: https://dids.amdy.io
- 💻 GitHub Repository: https://github.com/nikvb/vicidial-integration
- 🐛 Report Issues: https://github.com/nikvb/vicidial-integration/issues
- 📧 Email Support: support@amdy.io
This integration package is open source and available for use with the DID Optimizer Pro service.
The main DID Optimizer application is proprietary software. For pricing and access:
- Visit: https://dids.amdy.io
- Sign up for a free trial
- Plans start at $99/month
Installation Time: 10-15 minutes with web-based setup
Your VICIdial system will automatically optimize caller ID selection for improved answer rates and call performance! 🚀