# SERP Intent Mapper: Keyword Search Intent Classifier (`cygnix_labs/serp-intent-mapper`) Actor

Classify keywords by search intent (informational, commercial, transactional, navigational, local) and get the page type Google rewards, clusters and priority. First 100 keywords free, then $0.50 per 1,000 ($0.0005/keyword). No API key, no proxies, no Google scrape.

- **URL**: https://apify.com/cygnix_labs/serp-intent-mapper.md
- **Developed by:** [Umair Saleem Mohammad Saleem](https://apify.com/cygnix_labs) (community)
- **Categories:** SEO tools, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 keyword classifieds

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

## SERP Intent Mapper: Keyword Search Intent Classifier

**Answer first:** this actor is a **search intent classifier** for keyword lists. It labels every keyword as **informational, commercial, transactional or navigational** (plus a local flag), names the **page type** Google usually rewards for it (guide, best-X list, comparison, pricing/service page, local landing page), and adds a topic cluster and a priority score. **First 100 keywords free every run, then $0.0005 per keyword ($0.50 per 1,000).** It does not scrape Google, so it is fast and cheap for triage before you buy SERP data.

| Quick facts | |
|---|---|
| Best for | Keyword intent classification, choosing page types, splitting SEO and PPC lists, content planning |
| Input | A keyword list, or a pasted Ahrefs / Semrush / GSC / Keyword Planner CSV |
| Output | One row per keyword: `intent`, `confidence`, `local`, `pageType`, `cluster`, `modifiers`, `priority` |
| Price | First 100 keywords free every run, then $0.0005 per keyword. No start fee. Duplicates never charged |
| Needs | No API keys, no proxies, no Google scraping |
| Not included | Search volume, CPC or live SERP data (it reads volume only if your CSV has it) |

### Who it's for

SEO agencies, content teams, PPC managers and AI agents (Claude, ChatGPT and Cursor through the Apify MCP server) that need to sort a keyword list before writing content or building pages.

### What you get (per keyword)

| Field | Example |
|---|---|
| keyword | best crm for small business |
| intent | commercial |
| confidence | high / mixed / low |
| local | false |
| pageType | comparison, 'best X' list or review page |
| cluster | business crm |
| modifiers | \["best"] |
| volume | 1900 (if you pasted it) |
| priority | 109 |

The SUMMARY record in the key-value store gives counts per intent (`total`, `byIntent`).

### Sample output (5 keywords)

Input: `best crm for small business`, `how to choose a crm`, `hubspot login`, `crm pricing`, `crm software near me`

| keyword | intent | confidence | pageType |
|---|---|---|---|
| crm pricing | transactional | high | service/product or pricing page |
| crm software near me | transactional | mixed | local landing / service-area page |
| best crm for small business | commercial | high | comparison, 'best X' list or review page |
| how to choose a crm | informational | high | guide / how-to / FAQ article |
| hubspot login | navigational | high | brand, login or support page |

### Pricing (pay per event)

**First 100 unique keywords in every run are free**, then **$0.50 per 1,000** ($0.0005 per `keyword-classified`). No start fee. Set a max charge per run and the actor stops cleanly at your limit.

| Unique keywords in one run | You pay |
|---|---|
| 100 | **Free** |
| 1,000 | $0.45 |
| 5,000 | $2.45 |
| 10,000 | $4.95 |
| 50,000 | $24.95 |

Duplicate keywords (after lower-casing and trimming) are removed before charging — you are never billed twice for the same string in one run.

### How to use

1. Paste keywords (one per line), or paste an Ahrefs, Semrush, GSC or Keyword Planner CSV. Keyword and volume columns are detected automatically.
2. Optional: add your brand names (navigational) and cities (local intent).
3. Run, then export as CSV, Excel or JSON, or call it via API/MCP.

### Input example (JSON API / MCP)

```json
{
  "keywords": [
    "best crm for small business",
    "how to choose a crm",
    "hubspot login",
    "crm pricing",
    "crm software near me"
  ],
  "brands": ["hubspot", "salesforce"],
  "locations": ["near me", "new york"]
}
```

Or set `csvText` to a pasted Ahrefs/Semrush/GSC export; `keyword`/`query` and `volume` columns are detected automatically. You only need keywords **or** csvText (both are optional in the schema, but the run fails if neither yields keywords).

### Use cases

Plan site architecture, choose page formats before writing, find wrong-format pages that will never rank, split PPC keyword lists by intent, and feed AI agents a clean intent map.

### How it compares (live Apify Store prices, verified 18 Oct 2026)

List prices on the Apify Free plan, read from the Apify Store API on 18 October 2026.

| Actor | Price | Cost for 1,000 keywords | What it does |
|---|---|---|---|
| **cygnix_labs/serp-intent-mapper** (this) | **$0.0005 / keyword, first 100 free, no start fee** | **$0.45** | Rule-based intent + page type + cluster + priority, no Google fetch |
| mostafa-ennadi/google-keyword-scraper-volume-cpc-intent | $0.001 / result + tiny start fee | ~$1.00 | Google keyword data: volume, CPC and intent |
| trovevault/ai-serp-intent-extractor---search-intent-classifier | $0.0015 / result + $0.001 start | ~$1.50 | Scrapes the live SERP, then classifies |
| saliga/keyword-research | $0.002 / keyword + $0.02 / lookup | ~$2.00+ | Keyword ideas, difficulty and intent |
| s-r/google-keywords | $0.003 / keyword | ~$3.00 | Google keyword research: volume, CPC, intent (595 users) |
| happitap/keyword-intent-classifier | $0.005 / result + $0.25 start | ~$5.25 | Keyword intent classifier |

**Honest take.** The tools above that cost more also bring **live Google data** (volume, CPC or SERP results); this one does not. Use this actor to **triage a full list cheaply** (intent + page type for 10,000 keywords costs under $5), then buy SERP or volume data only for the shortlist.

### For AI agents / MCP

**When an agent should call this actor:** the user has a list of keywords and asks what search intent each one has, which page type to build, or how to split a list into informational / commercial / transactional groups.

Connect the Apify MCP server with only this actor enabled (works in Claude, ChatGPT, Cursor, VS Code, Codex and any MCP client):

```
https://mcp.apify.com?tools=cygnix_labs/serp-intent-mapper
```

Or search for it with the default server: `search-actors` keywords such as `search intent`, `keyword intent`, `intent classifier`.

Example `call-actor` input:

```json
{
  "keywords": ["best crm for small business", "how to choose a crm", "hubspot login", "crm pricing"],
  "brands": ["hubspot"],
  "locations": ["near me"]
}
```

**What to read from the result:** each row has `keyword`, `intent`, `confidence` (high / mixed / low), `local`, `pageType`, `cluster` and `priority`. `SUMMARY` in the key-value store gives counts per intent.

**Cost control for agents:** Lists of 100 keywords or fewer are free. Pass `maxTotalChargeUsd` in `callOptions` to hard-cap spend. This actor is pay-per-event, so it also works with Apify agentic payments (no Apify account needed for the agent).

Example prompt: *"Classify these 500 keywords by search intent and tell me which ones need a comparison page vs a guide."*

### FAQ

**Does it scrape Google?** No. It is a **rule-based** search intent classifier (modifier lists for buy/price, best/vs, how/what, login, near me, plus your brand and city lists). No SERP fetch, no proxies, no API key — runs stay fast and cheap.

**What intents are supported?** informational, commercial, transactional and navigational, plus a `local` flag that combines with any of them ("near me", "nearby", "local" or a city you list). Keywords with no clear signal come back as `unclear`.

**When is confidence low or mixed?** `low` = labelled `unclear` (no clear modifier). `mixed` = more than one intent signal family hit the same query. Re-check both against the live SERP before locking page type.

**Are duplicates charged?** Exact duplicate keywords (after normalization) are skipped once, so you are not charged twice for the same string in one run.

**Spend cap?** Set a max charge per run in Apify; the actor stops when the pay-per-event limit is reached and still writes the SUMMARY record for what it classified.

**English only?** Modifier lists are English-tuned today. Other languages may need manual review.

**How do AI agents use it?** Export CSV/JSON or call via Apify MCP (`cygnix_labs/serp-intent-mapper`) and ask Claude/ChatGPT/Cursor to build an IA or content plan from the intent + pageType columns.

**How accurate is rule-based intent?** It is reliable for keywords with a clear modifier ("best", "vs", "price", "how", "login", "near me"). Keywords without one come back as `unclear` with `low` confidence instead of a forced guess, so you know which ones to check against the live SERP.

### Accuracy note

Intent comes from rule-based query modifiers (for example "best", "vs", "price", "near me", "how", "login") plus your brand and city lists. It does **not** look at the live SERP. Keywords with no clear modifier are labelled `unclear` with `low` confidence, and keywords that mix signals are marked `mixed`; check both against the live SERP before locking a page type. That honesty is intentional — better a clear `unclear` than a forced guess.

### Integrations

Run via the Apify API, schedule weekly runs, or send results to Google Sheets, Make, Zapier, n8n, Slack or webhooks.

### Changelog

- **0.1.12** (2026-10-18): README rewritten answer-first for search and AI agents: quick facts, comparison re-verified against 5 named actors on 18 Oct 2026, "For AI agents / MCP" section, accuracy FAQ. Price unchanged ($0.0005/keyword, first 100 free).
- **0.1.8** (2026-10-16): Buyer search terms in H1, named Store comps, FAQ on rule-based / unclear / mixed.

### More SEO and AEO tools by Cygnix Labs

- [Website SEO Audit + AEO/GEO Checker (full-site crawl)](https://apify.com/cygnix_labs/site-seo-aeo-audit)
- [AEO & GEO Audit + llms.txt Checker (URL list)](https://apify.com/cygnix_labs/aeo-readiness-checker)
- [Internal Link Audit & Orphan Page Finder](https://apify.com/cygnix_labs/internal-link-audit)
- [Content Decay Audit (Search Console)](https://apify.com/cygnix_labs/content-decay-audit)
- [Keyword Cannibalization Checker (Search Console)](https://apify.com/cygnix_labs/keyword-cannibalization-finder)
- [Keyword Clustering + Content Briefs](https://apify.com/cygnix_labs/keyword-clusterer-brief)
- Free local SEO MCP server: [cygnix-seo-mcp](https://github.com/cygnixlabs-cmd/cygnix-seo-mcp) (`npx -y cygnix-seo-mcp`)

Questions or a feature request? Open an issue on this actor's Issues tab. We answer within 24 hours.

# Actor input Schema

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

One keyword per line (up to 50,000). Paste from Ahrefs, Semrush, GSC or Google Keyword Planner.

## `csvText` (type: `string`):

Optional. Columns keyword/query and volume are auto-detected.

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

Brand names that mark a query as navigational.

## `locations` (type: `array`):

Places that mark a query as local.

## Actor input object example

```json
{
  "keywords": [
    "best crm for small business",
    "how to choose a crm",
    "hubspot login",
    "crm pricing",
    "crm software near me"
  ]
}
```

# Actor output Schema

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

No description

## `summary` (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": [
        "best crm for small business",
        "how to choose a crm",
        "hubspot login",
        "crm pricing",
        "crm software near me"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cygnix_labs/serp-intent-mapper").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": [
        "best crm for small business",
        "how to choose a crm",
        "hubspot login",
        "crm pricing",
        "crm software near me",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cygnix_labs/serp-intent-mapper").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": [
    "best crm for small business",
    "how to choose a crm",
    "hubspot login",
    "crm pricing",
    "crm software near me"
  ]
}' |
apify call cygnix_labs/serp-intent-mapper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cygnix_labs/serp-intent-mapper"
        }
    }
}
```

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/9GqtbnqEtNbUG6g6l/builds/3tzMm8QCITrwbTaK2/openapi.json
