X Ads Repository Scraper & Competitor Monitor avatar

X Ads Repository Scraper & Competitor Monitor

Pricing

$0.10 / 1,000 emitted ad or campaign changes

Go to Apify Store
X Ads Repository Scraper & Competitor Monitor

X Ads Repository Scraper & Competitor Monitor

Extract current ads served on X across European markets and emit only new, changed, or removed competitor campaigns on scheduled runs. No X login or developer key required.

Pricing

$0.10 / 1,000 emitted ad or campaign changes

Rating

0.0

(0)

Developer

Lexxer ​

Lexxer ​

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

5 days ago

Last modified

Share

Extract current advertisements served on X across European markets, then monitor competitors for new, changed, and removed campaigns. The Actor uses X's public Ads Repository workflow and does not require an X login, developer account, or customer-supplied API key.

What it returns

Each successful row can include:

  • advertiser handle, ID, and disclosed account name
  • tweet, line-item, and account identifiers
  • tweet creation timestamp derived from the stable public tweet ID
  • country where the ad was served
  • funding instrument type and currency
  • approval status
  • current creative text and author when the public tweet remains embeddable
  • targeting names and types
  • impressions and reach
  • stable ad key and content hash
  • NEW, CHANGED, UNCHANGED, or REMOVED change status
  • first-seen and last-seen timestamps

X does not currently expose creative text or media through this repository response. The Actor returns a canonical tweet URL when a tweet ID is present, but it does not claim that the tweet remains publicly viewable.

Creative enrichment uses X's public oEmbed response. Deleted, protected, or unavailable tweets keep their repository metrics and receive a clear creative-enrichment status instead of failing the whole advertiser.

Supported markets

The Apify input form shows normal country names, so Console users do not need to know country codes. API users may pass two-letter codes. Ready-made presets include:

  • DACH: Germany, Austria, and Switzerland
  • Nordics: Denmark, Finland, Iceland, Norway, and Sweden
  • United Kingdom & Ireland
  • All supported European markets
  • Custom: choose any combination from the Markets field

Advertisers are not limited to the examples. Enter any public X handle, @handle, or profile URL—up to 50 per run.

What customers use it for

  • receive an alert when a competitor launches or removes an ad
  • compare campaign reach and targeting between European markets
  • collect current competitor messaging and disclosed funding information
  • build advertising-transparency and compliance datasets
  • identify long-running campaigns and changes in market coverage
  • filter campaigns by creative or targeting keywords and minimum reach/impressions
  • rank results by impressions, reach, recency, or advertiser

Quick start

{
"advertisers": ["Apple", "SamsungMobile"],
"marketPreset": "dach",
"startDate": "2026-01-01",
"outputMode": "snapshot"
}

The first run should use snapshot. For scheduled monitoring, switch to:

{
"advertisers": ["Apple", "SamsungMobile"],
"countries": ["FR", "DE"],
"startDate": "2026-01-01",
"outputMode": "changes",
"monitorKey": "consumer-tech-eu"
}

The first changes run emits every discovered ad as NEW. Later runs emit only new, changed, and removed rows. Attach an Apify schedule and run-success webhook to integrate the change dataset with email, Slack, Make, Zapier, or another automation system.

Routine impression and reach growth does not produce a CHANGED alert. Changes are reserved for disclosed campaign properties such as approval status, targeting, funding, or advertiser details. Updated metrics remain available in snapshot output.

Every run summary also includes total ads, impressions, and reach plus breakdowns by advertiser and country for quick market comparisons.

Reliability behavior

X sometimes responds with rate limits or Over capacity. The Actor uses conservative concurrency, a delay between requests, exponential backoff, and retryable error classification. A failed advertiser produces a clear, uncharged failure row and does not cause its previously tracked ads to be marked as removed.

Empty results are valid and uncharged. They mean X returned no matching ads for that advertiser, country selection, and date range.

Monitoring state

Change tracking is stored in the Actor's default key-value store under MONITOR_STATE. Each monitorKey has independent history. Keep the same Actor task and monitor key for scheduled runs. Deleting the key-value store resets the monitor and causes all current ads to be emitted as NEW again.

Pricing recommendation

Launch pricing charges $0.0001 per emitted ad/change row ($0.10 per 1,000) plus Apify's tiny synthetic Actor-start event, currently calculated at $0.00005 for this 256 MB Actor. Failure rows and empty searches are not billable result events. This keeps ordinary runs inexpensive while covering fixed startup cost and leaving a small positive margin.

Known limitations

  • Coverage is limited to the countries and advertisements exposed by X's Ads Repository.
  • X can change or remove the public endpoints.
  • Repository results may be delayed relative to ad delivery.
  • The source can return temporary over-capacity errors.
  • Metrics and targeting are only as complete as X's public disclosure.
  • REMOVED means the ad disappeared from the same monitored query, not necessarily that X permanently deleted it.

Local development

npm install
npm test
npm run check

The normal tests use deterministic mocked responses and spend no Apify credits. A public live smoke test is opt-in:

$RUN_LIVE_TESTS=1 npm run test:live

Responsible use

Use the Actor for legitimate advertising research, compliance, journalism, and competitor analysis. The output comes from X's public advertising-transparency system. Users remain responsible for applicable law and platform terms.