# Campaign Offer Guard: Promotion & Ad Review (`critd/campaign-offer-guard`) Actor

Compare approved offers with campaign records you supply. Review price, timing and evidence conflicts without connecting to advertising accounts.

- **URL**: https://apify.com/critd/campaign-offer-guard.md
- **Developed by:** [Critical Distinction](https://apify.com/critd) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / completed campaign review

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 Offer Guard: Promotion & Ad Review

**Put the approved offer beside the campaign.**

Compare approved promotions with the campaign and observed-offer records you supply. See recorded price or timing conflicts, missing evidence and the campaigns needing another look. Advertising accounts stay untouched.

[Try the example](#try-the-fictional-example) · [Prepare your files](#use-your-own-prepared-records) · [Pricing](#pricing-and-limits) · [Help](#privacy-recovery-and-help)

### What you receive

Open **REPORT.html** for the overview, then use **exceptions.csv** for the working list. **report.json** preserves structured findings and source-row references.

The review distinguishes **Recorded offer conflict**, **Needs source confirmation** and **No discrepancy found in the checked fields**. A record can have both a conflict and missing evidence. No discrepancy means only that the checked fields agree; it is not approval to launch an advertisement.

For example, an approved price can disagree with the campaign record while the offer observation is also too old. Both issues stay visible instead of becoming one unexplained score.

### Try the fictional example

[Open the campaign example](https://apify.com/critd/campaign-offer-guard/examples/review-campaign-offer-conflicts), or select **Try the fictional example** in the Actor's form. Check the maximum cost, start the run and open REPORT.html from Output.

The example is fictional and historical, not an active promotion. It uses the normal price: **$0.25 per completed report plus $0.00005 per start**. Platform “Try for free” wording does not waive that price.

### Use your own prepared records

Choose **Review my files** and supply three tables:

1. **Approved offers:** product variant, approved revision, price and time windows.
2. **Campaign records:** the explicit relationship between each recorded campaign activation and its approved offer.
3. **Observed offers:** the recorded price and when it was observed.

Use the templates in the input form. When your headers differ, supply an explicit column mapping. Choose an evaluation time and acceptable observation age; upload time is not a substitute for observation time.

**A raw advertising export may not contain everything needed.** You must also supply the approved register and the identity, price-scale and timezone declarations needed to compare it. Google Ads and Merchant Center files are not automatically compatible. A published promotion does not prove that it was approved.

The supported review checks **fixed-price offers with one variant per record**. Coupons, baskets, bundles, percentage discounts and subscriptions are not treated as equivalent fixed-price offers. Unsupported or incomplete conditions remain questions. The Actor does not test live checkout, change advertising accounts or calculate money saved.

#### Know what to fix before trying again

When preparation prevents a review, the run identifies supported corrections such as a missing mapping, invalid time format or exceeded limit. Guidance names our required fields instead of exposing private source headers or values in logs. Some failures can give only general guidance. An unresolved mapped approval clock can remain a normal completed review; not every evidence gap is invalid input.

Invalid preparation does not initiate a completed-report charge. The start event may still apply.

### Can two approved offers contradict each other?

Compare the fixed-price offers you plan to show together. See overlapping prices, the shared product and time window, and the missing details that prevent a clear comparison. Catch a conflict before asking someone to approve a launch.

This checks your supplied records and placement declarations. It does not test checkout, change campaigns, authenticate approval or prove lost sales. A conflict-free review is not permission to launch.

**Try the complete fictional case:** select **Try the offer collision example** in the Actor's form, or supply `{"mode":"collision-example"}` through the API. It returns three conflicting pairs across two offer IDs and three revisions, associated with one campaign. The campaign's supplied $100 spend is counted once. Normal pricing applies: $0.25 per completed report plus $0.00005 per start. The original campaign example remains available.

In **Review my files**, optionally fill **Compare offers shown together** (`collisionReview`) with JSON text:

```json
{"bindings":[{"account":"fictional-account","source":"approved-ledger","row_id":"offer-row-a","placement":"homepage","audience":"retail"},{"account":"fictional-account","source":"approved-ledger","row_id":"offer-row-b","placement":"homepage","audience":"retail"}]}
```

Each reference must match a row in your approved-offer table. Identical placement and audience labels declare that those offers can be shown together, within the same account and source. A shared SKU alone never establishes that relationship. Missing or different labels leave the relationship unassessed; they do not prove the offers are mutually exclusive.

The review compares exact fixed prices for the same product, variant, market and currency during the intersection of both offers' effective and display windows. Starts are inclusive; your declared end inclusivity is retained, including a single shared instant. Equivalent values such as 10.0 and 10.00 agree. Unsupported conditions, incomparable currencies and missing evidence remain questions. A newer file or approval timestamp never silently replaces another revision.

For prelaunch offers without campaign or observed records, supply `[]` for both tables, select JSON for their formats, and clear the example mapping when using canonical field names. At least two approved offers are required for this collision-only route. The original review remains available by leaving collisionReview blank.

**REPORT.html** and **summary.txt** explain every recorded collision or question; **report.json** retains exact scoped source rows, original prices and clocks, shared windows, coverage and distinct affected offer/revision/campaign counts. **exceptions.csv** continues to list campaign activation findings. Pair counts are not separate spend, losses or savings. Missing declarations and unassessed pairs remain visible in coverage.

At most 250 bindings share the existing input limit. Complete collision findings also share the 10,000 source-reference and 8 MiB combined-result limits with the ordinary review. Dense reviews can exceed these limits before reaching 250 offers; split the declared review instead of accepting a truncated answer. Splitting does not check pairs across separate runs. Price and completion/recovery rules are unchanged.

### Pricing and limits

**$0.25 per completed report**, including this Actor's platform usage, plus **$0.00005 per start**. No extra fee applies per conflict, source row or Dataset row. Event prices are the same across plan tiers. Subscriptions, taxes and unrelated services are separate; check the [current Pricing tab](https://apify.com/critd/campaign-offer-guard/pricing) before starting.

A valid completed report with missing or conflicting evidence is still billable. Invalid preparation and incomplete or unacknowledged report publication do not initiate the completed-report charge. An unknown charge request may already have settled.

Input ceilings are **250 approved-offer rows, 1,000 campaign-activation rows and 1,000 observation rows**, subject to **8 MiB combined input**, **256 UTF-8 bytes per field**, bounded source references and **8 MiB combined results**. Mapping and controls count toward input limits. Not every maximum-width combination fits. Over-limit work stops rather than silently dropping records.

### Understand the result

Supplied campaign spend is not lost revenue, avoidable loss or potential savings. Spend that cannot be reconciled by identity, currency and period remains unresolved. Repeated warnings do not represent distinct spend. Source labels, revision declarations and file fingerprints do not authenticate approval or grant data-use permission.

This is a review of your files. Keep the original records and make any campaign or approval decisions through your own processes.

### Privacy, recovery and help

Use records you are permitted to supply, without credentials or unrelated personal information. Inputs and results remain in selected Apify storage; choose suitable access and retention. The Actor does not connect to private systems, purchase data, edit campaigns, relay files to our workstation or automatically delete storage.

**A stopped run may already have a report or a charge.** Inspect Output and retained completion/billing state before starting another. An unknown operation is not proof that nothing happened or that repeating it is free. Results are published before the completed-report charge is requested; interrupted effects are not blindly replayed.

Use the [Issues tab](https://apify.com/critd/campaign-offer-guard/issues) with a run ID and fictional example. Do not post confidential exports, access links or credentials.

### Existing saved workflows

New users can start with the example. The delivered numbered build **0.2.2**, verified October 8, 2026, supports this guide's prepared-file review and preparation corrections. Saved tasks may retain older selections. Preserve original files and read the [public release notes](https://apify.com/critd/campaign-offer-guard/changelog) before changing them. A numbered build is a fixed selection; movable tags are not permanent version identifiers.

The 0.2 contract preserves explicit mapping, fixed-price review, evidence gaps and pricing from the earlier hosted release, while improving preparation guidance. Earlier local file-only prototypes are not selectable public releases.

# Changelog

This Actor's version history is a separate document: https://apify.com/critd/campaign-offer-guard/changelog.md

# Actor input Schema

## `mode` (type: `string`):

$0.25 per completed report plus $0.00005 per start, including the example. Missing evidence is a billable completed review. Use Review my files for any changed content or controls.

## `offers` (type: `string`):

Paste prepared file contents; no URLs or account connections. The fictional prefill is a template; retain exact scoped IDs, price scale and explicit-offset clocks. Combined INPUT including mapping/controls must fit 8 MiB.

## `offersFormat` (type: `string`):

Explicit format for the offers table.

## `activations` (type: `string`):

Paste prepared file contents; no URLs or account connections. The fictional prefill is a template; retain exact scoped IDs, price scale and explicit-offset clocks. Combined INPUT including mapping/controls must fit 8 MiB.

## `activationsFormat` (type: `string`):

Explicit format for the activations table.

## `observations` (type: `string`):

Paste prepared file contents; no URLs or account connections. The fictional prefill is a template; retain exact scoped IDs, price scale and explicit-offset clocks. Combined INPUT including mapping/controls must fit 8 MiB.

## `observationsFormat` (type: `string`):

Explicit format for the observations table.

## `mapping` (type: `object`):

Fictional worked mapping for these templates. For strict canonical names omit this field. Renaming columns does not authenticate approval or create missing evidence. Know what to fix before trying again. When a prepared file cannot be reviewed, the run identifies supported corrections such as a missing required mapping, an invalid time format or an exceeded input limit. It names our required fields rather than exposing your private column names or values in logs. Some failures can only provide general guidance. No completed-report charge is requested for invalid preparation; the automatic start event may still apply.

## `asOf` (type: `string`):

Historical fictional clock. Review my files requires your explicit RFC3339 evaluation time; upload time is not observation time.

## `maxAgeSeconds` (type: `integer`):

Maximum age of supplied observations relative to the evaluation clock.

## `collisionReview` (type: `string`):

In Review my files mode, supply JSON with a bindings array. Each entry identifies an approved-offer account, source and row_id, plus explicit placement and audience labels. Only matching labels within the same account/source establish a relationship. Missing or different labels are unassessed, not mutually exclusive. At most 250 bindings; shared 10000 source-reference and 8 MiB result ceilings apply. For a prelaunch review without campaigns or observations, supply \[] in JSON format for those tables and clear the example mapping. Leave blank for the original campaign review.

## Actor input object example

```json
{
  "mode": "example",
  "offers": "Account,Source,Offer Id,Revision,Sku,Variant,Currency,Market,Kind,Amount,Decimals,Row Id,Approved At,Effective Start,Effective End,Effective End Inclusive,Display Start,Display End,Display End Inclusive,Exception Activation Id,Exception Amount,Exception Reason,Export Note\nfictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,10.00,2,approval-1,2026-09-30T12:00:00Z,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,,,,Fictional extra column; not included in the report\n",
  "offersFormat": "csv",
  "activations": "Account,Source,Offer Id,Revision,Sku,Variant,Currency,Market,Kind,Amount,Decimals,Row Id,Activation Id,Campaign Id,Starts At,Ends At,End Inclusive,Owner,Spend,Spend Period,Export Note\nfictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,10.00,2,activation-row-1,activation-1,campaign-1,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report\nfictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,12.00,2,activation-row-2,activation-2,campaign-2,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report\nfictional-account,approved-ledger,offer-1,rev-unmapped,SKU-001,standard,USD,US,fixed_price,10.00,2,activation-row-3,activation-3,campaign-3,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report\n",
  "activationsFormat": "csv",
  "observations": "[\n  {\n    \"Account\": \"fictional-account\",\n    \"Source\": \"approved-ledger\",\n    \"Offer Id\": \"offer-1\",\n    \"Revision\": \"rev-1\",\n    \"Sku\": \"SKU-001\",\n    \"Variant\": \"standard\",\n    \"Currency\": \"USD\",\n    \"Market\": \"US\",\n    \"Kind\": \"fixed_price\",\n    \"Amount\": \"10.00\",\n    \"Decimals\": \"2\",\n    \"Row Id\": \"observation-1\",\n    \"Observed At\": \"2026-10-02T11:00:00Z\",\n    \"Export Note\": \"Fictional extra column; not included in the report\"\n  }\n]\n",
  "observationsFormat": "json",
  "mapping": {
    "ignore_unmapped_columns": true,
    "offers": [
      {
        "source": "Account",
        "target": "account"
      },
      {
        "source": "Source",
        "target": "source"
      },
      {
        "source": "Offer Id",
        "target": "offer_id"
      },
      {
        "source": "Revision",
        "target": "revision"
      },
      {
        "source": "Sku",
        "target": "sku"
      },
      {
        "source": "Variant",
        "target": "variant"
      },
      {
        "source": "Currency",
        "target": "currency"
      },
      {
        "source": "Market",
        "target": "market"
      },
      {
        "source": "Kind",
        "target": "kind"
      },
      {
        "source": "Amount",
        "target": "amount"
      },
      {
        "source": "Decimals",
        "target": "decimals"
      },
      {
        "source": "Row Id",
        "target": "row_id"
      },
      {
        "source": "Approved At",
        "target": "approved_at"
      },
      {
        "source": "Effective Start",
        "target": "effective_start"
      },
      {
        "source": "Effective End",
        "target": "effective_end"
      },
      {
        "source": "Effective End Inclusive",
        "target": "effective_end_inclusive"
      },
      {
        "source": "Display Start",
        "target": "display_start"
      },
      {
        "source": "Display End",
        "target": "display_end"
      },
      {
        "source": "Display End Inclusive",
        "target": "display_end_inclusive"
      },
      {
        "source": "Exception Activation Id",
        "target": "exception_activation_id"
      },
      {
        "source": "Exception Amount",
        "target": "exception_amount"
      },
      {
        "source": "Exception Reason",
        "target": "exception_reason"
      }
    ],
    "activations": [
      {
        "source": "Account",
        "target": "account"
      },
      {
        "source": "Source",
        "target": "source"
      },
      {
        "source": "Offer Id",
        "target": "offer_id"
      },
      {
        "source": "Revision",
        "target": "revision"
      },
      {
        "source": "Sku",
        "target": "sku"
      },
      {
        "source": "Variant",
        "target": "variant"
      },
      {
        "source": "Currency",
        "target": "currency"
      },
      {
        "source": "Market",
        "target": "market"
      },
      {
        "source": "Kind",
        "target": "kind"
      },
      {
        "source": "Amount",
        "target": "amount"
      },
      {
        "source": "Decimals",
        "target": "decimals"
      },
      {
        "source": "Row Id",
        "target": "row_id"
      },
      {
        "source": "Activation Id",
        "target": "activation_id"
      },
      {
        "source": "Campaign Id",
        "target": "campaign_id"
      },
      {
        "source": "Starts At",
        "target": "starts_at"
      },
      {
        "source": "Ends At",
        "target": "ends_at"
      },
      {
        "source": "End Inclusive",
        "target": "end_inclusive"
      },
      {
        "source": "Owner",
        "target": "owner"
      },
      {
        "source": "Spend",
        "target": "spend"
      },
      {
        "source": "Spend Period",
        "target": "spend_period"
      }
    ],
    "observations": [
      {
        "source": "Account",
        "target": "account"
      },
      {
        "source": "Source",
        "target": "source"
      },
      {
        "source": "Offer Id",
        "target": "offer_id"
      },
      {
        "source": "Revision",
        "target": "revision"
      },
      {
        "source": "Sku",
        "target": "sku"
      },
      {
        "source": "Variant",
        "target": "variant"
      },
      {
        "source": "Currency",
        "target": "currency"
      },
      {
        "source": "Market",
        "target": "market"
      },
      {
        "source": "Kind",
        "target": "kind"
      },
      {
        "source": "Amount",
        "target": "amount"
      },
      {
        "source": "Decimals",
        "target": "decimals"
      },
      {
        "source": "Row Id",
        "target": "row_id"
      },
      {
        "source": "Observed At",
        "target": "observed_at"
      }
    ]
  },
  "asOf": "2026-10-02T12:00:00Z",
  "maxAgeSeconds": 86400
}
```

# Actor output Schema

## `OUTPUT` (type: `string`):

No description

## `REPORT_html` (type: `string`):

No description

## `report_json` (type: `string`):

No description

## `exceptions_csv` (type: `string`):

No description

## `summary_txt` (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 = {
    "offers": `Account,Source,Offer Id,Revision,Sku,Variant,Currency,Market,Kind,Amount,Decimals,Row Id,Approved At,Effective Start,Effective End,Effective End Inclusive,Display Start,Display End,Display End Inclusive,Exception Activation Id,Exception Amount,Exception Reason,Export Note
fictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,10.00,2,approval-1,2026-09-30T12:00:00Z,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,,,,Fictional extra column; not included in the report`,
    "activations": `Account,Source,Offer Id,Revision,Sku,Variant,Currency,Market,Kind,Amount,Decimals,Row Id,Activation Id,Campaign Id,Starts At,Ends At,End Inclusive,Owner,Spend,Spend Period,Export Note
fictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,10.00,2,activation-row-1,activation-1,campaign-1,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report
fictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,12.00,2,activation-row-2,activation-2,campaign-2,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report
fictional-account,approved-ledger,offer-1,rev-unmapped,SKU-001,standard,USD,US,fixed_price,10.00,2,activation-row-3,activation-3,campaign-3,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report`,
    "observations": `[
  {
    "Account": "fictional-account",
    "Source": "approved-ledger",
    "Offer Id": "offer-1",
    "Revision": "rev-1",
    "Sku": "SKU-001",
    "Variant": "standard",
    "Currency": "USD",
    "Market": "US",
    "Kind": "fixed_price",
    "Amount": "10.00",
    "Decimals": "2",
    "Row Id": "observation-1",
    "Observed At": "2026-10-02T11:00:00Z",
    "Export Note": "Fictional extra column; not included in the report"
  }
]`,
    "mapping": {
        "ignore_unmapped_columns": true,
        "offers": [
            {
                "source": "Account",
                "target": "account"
            },
            {
                "source": "Source",
                "target": "source"
            },
            {
                "source": "Offer Id",
                "target": "offer_id"
            },
            {
                "source": "Revision",
                "target": "revision"
            },
            {
                "source": "Sku",
                "target": "sku"
            },
            {
                "source": "Variant",
                "target": "variant"
            },
            {
                "source": "Currency",
                "target": "currency"
            },
            {
                "source": "Market",
                "target": "market"
            },
            {
                "source": "Kind",
                "target": "kind"
            },
            {
                "source": "Amount",
                "target": "amount"
            },
            {
                "source": "Decimals",
                "target": "decimals"
            },
            {
                "source": "Row Id",
                "target": "row_id"
            },
            {
                "source": "Approved At",
                "target": "approved_at"
            },
            {
                "source": "Effective Start",
                "target": "effective_start"
            },
            {
                "source": "Effective End",
                "target": "effective_end"
            },
            {
                "source": "Effective End Inclusive",
                "target": "effective_end_inclusive"
            },
            {
                "source": "Display Start",
                "target": "display_start"
            },
            {
                "source": "Display End",
                "target": "display_end"
            },
            {
                "source": "Display End Inclusive",
                "target": "display_end_inclusive"
            },
            {
                "source": "Exception Activation Id",
                "target": "exception_activation_id"
            },
            {
                "source": "Exception Amount",
                "target": "exception_amount"
            },
            {
                "source": "Exception Reason",
                "target": "exception_reason"
            }
        ],
        "activations": [
            {
                "source": "Account",
                "target": "account"
            },
            {
                "source": "Source",
                "target": "source"
            },
            {
                "source": "Offer Id",
                "target": "offer_id"
            },
            {
                "source": "Revision",
                "target": "revision"
            },
            {
                "source": "Sku",
                "target": "sku"
            },
            {
                "source": "Variant",
                "target": "variant"
            },
            {
                "source": "Currency",
                "target": "currency"
            },
            {
                "source": "Market",
                "target": "market"
            },
            {
                "source": "Kind",
                "target": "kind"
            },
            {
                "source": "Amount",
                "target": "amount"
            },
            {
                "source": "Decimals",
                "target": "decimals"
            },
            {
                "source": "Row Id",
                "target": "row_id"
            },
            {
                "source": "Activation Id",
                "target": "activation_id"
            },
            {
                "source": "Campaign Id",
                "target": "campaign_id"
            },
            {
                "source": "Starts At",
                "target": "starts_at"
            },
            {
                "source": "Ends At",
                "target": "ends_at"
            },
            {
                "source": "End Inclusive",
                "target": "end_inclusive"
            },
            {
                "source": "Owner",
                "target": "owner"
            },
            {
                "source": "Spend",
                "target": "spend"
            },
            {
                "source": "Spend Period",
                "target": "spend_period"
            }
        ],
        "observations": [
            {
                "source": "Account",
                "target": "account"
            },
            {
                "source": "Source",
                "target": "source"
            },
            {
                "source": "Offer Id",
                "target": "offer_id"
            },
            {
                "source": "Revision",
                "target": "revision"
            },
            {
                "source": "Sku",
                "target": "sku"
            },
            {
                "source": "Variant",
                "target": "variant"
            },
            {
                "source": "Currency",
                "target": "currency"
            },
            {
                "source": "Market",
                "target": "market"
            },
            {
                "source": "Kind",
                "target": "kind"
            },
            {
                "source": "Amount",
                "target": "amount"
            },
            {
                "source": "Decimals",
                "target": "decimals"
            },
            {
                "source": "Row Id",
                "target": "row_id"
            },
            {
                "source": "Observed At",
                "target": "observed_at"
            }
        ]
    },
    "asOf": "2026-10-02T12:00:00Z"
};

// Run the Actor and wait for it to finish
const run = await client.actor("critd/campaign-offer-guard").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 = {
    "offers": """Account,Source,Offer Id,Revision,Sku,Variant,Currency,Market,Kind,Amount,Decimals,Row Id,Approved At,Effective Start,Effective End,Effective End Inclusive,Display Start,Display End,Display End Inclusive,Exception Activation Id,Exception Amount,Exception Reason,Export Note
fictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,10.00,2,approval-1,2026-09-30T12:00:00Z,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,,,,Fictional extra column; not included in the report
""",
    "activations": """Account,Source,Offer Id,Revision,Sku,Variant,Currency,Market,Kind,Amount,Decimals,Row Id,Activation Id,Campaign Id,Starts At,Ends At,End Inclusive,Owner,Spend,Spend Period,Export Note
fictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,10.00,2,activation-row-1,activation-1,campaign-1,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report
fictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,12.00,2,activation-row-2,activation-2,campaign-2,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report
fictional-account,approved-ledger,offer-1,rev-unmapped,SKU-001,standard,USD,US,fixed_price,10.00,2,activation-row-3,activation-3,campaign-3,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report
""",
    "observations": """[
  {
    \"Account\": \"fictional-account\",
    \"Source\": \"approved-ledger\",
    \"Offer Id\": \"offer-1\",
    \"Revision\": \"rev-1\",
    \"Sku\": \"SKU-001\",
    \"Variant\": \"standard\",
    \"Currency\": \"USD\",
    \"Market\": \"US\",
    \"Kind\": \"fixed_price\",
    \"Amount\": \"10.00\",
    \"Decimals\": \"2\",
    \"Row Id\": \"observation-1\",
    \"Observed At\": \"2026-10-02T11:00:00Z\",
    \"Export Note\": \"Fictional extra column; not included in the report\"
  }
]
""",
    "mapping": {
        "ignore_unmapped_columns": True,
        "offers": [
            {
                "source": "Account",
                "target": "account",
            },
            {
                "source": "Source",
                "target": "source",
            },
            {
                "source": "Offer Id",
                "target": "offer_id",
            },
            {
                "source": "Revision",
                "target": "revision",
            },
            {
                "source": "Sku",
                "target": "sku",
            },
            {
                "source": "Variant",
                "target": "variant",
            },
            {
                "source": "Currency",
                "target": "currency",
            },
            {
                "source": "Market",
                "target": "market",
            },
            {
                "source": "Kind",
                "target": "kind",
            },
            {
                "source": "Amount",
                "target": "amount",
            },
            {
                "source": "Decimals",
                "target": "decimals",
            },
            {
                "source": "Row Id",
                "target": "row_id",
            },
            {
                "source": "Approved At",
                "target": "approved_at",
            },
            {
                "source": "Effective Start",
                "target": "effective_start",
            },
            {
                "source": "Effective End",
                "target": "effective_end",
            },
            {
                "source": "Effective End Inclusive",
                "target": "effective_end_inclusive",
            },
            {
                "source": "Display Start",
                "target": "display_start",
            },
            {
                "source": "Display End",
                "target": "display_end",
            },
            {
                "source": "Display End Inclusive",
                "target": "display_end_inclusive",
            },
            {
                "source": "Exception Activation Id",
                "target": "exception_activation_id",
            },
            {
                "source": "Exception Amount",
                "target": "exception_amount",
            },
            {
                "source": "Exception Reason",
                "target": "exception_reason",
            },
        ],
        "activations": [
            {
                "source": "Account",
                "target": "account",
            },
            {
                "source": "Source",
                "target": "source",
            },
            {
                "source": "Offer Id",
                "target": "offer_id",
            },
            {
                "source": "Revision",
                "target": "revision",
            },
            {
                "source": "Sku",
                "target": "sku",
            },
            {
                "source": "Variant",
                "target": "variant",
            },
            {
                "source": "Currency",
                "target": "currency",
            },
            {
                "source": "Market",
                "target": "market",
            },
            {
                "source": "Kind",
                "target": "kind",
            },
            {
                "source": "Amount",
                "target": "amount",
            },
            {
                "source": "Decimals",
                "target": "decimals",
            },
            {
                "source": "Row Id",
                "target": "row_id",
            },
            {
                "source": "Activation Id",
                "target": "activation_id",
            },
            {
                "source": "Campaign Id",
                "target": "campaign_id",
            },
            {
                "source": "Starts At",
                "target": "starts_at",
            },
            {
                "source": "Ends At",
                "target": "ends_at",
            },
            {
                "source": "End Inclusive",
                "target": "end_inclusive",
            },
            {
                "source": "Owner",
                "target": "owner",
            },
            {
                "source": "Spend",
                "target": "spend",
            },
            {
                "source": "Spend Period",
                "target": "spend_period",
            },
        ],
        "observations": [
            {
                "source": "Account",
                "target": "account",
            },
            {
                "source": "Source",
                "target": "source",
            },
            {
                "source": "Offer Id",
                "target": "offer_id",
            },
            {
                "source": "Revision",
                "target": "revision",
            },
            {
                "source": "Sku",
                "target": "sku",
            },
            {
                "source": "Variant",
                "target": "variant",
            },
            {
                "source": "Currency",
                "target": "currency",
            },
            {
                "source": "Market",
                "target": "market",
            },
            {
                "source": "Kind",
                "target": "kind",
            },
            {
                "source": "Amount",
                "target": "amount",
            },
            {
                "source": "Decimals",
                "target": "decimals",
            },
            {
                "source": "Row Id",
                "target": "row_id",
            },
            {
                "source": "Observed At",
                "target": "observed_at",
            },
        ],
    },
    "asOf": "2026-10-02T12:00:00Z",
}

# Run the Actor and wait for it to finish
run = client.actor("critd/campaign-offer-guard").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 '{
  "offers": "Account,Source,Offer Id,Revision,Sku,Variant,Currency,Market,Kind,Amount,Decimals,Row Id,Approved At,Effective Start,Effective End,Effective End Inclusive,Display Start,Display End,Display End Inclusive,Exception Activation Id,Exception Amount,Exception Reason,Export Note\\nfictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,10.00,2,approval-1,2026-09-30T12:00:00Z,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,,,,Fictional extra column; not included in the report\\n",
  "activations": "Account,Source,Offer Id,Revision,Sku,Variant,Currency,Market,Kind,Amount,Decimals,Row Id,Activation Id,Campaign Id,Starts At,Ends At,End Inclusive,Owner,Spend,Spend Period,Export Note\\nfictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,10.00,2,activation-row-1,activation-1,campaign-1,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report\\nfictional-account,approved-ledger,offer-1,rev-1,SKU-001,standard,USD,US,fixed_price,12.00,2,activation-row-2,activation-2,campaign-2,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report\\nfictional-account,approved-ledger,offer-1,rev-unmapped,SKU-001,standard,USD,US,fixed_price,10.00,2,activation-row-3,activation-3,campaign-3,2026-10-01T00:00:00Z,2026-11-01T00:00:00Z,false,Fictional reviewer,10.00,2026-10,Fictional extra column; not included in the report\\n",
  "observations": "[\\n  {\\n    \\"Account\\": \\"fictional-account\\",\\n    \\"Source\\": \\"approved-ledger\\",\\n    \\"Offer Id\\": \\"offer-1\\",\\n    \\"Revision\\": \\"rev-1\\",\\n    \\"Sku\\": \\"SKU-001\\",\\n    \\"Variant\\": \\"standard\\",\\n    \\"Currency\\": \\"USD\\",\\n    \\"Market\\": \\"US\\",\\n    \\"Kind\\": \\"fixed_price\\",\\n    \\"Amount\\": \\"10.00\\",\\n    \\"Decimals\\": \\"2\\",\\n    \\"Row Id\\": \\"observation-1\\",\\n    \\"Observed At\\": \\"2026-10-02T11:00:00Z\\",\\n    \\"Export Note\\": \\"Fictional extra column; not included in the report\\"\\n  }\\n]\\n",
  "mapping": {
    "ignore_unmapped_columns": true,
    "offers": [
      {
        "source": "Account",
        "target": "account"
      },
      {
        "source": "Source",
        "target": "source"
      },
      {
        "source": "Offer Id",
        "target": "offer_id"
      },
      {
        "source": "Revision",
        "target": "revision"
      },
      {
        "source": "Sku",
        "target": "sku"
      },
      {
        "source": "Variant",
        "target": "variant"
      },
      {
        "source": "Currency",
        "target": "currency"
      },
      {
        "source": "Market",
        "target": "market"
      },
      {
        "source": "Kind",
        "target": "kind"
      },
      {
        "source": "Amount",
        "target": "amount"
      },
      {
        "source": "Decimals",
        "target": "decimals"
      },
      {
        "source": "Row Id",
        "target": "row_id"
      },
      {
        "source": "Approved At",
        "target": "approved_at"
      },
      {
        "source": "Effective Start",
        "target": "effective_start"
      },
      {
        "source": "Effective End",
        "target": "effective_end"
      },
      {
        "source": "Effective End Inclusive",
        "target": "effective_end_inclusive"
      },
      {
        "source": "Display Start",
        "target": "display_start"
      },
      {
        "source": "Display End",
        "target": "display_end"
      },
      {
        "source": "Display End Inclusive",
        "target": "display_end_inclusive"
      },
      {
        "source": "Exception Activation Id",
        "target": "exception_activation_id"
      },
      {
        "source": "Exception Amount",
        "target": "exception_amount"
      },
      {
        "source": "Exception Reason",
        "target": "exception_reason"
      }
    ],
    "activations": [
      {
        "source": "Account",
        "target": "account"
      },
      {
        "source": "Source",
        "target": "source"
      },
      {
        "source": "Offer Id",
        "target": "offer_id"
      },
      {
        "source": "Revision",
        "target": "revision"
      },
      {
        "source": "Sku",
        "target": "sku"
      },
      {
        "source": "Variant",
        "target": "variant"
      },
      {
        "source": "Currency",
        "target": "currency"
      },
      {
        "source": "Market",
        "target": "market"
      },
      {
        "source": "Kind",
        "target": "kind"
      },
      {
        "source": "Amount",
        "target": "amount"
      },
      {
        "source": "Decimals",
        "target": "decimals"
      },
      {
        "source": "Row Id",
        "target": "row_id"
      },
      {
        "source": "Activation Id",
        "target": "activation_id"
      },
      {
        "source": "Campaign Id",
        "target": "campaign_id"
      },
      {
        "source": "Starts At",
        "target": "starts_at"
      },
      {
        "source": "Ends At",
        "target": "ends_at"
      },
      {
        "source": "End Inclusive",
        "target": "end_inclusive"
      },
      {
        "source": "Owner",
        "target": "owner"
      },
      {
        "source": "Spend",
        "target": "spend"
      },
      {
        "source": "Spend Period",
        "target": "spend_period"
      }
    ],
    "observations": [
      {
        "source": "Account",
        "target": "account"
      },
      {
        "source": "Source",
        "target": "source"
      },
      {
        "source": "Offer Id",
        "target": "offer_id"
      },
      {
        "source": "Revision",
        "target": "revision"
      },
      {
        "source": "Sku",
        "target": "sku"
      },
      {
        "source": "Variant",
        "target": "variant"
      },
      {
        "source": "Currency",
        "target": "currency"
      },
      {
        "source": "Market",
        "target": "market"
      },
      {
        "source": "Kind",
        "target": "kind"
      },
      {
        "source": "Amount",
        "target": "amount"
      },
      {
        "source": "Decimals",
        "target": "decimals"
      },
      {
        "source": "Row Id",
        "target": "row_id"
      },
      {
        "source": "Observed At",
        "target": "observed_at"
      }
    ]
  },
  "asOf": "2026-10-02T12:00:00Z"
}' |
apify call critd/campaign-offer-guard --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,critd/campaign-offer-guard"
        }
    }
}
```

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/gRaY3W37OkClOgvC8/builds/n45jMl3SR0863kGBW/openapi.json
