Install
$ agentstack add skill-voicenterteam-claude-marketplace-productive-dialer Open-source listing, not yet scanned by AgentStack. Follow the source repository for install instructions.
Security review
⚠ Flagged1 finding(s); flagged for manual review. · v0.1.0 How review works →
- • Prompt-injection patterns
- • Secret / credential exfiltration
- • Dangerous shell & filesystem operations
- • Untrusted network calls
- • Known-malicious package signatures
- high Reads credentials/environment and may exfiltrate them.
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
> Language. Reply in the user's language: detect what they write — Hebrew→Hebrew, English→English — and mirror it, switching if they switch mid-conversation. This shapes your prose, your questions, and your AskUserQuestion option labels only. It does not change the artifacts you produce — identifiers, JSON keys, BCP-47 language codes, API field names, and other data stay exactly as specified.
Help the developer integrate the Voicenter Productive Dialer API — manage campaigns, upload call destinations, control campaign state, and manage agent assignments from their CRM.
When to use this skill
Use this skill when the user wants to:
- Add leads or contacts to a dialer campaign from their CRM
- Upload a bulk list of numbers to dial (up to 100,000 at once)
- Start or stop a dialer campaign programmatically
- Schedule callbacks for specific times ("call this customer at 3 PM")
- Add or remove agents from a campaign
- Check how many calls are still pending in a campaign
- Clear all pending calls from a campaign
- Pass CRM lead data (lead ID, campaign source) into the call for reporting
Environment Variables
VOICENTER_API_CODE=your_api_token_here
Base URL
https://api.voicenter.com/ForwardDialer/Dialer/
All methods use POST-JSON. Authentication via Code field.
Workflow
- Call GetCampaignList to get campaign codes.
- Use the campaign
Code(not the name) in all subsequent calls. - Upload destinations with AddCall or AddCallsBulk.
- Control execution with StartCampaign / StopCampaign.
GetCampaignList — Get all campaigns
// Request
{ "Code": "MY_API_CODE" }
// Response
{
"ErrorCode": 0,
"Description": "OK",
"Data": [
{
"Name": "Campaign1",
"StatusName": "Enabled",
"TotalPendingCalls": 23,
"TotalAwaitingCalls": 23,
"MaxPriority": 1,
"MinPriority": 1,
"Code": "CAMPAIGN_CODE_HERE"
}
]
}
StatusName: "Enabled" = active, "Disabled" = stopped.
- For IVR/Predictive Dialer campaigns: use
TotalAwaitingCallsfor queue depth. - For Agent Dialer campaigns: use
TotalPendingCalls.
AddCall — Add a single destination
URI: https://api.voicenter.com/ForwardDialer/Dialer/AddCall
{
"Campaign": "CAMPAIGN_CODE",
"Target": "972501234567",
"CustomerName": "John Doe",
"CallerID": "0722776772",
"Priority": 42,
"OriginateTime": 1702750000,
"IsDateLocal": "true",
"IgnoreDncStatus": "true",
"CustomData": {
"var_LeadID": 1234567,
"var_LeadSource": "Facebook"
}
}
| Field | Required | Description | |---|---|---| | Campaign | ✅ | Campaign code from GetCampaignList | | Target | ✅ | Phone number (E.164 format; international prefix required for non-Israeli numbers) | | Code | ✅ | API authentication token | | CustomerName | ❌ | Customer name shown to agent | | CallerID | ❌ | Outbound caller ID shown to customer — must be a number in your account | | Priority | ❌ | Higher value = dialed first | | OriginateTime | ❌ | Schedule for future dial (Epoch time). Must include IsDateLocal. | | IsDateLocal | ❌ | "true" = use account's local timezone. "false" = GMT+0. Recommended: "true". | | IgnoreDncStatus | ❌ | "true" = bypass Do-Not-Call service | | CustomData | ❌ | Key-value pairs passed to Pop-Up Screen and CDR records |
AddCallsBulk — Upload up to 100,000 destinations
URI: https://api.voicenter.com/ForwardDialer/Dialer/AddCallsBulk
Send an array of destination objects (same fields as AddCall):
[
{
"Campaign": "CAMPAIGN_CODE",
"Code": "MY_API_CODE",
"Target": "972501234567",
"CustomerName": "John Doe",
"Priority": 1,
"CustomData": { "var_LeadID": 111 }
},
{
"Campaign": "CAMPAIGN_CODE",
"Code": "MY_API_CODE",
"Target": "972501234568",
"CustomerName": "Jane Doe"
}
]
Limits:
- Up to 100,000 destinations per request
- Detailed per-destination results returned only for ≤ 3,000 destinations
- Add
"async": trueto force detailed response (max 3,000)
// Response
{
"ErrorCode": 0,
"Description": "OK",
"AddResult": [
{ "Target": "972501234567", "ErrorCode": 0, "Description": "OK" },
{ "Target": "972501234568", "ErrorCode": 0, "Description": "OK" }
]
}
RemoveCall — Remove a specific destination
URI: https://api.voicenter.com/ForwardDialer/Dialer/RemoveCall
{ "Campaign": "CAMPAIGN_CODE", "Code": "MY_API_CODE", "Target": "972501234567" }
ClearCampaignCalls — Remove ALL pending destinations
URI: https://api.voicenter.com/ForwardDialer/Dialer/ClearCampaignCalls
{ "Campaign": "CAMPAIGN_CODE", "Code": "MY_API_CODE" }
StartCampaign / StopCampaign
// Start
// URI: https://api.voicenter.com/ForwardDialer/Dialer/StartCampaign
{ "Campaign": "CAMPAIGN_CODE", "Code": "MY_API_CODE" }
// Stop
// URI: https://api.voicenter.com/ForwardDialer/Dialer/StopCampaign
{ "Campaign": "CAMPAIGN_CODE", "Code": "MY_API_CODE" }
Agent Management
GetMembersList
// Request: { "Campaign": "CAMPAIGN_CODE", "Code": "MY_API_CODE" }
// Response: { "Data": [{ "Member": "SIPSIP1", "DisplayName": "John Doe" }], "ErrorCode": 0 }
AddMember
// URI: /AddMember
{ "Campaign": "CAMPAIGN_CODE", "Code": "MY_API_CODE", "Member": "SIPSIP1" }
// Response: { "Data": { "TotalAdded": 1 }, "ErrorCode": 0 }
RemoveMember
// URI: /RemoveMember
{ "Campaign": "CAMPAIGN_CODE", "Code": "MY_API_CODE", "Member": "SIPSIP1" }
// Response: { "Data": { "TotalRemoved": 1 }, "ErrorCode": 0 }
GetCampaignPendingCalls — List waiting destinations
URI: https://api.voicenter.com/ForwardDialer/Dialer/GetCampaignPendingCalls
// Response
{
"ErrorCode": 0,
"Data": {
"Campaign": { "Name": "Campaign1", "StatusName": "Enabled", "TotalPendingCalls": 4, "Code": "..." },
"Calls": [
{
"Phone": "972501234567",
"CustomerName": "John Doe",
"Priority": 42,
"OriginateTime": 1602819000,
"CallStatus": { "Status": 1, "Description": "Pending" },
"CustomData": { "var_LeadID": "1234567" }
}
]
}
}
TypeScript Implementation
const DIALER_BASE = 'https://api.voicenter.com/ForwardDialer/Dialer';
const CODE = process.env.VOICENTER_API_CODE!;
async function dialerRequest(method: string, body: object): Promise {
const res = await fetch(`${DIALER_BASE}/${method}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ Code: CODE, ...body }),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
if (data.ErrorCode !== 0) throw new Error(`Dialer ${method} error: ${data.Description}`);
return data;
}
// Full campaign workflow: get campaigns → upload leads → start
const { Data: campaigns } = await dialerRequest('GetCampaignList', {});
const campaignCode = campaigns[0].Code;
const leads = [
{ Campaign: campaignCode, Target: '972501234567', CustomerName: 'John', Priority: 1, CustomData: { var_LeadID: '101' } },
{ Campaign: campaignCode, Target: '972501234568', CustomerName: 'Jane', Priority: 2, CustomData: { var_LeadID: '102' } },
];
await dialerRequest('AddCallsBulk', leads);
await dialerRequest('StartCampaign', { Campaign: campaignCode });
// Later — stop and clear
await dialerRequest('StopCampaign', { Campaign: campaignCode });
await dialerRequest('ClearCampaignCalls', { Campaign: campaignCode });
Error Codes
| ErrorCode | Description | |---|---| | 0 | OK | | 1 | Invalid campaign code | | 2 | Missing required field | | -2 | Phone number format invalid |
Tips
- Always call
GetCampaignListfirst — theCodein the response is the campaign identifier, not the name. OriginateTime+IsDateLocal: "true"lets you schedule future callbacks — great for "call me back at 3 PM" CRM features.CustomDatavalues flow through to the Pop-Up Screen and CDR Notification — use them to carry CRM lead IDs and source attribution.- CDR records for dialer calls have
type: "ProductiveCall Leg1/Leg2"— filter withcdrTypes: [14, 15]in the Call Log API.
Related Skills
- Extension List — Get valid SIP codes to use as
Memberwhen adding agents to a campaign - Call Log — Retrieve dialer call results using
cdrTypes: [14, 15] - CDR Notification — Receive dialer call CDRs in real time via webhook
- Blacklist — Blacklisted numbers are automatically skipped by the dialer
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: VoicenterTeam
- Source: VoicenterTeam/claude-marketplace
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.