with one click
blacklist
Add or remove phone numbers from the Voicenter organization blacklist
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Add or remove phone numbers from the Voicenter organization blacklist
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Designs the structural skeleton of a Voicenter Bot via interview. Use this skill when the user wants to create, design, scope, or modify a Voicenter voice/chat bot — phrases like "design a bot", "create an agent spec", "build a Voicenter bot", "patch this bot", "add an intent", "change the bot's persona", "modify the flow graph", or any reference to the Agent Spec Designer / Skill 1 in the Voicenter bot generation pipeline. Produces an Agent Spec markdown file (sections 1-4, 4.5, section 5 stubs, section 6 initial, section 7 init). Two named entry modes — greenfield (no spec attached) and patch (spec attached). Does NOT author per-intent language content (validationPrompt, post-execution intentInstructions) — that's Skill 2 (Intent Detail Author). Does NOT emit wire-format JSON — that's Skill 3 (JSON Assembler).
Assembles a fully-detailed Voicenter Agent Spec into Bot JSON wire format — the final mechanical step in the three-skill pipeline. Use this skill when an Agent Spec exists with all section 5 entries marked `[detailed]` and the user wants the deployable JSON. Trigger phrases include "run Skill 3", "assemble the JSON", "emit the bot JSON", "publish the bot", "build the wire-format", "Skill 3 (JSON Assembler)", or any direct continuation from Skill 2's completion handoff. Produces a single `bot-<name>-<date>.json` file plus a banner identifying every fail-loud sentinel and any drift between spec section 6 and what Skill 3 regenerated. Refuses to assemble if any intent is still `[structural]` or `[detailed-revisit]`, or if the spec deviates from the strict template (Doc 2 §3.7). Runs the §15.4 cross-reference pass — 23 checks (8 §15.4 + 3 Compass + 3 botIntents-role + 1 duplicate-global-intent + 8 field-placement doctrine), checks 1–7, 11–13, 15, and 16–21 blocking. Does NOT author any text content (Skills 1 and
Authors the per-intent language content of a Voicenter Agent Spec — slot descriptions, validationPrompt, post-execution intentInstructions, and RT-specific Configuration text. Use this skill when an Agent Spec exists with section 5 entries marked `[structural]` or `[detailed-revisit]`, and the user wants to fill them in. Trigger phrases include "run Skill 2", "detail the intents", "fill in the per-intent fields", "Skill 2 (Intent Detail Author)", or any direct continuation from Skill 1's handoff hint. Walks intents in user-confirmed batches with a checkpoint after each batch. Reactivable — invoke as many times as needed; spec state is the resume point. Does NOT modify the structural skeleton (sections 1, 2, 3, 4, 4.5.1/.2/.4) — that's Skill 1 (Agent Spec Designer). Does NOT emit wire-format JSON — that's Skill 3 (JSON Assembler).
Pull call detail records (CDR) from Voicenter using the Call Log API
Receive and handle CDR push notifications from Voicenter after every call ends
Initiate or terminate outgoing calls using the Voicenter Click2Call API
| name | blacklist |
| description | Add or remove phone numbers from the Voicenter organization blacklist |
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
AskUserQuestionoption 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.
Use this skill when the user wants to:
VOICENTER_API_CODE=your_api_token_here
| 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
Code field in the request body (your API token from Voicenter back office).
{
"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) |
https://api.voicenter.com/Blacklist/AddBlackList?code=XXXX&phones=972501234567&phones=97231234567
{
"ErrorCode": 0,
"ErrorMessage": "OK",
"Phones": [
{ "ErrorCode": 0, "ErrorMessage": "OK", "Phone": "972501234567" },
{ "ErrorCode": 0, "ErrorMessage": "OK", "Phone": "97231234567" }
]
}
{
"Code": "XXXXXXXXXXXXXXXXXXXX",
"Phones": [
{ "Phone": "972501234567" },
{ "Phone": "97231234567" }
]
}
https://api.voicenter.com/Blacklist/RemoveBulkFromBlacklist?code=XXXX&phones=972501234567&phones=97231234567
{
"ErrorCode": 0,
"ErrorMessage": "OK",
"Phones": [
{ "ErrorCode": 0, "ErrorMessage": "OK", "Phone": "972501234567" },
{ "ErrorCode": 0, "ErrorMessage": "OK", "Phone": "97231234567" }
]
}
| 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 |
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<BlacklistResponse> {
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<BlacklistResponse> {
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 < optOutList.length; i += CHUNK) {
const chunk = optOutList.slice(i, i + CHUNK).map(p => ({ 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);
}
}
+ — e.g. 972501234567 not +972501234567 or 0501234567.ErrorCode in the response — a top-level ErrorCode: 0 does not guarantee every number was added successfully.OPT_OUT or presses a specific DTMF