# Motion Ads Alternative: Meta Ad Library Research (`khadinakbar/motion-ads-alternative`) Actor

Create source-linked public Meta creative reports for named advertisers: grouped hooks, CTA and media mix, observed duration, and structured JSON. Not owned-account analytics.

- **URL**: https://apify.com/khadinakbar/motion-ads-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 creative insights

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Motion Ads Alternative: Meta Ad Library Research

Create a compact, structured creative-research report from public Meta Ad Library records for a named advertiser. Each dataset row is one grouped creative concept with its observed hook, headline variants, CTA mix, media mix, observed run length, and links back to the public source ads.

### Best fit

Use this Actor when you need a reproducible competitor-research snapshot for a known advertiser and want machine-readable output for a spreadsheet, brief, or workflow. Start with an exact Meta page ID where possible; an advertiser name is supported but can resolve less precisely.

For public advertiser research, this Actor keeps the workflow deliberately source-linked and bounded. Motion is better suited to connected-account performance, attribution, team review, historical workspaces, and cross-channel analytics; this Actor never connects to a Meta ad account.

### Input

```json
{
  "advertisers": ["100281786832302", "Nike"],
  "country": "US",
  "activeStatus": "ACTIVE",
  "maxAdsPerAdvertiser": 20,
  "maxPagesPerAdvertiser": 3,
  "provider": "auto"
}
```

Enter at least one advertiser. Numeric values are treated as page IDs; other values are treated as exact advertiser names. `maxAdsPerAdvertiser` is the upstream collection cap, not a promise of how many unique concepts exist.

### Output

One dataset row represents a public creative concept, not a performance claim. Stable fields include:

| Field | Meaning |
| --- | --- |
| `conceptId` | Stable hash of advertiser, media type, hook, and CTA grouping. |
| `hook` | First observed words of the public creative copy. |
| `callsToAction` / `mediaMix` | Observed CTA and media/platform variation within the concept. |
| `longestObservedRunDays` | Duration derived from public start/end dates when they are available. |
| `sourceAdUrls` / `provenance` | Public Meta Ad Library source links, provider route, and collection time. |

The `OUTPUT` key is the compact terminal contract. `RUN_SUMMARY` contains counts, provider diagnostics, event charges, and one of `COMPLETE`, `PARTIAL`, `VALID_EMPTY`, `INVALID_INPUT`, `UPSTREAM_FAILED`, or `CONFIG_ERROR`.

Example persisted creative insight:

```json
{
  "conceptId": "4efb972a26d3f0c7",
  "advertiserPageId": "100281786832302",
  "advertiserName": "Example Brand",
  "adCount": 2,
  "activeAdCount": 2,
  "hook": "Stop scrolling save time with this simple daily routine",
  "callsToAction": ["Shop now"],
  "mediaMix": ["VIDEO", "FACEBOOK", "INSTAGRAM"],
  "longestObservedRunDays": 18,
  "sourceAdUrls": ["https://www.facebook.com/ads/library?id=1234567890123"],
  "provenance": {
    "source": "Meta Ad Library public data via provider API",
    "provider": "scrapecreators",
    "collectedAt": "ISO-8601 timestamp recorded by this run"
  }
}
```

### Price and limits

This Actor uses **Pay per event** pricing: one persisted `creative-insight` is configured at **$0.02**, plus Apify platform usage. A run also has the standard `$0.00005` start event. For example, 10 persisted insight records have $0.20 in configured insight events plus the $0.00005 start event and platform usage. Event limits set on the run cap persisted output; public-provider availability and the requested advertiser determine the actual number of concepts. Treat the live Actor Pricing tab as the current source of truth for effective pricing and platform-usage terms.

### How this workflow compares with Motion

This Actor is a focused alternative for public advertiser creative research. Motion remains the broader choice for connected-account creative analytics, ad leaderboards, AI workspaces, attribution integrations, and team collaboration.

| Decision | This Actor | Motion | Best fit |
| --- | --- | --- | --- |
| Scope | Public Meta advertiser concepts with source-ad provenance | Broader creative-analytics suite | Use this Actor for a bounded public competitor snapshot. |
| Billing | Configured per persisted insight plus Apify usage | Subscription plans based on ad-spend bands | Use on-demand data work for a defined report; use Motion for the suite. |
| Input friction | A named advertiser page ID or name | Connected ad-account workflow for owned-data analytics | Use this Actor when no account connection is required. |
| Output contract | Typed dataset rows and terminal JSON records | Visual reports, creative analytics, and suite features | Use this Actor when a downstream workflow needs source-linked JSON. |
| Efficiency | One bounded input produces a grouped, exportable public-data report | Broader suite workflows include dashboard and collaboration surfaces | No measured same-job speed or cost claim is made before cloud evidence. |
| Automation | Re-runnable Actor input through Apify API and schedules | Motion AI routines and reports | Choose based on the workflow and operational surface you need. |
| Broader analytics | Outside this Actor’s scope | Creative analytics with GA4 and Northbeam integrations | Choose Motion for owned-account, attribution, or team reporting. |

Motion is a trademark of its owner. This independent Actor is not affiliated, associated, or endorsed by Motion.

### API example

After creating an Apify token, run the Actor with the regular API and retrieve the default dataset from the resulting run:

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~motion-ads-alternative/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"advertisers":["100281786832302"],"country":"US","maxAdsPerAdvertiser":20}'
```

Keep API tokens and provider credentials out of inputs, datasets, and logs. Configure `SCRAPECREATORS_API_KEY` or `SOCIAVAULT_API_KEY` as an encrypted Actor environment secret.

### Agent prompt card

> Ask an Apify-connected AI agent through MCP: “Create a public Meta creative-research report for advertiser page ID `100281786832302` in the US. Return the hook, CTA mix, media mix, observed duration, and source ad links as research signals.”

The agent should ask a follow-up when an advertiser, country, freshness need, or output goal is missing. It should route owned-account analytics, attribution, team reporting, or broad creative operations to a product designed for those workflows. Hosted-MCP and client-specific routing behavior should be validated with the target agent client before relying on a particular integration pattern.

### Freshness, responsible use, and reliability

Every row carries a provider label, collection timestamp, and direct public-source links. Meta can change public availability, fields, and country coverage at any time, so rerun the Actor when you need a current snapshot. The release-evidence file records the audited build, provider fallback behavior, output contract, and charge reconciliation for this Actor.

Use public advertising information solely for lawful research, in line with applicable platform terms, privacy rules, local law, and appropriate rights. The result is designed for aggregate creative research rather than individual targeting, performance claims, or unlicensed reproduction.

### Focused standalone workflow

This Actor is designed as a focused standalone workflow. It has no verified public sibling link yet; it is designed to supply a clean source-linked input to an existing creative brief, ad-review, analytics, or warehouse workflow rather than become an all-in-one advertising dashboard.

### Builder's note

I designed this Actor around grouped creative concepts rather than a raw-ad dump so the output remains short enough for a brief while retaining every public source-ad link. Public activity duration, repeated copy, and media variation are useful research signals alongside a separate performance-analysis workflow.

# Actor input Schema

## `advertisers` (type: `array`):

Enter public Meta advertiser page IDs or exact advertiser names, one per line. Example: 100281786832302 or Nike. Numeric IDs are the most precise; names are resolved by the public provider. This Actor only researches named advertisers, not broad generic keywords.

## `advertiserPageIds` (type: `array`):

Enter public Meta/Facebook advertiser page IDs, one per line. Use this when you know the exact advertiser identity. Example: 100281786832302. This Actor never needs a Meta login or your ad account.

## `advertiserNames` (type: `array`):

Enter public advertiser names when a stable page ID is unavailable. Example: Nike. Provider name resolution can be less precise than a page ID, so review the returned advertiser field.

## `country` (type: `string`):

Choose the two-letter country scope used by the public Meta Ad Library provider. Example: US. Use ALL only when the provider supports a global response for the advertiser.

## `activeStatus` (type: `string`):

Choose active ads for current creative research, all ads for historical context, or inactive ads for completed campaigns. Example: ACTIVE. Public availability can vary by country and advertiser.

## `maxAdsPerAdvertiser` (type: `integer`):

Set the maximum public ad records analyzed per advertiser. Example: 50. This bounds provider work and the number of creative-insight events that can be charged.

## `maxPagesPerAdvertiser` (type: `integer`):

Set the maximum pagination pages per advertiser. Example: 5. A low value gives a faster directional report; a higher value can reveal more creative variants.

## `provider` (type: `string`):

Auto tries the configured public Meta Ad Library provider route and falls back on route failure. Example: auto. Select a single route only for diagnosis; provider credentials stay in Actor environment secrets.

## Actor input object example

```json
{
  "advertisers": [
    "100281786832302"
  ],
  "advertiserPageIds": [
    "100281786832302"
  ],
  "country": "US",
  "activeStatus": "ACTIVE",
  "maxAdsPerAdvertiser": 20,
  "maxPagesPerAdvertiser": 5,
  "provider": "auto"
}
```

# Actor output Schema

## `creativeInsights` (type: `string`):

No description

## `output` (type: `string`):

No description

## `runSummary` (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 = {
    "advertisers": [
        "100281786832302"
    ],
    "advertiserPageIds": [
        "100281786832302"
    ],
    "country": "US",
    "maxAdsPerAdvertiser": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/motion-ads-alternative").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 = {
    "advertisers": ["100281786832302"],
    "advertiserPageIds": ["100281786832302"],
    "country": "US",
    "maxAdsPerAdvertiser": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/motion-ads-alternative").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 '{
  "advertisers": [
    "100281786832302"
  ],
  "advertiserPageIds": [
    "100281786832302"
  ],
  "country": "US",
  "maxAdsPerAdvertiser": 20
}' |
apify call khadinakbar/motion-ads-alternative --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/motion-ads-alternative"
        }
    }
}

```

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/Abp5cT0lAXuKnEG3A/builds/oxShROvgvI8ec2yl3/openapi.json
