Your language
PHP, Python, Node.js, C#, Java, Go… anything that accepts and returns JSON.
Java, Python, PHP, .NET, C# — you write an HTTP API, then set its URL in DotSIP. No dialplan.
The engine has no routing language. It calls your endpoint and performs answer, transfer, or hangup. Tools during a call are again your HTTP services.
PHP, Python, Node.js, C#, Java, Go… anything that accepts and returns JSON.
git, code review, tests. Routing is ordinary code.
You decide from the client's CRM, database, or calendar in real time.
DotSIP sends a dotsip.route JSON to your API.
It returns a dotsip.route-result with an action and parameters.
It answers with the agent, transfers to an extension, or hangs up.
<?php // PHP
$call = json_decode(file_get_contents('php://input'), true);
$vip = $call['caller']['number'] === '+421905000000';
echo json_encode($vip
? ['format' => 'dotsip.route-result', 'format_version' => 1, 'action' => 'transfer', 'phone' => 'phone-1']
: ['format' => 'dotsip.route-result', 'format_version' => 1, 'action' => 'answer', 'agent' => 'recepcia',
'prompt' => 'Volajúci je nový zákazník. Ponúkni mu termín konzultácie.']);# Python (Flask)
@app.post("/route")
def route():
call = request.get_json()
if call["caller"]["number"] == "+421905000000":
return {"format": "dotsip.route-result", "format_version": 1, "action": "transfer", "phone": "phone-1"}
return {"format": "dotsip.route-result", "format_version": 1, "action": "answer", "agent": "recepcia",
"prompt": "Volajúci je nový zákazník. Ponúkni mu termín konzultácie."}// Node.js (Express)
app.post("/route", (req, res) => {
const vip = req.body.caller.number === "+421905000000";
res.json(vip
? { format: "dotsip.route-result", format_version: 1, action: "transfer", phone: "phone-1" }
: { format: "dotsip.route-result", format_version: 1, action: "answer", agent: "recepcia",
prompt: "Volajúci je nový zákazník. Ponúkni mu termín konzultácie." });
});// C# (.NET minimal API)
app.MapPost("/route", (Call call) => call.Caller.Number == "+421905000000"
? Results.Json(new { format = "dotsip.route-result", format_version = 1, action = "transfer", phone = "phone-1" })
: Results.Json(new { format = "dotsip.route-result", format_version = 1, action = "answer", agent = "recepcia",
prompt = "Volajúci je nový zákazník. Ponúkni mu termín konzultácie." }));The exact contract is in the documentation (route-decision).
The request includes direction, call_id, the SIP account, and the caller. Reply with action answer (agent required), transfer (phone required), or hangup. Optionally rights, prompt, and user. The full contract is in the documentation.
When the live model calls a tool, DotSIP POSTs dotsip.tool-call to your endpoint. Reply with ok true or false, result or error, and optionally new rights or a prompt. The model only sees tools attached to the agent and allowed by the current rights.
DotSIP does not supply your client's business logic. It supplies the engine and the bridge.
No credit card. Full license. Once per account and once per installation.