Skip to main content
RapidDev - Software Development Agency
bubble-integrationsBubble API Connector

Reddit Ads

Connect Bubble to the Reddit Ads API using two API Connector entries: one to fetch OAuth2 access tokens with Private client credentials, and one for actual campaign data calls using the token stored in a Data Type. Tokens expire after one hour — a Backend Workflow must check and refresh the token before every data call. Crucially, Reddit Ads API requires separate approval beyond a standard Reddit developer app, which is the most commonly missed step.

What you'll learn

  • Why Reddit Ads API requires a separate approval step beyond a standard Reddit developer app
  • How to configure two separate API Connector entries: one for token authentication, one for campaign data
  • How to store an expiring OAuth2 token in a Bubble Data Type for reuse across workflows
  • How to build a token-refresh Backend Workflow that runs before every Ads API call
  • How to handle Reddit Ads API microdollar currency values (divide by 1,000,000 before displaying)
  • How to build a campaign performance dashboard in Bubble with spend, impressions, and CPC
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced19 min read4–6 hoursMarketingLast updated July 2026RapidDev Engineering Team
TL;DR

Connect Bubble to the Reddit Ads API using two API Connector entries: one to fetch OAuth2 access tokens with Private client credentials, and one for actual campaign data calls using the token stored in a Data Type. Tokens expire after one hour — a Backend Workflow must check and refresh the token before every data call. Crucially, Reddit Ads API requires separate approval beyond a standard Reddit developer app, which is the most commonly missed step.

Quick facts about this guide
FactValue
ToolReddit Ads
CategoryMarketing
MethodBubble API Connector
DifficultyAdvanced
Time required4–6 hours
Last updatedJuly 2026

Build a Reddit Ads campaign dashboard with OAuth2 token management in Bubble

Reddit Ads offers subreddit-based and interest-based targeting that is uniquely valuable for reaching niche communities — a targeting approach no other major ad platform replicates. Building a custom dashboard in Bubble lets your team monitor campaign performance, pull spend and impression data, and compare ad groups without logging in to Reddit Ads Manager.

The integration has two layers of complexity that most tutorials skip. First: Reddit Ads API access is not granted automatically when you create a Reddit developer app. You must apply for Ads API access separately through ads.reddit.com and wait 1-5 business days for approval. Attempting to call ads-api.reddit.com without this approval returns a 403 error with no helpful message — this is the most commonly missed setup step.

Second: Reddit's access tokens expire after exactly one hour. Bubble has no built-in token refresh mechanism, so your Backend Workflow architecture must check the token's expiry timestamp and fetch a new one before every Ads API call. Getting this right from the start saves you from mysterious 401 errors that appear only after the first hour of use.

This integration requires a paid Bubble plan for the Backend Workflow that handles token management.

Integration method

Bubble API Connector

Two Bubble API Connector entries handle the Reddit Ads integration: a Private-credential token endpoint that exchanges client_id and client_secret for a Bearer token, plus the main Ads API calls that use the dynamically stored token.

Prerequisites

  • A Reddit account and a developer app created at reddit.com/prefs/apps (type: 'script' for internal/server use)
  • Approved Reddit Ads API access — apply at ads.reddit.com → Developer Tools (separate from the developer app, takes 1-5 business days)
  • A Reddit Ads account with at least one campaign (needed for API call initialization)
  • Your Reddit Ads Account ID (visible at ads.reddit.com in the URL or account settings)
  • A paid Bubble plan (Starter $32/mo+) — Backend Workflows are required for server-side token refresh and are not available on the free Bubble tier

Step-by-step guide

1

Create a Reddit developer app and apply for Ads API access

There are two separate steps here that are commonly conflated. You need both completed before any API call will work. Step A — Create a Reddit developer app: Go to reddit.com/prefs/apps while logged in to your Reddit account. Click 'Create an app' or 'Create another app'. Give it a name (e.g., 'Bubble Ads Dashboard'). Select the type 'script' — this is for internal server-to-server use where you control both sides. You do not need a redirect URI for the client credentials flow. Click 'Create app'. Note your client_id (shown under the app name, a short alphanumeric string) and generate a client_secret by clicking 'Edit'. Store both securely. Step B — Apply for Reddit Ads API access: Having a developer app is NOT sufficient to call ads-api.reddit.com. You need separate Ads API approval. Go to ads.reddit.com, log in, and look for 'Developer Tools' or 'API Access' in the account settings. Submit an application for API access. Reddit typically approves these in 1-5 business days. Until approval is granted, any call to ads-api.reddit.com returns a 403 with no helpful explanation. Do not proceed with the Bubble configuration until you have received Ads API approval — you cannot test or initialize calls without it.

Pro tip: The Ads API approval wait time (1-5 business days) is your longest blocker. Submit the approval request first, then use the waiting period to build the Bubble data types and API Connector configuration. You can complete steps 2-4 before approval arrives and only initialize the calls once approved.

Expected result: You have a Reddit developer app with a client_id and client_secret. You have submitted for Reddit Ads API access and received approval confirmation from Reddit.

2

Configure two API Connector entries: token endpoint and Ads data

The Reddit Ads integration requires two separate API Connector entries because the token fetch URL (reddit.com) and the campaign data URL (ads-api.reddit.com) are different domains with different authentication schemes. Entry 1 — 'Reddit Auth': In the API Connector, click 'Add another API'. Name it 'Reddit Auth'. Set Base URL to https://www.reddit.com. Under 'Add a shared header', add: Authorization with value Basic [base64(client_id:client_secret)]. To compute the base64 value, open your browser console and run: btoa('your-client-id:your-client-secret'). Paste the output. The full header value looks like: Basic dXNlcjpwYXNzd29yZA==. Check 'Private' on this header. Add one API call under Reddit Auth named 'get_token': POST /api/v1/access_token. Set 'Use as' to Action. Add a body parameter: grant_type = client_credentials (non-private, static value). Initialize the call after completing Entry 2 setup. Entry 2 — 'Reddit Ads Data': Click 'Add another API'. Name it 'Reddit Ads Data'. Set Base URL to https://ads-api.reddit.com/api/v3. Under 'Add a shared header', add: Authorization with value Bearer [token] — but do NOT mark this Private, because the value is dynamic (it comes from your stored Reddit_Token Data Type at runtime, not a static secret). The client credentials that generate the token are in Entry 1 as Private — the token itself is just a runtime value.

reddit-ads-api-connector-config.txt
1Entry 1: Reddit Auth
2Base URL: https://www.reddit.com
3Shared Header:
4 Key: Authorization
5 Value: Basic [btoa('client_id:client_secret')]
6 Private: YES
7
8API Call: get_token
9 Method: POST
10 Path: /api/v1/access_token
11 Use as: Action
12 Body param: grant_type = client_credentials
13
14Token response shape:
15{
16 "access_token": "eyJhbGciOi...",
17 "token_type": "bearer",
18 "expires_in": 3600,
19 "scope": "*"
20}
21
22Entry 2: Reddit Ads Data
23Base URL: https://ads-api.reddit.com/api/v3
24Shared Header:
25 Key: Authorization
26 Value: Bearer [dynamic_token_from_data_type]
27 Private: NO (runtime value, not a secret)

Pro tip: To compute the Basic Auth base64 string, open your browser developer tools (F12), go to the Console tab, and type: btoa('YOUR_CLIENT_ID:YOUR_CLIENT_SECRET'). Copy the output string. The full header value must be: Basic [output] — including the word 'Basic' and a space before the base64 string.

Expected result: Two API Connector entries exist: 'Reddit Auth' with a Private Basic Authorization header, and 'Reddit Ads Data' with a dynamic Bearer Authorization header. The get_token call is configured but not yet initialized.

3

Create the Reddit_Token Data Type and Refresh Backend Workflow

The token storage and refresh pattern is the backbone of this integration. Create it before testing any Ads data calls. In Bubble's Data tab, create a new Data Type called 'Reddit_Token' with these fields: - token: Text (the Bearer token string) - expires_at: Date (when the token expires) This Data Type will hold exactly one row — the current active token. You never need more than one. Go to Backend Workflows (left sidebar → Backend Workflows tab). Create a new API Workflow named 'Refresh_Reddit_Token'. This workflow takes no inputs. Step 1: Check if current token is expired. Add a Conditional: 'Only when: Search for Reddit_Token items:first item's expires_at < Current date/time'. This step only runs if the token is expired or missing. Step 2 [Only when expired]: Call API → Reddit Auth - get_token. Result name: new_token. Step 3 [Only when Step 2 ran]: Check if a Reddit_Token record exists. If yes, update it: Make changes to Search for Reddit_Token:first item → set token = Result of Step 2's access_token, expires_at = Current date/time + 3600 seconds. If no, create a new Reddit_Token thing with the same values. In every Bubble Workflow or Backend Workflow that calls Reddit Ads Data, the very first step must be: Schedule API Workflow → Refresh_Reddit_Token → run now (or 'Run directly'). After that step completes, subsequent steps can safely use the stored token.

reddit-token-refresh-workflow.txt
1Data Type: Reddit_Token
2Fields:
3 - token: Text
4 - expires_at: Date
5
6Backend Workflow: Refresh_Reddit_Token
7Inputs: none
8
9Step 1 [Only when: Search Reddit_Token:first item's expires_at < Current date/time OR Search Reddit_Token count = 0]:
10 Call API Reddit Auth - get_token
11 Result name: new_token
12
13Step 2 [Only when Step 1 ran, Reddit_Token count > 0]:
14 Make changes to Search Reddit_Token:first item
15 token: new_token's access_token
16 expires_at: Current date/time + 3600 seconds
17
18Step 3 [Only when Step 1 ran, Reddit_Token count = 0]:
19 Create new Reddit_Token
20 token: new_token's access_token
21 expires_at: Current date/time + 3600 seconds

Pro tip: Backend Workflows require a paid Bubble plan (Starter $32/mo+). The 'Workflow API' must also be enabled in Settings → API → 'This app exposes a Workflow API'. Enable it before testing the refresh flow. RapidDev's team has built this token-management pattern for multiple Bubble OAuth integrations — reach out at rapidevelopers.com/contact if you need help adapting it for your specific dashboard structure.

Expected result: The Refresh_Reddit_Token Backend Workflow runs successfully, creating or updating a Reddit_Token record with a fresh access token and an expires_at timestamp 3,600 seconds in the future.

4

Add Reddit Ads campaign data API calls

With the token infrastructure in place, add the actual campaign data calls to the 'Reddit Ads Data' API Connector entry. Call 1 — 'get_campaigns': GET /ad_accounts/[account_id]/campaigns Add [account_id] as a dynamic path parameter. In the Authorization header value, type: Bearer followed by a space, then reference the stored token dynamically. In the API Connector, set the Authorization header value to: Bearer [initial_test_token]. For initialization, temporarily use a real access token you generate manually by calling the get_token workflow — copy the returned token and paste it as the header value for initialization only. After initialization, you will update workflows to pull the token from the Reddit_Token Data Type dynamically. Use as: Data. Call 2 — 'get_ad_groups': GET /ad_accounts/[account_id]/ad_groups Same pattern with account_id parameter. Use as: Data. Call 3 — 'get_reports': GET /ad_accounts/[account_id]/reports Add query params: start_time, end_time (ISO 8601 date strings), level (campaign or ad_group), fields (comma-separated metrics: impressions,clicks,spend,cpm,cpc). Use as: Data. Critical note on currency: All spend and bid values in the Reddit Ads API are returned in microdollars (1,000,000 = $1.00). A $5.00 spend appears as 5000000. Always divide these values by 1,000,000 before displaying. In Bubble, use the ':divided by 1000000' operator on the spend field in your text elements and workflows.

reddit-ads-data-calls.txt
1Call 1: GET https://ads-api.reddit.com/api/v3/ad_accounts/[account_id]/campaigns
2Headers: Authorization: Bearer [dynamic: Search Reddit_Token:first item's token]
3Path param: account_id (non-private)
4Use as: Data
5
6Call 2: GET https://ads-api.reddit.com/api/v3/ad_accounts/[account_id]/ad_groups
7Headers: Authorization: Bearer [dynamic: Search Reddit_Token:first item's token]
8Use as: Data
9
10Call 3: GET https://ads-api.reddit.com/api/v3/ad_accounts/[account_id]/reports
11Headers: Authorization: Bearer [dynamic: Search Reddit_Token:first item's token]
12Query params:
13 start_time: 2026-07-01T00:00:00Z (dynamic)
14 end_time: 2026-07-07T23:59:59Z (dynamic)
15 level: campaign
16 fields: impressions,clicks,spend,cpm,cpc
17Use as: Data
18
19Microdollar conversion example:
20 API value: 5000000 Display: 5000000 / 1000000 = $5.00
21 In Bubble text: Result of Step 1's spend / 1000000 (formatted as $#,##0.00)

Pro tip: For the API Connector initialization step, temporarily hard-code a freshly generated access token in the Authorization header to get field types detected. After initialization, your Workflows will override this header value at runtime using the stored Reddit_Token. The hard-coded value in the API Connector settings is never used in production — it only serves initialization.

Expected result: All three Ads data calls are initialized with correct field types detected. Campaign names, impressions, clicks, and spend (as raw microdollar numbers) are visible in the detected fields list.

5

Build the token-refresh-then-fetch workflow

Every workflow that calls Reddit Ads data must run the token refresh check first. Here is the complete pattern for a 'Load Campaigns' button: Workflow: 'Load Campaigns' button is clicked Step 1: Schedule API Workflow → Refresh_Reddit_Token, run now. Step 2: Call API → Reddit Ads Data - get_campaigns, account_id = App Constant REDDIT_ADS_ACCOUNT_ID, Authorization header override = 'Bearer ' + Search for Reddit_Token items:first item's token. Step 3: For each campaign in the result, create a 'Campaign' Data Type record (if not already stored) or update the existing one. Fields: campaign_name (text), campaign_id (text), status (text), impressions (number), clicks (number), spend (number — stored as microdollars, converted on display), fetched_date (date). For the Repeating Group displaying campaigns: bind data source to 'Do a search for Campaign items where fetched_date > Current date/time - 1 day, sorted by spend descending'. In the spend text element, add ':divided by 1000000' and format as $#,##0.00. For CTR (click-through rate), compute it dynamically: 'Current cell's Campaign's clicks / Current cell's Campaign's impressions * 100' formatted as a percentage.

load-campaigns-workflow.txt
1Workflow: Button 'Load Campaigns' clicked
2
3Step 1: Run backend workflow Refresh_Reddit_Token
4
5Step 2: Call API Reddit Ads Data - get_campaigns
6 account_id: App Constant 'REDDIT_ADS_ACCOUNT_ID'
7 Authorization: Bearer [Search Reddit_Token:first item's token]
8 Result name: campaigns_result
9
10Step 3 [Repeat for each in campaigns_result's data]:
11 Create or update Campaign record:
12 campaign_id: current item's id
13 campaign_name: current item's name
14 status: current item's status
15 fetched_date: Current date/time
16
17Repeating Group display:
18 Data source: Search Campaign items, sort by spend desc
19 Spend text: Current cell's Campaign's spend / 1000000
20 Format: $#,##0.00
21 CTR text: (Current cell's Campaign's clicks / Current cell's Campaign's impressions) * 100
22 Format: #0.00%

Pro tip: Add a 'Last updated' text element that shows 'As of [Search Reddit_Token:first item's expires_at - 3600 seconds formatted as time]' — this tells users when the data was last refreshed without revealing token expiry internals.

Expected result: Clicking 'Load Campaigns' always returns current data regardless of when the button was last clicked. Token refresh happens automatically in the background before the data call.

6

Display spend reports and handle microdollar conversion

Performance reporting is the most common use case for this integration. The get_reports endpoint returns time-series data for impressions, clicks, spend, CPM, and CPC — all spend values in microdollars. Build a date range selector on your Bubble page using two Date Picker elements: 'Start Date' and 'End Date'. Add a 'Get Report' button with this workflow: Step 1: Refresh_Reddit_Token (same as above). Step 2: Call API → Reddit Ads Data - get_reports, account_id = App Constant, start_time = Start Date Picker's value formatted as ISO 8601, end_time = End Date Picker's value formatted as ISO 8601, level = 'campaign', fields = 'impressions,clicks,spend,cpm,cpc'. Step 3: For each item in the result, create a Report_Snapshot Data Type record: date (text), impressions (number), clicks (number), raw_spend (number in microdollars), cpm (number), cpc (number). In the Repeating Group displaying report data, all spend fields use ':divided by 1000000'. Add summary totals using Bubble's ':sum' operator on the raw_spend field, then divide the sum by 1000000 for the total spend display. A common gotcha: Bubble's Number field type handles up to approximately 15 significant digits. Reddit microdollar values for large campaigns (e.g., $10,000 spend = 10,000,000,000 microdollars) stay within this range safely, but always verify your data type field is set to Number (not Text) to enable arithmetic operations in Bubble.

report-workflow.txt
1Workflow: Button 'Get Report' clicked
2
3Step 1: Run backend workflow Refresh_Reddit_Token
4
5Step 2: Call API Reddit Ads Data - get_reports
6 account_id: App Constant 'REDDIT_ADS_ACCOUNT_ID'
7 start_time: StartDatePicker's value (formatted: YYYY-MM-DDTHH:mm:ssZ)
8 end_time: EndDatePicker's value (formatted: YYYY-MM-DDTHH:mm:ssZ)
9 level: campaign
10 fields: impressions,clicks,spend,cpm,cpc
11 Authorization: Bearer [Search Reddit_Token:first item's token]
12
13Step 3: Create Report_Snapshot records from result
14
15Repeating Group totals:
16 Total Spend: Search Report_Snapshot:sum of raw_spend / 1000000
17 Format: $#,##0.00
18 Total Impressions: Search Report_Snapshot:sum of impressions
19 Average CTR: (sum of clicks / sum of impressions) * 100
20 Format: #0.00%

Pro tip: Store raw microdollar values in the Report_Snapshot Data Type — not converted dollar amounts. This lets you compute accurate sums using Bubble's :sum operator and convert to dollars only at the display layer. Converting to dollars before storage can introduce floating-point precision issues.

Expected result: The report page shows formatted spend in dollars, total impressions, and average CTR for the selected date range. All currency values are correctly divided from microdollars.

Common use cases

Campaign performance dashboard with real-time spend tracking

Build an internal Bubble dashboard that pulls Reddit Ads campaign data — impressions, clicks, spend, CPM, and CPC — on demand. Display results in a Repeating Group with color-coded spend indicators and trend data. Because the token refresh logic runs automatically before every data call, the dashboard always shows current data without manual token management.

Bubble Prompt

Build a Bubble admin page that fetches all active Reddit Ads campaigns for my ad account, displays spend (formatted as dollars), impressions, clicks, and CPC in a sortable table, and shows a 'Last refreshed' timestamp. Token refresh should happen automatically before each data load.

Copy this prompt to try it in Bubble

Niche community ad group performance analyzer

Reddit's subreddit targeting means performance varies dramatically between communities. Build a Bubble tool that pulls ad group data segmented by subreddit target, letting your marketing team identify which communities convert best and reallocate budget accordingly — all from inside your internal tools rather than Reddit Ads Manager.

Bubble Prompt

Create a Bubble page that lists all ad groups under a specific Reddit Ads campaign, shows their target subreddits, spend, and click-through rates, and highlights ad groups with CTR below 0.5% in red so I can pause underperformers without visiting Reddit Ads Manager.

Copy this prompt to try it in Bubble

Automated weekly Reddit Ads performance report

Schedule a Bubble Backend Workflow to run every Monday that fetches the previous week's Reddit Ads performance data, stores the results in a Report Data Type, and sends an email digest to your marketing team — eliminating the need for manual report exports from the Reddit Ads dashboard each week.

Bubble Prompt

Build a Bubble Backend Workflow that runs on a weekly schedule, fetches last week's Reddit Ads performance report (impressions, clicks, spend by campaign), creates a Report record in Bubble, and triggers a 'Send Email' action to the marketing team with a formatted summary.

Copy this prompt to try it in Bubble

Troubleshooting

All calls to ads-api.reddit.com return 403 Forbidden even with a valid access token

Cause: Reddit Ads API access requires a separate approval from standard Reddit API access. Creating a developer app at reddit.com/prefs/apps does not grant access to ads-api.reddit.com. This 403 is not a token issue — it is an account authorization issue.

Solution: Go to ads.reddit.com and navigate to Developer Tools or API Access in your account settings. Submit an application for Reddit Ads API access if you have not done so. Wait for approval (typically 1-5 business days). Once approved, your existing client_id and client_secret will work for Ads API calls without any changes to your Bubble configuration.

Campaign data loads correctly for the first hour then starts returning 401 Unauthorized

Cause: The access token has expired after its 3,600-second lifetime. The Refresh_Reddit_Token Backend Workflow is either not running before data calls, or the token in the Reddit_Token Data Type was not updated correctly.

Solution: In every Workflow that calls Reddit Ads Data, confirm Step 1 is 'Run Refresh_Reddit_Token' (or 'Schedule API Workflow → Refresh_Reddit_Token → run now'). Check the Bubble Logs tab → Workflow logs to confirm the Backend Workflow is executing before the data call steps. Also verify the Reddit_Token Data Type record exists and its expires_at field is updating correctly after each token refresh. If the Reddit_Token record has no data, the refresh workflow may have failed silently — check the Backend Workflow logs for error details.

Spend values in the dashboard show absurdly large numbers like '5000000' instead of '$5.00'

Cause: Reddit Ads API returns currency values in microdollars (1,000,000 = $1.00). The conversion step (':divided by 1000000') is missing in the display text or data processing workflow.

Solution: In every Bubble text element that displays spend, CPM, or CPC values, add ':divided by 1000000' to the dynamic expression. For example: 'Current cell's Campaign's spend / 1000000' formatted as $#,##0.00. If you stored values in a Data Type for later display, ensure the division happens at the display layer (not the storage layer) to preserve accurate arithmetic on the raw values.

Backend Workflows are not available or the Workflow API URL is not accessible

Cause: Backend Workflows require a paid Bubble plan. The free Bubble tier does not expose the Workflow API endpoint (api/1.1/wf/), so Backend Workflows cannot be created or triggered.

Solution: Upgrade to a paid Bubble plan (Starter $32/mo+). After upgrading, go to Settings → API and enable 'This app exposes a Workflow API'. The Backend Workflows section will then appear in your left sidebar. Re-create the Refresh_Reddit_Token workflow and test it from the Backend Workflows editor before connecting it to your main data workflows.

The API Connector shows 'There was an issue setting up your call' when initializing get_campaigns

Cause: The Authorization header for the Ads data calls requires a real, unexpired access token during initialization. If you used a placeholder value like '[token]' instead of an actual Bearer token, the initialization fails with a 401.

Solution: Temporarily generate a fresh access token by running the Refresh_Reddit_Token Backend Workflow once manually, then reading the token value from the Reddit_Token Data Type via the Bubble Data tab. Copy this token value and paste it as the header value for the Authorization field in the API Connector (replacing Bearer [placeholder]). Run the initialization, verify field types are detected, then revert the header to use the dynamic Data Type reference for production use.

Best practices

  • Apply for Reddit Ads API access as your very first step — before building anything in Bubble. The 1-5 business day approval window is your critical path item, and everything else can be built while waiting.
  • Always keep client_id and client_secret in the Private Basic Auth header in the Reddit Auth API Connector entry. These credentials generate tokens and must never be exposed client-side. The token itself (stored in Reddit_Token) is a runtime value and does not need Private marking.
  • Use a single-row Reddit_Token Data Type to store the current token and its expires_at timestamp. Running the Refresh_Reddit_Token Backend Workflow as the first step of every Ads data workflow ensures you never call the Ads API with a stale token.
  • Store raw microdollar values in Bubble Data Types and convert to dollars only at the display layer using ':divided by 1000000'. Never store pre-converted dollar amounts — this avoids floating-point rounding errors in Bubble's arithmetic.
  • Set privacy rules on all Reddit Ads data stored in Bubble (Campaign, Report_Snapshot, Reddit_Token Data Types). Ad spend data and token values are sensitive business information that should not be accessible to end users via Bubble's Data API.
  • Use Bubble App Constants for your Reddit Ads Account ID. If you manage multiple ad accounts, you can parameterize this value rather than hardcoding it in each API call.
  • Be mindful of Bubble WU (Workload Unit) consumption. The token refresh workflow, the data fetch calls, and the loop that creates Report_Snapshot records each consume WU. Schedule data pulls at appropriate intervals (e.g., every 15 minutes for a live dashboard) rather than on every page load to keep WU costs manageable.
  • Document your token refresh pattern for any team members who maintain the Bubble app. The 1-hour expiry is easy to forget, and a future developer who removes the Refresh_Reddit_Token step thinking it is unnecessary will break the integration after the first hour.

Alternatives

Frequently asked questions

Why does ads-api.reddit.com keep returning 403 even though I have a Reddit developer app?

Creating a Reddit developer app at reddit.com/prefs/apps grants access to the standard Reddit API (posts, comments, subreddits) but NOT to ads-api.reddit.com. Reddit Ads API requires a separate approval process that you must apply for at ads.reddit.com. Until that approval is granted, all calls to ads-api.reddit.com return 403 regardless of your credentials. Submit the Ads API application first and wait for approval before debugging any Bubble configuration.

Why does the dashboard work for an hour then suddenly stop showing data?

Reddit Ads access tokens expire after exactly 3,600 seconds (1 hour). After expiry, all Ads API calls return 401 Unauthorized. The fix is to ensure the Refresh_Reddit_Token Backend Workflow runs as the first step in every workflow that calls Reddit Ads data. This workflow checks the token's expires_at timestamp and fetches a new token automatically if the current one has expired.

Do I need a paid Bubble plan for this integration?

Yes. Backend Workflows are required for the server-side token refresh pattern that makes this integration reliable. Backend Workflows are only available on paid Bubble plans (Starter $32/mo+). On the free Bubble tier, you can make outbound Ads API calls but only if you manage the Bearer token manually — if the token expires (after 1 hour), calls will silently fail. The paid plan with Backend Workflows is strongly recommended for any production use.

Why do spend values show as '5000000' instead of '$5.00'?

Reddit Ads API returns all currency values in microdollars — a unit where 1,000,000 equals $1.00. A campaign with $5.00 in spend will show as 5000000 in the raw API response. In Bubble, divide these values by 1,000,000 at the display layer using ':divided by 1000000' in your text expressions. Store the raw microdollar value in your Data Type and convert only when displaying — this ensures accurate summation and arithmetic.

Can I use this integration to manage and create campaigns, not just read data?

Yes — the Reddit Ads API supports campaign creation, ad group management, and creative uploads in addition to reporting. The same API Connector and token management pattern applies for POST requests to create or update campaign objects. The integration described here focuses on reading performance data, but extending it to write operations follows the same Architecture: refresh token first, then make the POST call with the Bearer token from the Reddit_Token Data Type.

How often should I refresh Reddit Ads data in my Bubble dashboard?

Reddit Ads reporting data has a latency of approximately 15-20 minutes — data more recent than that may be incomplete. Refreshing every 15 minutes is reasonable for a live dashboard. Use Bubble's 'Schedule API Workflow' with a recurring interval to pull fresh data automatically rather than waiting for a user button click. Be aware that frequent polling consumes Bubble WU — balance data freshness with your monthly WU budget on your Bubble plan.

RapidDev

Talk to an Expert

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

Book a free consultation

Integrations are where projects stall

We wire Bubble integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

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.