Dograh

How to Migrate From Bland AI to Open-Source Voice AI: Step by Step

How to Migrate From Bland AI to Open-Source Voice AI: Step by Step
TutorialOctober 21, 2026·14 min read

How to Migrate From Bland AI to Open-Source Voice AI: Step by Step

Abhishek Kumar
Abhishek Kumar·Co-founder, Dograh AI

Co-founder of Dograh, building the future of open-source voice AI agents. Own your voice AI stack.

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.

An exported Bland pathway (start, a main step, a step that calls your system, and a transfer) rebuilt on a second screen as a Dograh workflow whose main step has tools that call your system and hand the call to a person, with each route now a condition the AI reads.
Expect a rebuild rather than an import. Each Bland step needs its own Dograh node or tool, and each edge label has to be rewritten as a plain-words condition, because the AI interprets it instead of applying it as a fixed rule.

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

BlandDograh
Pathway (nodes and edges)Workflow: nodes joined by pathways
Start node and its first sentenceStart Call node, with the opening line in Greeting Text
Default node promptOne Agent node per job
Edge labelA pathway with a written condition the AI checks
Global promptGlobal Node, added to each step that has Add Global Prompt switched on
Webhook node during the callAn HTTP API tool on the Agent node
Post-call webhookA Webhook node
Knowledge Base nodeKnowledge Base files attached to the node
Transfer Call nodeThe Transfer Call tool, on Twilio
End Call nodeEnd Call node
Extracted variablesEnable Variable Extraction on the node, with Variables to Extract
Batch callsCampaigns

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.

Dograh

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 from transcript_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.

ItemWhereDone when
Export savedYour filesPathways, numbers, knowledge items and call records are stored outside Bland
Models and voice chosenModels, ProvidersA test call speaks in the new voice
Flow rebuiltWorkflow builderEvery Bland node and edge has a Dograh match or a planned change
Tools testedBrowser and phoneEach tool succeeds, and a timeout gets a sensible reply
Transfer testedReal phone callAnswered and unanswered transfers both end well
Webhook checkedYour receiverA real payload parsed, and a repeat delivery created no duplicate
Rollback writtenYour runbookThe number's old Twilio settings are saved
Bland kept activeBland dashboardEvery 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.

Frequently Asked Questions

Get started with Dograh

Build, deploy, and scale AI agents with Dograh. Join the community of developers building the future.