# Newsletter Sponsor Finder — InboxReads Directory Scraper (`nomad-agent/newsletter-sponsors-scraper`) Actor

Find newsletters that accept sponsorships, cross-promotions or are up for sale — from the InboxReads public directory. Topics, cadence, audience geo, ad-platform and sponsor-contact signals per newsletter. For sponsor prospecting and market research. See the Pricing tab for current charges.

- **URL**: https://apify.com/nomad-agent/newsletter-sponsors-scraper.md
- **Developed by:** [Nomad.Devs](https://apify.com/nomad-agent) (community)
- **Categories:** Marketing, Lead generation
- **Stats:** 12 total users, 5 monthly users, 94.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 1,000 newsletter results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Newsletter Sponsor Finder — InboxReads Directory Scraper

### Start with one input and output

An Apify account is required. Use your Apify API token when calling the API; Console runs do not need that token pasted into the input. No source login or AI-provider key is required for this quickstart. none.

Free-tier event rates checked 2026-10-04: `result` $0.0002; `actor-start` $5e-05.

**Cost:** Total = Actor event charges + platform usage if separately billed + any BYO-provider charges. See “Current costs” for your event rates, plan tiers and a calculation. A sample does not promise future billable volume.

Input and output below were read from the same successful run `oiRnh7eCiluop8BrB` (2026-10-04, immutable build `HJ5anGC64pMUpTKd7`). This is an observed example, not a guarantee that repeating it returns this row. It used the selected build at capture time.

**Input JSON**

```json
{
  "onlyAcceptingSponsors": false,
  "onlyOpenToCrossPromotion": false,
  "onlyForSale": false,
  "maxItems": 100,
  "concurrency": 4,
  "analyticsEnabled": false
}
```

**Matching output excerpt**

Long strings and arrays are shortened for display; this is not a complete dataset fixture.

```json
{
  "id": "inboxreads:theskimm",
  "listingId": 981,
  "source": "inboxreads",
  "slug": "theskimm",
  "url": "https://inboxreads.co/n/theskimm",
  "name": "Daily Skimm",
  "tagline": "The morning newsletter that millions wake up to",
  "description": "Meet, news without all the noise. The Daily Skimm connects the dots on how the day’s biggest stories affect your life.",
  "topics": [
    "news",
    "business"
  ],
  "language": "english",
  "sendIntervalDays": 1,
  "sendFrequency": "daily",
  "acceptsSponsorships": true,
  "allowsCrossPromotion": false,
  "isForSale": false,
  "paidStatus": "free",
  "hasSponsorContact": false,
  "hasAdvertiseUrl": true,
  "favourites": 177,
  "ranks": {
    "all": 2,
    "news": 2,
    "sports": 2,
    "business": 2,
    "politics": 2,
    "entertainment": 1
  },
  "audienceCountries": [
    {
      "country": "United States",
      "score": 191
    },
    {
      "country": "India",
      "score": 22
    }
  ],
  "audienceCountryTotal": 2024,
  "audienceCountryCount": 2024,
  "emailTools": [
    {
      "name": "Paved",
      "category": "sponsorship"
    },
    {
      "name": "BuySellAds",
      "category": "sponsorship"
    }
  ],
  "sponsorshipPlatforms": [
    "Paved",
    "BuySellAds"
  ],
  "listingApprovedAt": "2017-09-08T16:45:16.000Z",
  "listingCreatedAt": "2017-09-08T16:45:16.000Z",
  "listingUpdatedAt": "2024-09-24T22:30:18.311Z",
  "launchedAt": null,
  "hasPublicArchive": false,
  "hasSampleIssue": false,
  "relatedSlugs": [
    "axios-am-pm",
    "need-2-know"
  ],
  "parseConfidence": "high",
  "warnings": []
}
```

> **Claude / Codex skill to describe and setup this actor: [SKILL.md](https://github.com/Exdenta/OinkAIJobSearch/blob/main/skill/newsletter-sponsors-scraper/SKILL.md)**

Find newsletters that **accept sponsorships**, are **open to cross-promotion** or are **up for sale** — scraped from the [InboxReads](https://inboxreads.co) public directory (3,365 listings in the 2026-08-17 sitemap snapshot). Per newsletter: topics, send cadence, audience geography, the email/sponsorship tooling it runs on (Paved, BuySellAds, Passionfroot, beehiiv, Mailchimp...), whether a sponsor-contact route exists, and directory popularity ranks. No login, no proxies.

Built for **sponsor prospecting** (media buyers and brands hunting placement inventory), **newsletter competitive research**, and **acquisition scouting** (`onlyForSale`).

### What makes this different

Other InboxReads scrapers return name, description and topics. This one is built around **sponsor intelligence** — a combination of first-class, filterable fields no other newsletter-directory Actor exposes:

- `acceptsSponsorships`, `allowsCrossPromotion`, `isForSale` — filter the directory straight down to buyable / swappable / acquirable inventory.
- `sponsorshipPlatforms` — the ad networks a newsletter actually sells through (Paved, BuySellAds, Passionfroot...), **detected from its tooling stack rather than self-reported**, so you know *where to go buy*. Filter on it directly.
- `hasSponsorContact` / `hasAdvertiseUrl` — whether a contact route / media kit exists.
- `audienceCountries` — reader geography, for market-matched buys.

**On the fields we deliberately leave out:** we do not emit subscriber counts or open/click rates. InboxReads gates those behind its Pro plan on every public listing, so a scraper can only ever return them as `null` (or a fabricated guess). We return what is actually public and skip the always-empty columns — see the FAQ below.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `topics` | array of strings | `["business", "marketing"]` | Only newsletters tagged with at least one of these topics (case-insensitive). Empty list = all topics. Full topic list: [inboxreads.co/topics](https://inboxreads.co/topics). |
| `onlyAcceptingSponsors` | boolean | `false` | Only newsletters whose listing says they accept paid sponsorships/ads (roughly half the directory). |
| `onlyOpenToCrossPromotion` | boolean | `false` | Only newsletters open to cross-promotion swaps. |
| `onlyForSale` | boolean | `false` | Only newsletters marked as up for sale. |
| `sponsorshipPlatforms` | array of strings | *(empty)* | Only newsletters that sell sponsorships through at least one of these platforms (case-insensitive), e.g. `Paved`, `BuySellAds`, `Passionfroot`. Detected from the tooling stack, not self-reported. Empty = any platform. |
| `language` | string | *(empty)* | Only newsletters written in this language, e.g. `english`, `spanish`. Empty = any. |
| `maxItems` | integer | `100` | Stop after this many newsletters have been returned (= billed results). Filters don't shrink your result count — the scraper keeps scanning until it has this many matches or the directory is exhausted. `0` = no cap (whole directory; 3,365 listings in the 2026-08-17 sitemap snapshot). |
| `concurrency` *(Advanced)* | integer | `4` | Parallel listing fetches. Keep low — this is a small independent directory site. |
| `analyticsEnabled` *(Privacy)* | boolean | `false` | Opt in to privacy-safe aggregate debug analytics sent to the Actor creator's analytics endpoint. No caller IDs, filters, records, URLs, source text, raw errors or credentials are sent. |

### What newsletter data does this scraper extract?

One flat JSON record per newsletter listing:

| Field | Meaning |
|---|---|
| `id` | Stable id, `inboxreads:<slug>` |
| `listingId` | InboxReads' numeric listing ID, useful for source reconciliation |
| `source` | Always `inboxreads` |
| `slug` | Listing slug |
| `url` | Listing page on InboxReads |
| `name` | Newsletter name |
| `tagline` | Verbatim one-line pitch from the public directory listing; InboxReads controls its length |
| `description` | Verbatim description from the public directory listing; not generated, summarized, or truncated by this Actor. It is listing copy, not a newsletter issue or full editorial archive. |
| `topics` | Topic tags, e.g. `["business", "tech"]` |
| `language` | Language, e.g. `english` |
| `sendIntervalDays` | Send cadence in days (`1` = daily, `7` = weekly) — `null` if not stated |
| `sendFrequency` | Human label derived from the above (`daily`, `weekly`, `biweekly`, ...) |
| `acceptsSponsorships` | `true` if the listing says it accepts paid sponsorships/ads |
| `allowsCrossPromotion` | `true` if open to cross-promo swaps |
| `isForSale` | `true` if the newsletter is listed for sale |
| `paidStatus` | `free` / paid-subscription status of the newsletter itself |
| `hasSponsorContact` | `true` if the directory exposes a contact route for this newsletter |
| `hasAdvertiseUrl` | `true` if the newsletter publishes its own advertise/media-kit link |
| `favourites` | Directory likes — popularity proxy |
| `ranks` | Directory rank overall and per topic, e.g. `{"all": 1, "news": 1}` |
| `audienceCountries` | Top reader countries with relative score, `[{"country", "score"}]` |
| `audienceCountryTotal` | Raw total supplied with InboxReads' country distribution. It is **not** a number of countries and the public listing does not document its unit, so do not interpret it as subscribers. |
| `audienceCountryCount` | Deprecated compatibility alias for `audienceCountryTotal`; retained for existing integrations and carries the same raw value. |
| `emailTools` | Detected stack, `[{"name", "category"}]` — category `sponsorship` shows which sales platform (Paved, BuySellAds, Passionfroot...) the newsletter sells through |
| `sponsorshipPlatforms` | Flat list of the sponsorship sales platforms from `emailTools`, e.g. `["Paved", "BuySellAds"]` — the actionable "where to go buy" signal, and the `sponsorshipPlatforms` input filters on it |
| `listingApprovedAt` / `listingCreatedAt` / `listingUpdatedAt` | Listing timestamps (ISO 8601) |
| `launchedAt` | Newsletter launch timestamp, when stated by the listing |
| `hasPublicArchive` / `hasSampleIssue` | Public-directory signals that an archive or sample issue exists; this Actor does not fetch either resource |
| `relatedSlugs` | Similar newsletters (slugs) — feed them back in as seeds |
| `parseConfidence` | `high` / `medium` / `low` — how cleanly the page parsed |
| `warnings` | Parse warnings, empty when clean |

Subscriber counts and open/click rates are **not** included: InboxReads gates them behind its Pro plan on every listing we sampled, and this actor only reads public pages — no always-empty columns, no fabricated numbers.

### How to find newsletter sponsorship inventory with this Actor

1. Set **topics** to your target verticals (`marketing`, `finance`, `ai`, ...) — or leave empty for the whole directory.
2. Turn on **Only newsletters accepting sponsors** to keep just the sponsorable inventory; add **language** if you buy in one market.
3. Read `sponsorshipPlatforms` in the output — the platforms (Paved, BuySellAds, Passionfroot...) where that newsletter actually sells placements, i.e. where to go buy. To target one ad network, put its name in the **Sponsorship platforms** input (e.g. `["Paved"]`) and only newsletters selling through it come back.
4. Schedule the run and compare snapshots downstream to monitor newly listed newsletters (new inventory alert).
5. Export JSON, CSV or Excel — or call it over the API:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nomad-agent/newsletter-sponsors-scraper").call(run_input={
    "topics": ["marketing", "business"],
    "onlyAcceptingSponsors": True,
    "maxItems": 200,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], "|", item["sendFrequency"], "|", item["url"])
```

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/nomad-agent~newsletter-sponsors-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"topics": ["marketing"], "onlyAcceptingSponsors": true, "maxItems": 100}'
```

### Output example

Real record (fetched 2026-07-02):

```json
{
  "id": "inboxreads:theskimm",
  "source": "inboxreads",
  "slug": "theskimm",
  "url": "https://inboxreads.co/n/theskimm",
  "name": "Daily Skimm",
  "tagline": "The morning newsletter that millions wake up to",
  "description": "Meet, news without all the noise. The Daily Skimm connects the dots on how the day's biggest stories affect your life.",
  "topics": ["news", "business", "sports", "politics", "entertainment"],
  "language": "english",
  "sendIntervalDays": 1,
  "sendFrequency": "daily",
  "acceptsSponsorships": true,
  "allowsCrossPromotion": false,
  "isForSale": false,
  "paidStatus": "free",
  "hasSponsorContact": false,
  "hasAdvertiseUrl": true,
  "favourites": 174,
  "ranks": {"all": 2, "news": 2, "sports": 2, "business": 2, "politics": 2, "entertainment": 1},
  "audienceCountries": [
    {"country": "United States", "score": 191},
    {"country": "India", "score": 22},
    {"country": "Morocco", "score": 14},
    {"country": "Brazil", "score": 12},
    {"country": "Canada", "score": 12}
  ],
  "audienceCountryTotal": 1911,
  "emailTools": [
    {"name": "Paved", "category": "sponsorship"},
    {"name": "BuySellAds", "category": "sponsorship"},
    {"name": "Marigold Engage by Sailthru", "category": "email service provider"}
  ],
  "sponsorshipPlatforms": ["Paved", "BuySellAds"],
  "listingApprovedAt": "2017-09-08T16:45:16.000Z",
  "listingCreatedAt": "2017-09-08T16:45:16.000Z",
  "listingUpdatedAt": "2024-09-24T22:30:18.311Z",
  "launchedAt": null,
  "hasPublicArchive": false,
  "hasSampleIssue": false,
  "relatedSlugs": ["axios-am-pm", "need-2-know", "tip-news", "1440-daily-digest", "daily-dose-1", "boardroom-newsletters"],
  "parseConfidence": "high",
  "warnings": []
}
```

### Pricing

Pay per event. The Actor’s **Pricing** tab lists the current per-record and per-run charges for your Apify plan. Filters run before billing; records filtered out are not charged. Estimate your run using the current rates and `maxItems`, and use a charge limit for API runs. Directory size changes over time.

Build a prospect list for a specific sponsorship use case, then inspect the public listings to confirm their current contact routes. This Actor bills runs and returned records rather than selling a prospecting subscription.

### FAQ

**Where does the data come from?** The public InboxReads directory (inboxreads.co) — listing pages only. The actor respects the site's robots.txt: InboxReads' own media-kit, ad-rate, sponsor-list and API paths are disallowed there and are never fetched.

**Why are there no subscriber counts or CPM prices?** InboxReads gates subscriber/open-rate/click-rate metrics behind its Pro plan, and newsletter rate cards live on each newsletter's own media-kit page. This actor reports what is public: sponsorship acceptance flags, contact/advertise-URL signals and which sponsorship platform each newsletter sells through (`emailTools`) — enough to build a prospect list; pricing conversations happen on the newsletter's own advertise page.

**How fresh is the data?** Each run fetches live pages. `listingUpdatedAt` tells you when the newsletter's listing itself last changed.

**Some fields are null — why?** Newsletters self-report unevenly. Fields the listing doesn't state come back `null` (never guessed); `parseConfidence` + `warnings` flag records where the page shape looked unusual.

**What happens if the source or dataset is unavailable?** Dataset rows are always newsletter records, never synthetic error rows. A source outage before any records are available, or a run where no valid records can be persisted, correctly fails the run. Individual listing failures and later batch-write failures do not discard rows already persisted; the run log states the exact partial-delivery count. If a result charge cannot be confirmed after a successful dataset write, the row remains delivered and the Actor does not retry the ambiguous charge.

### Integrations

Export results as JSON, CSV or Excel, or wire this Actor into [Make](https://make.com), [Zapier](https://zapier.com) or [n8n](https://n8n.io); call it programmatically with `run-sync-get-dataset-items`; or use it from AI agents via the [Apify MCP server](https://mcp.apify.com).

***

**Found sponsorship inventory with this Actor?** A quick ⭐ review on the [Actor page](https://apify.com/nomad-agent/newsletter-sponsors-scraper) helps other media buyers find it — and tells us which signals to add next. Missing a field or a filter? [Open an issue](https://apify.com/nomad-agent/newsletter-sponsors-scraper/issues) and we usually ship it within days.

### Product guides and related tools

- [Product overview and public links](https://jobatlas.dev/actors/directory/data-tools#nomad-agent-newsletter-sponsors-scraper)
- [Public setup guide](https://github.com/Exdenta/jobatlas/blob/main/docs/public-actors-setup.md)

### Current costs

Current Actor event rates, checked 2026-10-04. USD; use the **Pricing** tab for your plan and later changes.

| Event | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---:|---:|---:|---:|---:|---:|
| Newsletter result (`result`) | $0.0002 | $0.0002 | $0.0002 | $0.0002 | $0.0002 | $0.0002 |
| Actor start (`actor-start`) | $5e-05 | $5e-05 | $5e-05 | $5e-05 | $5e-05 | $5e-05 |

For example, 100 × `result`, 1 × `actor-start` totals **$0.02005 in Actor event charges on Free**. This is an arithmetic example, before any waiver; actual charged events depend on the run and selected options. It is not a promise of output or a charge for simply setting an item cap.

Your total is the charged Actor events, plus platform usage **only if this Actor’s Pricing tab bills it separately**, plus any external provider you use with your own key. Do not add platform usage twice when it is included. Apify credits and plan discounts affect your invoice. Set a run cost limit in Console before starting.

The $0.20-per-1,000 result rate is temporary. A scheduled restoration takes effect on **2026-10-18 at 11:09:16 UTC**: $4.00/1,000 on Free, $3.53 on Bronze, $3.07 on Silver, and $2.60 on Gold/Platinum/Diamond, plus the unchanged $0.00005 start. Check Pricing before a later run.

### A focused sponsorship shortlist

Start with `topics: ["business"]`, `onlyAcceptingSponsors: true`, `language: "english"` and `maxItems: 25`. Compare the returned public sponsorship-platform, cadence and audience-geography signals, then open each listing to confirm its current contact or media-kit route. Export a shortlist keyed by stable `id` and retain your capture date. On later runs, compare those IDs downstream; this Actor does not create an outreach campaign or a schedule for you.

Public directory signals do not establish subscriber reach or campaign performance. A sponsor-contact flag means a route exists, not that an email address was extracted. Use the API example below with the bounded input above; check the current Apify event prices before executing it.

### Fast setup and source code

[Public repository](https://github.com/Exdenta/OinkAIJobSearch) · [Agent setup skill](https://github.com/Exdenta/OinkAIJobSearch/blob/main/.agents/skills/public-apify-actors/SKILL.md).

Use the Actor’s current input form for filters, or start with its documented API example. Select `latest` for `newsletter-sponsors-scraper` and record the immutable build ID and number returned by your run. Inspect the dataset and any run summary the Actor documents together; a successful status alone does not establish complete source coverage.

Restrictive filters or repeat-delivery suppression can produce zero results. Diagnostics and demo records are not source records. Optional AI or translation stays explicit where supported.

#### Observed output example

Selected fields from a real source record inspected on 2026-10-03; consult the output schema for the full contract. Values change with the source.

```json
{
  "id": "inboxreads:theskimm",
  "listingId": 981,
  "source": "inboxreads",
  "slug": "theskimm",
  "url": "https://inboxreads.co/n/theskimm",
  "name": "Daily Skimm",
  "tagline": "The morning newsletter that millions wake up to",
  "description": "Meet, news without all the noise. The Daily Skimm connects the dots on how the day’s biggest stories affect your life.",
  "topics": [
    "news",
    "business",
    "sports",
    "politics",
    "entertainment"
  ],
  "language": "english",
  "sendIntervalDays": 1,
  "sendFrequency": "daily",
  "acceptsSponsorships": true,
  "allowsCrossPromotion": false,
  "isForSale": false,
  "paidStatus": "free",
  "hasSponsorContact": false,
  "hasAdvertiseUrl": true,
  "favourites": 177,
  "ranks": {
    "all": 2,
    "news": 2,
    "sports": 2,
    "business": 2,
    "politics": 2,
    "entertainment": 1
  },
  "audienceCountries": [
    {
      "country": "United States",
      "score": 191
    },
    {
      "country": "India",
      "score": 22
    },
    {
      "country": "Morocco",
      "score": 14
    },
    {
      "country": "Brazil",
      "score": 12
    },
    {
      "country": "Canada",
      "score": 12
    }
  ],
  "audienceCountryTotal": 2020,
  "audienceCountryCount": 2020,
  "emailTools": [
    {
      "name": "Paved",
      "category": "sponsorship"
    },
    {
      "name": "BuySellAds",
      "category": "sponsorship"
    },
    {
      "name": "Marigold Engage by Sailthru",
      "category": "email service provider"
    }
  ],
  "sponsorshipPlatforms": [
    "Paved",
    "BuySellAds"
  ],
  "listingApprovedAt": "2017-09-08T16:45:16.000Z",
  "listingCreatedAt": "2017-09-08T16:45:16.000Z",
  "listingUpdatedAt": "2024-09-24T22:30:18.311Z",
  "launchedAt": null,
  "hasPublicArchive": false,
  "hasSampleIssue": false,
  "relatedSlugs": [
    "axios-am-pm",
    "need-2-know",
    "tip-news",
    "1440-daily-digest",
    "daily-dose-1",
    "boardroom-newsletters"
  ],
  "parseConfidence": "high",
  "warnings": []
}
```

# Actor input Schema

## `topics` (type: `array`):

Only newsletters tagged with at least one of these topics (case-insensitive), e.g. <code>business</code>, <code>tech</code>, <code>marketing</code>, <code>finance</code>, <code>ai</code>. Empty = all topics. Browse the full topic list at inboxreads.co/topics.

## `onlyAcceptingSponsors` (type: `boolean`):

Only newsletters whose listing says they accept paid sponsorships/ads. Roughly half the directory qualifies.

## `onlyOpenToCrossPromotion` (type: `boolean`):

Only newsletters open to cross-promotion swaps with other newsletters.

## `onlyForSale` (type: `boolean`):

Only newsletters whose listing is marked as up for sale (acquisition leads).

## `sponsorshipPlatforms` (type: `array`):

Only newsletters that sell sponsorships through at least one of these platforms (case-insensitive), e.g. <code>Paved</code>, <code>BuySellAds</code>, <code>Passionfroot</code>. Detected from each newsletter's tooling stack, not self-reported — see the <code>sponsorshipPlatforms</code> output field. Empty = any platform. Combine with <code>onlyAcceptingSponsors</code> to target buyable inventory sold through a specific ad network.

## `language` (type: `string`):

Only newsletters written in this language, e.g. <code>english</code>, <code>spanish</code>, <code>german</code>. Empty = any language.

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

Stop after this many newsletters have been returned (= billed results). Filters don't shrink your result count — the scraper keeps scanning the directory until it has this many matching newsletters or the directory is exhausted. 0 = no cap (whole directory; 3,365 listings in the 2026-08-17 sitemap snapshot).

## `concurrency` (type: `integer`):

How many listing pages to fetch in parallel (clamped to 1-8 at runtime). Keep low — this is a small independent directory site.

## `analyticsEnabled` (type: `boolean`):

Optional privacy-preserving diagnostics sent to the Actor creator's Netcup receiver. Includes only Actor/build version, outcome category, coarse duration, result count, enabled feature flags, and closed-enum source health codes. Never includes your Apify user/run/task IDs, filters, newsletter records, URLs, source text, errors, credentials, or a persistent identifier.

## Actor input object example

```json
{
  "topics": [
    "business",
    "marketing"
  ],
  "onlyAcceptingSponsors": false,
  "onlyOpenToCrossPromotion": false,
  "onlyForSale": false,
  "maxItems": 100,
  "concurrency": 4,
  "analyticsEnabled": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "topics": [
        "business",
        "marketing"
    ],
    "analyticsEnabled": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("nomad-agent/newsletter-sponsors-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 = {
    "topics": [
        "business",
        "marketing",
    ],
    "analyticsEnabled": False,
}

# Run the Actor and wait for it to finish
run = client.actor("nomad-agent/newsletter-sponsors-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 '{
  "topics": [
    "business",
    "marketing"
  ],
  "analyticsEnabled": false
}' |
apify call nomad-agent/newsletter-sponsors-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nomad-agent/newsletter-sponsors-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/5nhNZ2iDIPbNUqRX9/builds/fMAqg63PLTAvLXIu1/openapi.json
