# Creator Campaign Link Monitor (`symmetrical_omelet_yit/creator-campaign-link-monitor`) Actor

Check sponsorship and bio links for broken destinations, unexpected redirects and missing required tracking parameters. Compare campaign watchlists across runs. Export JSON, CSV and a readable agency report.

- **URL**: https://apify.com/symmetrical_omelet_yit/creator-campaign-link-monitor.md
- **Developed by:** [Yigit Ibze](https://apify.com/symmetrical_omelet_yit) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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/actors/running/actors-in-store.md#pay-per-usage

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

## Creator Campaign Link Monitor

Check the links behind your creator campaigns. Paste destination URLs from bios,
video descriptions or a campaign spreadsheet and get a clear health report:
broken destinations, unexpected redirect hosts, missing required tracking
parameters and changes since your previous check.

**Free beta: no developer fee.** Normal Apify platform usage applies.

### Try the sample report

```json
{"demoMode": true}
```

The fixed demo uses synthetic observations for healthy, broken, redirected and
blocked links. It makes no network requests and writes no watchlist baseline.
Turn demo mode off to check your links.

### Check a campaign

```json
{
  "demoMode": false,
  "campaignName": "Autumn creator campaign",
  "campaignLinks": [
    "https://your-brand.example/offer?utm_source=creator&utm_medium=social&utm_campaign=autumn"
  ],
  "expectedDomain": "your-brand.example",
  "requiredParameters": ["utm_source", "utm_medium", "utm_campaign"],
  "watchlistName": "autumn-campaign"
}
```

Replace the illustrative URL with a real public campaign destination. A run can
check up to 100 distinct HTTP/HTTPS links on standard ports. Choose your required
parameter names; leave the list empty for a health-only check. Expected domain
accepts that hostname and its subdomains, with hostname boundaries respected.

### What you get

The dataset has one row per link, with health, HTTP status, a bounded redirect
chain, destination host, required-parameter checks, findings and a dated change
comparison. Run storage provides `REPORT_JSON`, a readable `REPORT_HTML` and
`LINKS_CSV`. URL query **values** and fragments are redacted in reports; parameter
names remain visible. Original inputs remain subject to Apify's input access
and retention rules.

`PASS` means the performed checks passed. `ATTENTION` means a broken response or
a declared destination/tracking requirement needs attention. `UNCONFIRMED`
includes blocking responses such as 403/429: these never establish that a link
was deleted. `ERROR` means the check could not establish its result.

### Compare repeat checks

Set a watchlist name to save a privacy-safe baseline in an Actor-created named
key-value store in your Apify account. Use the same watchlist and expectations
on the next run. First observations establish a baseline; uncertain checks do
not overwrite confirmed observations. Changed requirements are identified
separately. Run each watchlist sequentially; simultaneous runs are unsupported.
Leave the watchlist name empty to disable history. Apify schedules can run a
saved task repeatedly; this Actor does not send messages or create schedules.

### Scope

Supply the actual destination or shortened campaign URLs. This Actor does not
log in to social accounts, extract links from profiles/posts, execute JavaScript,
test checkout or coupons, or establish sales attribution. A removed or changed
UTM value does not prove analytics attribution failed. Checks are point-in-time
HTTP observations, may register as automated clicks, and do not prove what
happened between runs or what a human browser sees.

Public destinations are checked with a recognizable user agent, certificate
validation, bounded redirects and per-link deadlines. Every redirect target is
validated against private/local address access. Blocking is reported honestly;
no login cookies, residential proxies or browser impersonation are used.

# Actor input Schema

## `demoMode` (type: `boolean`):

See fixed examples of healthy, broken, redirected and blocked links. No network requests or history writes. Turn this off to check your campaign; keep other settings at their defaults for the sample.

## `campaignLinks` (type: `array`):

Paste the actual destination or shortened links from your bio, sponsored description or campaign sheet. Supply public HTTP/HTTPS URLs on standard ports. Social profile/post links are not scraped for destinations. Duplicate URLs are checked once.

## `campaignName` (type: `string`):

Name shown on the report. Keep Campaign selected for the sample.

## `expectedDomain` (type: `string`):

Optional merchant hostname, for example your-brand.com. That exact host and its subdomains are accepted. Leave empty to accept any public destination.

## `requiredParameters` (type: `array`):

Case-sensitive query parameter names that must have nonempty values at a reachable final URL. Use your affiliate parameter names if appropriate, or clear all for health-only checks. URL checks do not prove analytics attribution or sales.

## `watchlistName` (type: `string`):

Optional, for example autumn-creators. Baselines stay in an Actor-created named key-value store in your Apify account. First checks establish a baseline; uncertain observations do not replace confirmed ones.

## `maxRedirects` (type: `integer`):

Stop after this many redirects. Maximum 10.

## `timeoutSeconds` (type: `integer`):

Total time budget including DNS, connections, TLS and redirect headers. Maximum 30 seconds.

## Actor input object example

```json
{
  "demoMode": true,
  "campaignLinks": [],
  "campaignName": "Campaign",
  "expectedDomain": "",
  "requiredParameters": [
    "utm_source",
    "utm_medium",
    "utm_campaign"
  ],
  "watchlistName": "",
  "maxRedirects": 8,
  "timeoutSeconds": 20
}
```

# Actor output Schema

## `links` (type: `string`):

No description

## `reportJson` (type: `string`):

No description

## `reportHtml` (type: `string`):

No description

## `linksCsv` (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 = {
    "demoMode": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("symmetrical_omelet_yit/creator-campaign-link-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 = { "demoMode": True }

# Run the Actor and wait for it to finish
run = client.actor("symmetrical_omelet_yit/creator-campaign-link-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 '{
  "demoMode": true
}' |
apify call symmetrical_omelet_yit/creator-campaign-link-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,symmetrical_omelet_yit/creator-campaign-link-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/arhRkP5njEWoUiLls/builds/gveI3z7eKCoF7k4Sn/openapi.json
