Skip to main content
RapidDev - Software Development Agency
bolt-ai-integrationsBolt Chat + API Route

How to Integrate Bolt.new with Mural

Integrate Mural's REST API into Bolt.new to create, read, and embed collaborative whiteboards programmatically. The quickest path is embedding murals via iframe — Mural provides embed URLs for each whiteboard that work in Bolt's WebContainer preview instantly. Full REST API access (creating murals, adding sticky notes) requires a Mural Business or Enterprise plan and server-side API routes to protect your token.

What you'll learn

  • How to get a Mural API token from the developer portal and set up authentication
  • How to embed any Mural whiteboard in your Bolt.new app using the iframe embed URL
  • How to list available murals and rooms via the Mural REST API
  • How to create new murals programmatically with a specified template
  • How to build a collaboration dashboard that surfaces Mural content alongside other project tools
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate17 min read25 minutesProductivityApril 2026RapidDev Engineering Team
TL;DR

Integrate Mural's REST API into Bolt.new to create, read, and embed collaborative whiteboards programmatically. The quickest path is embedding murals via iframe — Mural provides embed URLs for each whiteboard that work in Bolt's WebContainer preview instantly. Full REST API access (creating murals, adding sticky notes) requires a Mural Business or Enterprise plan and server-side API routes to protect your token.

Embed and Manage Mural Whiteboards from Bolt.new

Mural is the go-to platform for structured facilitation in distributed teams — design sprints, workshops, retrospectives, and strategic planning sessions all benefit from Mural's template library and real-time collaboration features. Embedding Mural directly into your project management app, intranet portal, or client dashboard eliminates the context switch of opening a separate Mural window and gives your team a unified workspace.

There are two distinct integration patterns with different requirements. The first and simplest is the embed approach: Mural generates a sharable embed URL for any whiteboard (mural board) in your workspace. You paste this URL into an iframe, and the full interactive Mural experience renders inside your app. This works with any Mural plan, requires no API credentials, and functions in Bolt.new's WebContainer preview instantly — ideal for dashboards and portals where you want to surface specific, known murals.

The second pattern is the REST API: programmatic creation and management of murals, adding stickies and content, reading workshop outputs, and dynamically loading murals for different projects. The Mural REST API requires a Business or Enterprise subscription — the Free and Team plans do not include API access. If your organization has a Business or Enterprise account, the API enables powerful automation: auto-creating a retrospective mural when a new sprint begins, reading sticky note content for meeting summaries, or syncing mural participants with your project roster.

Integration method

Bolt Chat + API Route

Mural offers two integration paths: embedded whiteboards (iframe embed URLs that work immediately with no API credentials) and the REST API (requires Business or Enterprise plan for full CRUD access to murals and content). The embed approach is the fastest path — Mural generates an embed URL for each whiteboard that you put in an iframe tag. The REST API requires a server-side API route to protect your access token. All outbound calls to Mural's API work in Bolt's WebContainer during development.

Prerequisites

  • A Mural account — the free plan works for embed-only integrations; Business or Enterprise plan required for REST API access
  • A Mural API token from the Mural Developer Portal (app.mural.co/api) — only available on Business/Enterprise plans
  • The workspace ID and room ID from your Mural workspace URL for API calls that require specifying a location
  • A Bolt.new account with a new Next.js project open
  • For full API use: at least one existing mural in your workspace to test read operations

Step-by-step guide

1

Get your Mural embed URL and API credentials

Mural integration starts with understanding which access level you have. If you have a Free or Team Mural account, you can use the embed approach immediately — no API credentials needed. If you have a Business or Enterprise account, you can additionally use the REST API for programmatic mural management. For the embed URL (works on all plans): open any mural in Mural, click the Share button in the top-right corner, select 'Get embed link', choose 'Visitor access' (view and collaborate without requiring a Mural account) or 'Member access', and copy the embed URL. It looks like `https://app.mural.co/embed/...`. This URL can be placed directly in an iframe in your Bolt.new app — no server-side code required. For the REST API (Business/Enterprise only): go to app.mural.co/api or navigate to your Mural workspace settings → Developers → API Access. Create a new API application and generate a Personal Access Token (PAT). The token is a long string starting with `eyJ...` (a JWT). Copy it immediately — it may not be shown again. Add it to your .env file as MURAL_API_TOKEN. You will also need your workspace ID, which appears in the Mural URL as `https://app.mural.co/t/{workspaceId}/...`. For API calls that create murals in a specific room, also note the room ID from `https://app.mural.co/t/{workspaceId}/r/{roomId}`. All API calls to Mural use the base URL `https://app.mural.co/api/public/v1`. The token goes in the Authorization header as `Bearer {token}`. Outbound calls to this URL work from Bolt's WebContainer during development.

Bolt.new Prompt

Set up Mural API integration in my Next.js project. Create a .env file with MURAL_API_TOKEN=your-token-here, MURAL_WORKSPACE_ID=your-workspace-id, and MURAL_DEFAULT_ROOM_ID=your-room-id. Create a lib/mural.ts file that exports a muralFetch helper function that adds the Authorization Bearer header from MURAL_API_TOKEN and fetches from https://app.mural.co/api/public/v1 + the endpoint. Also export a getMuralEmbedUrl function that accepts a muralId and returns the embed URL format for Mural. Add TypeScript types and error handling.

Paste this in Bolt.new chat

lib/mural.ts
1// lib/mural.ts
2const MURAL_API_BASE = 'https://app.mural.co/api/public/v1';
3
4export async function muralFetch<T = unknown>(
5 endpoint: string,
6 init: RequestInit = {}
7): Promise<T> {
8 const token = process.env.MURAL_API_TOKEN;
9 if (!token) {
10 throw new Error(
11 'MURAL_API_TOKEN is not set. Get it from app.mural.co → Settings → Developers. ' +
12 'Note: REST API access requires a Mural Business or Enterprise plan.'
13 );
14 }
15
16 const url = `${MURAL_API_BASE}${endpoint.startsWith('/') ? endpoint : '/' + endpoint}`;
17 const response = await fetch(url, {
18 ...init,
19 headers: {
20 Authorization: `Bearer ${token}`,
21 'Content-Type': 'application/json',
22 Accept: 'application/json',
23 ...init.headers,
24 },
25 });
26
27 if (!response.ok) {
28 const errorText = await response.text();
29 throw new Error(`Mural API ${response.status} ${endpoint}: ${errorText}`);
30 }
31
32 return response.json() as Promise<T>;
33}
34
35// Generate a Mural embed URL from a mural share link or ID
36export function getMuralEmbedUrl(muralShareLink: string): string {
37 // If it's already an embed URL, return as-is
38 if (muralShareLink.includes('/embed/')) return muralShareLink;
39 // Convert share link to embed URL format
40 return muralShareLink.replace('/t/', '/embed/t/');
41}

Pro tip: If you only need to embed existing murals without creating or reading them programmatically, skip the API token entirely. The iframe embed approach works on any Mural plan and requires zero backend code — just an embed URL from the Mural Share menu.

Expected result: A configured Mural API helper in lib/mural.ts with credentials in .env, and the ability to embed any mural via iframe using the embed URL approach.

2

Embed a Mural whiteboard using iframe

The Mural embed is the fastest path to showing a collaborative whiteboard inside your Bolt.new app. It requires no API credentials, works on all Mural plans, and functions immediately in Bolt's WebContainer preview. The iframe renders the full Mural experience — sticky notes, shapes, cursor tracking, and real-time collaboration — as if users were on app.mural.co directly. Mural's embed URLs are generated per-mural and include access control: you can set them to require Mural account login or allow anonymous visitor access. For internal tools, 'Member access' ensures only your workspace members can interact. For client portals where external stakeholders participate, 'Visitor access' lets anyone with the link join without needing a Mural account. The iframe embed has a few important configuration details. The sandbox attribute controls what the iframe is allowed to do — Mural requires at minimum `allow-same-origin allow-scripts allow-popups allow-forms` for full functionality. Without `allow-popups`, some Mural features (file upload, external links) may not work. Without `allow-same-origin`, Mural cannot store settings in the browser. For responsive embeds, set the iframe to `width: 100%` and control height explicitly — Mural does not auto-resize to fit its content. A height of 600-800px works well for most workshop use cases. On mobile, Mural embeds can be difficult to use — consider showing a 'Open in Mural' link on small screens instead of the embedded iframe. When building a project-specific Mural dashboard, store the embed URL in your database alongside other project data (Supabase, etc.) so each project can have its own associated mural without hardcoding URLs.

Bolt.new Prompt

Create a reusable Mural embed component at components/MuralEmbed.tsx. Accept props: embedUrl (string, required), title (string, optional), height (number, default 600), showOpenLink (boolean, default true). Render an iframe with the embedUrl, appropriate sandbox permissions (allow-same-origin allow-scripts allow-popups allow-forms allow-pointer-lock), width 100%, and the specified height. Show a loading skeleton while the iframe loads (use onLoad). Below the iframe, show an 'Open in Mural' link that opens the mural URL in a new tab. Add a responsive wrapper that hides the embed on mobile and shows only the link instead. Use Tailwind CSS for styling.

Paste this in Bolt.new chat

components/MuralEmbed.tsx
1// components/MuralEmbed.tsx
2'use client';
3import { useState } from 'react';
4
5interface MuralEmbedProps {
6 embedUrl: string;
7 title?: string;
8 height?: number;
9 showOpenLink?: boolean;
10}
11
12export function MuralEmbed({
13 embedUrl,
14 title = 'Mural Whiteboard',
15 height = 600,
16 showOpenLink = true,
17}: MuralEmbedProps) {
18 const [isLoaded, setIsLoaded] = useState(false);
19
20 // Convert share URL to embed URL if needed
21 const iframeUrl = embedUrl.includes('/embed/')
22 ? embedUrl
23 : embedUrl.replace('/t/', '/embed/t/');
24
25 return (
26 <div className="w-full">
27 {/* Desktop: show embed */}
28 <div className="hidden md:block relative">
29 {!isLoaded && (
30 <div
31 className="absolute inset-0 bg-gray-100 animate-pulse rounded-lg flex items-center justify-center"
32 style={{ height }}
33 >
34 <span className="text-gray-500 text-sm">Loading Mural...</span>
35 </div>
36 )}
37 <iframe
38 src={iframeUrl}
39 title={title}
40 width="100%"
41 height={height}
42 sandbox="allow-same-origin allow-scripts allow-popups allow-forms allow-pointer-lock"
43 allowFullScreen
44 onLoad={() => setIsLoaded(true)}
45 className="rounded-lg border border-gray-200"
46 />
47 </div>
48
49 {/* Mobile: show link only */}
50 <div className="md:hidden bg-gray-50 border border-gray-200 rounded-lg p-6 text-center">
51 <p className="text-gray-600 mb-3">Open this mural on a larger screen for the best experience</p>
52 {showOpenLink && (
53 <a
54 href={embedUrl}
55 target="_blank"
56 rel="noopener noreferrer"
57 className="inline-flex items-center gap-2 text-blue-600 hover:underline font-medium"
58 >
59 Open in Mural
60 </a>
61 )}
62 </div>
63
64 {showOpenLink && (
65 <div className="hidden md:flex justify-end mt-2">
66 <a
67 href={embedUrl}
68 target="_blank"
69 rel="noopener noreferrer"
70 className="text-sm text-gray-500 hover:text-gray-700 hover:underline"
71 >
72 Open in Mural
73 </a>
74 </div>
75 )}
76 </div>
77 );
78}

Pro tip: If the Mural embed shows a blank screen or a 'connection refused' message in Bolt's preview, check that the iframe sandbox attribute includes allow-same-origin. Without it, Mural's authentication check fails silently and the embed shows blank. Also ensure the embed URL was generated with visitor or member access — private links without sharing enabled will not load in iframes.

Expected result: A reusable MuralEmbed component that displays any Mural whiteboard in an iframe with loading state, responsive behavior, and an Open in Mural link.

3

List and fetch murals via the REST API

With the Mural REST API (Business/Enterprise plans), you can programmatically list all murals in your workspace, filter them by room or workspace, and display them dynamically in your app without hardcoding embed URLs. This powers scenarios like a project portal that automatically shows the mural associated with each project. The primary listing endpoint is `GET /workspaces/{workspaceId}/murals`. This returns a paginated list of murals in your workspace with fields including `id`, `title`, `createdOn`, `updatedOn`, `shareLink`, `status`, and the room/workspace they belong to. Use `next` (cursor-based pagination) to fetch all pages for large workspaces. For room-specific murals: `GET /rooms/{roomId}/murals` returns only murals in that room. If your workspace is organized into rooms by client, project, or team, this lets you build workspace-aware navigation — showing the team lead only murals from their team's room. The `shareLink` in the API response is the full Mural URL. Converting it to an embed URL is straightforward: replace `/t/` with `/embed/t/` in the path. Store the shareLink in your database when creating murals programmatically, and generate embed URLs dynamically in your frontend. For searching and filtering murals, the list API supports `title` (fuzzy match), `status` (active, archived), and date range filters. This is useful for a mural library feature where team members can search for past workshop outputs by topic or date.

Bolt.new Prompt

Create a Mural list API route at app/api/mural/murals/route.ts. Fetch murals from the Mural REST API using muralFetch. Use the MURAL_WORKSPACE_ID env var in the endpoint /workspaces/{workspaceId}/murals. Return an array of murals with id, title, createdOn, shareLink, and embedUrl (generated by calling getMuralEmbedUrl from lib/mural.ts). Handle cases where the workspace ID is missing or the API is unavailable. Create a MuralLibrary React component that fetches from this route and displays murals in a grid of cards with title, date, and an Embed button.

Paste this in Bolt.new chat

app/api/mural/murals/route.ts
1// app/api/mural/murals/route.ts
2import { NextResponse } from 'next/server';
3import { muralFetch, getMuralEmbedUrl } from '@/lib/mural';
4
5interface MuralItem {
6 id: string;
7 title: string;
8 createdOn: number;
9 updatedOn: number;
10 shareLink: string;
11 status: string;
12}
13
14interface MuralListResponse {
15 value: MuralItem[];
16 next?: string;
17}
18
19export async function GET() {
20 const workspaceId = process.env.MURAL_WORKSPACE_ID;
21 if (!workspaceId) {
22 return NextResponse.json(
23 { error: 'MURAL_WORKSPACE_ID is not configured' },
24 { status: 500 }
25 );
26 }
27
28 const data = await muralFetch<MuralListResponse>(
29 `/workspaces/${workspaceId}/murals?limit=50`
30 );
31
32 const murals = (data.value ?? []).map(m => ({
33 id: m.id,
34 title: m.title,
35 createdOn: new Date(m.createdOn).toISOString(),
36 updatedOn: new Date(m.updatedOn).toISOString(),
37 shareLink: m.shareLink,
38 embedUrl: getMuralEmbedUrl(m.shareLink),
39 status: m.status,
40 }));
41
42 return NextResponse.json({ murals, total: murals.length });
43}

Pro tip: Mural's API uses cursor-based pagination. The response includes a 'next' field with a cursor token if there are more results. For workspaces with many murals, implement pagination in your API route to avoid timeouts — fetch the first page and provide a 'load more' button in the UI rather than loading all murals at once.

Expected result: A murals API route that returns all workspace murals with embed URLs, and a library component displaying them in a searchable grid.

4

Create murals programmatically and deploy the integration

The Mural creation API (`POST /rooms/{roomId}/murals`) lets you generate new whiteboards on demand — useful for automating the setup of recurring workshops, creating dedicated murals for each new project or client, or building a self-service portal where team members can request a new whiteboard. The create request body requires `title` (the mural name) and optionally `roomId`, `workspaceId`, `templateId`, `backgroundColor`, `height`, and `width`. Templates are particularly valuable for standardized workshops — a retrospective template ensures every sprint retro starts with the same layout and sections. Template IDs can be found in your Mural workspace's template library. The created mural response includes the full mural object with the `shareLink` and `id`. Save these to your database immediately — you will need the ID if you want to add content later, and the shareLink for embedding. Store both `shareLink` and `id` so you have both the embed URL and the ability to make subsequent API calls on the specific mural. After creating a mural, Mural takes a few seconds to fully initialize the new whiteboard. If you embed the mural immediately after creation, it may show a loading screen briefly. Consider adding a polling check or a 3-second delay before redirecting users to the new mural. For deployment: all Mural API calls are outbound HTTP requests that work in Bolt's WebContainer during development. There is no webhook or incoming connection requirement for the create, list, or embed use cases. Deploy to Netlify when you are ready for production, and add your MURAL_API_TOKEN, MURAL_WORKSPACE_ID, and MURAL_DEFAULT_ROOM_ID environment variables in Netlify's dashboard.

Bolt.new Prompt

Create a mural creation API route at app/api/mural/create/route.ts. Accept POST with title (required), templateId (optional), and roomId (optional, falls back to MURAL_DEFAULT_ROOM_ID from env). Use muralFetch to POST to /rooms/{roomId}/murals with the title and templateId if provided. Return the created mural's id, title, shareLink, and embedUrl. Also create netlify.toml with Next.js build plugin configuration. Add a simple CreateMuralForm React component with a title input and Create Mural button that calls this route and redirects to the new mural's embed page.

Paste this in Bolt.new chat

app/api/mural/create/route.ts
1// app/api/mural/create/route.ts
2import { NextRequest, NextResponse } from 'next/server';
3import { muralFetch, getMuralEmbedUrl } from '@/lib/mural';
4
5interface CreatedMural {
6 id: string;
7 title: string;
8 shareLink: string;
9 createdOn: number;
10}
11
12export async function POST(request: NextRequest) {
13 const { title, templateId, roomId } = await request.json();
14
15 if (!title?.trim()) {
16 return NextResponse.json({ error: 'title is required' }, { status: 400 });
17 }
18
19 const targetRoomId = roomId ?? process.env.MURAL_DEFAULT_ROOM_ID;
20 if (!targetRoomId) {
21 return NextResponse.json(
22 { error: 'roomId is required — set MURAL_DEFAULT_ROOM_ID in .env or pass roomId in request' },
23 { status: 400 }
24 );
25 }
26
27 const body: Record<string, unknown> = { title: title.trim() };
28 if (templateId) body.templateId = templateId;
29
30 const mural = await muralFetch<CreatedMural>(`/rooms/${targetRoomId}/murals`, {
31 method: 'POST',
32 body: JSON.stringify(body),
33 });
34
35 return NextResponse.json({
36 id: mural.id,
37 title: mural.title,
38 shareLink: mural.shareLink,
39 embedUrl: getMuralEmbedUrl(mural.shareLink),
40 createdOn: new Date(mural.createdOn).toISOString(),
41 }, { status: 201 });
42}

Pro tip: Mural templates significantly improve workshop consistency. To find your template IDs, call GET /workspaces/{workspaceId}/templates to list all available templates in your workspace. Each template has an id that you pass as templateId in the create request.

Expected result: A mural creation API route that generates new Mural whiteboards programmatically, with the created mural's embed URL ready for immediate use in your app.

Common use cases

Project Kickoff Dashboard with Embedded Mural

Build a project management portal where each project has a dedicated page embedding the corresponding Mural whiteboard. Team members can view and collaborate on the mural directly within your app, with the project's tasks and timeline displayed alongside it.

Bolt.new Prompt

Create a project detail page that embeds a Mural whiteboard. Build a React component at components/MuralEmbed.tsx that accepts a muralEmbedUrl string and an optional title. Render it in a responsive iframe container with a loading state. The iframe should have sandbox='allow-same-origin allow-scripts allow-popups allow-forms' permissions. Show a 'Open in Mural' link below the iframe that opens the full Mural board in a new tab. Add a configurable height prop defaulting to 600px.

Copy this prompt to try it in Bolt.new

Workshop Library Dashboard

Create an internal dashboard listing all murals in your workspace with their creation date, template used, and a quick-launch button. Team members can browse available workshop templates and open or embed any mural without navigating the Mural interface.

Bolt.new Prompt

Build a Mural library dashboard. Create an API route at app/api/mural/murals/route.ts that fetches all murals from the Mural REST API using a Bearer token from MURAL_API_TOKEN in process.env. Call GET https://app.mural.co/api/public/v1/murals and return id, title, createdOn, and embedUrl for each mural. Build a React MuralLibrary component showing murals in a card grid with title, creation date, and an Embed button that shows the selected mural in an iframe modal.

Copy this prompt to try it in Bolt.new

Auto-Create Sprint Retrospective Murals

When a new sprint or project phase begins, automatically create a fresh Mural whiteboard based on your retrospective template. The created mural URL is saved to your database and embedded in the sprint page, ready for the team without any manual setup.

Bolt.new Prompt

Create a function that auto-creates a Mural whiteboard for new sprints. Build an API route at app/api/mural/create/route.ts that accepts POST with title and optional templateId. Use the MURAL_API_TOKEN to POST to the Mural REST API to create a new mural in the workspace (room) specified by MURAL_ROOM_ID. Return the created mural's id, title, and shareLink. Use this in my sprint creation workflow to automatically provision a retro board for each sprint.

Copy this prompt to try it in Bolt.new

Troubleshooting

Mural iframe embed shows a blank screen or login prompt instead of the whiteboard

Cause: Two common causes: (1) the embed URL was generated with 'Private' access rather than 'Visitor' or 'Member' access — private murals require a logged-in Mural account and cannot be embedded without authentication, or (2) the iframe sandbox attribute is missing allow-same-origin, which prevents Mural's session cookies from being read.

Solution: Regenerate the embed URL in Mural with Visitor Access (for public embeds) or Member Access (for internal tools). Go to the mural → Share → Get embed link → select access level → copy URL. Also ensure your iframe has sandbox='allow-same-origin allow-scripts allow-popups allow-forms allow-pointer-lock' attributes.

Mural REST API returns 403 Forbidden when fetching murals

Cause: Mural's REST API requires a Business or Enterprise plan. Free and Team plan accounts receive a 403 error on all API endpoints. Additionally, Personal Access Tokens are scoped to specific workspaces — using a token from workspace A to access workspace B returns 403.

Solution: Verify your Mural account is on the Business or Enterprise plan. If it is, check that MURAL_WORKSPACE_ID matches the workspace where the API token was created — tokens are workspace-specific. Regenerate your token in the correct workspace's developer settings.

Created mural shows blank or loading state when embedded immediately after creation

Cause: Mural takes a few seconds after the POST /murals API call to fully initialize the new whiteboard. If you embed the share link immediately in the API response, the iframe may show a loading screen because the board is not yet ready.

Solution: Add a brief delay (2-3 seconds) before redirecting users to the new mural embed, or implement a polling check using the GET /murals/{muralId} endpoint until the status changes from 'creating' to 'active'. For most use cases, a simple 3-second delay with a loading spinner is sufficient.

typescript
1// Simple delay before embedding a newly created mural
2await new Promise(resolve => setTimeout(resolve, 3000));
3// Now safe to embed the mural

Best practices

  • Store MURAL_API_TOKEN as a server-side environment variable only — never use NEXT_PUBLIC_ prefix, as the token provides write access to your entire workspace
  • Use the iframe embed approach for most dashboard use cases — it requires no API credentials, works on all Mural plans, and delivers the full interactive Mural experience
  • Store both the mural shareLink and ID in your database when creating murals programmatically — the shareLink is needed for embedding and the ID is needed for subsequent API calls
  • Set iframe embed permissions correctly: allow-same-origin allow-scripts allow-popups allow-forms allow-pointer-lock are all needed for Mural to function fully inside an iframe
  • For mobile users, replace the iframe embed with a direct link to the Mural app — Mural embeds are difficult to use on small screens due to the nature of whiteboarding interactions
  • Use Mural templates for standardized workshops to ensure consistency across retrospectives, design sprints, and planning sessions
  • Implement cursor-based pagination for workspace-wide mural listings — large organizations may have hundreds of murals and fetching all at once can cause slow API responses
  • Scope your Mural API token permissions to the minimum required — use read-only tokens for dashboard applications that only need to list and embed murals, reserving write-capable tokens for automation workflows

Alternatives

Frequently asked questions

Do I need a paid Mural plan to use Mural in Bolt.new?

Not for the embed approach. Embedding existing murals via iframe works on any Mural plan including Free, since it just uses the share link you generate from the Mural interface. The REST API (creating murals programmatically, listing workspace murals) requires a Business or Enterprise plan. If you only need to embed specific known murals in your dashboard, the free plan is sufficient.

Can I use the Mural API from Bolt.new's WebContainer during development?

Yes. All Mural REST API calls are outbound HTTP requests to app.mural.co. These work in Bolt.new's WebContainer since they use standard HTTPS fetch calls. There is no incoming connection requirement for the Mural integration — you are always calling Mural's API, not the other way around. This means you can develop and test the full Mural integration in Bolt without deploying first.

How do I get a Mural API token?

Go to your Mural workspace settings and navigate to Settings → Developers → API Access. Click 'Create Application' or 'Generate Personal Access Token'. The token is a long JWT string that starts with 'eyJ'. Mural's developer API is at app.mural.co/api for documentation. Note that API access is only available on Business and Enterprise plans — the option may not appear in your settings if you are on a Free or Team plan.

Why does my Mural embed show a login screen even though I set Visitor access?

Check that you are using the embed URL (contains /embed/ in the path) rather than the regular share URL. In Mural, click Share → Get embed link to get the correct embed URL — do not use the standard Copy Link URL in an iframe. Also verify the iframe has sandbox='allow-same-origin allow-scripts allow-popups allow-forms allow-pointer-lock' — without allow-same-origin, Mural's session check fails and it redirects to login.

How do I find my Mural workspace ID and room ID?

Your workspace ID is visible in the Mural URL when you are logged in: https://app.mural.co/t/{workspaceId}/. Room IDs appear in room URLs: https://app.mural.co/t/{workspaceId}/r/{roomId}. Navigate to the room in the Mural sidebar, check the URL, and copy the ID segment. Both values are also available via the Mural API: GET /workspaces to list workspaces and GET /workspaces/{workspaceId}/rooms to list rooms.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.