# Steam · UTM Visits for Store Pages (`corent1robert/steam-utm-traffic-sender`) Actor

Send one visit per Steam store URL with your UTM tags. Status and page check — one row per visit. Spread over a time window. Residential proxy billed to your usage.

- **URL**: https://apify.com/corent1robert/steam-utm-traffic-sender.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Automation, Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 steam utm visit sents

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Steam UTM Traffic Sender

**Last updated**: February 11, 2026

Send one lightweight visit per URL to Steam game pages using your final URLs with UTM parameters. The actor spreads visits over a configurable time window (default 2h, cost-optimized) or uses a fixed delay between each hit—ideal for making your campaigns appear in Steam's Marketing & Visibility dashboards.

***

### Why Use This Actor?

**Automate “one visit per game per day” at scale**

- No more manual testing of UTM links
- Send visits to hundreds or tens of thousands of Steam URLs in a single run
- Perfect for validating that your campaigns show up in Steam’s reporting

**Built for marketing attribution**

- Designed for Steam game marketing teams
- Make your UTM campaigns appear in the Marketing & Visibility tables
- Test tracking setups before going live on paid campaigns

**Two scheduling modes**

- **Spread mode** (`runHours`): visits spread evenly over a time window (e.g. 2h or 24h)—best for realistic “one visit per day” pattern
- **Delay mode** (`minWaitSeconds` / `maxWaitSeconds`): random delay between visits—best for quick tests (e.g. 0.5–1.5 s, ~$1-2/run for 30k URLs)

***

### Perfect For

- **Marketing managers** running campaigns for PC / Steam games
- **User acquisition / growth teams** who want to validate attribution
- **Agencies** managing Steam launches for multiple titles
- **Data / analytics teams** who need consistent “test traffic” for dashboards

***

### How It Works

1. Reads a **bulk array** of Steam URLs with UTM parameters (`urls`)
2. Normalizes, deduplicates, and applies `maxUrlsPerRun`
3. **Batching**: sends `batchSize` visits in parallel (default 50), then waits—~$1-2/run for 30k URLs
4. **Scheduling**: spreads batches over `runHours` (default 2h) or waits `minWaitSeconds`–`maxWaitSeconds` between batches
5. Sends HTTP GET per URL, optionally via Apify Proxy (`proxyConfiguration` with “Customise proxy” UI)
6. Stores one record per visit in the dataset: `url`, `startedAt`, `visitedAt`, `statusCode`, `success`, `error`

***

### Quick Start

#### Minimal example (quick test with verification, 10 URLs)

```json
{
  "urls": [
    "https://store.steampowered.com/app/1790930/Crisol_Theater_of_Idols/?utm_source=test&utm_medium=cpc&utm_campaign=test&utm_content=test&utm_term=steam"
  ],
  "batchSize": 5,
  "verifyContent": true,
  "maxUrlsToVerify": 0,
  "maxUrlsPerRun": 10,
  "minWaitSeconds": 0.5,
  "maxWaitSeconds": 1.5,
  "proxyConfiguration": { "useApifyProxy": false },
  "userAgent": ""
}
```

With `minWaitSeconds` and `maxWaitSeconds`, each batch of 50 visits happens every 0.5–1.5 seconds—ideal for a fast test. `runHours` is ignored in this mode.

#### Production example (spread over 2h or 24h)

```json
{
  "urls": [
    "https://store.steampowered.com/app/1790930/...",
    "https://store.steampowered.com/app/3255890/..."
  ],
  "batchSize": 50,
  "maxUrlsPerRun": 0,
  "runHours": 2,
  "proxyConfiguration": { "useApifyProxy": true },
  "userAgent": ""
}
```

Visits are spread evenly over 2 hours (default). Use `runHours: 24` for full-day spread. Run the actor daily (Apify schedule) to send one visit per URL per day.

***

### Input Options

| Option | When to Use | Example |
|--------|-------------|---------|
| `urls` | List of Steam URLs with UTM (bulk) | `["url1", "url2", ...]` |
| `batchSize` | Parallel visits per batch | `50` (default, ~$1-2/run for 30k URLs) |
| `verifyContent` | Parse HTML to check real page vs challenge | `true` (for tests) |
| `maxUrlsToVerify` | 0 = verify all URLs. 10 = only when ≤ 10 | `0` (verify all by default) |
| `maxUrlsPerRun` | Limit URLs per run | `0` (default = no limit), set e.g. `500` to cap |
| `runHours` | Spread visits over time window | `2` (default, cost-optimized), ignored if min/max set |
| `minWaitSeconds` | Delay mode: min seconds between **batches** | `0.5` (default) |
| `maxWaitSeconds` | Delay mode: max seconds between **batches** | `1.5` (default) |
| `proxyConfiguration` | Native “Customise proxy” UI | Type, groups (e.g. RESIDENTIAL), country (US, DE, GB, FR, PL, RU, BR, CN, KR, JP, etc.) |
| `userAgent` | Custom User-Agent (optional) | `""` = Chrome desktop default |

**Spread behaviour**: When `runHours` is 2 and you have 500 URLs, visits are spread over 2h (~1 every ~14 sec). With runHours 24: ~1 every ~3 min. When you have 30,000 URLs, it’s ~1 every ~3 seconds. Use `minWaitSeconds` / `maxWaitSeconds` for faster runs (e.g. tests).

***

### What You Get

Each visit produces one dataset record:

```json
{
  "url": "https://store.steampowered.com/app/1790930/Crisol_Theater_of_Idols/?utm_source=test&utm_medium=cpc&utm_campaign=test&utm_content=test&utm_term=steam",
  "startedAt": "2026-02-11T10:00:00.000Z",
  "visitedAt": "2026-02-11T10:00:02.123Z",
  "statusCode": 200,
  "success": true,
  "error": null
}
```

| Field | Description |
|-------|-------------|
| `url` | Steam URL visited (with UTM parameters) |
| `startedAt` | ISO timestamp when the visit was scheduled |
| `visitedAt` | ISO timestamp when the HTTP request was sent |
| `statusCode` | HTTP status (200, 302, 404, 429, etc.) |
| `success` | `true` if status 200–399 |
| `verified` | `true` = real Steam page, `false` = challenge/block, `null` = not verified |
| `verifiedReason` | `meta-description`, `steam-game-page`, `cloudflare-challenge`, `access-denied`, `captcha`, `unknown` |
| `metaDescription` | Extracted from meta Description / og:description. Proof of real page. |
| `error` | Error message if the request failed |

***

### Use Cases

**Marketing attribution** – Confirm that UTM campaigns appear in Steam’s Marketing & Visibility dashboards before scaling spend.

**Pre-launch visibility** – Send one visit per day to unreleased games so your brand appears in their traffic sources.

**Agency scaling** – Run the actor daily for multiple clients; each client gets one visit per URL per day.

**Test traffic for dashboards** – Provide consistent, controlled traffic for analytics and reporting.

***

### Getting Started

1. Prepare your list of Steam URLs with UTM parameters (bulk array)
2. Push the actor: `cd apify/scrapers/steam-utm-traffic-sender` → `apify push`
3. Configure input: start with 50–100 URLs, `minWaitSeconds` 0.5, `maxWaitSeconds` 1.5 for cost-optimized run
4. Run and check Steam’s Marketing & Visibility dashboard for your sample games
5. For production: set `runHours` 2 (or 24 for full-day), increase `maxUrlsPerRun`, enable Apify Proxy, and add a daily schedule

***

### Limitations & Best Practices

- **Steam anti-bot** – The actor simulates lightweight, spread-out traffic. It does not bypass anti-bot protections.
- **Volume** – Start with 50–500 URLs, validate tracking, then scale to 30,000+.
- **Proxy** – Use the native “Customise proxy” UI (Residential recommended). Choose a country matching your campaigns: US, DE, GB, FR, PL, RU, BR, CN, KR, JP, or leave empty for random rotation.

***

### Support

If you need any help, please contact: **corentin@outreacher.fr**

### Related Actors

These Actors cover the same job or the next step in the workflow. Apify’s automatic recommendations stay inside one category — this list is the rest of the toolkit.

| Actor | Use it when |
|---|---|
| [Lemlist To Airtable](https://apify.com/corent1robert/lemlist-to-airtable) | Lemlist To Airtable |
| [Slack workspace people export (browser session)](https://apify.com/corent1robert/slack-workspace-people-scraper) | Slack workspace people export (browser session) |
| [SW Website Rankings Scraper](https://apify.com/corent1robert/similarweb-scraper) | Rank the website / domain after you have the URL |
| [Malt Lead Generator — Freelancer Profiles](https://apify.com/corent1robert/malt-profiles-scraper) | Malt freelancer profiles for outreach |
| [Facebook Page Scraper · Extract Email, Phone & Website](https://apify.com/corent1robert/facebook-page-contact-scraper) | Email, phone and website from a Facebook Page |
| [Google Maps search — place details & contacts](https://apify.com/corent1robert/google-maps-search-scraper) | Google Maps places, details and contacts |
| [French Companies · Search & SIREN Enrich](https://apify.com/corent1robert/recherche-entreprises-scraper) | French companies: search and SIREN enrich |

# Actor input Schema

## `urls` (type: `array`):

Array of Steam URLs with UTM parameters. Add one URL per row or paste a JSON array.

## `batchSize` (type: `integer`):

Number of visits to send in parallel. 50 = ~$1-2/run for 30k URLs. Higher = faster, lower cost.

## `verifyContent` (type: `boolean`):

Parse HTML to check if it's the real Steam page (not Cloudflare/challenge). With maxUrlsToVerify=0: all URLs.

## `maxUrlsToVerify` (type: `integer`):

0 or empty = verify all URLs. 10 = verify only when ≤ 10 URLs (for quick tests).

## `maxUrlsPerRun` (type: `integer`):

0 or empty = no limit (all URLs from input). Set e.g. 500 to cap for tests.

## `runHours` (type: `number`):

Time window over which visits are spread. Default is 2h (cost-optimized). Ignored if minWaitSeconds and maxWaitSeconds are set.

## `minWaitSeconds` (type: `number`):

Min delay between BATCHES. 0.5–1.5 s = ~$1-2/run for 30k URLs. Leave empty to use runHours instead.

## `maxWaitSeconds` (type: `number`):

Max delay between BATCHES. Must be >= minWaitSeconds. 1.5 s = cost-optimized for 30k URLs.

## `userAgent` (type: `string`):

User-Agent to use for HTTP requests. By default, a recent Chrome desktop user-agent is used.

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

Customise proxy – select type, groups, and country. Recommended for Steam: US, DE, GB, FR, PL, RU, BR, CN, KR, JP (or leave empty for rotation).

## Actor input object example

```json
{
  "urls": [
    "https://store.steampowered.com/app/1790930/Crisol_Theater_of_Idols/?utm_source=test&utm_medium=cpc&utm_campaign=test&utm_content=test&utm_term=steam"
  ],
  "batchSize": 50,
  "verifyContent": true,
  "maxUrlsToVerify": 0,
  "maxUrlsPerRun": 0,
  "runHours": 2,
  "minWaitSeconds": 0.5,
  "maxWaitSeconds": 1.5,
  "userAgent": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All visit results (full dataset items).

## `overview` (type: `string`):

Visit overview (URL, status, success, verified, reason).

# 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 = {
    "urls": [
        "https://store.steampowered.com/app/1790930/Crisol_Theater_of_Idols/?utm_source=test&utm_medium=cpc&utm_campaign=test&utm_content=test&utm_term=steam"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/steam-utm-traffic-sender").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 = {
    "urls": ["https://store.steampowered.com/app/1790930/Crisol_Theater_of_Idols/?utm_source=test&utm_medium=cpc&utm_campaign=test&utm_content=test&utm_term=steam"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/steam-utm-traffic-sender").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 '{
  "urls": [
    "https://store.steampowered.com/app/1790930/Crisol_Theater_of_Idols/?utm_source=test&utm_medium=cpc&utm_campaign=test&utm_content=test&utm_term=steam"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call corent1robert/steam-utm-traffic-sender --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/steam-utm-traffic-sender"
        }
    }
}

```

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/4gXSU7OJ0K3Q1Bp8y/builds/SVCUTdXundo6EXfUe/openapi.json
