laravel-mikopbx maintained by bitdreamit
Description
The most complete, professional & premium open-source Laravel package for MikoPBX & Asterisk — REST API, AMI, ARI, Auto Dialer, Campaign Manager, IVR Builder, Conference, Recording, Agent Panel, Real-time Events, Analytics & more.
Author
Last update
2026/06/19 08:32
(dev-main)
License
Downloads
0
Tags
asterisk - ami - laravel - voip - ivr - campaign - conference - sip - ari - pbx - recording - cdr - mikopbx - call-center - autodialer
bitdreamit/laravel-mikopbx
The most complete, professional and premium open-source Laravel package for MikoPBX & Asterisk. Built for Laravel 12 · PHP 8.2+ · Zero external dependencies.
Features at a Glance
| Category | Features |
|---|---|
| Call Control | Originate, Transfer (blind + attended), Hangup, Hold, Mute, Park |
| Queue Management | Add/remove agents, pause/unpause, queue status, summary |
| Auto Dialer | Voice broadcast, IVR survey, predictive, campaign scheduling |
| Conference | Create bridge, dial-in, mute/kick participant, record |
| IVR Builder | Fluent API, multi-level, preset templates |
| Recording | List, download, live start/stop/pause, stats |
| Analytics | Dashboard KPIs, SLA compliance, peak hours, agent performance, CDR export |
| Blacklist | Block/unblock numbers, expiry, auto-reject |
| Callbacks | Auto-schedule missed call callbacks, retry queue |
| Notifications | Email, Slack, database for missed calls, voicemail, campaigns |
| SMS Alerts | Twilio, Vonage, SSL Wireless BD, custom gateway |
| Real-time Events | AMI listener, Laravel broadcasting, Laravel Echo ready |
| ARI | Channels, bridges, recordings, sounds, endpoints, playbacks |
| AMI | Full Asterisk AMI — all actions, queue, voicemail, parking, confbridge, AstDB |
| REST API | 40+ endpoints, form request validation, JSON resources |
| Testing | MikoPBXFake, simulate events, assert helpers |
| Health Check | REST + AMI + extensions + active calls check |
| Traits | HasCallLogs, FormatsCallDuration, ValidatesPhoneNumber |
| DTOs | CallDTO, OriginateDTO, CampaignDTO, AgentDTO |
| Contracts | All services behind interfaces for easy mocking |
Installation
composer require bitdreamit/laravel-mikopbx
php artisan mikopbx:install
Environment Variables
# REST API
MIKOPBX_URL=https://YOUR-MIKOPBX-VPS-IP
MIKOPBX_API_KEY=your-64-char-api-key
MIKOPBX_VERIFY_SSL=false
# AMI (Asterisk Manager Interface)
MIKOPBX_AMI_HOST=YOUR-MIKOPBX-VPS-IP
MIKOPBX_AMI_PORT=5038
MIKOPBX_AMI_USER=laravelapp
MIKOPBX_AMI_SECRET=StrongSecret123
# ARI (Asterisk REST Interface) — optional
MIKOPBX_ARI_URL=http://YOUR-MIKOPBX-VPS-IP:8088
MIKOPBX_ARI_USER=ari_admin
MIKOPBX_ARI_SECRET=ari_secret
# Webhook
MIKOPBX_WEBHOOK_SECRET=your-hmac-secret
# SMS
MIKOPBX_SMS_DRIVER=custom # twilio|vonage|ssl_bd|custom
Enable AMI in MikoPBX
Admin Panel → System → Asterisk Managers → Add
Username : laravelapp
Secret : StrongSecret123
Allowed IP : YOUR-LARAVEL-VPS-IP
Permissions : all
Usage
Facade Import
use BitDreamIT\MikoPBX\Facades\MikoPBX;
Call Control
// Click-to-call: agent 101 calls customer
MikoPBX::call()->originate('101', '01711XXXXXX');
// Blind transfer
MikoPBX::ami()->blindTransfer('PJSIP/101-00000001', '102');
// Attended transfer (merge two calls)
MikoPBX::ami()->attendedTransfer('PJSIP/101-00000001', 'PJSIP/102-00000002');
// Mute / unmute
MikoPBX::ami()->mute('PJSIP/101-00000001', 'in');
MikoPBX::ami()->unmute('PJSIP/101-00000001', 'in');
// Hold / unhold via ARI
MikoPBX::ari()->holdChannel($channelId);
MikoPBX::ari()->unholdChannel($channelId);
// Park a call
MikoPBX::ami()->parkCall('PJSIP/101-00000001', 'PJSIP/101-00000001');
MikoPBX::ami()->getParkedCalls();
// Hangup
MikoPBX::ami()->hangup('PJSIP/101-00000001');
// Active calls
MikoPBX::call()->getActiveCalls();
// Send DTMF
MikoPBX::ami()->sendDTMF('PJSIP/101-00000001', '1');
Queue Management
MikoPBX::ami()->queueAdd('support', 'PJSIP/101', 'Rahim');
MikoPBX::ami()->queueRemove('support', 'PJSIP/101');
MikoPBX::ami()->queuePause('support', 'PJSIP/101', 'Lunch break');
MikoPBX::ami()->queueUnpause('support', 'PJSIP/101');
MikoPBX::ami()->queueStatus('support');
MikoPBX::ami()->queueSummary();
Auto Dialer Campaigns
// Simple voice broadcast
$campaign = MikoPBX::campaign()->broadcast(
name: 'June Promo',
numbers: ['01711XXXXXX', '01811XXXXXX'],
audioFile: storage_path('app/promo.wav'),
maxChannels: 5
);
MikoPBX::campaign()->start($campaign);
MikoPBX::campaign()->status($campaign);
MikoPBX::campaign()->stop($campaign);
// IVR Campaign (Press 1 = agent, Press 2 = unsubscribe)
$campaign = MikoPBX::campaign()->withIVR(
name: 'Survey Campaign',
numbers: $numbers,
audioFile: storage_path('app/survey.wav'),
keypressActions: [
'1' => ['action' => 'transfer', 'value' => '101'],
'2' => ['action' => 'hangup', 'value' => ''],
]
);
IVR Builder
$ivr = MikoPBX::ivr('Main Menu')
->greeting('welcome.wav')
->timeout(10)
->pressToTransfer(1, '101')
->pressToTransfer(2, '102')
->pressToQueue(3, '200')
->pressToVoicemail(9)
->pressToHangup(0)
->onTimeout('repeat')
->build();
// Preset templates
$ivr = IVRBuilder::salesSupportTemplate('101', '102', '104');
$ivr = IVRBuilder::surveyTemplate('103');
Conference Calls
$bridge = MikoPBX::conference()->create('Team Meeting');
MikoPBX::conference()->addParticipant($bridge['id'], $channelId);
MikoPBX::conference()->dialIn($bridge['id'], 'PJSIP/01711XXXXXX');
MikoPBX::conference()->muteParticipant($channelId);
MikoPBX::conference()->startRecording($bridge['id']);
MikoPBX::conference()->end($bridge['id']);
Recording
MikoPBX::recording()->getAll('2026-06-01', '2026-06-30');
MikoPBX::recording()->getToday('101');
MikoPBX::recording()->getStats('2026-06-01', '2026-06-30');
MikoPBX::recording()->startLiveRecording($channelId, 'call-name');
MikoPBX::recording()->stopLiveRecording('call-name');
Analytics
MikoPBX::analytics()->dashboard('2026-06-01', '2026-06-30');
MikoPBX::analytics()->peakHours('2026-06-01', '2026-06-30');
MikoPBX::analytics()->dailyTrend('2026-06-01', '2026-06-30');
MikoPBX::analytics()->agentPerformance('2026-06-01', '2026-06-30');
MikoPBX::analytics()->slaCompliance('2026-06-01', '2026-06-30', 20); // 20s SLA
MikoPBX::analytics()->abandonedCalls('2026-06-01', '2026-06-30');
MikoPBX::analytics()->topCallers('2026-06-01', '2026-06-30', 10);
MikoPBX::analytics()->weeklyComparison();
$csv = MikoPBX::analytics()->exportCsv('2026-06-01', '2026-06-30');
Blacklist
MikoPBX::blacklist()->block('01711XXXXXX', 'Spam caller');
MikoPBX::blacklist()->block('01811XXXXXX', 'Fraud', '2026-12-31'); // expires
MikoPBX::blacklist()->isBlocked('01711XXXXXX'); // true
MikoPBX::blacklist()->unblock('01711XXXXXX');
MikoPBX::blacklist()->getAll();
MikoPBX::blacklist()->cleanExpired();
Callbacks
// Schedule auto-callback for missed caller
MikoPBX::callback()->schedule('01711XXXXXX', '101', 5); // 5 min delay
// Get pending
MikoPBX::callback()->getPending();
// Cancel
MikoPBX::callback()->cancel($id);
SMS Notifications
use BitDreamIT\MikoPBX\Services\SmsNotificationService;
$sms = app(SmsNotificationService::class);
$sms->missedCallAlert('+8801711XXXXXX', '01811XXXXXX', '101');
$sms->voicemailAlert('+8801711XXXXXX', '01811XXXXXX');
$sms->campaignCompleted('+8801711XXXXXX', 'June Promo', 450, 500);
$sms->callbackReminder('+8801711XXXXXX', '01811XXXXXX');
Laravel Notifications
use BitDreamIT\MikoPBX\Notifications\MissedCallNotification;
use BitDreamIT\MikoPBX\Notifications\VoicemailNotification;
use BitDreamIT\MikoPBX\Notifications\CampaignCompletedNotification;
$agent->notify(new MissedCallNotification('01711XXXXXX', '101'));
$agent->notify(new VoicemailNotification('01711XXXXXX', '101', 45, 'rec.wav'));
$manager->notify(new CampaignCompletedNotification('June Promo', 500, 450, 50));
HasCallLogs Trait (CRM integration)
// In your Customer / Lead / Contact model:
use BitDreamIT\MikoPBX\Traits\HasCallLogs;
class Customer extends Model {
use HasCallLogs;
protected string $phoneColumn = 'mobile'; // column name
}
// Usage:
$customer->callLogs()->get();
$customer->missedCalls()->count();
$customer->lastCall();
$customer->totalCallDuration();
$customer->callNow('101'); // agent 101 calls this customer
$customer->hasMissedCalls();
Voicemail
MikoPBX::ami()->getVoicemailCount('101@default');
MikoPBX::ami()->mailboxStatus('101@default');
MikoPBX::ami()->listVoicemailUsers();
AstDB
MikoPBX::ami()->dbPut('CRM', 'customer_01711', 'VIP');
MikoPBX::ami()->dbGet('CRM', 'customer_01711');
MikoPBX::ami()->dbDelete('CRM', 'customer_01711');
Call Monitoring (Supervisor Spy)
MikoPBX::ami()->monitorStart('PJSIP/101-00000001', '/tmp/supervisor_rec');
MikoPBX::ami()->monitorPause('PJSIP/101-00000001');
MikoPBX::ami()->monitorResume('PJSIP/101-00000001');
MikoPBX::ami()->monitorStop('PJSIP/101-00000001');
Health Check
MikoPBX::health()->check(); // full check
MikoPBX::health()->ping(); // quick bool
MikoPBX::health()->systemInfo();
System Commands
MikoPBX::ami()->reloadDialplan();
MikoPBX::ami()->moduleReload('chan_pjsip.so');
MikoPBX::ami()->command('core show channels');
MikoPBX::ami()->getUptime();
MikoPBX::ami()->ping();
MikoPBX::call()->getVersion();
Artisan Commands
php artisan mikopbx:install # Install package
php artisan mikopbx:listen # Start AMI event listener
php artisan mikopbx:listen --verbose # With raw event output
php artisan mikopbx:health # Health check
php artisan mikopbx:sync-extensions # Sync extension statuses
php artisan mikopbx:cdr-sync # Sync CDR for today
php artisan mikopbx:cdr-sync --from=2026-06-01 --to=2026-06-30
php artisan mikopbx:campaign start 1 # Start campaign ID 1
php artisan mikopbx:campaign stop 1 # Stop campaign
php artisan mikopbx:campaign status 1 # Show status
REST API Endpoints (40+)
| Method | Endpoint | Description |
|---|---|---|
| GET | /mikopbx/calls/active | Live active calls |
| POST | /mikopbx/calls/originate | Make outbound call |
| POST | /mikopbx/calls/transfer | Transfer call (blind/attended) |
| POST | /mikopbx/calls/hangup | Hangup a channel |
| POST | /mikopbx/calls/mute | Mute channel |
| POST | /mikopbx/calls/park | Park a call |
| GET | /mikopbx/calls/parked | Get parked calls |
| GET | /mikopbx/calls/logs | Call log history (paginated, filterable) |
| GET | /mikopbx/calls/stats | Call statistics summary |
| GET | /mikopbx/campaigns | List campaigns |
| POST | /mikopbx/campaigns | Create campaign |
| POST | /mikopbx/campaigns/{id}/start | Start campaign |
| POST | /mikopbx/campaigns/{id}/stop | Stop campaign |
| GET | /mikopbx/campaigns/{id}/status | Campaign status |
| GET | /mikopbx/agents | All agents with status |
| GET | /mikopbx/agents/online | Online agents only |
| POST | /mikopbx/agents/{ext}/call | Agent calls a number |
| POST | /mikopbx/agents/{ext}/queue/pause | Pause agent in queue |
| GET | /mikopbx/recordings | List recordings |
| GET | /mikopbx/recordings/{file}/download | Download recording |
| POST | /mikopbx/conferences | Create conference |
| POST | /mikopbx/conferences/{id}/participants | Add participant |
| POST | /mikopbx/ivr/build | Build IVR menu |
| GET | /mikopbx/ivr/templates | Get preset IVR templates |
| GET | /mikopbx/analytics/dashboard | KPI dashboard |
| GET | /mikopbx/analytics/peak-hours | Peak call hours |
| GET | /mikopbx/analytics/agent-performance | Agent stats |
| GET | /mikopbx/analytics/sla | SLA compliance report |
| GET | /mikopbx/analytics/export | Download CDR as CSV |
| GET | /mikopbx/blacklist | Get blacklisted numbers |
| POST | /mikopbx/blacklist | Block a number |
| DELETE | /mikopbx/blacklist/{number} | Unblock a number |
| GET | /mikopbx/blacklist/check/{number} | Check if blocked |
| POST | /mikopbx/callbacks | Schedule callback |
| GET | /mikopbx/callbacks/pending | Pending callbacks |
| GET | /mikopbx/health | Full health check |
| GET | /mikopbx/health/ping | Quick ping |
| GET | /mikopbx/system/status | System info |
| POST | /mikopbx/system/reload | Reload dialplan |
| POST | /mikopbx/webhook | Receive MikoPBX events |
Real-time Events (AMI Listener)
Run via Supervisor (see docs/supervisor-mikopbx-ami.conf):
php artisan mikopbx:listen
Subscribe in EventServiceProvider:
use BitDreamIT\MikoPBX\Events\IncomingCallEvent;
use BitDreamIT\MikoPBX\Events\CallEndedEvent;
protected $listen = [
IncomingCallEvent::class => [
\App\Listeners\ShowCallPopupToAgent::class,
\App\Listeners\LookupCustomerInCRM::class,
],
CallEndedEvent::class => [
\App\Listeners\SaveCallToCRM::class,
\App\Listeners\SendSummaryEmail::class,
],
];
Testing
use BitDreamIT\MikoPBX\Testing\MikoPBXFake;
class CallTest extends TestCase
{
public function test_incoming_call_creates_log(): void
{
MikoPBXFake::fake();
MikoPBXFake::simulateIncomingCall('01711XXXXXX', '101');
MikoPBXFake::assertIncomingCallFired('01711XXXXXX', '101');
$this->assertDatabaseHas('mikopbx_call_logs', ['caller' => '01711XXXXXX', 'extension' => '101']);
}
public function test_missed_call_schedules_callback(): void
{
MikoPBXFake::fake();
Queue::fake();
MikoPBXFake::simulateMissedCall('01711XXXXXX', '101');
Queue::assertPushed(\BitDreamIT\MikoPBX\Jobs\ProcessCallbackJob::class);
}
}
Supervisor Setup (Production)
; /etc/supervisor/conf.d/mikopbx-ami.conf
[program:mikopbx-ami]
command=php /var/www/your-app/artisan mikopbx:listen
directory=/var/www/your-app
autostart=true
autorestart=true
user=www-data
stderr_logfile=/var/log/supervisor/mikopbx-ami.err.log
stdout_logfile=/var/log/supervisor/mikopbx-ami.out.log
supervisorctl reread
supervisorctl update
supervisorctl start mikopbx-ami
supervisorctl status mikopbx-ami
Author
BitDreamIT — https://bitdreamit.com Built in Bangladesh. Open source forever. MIT License.
License
MIT — Free to use, modify, and distribute.