Cross-Channel Ad Intelligence Monitor
Pricing
from $25.00 / 1,000 successful advertiser-channel checks
Cross-Channel Ad Intelligence Monitor
Unofficial, independent monitor of competitors’ public ads across Meta, Google, LinkedIn, and TikTok. Detect new, changed, reactivated, and safely confirmed-ended ads; preserve evidence; analyze creatives and landing pages; and send source-aware reports. Not affiliated with those platforms.
Pricing
from $25.00 / 1,000 successful advertiser-channel checks
Rating
0.0
(0)
Developer
Progamadores.com
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Beta. Evidence-backed monitoring for public advertising transparency data across Meta, Google, LinkedIn, and TikTok.
Unofficial tool. This Actor is not affiliated with, endorsed by, or sponsored by Meta, Google, LinkedIn, TikTok, or the providers of compatible source Actors.
Use this Actor to turn source records into a consistent timeline of new ads, creative changes, reactivations, and cautiously confirmed deactivations. It is designed for agencies and brands that need repeatable competitor monitoring without treating incomplete public libraries as complete campaign data.
The Actor consumes datasets you select or output from compatible source Actors running in your own Apify account. It does not provide official platform API access, bypass access controls, or guarantee complete coverage.
What you get
- One normalized record model across four advertising platforms.
- Stable advertiser and ad identity checks, with confidence and supporting evidence.
- Change types:
NEW,CHANGED,REACTIVATED,POSSIBLY_INACTIVE, andINACTIVE_CONFIRMED. - Source-health diagnostics that distinguish a complete response from partial, blocked, truncated, unsupported, or failed collection.
- Deterministic creative analysis for observable hooks, offers, calls to action, and funnel signals.
- Optional bounded analysis of public landing pages.
- A default dataset, a machine-readable JSON summary, and an HTML report.
- Optional idempotent webhook delivery with HMAC-SHA256 signing.
This Actor does not infer spend, clicks, conversions, CTR, CPA, revenue, or ROAS. Ad longevity and repeated observation are useful research signals, not proof that an ad performs well.
How source access works
| Mode | Behavior | Best for |
|---|---|---|
DATASET | Reads only the platform datasets selected with the four resource pickers. | Controlled, repeatable analysis and first-time validation. |
EXTERNAL_ACTOR | Calls compatible source Actors under your Apify account. Override them with sourceActorIds. | Scheduled collection when you already trust a source Actor. |
AUTO | Prefers a selected dataset for each platform, then tries a compatible configured source Actor. If neither is available, the check is marked UNSUPPORTED. | Mixed workflows. |
The dataset selectors request READ permission only:
metaSourceDatasetgoogleSourceDatasetlinkedinSourceDatasettiktokSourceDataset
Selected datasets are not modified. Source schemas change over time, so incompatible or incomplete records are skipped or marked partial in diagnostics instead of being silently fabricated.
sourceActorIds is a JSON object keyed by META, GOOGLE, LINKEDIN, or TIKTOK. These are bring-your-own integrations, not endorsements or official platform connectors. A child Actor can require additional permissions, consume platform resources, and apply its own pricing. maxSourceChargeUsd limits each child Actor call; also set an Apify run-level maximum charge when using paid sources.
This Actor runs with LIMITED_PERMISSIONS, so every child Actor selected through sourceActorIds must also support LIMITED_PERMISSIONS. An incompatible full-permission child is reported as a source failure instead of silently weakening this Actor's permission level.
Platform coverage and limitations
| Platform | Supported evidence | Important limits |
|---|---|---|
| Meta | Meta Ad Library records supplied by a selected dataset or compatible source Actor. Common creative text, media, landing URLs, advertiser identity, and run dates are normalized when present. | Availability and inactive-history coverage depend on the public library, region, ad category, and source provider. This Actor does not include Meta Marketing API access. |
| Google Ads Transparency Center records supplied by the configured source. Advertiser, creative, format, regions, dates, and landing evidence are retained when disclosed. | This is not a Google Ads account connector and does not expose campaign performance. Fields and history vary by region and provider. | |
| LinkedIn Ad Library records, including image, video, carousel, document, and thought-leader formats when present. Advertiser, payer, dates, and disclosed EU impressions or targeting are preserved. | Restricted or unavailable ads can omit previews, payer details, targeting, or impression ranges. No default official API access is claimed. | |
| TikTok | TikTok Commercial Content Library (CCL) records supplied by an authorized dataset or compatible Actor. Advertiser/payer, targeting, impression ranges, dates, media, and landing evidence are retained when disclosed. | CCL advertising coverage is European rather than global: currently EEA countries, Switzerland, and the United Kingdom. TikTok Creative Center Top Ads is a separate, curated inspiration set and is always treated as partial coverage, never as the complete CCL. |
For current TikTok scope, see the official Commercial Content Library information and supported countries. Creative Center's Top Ads is explicitly a collection of selected high-performing creatives; the Actor does not convert those labels into verified ROAS or other account-level performance.
Quick start
- Produce or choose a compatible platform source dataset in your Apify account.
- Create a new Actor task and set
providerModetoDATASET. - Select the dataset with the appropriate top-level resource picker.
- Add stable platform advertiser IDs or library URLs to each target whenever possible.
- Start with
dryRun: trueto validate normalization and source health. Dry run does not establish a persistent baseline. - Set
dryRun: falseand keepinitialRunBehavior: BASELINE_ONLYfor the first persistent run. - Schedule later runs with exactly the same
monitorId. Avoid overlapping runs of the same monitor.
Example input:
{"monitorId": "fashion-es-weekly","targets": [{"id": "example-brand","name": "Example Brand","domain": "example.com","metaPageId": "1234567890","tiktokAdvertiserName": "Example Brand"}],"platforms": ["META", "TIKTOK"],"country": "ES","providerMode": "DATASET","metaSourceDataset": "YOUR_META_DATASET_ID","tiktokSourceDataset": "YOUR_TIKTOK_DATASET_ID","maxAdsPerTarget": 100,"missingScansBeforeInactive": 2,"initialRunBehavior": "BASELINE_ONLY","includeLandingAnalysis": false,"analysisMode": "RULES","dryRun": true}
Replace the placeholder dataset IDs through the Apify Console resource pickers. Do not copy the example advertiser values into a production monitor.
Important inputs
| Input | Purpose |
|---|---|
monitorId | Stable history namespace. Reuse it for every scheduled run of the same monitor. |
targets | Competitors or advertisers. id, name, and domain are required; platform IDs or library URLs make matching safer. |
platforms | Any subset of META, GOOGLE, LINKEDIN, and TIKTOK. Failures are isolated by platform and target. |
maxAdsPerTarget | Hard per-target/per-platform record cap. Reaching it marks the scan truncated so missing ads are not treated as deactivated. |
missingScansBeforeInactive | Number of consecutive complete missing scans required before INACTIVE_CONFIRMED; minimum 2. |
initialRunBehavior | BASELINE_ONLY avoids alerting on every existing ad during the first run. |
analysisMode | RULES uses reproducible text rules and no paid AI API; OFF disables creative analysis. |
includeLandingAnalysis | Fetches public landing pages with redirect, DNS/SSRF, MIME type, response-size, and timeout limits. |
maxLandingPagesPerRun | Global cap on unique landing pages fetched after URL deduplication; default 25, allowed range 1–100. |
webhookUrl / webhookHmacSecret | Optional public HTTPS alert endpoint and signing secret. Both inputs are stored as secrets by Apify. |
dryRun | Suppresses monitor-state writes, webhooks, and this Actor's custom billing events. Child source Actors can still charge. |
Outputs
The Output tab exposes three links:
| Output | Contents |
|---|---|
| Change events and run summary | Default dataset items. recordType is CHANGE_EVENT or RUN_SUMMARY; deterministic eventId/recordId values let consumers deduplicate a retry safely. |
| Human-readable report | REPORT.html in the default key-value store. |
| Machine-readable summary | SUMMARY.json with totals, limitations, and platform health. |
Change records include the monitor and scan IDs, observation time, platform, target, change type, changed fields, before/after snapshots when available, confidence, a concise message, and evidence. Fields remain null when a source does not disclose them.
The summary reports one of these health states for each target/platform check:
FULL: the connector considers the configured source response complete.PARTIAL: usable results exist, but records or important fields are unavailable.BLOCKED: the source denied or rate-limited collection.TRUNCATED: pagination or a safety limit prevented a complete result.UNSUPPORTED: no compatible source or mode is available.FAILED: collection or normalization failed.
The run summary can also report two orchestration states that are not source-health claims:
SKIPPED_BUDGET: the check was not started because the remaining custom-event budget was insufficient.ALREADY_PROCESSED: the same target/platform was already completed during this stable Actor run ID, typically after a process restart.
Only FULL scans count as negative evidence when an already-observed ad disappears. Partial, blocked, truncated, unsupported, and failed scans do not advance deactivation counters.
Alerts
Set webhookUrl to receive persisted change events as JSON. If webhookHmacSecret is present, requests include:
X-Ad-Intelligence-Signature: sha256=<hex digest>Idempotency-Key: <stable scan ID>
Verify the signature over the exact request body before processing it. Delivery is bounded and retried only for transient network or HTTP errors. No webhook is sent in dry-run mode.
Landing-page analysis
When enabled, the Actor visits public HTTP(S) landing URLs and extracts observable page metadata, offer text, redirects, a content fingerprint, and common technology signatures. Requests block credentials in URLs, private/reserved network addresses, unsupported MIME types, excessive redirects, oversized responses, and slow responses.
Landing analysis does not submit forms, log in, solve access controls, or infer conversions. Disable it when it is outside your lawful purpose or not needed for the monitor.
Pay-per-event configuration
The implementation uses one custom event: advertiser-channel-check. A check is counted as chargeable only when its result is usable: either a complete verified-zero response or a response containing normalized ads. Empty partial, blocked, unsupported, and failed checks are not charged. After normalized ads, diagnostics, change events, state, and preliminary JSON/HTML reports are available, all chargeable checks are billed in one bounded batch. A persisted per-check billing obligation is reconciled with Apify's authoritative charged-event count after a process restart, and the official run charge endpoint receives a stable scan-derived idempotency key, so an uncertain request can be retried without charging twice. The reports are then updated with the final billing and webhook status. Landing enrichment, change records, diagnostics, reports, and default Dataset items do not stack extra custom events.
The code preflights the remaining run charge limit before starting any selected check, including Dataset checks, so work beyond the budget is not started. dryRun disables this Actor's custom event. The event price and whether platform usage is passed through remain publication settings in the Apify Console; the repository itself cannot activate a price. Before a paid Store release, the publisher must configure a positive price for advertiser-channel-check, remove apify-default-dataset-item, decide whether to use Apify's synthetic start event, and verify the complete billing flow. See Apify's pay-per-event publishing documentation.
Charges from compatible child source Actors are separate from this proposal and remain governed by those Actors' Store listings and the maxSourceChargeUsd input.
Privacy, retention, and responsible use
- Source datasets are opened with read-only permission. The Actor does not modify them.
- Public transparency records can contain creative text and media URLs, landing URLs, advertiser or payer names, creator identity, targeting attributes, and impression ranges. Normalized evidence can retain those fields.
- Landing-page requests disclose a normal network request to the destination site. The Actor does not intentionally collect private account data or audience-member identities.
- Webhook inputs are marked secret. The signing secret is not written to datasets, reports, or returned delivery diagnostics.
- Persistent monitors use named Apify storage for state, normalized observations, and diagnostics. Under current Apify retention rules, named storage is retained until you delete it; default run storage follows your Apify plan and retention settings. See Apify storage retention.
dryRunsuppresses persistent monitor-state mutations and alert delivery, but it can still read selected datasets and can still start separately billed child Actors outsideDATASETmode.- Delete the monitor's named
ad-intel-...-state,ad-intel-...-ads, andad-intel-...-diagnosticsstorages when you no longer need the history. - You are responsible for a lawful basis, data-protection obligations, platform terms, source-Actor terms, and access restrictions that apply to your use. Public availability does not grant copyright or redistribution rights over third-party creatives. Prefer storing evidence and source links; do not republish creative assets without permission.
This tool supports transparency and competitive research; it is not legal advice and is not a substitute for a DSA, GDPR, copyright, or platform-terms assessment.
Beta checklist before relying on a monitor
- Confirm that each target maps to the correct advertiser using stable platform identifiers.
- Inspect source-health warnings and skipped-record counts after every schema/provider change.
- Compare a sample of normalized records with the original transparency-library pages.
- Keep
BASELINE_ONLYfor the first persistent run unless you intentionally want all existing ads emitted as new. - Treat a zero-result scan as meaningful only when health is
FULL. - Pin and retest compatible source Actor versions before production schedules.
If a run looks incomplete, inspect the final RUN_SUMMARY and platform diagnostics first. They are designed to make missing coverage visible rather than hide it behind an empty result.