# AI Tool Affiliate & Referral Program Tracker (`ianymu/ai-tool-affiliate-tracker`) Actor

Detect whether each major AI dev tool (Anthropic, OpenAI, Cursor, Vercel, Supabase, etc.) has a public affiliate or referral program. Extract commission rate, cookie window, payout method and restrictions for partnership teams and creators.

- **URL**: https://apify.com/ianymu/ai-tool-affiliate-tracker.md
- **Developed by:** [Yanlong Mu](https://apify.com/ianymu) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## AI Tool Affiliate & Referral Program Tracker

> **For each major AI dev tool, detect whether a public affiliate or referral program exists — then extract commission rate, cookie window, payout method, and restrictions in one click.**

### What does AI Tool Affiliate Tracker do?

There is no canonical directory of affiliate programs in the AI dev tool space. Creators, SaaS affiliate networks, and partnership teams spend hours hunting through pricing pages, legal sub-pages, and Twitter rumors to find out whether **Anthropic**, **OpenAI**, **Cursor**, **Windsurf**, **Vercel**, or **Supabase** has a referral program — and what the commission actually looks like.

This Actor automates that hunt. It probes ten likely affiliate URL paths for each tool in your input list (`/affiliates`, `/referral`, `/partners`, `/refer-a-friend`, `/legal/affiliates`, etc.), follows redirects, and uses HTML heuristics plus regex extraction to determine:

- Does a public affiliate or referral program exist? (true / false)
- If yes: what is the commission rate, cookie window, payout method, and any restrictions?
- A 500-character raw excerpt of the program page, so a human can verify

Built for [Apify](https://apify.com) — scheduling, integrations, proxy rotation, monitoring and structured dataset output are all included by default.

### Why use this Actor?

- **Content creators and influencers**: build a vetted affiliate stack before recording a tools roundup
- **SaaS affiliate networks** (Partnerstack, Impact, Tolt, Reditus): scout which AI tools have a self-serve program and which need direct outreach
- **Partnership teams**: monitor when a competitor launches or changes their referral terms
- **Comparison sites**: keep your "AI tool review" pages stocked with current referral commercials
- **Journalists and analysts**: track the commercialization of the AI dev tool space over time
- **Indie hackers**: rank programs by commission to decide where to spend writing time first

### How to use AI Tool Affiliate Tracker

1. Open the **Input** tab and review the default list of 15 AI tools
2. Add, remove, or edit `{name, domain}` entries to match your watchlist
3. Click **Start**
4. Watch the run logs — each tool's probe and verdict is logged in real time
5. Download the dataset (JSON, CSV, Excel, HTML) from the **Storage** tab

### Input

- **`toolsToCheck`** (array, default 15) — each entry is `{ "name": "anthropic", "domain": "anthropic.com" }`. `domain` should be a bare hostname (no scheme, no trailing slash).

### Output

Each item in the dataset represents one tool:

```json
{
  "tool": "anthropic",
  "domain": "anthropic.com",
  "checkedAt": "2026-05-21T07:25:00.000Z",
  "affiliateProgramFound": true,
  "programUrl": "https://www.anthropic.com/affiliates",
  "commissionRate": "10%",
  "commissionFlatUsd": null,
  "cookieWindowDays": 30,
  "payoutMethod": "paypal",
  "restrictions": "first-month-only",
  "raw": "First 500 chars of the program page text...",
  "attempts": [
    { "url": "https://anthropic.com/affiliates", "status": 200, "looksLikeProgram": true }
  ]
}
````

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Type | What it means |
|---|---|---|
| `tool` | string | Tool name from input |
| `affiliateProgramFound` | boolean | True if a real program page was detected |
| `programUrl` | string | Final URL of the program page (after redirects) |
| `commissionRate` | string | Extracted percentage (e.g. `"10%"`) |
| `commissionFlatUsd` | number | Extracted flat-fee payout in USD, if any |
| `cookieWindowDays` | number | Attribution window in days |
| `payoutMethod` | string | PayPal / Stripe / Wise / Tipalti / Partnerstack / etc. |
| `restrictions` | string | First-month-only, self-referrals-prohibited, US-only, etc. |
| `raw` | string | First 500 chars of program page text for human verification |
| `attempts` | array | All probed paths and their status (audit trail) |

### Pricing / Cost estimation

This Actor runs in roughly 1-3 compute units for the default 15-tool list. On Apify's free tier you can run it on-demand without burning monthly credits. Run it weekly and you'll spend well under one dollar per month even on the Personal plan.

How much does it cost to scrape affiliate programs across the AI ecosystem? Effectively free — the bottleneck is rate-limit respect, not compute. Per-tool fetches are 1 HTTP request to up to 10 paths, so total network volume per run stays small.

### Tips or Advanced options

- **Schedule weekly** via Apify Scheduler to catch program launches the moment they happen
- **Integrate with Slack, Telegram, or Discord** via Apify integrations to alert partnership teams
- **Extend `toolsToCheck`** with vertical AI tools (e.g. video generation, voice cloning, embeddings infra) — the heuristics are domain-agnostic
- For programs gated behind a login or pop-up, the `raw` field will be empty even when `affiliateProgramFound` is true — open `programUrl` manually
- Combine with the companion Actor **`github-issue-bounty-finder`** to track paid contribution opportunities alongside affiliate revenue

### FAQ, disclaimers, and support

#### Why are some `affiliateProgramFound: true` results missing commission rate?

Some vendors only disclose commercials inside the partner portal after signup. The Actor reports `programUrl` so you can apply directly.

#### Why didn't the Actor find Cursor / Windsurf / OpenAI?

These vendors may not run a public self-serve program (yet). The `attempts` array shows which paths returned 404 — that's an audit trail, not a bug.

#### Is this scraper legal?

It only fetches publicly served HTML pages over standard HTTP, respects redirects, sends a descriptive User-Agent, and does not bypass authentication or scrape personal data. Use responsibly and respect each vendor's robots.txt and Terms of Service.

#### Known limitations

- Only HTTP-fetchable pages — JavaScript-only SPAs may render an empty body
- Commission and cookie regex covers ~80% of common phrasings — edge cases need human verification
- We do not (yet) detect affiliate programs hosted on third-party networks (Partnerstack, Impact, Reditus) when the vendor's own site does not link to them
- No retries or proxy rotation by default — add Apify Proxy if you need to bypass aggressive bot filtering

#### Support

Open Issues in the Actor's **Issues** tab for feature requests or bug reports. Custom solutions are available — reach out via the author profile.

Built by **Ian Mu** — author of [`verify-before-stop`](https://github.com/ianymu/claude-verify-before-stop), a Claude Code hook that forces post-task verification. Find more dev-ecosystem Actors under the same author on Apify Store.

# Actor input Schema

## `toolsToCheck` (type: `array`):

Array of {name, domain} objects to probe. Each entry must include a tool name and the canonical site domain (no scheme).

## Actor input object example

```json
{
  "toolsToCheck": [
    {
      "name": "anthropic",
      "domain": "anthropic.com"
    },
    {
      "name": "openai",
      "domain": "openai.com"
    },
    {
      "name": "cursor",
      "domain": "cursor.com"
    },
    {
      "name": "windsurf",
      "domain": "windsurf.com"
    },
    {
      "name": "github-copilot",
      "domain": "github.com"
    },
    {
      "name": "replit",
      "domain": "replit.com"
    },
    {
      "name": "vercel",
      "domain": "vercel.com"
    },
    {
      "name": "supabase",
      "domain": "supabase.com"
    },
    {
      "name": "linear",
      "domain": "linear.app"
    },
    {
      "name": "notion",
      "domain": "notion.so"
    },
    {
      "name": "perplexity",
      "domain": "perplexity.ai"
    },
    {
      "name": "huggingface",
      "domain": "huggingface.co"
    },
    {
      "name": "mistral",
      "domain": "mistral.ai"
    },
    {
      "name": "cohere",
      "domain": "cohere.com"
    },
    {
      "name": "gemini",
      "domain": "gemini.google.com"
    }
  ]
}
```

# Actor output Schema

## `results` (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("ianymu/ai-tool-affiliate-tracker").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("ianymu/ai-tool-affiliate-tracker").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 '{}' |
apify call ianymu/ai-tool-affiliate-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ianymu/ai-tool-affiliate-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AI Tool Affiliate & Referral Program Tracker",
        "description": "Detect whether each major AI dev tool (Anthropic, OpenAI, Cursor, Vercel, Supabase, etc.) has a public affiliate or referral program. Extract commission rate, cookie window, payout method and restrictions for partnership teams and creators.",
        "version": "0.0",
        "x-build-id": "MhbglZFa5CRjxpp21"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ianymu~ai-tool-affiliate-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ianymu-ai-tool-affiliate-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ianymu~ai-tool-affiliate-tracker/runs": {
            "post": {
                "operationId": "runs-sync-ianymu-ai-tool-affiliate-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ianymu~ai-tool-affiliate-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-ianymu-ai-tool-affiliate-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "toolsToCheck": {
                        "title": "AI tools to check",
                        "type": "array",
                        "description": "Array of {name, domain} objects to probe. Each entry must include a tool name and the canonical site domain (no scheme).",
                        "default": [
                            {
                                "name": "anthropic",
                                "domain": "anthropic.com"
                            },
                            {
                                "name": "openai",
                                "domain": "openai.com"
                            },
                            {
                                "name": "cursor",
                                "domain": "cursor.com"
                            },
                            {
                                "name": "windsurf",
                                "domain": "windsurf.com"
                            },
                            {
                                "name": "github-copilot",
                                "domain": "github.com"
                            },
                            {
                                "name": "replit",
                                "domain": "replit.com"
                            },
                            {
                                "name": "vercel",
                                "domain": "vercel.com"
                            },
                            {
                                "name": "supabase",
                                "domain": "supabase.com"
                            },
                            {
                                "name": "linear",
                                "domain": "linear.app"
                            },
                            {
                                "name": "notion",
                                "domain": "notion.so"
                            },
                            {
                                "name": "perplexity",
                                "domain": "perplexity.ai"
                            },
                            {
                                "name": "huggingface",
                                "domain": "huggingface.co"
                            },
                            {
                                "name": "mistral",
                                "domain": "mistral.ai"
                            },
                            {
                                "name": "cohere",
                                "domain": "cohere.com"
                            },
                            {
                                "name": "gemini",
                                "domain": "gemini.google.com"
                            }
                        ]
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
