Skip to main content

Connect Reddit Ads

Tasks call the Reddit Ads API through qbash.integrations.reddit_ads. The connector reads and changes ad accounts, audiences, creatives, campaigns, ad groups and ads, pulls performance reports, sends conversion events and manages product catalogs.

qbash signs in through a developer app that your business creates in Reddit Ads Manager. Reddit applies its rate limits to that app.

What you need​

  • A Reddit Ads account with at least one ad account.
  • A business admin on that account whose Reddit account is verified. Only a business admin can create the developer app and approve access for it.

Create the developer app​

  1. Sign in to Reddit Ads Manager as a business admin.
  2. Open Business, then Developer Portal, and select Add Apps, then Create an app.
  3. Fill in the app:
    • App name: a name that says what the app is for, such as "Acme qbash reporting". Reddit asks you to avoid generic names like "Test".
    • About URL: a page about your business.
    • Redirect URL: copy it from the qbash credential form, which shows it under the instructions. For qbash cloud it is https://app.qbash.com/oauth/reddit-ads/callback. Paste it exactly, with no trailing slash.
    • Primary contact: a business admin. Reddit may contact this person about the app, and a member cannot be removed from the business while they are an app's primary contact.
  4. Select Create App. Reddit shows the app ID under the app name and generates its secret.

A business can have up to 10 developer apps. You can change an app's settings later from the Developer Portal, except its app ID and secret.

Reddit documents these steps in Create a Developer Application.

Add the credential in qbash​

  1. Open Connectors, then Reddit Ads, and click Connect.
  2. Enter a credential name, then paste the App ID and App Secret from the Developer Portal.
  3. Click Connect with Reddit. Reddit opens in a popup.
  4. Choose who approves access:
    • Yourself: the connection acts as your Reddit account and stops working if you lose access to the business or your account is deactivated.
    • A System User: a non-human identity owned by the business. The connection keeps working when people change roles or leave, and SSO or MFA prompts on a person's account do not interrupt it. Pick this for scheduled tasks a team depends on. Reddit asks you to create a System User or pick an existing one, then set its business role and ad account permissions.
  5. Approve the request. qbash asks for all four Reddit Ads scopes: adsread, adsedit, adsconversions and adsdatadeletion.
  6. In the task editor, open Resources, then Integrations, and select this credential. See Resources.

When you edit the credential, the form shows who it is connected as, a Reddit username or a System User. Editing only renames it. To connect a different app or identity, add a new credential.

A System User belongs to one business and one developer app, and a business can have up to 10. A business admin manages them in Business Manager → Users → System Users. Revoking one ends the connection until a business admin approves it again. Reddit's System Users guide covers the setup screens. Changes made through a System User can show as made by "Reddit" in the ad account history.

Pull a report from a task​

businesses = qbash.integrations.reddit_ads.list_my_businesses()["businesses"]
accounts = qbash.integrations.reddit_ads.list_ad_accounts(business_id=businesses[0]["id"])["ad_accounts"]

report = qbash.integrations.reddit_ads.get_report(
ad_account_id=accounts[0]["id"],
starts_at="2026-10-13",
ends_at="2026-10-20",
fields=["IMPRESSIONS", "CLICKS", "SPEND", "CONVERSION_PURCHASE_CLICKS"],
breakdowns=["CAMPAIGN_ID", "DATE"],
fetch_all=True,
)
for row in report["metrics"]:
print(row["date"], row["campaign_id"], row["clicks"], (row["spend"] or 0) / 1_000_000)

Rows come back with the requested fields in lowercase, one key per breakdown. Reddit returns rows only, so add totals up yourself.

Build a paused campaign​

ad_account_id = "your-ad-account-id"
funding = qbash.integrations.reddit_ads.list_funding_instruments(ad_account_id=ad_account_id)["funding_instruments"]

campaign = qbash.integrations.reddit_ads.create_campaign(
ad_account_id=ad_account_id,
name="Spring launch",
objective="CLICKS",
funding_instrument_id=funding[0]["id"],
)["campaign"]
print(campaign["id"], campaign["configured_status"])

A launch runs in three steps: create_campaign, then create_ad_group with targeting, bid, budget and a conversion_pixel_id, then create_ad with a post made by create_structured_post. list_pixels_by_ad_account and list_profiles_by_ad_account return the pixel and profile IDs these calls need. The SDK reference lists every method and parameter.

Details that change results​

  • New campaigns, ad groups and ads start with configured_status set to PAUSED. Nothing spends until a task passes configured_status="ACTIVE" on create or update.
  • Budgets, bids, spend caps and report fields such as SPEND, CPC, ECPM and every *_ECPA are micro-currency: 1,000,000 is 1.00 in the account currency. Catalog prices are plain amounts with a currency code, such as "19.99 USD". Conversion events sent with post_conversion_events take value and item_price as plain amounts too, such as 10.99. Report fields named CONVERSION_*_TOTAL_VALUE come back in cents.
  • Reddit locks a post's copy, media and link once the post is created. update_structured_post only changes allow_comments, so new copy needs a new post and a new ad.
  • Reddit recalculates effective_status some time after configured_status changes, and a new ad reads PENDING_APPROVAL until review finishes. Read the object again before acting on its status.
  • A report takes up to 3 breakdowns, or 4 when both COUNTRY and REGION are included. From December 8, 2026, an HOUR breakdown covers at most 7 days, and a report can use only one of KEYWORD, COMMUNITY, INTEREST or LANGUAGE, with none of DMA, REGION, GALLERY_ITEM_ID, OS_TYPE or COUNTRY beside it. qbash checks these rules before calling Reddit and returns an error that names the broken rule.
  • Report figures can change for up to 6 hours, and Reddit corrects late conversions in a daily refresh. metrics_updated_at says when Reddit last refreshed the numbers.
  • Reports allow 60 requests a minute and estimate_audience_and_delivery allows 10. Bid and reach suggestions allow 30, and targeting lookups 100. qbash waits and retries a rate-limited call up to three times, using the wait Reddit returns.
  • update_custom_audience_users takes plain emails and mobile advertising IDs, normalizes them and hashes them with SHA-256 before upload. Pass already_hashed=True if your values are hashed already. qbash keeps the identifiers in these calls out of the task's step log.

Seed a test account​

Use an ad account with a funding instrument, a profile and a Reddit Pixel created in Events Manager. Ad groups need a pixel. Build a campaign, ad group and ad with the defaults so everything stays paused, and run reports against an account that has spent in the last week.