# Campaign Launch & Tracking Integrity Auditor (`vgvianna/campaign-launch-tracking-auditor`) Actor

Audit campaign links before launch using HTTP observations and declared campaign rules.

- **URL**: https://apify.com/vgvianna/campaign-launch-tracking-auditor.md
- **Developed by:** [Victor Gabriel Vianna](https://apify.com/vgvianna) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 completed campaign asset audits

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

## Campaign Launch & Tracking Integrity Auditor

Audit campaign links before launch.

This Actor performs an HTTP-only technical audit for one declared campaign launch. It observes DNS resolution, connections, HTTP redirects, final status, final destination and query parameters. It then evaluates the rules supplied for that campaign and reports evidence for every requested asset.

It answers: **do these campaign links obey the declared technical contract?** It does not determine whether an entire campaign is correct or commercially successful.

### Input

Provide a `campaignName` and one to 1,000 `assets`. Each asset has a required public HTTP(S) `url` and an optional unique `id`; omitted IDs are generated deterministically in input order.

Optional campaign rules are:

- `requiredParams`: parameters that must reach the final URL with at least one non-empty value.
- `allowedFinalHosts`: exact allowed final hostnames. Wildcards and implicit subdomains are not accepted.
- `requireHttps`: require HTTPS at the final destination.
- `consistentParams`: parameters whose single non-empty final value must be identical across all evaluable assets.

Only test URLs you are authorized to test. URLs must use HTTP or HTTPS, have no userinfo, use only default ports, and resolve only to public addresses. The Actor does not attempt to bypass authentication, access controls, rate limits, paywalls, or anti-bot protections.

### Output

The default Dataset receives one structured row per requested asset, including the input URL, redirect chain, final URL and status when observed, parameter facts, rule results, findings, network outcome, audit status and billing disposition.

`RUN_SUMMARY` in the default Key-value Store is written only after all requested asset rows were delivered. It contains the campaign status, counts, campaign findings, and cross-asset consistency groups.

Input URLs, redirect URLs, final URLs and query parameters are stored as audit evidence. Do not place credentials, tokens or other sensitive values in URLs. Userinfo is rejected, but query strings may still contain sensitive values supplied by the user.

### Status semantics

- `READY`: no asset or campaign finding of severity `REVIEW` or `BLOCKER`.
- `REVIEW`: an observation is incomplete or requires review, including access-restricted HTTP responses and campaign-wide inconsistency.
- `BLOCKED`: an asset-level blocker was observed, such as a 404/5xx final response, a required parameter missing at a known final URL, an unsafe redirect, or a redirect loop.

An HTTP response such as 404 is an audit result, not necessarily a failed Actor run. A run is failed only for invalid manifests or internal/delivery invariants that prevent a complete campaign result.

For `consistentParams`, the Actor reports groups of observed values. It never assumes the majority value is correct and never declares a minority asset wrong merely because it is different. If any necessary asset cannot be evaluated, that consistency result is `NOT_EVALUATED`, not `PASS` or `FAIL`.

### Billing

The current model charges USD 0.001 for one `asset-audited` pay-per-event
charge per completed, chargeable asset audit. Apify platform usage costs are
charged separately to the user. Billing disposition is independent from
`READY`, `REVIEW` and `BLOCKED`.

Final HTTP results, conclusively detected redirect loops and conclusively invalid redirect locations can be chargeable. DNS failures, unsafe destinations, TLS failures, connection failures, timeouts, access-restricted responses and incomplete redirects are not chargeable. Campaign-level findings do not create an additional event.

Before any network request, the Actor checks whether the run has capacity to charge the worst case: every requested asset. It refuses the whole run rather than processing a partial campaign. The configured primary event is `asset-audited`; there is no Actor-start charge and no automatic default-Dataset-item charge.

### Limits and non-goals

This is not browser QA. It does not execute JavaScript redirects, parse HTML, take screenshots, validate forms, pixels, GA4, GTM, CRM, analytics events, SEO, accessibility, Core Web Vitals, creative quality, audiences, bidding, budgets, ROAS, or real-user behavior.

There is no history, baseline, monitoring, alerts, webhook, saved policy, automatic fix, proxy rotation, database, or external ad-platform import. Cookies are disabled, TLS verification remains enabled, and the Actor does not use an Apify Proxy by default. Websites whose behavior depends on cookies, login state, JavaScript or a browser may not be fully represented.

# Actor input Schema

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

Name used to identify this launch in its audit output.

## `assets` (type: `array`):

URLs that belong to this one campaign launch. Use only URLs you are authorized to test.

## `requiredParams` (type: `array`):

Parameters that must have one non-empty value at the final HTTP destination.

## `allowedFinalHosts` (type: `array`):

Exact hostnames permitted for the final HTTP destination.

## `requireHttps` (type: `boolean`):

Require the final destination to use HTTPS.

## `consistentParams` (type: `array`):

Parameters whose single non-empty final value must match across every evaluable asset.

## Actor input object example

```json
{
  "campaignName": "example_campaign",
  "assets": [
    {
      "id": "google",
      "url": "https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=example_campaign"
    },
    {
      "id": "meta",
      "url": "https://example.com/?utm_source=meta&utm_medium=paid_social&utm_campaign=example_campaign"
    }
  ],
  "requiredParams": [
    "utm_source",
    "utm_medium",
    "utm_campaign"
  ],
  "allowedFinalHosts": [
    "example.com"
  ],
  "requireHttps": true,
  "consistentParams": [
    "utm_campaign"
  ]
}
```

# Actor output Schema

## `assetResults` (type: `string`):

One complete structured audit result per requested campaign asset.

## `runSummary` (type: `string`):

Campaign-level status, findings, consistency groups and billing counters.

# 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 = {
    "campaignName": "example_campaign",
    "assets": [
        {
            "id": "google",
            "url": "https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=example_campaign"
        },
        {
            "id": "meta",
            "url": "https://example.com/?utm_source=meta&utm_medium=paid_social&utm_campaign=example_campaign"
        }
    ],
    "requiredParams": [
        "utm_source",
        "utm_medium",
        "utm_campaign"
    ],
    "allowedFinalHosts": [
        "example.com"
    ],
    "consistentParams": [
        "utm_campaign"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vgvianna/campaign-launch-tracking-auditor").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 = {
    "campaignName": "example_campaign",
    "assets": [
        {
            "id": "google",
            "url": "https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=example_campaign",
        },
        {
            "id": "meta",
            "url": "https://example.com/?utm_source=meta&utm_medium=paid_social&utm_campaign=example_campaign",
        },
    ],
    "requiredParams": [
        "utm_source",
        "utm_medium",
        "utm_campaign",
    ],
    "allowedFinalHosts": ["example.com"],
    "consistentParams": ["utm_campaign"],
}

# Run the Actor and wait for it to finish
run = client.actor("vgvianna/campaign-launch-tracking-auditor").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 '{
  "campaignName": "example_campaign",
  "assets": [
    {
      "id": "google",
      "url": "https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=example_campaign"
    },
    {
      "id": "meta",
      "url": "https://example.com/?utm_source=meta&utm_medium=paid_social&utm_campaign=example_campaign"
    }
  ],
  "requiredParams": [
    "utm_source",
    "utm_medium",
    "utm_campaign"
  ],
  "allowedFinalHosts": [
    "example.com"
  ],
  "consistentParams": [
    "utm_campaign"
  ]
}' |
apify call vgvianna/campaign-launch-tracking-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vgvianna/campaign-launch-tracking-auditor"
        }
    }
}
```

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/8QbOXthOjhlTmNbh6/builds/WexM8UUX8LCOddcb2/openapi.json
