<!-- Generated by scripts/generate-llms.mjs from docs/connectors/reddit-ads.md. Do not edit. -->

Source: https://qbash.com/docs/connectors/reddit-ads

# 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](https://ads.reddit.com) 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](https://ads-api.reddit.com/docs/v3/guides/quick-start/create-dev-app).

## 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](https://qbash.com/docs-markdown/tasks/task-editor.md#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](https://ads-api.reddit.com/docs/v3/guides/programs/business/system-users) 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

```python
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

```python
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](https://qbash.com/docs-markdown/tasks/sdk-reference.md) 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.
