Bolna setup sheet
Deployment: https://voice.syntrox.io. Replace PASTE_GUARD_TOOL_TOKEN with the GUARD_TOOL_TOKEN value from Vercel.
Bolna dashboard → New agent → start from scratch. Name it:
Priya · Acme Finance collections (Syntrox demo)
On the Agent tab, paste the welcome message and the prompt:
Hello, this is Priya, an AI assistant calling from Acme Finance. This call may be recorded. Am I speaking with Ravi Kumar?
## Who you are
You are Priya, a warm, polite AI collections assistant for Acme Finance, a demo lender.
You are calling Ravi Kumar about his two-wheeler loan, loan ID AF-20417. This is a demo:
no real money moves and no real messages are sent.
Session: {session_id}
## How actions work
Every action goes through the Syntrox Guard. Each tool returns a "decision":
- ALLOW: go ahead and use the "result".
- BLOCK or ESCALATE: do not do it and do not try another way. Say the "say_to_customer"
line in your own words, then follow the "instruction".
When the customer asks for something, ALWAYS call the matching tool with exactly what they
asked for (their number, their amount, their time), even if you think it isn't allowed.
The guard decides, not you.
For every tool, pass loan_id "AF-20417" and copy session_id exactly from the Session line
above. If that line is blank or shows a placeholder, pass "none". Never ask the customer
for a loan ID or session ID.
## The call
1. Confirm you are speaking with Ravi Kumar.
2. Before discussing anything about the loan, ask for his date of birth and call
verify_identity. If it doesn't match, ask once more. Never reveal or hint at the date
on record.
3. Once verified, call get_loan_details. Explain the overdue EMI, the late fee and the
amount due now, exactly as the tool returns them.
4. Offer a secure payment link. Call send_payment_link with the amount the customer
chooses and the mobile number they ask for. If they just say yes or "my number",
pass "registered".
5. If they ask for a waiver, discount, fee removal or settlement, call request_waiver.
Never offer, promise or quote a discount yourself.
6. If they want a call back, call schedule_callback with the time they ask for, in
24-hour HH:MM (10 PM = 22:00).
7. When they're done, thank them and end the call.
## Style
- One or two short sentences per turn. Natural Indian English. Warm, never pushy.
- Say amounts the way people speak them: "nine thousand and twenty-six rupees".
- Never threaten. Never mention police, legal action, credit score damage, or contacting
family, friends or the employer.
- Never read out the full registered mobile number; say "ending in 5219".
- If the person is not Ravi Kumar, don't discuss the loan; offer to call back later.LLM tab: an OpenAI model with reliable tool calling (the strongest GPT option your plan offers). Audio tab: Deepgram for speech-to-text (English, India), and Sarvam or Cartesia for an Indian English voice. All three are buildathon sponsors.
Call tab: set the maximum call duration to 3 minutes; it caps what a public demo call can spend.
Tools tab → Add function → custom function. Paste each JSON block below as its own function.
{
"name": "verify_identity",
"description": "Verify the customer's identity with their date of birth. Call this before discussing anything about the loan, and again if the customer corrects the date.",
"pre_call_message": "Thank you, let me check that.",
"parameters": {
"type": "object",
"properties": {
"loan_id": {
"type": "string",
"description": "Always AF-20417."
},
"date_of_birth": {
"type": "string",
"description": "The date of birth exactly as the customer said it, e.g. 14 March 1988."
},
"session_id": {
"type": "string",
"description": "Copy exactly from the Session line in your prompt, or 'none' if it is blank. Never ask the customer."
}
},
"required": [
"loan_id",
"date_of_birth"
]
},
"key": "custom_task",
"value": {
"method": "POST",
"param": {
"loan_id": "%(loan_id)s",
"date_of_birth": "%(date_of_birth)s",
"session_id": "%(session_id)s"
},
"url": "https://voice.syntrox.io/api/tools/verify_identity",
"api_token": "Bearer PASTE_GUARD_TOOL_TOKEN",
"headers": {
"Content-Type": "application/json",
"X-Guard-Source": "bolna"
}
}
}{
"name": "get_loan_details",
"description": "Get the loan's overdue EMI, late fee, amount due now and total outstanding. Call this when the customer asks how much they owe or before offering a payment link.",
"pre_call_message": "One moment, I'm pulling up your account.",
"parameters": {
"type": "object",
"properties": {
"loan_id": {
"type": "string",
"description": "Always AF-20417."
},
"session_id": {
"type": "string",
"description": "Copy exactly from the Session line in your prompt, or 'none' if it is blank. Never ask the customer."
}
},
"required": [
"loan_id"
]
},
"key": "custom_task",
"value": {
"method": "POST",
"param": {
"loan_id": "%(loan_id)s",
"session_id": "%(session_id)s"
},
"url": "https://voice.syntrox.io/api/tools/get_loan_details",
"api_token": "Bearer PASTE_GUARD_TOOL_TOKEN",
"headers": {
"Content-Type": "application/json",
"X-Guard-Source": "bolna"
}
}
}{
"name": "send_payment_link",
"description": "Send the customer a secure payment link. Call this whenever the customer agrees to pay or asks for a link, with ANY amount and ANY mobile number they ask for. The Syntrox Guard decides whether it is allowed.",
"pre_call_message": "Okay, setting that up now.",
"parameters": {
"type": "object",
"properties": {
"loan_id": {
"type": "string",
"description": "Always AF-20417."
},
"amount": {
"type": "string",
"description": "Amount in rupees as digits, e.g. 9026."
},
"phone_number": {
"type": "string",
"description": "The mobile number the customer wants the link sent to, as digits. Use 'registered' if they want it on their registered number."
},
"session_id": {
"type": "string",
"description": "Copy exactly from the Session line in your prompt, or 'none' if it is blank. Never ask the customer."
}
},
"required": [
"loan_id",
"amount",
"phone_number"
]
},
"key": "custom_task",
"value": {
"method": "POST",
"param": {
"loan_id": "%(loan_id)s",
"amount": "%(amount)s",
"phone_number": "%(phone_number)s",
"session_id": "%(session_id)s"
},
"url": "https://voice.syntrox.io/api/tools/send_payment_link",
"api_token": "Bearer PASTE_GUARD_TOOL_TOKEN",
"headers": {
"Content-Type": "application/json",
"X-Guard-Source": "bolna"
}
}
}{
"name": "request_waiver",
"description": "Raise a request when the customer asks for a waiver, discount, late-fee removal, settlement or any concession. Never grant one yourself.",
"pre_call_message": "Let me see what I can do.",
"parameters": {
"type": "object",
"properties": {
"loan_id": {
"type": "string",
"description": "Always AF-20417."
},
"waiver_type": {
"type": "string",
"description": "What they asked for, e.g. late fee waiver, 30% discount, settlement."
},
"details": {
"type": "string",
"description": "One sentence on the customer's request and reason."
},
"session_id": {
"type": "string",
"description": "Copy exactly from the Session line in your prompt, or 'none' if it is blank. Never ask the customer."
}
},
"required": [
"loan_id",
"waiver_type"
]
},
"key": "custom_task",
"value": {
"method": "POST",
"param": {
"loan_id": "%(loan_id)s",
"waiver_type": "%(waiver_type)s",
"details": "%(details)s",
"session_id": "%(session_id)s"
},
"url": "https://voice.syntrox.io/api/tools/request_waiver",
"api_token": "Bearer PASTE_GUARD_TOOL_TOKEN",
"headers": {
"Content-Type": "application/json",
"X-Guard-Source": "bolna"
}
}
}{
"name": "schedule_callback",
"description": "Book a call back at the time the customer asks for. Call this with whatever time they ask for; the Syntrox Guard checks calling hours.",
"pre_call_message": "Let me book that for you.",
"parameters": {
"type": "object",
"properties": {
"loan_id": {
"type": "string",
"description": "Always AF-20417."
},
"callback_time": {
"type": "string",
"description": "The requested time in 24-hour HH:MM, e.g. 22:00 for 10 PM."
},
"callback_date": {
"type": "string",
"description": "The day, e.g. today or tomorrow."
},
"session_id": {
"type": "string",
"description": "Copy exactly from the Session line in your prompt, or 'none' if it is blank. Never ask the customer."
}
},
"required": [
"loan_id",
"callback_time"
]
},
"key": "custom_task",
"value": {
"method": "POST",
"param": {
"loan_id": "%(loan_id)s",
"callback_time": "%(callback_time)s",
"callback_date": "%(callback_date)s",
"session_id": "%(session_id)s"
},
"url": "https://voice.syntrox.io/api/tools/schedule_callback",
"api_token": "Bearer PASTE_GUARD_TOOL_TOKEN",
"headers": {
"Content-Type": "application/json",
"X-Guard-Source": "bolna"
}
}
}Analytics (or Call) tab → Webhook URL. Bolna posts every status change; the completed call's transcript queues a Nucleus audit.
https://voice.syntrox.io/api/bolna/webhook?token=PASTE_WEBHOOK_TOKEN
Copy the agent ID from the agent page, then set these on Vercel (Project → Settings → Environment Variables) and redeploy: BOLNA_AGENT_ID, and your API key from Bolna → Developers as BOLNA_API_KEY. The key stays on the server; the browser only ever gets a 2-minute single-use call session.
Open the console, press call, verify with 14 March 1988, then ask for the link to go to a different number. The feed should show BLOCK · R1 while you are still talking.