Is there a bulk action or way of exporting all message step content across multiple canvases and message steps that is not using the canvas endpoint?
As far as I know, there is no bulk endpoint or non-canvas API path that returns message step content/definitions across multiple Canvases in one shot.
The approach that works is chaining two canvas endpoints:
It is scriptable and at 250k requests/hour you will get through even a large workspace quickly.
If you need rendered content (what was actually sent to a user rather than the template definition), that is a different path. Message Archiving writes a copy of each sent message to your connected cloud storage, which you can cross-reference with Currents via dispatch_id.
dispatch_id
Hi @marinavogtlvh, correct it would need some technical help to set up the script, but once it is running it should be pretty self-serve from there. On a side note if you have the Braze MCP set up this becomes even easier. I was actually able to pull the canvas details for one of our canvases directly from Claude Desktop to verify this answer, which is pretty neat. The setup is very straightforward.
On your second question, the raw template does come through exactly as it is written in the dashboard so any conditional logic, Liquid, and URLs that are hardcoded directly in the template will be visible. However anything that resolves at send time won't be there, for example URLs inside Content Blocks or values passed in dynamically via an API triggered payload or personalsiation tags etc..
Thanks Nirnay, sounds like it's not self-serve for a marketer? Do you know if this method will pull things like underlaying URLs and conditional text?
Best, Marina
you can technically make it presentable by connecting some dummy data, however that'd become very tedious very quickly.
with nested contentblocks it is impossible to manipulate with dummy data, as we do not know what lies under.
For anyone interested, just made API keys with canvas export permissions and ran crud directly on codex, which exported the content (all dynamic content was included), and structured the data in a csv, which I had predefined. No need for mcp, which seems to be Claude only according to Braze's docs.
Glad it worked! Quick question though, does your template use Content Blocks at all? If it does the export will return those as references like {{content_blocks.${comp__header}}} rather than the actual content inside them, so you may not be getting the full picture.
{{content_blocks.${comp__header}}}
On the MCP point, it is actually not Claude only. According to the Braze docs it supports Claude, Cursor and Gemini CLI as well. It gives your AI assistant direct access to your workspace so things like querying canvases, segments, KPIs, catalogs, campaign analytics, content blocks and more, all without writing any code or jumping into Postman. Definitely worth checking out, the setup is pretty straightforward.
One thing worth mentioning on the Codex approach, if you passed your API keys directly into the agent or prompt just make sure to rotate those keys. With MCP your API key is stored locally in your config file and the agent never actually sees it, it just calls the MCP server which handles authentication in the background. So from a security standpoint it is a much safer way to give your AI assistant access to Braze. Hope this helps! 🙌