ワンクリックで
popup-screen
Implement a Pop-Up Screen endpoint that Voicenter calls during incoming calls to display caller CRM data to agents
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Implement a Pop-Up Screen endpoint that Voicenter calls during incoming calls to display caller CRM data to agents
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 | popup-screen |
| description | Implement a Pop-Up Screen endpoint that Voicenter calls during incoming calls to display caller CRM data to agents |
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.
CRM integration context. When the user is building a full CRM integration — not just this API in isolation — always invoke the
crm-onboardingskill alongside this one and frame the answer covering all three core services: Click2Call, Screen Pop, and Call History.
Help the developer build the Pop-Up Screen endpoint — a server-side URL that Voicenter calls when an incoming call rings, answers, or hangs up, so the agent's CRM opens automatically with the caller's details.
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 → Extension settings or DID settings → "Pop-Up Screen URL"
# The Voicenter Chrome Extension must be installed on the agent's browser for the popup to appear.
Voicenter POSTs JSON to your endpoint at three call phases.
{
"phone": "972722776772",
"callerName": "Queue Testing",
"ivrid": "20220916103546022555eb61e755c08a",
"extenUser": "KGpK4iWq",
"did": "0776707528",
"status": "Ringing",
"direction": "Incoming",
"recordFile": "20220916103546022555eb61e755c08a-agent-972722776772-0776707528.mp3",
"isMuted": false,
"callStarted": 1663324548,
"isAnswered": false,
"callAnswered": 0,
"currentCall": {
"callStarted": 1663324548,
"callAnswered": 0,
"answered": 0,
"callername": "Queue Testing",
"callerphone": "972722776772",
"callstatus": "Ringing",
"direction": "Incoming",
"ivrid": "20220916103546022555eb61e755c08a",
"did": "0776707528",
"originalCallerID": "0722776772",
"isInternal": false
}
}
Same payload with "status": "Talking", "isAnswered": true, and "callAnswered" set to the answer epoch timestamp.
Same payload with "status": "Hangup" and "cause": "Normal hangup" added.
| Field | Description |
|---|---|
phone | Caller's phone number (with country prefix, e.g. 972XXXXXXXXX) |
extenUser | SIP code of the agent's extension receiving the call |
did | The DID (virtual number) the caller dialed |
ivrid | Unique call ID — correlates with CDR Notification and Call Log |
status | Ringing, Talking, or Hangup |
direction | Incoming or Outgoing |
isMuted | Whether recording is currently muted |
isAnswered | true once the agent picks up |
| Field | Required | Description |
|---|---|---|
STATUS | ✅ | Must be "OK" (uppercase string). Any other value = error. |
URL | ❌ | CRM page URL to open when the agent clicks the popup notification |
CLIENTNAME | ❌ | Caller's name from your CRM |
TOTAL | ❌ | Number of CRM matches found (use 0 for unknown callers) |
COMPANY | ❌ | Caller's company name from your CRM |
{
"STATUS": "OK",
"URL": "https://yourcrm.com/contacts/12345",
"CLIENTNAME": "John Doe",
"TOTAL": 1,
"COMPANY": "Acme Corp"
}
{
"STATUS": "OK",
"URL": "https://yourcrm.com/contacts/new?phone=0722776772",
"CLIENTNAME": "",
"TOTAL": 0
}
import express, { Request, Response } from 'express';
const app = express();
app.use(express.json());
// Allow the Voicenter Chrome Extension to call your endpoint
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', 'chrome-extension://ifiaikfdhcagbagdeflffjdammidpbio');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
next();
});
interface PopupRequest {
phone: string;
extenUser: string;
did: string;
ivrid: string;
status: 'Ringing' | 'Talking' | 'Hangup';
direction: string;
isAnswered: boolean;
isMuted: boolean;
}
app.post('/webhooks/voicenter/popup', async (req: Request, res: Response) => {
const payload = req.body as PopupRequest;
// Normalize phone: Voicenter sends 972XXXXXXXXX, CRM may store as 0XXXXXXXXX
const normalizedPhone = payload.phone.replace(/^972/, '0');
if (payload.status === 'Ringing') {
const contact = await crm.findByPhone(normalizedPhone);
if (contact) {
return res.json({
STATUS: 'OK',
URL: `https://yourcrm.com/contacts/${contact.id}`,
CLIENTNAME: contact.name,
COMPANY: contact.company,
TOTAL: 1,
});
}
// Unknown caller — open new contact form
return res.json({
STATUS: 'OK',
URL: `https://yourcrm.com/contacts/new?phone=${normalizedPhone}&ivrid=${payload.ivrid}`,
TOTAL: 0,
});
}
// Talking / Hangup — acknowledge without action (or handle as needed)
return res.json({ STATUS: 'OK' });
});
app.listen(3000);
location /webhooks/voicenter/popup {
add_header 'Access-Control-Allow-Origin' 'chrome-extension://ifiaikfdhcagbagdeflffjdammidpbio';
add_header 'Access-Control-Allow-Headers' 'Content-Type';
}
Voicenter can also call your endpoint as a GET request:
https://yourcrm.com/popup?phone=0722776772&ivrid=20241001abc&extenUser=SIPSIP&did=0776707528&statusCall=Ringing
phone field — Voicenter sends with country prefix (972XXXXXXXXX); your CRM likely stores 0XXXXXXXXX.Ringing to open the CRM, Talking to update it (call answered), Hangup to close/log it.ivrid to link this event to the CDR you receive later from CDR Notification.ivrid after the call endsCUSTOM_DATA passed in External Layer appears in the popup payload as customdataisMuted in the popup payload reflects current recording state