# ShareASale Affiliate API - Merchants & Activity (BYOC) (`viralanalyzer/shareasale-publisher-byoc`) Actor

Access ShareASale affiliate data via the official API (BYOC): merchants, coupons, deals and transaction activity reports for publishers. Bring your own API token.

- **URL**: https://apify.com/viralanalyzer/shareasale-publisher-byoc.md
- **Developed by:** [viralanalyzer](https://apify.com/viralanalyzer) (community)
- **Categories:** E-commerce, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 item scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

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

## 🛒 ShareASale Affiliate API — Merchants, Coupons & Activity (BYOC)

> 🔗 [View on Apify Store](https://apify.com/viralanalyzer/shareasale-publisher-byoc) | 🇺🇸 English | [🇧🇷 Português](#português)

Query the official **ShareASale Affiliate API** for merchant status, merchant search, coupon deals, activity reports, payment history and banner ads. ShareASale is the **3rd largest US affiliate network** (4,500+ merchants — fashion, home, niche e‑commerce). **BYOC (Bring Your Own Credentials)** model — you provide your affiliate ID + API token + API secret, we sign the requests for you. Anti‑bot‑immune (official API), ToS‑compliant, predictable cost.

### ✨ Features

- **Official ShareASale Affiliate API v3** — no HTML scraping, no anti‑bot blocks
- **6 actions**: `merchantStatus`, `merchantSearch`, `couponDeals`, `activity`, `paymentHistory`, `bannerList`
- **Version 3 auth** — no IP whitelist required (essential for Apify's rotating IPs)
- **SHA‑256 HMAC** signing handled automatically (you never see the crypto)
- **Pipe‑delimited parser** — auto‑normalizes ShareASale's CSV‑with‑pipes output
- **Strict error surfacing** — tagged messages (`[SHAREASALE_API]`, `[SHAREASALE_RATE]`, `[INPUT]`)
- **NEVER 0 ITEMS guard** — actor fails loudly with a concrete diagnosis instead of silently succeeding

### 🔑 BYOC setup (one‑time, ~5 min)

1. Log in at https://shareasale.com (affiliate account, free signup)
2. Go to **Tools > Merchant Tools > API Reporting**
3. Create an **API Token** — select **Version 3** so the calling IP does NOT need to be whitelisted (Apify IPs rotate; Version 2 would break)
4. Copy your **affiliateId**, **API Token** and **API Secret** into the actor input

> **Why Version 3?** ShareASale Version 2 requires you to whitelist every IP that calls the API. Apify runs on rotating datacenter IPs, so Version 2 would fail intermittently. Version 3 uses HMAC SHA‑256 of `token:date:action:secret` per‑request, which removes the IP requirement entirely.

### 📥 Input

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `affiliateId` | string (secret) | **Yes** | — | Your numeric ShareASale affiliate ID |
| `apiToken` | string (secret) | **Yes** | — | API token (Version 3) from Tools > API Reporting |
| `apiSecret` | string (secret) | **Yes** | — | API secret matching the token |
| `action` | enum | **Yes** | `merchantStatus` | Which endpoint to call (see Actions table below) |
| `keyword` | string | No | `""` | Free‑text keyword for `merchantSearch` |
| `category` | string | No | `""` | Category filter for `merchantSearch` |
| `merchantId` | integer | No | `0` | Filter `couponDeals` / `activity` / `bannerList` to one merchant |
| `dateStart` | string | Conditional | `""` | `YYYY-MM-DD`. **Required** for `activity`. Optional for `paymentHistory` |
| `dateEnd` | string | Conditional | `""` | `YYYY-MM-DD`. **Required** for `activity` |
| `maxResults` | integer | No | `100` | Cap on rows pushed to dataset (1‑1000) |

#### Actions

| Action | Purpose |
|---|---|
| `merchantStatus` | Merchants you can promote, with join status (joined / applied / declined) |
| `merchantSearch` | Find **new** merchants by keyword or category |
| `couponDeals` | Active coupons from joined merchants |
| `activity` | Sales / leads / clicks report for a date range |
| `paymentHistory` | Your payment records |
| `bannerList` | Banner ads available for promotion |

#### Input example

```json
{
  "affiliateId": "123456",
  "apiToken": "your_api_token_here",
  "apiSecret": "your_api_secret_here",
  "action": "merchantSearch",
  "keyword": "yoga",
  "maxResults": 100
}
````

### 📤 Output

Every dataset record carries the same envelope plus all columns returned by ShareASale for the chosen action (pipe‑delimited headers are normalized — spaces become underscores).

```json
{
  "action": "merchantSearch",
  "affiliateId": "123456",
  "scrapedAt": "2026-05-15T14:25:00+00:00",
  "source": "shareasale-affiliate-api-v3",
  "MerchantID": "987654",
  "OrganizationName": "Acme Yoga Co",
  "Categories": "Health & Fitness",
  "PowerRank": "42",
  "AutoApprove": "true",
  "CookieLength": "30",
  "Status": "Active"
}
```

> Actual column names vary per action — ShareASale documents them inside the response's first row. The actor never drops columns; it only strips empty strings to keep the dataset clean.

### 📋 Use Cases

- **Niche affiliate research** — `merchantSearch` by keyword to find untapped programs
- **Coupon site automation** — `couponDeals` to keep deal pages fresh
- **Performance reporting** — `activity` for daily revenue / EPC dashboards
- **Payout reconciliation** — `paymentHistory` exported to your accounting stack
- **Creative pipeline** — `bannerList` for automated banner refresh on your sites
- **Compliance / audit** — `merchantStatus` to track which merchants approved/declined your application

### ❓ FAQ

**Q: Do I need to whitelist Apify IPs?**
A: No, as long as you use **Version 3** credentials. The actor signs every request with HMAC SHA‑256, so ShareASale validates by signature, not IP.

**Q: Are my credentials stored?**
A: No. They are read from the input and passed straight to `shareasale.com/x.cfm`. We never persist, log, or proxy them through our servers. Each user runs the actor with their own keys.

**Q: Why does the actor sometimes return zero rows?**
A: It will throw `[FAIL] Zero records extracted…` instead of returning a silent empty dataset. Common causes: the account has not joined any merchant yet (use `action=merchantSearch` first), the date range for `activity` is too narrow, or the credentials are valid but the action is not enabled for your tier.

**Q: Which ShareASale plan do I need?**
A: Standard publisher / affiliate accounts are free and include API access. There is no extra fee for using the API itself.

**Q: Rate limits?**
A: ShareASale rate‑limits per token. The actor surfaces HTTP 429 as `[SHAREASALE_RATE]` with the `Retry-After` header. For high‑volume use, split runs across multiple tokens.

### 💰 Pricing

Pay‑per‑event (PPE): you only pay when the actor returns a real row. Zero results → zero charge. Anti‑bot blocks are impossible (official API), so success rate is essentially 100 % when credentials are valid.

| Event | Charged |
|---|---|
| `item-scraped` | per row pushed to dataset |

### 🔗 Related Actors

- [CJ Affiliate Products](https://apify.com/viralanalyzer/cj-affiliate-products) — Commission Junction GraphQL (BYOC)
- [Rakuten Affiliate Merchants](https://apify.com/viralanalyzer/rakuten-affiliate-merchants) — Rakuten Linkshare API (BYOC)
- [Impact.com Affiliate API](https://apify.com/viralanalyzer/impact-affiliate-network) — Impact.com REST (BYOC)
- [Awin Multi‑Merchant](https://apify.com/viralanalyzer/awin-multi-merchant-affiliate) — Awin Publisher API (BYOC)
- [Etsy Product Intelligence](https://apify.com/viralanalyzer/etsy-product-intelligence) — Etsy Open API v3 (BYOC)

### 📝 Changelog

#### v1.0 (2026-05-15)

- Initial release covering all 6 affiliate‑facing actions
- HMAC SHA‑256 Version 3 auth (no IP whitelist)
- Pipe‑delimited parser with header normalization
- Tagged error surface (`[SHAREASALE_API]`, `[SHAREASALE_RATE]`, `[INPUT]`)
- NEVER 0 ITEMS guard with action‑specific diagnosis
- PPE charging on `item-scraped` with owner‑skip

***

<a name="português"></a>

## 🛒 ShareASale API de Afiliados — Lojistas, Cupons & Relatórios (BYOC)

> 🔗 [View on Apify Store](https://apify.com/viralanalyzer/shareasale-publisher-byoc) | [🇺🇸 English](#-shareasale-affiliate-api--merchants-coupons--activity-byoc) | 🇧🇷 Português

Consulta a **API oficial de afiliados do ShareASale** para status de lojistas, busca de lojistas, cupons ativos, relatórios de atividade, histórico de pagamentos e banners. O ShareASale é a **3ª maior rede de afiliação dos EUA** (4.500+ lojistas — moda, casa, e‑commerce de nicho). Modelo **BYOC (Bring Your Own Credentials)** — você fornece seu ID de afiliado + token + secret, nós assinamos as requisições. Imune a anti‑bot (API oficial), em conformidade com os ToS, custo previsível.

### ✨ Funcionalidades

- **API ShareASale Affiliate v3 oficial** — sem scraping de HTML, sem anti‑bot
- **6 ações**: `merchantStatus`, `merchantSearch`, `couponDeals`, `activity`, `paymentHistory`, `bannerList`
- **Autenticação Version 3** — não exige IP whitelist (essencial para o Apify, onde os IPs rotacionam)
- **HMAC SHA‑256** automático (você nunca lida com a criptografia)
- **Parser pipe‑delimitado** — normaliza o formato CSV‑com‑pipes da ShareASale
- **Erros tipados** — `[SHAREASALE_API]`, `[SHAREASALE_RATE]`, `[INPUT]`
- **Proteção NEVER 0 ITEMS** — falha alto e claro com diagnóstico ao invés de retornar dataset vazio em silêncio

### 🔑 Setup BYOC (uma vez, ~5 min)

1. Entre em https://shareasale.com (cadastro grátis como afiliado)
2. Vá em **Tools > Merchant Tools > API Reporting**
3. Crie um **API Token** com **Version 3** para que o IP de origem NÃO precise ser whitelisted (IPs do Apify rotacionam; Version 2 quebraria)
4. Copie o **affiliateId**, o **API Token** e o **API Secret** no input do actor

> **Por que Version 3?** A Version 2 do ShareASale exige whitelist de cada IP que chama a API. O Apify usa IPs rotativos, então a Version 2 falharia intermitentemente. A Version 3 assina cada requisição com HMAC SHA‑256 de `token:data:action:secret`, eliminando o requisito de IP.

### 📥 Entrada

| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
| `affiliateId` | string (secret) | **Sim** | — | Seu ID numérico de afiliado no ShareASale |
| `apiToken` | string (secret) | **Sim** | — | Token de API (Version 3) em Tools > API Reporting |
| `apiSecret` | string (secret) | **Sim** | — | Secret correspondente ao token |
| `action` | enum | **Sim** | `merchantStatus` | Qual endpoint chamar |
| `keyword` | string | Não | `""` | Palavra‑chave para `merchantSearch` |
| `category` | string | Não | `""` | Filtro de categoria para `merchantSearch` |
| `merchantId` | inteiro | Não | `0` | Filtra `couponDeals` / `activity` / `bannerList` para um único lojista |
| `dateStart` | string | Condicional | `""` | `YYYY-MM-DD`. **Obrigatório** para `activity`. Opcional para `paymentHistory` |
| `dateEnd` | string | Condicional | `""` | `YYYY-MM-DD`. **Obrigatório** para `activity` |
| `maxResults` | inteiro | Não | `100` | Limite de linhas no dataset (1‑1000) |

### 📤 Saída

Todo registro carrega o envelope abaixo + todas as colunas retornadas pelo ShareASale para a ação escolhida. Os cabeçalhos pipe‑delimitados são normalizados (espaços viram underscore). Strings vazias são descartadas; zeros e `false` são preservados.

### 📋 Casos de Uso

- **Pesquisa de afiliados de nicho** — `merchantSearch` por keyword para encontrar programas pouco explorados
- **Sites de cupons automatizados** — `couponDeals` mantém páginas de ofertas atualizadas
- **Relatórios de performance** — `activity` alimenta dashboards diários de receita / EPC
- **Conciliação de pagamentos** — `paymentHistory` exportado direto para a contabilidade
- **Pipeline criativo** — `bannerList` automatiza atualização de banners nos seus sites
- **Compliance** — `merchantStatus` rastreia quais lojistas aprovaram/recusaram sua aplicação

### ❓ Perguntas Frequentes

**P: Preciso fazer whitelist dos IPs do Apify?**
R: Não, desde que use credenciais **Version 3**. O actor assina cada requisição com HMAC SHA‑256, e o ShareASale valida por assinatura, não por IP.

**P: Vocês armazenam minhas credenciais?**
R: Não. Elas são lidas do input e passadas direto para `shareasale.com/x.cfm`. Não persistimos, logamos ou intermediamos. Cada usuário roda o actor com suas próprias chaves.

**P: Por que o actor às vezes retorna zero linhas?**
R: Ele lança `[FAIL] Zero records extracted…` em vez de retornar dataset vazio em silêncio. Causas comuns: a conta ainda não juntou nenhum lojista (use `action=merchantSearch` antes), faixa de datas muito estreita em `activity`, ou credenciais válidas mas a ação não está habilitada no seu tier.

**P: Quais limites de taxa?**
R: O ShareASale limita por token. O actor expõe HTTP 429 como `[SHAREASALE_RATE]` com o cabeçalho `Retry-After`. Para volume alto, divida runs entre vários tokens.

### 💰 Preços

Pay‑per‑event (PPE): você só paga quando o actor retorna uma linha real. Zero resultado → zero cobrança. Anti‑bot é impossível (API oficial), então a taxa de sucesso é ~100 % quando as credenciais são válidas.

### 🔗 Actors Relacionados

- [CJ Affiliate Products](https://apify.com/viralanalyzer/cj-affiliate-products) — Commission Junction GraphQL (BYOC)
- [Rakuten Affiliate Merchants](https://apify.com/viralanalyzer/rakuten-affiliate-merchants) — Rakuten Linkshare API (BYOC)
- [Impact.com Affiliate API](https://apify.com/viralanalyzer/impact-affiliate-network) — Impact.com REST (BYOC)
- [Awin Multi‑Merchant](https://apify.com/viralanalyzer/awin-multi-merchant-affiliate) — Awin Publisher API (BYOC)
- [Etsy Product Intelligence](https://apify.com/viralanalyzer/etsy-product-intelligence) — Etsy Open API v3 (BYOC)

### 📝 Changelog

#### v1.0 (2026-05-15)

- Release inicial cobrindo as 6 ações voltadas ao afiliado
- Autenticação HMAC SHA‑256 Version 3 (sem IP whitelist)
- Parser pipe‑delimitado com normalização de cabeçalho
- Erros tipados (`[SHAREASALE_API]`, `[SHAREASALE_RATE]`, `[INPUT]`)
- Proteção NEVER 0 ITEMS com diagnóstico por ação
- Cobrança PPE em `item-scraped` com owner‑skip

# Actor input Schema

## `affiliateId` (type: `string`):

Your numeric ShareASale affiliate ID (e.g. '123456'). Find it on shareasale.com > Account > Profile.

## `apiToken` (type: `string`):

API token from shareasale.com > Tools > API Reporting. Public part of the credential.

## `apiSecret` (type: `string`):

API secret from shareasale.com > Tools > API Reporting. Use Version 3+ so IP whitelist is not required (Apify IPs rotate). Never logged.

## `action` (type: `string`):

Which ShareASale endpoint to call.

## `keyword` (type: `string`):

Free-text keyword used by merchantSearch action only.

## `category` (type: `string`):

ShareASale category filter (numeric or name, depending on API). Used by merchantSearch only.

## `merchantId` (type: `integer`):

Optional numeric merchant ID. Filters couponDeals / activity / bannerList to a single merchant.

## `dateStart` (type: `string`):

Inclusive start date for activity / paymentHistory range. Format: 2026-05-01

## `dateEnd` (type: `string`):

Inclusive end date for activity / paymentHistory range. Format: 2026-05-15

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

Maximum rows to push to dataset (1-1000). The actor stops reading the API response after this many rows.

## Actor input object example

```json
{
  "action": "merchantStatus",
  "keyword": "",
  "category": "",
  "merchantId": 0,
  "dateStart": "",
  "dateEnd": "",
  "maxResults": 100
}
```

# Actor output Schema

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

All records as a dataset (JSON/CSV/Excel).

# 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 = {
    "action": "merchantStatus"
};

// Run the Actor and wait for it to finish
const run = await client.actor("viralanalyzer/shareasale-publisher-byoc").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 = { "action": "merchantStatus" }

# Run the Actor and wait for it to finish
run = client.actor("viralanalyzer/shareasale-publisher-byoc").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 '{
  "action": "merchantStatus"
}' |
apify call viralanalyzer/shareasale-publisher-byoc --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=viralanalyzer/shareasale-publisher-byoc",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ShareASale Affiliate API - Merchants & Activity (BYOC)",
        "description": "Access ShareASale affiliate data via the official API (BYOC): merchants, coupons, deals and transaction activity reports for publishers. Bring your own API token.",
        "version": "1.0",
        "x-build-id": "UR7Ufj2z87edgiSMe"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/viralanalyzer~shareasale-publisher-byoc/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-viralanalyzer-shareasale-publisher-byoc",
                "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/viralanalyzer~shareasale-publisher-byoc/runs": {
            "post": {
                "operationId": "runs-sync-viralanalyzer-shareasale-publisher-byoc",
                "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/viralanalyzer~shareasale-publisher-byoc/run-sync": {
            "post": {
                "operationId": "run-sync-viralanalyzer-shareasale-publisher-byoc",
                "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": {
                    "affiliateId": {
                        "title": "Affiliate ID",
                        "type": "string",
                        "description": "Your numeric ShareASale affiliate ID (e.g. '123456'). Find it on shareasale.com > Account > Profile."
                    },
                    "apiToken": {
                        "title": "API Token",
                        "type": "string",
                        "description": "API token from shareasale.com > Tools > API Reporting. Public part of the credential."
                    },
                    "apiSecret": {
                        "title": "API Secret",
                        "type": "string",
                        "description": "API secret from shareasale.com > Tools > API Reporting. Use Version 3+ so IP whitelist is not required (Apify IPs rotate). Never logged."
                    },
                    "action": {
                        "title": "API Action",
                        "enum": [
                            "merchantStatus",
                            "merchantSearch",
                            "couponDeals",
                            "activity",
                            "paymentHistory",
                            "bannerList"
                        ],
                        "type": "string",
                        "description": "Which ShareASale endpoint to call.",
                        "default": "merchantStatus"
                    },
                    "keyword": {
                        "title": "Keyword (for merchantSearch)",
                        "type": "string",
                        "description": "Free-text keyword used by merchantSearch action only.",
                        "default": ""
                    },
                    "category": {
                        "title": "Category (for merchantSearch)",
                        "type": "string",
                        "description": "ShareASale category filter (numeric or name, depending on API). Used by merchantSearch only.",
                        "default": ""
                    },
                    "merchantId": {
                        "title": "Merchant ID filter",
                        "minimum": 0,
                        "maximum": 9999999,
                        "type": "integer",
                        "description": "Optional numeric merchant ID. Filters couponDeals / activity / bannerList to a single merchant.",
                        "default": 0
                    },
                    "dateStart": {
                        "title": "Start Date (YYYY-MM-DD)",
                        "type": "string",
                        "description": "Inclusive start date for activity / paymentHistory range. Format: 2026-05-01",
                        "default": ""
                    },
                    "dateEnd": {
                        "title": "End Date (YYYY-MM-DD)",
                        "type": "string",
                        "description": "Inclusive end date for activity / paymentHistory range. Format: 2026-05-15",
                        "default": ""
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum rows to push to dataset (1-1000). The actor stops reading the API response after this many rows.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
