Overview
Three things reliably surprise an agent placing its first real calls: half of them reach an answering machine, the shop’s name comes back from the transcriber as something else entirely, and there is no obvious knob for “hand this to a person if someone is there.” Each of these has an answer. Two are parameters onPOST /v1/calls. The third is a pattern you assemble, and this page says so plainly rather than pretending otherwise.
New to the call lifecycle itself? Start with the Agent quickstart.
Voicemail
By default, Bland hangs up on voicemail. If you dispatch a call and no one picks up, the agent detects the answering machine and ends the call without saying anything. Nothing is left behind. This is usually not what you want. Configure it with thevoicemail object.
- Leave a message
- Message plus an SMS copy
- Push through an IVR
Play a message after the beep, then end the call.
The action you pass is not always the action that runs
Bland derives the effective action from the whole request, not fromaction alone. This trips people up, so it is worth knowing before you debug a call that “ignored” your setting.
The practical rule: supplying a message implies leaving one, and
ivr_mode overrides the action entirely. So {"action": "hangup", "message": "..."} leaves the message rather than hanging up, and {"action": "ignore", "message": "..."} abandons your IVR pushthrough. If you want hangup or ignore, send no message alongside it.
Retrying instead of leaving a message
If you would rather try again later than leave anything, theretry object redials after a delay and can use a different voicemail action on the second attempt.
Proper nouns
Transcription is where a business name becomes something that is not a business name. “Carmine and Co” comes back as “Carmiano Bank”, your agent repeats it back on the call, and the conversation quietly derails.keywords is the lever. It boosts the words you list inside the transcription engine, so they win against phonetically similar alternatives.
2, and higher values push harder:
- Seed it from what you already know. If your agent is calling a business, it knows the business name. If it is asking for a person, it knows the person’s name. Pass them before the first call rather than after the first bad transcript.
- Boost the ones that actually matter. Company names, product SKUs, street names, surnames, anything invented or non-English.
- Limits: at most 20 keywords per call, each under 100 characters, each formatted as
wordorword:boost. - Do not boost common words. Raising a word’s odds everywhere makes the transcript worse, not better.
keywords for the full parameter.
Escalating to a human during open hours
This one is a pattern, not a platform knob. There is nobusiness_hours field, and no setting that means “transfer if someone is at the desk.” What Bland gives you is the transfer itself: deciding when it is allowed is yours to assemble. Written down, it is short.
You need two pieces: a way to transfer, and a decision about whether transferring is allowed right now.
The transfer
If you need the human to be briefed before the caller is handed over, that is a warm transfer.
When you use
transfer_phone_number, the task has to say when to use it, and it has to use the word “transfer”. Alternate phrasing like “switch” or “hand off” can cause the agent to skip the action entirely.
The decision
1
Decide before you dial (recommended)
Your code knows the wall clock and the on-call roster. Bland does not. So resolve “is anyone there?” at dispatch time and send a different call depending on the answer:Omitting
transfer_phone_number when you are closed is the important half. A prompt that says “do not transfer” is a request the agent can misread. A call with no transfer destination cannot transfer at all.2
Or decide during the call
Sometimes the boundary falls mid-call, or the answer depends on something the agent learns while talking (which department, whether the caller is an existing customer). Then the decision has to happen live.Pass the facts in Give the agent a decision it can read, not arithmetic it has to perform.
request_data and set timezone so the agent’s sense of “now” matches yours:desk_staffed: true is reliable. “Work out whether 4:55 PM Pacific is inside 9 to 5 Eastern” is not. In pathways, {{now_utc}} is available at every node, but the same advice holds: branch on a precomputed flag wherever you can.Confirm it happened
The transfer shows up in the post-call payload and inGET /v1/calls/{call_id}: transferred_to holds the number and transferred_at the timestamp. If both are null on a call where the caller clearly asked for a person, the prompt wording is the first thing to check.
Next steps
Agent quickstart
Place a call, learn how it ended, read the transcript.
Send Call API reference
Every parameter these recipes use, in full.
Conversational Pathways
Structured flows when a prompt stops being enough.
Post call webhooks
The payload that tells you how each call went.
Docs for agents: llms.txt