Connecting Bubble to Adobe XD means two different things: the simpler path is exporting XD artboards as images and uploading them to Bubble for a design-handoff portal (no API needed); the API path uses Adobe's Creative Cloud Libraries API with OAuth 2.0 to pull design tokens and assets into Bubble. Note: Adobe XD as a standalone product was discontinued in 2023 — it's now part of the Creative Cloud subscription.
| Fact | Value |
|---|---|
| Tool | Adobe XD |
| Category | DevOps & Tools |
| Method | Bubble API Connector |
| Difficulty | Advanced |
| Time required | 60–90 minutes |
| Last updated | July 2026 |
Two paths for Bubble + Adobe XD: design handoff or API integration
Most founders asking 'how to connect Bubble to Adobe XD' fall into one of two groups. The first group — typically product managers or entrepreneurs — wants to show XD design mockups to clients inside a Bubble-built portal, get approvals, and track feedback. For them, the answer is the design handoff path: export artboards from XD as PNG or SVG files and host them in Bubble. No Adobe API credentials required.
The second group — developers or design-system builders — wants to programmatically sync design tokens (colors, typography, spacing) from Adobe Creative Cloud Libraries into a Bubble app that enforces consistent styling. For them, the CC Libraries API path makes sense, though it involves Adobe IMS OAuth 2.0 — a more involved setup than most Bubble integrations.
An important heads-up: Adobe XD as a standalone app was discontinued in October 2023. All XD features are now only available through an Adobe Creative Cloud subscription. If you're evaluating design tools now, Figma is the most actively developed alternative and has a REST API that's considerably simpler to use from Bubble. This tutorial covers both XD paths for teams already invested in the Adobe ecosystem.
Integration method
The Bubble API Connector calls Adobe's Creative Cloud Libraries API server-side using OAuth 2.0 client credentials, keeping your Adobe client secret in a Private header away from the browser.
Prerequisites
- An Adobe Creative Cloud subscription (XD is no longer available as a standalone purchase — CC subscription required)
- An Adobe Developer account at developer.adobe.com (free)
- A Bubble account — any plan works for the handoff path and for outbound API calls
- At least one Adobe Creative Cloud Library with colors or components to test with (for the API path)
- For the API path using Backend Workflows to refresh tokens: a paid Bubble plan
Step-by-step guide
Choose your path: design handoff (no API) or CC Libraries API
Before configuring anything in Bubble, decide which path matches your goal. Path A — Design Handoff (No API): If you want to display XD designs in a Bubble app for client review, feedback, or portfolio purposes, you do not need to interact with any Adobe API. The workflow is: 1. In Adobe XD, open your design file 2. Select File → Export → All Artboards (or Export → Selected) 3. Choose PNG or SVG format 4. Export the files to your computer 5. In Bubble's editor, go to the Data tab → File Manager → Upload files 6. Upload your exported artboard images 7. Reference these file URLs in Bubble Image elements or a Repeating Group gallery This path takes under 15 minutes and requires no API credentials whatsoever. The limitation is that artboard images are static — they don't update automatically when your XD design changes. Path B — CC Libraries API (Dynamic Design Tokens): If you need to programmatically access design data from Adobe Creative Cloud Libraries (color palettes, character styles, graphic components), proceed to the following steps which configure Bubble's API Connector with Adobe IMS OAuth 2.0 authentication. Important: Do not attempt to embed XD share links (xd.adobe.com/view/...) in Bubble using an HTML element iframe. Adobe sets X-Frame-Options headers that block iframe embedding — the embedded content will show a blank or error screen.
Pro tip: If your primary goal is client approval workflows, Path A is faster, simpler, and more reliable than Path B. Reserve the API path for teams that need automated design-system synchronization.
Expected result: You have a clear decision on which path to follow. Path A users have their XD artboard images uploaded to Bubble. Path B users proceed to the next step.
Create an Adobe Developer App and obtain client credentials
For Path B (CC Libraries API), you need to create an application in the Adobe Developer Console to get a Client ID and Client Secret. Open your browser and go to developer.adobe.com. Sign in with your Adobe ID (the same account linked to your Creative Cloud subscription). Click 'Create new project' or 'Add project'. On the project overview page, click 'Add API'. In the API catalog, find and select 'Creative Cloud Libraries'. Click 'Next'. Adobe will ask you to select an authentication type. Choose 'Server-to-Server' (also called Client Credentials or OAuth Server-to-Server) — this is the approach that works with Bubble because it doesn't require a redirect URI or user login flow. Click 'Save configured API'. On the project's credential page, you will see your Client ID and Client Secret. Copy both values. The Client Secret is shown only once in some Adobe Developer Console views — copy it immediately and store it in a password manager. You will use these in the next step to request an access token. Note: Adobe Creative Cloud subscription scopes are attached to your Adobe account — the credentials you generate here grant access to libraries owned by your Adobe ID. For multi-user scenarios where clients have their own CC Libraries, the Authorization Code flow is required, which needs a redirect URI and cannot be handled natively in Bubble without a paid plan and Backend Workflow proxy.
Pro tip: The 'Server-to-Server' credential type (Client Credentials) is the right choice for Bubble because Bubble's API Connector acts as a server making calls on your behalf — no user browser redirect needed.
Expected result: You have an Adobe Developer project with CC Libraries API enabled, and you have copied the Client ID and Client Secret.
Configure the Bubble API Connector to get an Adobe access token
Adobe's IMS (Identity Management System) requires you to exchange your Client ID and Client Secret for a time-limited access token. This token lasts approximately 24 hours and must be used in all subsequent CC Libraries API calls. You need to set this up in Bubble's API Connector. In your Bubble editor, go to the Plugins tab. If the API Connector is not installed, click Add plugins, search for 'API Connector' (by Bubble), and install it. Return to Plugins → API Connector → Add another API. Name this API 'Adobe IMS'. Add a call named 'Get Access Token': - Method: POST - URL: `https://ims-na1.adobelogin.com/ims/token/v3` - In the Body section (form-encoded, not JSON), add these parameters: - `grant_type`: `client_credentials` - `client_id`: your Adobe Client ID (you can mark this non-private since Client ID is a public identifier) - `client_secret`: your Adobe Client Secret (mark this as Private — it must never reach the browser) - `scope`: `openid,creative_sdk` - Set 'Use as': Action Click Initialize call with these real values filled in. Adobe will return a JSON response containing `access_token` (a long JWT string) and `expires_in` (typically 86399 seconds = ~24 hours). Bubble will detect the `access_token` field — you'll use this in the next step. Critically, the access token expires after ~24 hours. For a production Bubble app, you need a strategy to refresh it — either manually re-run the initialization, or (on a paid Bubble plan) create a scheduled Backend Workflow that runs every 23 hours to call this endpoint and save the new token to a Bubble data type.
1POST https://ims-na1.adobelogin.com/ims/token/v32Content-Type: application/x-www-form-urlencoded34grant_type=client_credentials5&client_id=YOUR_CLIENT_ID6&client_secret=<private>7&scope=openid%2Ccreative_sdk89Example response:10{11 "access_token": "eyJhbGciOiJSUzI1NiIsIn...",12 "token_type": "bearer",13 "expires_in": 8639914}Pro tip: Store the returned access_token in a Bubble database field (a 'Settings' or 'Config' data type with a single record) so all users and workflows share the same token without re-authenticating on every call.
Expected result: The 'Get Access Token' call is initialized and Bubble shows the access_token field in the response. You can now use this token in CC Libraries API calls.
Add CC Libraries API calls to fetch design assets
With an access token mechanism in place, configure the actual Creative Cloud Libraries API calls in Bubble. In the API Connector, click Add another API (separate from Adobe IMS). Name this API 'Adobe CC Libraries'. Configure a shared header: - Header key: `Authorization` - Header value: `Bearer {access_token}` — in Bubble's API Connector, you can make this a dynamic parameter so you paste in the token you stored in your Bubble database - Check the 'Private' checkbox on this header Base URL for calls: `https://cc-api-storage.adobe.io` Add a call named 'Get Library Elements': - Method: GET - URL: `/libraries/{libraryId}/elements` - Add a URL parameter `libraryId` so you can pass different library IDs dynamically from your Bubble workflows - Set 'Use as': Data To find your `libraryId`: open Adobe Creative Cloud on desktop, go to Libraries, right-click on a library → Copy link. The ID is embedded in the URL. Alternatively, call GET /libraries first to list all libraries and extract their IDs from the response. Initialize the call with a real libraryId from your Adobe account. Bubble will detect fields like element name, type (color, characterStyle, graphic), and thumbnail URLs. Color elements will have an RGB or hex value in their data attributes. Once initialized, you can bind a Bubble Repeating Group to this call to display color swatches, component names, or asset thumbnails pulled directly from your live Adobe CC Libraries.
1GET https://cc-api-storage.adobe.io/libraries/{libraryId}/elements2Headers:3 Authorization: Bearer <private>4 x-api-key: YOUR_CLIENT_ID56Example response:7{8 "items": [9 {10 "id": "element-uuid",11 "name": "Primary Blue",12 "type": "application/vnd.adobe.element.color+dcx",13 "representation": {14 "content_type": "application/vnd.adobe.color+json",15 "color": { "value": { "r": 0.0, "g": 0.4, "b": 0.9, "a": 1.0 } }16 }17 }18 ]19}Pro tip: The CC Libraries API also requires an `x-api-key` header set to your Client ID. Add this as a non-private shared header in the Adobe CC Libraries API group alongside the Authorization header.
Expected result: The Get Library Elements call is initialized and Bubble shows CC Library elements (colors, styles, graphics) from your Adobe account. Ready to display in a Bubble Repeating Group.
Build a Bubble design-system display page and handle token refresh
Now connect the CC Libraries API data to a visible page in your Bubble app. Go to the Design tab. On your target page, add a Repeating Group. Set: - Type of content: the Bubble data type from your initialized CC Libraries call - Data source: 'Get data from an external API' → Adobe CC Libraries - Get Library Elements → set the libraryId parameter dynamically (either hardcoded from a dropdown or from a URL parameter) Inside the Repeating Group's first cell, add: - A Text element bound to the element's name field - For color elements, add a Shape or Group with its background color set to a dynamic expression — Bubble can interpret hex color strings if you format the API response correctly - A Text element showing the element type For the token refresh problem: Adobe access tokens expire in ~24 hours. A simple production strategy is: 1. Create a Bubble data type called 'App Settings' with fields: adobe_access_token (text), token_expires_at (date) 2. After running the 'Get Access Token' call manually (or via a workflow), store the result and expiry time in this data type 3. In any workflow that calls the CC Libraries API, add a conditional step: 'If token_expires_at < Current date/time → run Get Access Token workflow first' 4. On paid plans, add a scheduled Backend Workflow that runs every 23 hours to auto-refresh the token RapidDev's team has built hundreds of Bubble apps with complex API integrations like this OAuth token management pattern — book a free scoping call at rapidevelopers.com/contact if you're building a design system tool or client portal on Bubble.
Pro tip: For most client-approval use cases, the design handoff path (Path A — export artboards as images) is significantly simpler than the CC Libraries API path and doesn't require token management. Consider Path A unless you specifically need live design token synchronization.
Expected result: A Bubble page displays Adobe CC Library elements (colors, styles, etc.) from live API data. The access token refresh strategy is implemented and the integration continues working after 24 hours.
Common use cases
Client design approval portal built in Bubble
Upload XD artboard exports as images to Bubble's file storage and display them in a Bubble app. Clients can browse mockups, click to enlarge them, and submit written feedback stored in Bubble's database — without needing an Adobe account.
Create a Bubble repeating group that shows XD artboard images uploaded to file storage, with a feedback form per image that saves to the database
Copy this prompt to try it in Bubble
Sync CC Library color tokens into a Bubble design-system tracker
Use the CC Libraries API to fetch your Adobe Creative Cloud color palette and typography scales, then store them in a Bubble data type. Display the design system in a Bubble internal tool so developers and designers can reference the same source of truth.
Fetch my Adobe CC Library elements via API and display each color swatch with its hex value in a Bubble grid
Copy this prompt to try it in Bubble
Portfolio showcase with live XD design asset previews
For freelance designers or agencies, build a Bubble portfolio app that surfaces exported XD design assets as downloadable files or gallery images, with project metadata (client name, date, category) managed in Bubble's database.
Build a Bubble portfolio page with a filterable gallery of design project images uploaded from XD exports
Copy this prompt to try it in Bubble
Troubleshooting
Adobe IMS token request returns 401 with 'invalid_client' error
Cause: The Client ID or Client Secret is incorrect, or the Adobe Developer project does not have the CC Libraries API enabled.
Solution: Return to developer.adobe.com, open your project, and verify the CC Libraries API is listed under 'Added APIs'. Re-copy the Client ID and Secret from the Credentials tab — paste them carefully with no extra spaces. Ensure you're using the 'Server-to-Server' credential type, not an API key credential.
CC Libraries API returns 401 'Unauthorized' after working for a day
Cause: The Adobe access token has expired. Adobe IMS tokens are valid for approximately 24 hours (86,399 seconds) and must be refreshed by requesting a new one with the client credentials.
Solution: Run the 'Get Access Token' call again in the API Connector to obtain a fresh token. Update the stored token in your Bubble 'App Settings' data type. Implement a scheduled Backend Workflow (paid Bubble plan) to auto-refresh the token every 23 hours to prevent expiry in production.
Attempting to embed an XD share link in a Bubble HTML element shows a blank or error screen
Cause: Adobe XD share links (xd.adobe.com) include X-Frame-Options or Content-Security-Policy headers that block iframe embedding. This is an Adobe server-side restriction, not a Bubble limitation.
Solution: Do not use iframe embeds for XD designs. Instead, use the design handoff path: export artboards as PNG/SVG files from XD, upload them to Bubble's file manager, and display them as Image elements. Alternatively, add a Button element in Bubble that links out to the XD share URL in a new tab.
Initialize call in Bubble returns 'There was an issue setting up your call' for the CC Libraries API
Cause: The Initialize call requires a real, successful API response. This usually means the access token in the Authorization header is expired, incorrect, or the libraryId parameter contains a value that doesn't match a real library on your account.
Solution: First verify your access token is fresh by re-running the 'Get Access Token' call. Then update the Authorization header value in the CC Libraries API call with the new token. For the libraryId, log into Adobe Creative Cloud, navigate to Libraries, and copy the ID from the URL of a library you own. Re-initialize with these real values.
Adobe XD is not available on my computer — I see a subscription prompt
Cause: Adobe discontinued XD as a standalone product in October 2023. XD is now only available as part of an Adobe Creative Cloud subscription (All Apps plan or single-app plan that includes XD).
Solution: If you don't have a CC subscription, consider Figma as a replacement — it's free for individual use, has an active development roadmap, and offers a simpler REST API for Bubble integrations. The Figma integration with Bubble is covered in the Figma tutorial on this site.
Best practices
- For most design-review use cases, export XD artboards as PNG/SVG files and host them in Bubble's file storage — this is simpler, faster, and requires no API credentials or token management.
- Never embed XD share URLs in Bubble iframes — Adobe's Content-Security-Policy blocks iframe embedding. Use link buttons or hosted image exports instead.
- Store your Adobe access token in a dedicated 'App Settings' Bubble data type with an expiry timestamp, and build a refresh workflow — tokens expire after ~24 hours and silent 401 errors will break your integration.
- Always mark the Adobe Client Secret and access token as Private in the Bubble API Connector — these credentials grant access to all CC Libraries on your account.
- Use the Client Credentials (Server-to-Server) OAuth flow, not the Authorization Code flow, when integrating with Bubble — Authorization Code requires a redirect URI that Bubble cannot handle natively without a paid-plan Backend Workflow proxy.
- Be aware that Adobe XD was discontinued in 2023 — if you're choosing a design tool now, Figma has a more actively maintained API and simpler Bubble integration path.
- Add Privacy Rules in Bubble's Data tab for any data types that store CC Library tokens or design asset metadata — do not leave these accessible to unauthenticated users.
- Test the CC Libraries API using Adobe's API documentation and a tool like Postman before configuring it in Bubble, so you know what a valid response looks like before attempting to initialize the call.
Alternatives
Figma is the actively maintained, industry-standard alternative to Adobe XD. Its REST API uses a simple personal access token (no OAuth dance), its share links can sometimes be iframed, and it has a larger ecosystem of Bubble-friendly integration patterns. If you're choosing a design tool today, Figma is the recommended choice for Bubble integrations.
Sketch has a token-based REST API (Sketch Cloud) that is simpler to configure in Bubble than Adobe XD's OAuth 2.0 flow. Sketch is Mac-only for the design app but the Cloud API is platform-agnostic. If your team is Mac-based and prefers Sketch, the Bubble integration is more straightforward than XD.
Zeplin is a design handoff tool (not a design editor) that exports specs from XD, Figma, or Sketch and exposes them via a REST API. If your goal is to display design specs and approval workflows in Bubble, Zeplin's API may be a cleaner path than Adobe's CC Libraries API — especially if designers already use Zeplin for developer handoff.
Frequently asked questions
Is Adobe XD still available in 2026?
Adobe XD is available but only as part of an Adobe Creative Cloud subscription — it was discontinued as a standalone product in October 2023. If you have a Creative Cloud plan (All Apps at ~$55/mo or a single-app plan), XD is included. However, Adobe has significantly slowed XD development. Many design teams have migrated to Figma, which is more actively developed and has a simpler API for Bubble integration.
Can I embed an Adobe XD prototype directly in a Bubble app?
No. Adobe XD share links (xd.adobe.com) are blocked from iframe embedding by Adobe's X-Frame-Options and Content-Security-Policy headers. Attempting to embed them in a Bubble HTML element will result in a blank screen or browser error. The correct approach is to export artboards as PNG/SVG and host them in Bubble's file storage, or use a link button to open the XD prototype in a new tab.
Do I need a paid Bubble plan to connect to Adobe XD?
For the design handoff path (exporting artboards and uploading to Bubble), no paid plan is needed. For the CC Libraries API path using outbound API Connector calls, no paid plan is needed either. A paid Bubble plan is only required if you want to automatically refresh your Adobe access token on a schedule using Backend Workflows, or if you need to receive inbound webhooks from Adobe services.
Why does the Adobe IMS token expire and how do I handle it in Bubble?
Adobe IMS access tokens expire after approximately 24 hours as a security measure. In Bubble, the simplest handling is to store the token in a 'App Settings' data type record with an expires_at timestamp. Before any workflow that calls the CC Libraries API, add a conditional step: if the token is expiring within the next hour, run the Get Access Token call first and update the stored token. On paid Bubble plans, a scheduled Backend Workflow can refresh the token automatically every 23 hours.
What is the difference between the design handoff path and the CC Libraries API path?
The design handoff path requires no API: you export XD artboards as image files (PNG/SVG) and upload them manually to Bubble's file storage. It's a one-time manual sync. The CC Libraries API path connects Bubble to Adobe's cloud-hosted design libraries dynamically — color palettes and design tokens are fetched live from Adobe's servers. The API path is appropriate when your Bubble app needs to stay in sync with evolving design system data; the handoff path is appropriate for static approval workflows.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation