# Brand Coverage Tracker: News Share of Voice (`precious_bathmat/brand-coverage-tracker`) Actor

Compare how much news coverage your brand and its competitors get: share of voice, which outlets write about whom, a day by day timeline and the headlines behind every number. Reads Google News in 15 country editions. Built for PR, comms and marketing teams.

- **URL**: https://apify.com/precious\_bathmat/brand-coverage-tracker.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Marketing, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Brand Coverage Tracker: News Share of Voice

**Who is getting written about, where, and how that is moving.** Enter your brand and its competitors and get share of voice, the outlets behind every number, a day by day timeline and the headlines themselves.

Reads Google News in 15 country editions. No API key, no account, no proxy.

### What does this do?

Other news scrapers hand you a pile of articles. A communications team does not need a pile of articles; it needs the answer to "are we winning coverage against our competitors, and who is writing about them instead of us?"

This Actor runs one search per brand, checks each headline really is about that brand, then reports the comparison.

```mermaid
flowchart LR
    A[Your brand +<br/>competitors] --> B[Google News,<br/>one search per brand]
    B --> C[Headline check:<br/>is this really them?]
    C --> D[Share of voice, outlets,<br/>timeline, headlines]
```

### Who is it for?

| You are | You use it to |
|---|---|
| **PR and comms teams** | Report share of voice against competitors, every week, with the headlines to back it |
| **PR agencies** | Show a prospect how little coverage they get next to rivals, then show the improvement |
| **Marketing and brand managers** | See which publications cover your category and which ones only cover a competitor |
| **Founders and investors** | Track whether a company's news presence is growing or fading |
| **Analysts and researchers** | Measure media attention by brand, outlet and market over time |

### What data do you get?

One row per brand:

| Field | Meaning |
|---|---|
| `brand`, `articles`, `sharePercent` | The brand and its share of all coverage in this comparison |
| `outletCount`, `topOutlets` | How many publications wrote about it, and which wrote most |
| `exclusiveOutlets`, `exclusiveOutletCount` | Outlets covering **only** this brand and none of its rivals |
| `timeline` | Articles per day across the window |
| `busiestDay`, `busiestDayArticles` | The day it made the most news |
| `averageArticlesPerDay`, `firstArticleAt`, `lastArticleAt` | Pace and range of coverage |
| `topHeadlines` | The 10 newest headlines with outlet, date and link |
| `businessContextPercent`, `nameLooksAmbiguous`, `ambiguityWarning` | Whether the name is really being read as a brand (see below) |
| `headlinesDroppedAsIrrelevant` | Loose matches the headline check removed |

Turn on **Also return every article as a row** for a second table of every article behind the numbers.

### The generic name problem, and what this Actor does about it

Google News matches loosely. Search for a design tool called **Sketch** and you get fashion sketches, comedy sketches and police sketches — and a share of voice that looks respectable and means nothing.

So every brand gets a second search, restricted to business-shaped coverage, and the two are compared. From a real run in September 2026:

| Brand | Articles | Share of voice | Business context | Verdict |
|---|---|---|---|---|
| Figma | 95 | 33.5% | 59% | fine |
| Sketch | 88 | 31.0% | **24%** | **flagged as too generic** |
| Canva | 87 | 30.6% | 76% | fine |
| Adobe Express | 14 | 4.9% | 71% | fine |

Sketch's 31% is not real coverage, and the Actor says so in the row rather than letting you put it in a report. Fix it with a **context word** (`design`) or **exclude terms**, and run again.

### Example: Figma vs Canva vs Adobe Express

Same run, 30 day window, US edition. Figma led on volume, but Canva reached more publications (47 outlets to Figma's 41) and had 40 outlets that covered it and no rival. Adobe Express, despite the biggest parent company, took under 5% of the conversation.

### How to use it

1. Add your **brands**, one per line: your own first, then competitors.
2. If a name is an ordinary word, add a **context word** such as `software` or `bank`.
3. Pick a **time window** and the **news market** you care about.
4. Run it, then export to CSV, Excel or JSON, or chart the `timeline` field.

Run it on a schedule with the same brands to watch share of voice move week by week.

### Popular comparisons

Ready to run examples, each one a real media comparison:

- [Figma vs Canva vs Adobe Express: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/figma-vs-canva-vs-adobe-express)
- [Slack vs Microsoft Teams vs Zoom: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/slack-vs-microsoft-teams-vs-zoom)
- [Shopify vs WooCommerce vs BigCommerce: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/shopify-vs-woocommerce-vs-bigcommerce)
- [Stripe vs PayPal vs Adyen: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/stripe-vs-paypal-vs-adyen)
- [OpenAI vs Anthropic vs Google Gemini: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/openai-vs-anthropic-vs-google-gemini)
- [Tesla vs Rivian vs Lucid: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/tesla-vs-rivian-vs-lucid)
- [Nike vs Adidas vs Puma: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/nike-vs-adidas-vs-puma)
- [Netflix vs Disney+ vs HBO Max: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/netflix-vs-disney-plus-vs-hbo-max)
- [Uber vs Lyft vs DoorDash: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/uber-vs-lyft-vs-doordash)
- [Coinbase vs Binance vs Kraken: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/coinbase-vs-binance-vs-kraken)
- [Revolut vs Monzo vs Starling: UK News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/revolut-vs-monzo-vs-starling)
- [Airbnb vs Booking.com vs Expedia: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/airbnb-vs-booking-vs-expedia)
- [Spotify vs Apple Music vs YouTube Music: Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/spotify-vs-apple-music-vs-youtube-music)
- [Samsung vs iPhone vs Google Pixel: News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/samsung-vs-iphone-vs-google-pixel)
- [Zomato vs Swiggy: India News Coverage](https://apify.com/precious_bathmat/brand-coverage-tracker/examples/zomato-vs-swiggy)

### Pricing

Pay per result: **$0.02 per brand report**, plus **$0.0002 per article row** ($0.20 per 1,000) only if you ask for the article table. A four-brand comparison costs about 8 cents.

### Where the data comes from

The public **Google News RSS search**, in 15 country and language editions. Coverage counts are of articles Google News indexed in the window you choose, which is what every media monitoring tool measures.

### FAQ

**Do I need a key or a Google account?**
No. The feed is public.

**How many articles per brand?**
Google News returns at most 100 per search, so that is the cap. For a busy brand, use a shorter window to see recent coverage more precisely.

**Is sentiment included?**
No. Honest sentiment scoring needs a language model, which would mean an API key and a setup step, so this Actor does not pretend to do it. You get volume, outlets, timing and the headlines, and can read the headlines yourself.

**Why do two brands sometimes share an outlet count but not the same outlets?**
`exclusiveOutlets` shows exactly that: the publications covering one brand and none of the others in your comparison. It is usually the most actionable column, because it is your pitch list.

**Does it read the full article text?**
No, it reads the headline, outlet, date and link from the feed. That keeps it fast, free of proxies, and it is what coverage counting needs.

# Actor input Schema

## `brands` (type: `array`):

The names to track, one per line. Add your own brand and its competitors to get share of voice between them.

## `context` (type: `string`):

Added to every search with AND, to pin down brands whose name is an ordinary word. For a company called Linear, use "software" and the results stop being about linear algebra.

## `excludeTerms` (type: `array`):

Articles containing these words are excluded from the search, for example a celebrity or a city that shares the brand name.

## `timeWindowDays` (type: `string`):

How far back to look.

## `market` (type: `string`):

Which country and language edition of Google News to read. Coverage differs a lot by market.

## `requireBrandInHeadline` (type: `boolean`):

Keeps the numbers honest by dropping loose matches. Turn it off to count every article the search returns.

## `exactPhrase` (type: `boolean`):

Searches "General Motors" as a phrase rather than the two words separately.

## `checkNameAmbiguity` (type: `boolean`):

Runs a second search per brand to see how much of the coverage reads like business news. A name such as "Sketch" or "Height" gets flagged so you do not report a share of voice built from unrelated articles.

## `maxArticlesPerBrand` (type: `integer`):

Google News returns at most 100 articles per search, which is the cap here too.

## `includeArticles` (type: `boolean`):

Adds a second table with one row per article: headline, outlet, date and link.

## Actor input object example

```json
{
  "brands": [
    "Notion",
    "Coda",
    "Airtable"
  ],
  "context": "software",
  "excludeTerms": [
    "recipe",
    "football"
  ],
  "timeWindowDays": "30",
  "market": "US",
  "requireBrandInHeadline": true,
  "exactPhrase": true,
  "checkNameAmbiguity": true,
  "maxArticlesPerBrand": 100,
  "includeArticles": false
}
```

# Actor output Schema

## `coverage` (type: `string`):

Share of voice, outlets, timeline and headlines for each brand.

## `articles` (type: `string`):

Every article behind the numbers, when that option is on.

## `summary` (type: `string`):

Articles per brand and what the accuracy filter removed.

# 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 = {
    "brands": [
        "Figma",
        "Canva",
        "Adobe Express"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/brand-coverage-tracker").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 = { "brands": [
        "Figma",
        "Canva",
        "Adobe Express",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/brand-coverage-tracker").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 '{
  "brands": [
    "Figma",
    "Canva",
    "Adobe Express"
  ]
}' |
apify call precious_bathmat/brand-coverage-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/brand-coverage-tracker"
        }
    }
}
```

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/K17FAWwSTxc4kjfGU/builds/LAQwykgCUtmvyUJmL/openapi.json
