# Share of Search Tracker: Brand vs Competitors (Google Trends) (`alhadikhan/share-of-search`) Actor

Track your brand's share of search against every competitor. Share of search tracks market share and can lead it. Up to 100 brands on one Google Trends scale, by month, quarter or year, with the change since the last period. JSON plus a ready CSV table.

- **URL**: https://apify.com/alhadikhan/share-of-search.md
- **Developed by:** [MD. AL-HADI KHAN](https://apify.com/alhadikhan) (community)
- **Categories:** SEO tools, Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 brand results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Share of Search Tracker: your brand vs competitors

**Share of search** is your brand's share of all searches for the brands in your category. If people search for Toyota 30 times for every 100 searches across all car brands, Toyota's share of search is 30%.

Marketing effectiveness expert **Les Binet** presented it at the IPA's EffWorks Global in 2020. He found that share of search tracks market share in cars, energy and mobile phones, and that it can **move before market share does**. In mobile phones it led by about six months. Since then, brand teams and agencies have used it as a fast, cheap brand-health metric.

The problem is that Google Trends compares only **5 terms at a time**, and most categories have more than 5 brands. This Actor puts **up to 100 brands on one scale** and gives you share of search per month, quarter or year.

### Example: smartphone brands in Bangladesh (real run, last 5 years, by quarter)

| Rank | Brand | Share, Q3 2026 | Change vs Q2 | 5-year average |
|---|---|---|---|---|
| 1 | Samsung | 18.57% | −0.31 | 22.41% |
| 2 | Vivo | 15.43% | +0.73 | 15.66% |
| 3 | Apple | 10.07% | +1.71 | 4.87% |
| 4 | Realme | 10.02% | +0.06 | 15.29% |
| 5 | Oppo | 9.98% | −0.63 | 12.30% |
| 6 | Infinix | 8.98% | −0.50 | 6.64% |
| 7 | Honor | 7.51% | +0.42 | 2.98% |
| 8 | Tecno | 6.57% | −0.37 | 4.96% |
| 9 | Xiaomi | 5.96% | +0.25 | 4.57% |
| 10 | Walton | 3.85% | −1.52 | 4.97% |
| 11 | Symphony | 1.54% | −0.01 | 2.72% |
| 12 | Nokia | 1.52% | +0.17 | 2.64% |

12 brands, one run, about 40 seconds. Since late 2021, Apple has nearly tripled its share (3.6% → 10.1%), Honor has grown from almost nothing (0.6% → 7.5%), and Realme has fallen from its 2023 peak (19.5% → 10.0%).

### What you get

For every brand:

- **share of search in the latest finished period** (%), the **previous period**, and the **change in points**;
- **average share** over the whole time range;
- its **rank** in the latest period;
- the full **timeline** of shares per period;
- how it was measured (`matchedAs`) and a **precision label** (`high`, `medium`, `low`) for its underlying data.

You also get a **wide table (CSV)** with periods in rows and brands in columns, ready for a chart in Excel or Google Sheets. It's saved in the key-value store record `SHARES`.

The current period is still collecting data, so it's marked `partial` in the table and never used as "latest".

### Input

| Field | Example | Notes |
|---|---|---|
| Your brand and its competitors | `Samsung`, `Vivo`, `Jaguar (car make)` | 2 to 100 brands. `Name=/m/ID` pins a brand to an exact Google topic. |
| Market | `US`, `GB`, `BD` | Share of search is most meaningful per country. Empty means worldwide. |
| Time range | `today 5-y` | Also `today 12-m`, `all` (since 2004), or `2022-01-01 2026-10-31`. |
| Report share per | Month, Quarter, Year | Longer periods are steadier. |
| Category ID | `0` (default) | Optional. See "Should I use a category?" below. |
| Use Google topics instead of brand names | off (default) | See "Brand names or topics?" below. |

```json
{
  "brands": ["Samsung", "Xiaomi", "Realme", "Vivo", "Oppo", "Apple", "Infinix", "Tecno", "Walton", "Symphony", "Nokia", "Honor"],
  "geo": "BD",
  "timeframe": "today 5-y",
  "period": "quarter"
}
```

### Getting it right

#### Measure every brand the same way

Shares are only fair when every brand is measured the same way. By default, the Actor measures each brand's **plain name**, as Binet's original method does. If you switch on Google topics, the Actor uses a topic only when its name matches, its type is a business, and it's actually searched in your market. Otherwise it keeps the plain name, and **warns you when brands end up measured in different ways.** In our tests, Google's company topics for some brands captured only a fraction of their real searches, so mixing methods biased the result.

#### Should I use a category?

A category keeps only the searches Google files under it. Use it when a brand name is also a common word, like Apple, Jaguar or Shell. Be aware that **it can change shares a lot**, because Google files some brands' searches better than others'. Same brands, same market, same period:

| Brand | All searches | Category 390, Mobile Phones |
|---|---|---|
| Samsung | 18.57% | 57.92% |
| Realme | 10.02% | 2.75% |
| Oppo | 9.98% | 1.94% |
| Nokia | 1.52% | 6.49% |

Neither is "wrong", but they answer different questions. Pick one and keep it the same over time. Useful IDs: 390 Mobile Phones, 47 Autos & Vehicles, 5 Computers & Electronics, 37 Banking, 38 Insurance, 918 Fast Food, 68 Apparel.

#### Sub-brands

People often search a sub-brand instead of the company: "Redmi" rather than "Xiaomi", "Galaxy", "iPhone". Add sub-brands as separate entries in the **same run**. Shares from one run add up, so the Xiaomi family is Xiaomi + Redmi + Poco.

### FAQ

**Is the data genuine?**
Yes. Google sends automated tools decoy data in some panels (related queries), but not in the interest-over-time data this Actor uses. We checked it against the Google Trends website, value by value: 53 of 53 weeks identical (7 Nov 2026), and we repeat the check every month.

**How is share of search calculated?**
For each period, a brand's total search interest is divided by the total for all the brands you entered, times 100. The brands' shares in a period add up to 100%.

**Which brands should I include?**
All the main brands that buyers in your category consider. Leaving out a big competitor inflates everyone else's share. Keep the list the same between runs so trends stay comparable.

**Does share of search predict market share?**
Binet's research found it tracks market share and often moves first. He also warned that it isn't a perfect predictor (price and distribution matter too), and that not all searches are positive (a scandal raises searches). Use it as one signal among others.

**How does the one-scale part work?**
Brands are first sized against an anchor, then grouped with brands of similar size into batches of up to 5. Neighbouring batches share one brand that links their scales, and everything is rescaled together. Small brands don't get rounded to 0 next to market leaders. In tests on simulated Google data with a known true answer, no brand was lost and the worst error stayed under 1% when brand sizes spanned 1,000x.

**Can I compare keywords that aren't brands?**
Yes, but for general keyword comparison our **Google Trends Compare** Actor gives interest values instead of shares.

**Do I pay for failed runs?**
You're charged per brand in the results. If a run fails, no results are written and no brand charges apply.

### Limits

- Google Trends gives relative interest, not absolute search counts. Shares are exact ratios of that interest.
- Very small brands next to market leaders may get a `medium` or `low` precision label: their shares are rough.

# Actor input Schema

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

2 to 100 brand names in the same category. If a name is ambiguous, add the kind of business in brackets, for example 'Jaguar (car make)'. To pin a brand to an exact Google topic, write Name=ID, with the /m/... or /g/... ID copied from the Google Trends address bar.

## `geo` (type: `string`):

Two-letter country code (US, GB, DE, BD) or region code (US-CA). Share of search is most useful per market. Leave empty for worldwide.

## `timeframe` (type: `string`):

Same format as Google Trends: 'today 12-m', 'today 5-y', 'all' (since 2004), or a date range such as '2022-01-01 2026-10-31'.

## `period` (type: `string`):

Group the data into these periods before computing shares. Longer periods are steadier.

## `matchTopics` (type: `boolean`):

Off (recommended): every brand's plain name is measured, the classic share-of-search method. Use Category to cut out other meanings. On: a Google topic is used where one clearly fits. Brands measured in different ways can bias shares; the output warns you if that happens.

## `category` (type: `integer`):

Optional. Limits searches to one Google category, for brands whose name is also a common word (Apple, Jaguar, Shell). It can change shares a lot, because Google files some brands' searches into categories better than others'. Examples: 390 Mobile Phones, 47 Autos & Vehicles, 5 Computers & Electronics, 37 Banking, 38 Insurance, 918 Fast Food, 68 Apparel. 0 means all searches (the classic method).

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

Google rate-limits data-centre IPs hard. Residential proxies are strongly recommended.

## Actor input object example

```json
{
  "brands": [
    "Toyota",
    "Volkswagen",
    "Ford",
    "Honda",
    "Hyundai",
    "Tesla"
  ],
  "geo": "US",
  "timeframe": "today 5-y",
  "period": "month",
  "matchTopics": false,
  "category": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `table` (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 = {
    "brands": [
        "Toyota",
        "Volkswagen",
        "Ford",
        "Honda",
        "Hyundai",
        "Tesla"
    ],
    "geo": "US",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alhadikhan/share-of-search").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": [
        "Toyota",
        "Volkswagen",
        "Ford",
        "Honda",
        "Hyundai",
        "Tesla",
    ],
    "geo": "US",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("alhadikhan/share-of-search").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": [
    "Toyota",
    "Volkswagen",
    "Ford",
    "Honda",
    "Hyundai",
    "Tesla"
  ],
  "geo": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call alhadikhan/share-of-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alhadikhan/share-of-search"
        }
    }
}
```

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/jiLwu2IyeAMf7a4Sr/builds/05YAslQ24VxVskUMu/openapi.json
