# Keyword Rank Tracker — AccuRanker Alternative (`khadinakbar/accuranker-alternative`) Actor

Track Google organic keyword ranks for a target domain. Export positions, matching URLs, SERP evidence, and search context; supply baseline ranks to calculate movement against an earlier snapshot.

- **URL**: https://apify.com/khadinakbar/accuranker-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 rank movement report rows

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Keyword Rank Tracker — AccuRanker Alternative

Track Google organic keyword ranks for a target domain. Export positions, matching URLs, SERP evidence, and search context; supply baseline ranks to calculate movement against an earlier snapshot. For SEO reporting teams, each dataset row is one keyword observation with its current rank and any valid baseline comparison.

### Workflow: put the results to work

Set the target domain, keyword list, country, language, and device. Supply baseline ranks when you need movement labels, then compare observations under the same settings. The Actor creates bounded snapshots; historical coverage depends on the observations you retain.

### Best fit

Use this Actor when an SEO analyst, agency automation, or AI workflow needs a current, machine-readable Google rank snapshot that can be scheduled and exported through Apify. It is especially useful for a small-to-medium keyword list where explicit cost limits and raw SERP provenance matter.

Choose a full rank-tracking suite when you need retained historical dashboards, team permissions, recurring report design, Share of Voice, forecasting, or AI-search monitoring. For Google Maps grid or city-level rank analysis, use a dedicated local-rank workflow instead.

### How this AccuRanker alternative workflow compares

This independent Actor is **not affiliated with, associated with, or endorsed by AccuRanker**. The comparison is limited to the bounded Google-rank snapshot workflow documented here.

| Decision area | This Actor | AccuRanker |
|---|---|---|
| Scope | Current Google rank rows with optional caller-supplied movement comparison | Broader hosted dashboard and reporting suite |
| Billing | Per persisted report row, plus Apify platform usage | Published monthly plan pricing |
| Effective efficiency | One bounded API or scheduled execution produces export-ready rows | Better suited to continuous dashboard operations |
| Input and output | Domain + keywords in, documented dataset rows out | Account-based hosted workflow and dashboards |
| Integrations | Apify API, datasets, and schedules | Hosted-suite integrations |
| Automation | Explicit Apify schedule and run inputs | Automatic refreshes inside the product |
| Freshness and provenance | Row-level timestamp, Google results URL, and provider run ID | Automatically refreshed hosted data |

This is not a claim that either product is universally better. Choose this Actor when the input/output workflow above is sufficient; choose AccuRanker when you need its retained history, collaboration, white-label reporting, Share of Voice, forecasts, or AI products.

### How it works

1. The Actor validates and deduplicates the provided keywords, then applies `maxKeywords`.
2. It calls Apify's maintained Google Search Results Scraper once for the bounded batch, using your country, language, device, and depth settings.
3. It finds the target domain in each returned organic result set. A domain absent within the requested depth is a valid row, not an error.
4. When `baselineRanks` is supplied, it classifies each row as `IMPROVED`, `DECLINED`, `UNCHANGED`, `NEW`, `LOST`, or `NOT_RANKING`.
5. It writes one complete, validated row per successful keyword plus `OUTPUT` and `RUN_SUMMARY` terminal records.

### Input

```json
{
  "targetDomain": "apify.com",
  "keywords": ["web scraping platform", "data extraction tools"],
  "countryCode": "us",
  "languageCode": "en",
  "device": "desktop",
  "depth": 10,
  "maxKeywords": 25,
  "baselineRanks": [
    {
      "keyword": "web scraping platform",
      "found": true,
      "targetRank": 6,
      "checkedAt": "prior-check-timestamp"
    }
  ]
}
```

Use the same country, language, device, and depth whenever you compare a trend line. `baselineRanks` is caller-supplied; the Actor deliberately does not claim to retain your ranking history.

### Output

The `rank_movement` dataset view contains the report fields. `serp_evidence` retains the selected target result, compact top results, Google check URL, and provider run ID.

```json
{
  "keyword": "web scraping platform",
  "targetDomain": "apify.com",
  "found": true,
  "targetRank": 3,
  "rankingUrl": "https://apify.com/",
  "previousRank": 6,
  "rankChange": 3,
  "movement": "IMPROVED",
  "countryCode": "us",
  "languageCode": "en",
  "device": "desktop",
  "depth": 10,
  "checkUrl": "https://www.google.com/search?q=web+scraping+platform",
  "checkedAt": "collection-timestamp",
  "provider": "apify/google-search-scraper",
  "providerRunId": "exampleRunId"
}
```

### Terminal outcomes

- `COMPLETE`: every selected keyword produced a persisted row.
- `PARTIAL`: useful rows persisted but a provider or storage issue affected another keyword, or the execution spending cap stopped more rows.
- `VALID_EMPTY`: every completed SERP check lacked the target domain inside the selected depth.
- `INVALID_INPUT`: fix the supplied domain, keywords, locale, device, or depth; this ends successfully with guidance.
- `UPSTREAM_FAILED`: the provider could not return usable data and no rank row was persisted.
- `CONFIG_ERROR`: reserved for a required configuration fault with no useful output.

### API and agent prompt

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~accuranker-alternative/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"targetDomain":"apify.com","keywords":["web scraping platform"],"countryCode":"us","languageCode":"en","device":"desktop","depth":10}'
```

> Check `apify.com` for these keywords in US English desktop Google results at depth 10. Return the current rank, movement versus my supplied baseline, ranking URL, evidence URL, timestamp, and report any `OUTPUT` warnings. Do not use this Actor for persistent dashboard history, Share of Voice, or AI-visibility analysis.

For an AI agent or MCP workflow, read the dataset after the run and inspect `OUTPUT`. An `INVALID_INPUT` outcome means the request can be fixed without retrying the provider; `PARTIAL` means some rows are useful but a warning needs review; `UPSTREAM_FAILED` means no usable provider rows were persisted and a later retry is appropriate. The Actor does not paginate beyond the selected depth.

### Limits and recovery

- Limit each run to one hundred selected keywords and a depth of 10 or 20. This bounds both cost and provider work.
- Google results can vary by country, language, device, timing, and SERP layout. Keep these controls fixed across a comparison.
- If `PARTIAL` occurs, use the persisted rows and retry only the affected keyword set after reviewing `RUN_SUMMARY`.
- If `UPSTREAM_FAILED` occurs, wait briefly and retry the bounded run. Do not treat an empty provider run as proof that the domain does not rank.

### Freshness and methodology

The primary provider contract and price calculation are recorded in `PROVIDER_PRICING.json`; use the current [Google Search Results Scraper input and pricing surface](https://apify.com/apify/google-search-scraper/input-schema) before making a spending decision. Each result row carries a timestamp, Google result URL, and provider run ID so a surprising position can be reviewed at its source.

### Builder's note

I designed this Actor around one durable unit of work: a validated, persisted rank row with enough source context to review a surprising movement. The current Google provider is intentionally used as a focused standalone workflow, keeping the Actor free of external credential setup while preserving an explicit input-to-evidence path.

### Responsible use

Use this Actor only to collect data you are authorized to access and in accordance with applicable laws, Google’s terms of service, and your organization’s policies. Rank rows are measurement evidence, not legal, traffic, revenue, or ranking guarantees.

### Responsible interpretation

Every row is an observed Google SERP snapshot, not a promise of future rank, traffic, or conversion. A `found: false` row means the domain was absent within the selected returned depth and context. Keep the same country, language, device, and depth across comparisons. Review `checkUrl`, `checkedAt`, and `providerRunId` before acting on an unexpected movement.

### Pricing and run costs

This Actor uses **Pay per event plus Apify platform usage**. The [Pricing tab](https://apify.com/khadinakbar/accuranker-alternative/pricing) lists the current event rates and billing terms.

| Event | Billing unit | When it applies |
|---|---|---|
| `apify-actor-start` | Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| `rank-movement-report` | Rank movement report row | One complete persisted Google rank and movement report row. |

Run cost combines the charged events and Apify platform usage. Review the run charge limit and requested result count before starting.

### Connect an AI agent

Use the [Apify MCP configurator](https://mcp.apify.com) to choose an available client connection. Inspect this Actor’s current input schema and required credentials before running it.

# Actor input Schema

## `targetDomain` (type: `string`):

Domain to find in Google organic results, for example apify.com. A full URL is accepted and normalized to its hostname, and subdomains count as matches. This is not a Google Business Profile or a competitor list.

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

Google searches to check, one phrase per item, for example 'web scraping platform'. Duplicate and blank entries are removed. The Actor accepts at most 100 selected keywords and does not discover new keywords.

## `countryCode` (type: `string`):

Two-letter Google country code, such as us, gb, or de. Defaults to us and determines the country context for every requested SERP. It is not a city-level location setting.

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

Google interface language code such as en, de, or fr. Defaults to en and is recorded on every output row. It does not translate the keyword.

## `device` (type: `string`):

Google result device profile. Choose desktop or mobile; rankings can differ between these contexts. This is not an operating-system selector.

## `depth` (type: `integer`):

Number of organic result positions to inspect per keyword. Use 10 for page one or 20 for a bounded page-two check; each additional page increases underlying platform usage. This is not an unlimited rank crawl.

## `maxKeywords` (type: `integer`):

Safety limit after blank and duplicate keyword removal. Defaults to 25 and caps the report at 100 rows so event charges remain predictable. It does not add keywords beyond the supplied list.

## `baselineRanks` (type: `array`):

Optional prior rows keyed by keyword for movement labels. Each item needs a keyword, found boolean, targetRank when found, and optional checkedAt timestamp. Leave empty for a current-snapshot-only run; this Actor does not retain or read your prior account history.

## Actor input object example

```json
{
  "targetDomain": "apify.com",
  "keywords": [
    "web scraping platform",
    "data extraction tools"
  ],
  "countryCode": "us",
  "languageCode": "en",
  "device": "desktop",
  "depth": 10,
  "maxKeywords": 10,
  "baselineRanks": [
    {
      "keyword": "web scraping platform",
      "found": true,
      "targetRank": 6,
      "checkedAt": "2026-09-01T00:00:00.000Z"
    }
  ]
}
```

# Actor output Schema

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

One validated current-rank row per successfully processed keyword.

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

Outcome, row count, charges, and warnings.

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

Provider, input, persistence, and billing diagnostics.

# 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 = {
    "targetDomain": "apify.com",
    "keywords": [
        "web scraping platform",
        "data extraction tools"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/accuranker-alternative").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 = {
    "targetDomain": "apify.com",
    "keywords": [
        "web scraping platform",
        "data extraction tools",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/accuranker-alternative").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 '{
  "targetDomain": "apify.com",
  "keywords": [
    "web scraping platform",
    "data extraction tools"
  ]
}' |
apify call khadinakbar/accuranker-alternative --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/accuranker-alternative"
        }
    }
}
```

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/thqRu7mlLxN42wO8b/builds/8SG833z0aJey3jjKS/openapi.json
