Keyword Rank Check
Find a domain in the top Google results for a keyword, scanning 10 results by default and up to 100. Lower-ranked domains can be missed.
keyword-rank-check Example
{
"domain": "wikipedia.org",
"keyword": "wikipedia",
"country": "us",
"language": "en"
} {
"url": "https://en.wikipedia.org/wiki/Main_Page",
"page": 1,
"found": true,
"title": "Wikipedia, the free encyclopedia",
"domain": "wikipedia.org",
"country": "us",
"keyword": "wikipedia",
"snippet": "Wikipedia is a free online encyclopedia, created and edited by volunteers around the world.",
"language": "en",
"position": 1,
"results_scanned": 10,
"competitors_above": [],
"scan_depth_requested": 10
} Inputs
| Field | Type | Required | What it is |
|---|---|---|---|
depth | integer | No | Number of results to scan (Serper "num" parameter). Defaults to 10, max 100. |
domain | string | Yes | Domain to check ranking for (e.g. stripe.com). Aliases: url, site. |
country | string | No | Market to check the ranking in, as an ISO 3166-1 alpha-2 code (SE), alpha-3 code (SWE), numeric code (752), or exact country name (Sweden). "UK" is accepted as an alias for GB. Unrecognised values are rejected before the search runs rather than silently ignored. Sent to Google as the gl parameter. Defaults to "us". |
keyword | string | Yes | Search term to check ranking for. Aliases: query, search, term. |
language | string | No | Language for results, as an ISO 639-1 code ("en"), optionally with a region ("pt-BR"). Validated for shape and rejected before the search runs if malformed, rather than silently ignored. Sent to Google as the hl parameter. Defaults to "en". |
Output fields
How reliably each field appears in a successful answer.
| Field | Type | Appears |
|---|---|---|
page | integer or null | Usually (present for most inputs) |
found | boolean | Always (present in every successful answer) |
position | integer or null | Usually (present for most inputs) |
competitors_above | array | Always (present in every successful answer) |
unresolved_positions | array | Always (present in every successful answer) |
breadcrumb_derived_positions | array | Always (present in every successful answer) |
domain | — | Always (present in every successful answer) |
keyword | — | Always (present in every successful answer) |
country | — | Always (present in every successful answer) |
language | — | Always (present in every successful answer) |
results_scanned | — | Always (present in every successful answer) |
scan_depth_requested | — | Always (present in every successful answer) |
url | — | Usually (present for most inputs) |
title | — | Usually (present for most inputs) |
snippet | — | Usually (present for most inputs) |
How to call it
The same tool through each route. MCP clients reach it through Strale’s server at https://api.strale.io/mcp; the call below is what the agent sends.
# Needs an API key. max_price_cents caps what this call may cost.
curl -X POST https://api.strale.io/v1/do \
-H "Authorization: Bearer $STRALE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"capability_slug": "keyword-rank-check",
"inputs": {
"domain": "wikipedia.org",
"keyword": "wikipedia",
"country": "us",
"language": "en"
},
"max_price_cents": 15
}' {
"tool": "strale_execute",
"arguments": {
"slug": "keyword-rank-check",
"inputs": {
"domain": "wikipedia.org",
"keyword": "wikipedia",
"country": "us",
"language": "en"
},
"max_price_cents": 15
}
} import { Strale } from "straleio";
const strale = new Strale({ apiKey: process.env.STRALE_API_KEY! });
const result = await strale.do({
capability_slug: "keyword-rank-check",
inputs: {
"domain": "wikipedia.org",
"keyword": "wikipedia",
"country": "us",
"language": "en"
},
max_price_cents: 15,
}); import os
from straleio import Strale, DoRequest
strale = Strale(api_key=os.environ["STRALE_API_KEY"])
result = strale.do(DoRequest(
capability_slug="keyword-rank-check",
inputs={
"domain": "wikipedia.org",
"keyword": "wikipedia",
"country": "us",
"language": "en",
},
max_price_cents=15,
)) # No account. The first request answers 402 with the price in USDC;
# an x402 client pays it from your wallet and repeats the request.
curl -i -X POST https://api.strale.io/x402/v2/keyword-rank-check \
-H 'Content-Type: application/json' \
-d '{
"domain": "wikipedia.org",
"keyword": "wikipedia",
"country": "us",
"language": "en"
}' Limitations
Point-in-time sample, not an average
Each call captures one Google results snapshot, and rankings vary with algorithm changes, time and personalisation absent from the API request. Repeat checks over time to assess trends rather than treating one result as a stable ranking.
What to do instead: Call periodically (e.g. daily/weekly) and track position over time rather than relying on a single result.
Location is approximated by country/language, not exact geo
Serper's gl/hl parameters approximate a country-level search context. They do not reproduce city-level local pack results or a specific searcher's true location, device, or personalisation/history, which can shift real-world rankings the caller sees.
Scan depth is bounded and explicit
Only the top `depth` results are searched, with a default of 10 and maximum of 100. A lower-ranked domain returns `found` false and `position` null, which does not mean it has no ranking.
What to do instead: Increase the depth parameter (up to 100) if the domain is expected to rank beyond position 10.
Related tools
- Backlink Check €0.15
- Cookie Scan €0.15
- Domain Age Check €0.03
- Page Speed Test €0.05
- Website Carbon Estimate €0.05