AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Blacklist

skill-voicenterteam-claude-marketplace-blacklist · by VoicenterTeam

Add or remove phone numbers from the Voicenter organization blacklist

No reviews yet
0 installs
15 views
0.0% view→install

Install

$ agentstack add skill-voicenterteam-claude-marketplace-blacklist

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

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.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-voicenterteam-claude-marketplace-blacklist)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
1mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

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 →
Are you the author of Blacklist? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

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 manage the Voicenter Blacklist — block numbers from being dialed by agents or dialers, and remove them when needed.

When to use this skill

Use this skill when the user wants to:

  • Block a customer who requested to not be called (opt-out / Do Not Call)
  • Sync a CRM opt-out list with the Voicenter dialer blacklist
  • Remove a number from the blacklist after a customer withdraws their opt-out
  • Prevent specific numbers from being dialed in a campaign
  • Automate blacklist updates triggered by CDR events (e.g. a customer pressed "opt out" DTMF)

Environment Variables

VOICENTER_API_CODE=your_api_token_here

Endpoints

| Action | URI | |---|---| | Add numbers | https://api.voicenter.com/Blacklist/AddBlackList | | Remove numbers | https://api.voicenter.com/Blacklist/RemoveBulkFromBlacklist |

Both accept: GET or POST-JSON Response: JSON

Authentication

Code field in the request body (your API token from Voicenter back office).


AddBlackList

POST-JSON Request

{
  "Code": "XXXXXXXXXXXXXXXXXXXX",
  "Phones": [
    { "Phone": "972501234567", "Name": "John Doe" },
    { "Phone": "97231234567",  "Name": "Walter Melon" }
  ]
}

| Field | Required | Description | |---|---|---| | Code | ✅ | API authentication token | | Phones | ✅ | Array of phone objects to block | | Phone | ✅ | Phone number in E.164 format without + (e.g. 972501234567) | | Name | ❌ | Label for this blocked number (POST-only) |

GET Request

https://api.voicenter.com/Blacklist/AddBlackList?code=XXXX&phones=972501234567&phones=97231234567

Response

{
  "ErrorCode": 0,
  "ErrorMessage": "OK",
  "Phones": [
    { "ErrorCode": 0, "ErrorMessage": "OK", "Phone": "972501234567" },
    { "ErrorCode": 0, "ErrorMessage": "OK", "Phone": "97231234567" }
  ]
}

RemoveBulkFromBlacklist

POST-JSON Request

{
  "Code": "XXXXXXXXXXXXXXXXXXXX",
  "Phones": [
    { "Phone": "972501234567" },
    { "Phone": "97231234567" }
  ]
}

GET Request

https://api.voicenter.com/Blacklist/RemoveBulkFromBlacklist?code=XXXX&phones=972501234567&phones=97231234567

Response

{
  "ErrorCode": 0,
  "ErrorMessage": "OK",
  "Phones": [
    { "ErrorCode": 0, "ErrorMessage": "OK", "Phone": "972501234567" },
    { "ErrorCode": 0, "ErrorMessage": "OK", "Phone": "97231234567" }
  ]
}

Error Codes

| ErrorCode (top-level) | Meaning | |---|---| | 0 | OK | | 1 | Invalid or missing Code | | 2 | Phone field missing or invalid |

| ErrorCode (per phone) | Meaning | |---|---| | 0 | OK | | 1 | Phone number format invalid — use E.164 without + (e.g. 972501234567) | | 2 | Internal error — contact Voicenter support |


TypeScript Implementation

const BL_BASE = 'https://api.voicenter.com/Blacklist';
const CODE = process.env.VOICENTER_API_CODE!;

interface BlacklistPhone {
  Phone: string;
  Name?: string;
}

interface BlacklistPhoneResult {
  ErrorCode: number;
  ErrorMessage: string;
  Phone: string;
}

interface BlacklistResponse {
  ErrorCode: number;
  ErrorMessage: string;
  Phones: BlacklistPhoneResult[];
}

async function addToBlacklist(phones: BlacklistPhone[]): Promise {
  const res = await fetch(`${BL_BASE}/AddBlackList`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ Code: CODE, Phones: phones }),
  });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const data: BlacklistResponse = await res.json();
  if (data.ErrorCode !== 0) throw new Error(`Blacklist error: ${data.ErrorMessage}`);
  return data;
}

async function removeFromBlacklist(phones: string[]): Promise {
  const res = await fetch(`${BL_BASE}/RemoveBulkFromBlacklist`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ Code: CODE, Phones: phones.map(p => ({ Phone: p })) }),
  });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  return res.json();
}

// Add a single opt-out
await addToBlacklist([{ Phone: '972501234567', Name: 'Opted out via website' }]);

// Remove after customer withdraws opt-out
await removeFromBlacklist(['972501234567']);

// Sync a large CRM opt-out list in chunks
async function syncOptOuts(optOutList: string[]) {
  const CHUNK = 100;
  for (let i = 0; i  ({ Phone: p }));
    const result = await addToBlacklist(chunk);
    const failed = result.Phones.filter(p => p.ErrorCode !== 0);
    if (failed.length) console.warn('Failed to blacklist:', failed);
  }
}

Tips

  • Phone numbers must be in E.164 format without + — e.g. 972501234567 not +972501234567 or 0501234567.
  • Always check per-phone ErrorCode in the response — a top-level ErrorCode: 0 does not guarantee every number was added successfully.
  • The blacklist blocks outbound dialing. Inbound call blocking from blacklisted numbers is configured separately in CPanel IVR settings.
  • Use chunking (100 numbers per request) for large bulk operations to avoid timeouts.

Related Skills

  • CDR Notification — Trigger blacklist add when a caller's status is OPT_OUT or presses a specific DTMF
  • Productive Dialer — Blacklisted numbers are automatically skipped in dialer campaigns
  • Call Log — Audit which blacklisted numbers were attempted before the block took effect

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.