원클릭으로
external-layer
Build an External Layer IVR endpoint that lets Voicenter route inbound calls based on your CRM business logic
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Build an External Layer IVR endpoint that lets Voicenter route inbound calls based on your CRM business logic
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
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 | external-layer |
| description | Build an External Layer IVR endpoint that lets Voicenter route inbound calls based on your CRM business logic |
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 implement an External Layer endpoint — a URL that Voicenter's IVR calls mid-flow, so the developer's server can decide where to route each incoming call dynamically based on CRM data.
Use this skill when the user wants to:
# No outbound API token needed — Voicenter sends requests TO your server.
# Configure your endpoint URL in: Voicenter CPanel → Incoming → IVR → select layer → Layer Settings → "Allow mini external IVR"
Critical: Respond within 5 seconds or Voicenter times out and uses the configured fallback layer.
{
"METHOD": "IVR_LAYER_INPUT",
"DATA": {
"DID": "0722776772",
"CALLER_ID": "0501234567",
"IVR_UNIQUE_ID": "1bcd7954224861f85a2d70612f2",
"DTMF": "1234",
"LAYER_ID": "5",
"PREVIOUS_LAYER_ID": "5"
}
}
| Field | Description |
|---|---|
DID | The virtual number (DID) the caller dialed |
CALLER_ID | Caller's phone number — use this to look them up in your CRM |
IVR_UNIQUE_ID | Unique call ID — correlates with CDR Notification and Pop-Up Screen |
DTMF | Digits the caller pressed. Default "0" if no input collected. |
LAYER_ID | Current IVR layer ID |
PREVIOUS_LAYER_ID | Previous IVR layer ID |
{
"STATUS": 0,
"ACTION": "GO_TO_LAYER",
"LAYER": 12
}
With CRM context (appears in Pop-Up Screen and CDR Notification):
{
"STATUS": 0,
"ACTION": "GO_TO_LAYER",
"LAYER": 22,
"CALLER_NAME": "John Doe",
"CUSTOM_DATA": {
"CRM_client_ID": "12345",
"Last_ticket_ID": "222",
"Last_representative": "Jane Smith"
}
}
{
"STATUS": 0,
"ACTION": "SAY_DIGITS",
"NEXT_LAYER": 2,
"LANGUAGE": "EN",
"DATA": [
{ "RecordType": "Recording", "Content": "greeting_audio_file.mp3" },
{ "RecordType": "Digits", "Content": "0501234567" },
{ "RecordType": "Number", "Content": "42" },
{ "RecordType": "Date", "Content": "2024-06-01" },
{ "RecordType": "DateTime", "Content": "2024-06-01T10:00:00" }
]
}
LANGUAGE options: HE, EN, AR, RU (more available on request).
RecordType options: Recording (play audio file), Digits (digit-by-digit), Number, Date, DateTime.
{
"STATUS": 0,
"ACTION": "DIAL",
"CALLER_ID": "0722776772",
"CALLER_NAME": "Voicenter",
"MAX_CALL_DURATION": 1800,
"MAX_DIAL_DURATION": 60,
"NEXT_VO_ID": 15,
"RECORDING": "yes",
"TARGETS": [
{ "TYPE": "PHONE", "TARGET": "0501234567" }
],
"CUSTOM_DATA": {
"CRM_client_ID": "12345"
}
}
TARGET TYPE: PHONE or EXTENSION (Voicenter SIP code). International numbers require country prefix.
{ "STATUS": 1 }
import express, { Request, Response } from 'express';
const app = express();
app.use(express.json());
// Map your Voicenter IVR layer IDs here
const LAYERS = {
SALES: 10,
SUPPORT: 11,
VIP: 12,
GENERIC: 1,
};
interface ExternalLayerRequest {
METHOD: string;
DATA: {
DID: string;
CALLER_ID: string;
IVR_UNIQUE_ID: string;
DTMF: string;
LAYER_ID: string;
PREVIOUS_LAYER_ID: string;
};
}
app.post('/webhooks/voicenter/external-layer', async (req: Request, res: Response) => {
const { DATA } = req.body as ExternalLayerRequest;
try {
const contact = await crm.findByPhone(DATA.CALLER_ID);
if (!contact) {
// Unknown caller → generic queue
return res.json({ STATUS: 0, ACTION: 'GO_TO_LAYER', LAYER: LAYERS.GENERIC });
}
// VIP → skip queue, route directly to account manager
if (contact.tier === 'VIP') {
return res.json({
STATUS: 0,
ACTION: 'GO_TO_LAYER',
LAYER: LAYERS.VIP,
CALLER_NAME: contact.name,
CUSTOM_DATA: {
CRM_client_ID: contact.id,
Account_manager: contact.accountManager,
},
});
}
// Has open ticket with assigned agent → dial directly
if (contact.openTicket?.assignedExtension) {
return res.json({
STATUS: 0,
ACTION: 'DIAL',
CALLER_ID: DATA.DID,
CALLER_NAME: contact.name,
MAX_CALL_DURATION: 1800,
MAX_DIAL_DURATION: 45,
NEXT_VO_ID: LAYERS.SUPPORT,
RECORDING: 'yes',
TARGETS: [{ TYPE: 'EXTENSION', TARGET: contact.openTicket.assignedExtension }],
CUSTOM_DATA: { CRM_client_ID: contact.id, Ticket_ID: contact.openTicket.id },
});
}
// Known contact → support queue with CRM context
return res.json({
STATUS: 0,
ACTION: 'GO_TO_LAYER',
LAYER: LAYERS.SUPPORT,
CALLER_NAME: contact.name,
CUSTOM_DATA: { CRM_client_ID: contact.id },
});
} catch (err) {
console.error('External layer error:', err);
return res.json({ STATUS: 1 }); // Voicenter uses configured fallback layer
}
});
app.listen(3000);
| Setting | Description |
|---|---|
| MiniExternalDTMFLen | Max DTMF digits to collect before calling your endpoint (e.g. 8 for an 8-digit account ID). Set to 0 if no DTMF needed. |
| Delay | Seconds to wait for DTMF input after the prompt plays (1–9). |
| MiniExternalDefaultMethodData | Fallback layer ID — always set this. It is used when your endpoint is unreachable or returns STATUS: 1. |
CALLER_ID — Israeli numbers may arrive without country prefix. Add 972 prefix if missing and strip the leading 0.CUSTOM_DATA to carry CRM context (customer ID, tier, open ticket ID) through the entire call — it appears in CDR Notification and Pop-Up Screen payloads.DATA.DTMF and map it to the appropriate layer.CUSTOM_DATA you pass here to display caller info to the agentCUSTOM_DATA also appears in the CDR after the call ends