Workflow Action not showing API Parameters despite successful API Connector initialization

Hello everyone,

I’m facing a very frustrating issue with my Bubble application and I’m hoping someone here might have encountered something similar or can offer a fresh perspective.

The Problem: I have an API call (Metabase_GenerateURL under Metabase_Bubble plugin) configured as an “Action” in the API Connector. The purpose of this API is to generate an embedded Metabase URL. When I initialize this API call with dummy values (with parameters temporarily set to non-private), it successfully returns Status code 200 OK. This confirms that the API endpoint itself is working and returning the expected data. However, after setting the parameters back to “Private” and saving the API Connector configuration, when I try to use this API call in a Workflow (specifically, on Page is loaded event for my dashboard page), the “Parameters” section for this API action is completely missing in the Workflow editor’s property editor. This prevents me from passing dynamic data from the page URL to the API call.

My Setup:

  • API Provider: Supabase Edge Function (generate-url)
  • Bubble API Connector (Metabase_Bubble - Metabase_GenerateURL):
    • Method: GET
    • URL: https://oahnmyfalnhdkoihrswh.functions.supabase.co/functions/v1/generate-url
    • Use as: Action (This is crucial; it does not work as “Data” either, returning “Missing data” error when trying to fetch data from external API in workflow).
    • Authentication: Bearer Token (Authorization header Bearer {SUPABASE_SERVICE_ROLE_KEY} is correctly set)
    • Parameters:
      • dashboard_id (Private: Yes, Type: number)
      • store_id (Private: Yes, Type: text)
      • date (Private: Yes, Type: text, e.g., past12months)
      • brand (Private: Yes, Type: text, e.g., null)
    • Initialization Status:
      • With private parameters: Status code 400 (“Missing required query parameters” - expected)
      • With non-private dummy values: Status code 200 OK (initialization succeeds)
  • Workflow (dashboard page - Page is loaded event):
    • Step 1: Metabase_Bubble - Metabase_GenerateURL (Action)
    • Problem: When I click this action, the right-hand panel does not show any “Parameters” section. Only the “Authorization” header is displayed.

What I’ve tried (and confirmed):

  1. API Connector Initialization: I have repeatedly (and successfully) initialized the API call by temporarily making parameters non-private and providing dummy values. After successful initialization, I always revert the parameters to “Private” and save the API Connector configuration.
  2. Browser Cache/Cookies: I have extensively cleared my browser’s cache and cookies, and restarted the browser multiple times.
  3. Bubble Editor Restart: I have closed and reopened the Bubble editor multiple times.
  4. Workflow Action Re-addition: I have deleted the API action from the workflow and re-added it, but the “Parameters” section still does not appear.
  5. Supabase Edge Function Validation:
  • The Edge Function itself is deployed.
  • I can successfully call the Edge Function directly using curl with parameters and the Service Role Key, and it returns Status code 200 OK with the expected JWT.
  • Supabase logs show no critical errors for the Edge Function when called. (Previously, I had some 503 Function failed to start and Module not found errors, but these have been resolved and confirmed via curl tests.)
  1. “Use as” type: I understand that “Action” is the correct type for dynamic parameter passing in workflows. My previous attempt to change it to “Data” also failed, indicating the core issue is likely with Bubble recognizing the API structure.

I am running out of ideas on why the “Parameters” section is not appearing in the Workflow editor for an API call that successfully initializes. This is a critical blocker for passing dynamic data to my Metabase embeds.

Has anyone encountered this specific issue where API Parameters are missing in the Workflow editor, even after successful API Connector initialization? Any insights or suggestions would be greatly appreciated.

Thank you in advance for your help!

Best regards,

You already have your issue in your topic. Private checkbox will remove parameters. Private parameters are only set in API connector. Remove private checkbox.

Hi,
Yes, i know Private checkbox will become removal trigger.

I’ve tried to untick checkbox, and it become a returning API.

However still it will be not showing data on iframe at Bubble.

My goal is show Metabase data on Bubble iframe.

Best regards

2025年6月2日(月) 0:03 Jici via Bubble Forum <notifications@forum.bubble.io>:

Please post screenshot of your settings

Hi,

Here i attached some.
Plug in

Bubble setting apparence

If you need DB code, please let me know.

Best regards
Masaru

2025年6月2日(月) 8:03 Jici via Bubble Forum <notifications@forum.bubble.io>:

So now you should be able to fill dynamically your fields. How your iframe “dashboard iframe_url” is linked to your API Call? You didn’t show anything about that.. I guess your API call return an url? Did you inspect in debug mode step by step the result of your api call?

Thank you for your continued help! You are absolutely right to focus on the link between the API call and the iframe, and the debug mode.

You’re correct, my API call (Metabase_GenerateURL) does return a URL. My goal is to use this URL in the src attribute of the iframe.

Here’s how I’m trying to link them and what I’ve observed:

1. Linking the iframe src to the API Call Result:

In my HTML element where the iframe is displayed (as shown in image_823d9f.png), the src attribute is set dynamically. After the API call Metabase_Bubble - Metabase_GenerateURL runs in the workflow, I’m attempting to set the iframe’s src to the result of that API call.

I am currently setting the src of the iframe using a dynamic expression like this:

`HTML<iframe
src=“[Result of Step 1 (Metabase_GenerateURL)'s URL field]”
width=“100%”
height=“600px”
style=“border:none;”

`

(Self-correction/Clarification based on a common Bubble pattern): More precisely, I’m expecting to access the returned URL from the API call (which is an action) through a “Result of step X” type expression within the HTML element’s properties. So, the src value in the HTML editor would look something like src="This API Call's URL" or src="Result of Metabase_GenerateURL's URL".

2. Debug Mode Inspection:

This is where I’ve been focusing my debugging efforts.

  • When I run the application in debug mode (step-by-step):
    • I can see the Page is loaded workflow trigger.
    • Step 1: Metabase_Bubble - Metabase_GenerateURL executes.
    • Observation: When I inspect the result of this step in the debugger, I do see a URL being returned. The URL looks correct and appears to be a valid Metabase embed URL (e.g., https://metabase.mydomain.com/embed/dashboard/xxxxxxxx#bordered=true&titled=true).
    • However, despite the API call successfully returning a URL in the debugger, the iframe on the page remains blank or shows a loading spinner indefinitely, without rendering the Metabase dashboard.

This leads me to believe that while the API call is working and returning the URL, there might be an issue with:

  • How Bubble is passing this dynamic URL to the iframe’s src attribute.
  • Security restrictions (like content security policy - CSP) preventing the iframe from loading content from the Metabase domain.
  • An issue with Metabase’s embedding logic itself that isn’t surfacing as an error in Bubble’s debugger.

I’ve made sure that the API parameters are not set to “Private” in the API Connector configuration, allowing me to pass dynamic data from the page URL (e.g., store_id, dashboard_id) to the API call.

Could there be something I’m missing regarding how Bubble handles dynamic values in iframe src attributes, or perhaps a Metabase embedding requirement that isn’t immediately obvious?

Thank you again for your time and suggestions!

You can’t access the result of step X in an element. This is only available in the same workflow you are calling the API.
There’s two solutions
A) Change the type of API call to DATA and use Get data from API instead in your HTML element
B) Create a state in your HTML elment. After your api Call, use set state on this element’s state and you can use result of step API call’s url. In the Element, reference the element state dynamically.

Do you have any API doc link?

Thank you for the question about API documentation.

Given the current context of the issue, I believe the most relevant information would be core logic of my Supabase Edge Function. I hope these links and code snippets will be helpful in understanding the integration better.

. Core Logic of Supabase Edge Function (generate-url) (TypeScript/JavaScript): This function is responsible for generating the Metabase embed URL with the necessary JWT.

`TypeScript// This is a simplified example. The actual code might be more complex.
import { serve } from “https://deno.land/std@0.168.0/http/server.ts”;
import { createClient } from “https://esm.sh/@supabase/supabase-js@2”;
import { sign } from “https://deno.land/x/djwt@v2.7/mod.ts”;

// Retrieve Metabase secret key and URL from environment variables
const METABASE_SECRET_KEY = Deno.env.get(“METABASE_SECRET_KEY”) || “”;
const METABASE_SITE_URL = Deno.env.get(“METABASE_SITE_URL”) || “”;

serve(async (req) => {
try {
const { searchParams } = new URL(req.url);
const dashboard_id = searchParams.get(“dashboard_id”);
const store_id = searchParams.get(“store_id”);
const date = searchParams.get(“date”);
const brand = searchParams.get(“brand”); // Consider ‘null’ as a string

if (!dashboard_id || !store_id) {
  return new Response(
    JSON.stringify({ error: "Missing required query parameters: dashboard_id, store_id" }),
    { status: 400, headers: { "Content-Type": "application/json" } }
  );
}

// Construct Metabase embedding parameters (payload)
// Convert 'null' string for brand to actual null
const payload = {
  resource: { dashboard: parseInt(dashboard_id) },
  params: {
    store_id: store_id,
    date: date || undefined, // undefined if date is not provided
    brand: brand === 'null' ? null : brand || undefined, // Convert 'null' string to null
  },
  exp: Math.round(Date.now() / 1000) + (60 * 10), // Token expires in 10 minutes
};

// Generate the JWT
const token = await sign(
  { alg: "HS256", typ: "JWT" },
  payload,
  METABASE_SECRET_KEY
);

// Construct the embed URL
const embedUrl = `${METABASE_SITE_URL}/embed/dashboard/${token}#bordered=true&titled=true`;

return new Response(JSON.stringify({ url: embedUrl }), {
  status: 200,
  headers: { "Content-Type": "application/json" },
});

} catch (error) {
console.error(“Error in Edge Function:”, error.message);
return new Response(
JSON.stringify({ error: Internal Server Error: ${error.message} }),
{ status: 500, headers: { “Content-Type”: “application/json” } }
);
}
});`

I hope this information helps in understanding the API integration better.

This error come from your supabase edge function. It’s hard to debug here without all the data. But check if you are providing all requested data from API Call.

Thank you for the insight. I understand that the issue might be on the Supabase Edge Function side, potentially due to missing or improperly provided parameters from the API call.

I am currently attempting to pass the following parameters from Bubble to the Supabase Edge Function, which should match the parameters configured in my Metabase_GenerateURL API call:

  • dashboard_id (Type: number)
  • store_id (Type: text)
  • date (Type: text, e.g., “past12months”)
  • brand (Type: text, e.g., null or a specific brand name)

These parameters are configured in the API Connector with the “Private” checkbox unchecked, and I’m passing them dynamically from the HTML element’s src attribute using “Get data from an external API”.

Regarding the current debugging status, here’s what I’ve observed:

  1. API Call Result in Bubble’s Debug Mode:
  • In the debugger, the Metabase_Bubble - Metabase_GenerateURL action itself appears as “Successful,” and a URL seems to be returned in the url field.
  • However, when I try to open that returned URL directly in a browser, I sometimes get a “Missing required query parameters” error (or a similar error from the Metabase side). This suggests that the URL might already be incomplete before being passed to the Edge Function by Bubble.
  1. Supabase Edge Function Logs:
  • I’ve checked the logs for the generate-url function within my Supabase project’s “Edge Functions” section.
  • Normally, if an error occurs, the logs would provide detailed information (e.g., which parameter is missing, TypeScript errors, etc.). Currently, there are no significant errors showing in the logs.
  • (If any specific error logs were present, I’d be ready to share their content.)

Could you please help me confirm the following points?

  • Aside from the four parameters listed above, are there any other required parameters that the Edge Function expects based on the code example I previously shared?
  • Regarding the brand parameter, which can be null or an empty string, how should it be passed from Bubble to ensure it’s handled correctly by the Edge Function (e.g., should it be undefined, actual null, or an empty string from Bubble’s side)?

I suspect the core issue might be related to how the parameter values are being passed from Bubble to the Edge Function, or a potential type mismatch that the Edge Function expects.

I hope this additional information helps in diagnosing the issue further.