Competitor Ad Strategy Brief — Offers, Messaging & Changes avatar

Competitor Ad Strategy Brief — Offers, Messaging & Changes

Pricing

from $15.00 / brand strategy brief

Go to Apify Store
Competitor Ad Strategy Brief — Offers, Messaging & Changes

Competitor Ad Strategy Brief — Offers, Messaging & Changes

Turn supplied Meta ad JSON or selected Apify datasets into a brand research report: observed offers, messaging, CTAs, destination URLs, sample changes and test hypotheses. Printable HTML + JSON. Free fictional demo. No AI key.

Pricing

from $15.00 / brand strategy brief

Rating

0.0

(0)

Developer

El Fajad

El Fajad

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Competitor Ad Strategy Brief

Turn one advertiser's supplied ad records into a structured research brief: recurring offers and messaging, calls to action, creative formats, landing-page destinations, differences against a previous sample, and campaign ideas to test. Get a printable HTML report, traceable source evidence and JSON for agency, CRM and AI workflows.

This is an analysis Actor. Bring an existing ad dataset or paste JSON. It does not collect ads, run another paid Actor, fetch landing pages, download creatives or require an AI API key.

Try the fictional demo first

{"mode":"demo"}

Demo always uses the fixed fictional Demo Supply examples. It ignores custom ad records and does not trigger the paid strategy-brief event. Any platform startup event shown in Pricing still applies. Demo output and HTML are clearly marked fictional.

Open Brand brief → Open printable report. Print the HTML page to save a PDF. The demo includes a current/previous comparison so you can inspect the result before supplying your data.

Analyze an Apify ad dataset

{
"mode": "dataset",
"brandName": "Your competitor",
"currentDatasetId": "YOUR_17_CHAR_DATASET_ID",
"previousDatasetId": "OPTIONAL_PRIOR_DATASET_ID",
"observedAt": "2026-09-28T12:00:00Z",
"previousObservedAt": "2026-09-21T12:00:00Z"
}
  1. Collect/export ads using your existing workflow. For example, Apify's Facebook Ads Scraper returns compatible Meta snapshot fields. Its collection fees are separate and are not included in this Actor's report price.
  2. Select Select Apify ad datasets as the input mode. Use the dataset picker to select the current and optional prior datasets.
  3. Supply a label and, if known, collection timestamps. Source rows must describe one advertiser; mixed advertisers are rejected.
  4. Set maximum charge to at least $15.01 for a real report, then run. Default demo spending settings may be too low for paid mode.
  5. Open the printable report or use the output JSON.

The Actor has Limited permissions. The storage pickers grant READ only to the datasets you explicitly select. It does not modify source data. In API calls, pass the source IDs in the declared input fields so Apify can apply the same scoped storage permissions.

The first 100 dataset rows are analyzed. If the source is larger, the report explicitly warns about sampling. Filter your upstream collection to a single advertiser before running; this Actor does not search an entire multi-brand dataset for a matching name.

Paste ad JSON instead

{
"mode": "inline",
"brandName": "Example brand",
"currentAds": [
{"id":"sample-1","advertiserName":"Example brand","body":"Save 20% on our starter kit.","cta":"Shop now","landingPageUrl":"https://example.com/kits","format":"IMAGE","isActive":true,"startDate":"2026-09-01"},
{"id":"sample-2","advertiserName":"Example brand","body":"Free shipping on your first order.","cta":"Shop now","landingPageUrl":"https://example.com/kits","format":"VIDEO","isActive":true,"startDate":"2026-09-10"},
{"id":"sample-3","advertiserName":"Example brand","body":"See our simple everyday routine.","cta":"Learn more","landingPageUrl":"https://example.com/how-it-works","format":"VIDEO","isActive":true,"startDate":"2026-09-15"}
]
}

These are synthetic format examples, not real advertiser evidence. Inline mode requires 3–100 distinct ads with usable copy. Optional previousAds accepts an earlier array for the same advertiser. Download Normalized ad snapshot from a prior run and reuse that array as previousAds.

Supported fields include the normalized example above and common Meta export fields: adArchiveId / adArchiveID / ad_archive_id, pageId / pageID, snapshot.pageName, snapshot.body.text, snapshot.cards, snapshot.ctaText, snapshot.linkUrl, snapshot.displayFormat, startDateFormatted, isActive and publisher-platform arrays. Media-only rows without usable copy are excluded. Count-only and error rows are not treated as ads.

What you receive

OutputWhat it establishes
Offers and messagingSelected English/Arabic phrases observed in ad copy, with counts, sample shares and source evidence
CTAs, formats and platformsDistribution of supplied metadata; missing values remain Unknown
Destination URLsSupplied URLs grouped after removing common tracking parameters; pages were not visited
Repeated copyExact normalized copy across distinct ad IDs; duplicate rows for the same ID are merged
Observed ad ageSupplied start date to observation reference for ads explicitly marked active; no success inference
Previous-sample comparisonNew to sample, not seen in current sample, creative record changes and explicit status changes
Test hypothesesSuggested experiments based on observed phrases; measure results in your own campaigns
Printable HTMLReviewable report with coverage, exclusions and evidence links

Source links use supplied public HTTP(S) URLs or a Meta Ad Library link derived from a supplied numeric archive ID. The Actor does not verify that these links are live. For missing IDs, copy fingerprints and input row numbers provide provenance; text changes can then appear as new/missing records.

No “winning ad,” competitor ROAS, spend, conversion, profit or revenue estimate is generated. A long observed age does not prove uninterrupted delivery. An ad absent from your current sample may still be running.

Inputs and limits

FieldUse
modedemo (default), inline or dataset
brandNameRequired for real reports; up to 120 characters
currentAds, previousAdsInline JSON arrays, maximum 100 rows each
currentDatasetId, previousDatasetIdSelected read-only datasets for dataset mode
observedAt, previousObservedAtOptional non-future ISO dates; previous must precede current when both supplied
reportLabelOptional printable report heading, up to 120 characters

Maximum input size is 5 MiB. Trim unused large creative/detail fields from inline input. At least three distinct usable ads are needed for a paid report. Missing advertiser identity is reported as an unverified label; known conflicting advertisers are rejected.

observedAt is supplied by you. When omitted, analysis time is used as the age reference and source freshness remains unknown. This Actor does not automatically maintain cross-run history: select a previous dataset or supply previousAds for comparisons.

Pricing and billing

Launch report price: $15 per delivered brand brief, event strategy-brief, covering up to 100 current and 100 previous rows. The Pricing tab is authoritative. Collection by other Actors is separate.

  • Fixed fictional demo: no strategy-brief event.
  • Real usable report: one strategy-brief event, including when no configured theme is found or no previous snapshot was supplied.
  • Empty/unusable input, fewer than three distinct usable ads, mixed advertisers or insufficient budget: no report event.
  • Startup event: expected $0.00005 per run at supported memory sizes, including demos and failed input runs.
  • No separate dataset-row charge or platform-usage pass-through is intended.

The HTML report is saved before its dataset row is charged. The Actor checks the report-event budget first and skips already-delivered results if the same run is resurrected. Set $15.01 as your run cap for one real report; a cap is not a minimum charge. Plan restrictions may prevent real reports when your available run budget is lower. The fictional demo remains available with a small cap.

Output records

The default dataset contains one brief with brandName, isDemo, analysisId, generatedAt, observedAt, counts, summary, themes, repeatedCopy, ctas, formats, platforms, landingPages, longevity, comparison, testHypotheses, normalized ads, coverage, reportUrl and reportKey.

Default key-value store:

  • brief-<analysisId>.html: printable HTML.
  • ADS-SNAPSHOT: normalized ad array for reuse as inline previousAds.
  • RUN-SUMMARY: delivery/demo/budget status.

Download important output before Apify retention expires.

API and MCP

Use elfajad/competitor-ad-strategy-brief through the official Apify client, API or MCP server after publication. Input, output and dataset schemas describe the workflow.

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({token: process.env.APIFY_TOKEN});
const run = await client.actor('elfajad/competitor-ad-strategy-brief').call({
mode: 'dataset', brandName: 'Your competitor',
currentDatasetId: process.env.SOURCE_DATASET_ID
}, {maxTotalChargeUsd: 15.01, memory: 256});
const {items} = await client.dataset(run.defaultDatasetId).listItems();

Development and support

Node.js 22+, Apify SDK (Apache-2.0), ipaddr.js (MIT). Deterministic analysis; no proprietary model or paid enrichment provider. No VPS.

npm ci
npm test
npm run sample

Use the Issues tab for reproducible problems. Include the run ID and non-sensitive field names; do not publish private ad datasets, tokens or payout details.