درآمد هر صفحه
/sites/{siteId}/analytics/pages- Scope
analytics:read- ابزار MCP
analytics_pages
Conversions and revenue per landing page (GA4) with Search Console Sessions, key events, purchases and revenue per landing page from the website's connected GA4 property (read live with the Data API, then cached: 12 hours for settled ranges, an hour for recent ones), joined with the stored Search Console clicks, impressions, CTR and position of the same path and days, so content can be ranked by value. GA4 counts days in the property's time zone, Search Console in Pacific time.
توضیح ها از سند OpenAPI می آیند و انگلیسی اند.
پارامترها
| نام | محل | توضیح |
|---|---|---|
siteIdاجباری | path | stringWebsite id, from GET /sites. |
start | query | date (YYYY-MM-DD)First day, YYYY-MM-DD (from works too). Default: the 28 days ending 3 days ago (the last day of final Search Console data); with end alone, the 28 days ending there. At most 16 months. |
end | query | date (YYYY-MM-DD)Last day, YYYY-MM-DD (to works too), not in the future. When it is after the last final Search Console day, the answer has searchConsoleFinalThrough. |
channel | query | organicalldefault organicorganic: sessions whose default channel group is Organic Search; all: every channel. |
sort | query | sessions-sessionsrevenue-revenuepurchase_revenue-purchase_revenuepurchases-purchaseskey_events-key_eventsconversion_rate-conversion_raterevenue_per_session-revenue_per_sessionclicks-clicksimpressions-impressionsposition-positiondefault sessionsA leading - sorts high to low and wins over order (-revenue = sort=revenue&order=desc). |
order | query | ascdescDefault desc (asc for position). Rows without a value come last. |
limit | query | integerdefault 100, min 1, max 1000Rows per page, 1 to 1,000. |
offset | query | integerdefault 0, min 0, max 1000000Rows to skip. |
cursor | query | stringnextCursor from the previous page, unchanged (instead of offset). |
پاسخ
200 · application/json
| فیلد | توضیح |
|---|---|
period | object · required; The range read |
period.from | date (YYYY-MM-DD) · required; First day |
period.to | date (YYYY-MM-DD) · required; Last day |
channel | organic | all · required; organic: Organic Search sessions only; all: every channel |
property | string · required; GA4 property, as properties/<id> |
currency | string · required; Currency of revenue figures (ISO 4217) |
purchasesMetric | ecommercePurchases | transactions | · required; Which GA4 metric filled purchases; null when none |
outcomeEvents | list of string · required; Key events chosen as outcomes for this website |
totals | object · required; Sums over all pages, not only this page of rows |
totals.pages | integer · required; Landing pages |
totals.sessions | number · required; Sessions |
totals.keyEvents | number · required; Key events |
totals.purchases | number or null · required; Purchases; null without a purchase metric |
totals.revenue | number · required; Revenue in currency |
sort | sessions | revenue | purchase_revenue | purchases | key_events | conversion_rate | revenue_per_session | clicks | impressions | position · required; Sort field |
order | asc | desc · required; Sort direction |
offset | integer · required; Rows skipped |
limit | integer · required; Rows per page |
total | integer · required; Landing pages in all |
nextOffset | integer or null · required; offset of the next page; null after the last |
nextCursor | string or null · required; cursor of the next page; null after the last |
rows | list of values · required |
rows[].page | string |
rows[].url | string |
rows[].sessions | number |
rows[].engagedSessions | number |
rows[].engagementRate | number |
rows[].keyEvents | number |
rows[].keyEventsByName | list of objects |
rows[].keyEventsByName[].name | string |
rows[].keyEventsByName[].count | number |
rows[].conversionRate | number |
rows[].purchases | number |
rows[].purchaseRevenue | number |
rows[].revenue | number |
rows[].revenuePerSession | number |
rows[].clicks | number |
rows[].impressions | number |
rows[].ctr | number |
rows[].position | number |
searchConsole | joined | unavailable · required; Whether Search Console figures were joined |
cached | true or false · required; The GA4 answer came from the cache |
fetchedAt | string · required; When GA4 was read |
note | string · required; How the numbers are computed |
link | string · required; The Analytics screen in the app |
نکته ها
GET /sites/{siteId}/analytics/pages از پراپرتی Google Analytics (GA4) وصل شده سایت می خواند و آن را با اعداد Search Console که MonoRanks برای همان صفحه و همان روزها ذخیره کرده کنار هم می گذارد، تا بتوانید محتوا را بر اساس ارزش بازدیدهایش مرتب کنید. این endpoint به scope analytics:read نیاز دارد که از search:read جداست.
هر ردیف این ها را دارد: page (مسیر صفحه ورود، همان طور که GA4 گزارش می دهد)، url، sessions، engagedSessions، engagementRate، keyEvents، keyEventsByName، conversionRate (سهم نشست هایی که یک رویداد کلیدی دارند)، purchases، purchaseRevenue، revenue، revenuePerSession، و از Search Console مقدارهای clicks، impressions، ctr و position. کنار ردیف ها هم این ها می آیند: period، channel، property، currency، totals، total، nextOffset، nextCursor، searchConsole (joined یا unavailable)، cached و fetchedAt.
| مورد | توضیح |
|---|---|
channel |
organic (پیش فرض، نشست های Organic Search) یا all. |
sort |
sessions (پیش فرض)، revenue، purchase_revenue، purchases، key_events، conversion_rate، revenue_per_session، clicks، impressions یا position. یک - در ابتدا ترتیب را از زیاد به کم می کند (-revenue). order هم asc یا desc است. |
| دوره | start و end مثل موضوع ها، حداکثر 16 ماه. |
- پاسخ ها کش می شوند، پس صفحه بندی و مرتب سازی همان بازه دوباره از سهمیه GA4 کم نمی کند. وقتی 80٪ از سهمیه روزانه API پراپرتی مصرف شده باشد، MonoRanks دیگر از GA4 درخواست نمی کند تا ورود روزانه داده ها از کار نیفتد.
| مورد | توضیح |
|---|---|
| خطاها | 409 ga4_not_connected (در صفحه «بازدیدهای سایت»، Google Analytics را وصل کنید)، 409 ga4_no_access (Google اجازه دسترسی نمی دهد؛ دوباره با دسترسی خواندن وصل کنید)، 429 ga4_quota (سهمیه پراپرتی فعلاً تمام شده)، 502 ga4_unavailable (Google جواب نداد). |
خطاها
| کد | معنی |
|---|---|
400 | Bad request. Codes: bad_period, period_too_long, bad_channel, bad_limit, bad_sort, bad_order, bad_cursor, bad_paging, ga4_rejected. |
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. |
409 | Conflict with the current state. Codes: ga4_not_connected, ga4_no_access. |
429 | A limit is reached. rate_limited: too many requests this hour for this key. Codes: rate_limited, ga4_quota. |
502 | An outside service did not answer. Codes: ga4_unavailable. |
نمونه درخواست
curl \
-H "Authorization: Bearer mr_ws_…" \
"https://app.monoranks.com/api/v1/sites/SITE_ID/analytics/pages"const res = await fetch("https://app.monoranks.com/api/v1/sites/SITE_ID/analytics/pages", {
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/analytics/pages",
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/analytics/pages");
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/analytics/pages", { headers: { Authorization: "Bearer mr_ws_…" } });نمونه پاسخ
{
"period": {
"from": "2026-09-06",
"to": "2026-10-03"
},
"channel": "organic",
"property": "properties/348811",
"currency": "USD",
"purchasesMetric": "ecommercePurchases",
"outcomeEvents": [
"purchase",
"generate_lead"
],
"totals": {
"pages": 214,
"sessions": 6120,
"keyEvents": 188,
"purchases": 74,
"revenue": 61240.5
},
"sort": "revenue",
"order": "desc",
"offset": 0,
"limit": 2,
"total": 214,
"nextOffset": 2,
"nextCursor": "WyJnYTRwYWdlcyIsMiwicmV2ZW51ZSIsImRlc2MiXQ",
"rows": [
{
"page": "/bikes/gravel",
"url": "https://acmebikes.com/bikes/gravel",
"sessions": 820,
"engagedSessions": 590,
"engagementRate": 0.7195,
"keyEvents": 41,
"keyEventsByName": [
{
"name": "purchase",
"count": 22
},
{
"name": "generate_lead",
"count": 19
}
],
"conversionRate": 0.0488,
"purchases": 22,
"purchaseRevenue": 28930,
"revenue": 28930,
"revenuePerSession": 35.2805,
"clicks": 655,
"impressions": 18120,
"ctr": 0.036148,
"position": 9.1
},
{
"page": "/guides/how-to-choose-a-gravel-bike",
"url": "https://acmebikes.com/guides/how-to-choose-a-gravel-bike",
"sessions": 1104,
"engagedSessions": 801,
"engagementRate": 0.7255,
"keyEvents": 12,
"keyEventsByName": [
{
"name": "purchase",
"count": 6
}
],
"conversionRate": 0.0109,
"purchases": 6,
"purchaseRevenue": 7410,
"revenue": 7410,
"revenuePerSession": 6.712,
"clicks": 912,
"impressions": 24300,
"ctr": 0.037531,
"position": 6.8
}
],
"searchConsole": "joined",
"cached": true,
"fetchedAt": "2026-10-06T07:55:12.000Z",
"note": "GA4 figures per landing page (path), read live from the GA4 property and cached; …",
"link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/analytics"
}{
"error": {
"code": "bad_period",
"message": "end cannot be in the future."
}
}{
"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": "ga4_not_connected",
"message": "Google Analytics (GA4) is not connected for this website. Connect it on the website's Analytics screen."
}
}{
"error": {
"code": "rate_limited",
"message": "More than 1200 requests this hour for this key."
}
}{
"error": {
"code": "ga4_unavailable",
"message": "Google Analytics did not answer. Try again in a minute."
}
}سرور MCP همین کار را با ابزار analytics_pages انجام می دهد.