فهرست کلمات کلیدی
GET
/sites/{siteId}/keywords- Scope
search:read- ابزار MCP
keywords
Keywords with demand, positions and opportunity The website's keywords as the Keywords screen lists them (off-topic suggestions hidden, except in view offtopic). position is the daily Google check (the top 20; once a week the top 100) for tracked keywords, else the Search Console 28-day average. volume, difficulty and cpc are monthly estimates. Also accepted in snake_case (min_volume for minVolume).
توضیح ها از سند OpenAPI می آیند و انگلیسی اند.
پارامترها
| نام | محل | توضیح |
|---|---|---|
siteIdاجباری | path | stringWebsite id, from GET /sites. |
view | query | alltrackedopportunitiesrisingpositionsnotrankingbrandedofftopicdefault alltracked: starred; opportunities: improve and new; rising: demand up 20% over the last 3 months; positions: 4–15; notranking; branded; offtopic: hidden as off topic. |
q | query | stringat most 100 charactersPart of the keyword. |
sort | query | volumepositiondifficultycpcchangekeywordopportunityDefault: position for view tracked, else volume. opportunity: by opportunityScore, as the Opportunity column on the Keywords screen. |
dir | query | ascdescDefault asc for position and difficulty, else desc (opportunity too). Rows without a value come last. |
opportunity | query | defendimprovenewOnly this opportunity. |
source | query | search_consolediscovermanualcompetitorOnly keywords from this source. |
intent | query | informationalcommercialnavigationaltransactionalOnly this search intent. |
minVolume | query | integermin 0, max 10000000Only keywords with at least this many monthly searches. Also accepted in snake_case (min_volume for minVolume). |
page | query | integerdefault 1, min 1Page number, from 1. |
per | query | integerdefault 50, min 1, max 200Rows per page, 1 to 200. |
پاسخ
200 · application/json
| فیلد | توضیح |
|---|---|
view | all | tracked | opportunities | rising | positions | notranking | branded | offtopic · required; The view listed |
filters | object · required; The filters applied to the rows |
filters.q | string or null · required; Search |
filters.intent | informational | commercial | navigational | transactional | · required; Intent filter |
filters.minVolume | integer or null · required; Minimum monthly searches |
filters.opportunity | defend | improve | new | · required; Opportunity filter |
filters.source | search_console | discover | manual | competitor | · required; Source filter |
counts | object · required; The tabs and tiles of the Keywords screen for the whole list, before q and the filters |
counts.all | integer · required; All keywords (tab All) |
counts.tracked | integer · required; Tracked daily |
counts.opportunities | integer · required; improve and new |
counts.rising | integer · required; Demand up 20% over the last 3 months |
counts.positions | integer · required; Position 4–15 |
counts.notranking | integer · required; Not ranking |
counts.branded | integer · required; Containing the brand |
counts.offtopic | integer · required; Hidden as off topic |
counts.top10 | integer · required; In the top 10 (tile) |
counts.opportunity | object · required; Keywords per opportunity label |
counts.opportunity.new | integer · required; Opportunity new |
counts.opportunity.improve | integer · required; Opportunity improve |
counts.opportunity.defend | integer · required; Opportunity defend |
location | object · required; Where the website's keyword data and daily checks are from |
location.locationCode | integer · required; Google location id |
location.location | string · required; The location by name |
location.languageCode | string · required; Language code |
location.device | mobile | desktop · required; The device of the daily Google check |
total | integer · required; Rows that match, over all pages |
page | integer · required; This page, from 1 |
per | integer · required; Rows per page |
hasMore | true or false · required; More rows after this page |
keywords | list of values · required |
keywords[].id | string |
keywords[].keyword | string |
keywords[].source | string |
keywords[].branded | true or false |
keywords[].cluster | string |
keywords[].intent | string |
keywords[].locationCode | number |
keywords[].location | string |
keywords[].languageCode | string |
keywords[].device | string |
keywords[].volume | number |
keywords[].difficulty | number |
keywords[].cpc | number |
keywords[].competition | number |
keywords[].monthly | list of numbers |
keywords[].dataUpdatedAt | string |
keywords[].position | number |
keywords[].positionFrom | string |
keywords[].gscPosition | number |
keywords[].gscClicks | number |
keywords[].gscImpressions | number |
keywords[].gscUrl | string |
keywords[].tracked | true or false |
keywords[].latestPosition | number |
keywords[].latestUrl | string |
keywords[].latestDate | string |
keywords[].deepPosition | number |
keywords[].deepDate | string |
keywords[].weekAgoPosition | number |
keywords[].bestPosition | number |
keywords[].features | list of strings |
keywords[].opportunity | string |
keywords[].opportunityScore | number |
keywords[].relevance | number |
keywords[].relevanceStatus | string |
keywords[].offTopic | true or false |
keywords[].topic | string |
keywords[].relevanceReason | string |
keywords[].relevanceIntent | string |
keywords[].action | object |
keywords[].action.id | string |
keywords[].action.status | string |
keywords[].action.link | string |
note | string · required; How to read the numbers |
link | address (URL) · required; The Keywords screen in the app |
خطاها
| کد | معنی |
|---|---|
400 | Bad request. Codes: bad_view, bad_sort, bad_dir, bad_opportunity, bad_intent, bad_source, bad_minVolume, bad_page, bad_per. |
401 | Missing, unknown or revoked key. Codes: missing_key, invalid_key. |
403 | The key lacks the scope, covers another website, or its owner lost access. Codes: missing_scope, other_site, owner_left, no_owner, forbidden. |
404 | Not found. Codes: not_found. |
429 | Too many requests this hour for this key. Codes: rate_limited. |
نمونه درخواست
curl \
-H "Authorization: Bearer mr_ws_…" \
"https://app.monoranks.com/api/v1/sites/SITE_ID/keywords"const res = await fetch("https://app.monoranks.com/api/v1/sites/SITE_ID/keywords", {
headers: { Authorization: "Bearer mr_ws_…" },
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import requests
res = requests.get(
"https://app.monoranks.com/api/v1/sites/SITE_ID/keywords",
headers={"Authorization": "Bearer mr_ws_…"},
)
res.raise_for_status()
data = res.json()<?php
$ch = curl_init("https://app.monoranks.com/api/v1/sites/SITE_ID/keywords");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ["Authorization: Bearer mr_ws_…"],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import axios from "axios";
const { data } = await axios.get("https://app.monoranks.com/api/v1/sites/SITE_ID/keywords", { headers: { Authorization: "Bearer mr_ws_…" } });نمونه پاسخ
{
"view": "all",
"filters": {
"q": null,
"intent": null,
"minVolume": null,
"opportunity": null,
"source": null
},
"counts": {
"all": 1240,
"tracked": 48,
"opportunities": 212,
"rising": 31,
"positions": 160,
"notranking": 702,
"branded": 12,
"offtopic": 9,
"top10": 188,
"opportunity": {
"new": 141,
"improve": 71,
"defend": 54
}
},
"location": {
"locationCode": 2840,
"location": "United States",
"languageCode": "en",
"device": "mobile"
},
"total": 1240,
"page": 1,
"per": 50,
"hasMore": true,
"keywords": [
{
"id": "2d4f6b8d-0f2b-4d4f-9b6d-0f2b4d6f8b0d",
"keyword": "gravel bike tires",
"source": "search_console",
"branded": false,
"cluster": "gravel tires",
"intent": "commercial",
"locationCode": 2840,
"location": "United States",
"languageCode": "en",
"device": "mobile",
"volume": 2900,
"difficulty": 34,
"cpc": 1.12,
"competition": 0.81,
"monthly": [
2400,
2400,
2900,
2900,
3600,
3600,
3600,
2900,
2900,
2400,
2400,
2900
],
"dataUpdatedAt": "2026-10-01T04:12:00.000Z",
"position": 6,
"positionFrom": "tracked",
"gscPosition": 7.4,
"gscClicks": 118,
"gscImpressions": 3240,
"gscUrl": "https://acmebikes.com/tires/gravel/",
"tracked": true,
"latestPosition": 6,
"latestUrl": "https://acmebikes.com/tires/gravel/",
"latestDate": "2026-10-05",
"deepPosition": 6,
"deepDate": "2026-10-05",
"weekAgoPosition": 8,
"bestPosition": 5,
"features": [
"people_also_ask",
"images"
],
"opportunity": "improve",
"opportunityScore": 42.7,
"relevance": 92,
"relevanceStatus": "reviewed",
"offTopic": false,
"topic": "Tires",
"relevanceReason": "Acme Bikes sells gravel tires on this page.",
"relevanceIntent": "commercial",
"action": {
"id": "b2e4c6a8-1d3f-4a5b-9c7d-0e2f4a6b8c1d",
"status": "open",
"link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/actions/b2e4c6a8-1d3f-4a5b-9c7d-0e2f4a6b8c1d"
}
}
],
"note": "position: yesterday's Google check for tracked keywords, else the Search Console 28-day average.",
"link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/keywords"
}{
"error": {
"code": "bad_view",
"message": "view must be one of all, tracked, opportunities, rising, positions, notranking, branded, offtopic."
}
}{
"error": {
"code": "missing_key",
"message": "Send the key as Authorization: Bearer mr_site_…"
}
}{
"error": {
"code": "missing_scope",
"message": "This key does not have the scope this call needs."
}
}{
"error": {
"code": "not_found",
"message": "Website not found."
}
}{
"error": {
"code": "rate_limited",
"message": "More than 1200 requests this hour for this key."
}
}سرور MCP همین کار را با ابزار keywords انجام می دهد.