# Reddit Ad Library Scraper — Ad Inspiration (Competitor Ads) (`memo23/reddit-ad-inspiration-scraper`) Actor

Reddit Ad Library scraper — pull real ads from Reddit's official Ad Inspiration Library: headline, body, CTA, landing page, media, plus industry, budget tier, objective & placement per ad. Search by keyword, filter by vertical. Zero auth — no login or token. JSON/CSV, $5/1k.

- **URL**: https://apify.com/memo23/reddit-ad-inspiration-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, Agents, AI
- **Stats:** 12 total users, 11 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 ad scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Ad Library Scraper — Ad Inspiration (Competitor Ads)

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-reddit-ads.png" alt="Reddit Ad Library Scraper" width="760">
</p>

**Spy on real Reddit ads.** This actor pulls Reddit's own **Ad Inspiration Library** — the gallery of live, best‑performing promoted posts that Reddit shows advertisers — and returns each ad as clean JSON: headline, body, call‑to‑action, destination URL, media, advertiser, plus the **industry, budget tier, campaign objective and placements**. Search by keyword and filter by vertical, budget, objective or placement.

> **Zero setup. No login, no token, no cookies.** Just run it. Most Reddit‑ad scrapers make you paste a session or an API key — this one ships with a maintained session and refreshes its own access token, so it works out of the box.

| You provide | You get back |
|---|---|
| A keyword (e.g. `insurance`, `crypto`, `skincare`) | Every matching ad in the Inspiration Library |
| Nothing (empty query) | Top ads across **all** verticals |
| Optional filters (industry / budget / objective / placement) | Only the ads that match |

> Pure HTTP against Reddit's official ads API. No browser, no third‑party CF‑bypass service.

### Why use it

- **Competitor ad intelligence** — see exactly what brands in your niche are running on Reddit: their hook, creative, CTA and landing page.
- **The official library, not feed‑scraping** — searchable by advertiser vertical/objective/budget, not just whatever ads happen to be served to a browsing session.
- **Richest schema on the Store** — 17 fields per ad, including the campaign‑level metadata (industry, budget tier, objective, placements) most scrapers can't see.
- **Truly hands‑off** — auto‑refreshing auth means no expiring tokens to babysit.

### How it works

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-reddit-ads.png" alt="How it works" width="820">
</p>

1. The actor mints a fresh short‑lived access token from a maintained Reddit Ads session (auto‑refresh — nothing for you to configure).
2. It calls Reddit's `inspiration_creatives/search` endpoint with your keyword.
3. It follows cursor pagination until it has `maxItems` ads.
4. Each ad is flattened to a tidy row and pushed to your dataset. Industry / budget / objective / placement filters are applied as it goes.

### Input

| Field | Type | Required | Notes |
|---|---|---|---|
| `query` | string | no | Keyword to search (verticals, brands, topics). Empty = browse top ads across all verticals. |
| `industries` | array | no | Keep only these verticals. See enum below. |
| `budgetCategories` | array | no | Keep only these advertiser budget tiers: `LOW`, `MEDIUM`, `HIGH`. |
| `objectives` | array | no | Keep only these campaign objectives: `CONVERSIONS`, `CLICKS`, `IMPRESSIONS`, `APP_INSTALLS`. |
| `placements` | array | no | Keep only ads in these placements: `FEED`, `COMMENTS_PAGE`. |
| `maxItems` | integer | no | Stop after this many ads (default 100). |
| `redditSessionCookies` | string | no | *Advanced/optional.* Bring your own Reddit Ads session (auto‑refreshes). Leave empty to use the built‑in session. |
| `bearerToken` | string | no | *Advanced/optional.* A raw 24h token override. |

**`industries` enum:** `TECH_B2B`, `TECH_B2C`, `FINANCIAL_SERVICES`, `HEALTH_AND_BEAUTY`, `RETAIL_AND_ECOMMERCE`, `ENTERTAINMENT`, `GAMING`, `EDUCATION`, `POLITICS_AND_GOVERNMENT`, `OTHER`.

#### Example input

```json
{
  "query": "insurance",
  "industries": ["FINANCIAL_SERVICES"],
  "maxItems": 200
}
```

### Output

One row per ad. Example (real result):

```jsonc
{
  "id": "0ce788d0838ff83de532ffed5bf45a07",
  "industry": "FINANCIAL_SERVICES",
  "budgetCategory": "LOW",
  "objective": "CONVERSIONS",
  "placements": ["COMMENTS_PAGE", "FEED"],
  "creativeType": "TEXT",
  "headline": "Life can be expensive... Life insurance doesn't need to be.",
  "body": "Compare quotes from top Canadian insurers in minutes.",
  "callToAction": "Learn More",
  "destinationUrl": "https://www.coveredforlife.ca/get-a-quote/",
  "displayUrl": "coveredforlife.ca",
  "mediaUrl": null,
  "thumbnailUrl": "https://b.thumbs.redditmedia.com/…jpg",
  "postUrl": "https://www.reddit.com/user/coveredforlife/comments/1eg2hwu/…",
  "createdAt": "2024-07-28T14:11:03+00:00",
  "advertiserName": "u_coveredforlife",
  "advertiserId": "t2_abc123",
  "creativeId": "t3_1eg2hwu"
}
```

#### Key output fields

| Field | Description |
|---|---|
| `industry` | Advertiser vertical (see enum). |
| `budgetCategory` | Relative campaign budget tier: LOW / MEDIUM / HIGH. |
| `objective` | Campaign objective (CONVERSIONS, CLICKS, …). |
| `placements` | Where the ad ran (FEED, COMMENTS\_PAGE). |
| `headline` | The ad's headline (always present). |
| `body` | Longer post text. Populated on `TEXT` ads; empty on `IMAGE` / `VIDEO` ads, where the headline carries the copy. |
| `callToAction` | Button label (Learn More, Sign Up, …). |
| `destinationUrl` / `displayUrl` | The landing page. |
| `mediaUrl` / `thumbnailUrl` | Ad image/video and preview. |
| `postUrl` | The promoted post on Reddit. |
| `advertiserName` / `advertiserId` | Who ran it. |

### Pricing

Pay‑per‑result: **$5.00 per 1,000 ads** ($0.005 each). No monthly rental, no start fee — you pay only for the ads you keep.

### What makes this richer than the competition

| Capability | Other Reddit‑ad actors | This actor |
|---|---|---|
| Auth required from you | Paste a token / API key | **None — built‑in, self‑refreshing** |
| Source | Feed‑scraping (ephemeral) or a resold 3rd‑party API | **Reddit's official Inspiration Library, direct** |
| Search by keyword | Sometimes | ✅ |
| Industry / budget / objective / placement | Rarely | ✅ all four |
| Campaign metadata + creative + CTA + landing page | Partial | ✅ 17 fields |

### Notes & limitations

- The library surfaces ads Reddit has featured as inspiration (recent, better‑performing promoted posts) — it is not a 100% exhaustive archive of every Reddit ad ever run.
- `body` is empty for image and video ads; that is how Reddit stores them (the headline holds the copy). `callToAction` is likewise absent on a minority of ads.
- Industry/budget/objective/placement filters are applied to the returned results; combine with a `query` to narrow server‑side first.
- Reddit may change its ads API; if a run fails, it's usually a transient upstream change — retry or open an issue.

### FAQ

**Do I need a Reddit account or Ads account?** No. Auth is built in and refreshes itself.

**Can I use my own Reddit Ads session?** Yes — paste it into `redditSessionCookies` (it auto‑refreshes the token). Optional.

**Is this the Meta‑style public ad library?** Reddit has no public Meta‑style library. This is Reddit's *Ad Inspiration Library* from inside Ads Manager — the closest and richest source of real Reddit ads.

**How fresh are the ads?** The library is maintained by Reddit and reflects recently active/featured promoted posts.

### 🤖 For AI Agents & LLM Apps

- **Purpose:** competitor ad intelligence — search Reddit's Ad Inspiration Library and return structured ads (creative + CTA + landing page + industry/budget/objective/placement).
- **Minimal input:** `{ "query": "crypto", "maxItems": 50 }` (no auth needed).
- **Output fields (flat):** `id, industry, budgetCategory, objective, placements[], creativeType, headline, body, callToAction, destinationUrl, displayUrl, mediaUrl, thumbnailUrl, postUrl, createdAt, advertiserName, advertiserId, creativeId`.
- **Billing:** pay‑per‑result, $5 / 1,000 ads. `maxItems` bounds cost.
- **Behavior:** one dataset item per ad; `query` searches server‑side; array filters (industries/budgetCategories/objectives/placements) narrow results; cursor‑paginated to `maxItems`.

### ⚠️ Disclaimer

This actor collects only data that Reddit makes available to advertisers in its Ad Inspiration Library. Use it in compliance with Reddit's Terms of Service and all applicable laws (including data‑protection and advertising regulations). You are responsible for how you use the scraped data. This tool is provided for market research and competitive analysis; it is not affiliated with or endorsed by Reddit, Inc.

### SEO Keywords

Reddit ad library, Reddit ads scraper, Reddit ad inspiration, Reddit ad spy, competitor ads Reddit, Reddit promoted posts, Reddit advertising research, ad intelligence Reddit, scrape Reddit ads, Reddit ads api, Reddit marketing intelligence, Reddit creative library, Reddit ad examples, ad copy research, competitor ad analysis.

# Actor input Schema

## `query` (type: `string`):

Keyword to search the Ad Inspiration Library (e.g. "insurance", "crypto", "skincare"). Leave empty to browse top ads across all verticals.

## `industries` (type: `array`):

Keep only ads in these verticals (client-side filter).

## `budgetCategories` (type: `array`):

Keep only ads in these advertiser budget tiers.

## `objectives` (type: `array`):

Keep only ads with these campaign objectives.

## `placements` (type: `array`):

Keep only ads that ran in these placements.

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

Stop after collecting this many ads (after filtering).

## `redditSessionCookies` (type: `string`):

Cookie header from a logged-in Reddit Ads session (must include reddit\_session). The actor auto-mints a fresh 24h token from these on every run, so you only paste them rarely (they last ~6 months). Grab from ads.reddit.com → DevTools → Network → the page-document request → Copy as cURL → the '-b' / Cookie value. See README.

## `bearerToken` (type: `string`):

Optional: a raw 24h Reddit Ads bearer token, used only if you leave session cookies empty. Expires in ~24h with no auto-refresh — prefer the cookies field above.

## `scrapedoKey` (type: `string`):

Optional: run the requests on your own Scrape.do credits instead of the built-in key. Leave empty to use the included one (no setup needed).

## Actor input object example

```json
{
  "query": "insurance",
  "maxItems": 100
}
```

# 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 = {
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/reddit-ad-inspiration-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 = { "maxItems": 100 }

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

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

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

```

## CLI example

```bash
echo '{
  "maxItems": 100
}' |
apify call memo23/reddit-ad-inspiration-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/reddit-ad-inspiration-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/wbTRsjr2QXo8lBhyt/builds/M84kkCgoTMx6fUmhh/openapi.json
