Newsletter Sponsors Scraper — InboxReads Directory
Pricing
from $2.60 / 1,000 newsletter results
Newsletter Sponsors Scraper — InboxReads Directory
Find newsletters that accept sponsorships, cross-promotions or are up for sale — scraped from the InboxReads public directory. Topics, cadence, audience geography, email tooling and sponsor-contact signals per newsletter. Built for sponsor prospecting and newsletter market research.
Find newsletters that accept sponsorships, are open to cross-promotion or are up for sale — scraped from the InboxReads public directory (~3,300 newsletters). 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. |
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. |
onlyNewSinceLastRun | boolean | false | Only output newsletters not seen in previous runs with this flag — see Delta mode. |
maxItems | integer | 100 | Hard cap on directory listings fetched (considered) per run. 0 = the whole directory (~3,300 listings — use with care). With filters on, fewer records may actually be pushed and billed. |
concurrency (Advanced) | integer | 4 | Parallel listing fetches. Keep low — this is a small independent directory site. |
What newsletter data does this scraper extract?
One flat JSON record per newsletter listing:
| Field | Meaning |
|---|---|
id | Stable id, inboxreads:<slug> |
source | Always inboxreads |
slug | Listing slug |
url | Listing page on InboxReads |
name | Newsletter name |
tagline | One-line pitch |
description | Longer description |
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"}] |
audienceCountryCount | How many countries the readership spans |
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 |
listingCreatedAt / listingUpdatedAt | Listing timestamps (ISO 8601) |
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 |
isNew | true on every pushed record — only present when Only new since last run is on |
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
- Set topics to your target verticals (
marketing,finance,ai, ...) — or leave empty for the whole directory. - Turn on Only newsletters accepting sponsors to keep just the sponsorable inventory; add language if you buy in one market.
- Read
sponsorshipPlatformsin 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. - Turn on Only new since last run and schedule the run to monitor newly listed newsletters (new inventory alert).
- Export JSON, CSV or Excel — or call it over the API:
from apify_client import ApifyClientclient = 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"])
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):
{"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}],"audienceCountryCount": 1835,"emailTools": [{"name": "Paved", "category": "sponsorship"},{"name": "BuySellAds", "category": "sponsorship"},{"name": "Marigold Engage by Sailthru", "category": "email service provider"}],"sponsorshipPlatforms": ["Paved", "BuySellAds"],"listingCreatedAt": "2017-09-08T16:45:16.000Z","listingUpdatedAt": "2024-09-24T22:30:18.311Z","relatedSlugs": ["axios-am-pm", "need-2-know", "tip-news", "1440-daily-digest", "daily-dose-1", "boardroom-newsletters"],"parseConfidence": "high","warnings": []}
isNew (delta mode) is added on top of this shape when that input is used.
Delta mode
Turn on Only new since last run (onlyNewSinceLastRun) to have the Actor remember which listings it has already returned (keyed by slug) across runs and skip them.
- Skipped (already-seen) listings are not fetched, not pushed and not billed — repeat runs only pay for newsletters newly added to the directory.
- Every record pushed with this flag on is tagged
"isNew": true. - State is kept in a dedicated key-value store (separate from the run's default store), so it persists across scheduled runs.
- Failed fetches are not marked as seen — they retry on the next run.
Pricing
Pay per event: $0.05 per Actor start + $0.004 per newsletter record pushed. Filters run before billing — records filtered out are never charged. A full-directory sweep (maxItems: 0, no filters) is ~3,300 records ≈ $13.25; a typical filtered topic run (maxItems: 100) costs at most $0.45.
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.
Can I monitor for new newsletters? Yes — schedule the actor with onlyNewSinceLastRun: true. Only newly listed newsletters are pushed (and billed) on each run.
Integrations
Export results as JSON, CSV or Excel, or wire this Actor into Make, Zapier or n8n; call it programmatically with run-sync-get-dataset-items; or use it from AI agents via the Apify MCP server.