Skip to main content
RapidDev - Software Development Agency
API AutomationsRedditOAuth 2.0

How to Automate Reddit Ad Campaigns using the API

Reddit Ads API (ads-api.reddit.com/api/v2.0/) is entirely separate from the Data API and requires Reddit Ads account access. Use it to automate campaign reporting, budget adjustments, and performance monitoring. Access requires contacting Reddit sales — it's not self-serve. Rate limits are undocumented. Most founders searching this need report automation and budget rules, not full campaign creation.

Need help automating? Talk to an expert
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced6 min read1-2 hoursRedditMay 2026RapidDev Engineering Team
TL;DR

Reddit Ads API (ads-api.reddit.com/api/v2.0/) is entirely separate from the Data API and requires Reddit Ads account access. Use it to automate campaign reporting, budget adjustments, and performance monitoring. Access requires contacting Reddit sales — it's not self-serve. Rate limits are undocumented. Most founders searching this need report automation and budget rules, not full campaign creation.

API Quick Reference

Auth

OAuth 2.0

Rate limit

Undocumented (separate from Data API)

Format

JSON

SDK

REST only

Understanding the Reddit Ads API

The Reddit Ads API is a completely separate product from the Reddit Data API. It lives at ads-api.reddit.com/api/v2.0/ and has its own authentication system, rate limits, and account requirements. You cannot use your Data API credentials here — you need active Reddit Ads account access and a separate OAuth2 application registered with Reddit's advertising platform.

The Ads API supports full campaign lifecycle management: creating campaigns, ad groups (targeting), and ads; pulling performance reports; and adjusting budgets and bids. However, most founders searching for Reddit Ads API automation are primarily interested in two use cases: pulling performance reports (impressions, clicks, CPM, spend) and automatically adjusting budgets based on ROAS rules.

Important distinction: the commercial Data API tier ($12,000/month for 50M calls) is NOT the Ads API. They are separate products for different purposes. The Ads API is free to use if you have an active ads account — you pay only for the ad spend itself.

Base URLhttps://ads-api.reddit.com/api/v2.0

Setting Up Reddit Ads API Authentication

The Reddit Ads API uses the same OAuth2 infrastructure as the Data API but requires a separate application registration with Ads-specific access. You need an active Reddit Ads account with spend history, and your API application must be approved by Reddit's team. The authentication flow uses the authorization_code grant for user-context access to manage campaigns.

  1. 1Create or log into your Reddit Ads account at ads.reddit.com
  2. 2Contact Reddit Ads support or your account manager to request API access
  3. 3Once approved, register an OAuth2 app at reddit.com/prefs/apps (web app type)
  4. 4Request Ads API-specific scopes during app registration (adsread, adsmanage)
  5. 5Implement the authorization_code OAuth2 flow to get user-context tokens
  6. 6Exchange the authorization code for access_token and refresh_token at https://www.reddit.com/api/v1/access_token
  7. 7Use refresh tokens with duration=permanent to avoid re-authentication
  8. 8Set User-Agent header: <platform>:<app-id>:<version> (by /u/<username>)
auth.py
1import requests
2import os
3
4# Reddit Ads API uses the same OAuth token endpoint but requires ads-specific scopes
5# You must first complete the OAuth2 authorization_code flow in a browser
6# This code handles the token exchange step
7
8def exchange_code_for_token(code, redirect_uri):
9 client_id = os.environ['REDDIT_ADS_CLIENT_ID']
10 client_secret = os.environ['REDDIT_ADS_CLIENT_SECRET']
11 user_agent = 'python:com.example.ads-automation:v1.0 (by /u/yourusername)'
12
13 r = requests.post(
14 'https://www.reddit.com/api/v1/access_token',
15 auth=requests.auth.HTTPBasicAuth(client_id, client_secret),
16 data={
17 'grant_type': 'authorization_code',
18 'code': code,
19 'redirect_uri': redirect_uri
20 },
21 headers={'User-Agent': user_agent}
22 )
23 r.raise_for_status()
24 token_data = r.json()
25 return {
26 'access_token': token_data['access_token'],
27 'refresh_token': token_data.get('refresh_token'),
28 'expires_in': token_data['expires_in']
29 }
30
31def refresh_access_token(refresh_token):
32 client_id = os.environ['REDDIT_ADS_CLIENT_ID']
33 client_secret = os.environ['REDDIT_ADS_CLIENT_SECRET']
34 r = requests.post(
35 'https://www.reddit.com/api/v1/access_token',
36 auth=requests.auth.HTTPBasicAuth(client_id, client_secret),
37 data={'grant_type': 'refresh_token', 'refresh_token': refresh_token},
38 headers={'User-Agent': 'python:com.example.ads-automation:v1.0 (by /u/yourusername)'}
39 )
40 r.raise_for_status()
41 return r.json()['access_token']

Security notes

  • Store CLIENT_ID, CLIENT_SECRET, and refresh tokens in environment variables — never hardcode
  • Refresh tokens are long-lived — treat them like passwords and store them securely (encrypted at rest)
  • Use HTTPS for all OAuth redirect URIs — plain HTTP is not permitted
  • Implement token rotation: store the new access token on every refresh response
  • Log all API calls and token refreshes for audit compliance
  • Never log actual token values — log token hashes or last-4 characters only

Key endpoints

GET/api/v2.0/campaigns

Lists all campaigns for an account. Returns campaign IDs, names, status, budget, and performance summary. Use this to build a campaign inventory or to select campaigns for budget adjustments.

ParameterTypeRequiredDescription
account_idstringrequiredYour Reddit Ads account ID
statusstringoptionalFilter by status: ACTIVE, PAUSED, COMPLETED
limitnumberoptionalResults per page
afterstringoptionalPagination cursor

Response

json
1{"data": [{"id": "campaign_abc123", "name": "Summer Sale 2026", "status": "ACTIVE", "total_budget": 5000.00, "daily_budget": 200.00, "start_date": "2026-06-01", "end_date": "2026-08-31", "objective": "TRAFFIC"}]}
GET/api/v2.0/adgroups

Lists ad groups within a campaign. Ad groups contain targeting settings (communities, interests, demographics). Use this to review targeting and adjust bids at the ad group level.

ParameterTypeRequiredDescription
campaign_idstringrequiredParent campaign ID
account_idstringrequiredReddit Ads account ID

Response

json
1{"data": [{"id": "adgroup_xyz789", "campaign_id": "campaign_abc123", "name": "r/technology targeting", "status": "ACTIVE", "bid_type": "CPM", "bid_amount": 4.50, "targeting": {"communities": ["technology", "programming"]}}]}
GET/api/v2.0/reports

Pulls performance data for campaigns, ad groups, or ads over a specified date range. This is the primary endpoint for automated reporting. Returns impressions, clicks, CTR, CPM, CPC, spend, and conversions.

ParameterTypeRequiredDescription
account_idstringrequiredReddit Ads account ID
campaign_idsarrayoptionalFilter to specific campaign IDs
start_datestringrequiredReport start date (YYYY-MM-DD)
end_datestringrequiredReport end date (YYYY-MM-DD)
metricsarrayrequiredMetrics to include: impressions, clicks, spend, ctr, cpm, conversions

Request

json
1{"account_id": "your_account_id", "campaign_ids": ["campaign_abc123"], "start_date": "2026-04-01", "end_date": "2026-04-30", "metrics": ["impressions", "clicks", "spend", "ctr", "cpm"]}

Response

json
1{"data": [{"date": "2026-04-01", "campaign_id": "campaign_abc123", "impressions": 45200, "clicks": 312, "spend": 187.50, "ctr": 0.0069, "cpm": 4.15}]}
PATCH/api/v2.0/campaigns/{campaign_id}

Updates a campaign's budget, status, name, or schedule. Use this to automate budget adjustments based on performance rules (e.g., pause campaigns with CPM above threshold).

ParameterTypeRequiredDescription
campaign_idstringrequiredCampaign ID to update
daily_budgetnumberoptionalNew daily budget in account currency
total_budgetnumberoptionalNew total campaign budget
statusstringoptionalACTIVE or PAUSED

Request

json
1{"daily_budget": 250.00, "status": "ACTIVE"}

Response

json
1{"data": {"id": "campaign_abc123", "daily_budget": 250.00, "status": "ACTIVE", "updated_at": "2026-04-15T10:30:00Z"}}

Step-by-step automation

1

Get API Access and Authenticate

Why: The Ads API requires explicit approval — you cannot access it with a standard Reddit developer account.

Contact Reddit Ads support (through ads.reddit.com) or your account manager to request API access. Once approved, register a web-type OAuth2 app at reddit.com/prefs/apps and implement the authorization_code flow. Store the refresh token — it allows long-term automated access without re-authentication.

request.sh
1# Step 1: Redirect user to this URL for authorization
2# https://www.reddit.com/api/v1/authorize?client_id=YOUR_CLIENT_ID&response_type=code&state=RANDOM_STATE&redirect_uri=YOUR_REDIRECT_URI&duration=permanent&scope=adsread+adsmanage
3
4# Step 2: Exchange code for tokens
5curl -X POST https://www.reddit.com/api/v1/access_token \
6 -u 'YOUR_CLIENT_ID:YOUR_CLIENT_SECRET' \
7 -H 'User-Agent: script:com.example.ads-bot:v1.0 (by /u/yourusername)' \
8 -d 'grant_type=authorization_code&code=CODE_FROM_REDIRECT&redirect_uri=YOUR_REDIRECT_URI'

Pro tip: Store the refresh token in a secrets manager (AWS Secrets Manager, HashiCorp Vault) rather than environment variables for production deployments. Refresh tokens are long-lived and highly sensitive.

Expected result: An authenticated client that can make requests to ads-api.reddit.com with auto-refreshing tokens.

2

Fetch Campaign Performance Reports

Why: The reports endpoint is the primary value driver — automated daily/weekly reports save hours of manual dashboard checking.

Call GET /api/v2.0/reports with your account_id, date range, and desired metrics. Request campaign-level granularity first, then drill down to ad group level for underperforming campaigns. Calculate derived metrics (ROAS, CPC from spend/clicks) in your processing layer.

request.sh
1curl -X GET 'https://ads-api.reddit.com/api/v2.0/reports' \
2 -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
3 -H 'User-Agent: script:com.example.ads-bot:v1.0 (by /u/yourusername)' \
4 -G \
5 --data-urlencode 'account_id=YOUR_ACCOUNT_ID' \
6 --data-urlencode 'start_date=2026-04-01' \
7 --data-urlencode 'end_date=2026-04-30' \
8 --data-urlencode 'metrics=impressions,clicks,spend,ctr,cpm'

Pro tip: Request the last 8 days of data (not 7) to include a full week plus today. This handles timezone discrepancies where day boundaries differ between your server and Reddit's reporting.

Expected result: A dictionary of campaign IDs to aggregated performance metrics including impressions, clicks, spend, and calculated CPC.

3

Apply Budget Adjustment Rules

Why: Manual budget management across multiple campaigns is error-prone — automated rules respond faster and more consistently than human monitoring.

Define performance thresholds (e.g., pause campaigns with CPC > $2.50, increase budget 20% for campaigns with CPC < $0.80 and ROAS > 3x). Apply PATCH requests to campaigns that meet the rule criteria. Always log every budget change with the reasoning and previous value.

request.sh
1# Pause a campaign that's over budget threshold
2curl -X PATCH 'https://ads-api.reddit.com/api/v2.0/campaigns/campaign_abc123' \
3 -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
4 -H 'User-Agent: script:com.example.ads-bot:v1.0 (by /u/yourusername)' \
5 -H 'Content-Type: application/json' \
6 -d '{"status": "PAUSED"}'

Pro tip: Add a dry_run=True mode to your rule engine that logs what would be changed without calling PATCH. Run in dry-run mode for a week before activating live changes to validate your rule thresholds.

Expected result: A list of changes applied to campaigns, with each entry containing the campaign ID, action taken, and reason.

4

Generate and Deliver the Performance Report

Why: Stakeholders need campaign performance in their inbox or Slack, not in a tool they need to log into.

Format the aggregated metrics into a readable report. Post to Slack via webhook, send via email, or append to a Google Sheet. Include week-over-week comparisons, flag campaigns that triggered rules, and highlight top performers.

request.sh
1# Send report to Slack via incoming webhook
2curl -X POST YOUR_SLACK_WEBHOOK_URL \
3 -H 'Content-Type: application/json' \
4 -d '{"text": "Reddit Ads Weekly Report\nTotal Spend: $1,234.56\nTotal Clicks: 8,921\nAvg CPC: $0.14\n\nCampaigns Paused (high CPC): 2\nBudget Increases Applied: 1"}'

Pro tip: Always include the previous period's numbers for comparison (e.g., 'Spend: $1,234 vs $987 last week (+25%)'). Pure current-period numbers without context are less actionable.

Expected result: A formatted report sent to Slack (or another channel) with aggregate metrics and a summary of automated rule actions taken.

Complete working code

This daily automation pulls Reddit Ads performance reports, applies budget adjustment rules (pause high-CPC campaigns, boost high-performers), and delivers a formatted summary to Slack. It handles token refresh automatically and logs all changes for audit.

automate_reddit_ads.py
1import requests
2import os
3import logging
4from datetime import datetime, timedelta, timezone
5
6logging.basicConfig(level=logging.INFO)
7log = logging.getLogger('reddit_ads')
8
9USER_AGENT = 'python:com.example.ads-automation:v1.0 (by /u/yourusername)'
10
11class AdsClient:
12 def __init__(self):
13 self.client_id = os.environ['REDDIT_ADS_CLIENT_ID']
14 self.client_secret = os.environ['REDDIT_ADS_CLIENT_SECRET']
15 self.refresh_token_val = os.environ['REDDIT_ADS_REFRESH_TOKEN']
16 self.account_id = os.environ['REDDIT_ADS_ACCOUNT_ID']
17 self.access_token = None
18 self.expiry = datetime.now(timezone.utc)
19
20 def _refresh(self):
21 if datetime.now(timezone.utc) < self.expiry - timedelta(minutes=5):
22 return
23 r = requests.post(
24 'https://www.reddit.com/api/v1/access_token',
25 auth=requests.auth.HTTPBasicAuth(self.client_id, self.client_secret),
26 data={'grant_type': 'refresh_token', 'refresh_token': self.refresh_token_val},
27 headers={'User-Agent': USER_AGENT}
28 )
29 r.raise_for_status()
30 d = r.json()
31 self.access_token = d['access_token']
32 self.expiry = datetime.now(timezone.utc) + timedelta(seconds=d['expires_in'])
33
34 def _headers(self):
35 self._refresh()
36 return {'Authorization': f'Bearer {self.access_token}', 'User-Agent': USER_AGENT}
37
38 def get(self, path, params=None):
39 r = requests.get(f'https://ads-api.reddit.com/api/v2.0{path}',
40 headers=self._headers(), params=params)
41 r.raise_for_status()
42 return r.json()
43
44 def patch(self, path, body):
45 r = requests.patch(f'https://ads-api.reddit.com/api/v2.0{path}',
46 headers={**self._headers(), 'Content-Type': 'application/json'},
47 json=body)
48 r.raise_for_status()
49 return r.json()
50
51def run_daily():
52 client = AdsClient()
53 end = datetime.now(timezone.utc)
54 start = end - timedelta(days=7)
55
56 # Pull 7-day report
57 report = client.get('/reports', {'account_id': client.account_id,
58 'start_date': start.strftime('%Y-%m-%d'), 'end_date': end.strftime('%Y-%m-%d'),
59 'metrics': 'impressions,clicks,spend,ctr,cpm'})
60 metrics = {}
61 for row in report.get('data', []):
62 cid = row.get('campaign_id')
63 if cid not in metrics:
64 metrics[cid] = {'impressions': 0, 'clicks': 0, 'spend': 0.0}
65 metrics[cid]['impressions'] += row.get('impressions', 0)
66 metrics[cid]['clicks'] += row.get('clicks', 0)
67 metrics[cid]['spend'] += float(row.get('spend', 0))
68 for m in metrics.values():
69 m['cpc'] = m['spend'] / m['clicks'] if m['clicks'] > 0 else 0
70
71 # Get campaign details
72 campaigns_data = client.get('/campaigns', {'account_id': client.account_id})
73 cmap = {c['id']: c for c in campaigns_data.get('data', [])}
74
75 # Apply rules
76 changes = []
77 for cid, m in metrics.items():
78 c = cmap.get(cid)
79 if not c or c['status'] == 'COMPLETED':
80 continue
81 if m['cpc'] > 2.50 and c['status'] == 'ACTIVE':
82 client.patch(f'/campaigns/{cid}', {'status': 'PAUSED'})
83 log.info(f'Paused {cid}: CPC=${m["cpc"]:.2f}')
84 changes.append({'id': cid, 'action': 'paused'})
85 elif m['cpc'] < 0.80 and m['clicks'] >= 50 and c['status'] == 'ACTIVE':
86 nb = round(c.get('daily_budget', 0) * 1.20, 2)
87 client.patch(f'/campaigns/{cid}', {'daily_budget': nb})
88 log.info(f'Budget increase {cid}: ${nb}')
89 changes.append({'id': cid, 'action': 'budget_increase', 'new': nb})
90
91 # Report totals
92 total_spend = sum(m['spend'] for m in metrics.values())
93 total_clicks = sum(m['clicks'] for m in metrics.values())
94 avg_cpc = total_spend / total_clicks if total_clicks > 0 else 0
95 log.info(f'Report: spend=${total_spend:.2f} clicks={total_clicks} CPC=${avg_cpc:.3f} changes={len(changes)}')
96
97 # Send to Slack
98 slack_url = os.environ.get('SLACK_WEBHOOK_URL')
99 if slack_url:
100 paused_count = sum(1 for c in changes if c['action'] == 'paused')
101 boosted_count = sum(1 for c in changes if c['action'] == 'budget_increase')
102 msg = (f'Reddit Ads 7-day Report\nSpend: ${total_spend:.2f} Clicks: {total_clicks} Avg CPC: ${avg_cpc:.3f}\n'
103 f'Auto-paused: {paused_count} Budget increases: {boosted_count}')
104 requests.post(slack_url, json={'text': msg})
105
106if __name__ == '__main__':
107 run_daily()

Error handling

401401 Unauthorized
Cause

Access token expired (1 hour TTL) or the refresh token was revoked by the user.

Fix

Use the refresh_token to get a new access_token. If the refresh also returns 401, the user has revoked your app's access and you need to re-authorize.

Retry strategy

Immediate retry after successful token refresh. If refresh fails, alert the team for manual re-authorization.

403403 Forbidden
Cause

Missing Ads-specific scopes, or the authenticated user does not have access to the specified ad account.

Fix

Verify the OAuth2 app has adsread and adsmanage scopes. Confirm the authenticated user is a member of the specified ad account.

Retry strategy

No retry — resolve the permissions issue.

429Too Many Requests
Cause

Ads API rate limit exceeded. The limit is undocumented but exists. Bursting many requests for large report pulls can trigger it.

Fix

Add 0.5-1 second delays between API calls. For large reports, request data in smaller date ranges rather than one large batch.

Retry strategy

Exponential backoff starting at 5s, doubling to max 60s. Check Retry-After header if present.

404Not Found
Cause

Campaign ID, ad group ID, or account ID does not exist or has been deleted.

Fix

Refresh your campaign inventory by calling GET /campaigns before applying updates. Remove deleted campaign IDs from your rule engine.

Retry strategy

No retry — update your local campaign list.

Rate Limits for Reddit Ads API

ScopeLimitWindow
Ads API (separate from Data API)Undocumented — contact Reddit salesper minute
Data API (separate)60 requestsper minute
retry-handler.ts
1import time
2import requests
3
4def ads_request_with_backoff(method, url, max_retries=5, **kwargs):
5 for attempt in range(max_retries):
6 r = getattr(requests, method)(url, **kwargs)
7 if r.status_code == 429:
8 retry_after = int(r.headers.get('Retry-After', 2 ** attempt * 5))
9 print(f'Rate limited. Waiting {retry_after}s (attempt {attempt+1}/{max_retries})')
10 time.sleep(retry_after)
11 continue
12 if r.status_code in (500, 502, 503):
13 wait = min(2 ** attempt * 2, 64)
14 print(f'Server error {r.status_code}. Waiting {wait}s')
15 time.sleep(wait)
16 continue
17 r.raise_for_status()
18 return r
19 raise Exception(f'Max retries exceeded for {url}')
  • Design to conservative rates (10-20 req/min) since the Ads API limit is undocumented
  • Request 7-30 day reports in a single call rather than one-day-at-a-time polling
  • Cache campaign inventory for 1 hour rather than fetching it on every run
  • Add 0.5s delays between PATCH requests when updating multiple campaigns
  • Use batch report endpoints (filtering by multiple campaign_ids) rather than separate calls per campaign

Security checklist

  • Store all OAuth2 credentials and refresh tokens in a secrets manager, not plain environment variables
  • Implement IP allowlisting on the OAuth2 redirect URI endpoint to prevent authorization code interception
  • Log all budget changes with timestamps, previous values, new values, and the rule that triggered them
  • Use a dedicated Reddit Ads account or user for API automation — separate from human-managed ad accounts
  • Never log actual access tokens — log only creation time and expiry for debugging
  • Set up spend alerts in the Reddit Ads dashboard as a safeguard against automation bugs that could overspend
  • Implement a maximum daily budget change limit in your automation logic to prevent runaway spending
  • Review and test all budget rules against historical data before running them live

Automation use cases

Daily Performance Report to Slack

intermediate

Pull 7-day campaign performance every morning and post a summary to your team's Slack channel with spend, CPC, and top-performing campaigns.

Automated Campaign Pause Rules

intermediate

Automatically pause campaigns that exceed CPC thresholds or run out of their total budget to prevent overspend.

Budget Optimization by Day-of-Week

advanced

Increase budgets on your highest-performing days (weekends vs weekdays) and reduce on low-performance days, automatically.

A/B Test Performance Tracker

advanced

Monitor multiple ad variants, automatically pause underperformers once statistical significance is reached, and report winners to the team.

No-code alternatives

Don't want to write code? These platforms can automate the same workflows visually.

Zapier

Starter from $19.99/month

Zapier has no native Reddit Ads integration. You could use Zapier with the Reddit Ads API via webhooks or custom REST calls, but it provides no real simplification over direct API access for ads workflows.

Pros
  • + Can integrate Ads data with other tools via webhooks
  • + No server needed
Cons
  • - No native Reddit Ads module
  • - Complex multi-step Zaps for budget rules
  • - Expensive for high-frequency checks

Make

Core from $9/month

Similar to Zapier — no native Reddit Ads module but can use HTTP request modules to call the Ads API and route data to Google Sheets or Slack.

Pros
  • + HTTP request module is flexible
  • + Can deliver reports to multiple destinations
  • + Lower cost than Zapier
Cons
  • - No Reddit Ads native module
  • - Budget rule logic requires complex filter chains
  • - Harder to debug API errors

n8n

Free self-hosted; Cloud from €20/month

n8n's HTTP Request node can interact with the Reddit Ads API. Combined with a Cron trigger and code execution node for rule logic, n8n can handle the full automation workflow.

Pros
  • + Self-hostable (free)
  • + Code node handles complex budget rules
  • + Native Slack integration for reports
Cons
  • - No Reddit Ads native node
  • - Requires more workflow design effort
  • - Self-hosted maintenance burden

Best practices

  • Pull reports at the campaign level first, then drill to ad group level only for campaigns that need attention
  • Test budget rules against 30 days of historical data before running them live to calibrate thresholds
  • Implement safeguards: maximum budget increase per run (e.g., no more than 50% in a single automated change)
  • Use separate OAuth2 applications for development and production ad accounts
  • Cache campaign metadata (names, current budgets) for 1 hour to reduce API calls
  • Always include the previous value in budget change logs: 'Changed daily budget from $200 to $240'
  • Set up Reddit Ads account-level spend alerts as an independent safety net against automation failures
  • Contact Reddit's API team for documented rate limits before scaling your automation to high request volumes

Ask AI to help

Copy one of these prompts to get a personalized, working implementation.

ChatGPT / Claude Prompt

I'm building Reddit Ads campaign automation in Python using the Ads API at ads-api.reddit.com/api/v2.0/. I need to: 1) pull a 7-day performance report grouped by campaign, 2) pause campaigns where the calculated CPC exceeds $2.50, 3) increase daily budgets by 20% for campaigns with CPC under $0.80 and at least 50 clicks. I have working OAuth2 token refresh using a refresh_token. Help me write the apply_rules() function with proper error handling and a changes log that records each action taken with before/after values.

Lovable / V0 Prompt

Build a Reddit Ads automation dashboard. It should show: a campaigns overview table (name, status, daily budget, 7-day spend, CPC, clicks), a rules configuration panel (threshold CPC for pausing, CPC threshold for budget boost, boost percentage), a change log table showing automated actions (timestamp, campaign, action, before value, after value), and a daily report chart (spend and clicks over the last 30 days). Include a dry-run toggle that previews what rules would do without applying changes. Connect to a Node.js backend that wraps the Reddit Ads API.

Frequently asked questions

Is the Reddit Ads API the same as the Reddit Data API?

No — they are completely separate products with different base URLs, authentication requirements, and pricing. The Data API (oauth.reddit.com) is for reading and posting content. The Ads API (ads-api.reddit.com/api/v2.0/) is for managing advertising campaigns. You need an active Reddit Ads account and separate API approval for the Ads API.

How do I get access to the Reddit Ads API?

The Reddit Ads API is not self-serve. You need to contact Reddit Ads support through your ads.reddit.com account dashboard, or reach out to your Reddit account manager if you have one. Smaller advertisers may have limited access — the API is primarily available to larger spenders and agencies.

What happens when I hit the Ads API rate limit?

The Ads API returns HTTP 429 Too Many Requests. Unlike the Data API, the Ads API rate limits are not publicly documented. Design defensively: add 0.5-1 second delays between calls, use batch report endpoints, and implement exponential backoff starting at 5 seconds. Contact Reddit sales for specific rate limit numbers for your account tier.

Can I create entirely new campaigns via the API, or just manage existing ones?

The Ads API supports full campaign creation via POST /api/v2.0/campaigns, ad group creation, and ad creation. However, most automation use cases focus on reporting and budget adjustments rather than programmatic campaign creation. Campaign creation via API requires careful setup of targeting parameters, creatives, and compliance settings.

Is the $12,000/month Data API tier required for Ads API access?

No. The commercial Data API tier ($12,000/month for 50M calls) is for high-volume content reading and posting automation. The Ads API is a separate product available to Reddit Ads customers — you pay only for your ad spend, not a separate API access fee.

Can I automate cross-platform ad reporting (Reddit + Meta + Google) in one script?

Yes — the pattern is the same for each platform's ads API. Pull data from each API separately, normalize the metrics (impressions, clicks, spend, CPC) into a common schema, aggregate in your reporting layer, and deliver in one unified report. Consider using a data pipeline tool like n8n or Airbyte to standardize multi-platform ad reporting.

Can RapidDev help build a custom Reddit Ads automation?

Yes. RapidDev has built 600+ apps including paid media automation tools, performance dashboards, and multi-platform reporting systems. We can build a Reddit Ads automation with custom budget rules, Slack/email reporting, and a management dashboard. Contact us for a free consultation.

RapidDev

Need this automated?

Our team has built 600+ apps with API automations. We can build this for you.

Book a free consultation

Skip the coding — we'll build it for you

Our experts have built 600+ API automations. From prototype to production in days, not weeks.

Book a free consultation

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.