To migrate from Bland AI to open-source voice AI, export each pathway, number and knowledge base through Bland's API, then rebuild the flow in Dograh, an open-source, self-hostable voice agent platform. Choose new speech and language models, since Bland's own stay behind. Test on a spare number, then move one number at a time, keeping Bland as the fallback.
Key Takeaways
- Bland's Get Single Pathway API gives you each pathway's nodes and edges as JSON.
- Bland's models stay behind; on Dograh, use your own keys or host open-weight models.
- Move one number at a time, with Bland still answering the rest.
This post is part of our guide to Bland AI alternatives. The guide's section "How to move off Bland" covers the move in brief; this tutorial walks it step by step onto Dograh, an open-source voice agent platform you can self-host or run on Dograh Cloud.
The timing suits a move. In September 2026 Bland replaced Conversational Pathways, its original visual builder, with Bland Agents, where each call flow now sits as a pathway inside an agent, and every production agent must move to the new architecture by 15 November 2026. Since each agent has to be migrated and re-tested anyway, it is a natural moment to compare where that work should land.
What you need before you start
You need a Bland API key, a Dograh account, keys for the model providers you plan to use, and a spare phone number for testing.
Dograh runs as managed Dograh Cloud or self-hosted on your own server. Self-hosted Dograh has no per-minute platform fee (servers, model keys and phone minutes still cost); Dograh Cloud has a 1¢-a-minute platform fee with 10 concurrent calls included. For testing, a spare Twilio number costs $1.15 a month in the US, and Twilio is where Dograh's transfers to a person run.
Plan for real effort. In an April 2026 Zapier survey of 542 US executives, 89% believed they could switch AI vendors within four weeks, yet 58% of those who had tried said the move failed or took far more effort than expected. That is why this guide moves one number at a time, with a way back.
Hold off if your Bland setup depends on what only its Enterprise contract provides, such as FedRAMP 20x Class A or an air-gapped install backed by the vendor, or if your volume is small enough that the saving will not repay the work.
Step 1: Export your pathways, numbers and knowledge bases from Bland
Pull everything out of Bland through its API and keep the files as your rebuild spec.
Bland's API lists your pathways, then its Get Single Pathway endpoint, /pathway/{pathway_id}, returns one pathway with its nodes and edges. Other endpoints return your inbound numbers, your knowledge base items and your recent calls. The script below saves each one to a file, using your Bland API key in the authorization header; repeat the second line for each pathway_id in the list:
export BLAND_API_KEY="your-bland-api-key"
API="https://api.bland.ai/v1"
curl -s "$API/pathway" -H "authorization: $BLAND_API_KEY" -o bland-pathways.json
curl -s "$API/pathway/YOUR_PATHWAY_ID" -H "authorization: $BLAND_API_KEY" -o pathway-YOUR_PATHWAY_ID.json
curl -s "$API/inbound" -H "authorization: $BLAND_API_KEY" -o bland-numbers.json
curl -s "$API/knowledge" -H "authorization: $BLAND_API_KEY" -o bland-knowledge.json
curl -s "$API/calls" -H "authorization: $BLAND_API_KEY" -o bland-calls.json
What this does: It writes five files: the list of pathways, one pathway with its nodes and edges, every inbound number with its prompt and settings, your knowledge base items, and the metadata of recent calls. Nothing in Bland changes, since every request is a read.
In each pathway file, each node has a type (Default, End Call, Transfer Call, Knowledge Base or Webhook) and a data block with its prompt or text, and each edge has a label with its source and target nodes. A node with isGlobal set to true is a Global Node, which needs a different design in Step 3.
For past calls you want to keep, the call details endpoint, GET /v1/calls/{call_id}, returns the transcript, the extracted variables and, if the call was recorded, its recording URL. Save those before you close the Bland account.
Check: you have one file per live pathway with its nodes and edges, plus one file each of numbers, knowledge items and calls.
Step 2: Set up Dograh and choose the model layer
Create your Dograh workspace, then pick the models and voice that replace Bland's own.
On Dograh Cloud, sign up at app.dograh.com. To self-host, follow the Docker setup, which runs Docker Compose on a server with at least 8 GB of RAM and 4 vCPUs; no GPU is needed when your models run through API keys.
Bland ran its own models, so nothing carries over here. Dograh is the orchestration layer: it runs the call flow, tools and telephony, and the speech and language models are a separate layer you choose. Connect your provider keys under Providers in the sidebar, then save a named model configuration under Models with your speech-to-text, language model and voice; Dograh's own models are an option too. To keep call audio on your own hardware, host open-weight models instead; our tutorial on building a voice agent on fully local open-source models covers that setup.
A voice cloned on Bland stays on Bland. Re-create it at a provider Dograh supports, such as ElevenLabs or Cartesia, with the speaker's consent, and enter the new voice ID in the model configuration's voice field by hand.
Check: under Models, your named model configuration shows the speech-to-text, language model and voice you picked.
Step 3: Rebuild each pathway as a Dograh workflow
Turn each Bland node into a Dograh node, and each edge label into a pathway condition the AI reads.

Dograh has no Bland importer, so this is a rebuild. Under Voice Agents, create an agent: on the Create Voice Agent page, set Call Type to Inbound or Outbound to match the pathway, enter a Use Case and an Activity Description, and click Create Agent. In the agent's Model tab, choose the model configuration from Step 2. In its Settings tab, open Dictionary, type the words callers say that speech-to-text often mishears, such as product names, separated by commas, and click Save Dictionary. Then go back to the Canvas tab, the visual workflow builder, and work through the pathway file node by node.
What maps to what
| Bland | Dograh |
|---|---|
| Pathway (nodes and edges) | Workflow: nodes joined by pathways |
| Start node and its first sentence | Start Call node, with the opening line in Greeting Text |
| Default node prompt | One Agent node per job |
| Edge label | A pathway with a written condition the AI checks |
| Global prompt | Global Node, added to each step that has Add Global Prompt switched on |
| Webhook node during the call | An HTTP API tool on the Agent node |
| Post-call webhook | A Webhook node |
| Knowledge Base node | Knowledge Base files attached to the node |
| Transfer Call node | The Transfer Call tool, on Twilio |
| End Call node | End Call node |
| Extracted variables | Enable Variable Extraction on the node, with Variables to Extract |
| Batch calls | Campaigns |
Where the design changes
A Bland Global Node is a step the call can jump to from any node and then return. Dograh's Global Node is a shared prompt, not a step, so there is no direct equivalent. Put the shared rules in the Global Node, and give each step a pathway to the node that handles the side question. Add an End Call tool to each step if callers must be able to stop at any point.
Pathway conditions are read by the AI, never applied as a fixed rule, so write each one in plain words and test values near its edge. Any line that must be spoken word for word, such as a recording notice, belongs in the Greeting Text, which plays exactly as written.
For a faster rebuild, let an AI assistant do it through Dograh's MCP (Model Context Protocol) server. Create an API key under Developers first; the command below registers the server in Claude Code, with your key in the X-API-Key header:
claude mcp add --transport http dograh https://app.dograh.com/api/v1/mcp/ \
--header "X-API-Key: YOUR_DOGRAH_API_KEY"
What this does: It connects Claude Code to your Dograh workspace. On a self-hosted install, swap the URL for your own backend address followed by
/api/v1/mcp/.
Then give the assistant a pathway file and ask it to plan, then build, a Dograh agent that does the same job. A brand-new agent created this way publishes as version 1 at once, while edits to an existing agent save as drafts, so test it before any number points at it. Teams that prefer code can convert the JSON into Dograh's own nodes-and-edges format, then load it with Upload Agent Definition on the Voice Agents page or the Create from Definition API, and run Validate Workflow on the new agent to catch broken nodes or edges. Either way it is a conversion, not a one-click import.
Open Source Alternative to Vapi / Retell
Self-hosted voice agent platform — no per-minute fees
dograh-hq/dograh
Star on GitHub
Check: the canvas shows a Start Call node with your old opening line, one Agent node for each Bland Default node, and a pathway for each edge.
Step 4: Re-create tools, transfers and knowledge
Each Bland node that acts during the call becomes a Dograh tool or a knowledge file.
Each Bland Webhook node that called your systems during the call becomes an HTTP API tool: under Tools, create an External HTTP API tool with the same URL, method, headers and parameters, then attach it to the Agent nodes that need it. HTTP API tools wait 5 seconds by default and do not retry, so add a prompt line to each node that uses one: if the tool returns an error, say you cannot check right now and offer a callback.
Each Bland Transfer Call node becomes a Transfer Call tool. Under Tools, create one, set Destination Source to Static / Template and enter the number in E.164 format, such as +1415555XXXX. Transfer Timeout defaults to 30 seconds, and a Pre-Transfer Message such as "I'm connecting you to our team now" plays first if you choose Custom Message. Transfers to a person work on Twilio only, and no call summary is passed by default, so write the details to your own system with an HTTP API tool before the transfer. If nobody answers, the caller stays with the agent, so add a prompt line: if the transfer fails, offer a callback and write it to your system with that same tool.
For knowledge bases, upload the original files under Files, then select them on each node under Knowledge Base Documents. Dograh takes PDF, DOCX, DOC, TXT and JSON files up to 5 MB each, so save web pages and CSV sources in one of those formats first.
Check: a browser test call that needs each tool shows the tool call completing in the transcript.
Step 5: Send call results to a Webhook node
Move Bland's post-call webhook to a Webhook node that sends the fields your receiver already reads.
Add a Webhook node to the workflow and design its payload. The template below keeps your receiver's own key names, filling them from Dograh's run ID in workflow_run_id, the extracted values in gathered_context and the links in recording_url and transcript_url:
{
"call_id": "{{workflow_run_id}}",
"outcome": "{{gathered_context.call_disposition}}",
"appointment_date": "{{gathered_context.appointment_date}}",
"duration_seconds": "{{cost_info.call_duration_seconds}}",
"recording_url": "{{recording_url}}",
"transcript_url": "{{transcript_url}}"
}
What this does: After each call, it posts one JSON body with the run ID, the outcome, a value the agent extracted (here
appointment_date), the duration and download links for the recording and transcript. A receiver that read Bland's full transcript text now fetches it fromtranscript_url.
A temporary failure, such as a timeout or a 5xx reply, is retried automatically up to 5 times, so make your receiver safe to call twice. Our post on reading call traces to debug a voice agent helps when a test call does something unexpected.
Check: a test receiver such as webhook.site shows one POST after a test call, with every field filled.
Step 6: Test in the browser, then on a spare phone number
Prove the agent in the browser first, then on a real phone line, before any caller reaches it.
In the editor, click Test Agent and, in the Test Audio tab, talk through the calls your Bland agent handled, using old transcripts as scripts. Before the phone tests, click Publish, then Publish version, because edits reach test calls straight away but live calls only after publishing. Then add your spare Twilio number under Telephony, set the agent as that number's Inbound workflow, and call it from a real phone. Browser test calls cannot run Transfer Call, so test every transfer on the phone, answered and unanswered.
For each phone call, where tracing is set up, open View Trace on the run page to see what speech-to-text heard, each prompt sent to the AI, and every tool call with its request and response. Mask any real numbers in what you share, as in +1415555XXXX.
Most phone calls still reach the agent as 8 kHz audio, while a browser call runs at 16 kHz, the most Dograh's pipeline uses. Depending on the speech model, that can mean more misheard names and numbers, so listen for them. Add a QA (quality assurance) node to score each step of every test call, and lower its Sample Rate once you go live. Our checklist for testing voice agents before you go live has the full order of tests.
Check: the phone test appears as a run under Agent Runs, with the transfer in its transcript and the webhook delivered.
Step 7: Run both, then move one number at a time
Keep Bland answering while you move your quietest number first, knowing exactly what switches it and what undoes it.
Bland keeps billing while both run: its plan fee ($299 a month on Build, $499 on Scale), and on Bland's telephony a $0.015 minimum per outbound attempt and per failed call. For outbound lists, split the contact list, send a small share through a Dograh Campaign and the rest through Bland, then compare outcomes before moving the whole list.
For a number on your own Twilio account (Bland's bring-your-own-Twilio setup), open it in the Twilio console and copy its current voice settings into your runbook first. Then connect that Twilio account to Dograh and set the agent as the number's Inbound workflow. Saving it switches the number to Dograh at once, and to roll back you paste the old settings back in Twilio. If the number sits on a SIP trunk in Twilio, Twilio ignores its own voice settings, so it moves only when you take it off the trunk.
For a number bought through Bland, ask Bland support how to port it out. A ported number must land with a carrier Dograh supports, such as Twilio, Telnyx, Plivo or Vonage, or on your own SIP trunk through Dograh Managed SIP; Dograh doesn't sell numbers. Keep the number answering on Bland until the port completes.
The same steps apply from other hosted platforms; our guide to migrating from Retell AI covers a Twilio number on a SIP trunk in more detail.
Join the Dograh Community
Dograh is an OSS alternative to Vapi. Join our Slack community for queries, releases, best practices & community interactions.
Check: a call to the moved number appears as a new run in Dograh, and Bland's call log shows no new calls on it.
Before you ship it
Run this list for each number before you call its move finished.
| Item | Where | Done when |
|---|---|---|
| Export saved | Your files | Pathways, numbers, knowledge items and call records are stored outside Bland |
| Models and voice chosen | Models, Providers | A test call speaks in the new voice |
| Flow rebuilt | Workflow builder | Every Bland node and edge has a Dograh match or a planned change |
| Tools tested | Browser and phone | Each tool succeeds, and a timeout gets a sensible reply |
| Transfer tested | Real phone call | Answered and unanswered transfers both end well |
| Webhook checked | Your receiver | A real payload parsed, and a repeat delivery created no duplicate |
| Rollback written | Your runbook | The number's old Twilio settings are saved |
| Bland kept active | Bland dashboard | Every number has moved and a week of calls look right |
Once your quietest number runs cleanly on Dograh for a week, move the next one the same way, and close the Bland plan after the last.
What you end up with is a platform you control. Dograh is open source under BSD-2-Clause, so you can self-host it without a sales contract, and self-hosted it has no per-minute platform fee. You choose every model, from your own provider keys to open-weight models on your own servers, and your numbers stay with your carrier. The nodes-and-pathways builder will feel familiar after Pathways, and a QA node scores each step of your calls. To start, run Dograh from GitHub with Docker Compose, or sign up for Dograh Cloud.
Glossary
- Pathway file
- The JSON Bland's API returns for a pathway: its nodes, each with a type and prompt, and its edges, each with a label and the two nodes it joins.
- Inbound workflow
- The Dograh agent a phone number is set to answer with. Saving it on a Twilio number switches that number's calls to Dograh at once.
- Global Node
- In Bland, a step the call can reach from anywhere and then return from. In Dograh, a shared prompt added to every step that has Add Global Prompt switched on.
- HTTP API tool
- A Dograh tool that calls one of your systems during the call, with the URL, method, headers and parameters you set. It waits 5 seconds by default and does not retry.

