The LLM only supplies what the caller actually said out loud — here, their name and email. The verified caller number is injected server-side and never exposed to the model:
{
"type": "function",
"function": {
"name": "lookup_and_verify_user",
"parameters": {
"type": "object",
"properties": {
"name": { "type": "string" },
"email": { "type": "string" }
},
"required": ["name", "email"]
}
},
"server": {
"url": "https://your-backend.example.com/lookup-and-verify"
},
"parameters": [
{ "key": "caller_number", "value": "{{ customer.number }}" },
{ "key": "called_number", "value": "{{ phoneNumber.number }}" },
{ "key": "call_id", "value": "{{ call.id }}" }
]
}
Your server receives caller_number from call signaling, not from the LLM, so you can authenticate against it directly rather than trusting whatever the model reports.