Reddit Ads
Verified on 25 October 2026 against the Reddit Ads API v3.
The Reddit Ads connector reaches https://ads-api.reddit.com/api/v3, the Reddit Advertising API, for one advertiser account. It is good for the questions you would otherwise open Ads Manager to answer: what is running, what each ad group is spending and bidding, how the ads performed yesterday, which communities and keywords can be targeted. It can also create and change campaigns, ad groups, ads and the posts behind them, and every one of those ships switched off and asks a human before it runs, because each can start or change spend.
What you need
A Reddit app that you register yourself, the same kind the Reddit connector uses, and a Reddit Ads account the signed-in Reddit user can manage.
1. Create the app. Signed in as a Reddit user with access to the ad account, open reddit.com/prefs/apps, choose create another app, pick web app, and set the redirect uri to your gateway's address followed by /oauth/callback (http://127.0.0.1:7376/oauth/callback on your own machine, https://<your-gateway-host>/oauth/callback otherwise). Reddit checks it byte for byte, and one app holds one redirect URI. The client id is the short string under the app's name; the secret is labeled secret.
One app can serve both this connector and the Reddit connector; each connection authorizes separately and holds its own tokens.
2. Know which ad account. Almost every action takes an ad_account_id (a2_…). businesses.list and ad_accounts.list find it, and profiles.list gives the profile (t2_…) posts are created under.
Add the connection
In the console, open Access, Connections, Add connection, pick Reddit Ads from the catalog, and under the credential choose OAuth, then Gateway-held · your own app. Paste the client id and secret, check the redirect URI matches your Reddit app, and choose Add. Reddit's consent page opens in a new tab; approve it, and your browser lands on the gateway's "Connected" page once the tokens are sealed. The REST calls are the same as on the Reddit page with "preset_id": "reddit-ads".
Left alone, the gateway asks for the adsread and adsedit scopes. The access token lasts a day and the gateway refreshes it itself, two minutes before expiry, using the HTTP Basic authentication Reddit's token endpoint requires. Nothing reaches permaura.com.
What the agent can do
| Action | What it does | On by default |
|---|---|---|
me.read | Reads the advertiser account the connection acts as | Yes |
businesses.list, businesses.read | Lists and reads the businesses the account belongs to | Yes |
ad_accounts.list, ad_accounts.read | Lists and reads ad accounts | Yes |
profiles.list | Lists the Reddit profiles an ad account can post from | Yes |
campaigns.list, campaigns.read | Lists and reads campaigns | Yes |
ad_groups.list, ad_groups.read | Lists and reads ad groups, with budget, bid and targeting | Yes |
ads.list, ads.read | Lists and reads ads | Yes |
posts.list | Lists the promotable posts on a profile | Yes |
pixels.list | Lists an ad account's pixels | Yes |
reports.run | Runs a performance report | Yes |
history.read | Reads an ad account's change history | Yes |
forecast.estimate | Estimates audience size and delivery for a targeting and budget | Yes |
targeting.communities.search, targeting.communities.read | Finds communities that can be targeted | Yes |
targeting.keywords.suggest | Suggests keywords to target | Yes |
targeting.geolocations.list | Lists targetable locations | Yes |
campaigns.create, campaigns.update | Creates a campaign; pauses, activates or changes one | No, and needs approval |
ad_groups.create, ad_groups.update | Creates an ad group; changes its budget, bid, targeting or status | No, and needs approval |
ads.create, ads.update | Creates an ad from a post; pauses, activates or changes one | No, and needs approval |
posts.create | Creates a promotable post on a profile | No, and needs approval |
Good to know
- Reports, history, forecasts and keyword suggestions are POSTs, and that is fine. The Ads API takes their parameters in a JSON body, so Permaura's classifier would call them writes and switch them off. The manifest marks the four as reads at medium risk so the connector answers performance questions the moment it is connected. Nothing they do changes the account.
- Every body is wrapped in
data. The API expects{"data": {...}}on every create, update and report call, so each of those actions has one parameter,data, holding the object.reports.runtakesdatawithbreakdowns,fields,starts_at,ends_atand afilter; the API reference lists the field names. - Pausing is an update. A campaign, ad group or ad is paused or started by sending
data: {"configured_status": "PAUSED"}or"ACTIVE"to its update action. Both directions ask for an approval, since the second one starts spending. - Paging. List responses carry
pagination.next_page_token; pass it back aspage.token, withpage.sizeup to the API's cap, to get the next page. - A new ad group needs a
start_timeeven though the reference lists it as optional, and ad groups created since July 2026 must name a pixel. Images are supplied as a public URL that Reddit copies to its own hosting. - Personal fields are redacted. The name, email address and phone number on
me.readare blanked before the agent sees them, so the call confirms the connection works without handing over who you are. - The Reddit Ads API needs an enabled account. Reddit grants API access per advertiser; an account that has never run ads may need to request it in Ads Manager first. A 403 on
me.readwith a working token is that, not a Permaura refusal.