# PartnerStack Scraper | SaaS Affiliate Program Monitor (`cauldo/partnerstack-program-monitor`) Actor

Export public PartnerStack SaaS affiliate programs and advertised commission terms. Filter by keyword, category or partner type; track new programs and before/after changes. JSON, CSV and reusable watchlists. No login. $2 per 1,000 saved programs; no start fee.

- **URL**: https://apify.com/cauldo/partnerstack-program-monitor.md
- **Developed by:** [Cauldo](https://apify.com/cauldo) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 program saveds

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/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

## PartnerStack Scraper & SaaS Affiliate Program Monitor

Find SaaS affiliate programs, export their **advertised commission terms**, and track new programs or changes over time. Built for affiliate publishers, comparison sites, agencies and partnership researchers using the public [PartnerStack directory](https://market.partnerstack.com/).

**Run with the defaults:** no PartnerStack account, cookies, API key or proxy setup. The first run returns up to 20 programs, alphabetically, for **$0.04**. JSON and CSV exports are included.

### What you get

- **A usable program database:** name, public program page, website, descriptions, advertised commission headline, additional offer details, categories, partner types and ecosystem tags.
- **Bulk discovery and watchlists:** search several phrases, filter by category or partner type, or supply program slugs/URLs. Programs are deduplicated before billing.
- **Faithful commission wording:** ranges, “up to,” restrictions and time limits remain in the source text. We do not turn customer discounts into commission rates or combine negotiated offers with the public headline.
- **Before/after monitoring:** reuse a named monitor for new programs or changes to commission wording, offer details, descriptions, categories, partner types, ecosystems, name, slug or website. Volatile source timestamps do not create false changes.
- **Useful exports:** an Apify dataset, spreadsheet-safe CSV, available filter values with counts, and a report showing matching, processed, skipped and capped results.
- **Predictable cost:** $2 per 1,000 saved programs; no start fee. Empty searches, filtered programs and unchanged programs skipped by monitoring have no result charge. Platform usage is included.

### Start in one click

Leave the input unchanged and click **Start**. Open **Programs and advertised terms** or **Programs CSV** when the run finishes. Use this input for the current full public directory:

```json
{ "maxResults": 1000 }
```

The public page listed 403 active programs in release testing on September 28, 2026 (Pacific time). That number will change. Coverage is the **public active directory**; “Request Program” placeholders, private programs and negotiated partner-specific terms are excluded.

### Find programs for your audience

```json
{
  "keywords": ["email", "newsletter"],
  "partnerTypes": ["Affiliates"],
  "maxResults": 100
}
```

Keywords match literal phrases in names, descriptions, commission headlines, categories and additional offer details. Entries within each keyword/category/partner-type list use **OR**. Different filters combine with **AND**.

Category and partner-type names match current public labels, ignoring case, spaces and punctuation. For example, `HR Software` and `hr-software` match. Run the defaults and open **Available categories and partner types** (`FACETS`) for all valid values. A typo produces a clear input error rather than a misleading empty result.

`recurringOnly: true` keeps headlines explicitly mentioning “recurring,” “lifetime,” “indefinitely” or “MRR.” The matching wording is in `recurringEvidence`. This is a text filter, **not a recurring payout guarantee** or a complete classification: different wording may be excluded.

### Monitor terms or discover new programs

```json
{
  "programs": ["kit", "apollo", "https://market.partnerstack.com/page/pipedrive"],
  "mode": "changed",
  "monitorName": "my-saas-watchlist",
  "maxResults": 100
}
```

1. The first run creates a baseline and returns matching programs as `new`.
2. Schedule the same input and monitor name in Apify.
3. Later `changed` runs return new programs and changed tracked fields, with `before` and `after` values. Unchanged programs are skipped without a result charge.

| Mode | Output |
| --- | --- |
| `all` | All matching programs up to the cap. Add a monitor name for comparisons. |
| `new` | Programs not previously observed by this monitor. |
| `changed` | New programs and programs with changed tracked fields. |

History belongs to your Apify account in `partnerstack-monitor-<monitorName>`, retained for 90 days and at most 20,000 programs. **Use one non-overlapping schedule per monitor.** A best-effort overlap guard expires 15 minutes after a run starts; it is not an atomic lock.

A monitor records only matching programs it processes. For a complete baseline, allow enough results and spending for all matches. `matchingProgramsFullyProcessed` confirms coverage. Limited runs leave unprocessed programs for a later run; they are not silently marked seen. `firstSeenAt` means first observed by your monitor, not the launch date. Missing watchlist programs are reported, but absence never becomes a claimed closure/removal.

### Output fields

| Field | Meaning |
| --- | --- |
| `programId`, `slug`, `name` | Stable company key, directory slug and name |
| `programUrl`, `websiteUrl` | Public pages; no affiliate tracking added |
| `commissionText`, `offerDetails` | Public headline and additional advertised descriptions, preserving qualifications |
| `description`, `productDescription` | Program and product descriptions |
| `categories`, `partnerTypes`, `ecosystems` | Sorted, deduplicated public labels |
| `mentionsRecurring`, `recurringEvidence` | Literal recurring wording signal and evidence |
| `observationType` | `new`, `changed` or `unchanged`; without history, every row is `new` |
| `changedFields`, `changes` | Changed field names and before/after values |
| `firstSeenAt`, `previousObservedAt`, `observedAt` | UTC observation timestamps |
| `sourceUrl`, `listingStatus`, `fingerprint` | Source, active-directory status and comparison hash |

Missing wording is `null`, not zero. No payout rate, currency, cookie duration, conversion rate, EPC or earnings forecast is invented. Commission text is a public advertisement, not a verified payout or contractual promise. Confirm eligibility and current terms with each program before promoting it.

The Actor provides discovery links. It does not apply to programs, create affiliate links or act in a PartnerStack account.

### Exports and integrations

- The default dataset supports Apify JSON, CSV, Excel and API exports.
- `PROGRAMS.csv` includes readable fields and JSON columns for lists and changes. Formula-like cells are escaped for spreadsheet safety; the dataset retains original text.
- `FACETS` lists categories, partner types and ecosystems with counts across all fetched active programs. Programs can have several labels, so counts overlap.
- `OUTPUT` reports source size, matches, processed programs, skipped unchanged programs, missing watchlist slugs, spending/result caps and pricing.

Use Apify schedules and webhooks with n8n, Make or your own workflow. Webhooks report run completion; inspect dataset items for changes. There is no built-in email alert subscription. Apify API and MCP access are available.

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('cauldo/partnerstack-program-monitor').call({
  keywords: ['email'], maxResults: 50,
}, { maxTotalChargeUsd: 0.10 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Pricing and limits

**One custom event: `program-result`, $0.002 per saved program.**

| Saved programs | Actor price |
| ---: | ---: |
| 20 | $0.04 |
| 100 | $0.20 |
| 1,000 | $2.00 |
| 0 | $0.00 |

These are per-run prices; schedules incur charges when they save results. Apify plan credits may cover usage. CSV exports add no Actor events. Optional custom proxy providers may bill separately.

The maximum run charge is checked before saving each batch. Results are deduplicated, saved durably and billed with an idempotent batch key, so restarting the same interrupted run does not deliberately duplicate a charge. A **new** `all` run returns and bills its results again. Monitoring avoids unchanged result charges.

Limits: 5,000 output rows, 20,000 source programs, a 30 MB response-size check and at most three source request attempts. The directory is fetched once per normal run, then filtered locally; a small result cap does not reduce the source response size. Default memory: 256 MB. Default timeout: 10 minutes.

### Troubleshooting

- **No matches:** successful zero-row run. Broaden filters or inspect `missingPrograms`. No rows means no result charge.
- **Unknown category/partner type:** use current labels from `FACETS`, fix input and rerun.
- **Unchanged monitoring run:** expected success with zero rows. Use `all` for a current snapshot.
- **Limited coverage:** increase `maxResults` or the run charge limit. Check `stopReason` and `matchingProgramsFullyProcessed`.
- **Temporary source failure:** 429/5xx and transient network errors get up to three attempts. A blocked, malformed or unexpectedly empty response fails clearly rather than claiming there were no programs. Retry later; an optional proxy is available.
- **Interrupted write/billing:** saved rows remain available. Restarting the same run uses its saved work and billing key. Avoid overlapping the same monitor.

The public source can change or become unavailable. Release tests cover the current source and specified failures; no scraper can guarantee uninterrupted third-party access. Independent tool; not affiliated with or endorsed by PartnerStack.

# Actor input Schema

## `keywords` (type: `array`):

Optional phrases matched in program name, descriptions, commission headline and categories. OR within this list; case-insensitive literal matching. Leave empty to browse all programs.

## `categories` (type: `array`):

Optional exact category names, such as Marketing, Sales, HR Software or Artificial Intelligence. Case, spaces and hyphens are ignored. OR within this list. Run with defaults to get all valid values in FACETS.

## `partnerTypes` (type: `array`):

Optional exact labels such as Affiliates, Publishers, Referral Partners, Influencers or Agencies. See FACETS for all current values. OR within this list.

## `programs` (type: `array`):

Optional watchlist of up to 100 slugs (kit, apollo, pipedrive) or public detail URLs such as https://market.partnerstack.com/page/kit. Combined with other filters. Missing programs are listed in the report.

## `maxResults` (type: `integer`):

Maximum programs saved and charged in this run. Default 20 costs $0.04. Set 1000 for the current full public directory. Unchanged programs skipped by monitoring do not use this allowance. Alphabetical order.

## `recurringOnly` (type: `boolean`):

Keep headlines explicitly mentioning recurring, lifetime, indefinitely or MRR. A text signal, not a payout guarantee or a complete list of recurring programs. The exact evidence is included.

## `mode` (type: `string`):

New/changed require a monitor name. First run returns a baseline. Later new mode skips known programs; changed mode returns new programs and changes to commission wording, offer details, categories, partner types, descriptions, name or website. Skipped rows are free.

## `monitorName` (type: `string`):

Reuse a unique lowercase name (1–50 letters/digits/hyphens) across scheduled runs, e.g. saas-affiliates. History stays in a named store in your account for 90 days, max 20,000 programs. Use non-overlapping schedules.

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

Direct access is the default and was tested on Apify. Optional Apify/custom proxy for regional access issues. A separate custom proxy provider may charge you under its own terms.

## Actor input object example

```json
{
  "keywords": [],
  "categories": [],
  "partnerTypes": [],
  "programs": [],
  "maxResults": 20,
  "recurringOnly": false,
  "mode": "all",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `programs` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `facets` (type: `string`):

No description

## `report` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("cauldo/partnerstack-program-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("cauldo/partnerstack-program-monitor").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 '{}' |
apify call cauldo/partnerstack-program-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cauldo/partnerstack-program-monitor"
        }
    }
}
```

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/h5B00oxBVjQiORu30/builds/P2dCeLjqqjVTxbfLA/openapi.json
