# Reddit Ads Scraper With Advertiser Data (`scrapier/reddit-ads-scraper`) Actor

Reddit Ads Scraper — Scrape Reddit ads with advertiser names, ad text, titles, creatives, landing pages, promoted posts, and campaign details. Analyze competitor advertising, discover campaigns, monitor ad trends, and build structured marketing intelligence.

- **URL**: https://apify.com/scrapier/reddit-ads-scraper.md
- **Developed by:** [Scrapier](https://apify.com/scrapier) (community)
- **Categories:** Automation, Lead generation, Social media
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Reddit Ads Scraper — Extract Ad Creatives and Advertiser Karma Data

Reddit Ads Scraper With Advertiser Data pulls ad creatives from Reddit's public Ads Inspiration Library — headlines, body copy, media, budget tier, objective, and placement — and enriches every ad with the real Reddit account behind it: karma, account age, and the subreddits that account is organically active in. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. Query by advertiser name or keyword, layer on creative filters, and watch enriched rows land in your dataset in real time.

***

### What is Reddit Ads Scraper With Advertiser Data?

Reddit Ads Scraper With Advertiser Data queries Reddit's public Ads Inspiration Library (the same gallery at `ads.reddit.com/inspiration`) and returns every matching ad as a structured record, then looks up the Reddit account behind each ad in a free, no-login public archive to attach real karma, account-age, and subreddit-activity data. That advertiser-intelligence layer — knowing whether the account behind an ad is a long-standing, community-native Redditor or a fresh single-purpose ad account — is this Actor's own feature; the ad creative fields alone are what a plain ads-library scrape stops at. No Reddit account or login is required for the default run; the Actor bootstraps its own anonymous session automatically.

- 🎨 **Ad creatives** — headline, body copy, media/carousel content, call-to-action, thumbnail
- 💵 **Campaign metadata** — budget tier, industry, objective, placement, creation date
- 👤 **Advertiser identity** — Reddit username, profile ID, avatar, as shown in the ads library
- 🕵️ **Advertiser account intelligence** — post/comment/total karma, indexed post & comment counts, earliest and most recent activity dates
- 🌐 **Subreddit affinity** — which subreddits the advertiser account is organically active in, ranked by real activity share
- 🎛️ **Query controls** — bulk keyword/advertiser search, industry, budget, format, placement and objective filters

***

### What data can you get with Reddit Ads Scraper With Advertiser Data?

Every run returns ad-creative records enriched with advertiser account data, structured across four field groups:

| Result Type | Extracted Fields | Primary Use Case |
| --- | --- | --- |
| Ad creative & campaign | `id`, `headline`, `body`, `type`, `thumbnail_url`, `content[]`, `allow_comments`, `redditPostId`, `created_at`, `industry`, `budget_category`, `objective`, `placements`, `post_url` | Creative swipe files, competitor ad tracking |
| Advertiser identity (ads library) | `profile_id`, `profile_name`, `profile_image_url` | Attributing an ad to a Reddit account |
| Advertiser account intelligence | `advertiserUsername`, `advertiserPostKarma`, `advertiserCommentKarma`, `advertiserTotalKarma`, `advertiserNumPosts`, `advertiserNumComments`, `advertiserEarliestPostAt`, `advertiserLastPostAt`, `advertiserProfileCoverageNote` | Advertiser due diligence, account-age/trust signal |
| Subreddit affinity | `advertiserSubredditAffinity[]` (`username`, `subreddit`, `activityCount`, `activityShare`, `affinityRank`) | Spotting a community-native account vs. a throwaway ad account |

#### Advertiser account intelligence & subreddit affinity

This is the field group that separates this Actor from a plain ad-library scrape. For every ad, the Actor resolves the advertiser's real Reddit username (stripping the `u_` prefix the ads library uses) and looks it up once per run in Arctic Shift, a free public Reddit archive — no login, no API key. It returns real karma broken into post/comment/total, indexed post and comment counts, and the earliest and most recent activity timestamps the archive has indexed — a genuine account-age and recency signal. Subreddit affinity ranks the subreddits that account has actually posted or commented in, by activity share, so you can tell a long-standing community member apart from an account spun up to run a single campaign:

```json
{
  "advertiserUsername": "RIPDebt",
  "advertiserPostKarma": 4210,
  "advertiserCommentKarma": 1875,
  "advertiserTotalKarma": 6085,
  "advertiserEarliestPostAt": "2016-05-02T09:14:11.000Z",
  "advertiserLastPostAt": "2026-07-30T18:02:44.000Z",
  "advertiserSubredditAffinity": [
    { "subreddit": "personalfinance", "activityCount": 41, "activityShare": 22.4, "affinityRank": 1 }
  ]
}
```

Each advertiser is resolved only once per run and the result is cached and reused across every ad from that same account, no matter how many ads they have in your results.

#### Ad creative & content

Every ad's `content` array carries every creative slide exactly as the ads library serves it — `media_url`, `destination_url`, `display_url`, `call_to_action`, and `caption` per slide, so a single-image ad returns one entry and a carousel returns one entry per slide. Combined with `headline`, `body`, `type` (`IMAGE`, `VIDEO`, `CAROUSEL`, or `TEXT`) and `allow_comments`, this is enough to rebuild the ad's copy and creative angle without opening Reddit at all — useful for building a competitor swipe file or auditing what a brand is actually running.

***

### Why not build this yourself?

Reddit does not publish an official API for searching its Ads Inspiration Library by keyword or advertiser — the endpoint this Actor calls (`ads-api.reddit.com`) is the same undocumented one the public `ads.reddit.com/inspiration` page itself uses, not a supported developer product. Reddit's official Ads API is for managing your own ad account and campaigns via OAuth, not for searching or reading other advertisers' public creatives. Building this yourself means reverse-engineering that endpoint, maintaining an anonymous-session bootstrap that Reddit can invalidate at any time, handling proxy escalation when Reddit throttles or blocks a connection, and separately wiring up a second data source (a public Reddit archive) to resolve advertiser karma and subreddit activity — then keeping all of it working as Reddit changes its frontend. This Actor already does all of that and keeps both layers in sync per row.

***

### How to scrape Reddit Ads with Reddit Ads Scraper With Advertiser Data?

1. Open **Reddit Ads Scraper With Advertiser Data** on the Apify Console.
2. Add one or more values to **`advertiserTargets`** — keywords or advertiser names (e.g. `ai`, `crypto`) — or leave it empty to pull the whole public ad catalog.
3. Set the real query controls this Actor exposes: `industry`, `budgetCategory`, `postType`, `placements`, `objectiveType`, and toggle `includeAdvertiserProfile` / `includeSubredditAffinity`.
4. Click **Start**.
5. Open the **Output** tab to browse results live, or export the dataset as JSON, CSV, Excel, HTML or XML once the run finishes.

```json
{
  "advertiserTargets": ["ai", "crypto"],
  "maxItems": 10,
  "includeAdvertiserProfile": true,
  "includeSubredditAffinity": true
}
```

#### How to run multiple queries in one job

`advertiserTargets` is a `stringList` field — use **Add item** to queue several keywords or advertiser names in one run; the base Actor's own `queries` field is still accepted as a fallback whenever `advertiserTargets` is left empty, so a base-shaped input keeps working unchanged. Results are de-duplicated globally by ad ID across every query in the run, and each distinct advertiser's karma and subreddit-affinity data is resolved once and reused for every ad from that same account — no repeated lookups. Concurrency across queries is not configurable; queries run one after another within the same session.

***

### ⬇️ Input

⚠️ **The real constraint to know before you start:** Reddit's public Ads Inspiration Library serves the same fixed sample of roughly 30 ads to every anonymous visitor. On the default (no-session) access path, `advertiserTargets`/`queries` mainly control what gets logged per pass, and the creative filters (`industry`, `budgetCategory`, `postType`, `placements`, `objectiveType`) mostly reorder that same fixed sample rather than truly filtering the catalog — every ad in the sample is still returned and enriched with advertiser data regardless. This is disclosed on every row via `accessMode`.

| Parameter | Required | Type | Constraints | Description |
| --- | --- | --- | --- | --- |
| `advertiserTargets` | No | array | `editor=stringList` | Advertisers or ad keywords to search (bulk supported via **Add item**). Leave empty to pull the entire public ad catalog. |
| `queries` | No | array | `editor=stringList` | Legacy alias for `advertiserTargets`, kept for compatibility with the base Reddit Ads Scraper's input shape. Used only when `advertiserTargets` is empty. |
| `maxItems` | No | integer | default `5`, min `1`, max `30` | How many ads to collect per keyword. Hard-capped at 30 — Reddit's own ceiling for anonymous visitors. |
| `industry` | No | string (enum) | default `""` | `""` (Any industry), `TECH_B2C`, `TECH_B2B`, `EDUCATION`, `ENTERTAINMENT`, `HEALTH_AND_BEAUTY`, `GAMING`, `EMPLOYMENT`, `RETAIL_AND_ECOMMERCE`, `AUTO`, `FINANCIAL_SERVICES`, `TRAVEL`, `REAL_ESTATE`, `GAMBLING_AND_FANTASY_SPORTS`, `POLITICS_AND_GOVERNMENT`, `CONSUMER_PACKAGED_GOODS`, `OTHER` |
| `budgetCategory` | No | string (enum) | default `""` | `""` (Any budget), `LOW`, `MEDIUM`, `HIGH` |
| `postType` | No | string (enum) | default `""` | `""` (Any format), `IMAGE`, `VIDEO`, `CAROUSEL`, `FREE_FORM` |
| `placements` | No | string (enum) | default `""` | `""` (Any placement), `FEED`, `COMMENTS_PAGE`, `CONVERSATION` (rarely observed live) |
| `objectiveType` | No | string (enum) | default `""` | `""` (Any objective), `AWARENESS`, `CONVERSIONS`, `APP_INSTALLS`, `TRAFFIC`, `VIDEO_VIEWABLE_IMPRESSIONS` |
| `includeAdvertiserProfile` | No | boolean | default `true` | Enrich each ad with the advertiser's real post/comment/total karma, account age and last-activity date, sourced from a public Reddit archive (Arctic Shift). This is an aggregate snapshot updated infrequently — some accounts may show `null` values. |
| `includeSubredditAffinity` | No | boolean | default `true` | Enrich each ad with which subreddits the advertiser account is organically active in, ranked by real activity share. |
| `maxAffinitySubreddits` | No | integer | default `10`, min `1`, max `50` | How many top subreddits to list per advertiser in the affinity breakdown. |
| `minAffinityActivityCount` | No | integer | default `1`, min `0`, max `1000` | Drop subreddits where the advertiser's recorded activity count is below this threshold. |
| `proxyConfiguration` | No | object | default `{"useApifyProxy": false}`, `editor=proxy` | Optional. The Actor runs without a proxy by default and automatically adjusts its connection if needed. Power users can pre-select a proxy here. |

No parameter is required — an empty input collects the entire public ad gallery with advertiser intelligence turned on.

#### Example JSON input

```json
{
  "advertiserTargets": ["ai", "crypto"],
  "maxItems": 10,
  "industry": "TECH_B2C",
  "budgetCategory": "HIGH",
  "postType": "",
  "placements": "",
  "objectiveType": "",
  "includeAdvertiserProfile": true,
  "includeSubredditAffinity": true,
  "maxAffinitySubreddits": 10,
  "minAffinityActivityCount": 1,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

#### Common pitfall

Setting `minAffinityActivityCount` too high silently empties `advertiserSubredditAffinity` for accounts that are genuinely active but below your threshold — the field returns `[]`, not an error. If affinity data looks thin, lower the threshold before assuming the account has no history. Likewise, `placements: "CONVERSATION"` is a real enum value but is rarely observed on live ads — don't rely on it as a primary filter.

***

### ⬆️ Output

Each ad is one dataset row combining the ad-creative record with its advertiser-intelligence fields, written live as each ad is collected — the row appears in the output table the instant it's processed, not at the end of the run. Export the dataset as JSON, CSV, Excel, HTML or XML from the Apify Console.

#### Scraped results

```json
[
  {
    "id": "5f6eb24cc504b6d04b6e121a701c03b4",
    "budget_category": "MEDIUM",
    "industry": "TECH_B2C",
    "placements": ["FEED", "COMMENTS_PAGE"],
    "objective": "CONVERSIONS",
    "created_at": "2024-02-27T19:25:25+00:00",
    "headline": "As Seen on Shark Tank",
    "body": "",
    "post_url": "https://www.reddit.com/user/RIPDebt/comments/1b1ki15/as_seen_on_shark_tank/",
    "type": "IMAGE",
    "thumbnail_url": "https://a.thumbs.redditmedia.com/MpMEvF_example.jpg",
    "profile_id": "t2_td6ozens",
    "profile_name": "u_RIPDebt",
    "profile_image_url": "https://www.redditstatic.com/avatars/defaults/v2/avatar_default_0.png",
    "content": [
      {
        "media_url": "https://external-preview.redd.it/vaHsih_example.jpg",
        "destination_url": "https://changed.test-app.link/pkHAhbWqxHb",
        "display_url": "changed.test-app.link",
        "call_to_action": "Learn More",
        "caption": null
      }
    ],
    "allow_comments": true,
    "redditPostId": "t3_1b1ki15",
    "scrapedAt": "2026-08-15T09:12:03.000Z",
    "accessMode": "anonymous_sample",
    "advertiserUsername": "RIPDebt",
    "advertiserPostKarma": 4210,
    "advertiserCommentKarma": 1875,
    "advertiserTotalKarma": 6085,
    "advertiserNumPosts": 62,
    "advertiserNumComments": 340,
    "advertiserEarliestPostAt": "2016-05-02T09:14:11.000Z",
    "advertiserLastPostAt": "2026-07-30T18:02:44.000Z",
    "advertiserSubredditAffinity": [
      { "username": "RIPDebt", "subreddit": "personalfinance", "activityCount": 41, "activityShare": 22.4, "affinityRank": 1 },
      { "username": "RIPDebt", "subreddit": "CreditCards", "activityCount": 18, "activityShare": 9.8, "affinityRank": 2 }
    ],
    "advertiserProfileCoverageNote": "Karma/account-age fields come from an aggregate archive snapshot (Arctic Shift), not a live profile page -- it updates infrequently and may show null for accounts with no indexed history. Subreddit affinity is fetched fresh this run."
  },
  {
    "id": "a13c9e7d2f804e1f9b6ac112ee309d21",
    "budget_category": "HIGH",
    "industry": "GAMING",
    "placements": ["FEED"],
    "objective": "APP_INSTALLS",
    "created_at": "2025-11-03T14:02:10+00:00",
    "headline": "Build Your Empire — Play Free",
    "body": "New season live now.",
    "post_url": "https://www.reddit.com/user/EmpireGamesHQ/comments/1g9k2p1/build_your_empire/",
    "type": "CAROUSEL",
    "thumbnail_url": "https://a.thumbs.redditmedia.com/xQ92pl_example.jpg",
    "profile_id": "t2_9f3k1lm",
    "profile_name": "u_EmpireGamesHQ",
    "profile_image_url": "https://www.redditstatic.com/avatars/defaults/v2/avatar_default_3.png",
    "content": [
      { "media_url": "https://external-preview.redd.it/slide1_example.jpg", "destination_url": "https://play.empiregames.example/install", "display_url": "play.empiregames.example", "call_to_action": "Install Now", "caption": "New season live" },
      { "media_url": "https://external-preview.redd.it/slide2_example.jpg", "destination_url": "https://play.empiregames.example/install", "display_url": "play.empiregames.example", "call_to_action": "Install Now", "caption": "Limited-time rewards" }
    ],
    "allow_comments": false,
    "redditPostId": "t3_1g9k2p1",
    "scrapedAt": "2026-08-15T09:12:05.000Z",
    "accessMode": "anonymous_sample",
    "advertiserUsername": "EmpireGamesHQ",
    "advertiserPostKarma": null,
    "advertiserCommentKarma": null,
    "advertiserTotalKarma": null,
    "advertiserNumPosts": null,
    "advertiserNumComments": null,
    "advertiserEarliestPostAt": null,
    "advertiserLastPostAt": null,
    "advertiserSubredditAffinity": [],
    "advertiserProfileCoverageNote": "Karma/account-age fields come from an aggregate archive snapshot (Arctic Shift), not a live profile page -- it updates infrequently and may show null for accounts with no indexed history. Subreddit affinity is fetched fresh this run."
  },
  {
    "id": "77bd410e5c4a4b0e8f0e2a8f4f7cb9aa",
    "budget_category": "LOW",
    "industry": "FINANCIAL_SERVICES",
    "placements": ["FEED", "CONVERSATION"],
    "objective": "TRAFFIC",
    "created_at": "2025-06-19T08:44:51+00:00",
    "headline": "Track every dollar in one app",
    "body": "Free budgeting, no ads, no upsells.",
    "post_url": "https://www.reddit.com/user/BudgetLoop/comments/1eu4j0q/track_every_dollar/",
    "type": "TEXT",
    "thumbnail_url": null,
    "profile_id": "t2_5h2n8qs",
    "profile_name": "u_BudgetLoop",
    "profile_image_url": "https://www.redditstatic.com/avatars/defaults/v2/avatar_default_5.png",
    "content": [],
    "allow_comments": true,
    "redditPostId": "t3_1eu4j0q",
    "scrapedAt": "2026-08-15T09:12:07.000Z",
    "accessMode": "anonymous_sample",
    "advertiserUsername": "BudgetLoop",
    "advertiserPostKarma": 312,
    "advertiserCommentKarma": 890,
    "advertiserTotalKarma": 1202,
    "advertiserNumPosts": 14,
    "advertiserNumComments": 76,
    "advertiserEarliestPostAt": "2021-09-01T11:20:00.000Z",
    "advertiserLastPostAt": "2026-08-10T16:05:22.000Z",
    "advertiserSubredditAffinity": [
      { "username": "BudgetLoop", "subreddit": "personalfinance", "activityCount": 9, "activityShare": 15.0, "affinityRank": 1 }
    ],
    "advertiserProfileCoverageNote": "Karma/account-age fields come from an aggregate archive snapshot (Arctic Shift), not a live profile page -- it updates infrequently and may show null for accounts with no indexed history. Subreddit affinity is fetched fresh this run."
  }
]
```

**Every field on the row:**

| Field | Description |
| --- | --- |
| `id` | Stable unique ad identifier. |
| `budget_category` | Spend tier — `LOW` / `MEDIUM` / `HIGH`. |
| `industry` | Advertiser's declared industry. |
| `placements` | Where the ad runs, e.g. `FEED`, `COMMENTS_PAGE`. |
| `objective` | Campaign objective, e.g. `CONVERSIONS`, `IMPRESSIONS`. |
| `created_at` | ISO timestamp the ad post was created. |
| `headline` | Ad headline / title. |
| `body` | Ad body text — may be empty for image/video ads. |
| `post_url` | Link to the underlying Reddit post. |
| `type` | Creative format — `IMAGE`, `VIDEO`, `CAROUSEL`, or `TEXT`. |
| `thumbnail_url` | Thumbnail image of the creative. |
| `profile_id` | Advertiser's Reddit profile ID as shown in the ads library. |
| `profile_name` | Advertiser's Reddit username as shown in the ads library (`u_...` form). |
| `profile_image_url` | Advertiser's avatar. |
| `content` | List of creative slides — each with `media_url`, `destination_url`, `display_url`, `call_to_action`, `caption`. |
| `allow_comments` | Whether comments are allowed on the ad's underlying Reddit post. |
| `redditPostId` | The Reddit post fullname behind the ad (`t3_...`). |
| `scrapedAt` | ISO timestamp of when this row was collected. |
| `accessMode` | `"anonymous_sample"` or `"authenticated"` — discloses which access path produced this row. |
| `advertiserUsername` | Advertiser's bare Reddit username (`u_` prefix stripped) used to look up the fields below. |
| `advertiserPostKarma` | Advertiser's real post karma. `null` when not resolvable. |
| `advertiserCommentKarma` | Advertiser's real comment karma. `null` when not resolvable. |
| `advertiserTotalKarma` | Advertiser's real total karma. `null` when not resolvable. |
| `advertiserNumPosts` | Advertiser's indexed post count. |
| `advertiserNumComments` | Advertiser's indexed comment count. |
| `advertiserEarliestPostAt` | Earliest indexed activity — an account-age signal. |
| `advertiserLastPostAt` | Most recent indexed activity — a recency signal. |
| `advertiserSubredditAffinity` | List of `{username, subreddit, activityCount, activityShare, affinityRank}` — the advertiser's organic community activity, ranked by share. |
| `advertiserProfileCoverageNote` | Honest disclosure of the advertiser-data source's coverage and freshness limits. |

The default dataset view surfaces `id`, `headline`, `type`, `industry`, `budget_category`, `objective`, `placements`, `created_at`, `post_url`, `accessMode`, `scrapedAt` in a table; three additional views ship with the Actor — **Creative & Content**, **Advertiser Profile**, and **Advertiser Intelligence** — for reviewing the fields above without scrolling a wide table.

***

### How can I use the data extracted with Reddit Ads Scraper With Advertiser Data?

- 📊 **Paid social & competitive-intel teams:** pull every ad running for a competitor or keyword, diff `headline`/`body`/`type` against last week's run to catch new creative angles before they scale.
- 🤖 **AI engineers and LLM developers:** the agent issues a query against `advertiserTargets`, receives structured JSON back, and passes `headline`, `body`, and `advertiserSubredditAffinity` to the model as grounded context for ad-strategy summaries.
- 🔬 **Market researchers:** aggregate `industry`, `budget_category`, and `objective` across a keyword set to track category-level ad-spend and objective mix over time.
- 🕵️ **Agencies and brand-safety teams:** before pitching, partnering with, or reporting on a Reddit advertiser, check `advertiserTotalKarma`, `advertiserEarliestPostAt`, and `advertiserSubredditAffinity` to see whether the account behind the ad is an established Redditor or a single-purpose ad account.

***

### How do you monitor advertiser karma and subreddit affinity over time?

Advertiser due diligence is a repeated-query discipline: an ad account's karma, activity recency, and subreddit footprint change as the account keeps posting (or stops), and those changes are the signal worth tracking. Running the same `advertiserTargets` set on a schedule lets you diff each advertiser's `advertiserTotalKarma`, `advertiserLastPostAt`, and `advertiserSubredditAffinity` against the previous run — a karma jump or a `advertiserLastPostAt` that suddenly goes stale both say something about how real the account behind the ad is. On the creative side, diffing `headline`, `body`, and `content[]` between runs surfaces new creative angles a competitor or watched account starts testing.

A practical loop: schedule a run across your keyword or advertiser set, keep each run's dataset, then compare `advertiserUsername` → `advertiserTotalKarma` / `advertiserSubredditAffinity` pairs run-over-run and alert on a meaningful karma delta or a new top-ranked subreddit in the affinity list. Schedule the recurring run from the Apify Console's **Schedules**, or trigger it from your own pipeline via the Apify API — the Actor has no built-in delivery mechanism of its own beyond writing to the dataset, so scheduling and diffing happen on the calling side.

***

### Integrate Reddit Ads Scraper With Advertiser Data and automate your workflow

Reddit Ads Scraper With Advertiser Data works with any language or tool that can send an HTTP request, through the Apify API.

#### REST API with Python

```python
import requests

TOKEN = "YOUR_APIFY_TOKEN"
url = f"https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items?token={TOKEN}"

payload = {
    "advertiserTargets": ["ai"],
    "maxItems": 10,
    "includeAdvertiserProfile": True,
    "includeSubredditAffinity": True,
}

response = requests.post(url, json=payload)
ads = response.json()

for ad in ads:
    print(ad["headline"], "-", ad["advertiserUsername"], ad["advertiserTotalKarma"])
```

#### Scheduled monitoring and delivery

The Actor writes results to its Apify dataset as they're collected; it has no built-in webhook delivery. Set up a recurring run with an Apify **Schedule** in the Console, or attach an Apify **webhook** on the run's `ACTOR.RUN.SUCCEEDED` event to trigger your own pipeline once a run finishes, then pull the dataset via `apify_client` or the REST API above.

***

### Is it legal to scrape Reddit Ads results?

Yes — this Actor collects only data that is already publicly visible: the Ads Inspiration Library is served to any anonymous visitor at `ads.reddit.com/inspiration`, and the advertiser-intelligence fields come from a public Reddit archive that indexes already-public post and comment activity. The ad-creative and campaign fields (`headline`, `budget_category`, `industry`, `objective`, `placements`) are business/campaign data — governed by Reddit's Terms of Service and, for the reused archive, database-rights considerations, not GDPR. The advertiser-intelligence fields (`advertiserPostKarma`, `advertiserEarliestPostAt`, `advertiserSubredditAffinity`, etc.) are tied to an individual Reddit account and its activity history, so if that account belongs to an identifiable natural person, GDPR/CCPA framing can apply to storing and using that portion of the data — treat it accordingly if you operate in the EU/UK or California. Scraping for ad-hoc monitoring carries a different risk profile than scraping at scale for AI-training or resale. Consult your legal team for commercial use cases involving bulk data storage.

***

### Frequently asked questions

#### Does Reddit Ads Scraper With Advertiser Data support regional filtering?

No region or language parameter exists in the input schema — the Actor filters by `industry`, `budgetCategory`, `postType`, `placements`, and `objectiveType`, all inherited from the same fixed anonymous ad sample described above.

#### How many ads does the Actor return per query?

Up to `maxItems` per keyword, hard-capped at 30 — that ceiling is Reddit's own, not an Actor-imposed limit, and matches the size of the fixed sample the public ads gallery serves to anonymous visitors.

#### Does the Actor extract advertiser account intelligence for every ad?

Yes, when `includeAdvertiserProfile` and/or `includeSubredditAffinity` are left on (both default `true`). Karma, account-age and activity-recency fields arrive as `advertiserPostKarma`/`advertiserCommentKarma`/`advertiserTotalKarma`/`advertiserEarliestPostAt`/`advertiserLastPostAt`; subreddit affinity arrives as the `advertiserSubredditAffinity` array. Some accounts return `null` karma fields or an empty affinity array when the archive has no indexed history for them — always disclosed via `advertiserProfileCoverageNote`, never silently faked.

#### How does Reddit Ads Scraper With Advertiser Data handle Reddit's anti-bot measures?

It starts on a direct connection and, if Reddit throttles or blocks it, escalates through a datacenter-proxy tier and then a residential-proxy tier, retrying with backoff on the final tier before giving up on a search. The advertiser-intelligence lookup uses its own, independent proxy ladder against the archive backend. Both are handled automatically — no proxy setup is required.

#### How do I use this Actor to monitor an advertiser's account over time?

Schedule a recurring run against the same `advertiserTargets`, keep each run's dataset, and diff `advertiserTotalKarma`, `advertiserLastPostAt`, and `advertiserSubredditAffinity` per `advertiserUsername` between runs. Trigger the schedule from the Apify Console's Schedules or your own pipeline via the API.

#### Does Reddit Ads Scraper With Advertiser Data work with Claude, ChatGPT, and AI agent frameworks?

It is callable as an HTTP endpoint via the Apify API by any agent framework — an agent can issue a query, receive the structured JSON above, and generate a grounded answer or summary from real ad and advertiser data rather than a model's own recollection.

#### Can I use this Actor without managing proxies or Reddit credentials?

Yes. The Actor opens its own anonymous Reddit Ads session and manages proxy escalation automatically; you supply only the query and filters. A `proxyConfiguration` field is available if you want to pre-select a proxy, but it is optional.

#### Why did a run return fewer ads than `maxItems`?

That reflects Reddit's own sample size, not a scraper fault — the public gallery does not expose more than roughly 30 ads on the anonymous path, and the Actor tops up short keyword matches from that same gallery rather than fabricating extra results.

***

### 💬 Your feedback

Found a bug or a missing field? Let Scrapier know through the Actor's **Issues** tab on its Apify Store page, or leave a review from the Console — both are read and help prioritize fixes and new fields.

# Actor input Schema

## `advertiserTargets` (type: `array`):

📋 Add one or more keywords or advertiser names to search the Reddit Ads library (e.g. `ai`, `crypto`, `fitness`). ✨ Use **Add item** to queue several searches in a single run. 💡 Leave this empty to pull the **entire** public ad catalog. ℹ️ Reddit's public gallery serves the same fixed ~30-ad sample to every anonymous search — this field mainly controls what's LOGGED per pass; every ad is still returned and enriched with advertiser data below.

## `queries` (type: `array`):

♻️ Legacy alias for **Advertisers or ad keywords** above, kept for compatibility with the base Reddit Ads Scraper's input shape. Used only when **advertiserTargets** is empty.

## `maxItems` (type: `integer`):

📦 How many ads to collect for each keyword. ℹ️ Reddit's public ad gallery exposes roughly **30 ads** to anonymous visitors — this is hard-capped at 30, the real ceiling.

## `industry` (type: `string`):

📊 Keep only ads from a specific industry. Choose **Any industry** to skip this filter.

## `budgetCategory` (type: `string`):

💸 Keep only ads in a given spend tier. Choose **Any budget** to skip this filter.

## `postType` (type: `string`):

🖼️ Keep only a specific creative format. Choose **Any format** to skip this filter.

## `placements` (type: `string`):

📰 Keep only ads shown in a specific placement. Choose **Any placement** to skip this filter.

## `objectiveType` (type: `string`):

🚀 Keep only ads running toward a specific marketing objective. Choose **Any objective** to skip this filter.

## `includeAdvertiserProfile` (type: `boolean`):

📈 When ON, each ad row is enriched with the advertiser's real post/comment/total karma, account age and last-activity date, sourced from a public Reddit archive (Arctic Shift). ℹ️ This is an aggregate snapshot, updated infrequently — some accounts may show null values.

## `includeSubredditAffinity` (type: `boolean`):

🗺️ When ON, each ad row also lists which subreddits the advertiser's Reddit account is organically active in, ranked by real activity share — a genuine 'who is really behind this ad, and where else do they post' signal.

## `maxAffinitySubreddits` (type: `integer`):

📦 How many top subreddits to list per advertiser in the affinity breakdown.

## `minAffinityActivityCount` (type: `integer`):

🧹 Drop subreddits where the advertiser's recorded activity count is below this threshold — keeps the affinity list meaningful instead of noise.

## `proxyConfiguration` (type: `object`):

🛡️ Optional. The Actor runs **without a proxy by default** and automatically adjusts its connection if needed. ⚙️ Power users can pre-select a proxy here.

## Actor input object example

```json
{
  "advertiserTargets": [
    "ai"
  ],
  "queries": [],
  "maxItems": 5,
  "industry": "",
  "budgetCategory": "",
  "postType": "",
  "placements": "",
  "objectiveType": "",
  "includeAdvertiserProfile": true,
  "includeSubredditAffinity": true,
  "maxAffinitySubreddits": 10,
  "minAffinityActivityCount": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped ads in the Actor's default dataset, ad-overview view (id, headline, format, industry, budget, objective, placements, created\_at, post\_url, accessMode, scrapedAt).

## `creative` (type: `string`):

Same dataset, creative-and-content view (headline, body, format, thumbnail, allowed comments, creative content blocks, Reddit post id).

## `advertiser` (type: `string`):

Same dataset, advertiser-profile view (ad id, advertiser display name, profile id, avatar, Reddit post link).

## `advertiserIntelligence` (type: `string`):

Same dataset, advertiser-intelligence view (Reddit username, post/comment/total karma, archive post/comment counts, earliest and last post seen, subreddit affinity, coverage note).

## `outputSnapshot` (type: `string`):

A single JSON array of every ad collected this run, written once to the key-value store under the OUTPUT key (a convenience combined-download alongside the dataset).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "advertiserTargets": [
        "ai"
    ],
    "queries": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapier/reddit-ads-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "advertiserTargets": ["ai"],
    "queries": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapier/reddit-ads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "advertiserTargets": [
    "ai"
  ],
  "queries": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call scrapier/reddit-ads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapier/reddit-ads-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ucqIHb08OaUZkOkMs/builds/loJqbJeKKDABfEsuY/openapi.json
