# LinkedIn Ad Discovery — Who's Advertising on Any Topic (`foxlabs/linkedin-ad-discovery`) Actor

Discover who advertises on any topic on LinkedIn's public Ad Library. Keyword in → a deduped advertiser list with ad count, sample creatives, active window & formats — enriched with each advertiser's real firmographics (domain, industry, size). No login.

- **URL**: https://apify.com/foxlabs/linkedin-ad-discovery.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

<p align="center"><a href="https://apify.com/foxlabs/linkedin-ad-discovery"><img src="https://data.foxlabs.com.tr/img/linkedin-ad-discovery-banner.svg" alt="LinkedIn Ad Discovery — Find Advertisers by Keyword" width="100%" /></a></p>

## LinkedIn Ad Discovery — Find Every Advertiser on a Topic

Type a keyword — **CRM**, **cybersecurity**, **solar**, a competitor's whole category — and get back **who is advertising on it**: a deduped, ad-volume-ranked list of the companies running LinkedIn ads on that topic, each with its ad count, live sample creatives and format mix. Where an advertiser resolves to a real company, records also carry **best-effort firmographics** (domain, industry, size, HQ).

Every other ad-library scraper hands you a pile of individual ads to de-dupe yourself. This one answers the actual question — **which companies are spending on this topic** — as a ready-made prospect and competitor map. It reads the **public** LinkedIn Ad Library only: **no login, no cookies**.

- 🔎 **Keyword → advertiser map** — one topic in, a deduped list of the companies advertising on it, ranked by ad volume
- 🏢 **Firmographics where we can resolve them** — domain, industry, employee count, HQ & followers (best-effort, name-resolved for roughly half of advertisers)
- 🧱 **Breaks the ~24-ads-per-query ceiling** — date × country facet fan-out scans far more of a topic than a single search page
- ⚡ **Cookieless, no login** — public Ad Library only; one run → JSON / CSV / Excel / API

### Quick start (API)

Discover who's advertising on **CRM** and **cybersecurity**, enriched, in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~linkedin-ad-discovery/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "keywords": ["CRM", "cybersecurity"], "maxAdsPerKeyword": 120, "enrichAdvertiser": true }'
````

Prefer no code? Open the **Input** tab, type your keywords, and click **Start** — then download the results.

### What you get

By default, one clean record per **advertiser** discovered for a keyword (rolled up and ranked by ad volume):

| Field | Type | Description |
|---|---|---|
| `keyword` | string | The topic query that surfaced this advertiser |
| `advertiserName` | string | Advertiser name — the official company name when firmographics resolve, otherwise the name shown on the ad |
| `adCount` | number | How many of the scanned ads on this topic this advertiser is running (the ranking signal) |
| `formats` | array | Format breakdown, e.g. `[{ "format": "image", "count": 9 }, { "format": "video", "count": 5 }]` |
| `sampleCreatives` | string\[] | Up to 3 ad-copy snippets (≤140 chars each) from this advertiser's ads |
| `advertiserCompanyId` | string | LinkedIn numeric organization id — present only when the advertiser is resolved |
| `advertiserUrl` | string | `https://www.linkedin.com/company/{id}` — present only when resolved |
| `advertiserCompany` | object | Best-effort firmographics (sub-fields below) — present only when resolved |
| `sources` | object | Provenance, e.g. `{ "ads": "LinkedIn Ad Library (public)", "firmographics": "LinkedIn company page (name-resolved)" }` |
| `scrapedAt` | string | ISO-8601 timestamp of the run |

`advertiserCompany` sub-object (best-effort, present only when the advertiser resolves to a company):

| Field | Type | Description |
|---|---|---|
| `advertiserCompany.domain` | string | Company website domain, e.g. `hubspot.com` — **the field to verify a match** |
| `advertiserCompany.industry` | string | LinkedIn industry label |
| `advertiserCompany.employeeCount` | number | Employee count from the public company page |
| `advertiserCompany.hq` | string | HQ location — locality, region, country |
| `advertiserCompany.followers` | number | LinkedIn follower count |
| `advertiserCompany.website` | string | Full company website URL |

Empty fields are dropped, never guessed — an advertiser that can't be resolved simply omits `advertiserCompany`, `advertiserCompanyId` and `advertiserUrl`.

**Ads mode** (set **Output shape → Ads**) returns one record per individual ad instead:

| Field | Type | Description |
|---|---|---|
| `keyword` | string | The topic query |
| `adUrl` | string | `https://www.linkedin.com/ad-library/detail/{id}` |
| `advertiserName` | string | Name shown on the ad card |
| `body` | string | Ad copy (≤200 chars) |
| `format` | string | `image` or `video` (when detectable) |
| `source` | string | `LinkedIn Ad Library (public)` |
| `scrapedAt` | string | ISO-8601 timestamp |

#### Sample output

*Illustrative record (advertiser rollup mode), shape taken from the live Actor:*

```json
{
  "keyword": "CRM",
  "advertiserName": "HubSpot",
  "advertiserCompanyId": "68529",
  "advertiserUrl": "https://www.linkedin.com/company/68529",
  "adCount": 14,
  "formats": [
    { "format": "image", "count": 9 },
    { "format": "video", "count": 5 }
  ],
  "sampleCreatives": [
    "Grow better with the Smart CRM that connects your marketing, sales and service teams.",
    "See why 250,000+ businesses run on our platform. Start free — no credit card required.",
    "Your CRM shouldn't slow you down. Meet the AI-powered platform built to scale with you."
  ],
  "advertiserCompany": {
    "domain": "hubspot.com",
    "industry": "Software Development",
    "employeeCount": 8100,
    "hq": "Cambridge, Massachusetts, US",
    "followers": 1050000,
    "website": "https://www.hubspot.com"
  },
  "sources": {
    "ads": "LinkedIn Ad Library (public)",
    "firmographics": "LinkedIn company page (name-resolved)"
  },
  "scrapedAt": "2026-07-05T09:12:44.581Z"
}
```

### Input & filters

- **Keywords / topics** — one or more terms to discover advertisers for (e.g. `CRM`, `cybersecurity`, `developer tools`). You get one advertiser rollup per company found on each topic.
- **Output shape** — `Advertisers` (rolled up, one row per unique advertiser — recommended) or `Ads` (flat, one row per individual ad).
- **Max ads per keyword** — how many ads to scan per keyword before rolling up (**1–1000**, default **120**). More ads scanned → more advertisers discovered.
- **Enrich advertiser firmographics** — on by default; attaches domain, industry, employee count, HQ and followers per advertiser (best-effort, name-resolved). Turn off for a faster, discovery-only run.
- **Proxy** — **Residential** proxy by default and strongly recommended; LinkedIn rate-limits and blocks datacenter and un-proxied traffic.

### Example inputs (copy & paste)

```jsonc
// 1) Who is advertising across CRM & marketing automation — enriched advertiser map
{ "keywords": ["CRM", "marketing automation"], "maxAdsPerKeyword": 200, "enrichAdvertiser": true }

// 2) Wide, fast scan of a category (skip enrichment for speed)
{ "keywords": ["cybersecurity"], "maxAdsPerKeyword": 500, "enrichAdvertiser": false }

// 3) Raw ad feed for creative research — one row per ad
{ "keywords": ["developer tools"], "output": "ads", "maxAdsPerKeyword": 300 }

// 4) Multi-topic prospect list — several adjacent categories, enriched
{ "keywords": ["fintech", "payments", "banking software"], "output": "advertisers", "maxAdsPerKeyword": 250, "enrichAdvertiser": true }

// 5) Deep single-topic advertiser census — maximum depth
{ "keywords": ["artificial intelligence"], "output": "advertisers", "maxAdsPerKeyword": 1000, "enrichAdvertiser": true }

// 6) Creative swipe across a theme — flat ads, no enrichment, fast
{ "keywords": ["HR software", "recruiting"], "output": "ads", "enrichAdvertiser": false, "maxAdsPerKeyword": 200 }
```

### Use cases

- **Account discovery & prospecting.** You sell into a category — say CRM tooling. Search `keywords: ["CRM"]` with enrichment on and you get a deduped list of the companies actively advertising there, each with a `domain`, `industry` and `employeeCount` to qualify against — a CRM-ready prospect list you didn't have to hand-build.
- **Competitive landscaping.** Who is spending on your theme, and how heavily? `adCount` ranks advertisers by ad volume so you can see the loud players versus the long tail on a single topic in one run.
- **Creative & messaging research.** `sampleCreatives` surfaces the live ad copy each advertiser is running on the topic — read the market's current positioning and hooks without opening the Ad Library ad by ad.
- **Market sizing.** Pull several related keywords and count the unique advertisers, their industries and size distribution to gauge how crowded (and how enterprise-heavy) a category is.
- **ABM & CRM enrichment.** Feed the discovered advertisers (domain + firmographics) straight into your ABM tooling or CRM to build target lists of companies that have already shown intent by advertising.
- **Agency new-business.** Find brands already spending on a theme you specialize in — a warm outbound list of companies that clearly invest in paid social.

### Performance & throughput

Each keyword fans out across roughly **16 faceted search queries** (date × country) run at concurrency 12, deduping by ad id — this is what breaks LinkedIn's ~24-results-per-query page and scans far more of a topic than a single search. With enrichment on, each **unique** advertiser adds one cached company-page fetch (looked up once, reused). Raising `maxAdsPerKeyword` scans deeper (more advertisers, longer run); turning enrichment off makes discovery-only runs noticeably faster. Real throughput is bounded by LinkedIn's rate limits and your proxy, not the Actor — a Residential proxy is required.

### Integrations

**JavaScript** (`apify-client`):

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('foxlabs/linkedin-ad-discovery').call({
  keywords: ['CRM', 'cybersecurity'], maxAdsPerKeyword: 200, enrichAdvertiser: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python** (`apify-client`):

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("foxlabs/linkedin-ad-discovery").call(run_input={
    "keywords": ["CRM", "cybersecurity"], "maxAdsPerKeyword": 200, "enrichAdvertiser": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["advertiserName"], item.get("adCount"), item.get("advertiserCompany", {}).get("domain"))
```

Also works with **Make / n8n / Zapier** (Apify app → run this Actor, map the input), scheduled runs, webhooks, and the **Apify MCP server** so AI agents can call it as a tool.

### Data quality

- **The discovery data is exact.** `advertiserName`, `adCount`, `formats` and `sampleCreatives` are read directly from the public Ad Library search pages — who is advertising and how much is not estimated.
- **Firmographics are best-effort.** They're resolved from the advertiser name (LinkedIn serves public company data only at slug URLs, not the numeric id, which sits behind a login wall), and resolve for **roughly half** of advertisers. Specific names resolve well; a generic single-word brand can occasionally match a same-named company in another industry — **always verify `advertiserCompany.domain` before critical use**.
- **No fabrication.** Missing fields are omitted, never invented — an unresolved advertiser simply has no `advertiserCompany`.
- **Coverage is broad, not exhaustive** for very popular topics — bounded by `maxAdsPerKeyword`, not silently truncated at LinkedIn's ~24-per-query page.

No fill-rate percentages are claimed here beyond the approximate resolution rate above; the numbers you get are whatever the public Ad Library returns for your query.

### Pricing

**Pay per result** — you're billed per record returned (per advertiser in the default rollup, or per ad in flat mode). Name-based enrichment caches one company-page lookup per advertiser, so it doesn't multiply cost. There's an Apify **free tier** to evaluate the full feature set before you scale, and no third-party proxy bill on top when you use Apify Residential proxy.

### FAQ

**What does one record represent?** By default, one **advertiser** rolled up for a keyword (deduped, ranked by `adCount`). Switch **Output shape → Ads** for one record per individual ad.

**How do you find "who's advertising"?** By searching the **public** LinkedIn Ad Library for your keyword and fanning out across date and country facets, then deduping ad ids and grouping by advertiser. No login, no cookies.

**How accurate are the firmographics?** They're best-effort, resolved from the advertiser's name, and land for roughly half of advertisers. Treat them as a qualification bonus and confirm the match via `advertiserCompany.domain`. The discovery data itself is exact.

**Why do some advertisers have no company or domain?** Because the name couldn't be confidently resolved to a public company page — we omit the firmographics rather than attach a wrong guess.

**Do I need a LinkedIn login, cookies or account?** No. The Actor only reads the public Ad Library and public company pages.

**Can I get the individual ads instead of the rollup?** Yes — set **Output shape → Ads** for a flat, one-row-per-ad feed with `adUrl`, `body` and `format`.

**Do I get impressions, spend, run dates or targeting?** Not in this Actor — those are per-ad EU/DSA details. Use the companion **LinkedIn Ad Tracker**, which tracks a *known* company's ads in depth (run dates, impressions, targeting). This Actor is for **discovery**: keyword → advertisers.

**Why do I need a Residential proxy?** LinkedIn rate-limits and blocks datacenter and un-proxied traffic; Residential (the default) is what keeps runs succeeding.

**How many advertisers can I get per keyword?** As many as appear within `maxAdsPerKeyword` (1–1000) ads scanned — raise it to surface more of a busy topic.

**What export formats are available?** JSON, CSV, Excel, or via the Apify API and integrations.

### Troubleshooting

- **0 or very few advertisers** → the keyword is too niche or misspelled, or the cap is low. Try a broader term and raise `maxAdsPerKeyword`.
- **Firmographics missing for many advertisers** → expected; resolution is best-effort (~half) and worse for generic single-word brands. Keep `enrichAdvertiser` on, and verify each match via `advertiserCompany.domain`.
- **A resolved company looks wrong** → name resolution can collide on generic brand names. Always check `advertiserCompany.domain` before acting on a record; the discovery fields (`advertiserName`, `adCount`, samples) remain exact.
- **Run is slow or getting rate-limited** → enrichment adds a company-page fetch per unique advertiser. Lower `maxAdsPerKeyword`, turn off `enrichAdvertiser`, and make sure a **Residential** proxy is selected.

### Notes, limits & legal (honest)

- **Public data only.** This Actor reads the **public** LinkedIn Ad Library and public company pages — no login, no cookies, nothing gated or private.
- **LinkedIn ToS is your responsibility.** LinkedIn provides no official public Ad Library API; this reads publicly served pages. You are responsible for using the output in line with LinkedIn's Terms of Service and applicable law (including GDPR/CCPA where relevant). Use it for legitimate market research and B2B intelligence.
- **Firmographics are best-effort (~half of advertisers)** and name-resolved — verify via `domain`. The discovery data (who advertises, ad count, formats, sample copy) is read directly and is exact.
- **No per-ad dates, impressions or targeting here.** Those live on the companion **LinkedIn Ad Tracker** (which tracks a known company's ads in depth). This Actor is discovery: keyword → advertisers.
- **Coverage is broad, not exhaustive** for very popular topics — raise `maxAdsPerKeyword` to scan deeper. What's dropped is bounded by your cap, not silently cut at LinkedIn's ~24-per-query page.
- **Not affiliated** with, endorsed by, or sponsored by LinkedIn Corporation. "LinkedIn" is a trademark of LinkedIn Corporation.

### Support

Questions, a field you'd like added, or a custom build? Open the **Issues** tab on this Actor, or email **info@foxlabs.com.tr**. We reply fast.

*If this Actor saves you time, a ⭐ review really helps.*

### Changelog

#### 0.2 — 2026-07-05

- Reworked docs to the foXLabs gold standard: API quick-start, full field table (advertiser rollup + Ads mode), real sample output, JS/Python/Make/n8n/Zapier/MCP integrations, FAQ, troubleshooting and honest legal notes.
- *(Engine, shipped in 0.2)* Advertisers are read straight from the ad-library search pages (~2× faster than fetching every ad's detail page); higher enrichment concurrency; multiple slug spellings per advertiser. Per-ad dates, impressions and targeting live on the companion **LinkedIn Ad Tracker**.

#### 0.1

- Initial release. Keyword → date × country facet fan-out → advertiser rollup (ad count, sample creatives, format mix) with best-effort firmographic enrichment and provenance. Cookieless, no login.

***

Part of the **[foXLabs data platform](https://data.foxlabs.com.tr/)** — public-data company, contact, jobs, ads, procurement & AI-search intelligence scrapers. Browse the full suite at **[data.foxlabs.com.tr](https://data.foxlabs.com.tr/)**. Companion actor: **LinkedIn Ad Tracker** — track a *known* company's ads (creative, run dates, EU/DSA impressions & targeting) in depth.

# Actor input Schema

## `keywords` (type: `array`):

Topics to discover advertisers for — e.g. "CRM", "cybersecurity", "developer tools". One advertiser rollup is returned per company found advertising on the topic.

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

"Advertisers" rolls results up to one record per unique advertiser (recommended). "Ads" returns one record per individual ad.

## `maxAdsPerKeyword` (type: `integer`):

How many ads to scan per keyword before rolling up (1–1000). More ads = more advertisers discovered.

## `enrichAdvertiser` (type: `boolean`):

Attach each discovered advertiser's real firmographics (domain, industry, employee count, HQ, followers). Best-effort resolution from the advertiser name — verify via the returned domain.

## `proxyConfiguration` (type: `object`):

Proxy configuration. Residential proxy (the default) is strongly recommended — LinkedIn rate-limits and blocks un-proxied and datacenter traffic.

## Actor input object example

```json
{
  "keywords": [
    "CRM",
    "cybersecurity"
  ],
  "output": "advertisers",
  "maxAdsPerKeyword": 120,
  "enrichAdvertiser": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "keywords": [
        "CRM",
        "cybersecurity"
    ],
    "maxAdsPerKeyword": 120,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/linkedin-ad-discovery").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 = {
    "keywords": [
        "CRM",
        "cybersecurity",
    ],
    "maxAdsPerKeyword": 120,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/linkedin-ad-discovery").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "CRM",
    "cybersecurity"
  ],
  "maxAdsPerKeyword": 120,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call foxlabs/linkedin-ad-discovery --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=foxlabs/linkedin-ad-discovery",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Ad Discovery — Who's Advertising on Any Topic",
        "description": "Discover who advertises on any topic on LinkedIn's public Ad Library. Keyword in → a deduped advertiser list with ad count, sample creatives, active window & formats — enriched with each advertiser's real firmographics (domain, industry, size). No login.",
        "version": "0.1",
        "x-build-id": "jKNdbbsGpeVm9L5AY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/foxlabs~linkedin-ad-discovery/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-foxlabs-linkedin-ad-discovery",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/foxlabs~linkedin-ad-discovery/runs": {
            "post": {
                "operationId": "runs-sync-foxlabs-linkedin-ad-discovery",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/foxlabs~linkedin-ad-discovery/run-sync": {
            "post": {
                "operationId": "run-sync-foxlabs-linkedin-ad-discovery",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "title": "Keywords / topics",
                        "type": "array",
                        "description": "Topics to discover advertisers for — e.g. \"CRM\", \"cybersecurity\", \"developer tools\". One advertiser rollup is returned per company found advertising on the topic.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "output": {
                        "title": "Output shape",
                        "enum": [
                            "advertisers",
                            "ads"
                        ],
                        "type": "string",
                        "description": "\"Advertisers\" rolls results up to one record per unique advertiser (recommended). \"Ads\" returns one record per individual ad.",
                        "default": "advertisers"
                    },
                    "maxAdsPerKeyword": {
                        "title": "Max ads per keyword",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "How many ads to scan per keyword before rolling up (1–1000). More ads = more advertisers discovered.",
                        "default": 120
                    },
                    "enrichAdvertiser": {
                        "title": "Enrich advertiser firmographics",
                        "type": "boolean",
                        "description": "Attach each discovered advertiser's real firmographics (domain, industry, employee count, HQ, followers). Best-effort resolution from the advertiser name — verify via the returned domain.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Proxy configuration. Residential proxy (the default) is strongly recommended — LinkedIn rate-limits and blocks un-proxied and datacenter traffic.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
