# Keyword Search Volume, Difficulty & Intent - Bulk, $4/1K (`liquify/keyword-search-volume`) Actor

Bulk Google search volume, CPC, competition, keyword difficulty (0x100) and search intent in one run. $0.004 per keyword. Keywords with no data are free. No subscription.

- **URL**: https://apify.com/liquify/keyword-search-volume.md
- **Developed by:** [Lyquify Crafts](https://apify.com/liquify) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 keyword with data

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

**Google search volume, CPC, keyword difficulty and search intent for thousands of keywords in one run, for $4 per 1,000.**
No subscription, no seat, no monthly quota. Paste a list, press Start, download a spreadsheet.
Keywords with no data, duplicates and invalid keywords are free.

### Example output

Every keyword comes back as one row like these (example output, US / English):

| Keyword | Monthly searches | CPC (USD) | Competition | Difficulty (0–100) | Intent | 12-month trend |
| --- | ---: | ---: | --- | ---: | --- | --- |
| running shoes | 301,000 | 1.09 | HIGH | 43 | transactional | 368k · 301k · 246k · 246k · 246k · 301k · 246k · 246k · 201k · 246k · 301k · 246k |
| project management software | 201,000 | 40.32 | LOW | 51 | commercial | 74k · 90k · 60k · 74k · 90k · 135k · 550k · 246k · 201k · 201k · 550k |
| golf rangefinder | 33,100 | 2.17 | HIGH | 18 | transactional | 40k · 60k · 49k · 18k · 18k · 22k · 22k · 22k · 27k · 27k · 18k |
| golf tips | 2,900 | 0.46 | LOW | 15 | informational | 2.4k · 3.6k · 3.6k · 5.4k · 3.6k · 3.6k · 2.9k · 1.9k · 1.6k · 1.6k · 1.6k · 2.4k |
| asdkjqweoiu nonsense | *no data* | | | | | *not charged* |

Export as CSV, Excel or JSON, or read the dataset from the API.

### What you get vs. typical volume Actors

| | This Actor | Typical "search volume" Actor |
| --- | :---: | :---: |
| Monthly search volume | ✅ | ✅ |
| CPC | ✅ | ✅ |
| Competition (level and 0–1 score) | ✅ | usually |
| Keyword difficulty (0–100) | ✅ included | ❌ or extra |
| Search intent (informational / navigational / commercial / transactional) | ✅ included | ❌ |
| 12-month trend per keyword | ✅ included | sometimes |
| Charged for keywords with no data | ❌ free | often |
| Keywords per run | up to 50,000 | varies |

Difficulty and intent are what turn a list of numbers into a plan: they tell you which keywords you can actually rank for and what kind of page to build.

### Pricing

Pay per event, no subscription:

| Event | Price |
| --- | --- |
| Keyword with data | **$0.004** ($4 per 1,000) |
| Run start | $0.005 |
| Google Ads batch (up to 1,000 keywords), only on runs of 400+ keywords | $0.08 |
| Keywords with no data, duplicates, invalid keywords | free |

Worked examples:

| Run | Cost |
| --- | --- |
| 100 keywords | ≈ **$0.41** (start $0.005 + 100 × $0.004) |
| 1,000 keywords | ≈ **$4.09** (start $0.005 + 1,000 × $0.004 + one $0.08 batch) |
| 10,000 keywords | ≈ **$40.81** (start $0.005 + 10,000 × $0.004 + ten $0.08 batches) |

If some keywords have no data, you pay less. You can also set a maximum cost per run in the run options, and the Actor will process only as many keywords as that budget allows, batch fees included.

For comparison, a subscription SEO suite costs $100–$140 per month before you look up a single keyword. 1,000 keywords here is the price of a coffee.

### How to use it

1. Paste your keywords, one per line (the form comes prefilled with a few so you can press Start straight away).
2. Pick a location (`United States`, `United Kingdom`, `Germany`, …) and a language code (`en`, `de`, `es`, …).
3. Press **Start**. Small lists finish in seconds; a 1,000-keyword list in well under a minute.
4. Open the **Output** tab and export as CSV, Excel or JSON.

Works from the Apify API, schedules, integrations (Make, Zapier, n8n, Google Sheets) and AI agents through the Apify MCP server.

#### Example input

```json
{
  "keywords": ["running shoes", "best crm for small business", "how to start a podcast"],
  "locationName": "United States",
  "languageCode": "en",
  "includeMonthlyTrend": true
}
```

#### Google Sheets → this Actor → Google Sheets (n8n)

Keep a column of keywords in a sheet and have volume, difficulty and intent written back next to them. Three nodes:

1. **Google Sheets: read** the `keyword` column.
2. **HTTP Request** → `POST https://api.apify.com/v2/acts/liquify~keyword-search-volume/run-sync-get-dataset-items` with `{"keywords": [...]}` and your Apify token.
3. **Google Sheets: update** rows matched on `keyword` with `searchVolume`, `keywordDifficulty`, `searchIntent`, `cpcUsd`.

The same three steps work in Make and Zapier with their Apify modules.

### Output fields

| Field | Example | Meaning |
| --- | --- | --- |
| `keyword` | `running shoes` | The keyword, cleaned (lowercase, single spaces) |
| `searchVolume` | `301000` | Average monthly Google searches |
| `cpcUsd` | `1.09` | Average cost per click in Google Ads, USD |
| `competitionLevel` | `HIGH` | Google Ads competition: LOW, MEDIUM or HIGH |
| `competition` | `1` | Competition as a number from 0 to 1 |
| `keywordDifficulty` | `43` | How hard it is to rank organically, 0–100 |
| `searchIntent` | `transactional` | informational, navigational, commercial or transactional |
| `monthlySearches` | `[{ "year": 2026, "month": 9, "searchVolume": 368000 }, …]` | Month-by-month history, newest first: 12 months on lists of 400+, often several years on smaller lists (optional) |
| `location`, `language` | `United States`, `en` | What the numbers apply to |
| `source` | `google_ads` | Where the numbers came from (see FAQ) |
| `dataUpdatedAt` | `2026-10-18 15:02:03 +00:00` | When a cached figure was last refreshed; empty for live Google Ads data |

Keywords that can't be looked up come back with an `error` field and `"charged": false`.

### Use cases

**Content planning.** Paste every topic idea from a brainstorm, a competitor's sitemap or a keyword-ideas tool, then sort by difficulty ascending and volume descending. The top of that list is your next month of articles. Intent tells you whether each one wants a guide, a comparison or a product page.

**PPC budgeting.** CPC × expected clicks across a whole keyword set gives you a realistic monthly budget before you open Google Ads. Competition level shows where bids are already crowded.

**Prioritising by difficulty.** New sites can't rank for difficulty 70+. Filter to difficulty under 30 with volume over 500 and you have a list of keywords you can win now.

**Programmatic SEO and agencies.** Score 10,000 candidate pages or a client's full keyword universe in one run and keep the CSV. No per-seat licence, so the whole team can use the data.

**AI agents and automations.** Call it from n8n, Make, Zapier or an LLM agent through the Apify MCP server to enrich keywords on the fly.

### Limits

- Up to 50,000 keywords per run
- Up to 80 characters and 10 words per keyword
- Letters (any language), numbers, spaces and `' - . & + # /` are accepted. `? ! , "` are removed. Keywords with emojis or other symbols are rejected (free), because Google Ads refuses them.
- Search volume is Google's monthly average; very low-volume keywords may show 0 or no data

### FAQ

**Where does the data come from?** Google Ads keyword data via a licensed SEO data provider. No scraping of Google. Lists of 400 or more keywords (counted after removing duplicates and invalid keywords, and after your spending limit) are looked up directly in Google Ads (`source: google_ads`). Smaller lists come from the provider's database of Google Ads figures, which is refreshed about once a month (`source: dataforseo_labs`, with the refresh date in `dataUpdatedAt`). That keeps small runs fast and cheap.

**How is keyword difficulty calculated?** It is a 0–100 estimate of how hard it is to rank on page one organically, based on the authority of the pages currently ranking. It is comparable to the difficulty scores in mainstream SEO suites, but not identical to any one of them.

**How long does a run take?** Small lists take seconds. Lists of 400+ keywords are queued with Google Ads; in testing a 400-keyword run finished in about 10 seconds. Very large lists or busy periods can take a few minutes.

**Why did a keyword return no data?** Google doesn't report volume for every keyword and location. Those rows are not charged.

**Can I look up other countries and languages?** Yes. Use any Google Ads location name (`Germany`, `Canada`, `London,England,United Kingdom`) and a language code (`de`, `fr`, `es`, …).

**Is there a free trial?** Apify's free plan includes monthly credit you can spend on this Actor, so a few hundred keywords cost you nothing to try.

**Are any locations unavailable?** Yes. Data for sanctioned jurisdictions (including Russia, Belarus, Cuba, Iran, Syria, Myanmar, North Korea, and occupied regions of Ukraine) isn't available, and this Actor must not be used from them.

**Something looks wrong?** Open the **Issues** tab on this page. Reports are answered within a day.

***

Found it useful? A quick review helps a lot.

# Actor input Schema

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

Keywords to look up, one per line (up to 50,000 per run); duplicates, blanks and invalid keywords are removed and never charged.

## `locationName` (type: `string`):

Country or region the search volume applies to, as a plain name such as "United States", "United Kingdom", "Germany" or "London,England,United Kingdom".

## `languageCode` (type: `string`):

Two-letter language code for the searches, such as "en", "de", "es" or "fr".

## `includeMonthlyTrend` (type: `boolean`):

Add a monthlySearches array with the search volume for each of the last 12 months to every result, at no extra cost.

## `selfTest` (type: `boolean`):

Owner-only health check: runs three fixed keywords and fails the run if data is missing; leave this off.

## `selfTestRoute` (type: `string`):

Owner-only, used with selfTest: forces the supplier route to check, either "labs" or "google_ads".

## Actor input object example

```json
{
  "keywords": [
    "running shoes",
    "best crm for small business",
    "how to start a podcast",
    "coffee grinder",
    "project management software",
    "standing desk",
    "learn python online",
    "electric bike"
  ],
  "locationName": "United States",
  "languageCode": "en",
  "includeMonthlyTrend": true,
  "selfTest": false
}
```

# Actor output Schema

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

One row per keyword: search volume, CPC, competition, keyword difficulty, search intent and 12-month trend. Rows with an error field were not charged.

## `runSummary` (type: `string`):

Counts for the run: keywords requested, returned with data, no data, rejected and skipped by the spending limit.

# 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": [
        "running shoes",
        "best crm for small business",
        "how to start a podcast",
        "coffee grinder",
        "project management software",
        "standing desk",
        "learn python online",
        "electric bike"
    ],
    "locationName": "United States",
    "languageCode": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("liquify/keyword-search-volume").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": [
        "running shoes",
        "best crm for small business",
        "how to start a podcast",
        "coffee grinder",
        "project management software",
        "standing desk",
        "learn python online",
        "electric bike",
    ],
    "locationName": "United States",
    "languageCode": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("liquify/keyword-search-volume").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 '{
  "keywords": [
    "running shoes",
    "best crm for small business",
    "how to start a podcast",
    "coffee grinder",
    "project management software",
    "standing desk",
    "learn python online",
    "electric bike"
  ],
  "locationName": "United States",
  "languageCode": "en"
}' |
apify call liquify/keyword-search-volume --silent --output-dataset

```

## MCP server setup

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

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/wfhdHf2FnZO5czpWk/builds/BWUXd8L9htY2mHXyQ/openapi.json
