REST API
یک base URL، یک bearer key، ورودی و خروجی JSON. هر چیزی که اپ برای یک سایت نشان میدهد، از اینجا هم در دسترس است.
Base URL و احراز هویت
https://app.monoranks.com/api/v1
Authorization: Bearer mr_ws_… (or mr_site_…)
توضیح ماشینخوان همه endpointها و eventهای webhook: https://app.monoranks.com/api/v1/openapi.json (OpenAPI 3.1). این آدرس را در Postman، Insomnia، Bruno یا یک ابزار تولید کلاینت وارد کنید.
کلید فضای کاری (workspace key) را در اپ از مسیر Settings → API and MCP → New credential بسازید. این کلید یا به همه سایتها دسترسی دارد یا فقط به سایتهایی که تیک میزنید. کلید سایت (mr_site_…) وقتی ساخته میشود که افزونه WordPress یا اپ Shopify وصل شود و فقط به همان یک سایت دسترسی دارد. هر کلید فقط یک بار نمایش داده میشود. جزئیات را در کلیدهای API و scopeها ببینید.
Endpointها
همه مسیرهای زیر بعد از base URL میآیند.
سایتها و امتیازها
| متد و مسیر | خروجی | Scope |
|---|---|---|
GET /sites |
سایتهایی که این کلید به آنها دسترسی خواندن دارد، با id هرکدام | sites:read |
GET /portfolio |
همه سایتهای این کلید در یک درخواست، مثل لیست Websites: امتیازها، تغییرشان نسبت به بررسی قبلی و هفته قبل، مشکلهای باز، اکشنهای منتظر، آخرین بررسی، بررسی بعدی و کلیکهای Search Console (با search:read) |
sites:read |
GET /sites |
خلاصه سایت: امتیازها، آخرین بررسی، مشکلهای باز، دسترسی WordPress و اینکه داده هر اتصال چقدر تازه است | sites:read |
GET /sites |
امتیاز فعلی و تاریخچه 13 هفته، همراه با نسخه امتیاز | sites:read |
GET /sites |
سرعت هر صفحهای که تست شده: نتیجه تست آزمایشگاهی کنار داده بازدیدکنندههای واقعی Chrome، و اینکه هر یافته سرعت بر اساس کدامیک است | sites:read |
مشکلها و اکشنها
| متد و مسیر | خروجی | Scope |
|---|---|---|
GET /sites |
مشکلها، همان لیست صفحه Issues (پیشفرض: باز، دوبارهباز، در حال انجام، در صف بررسی دوباره؛ status= لیستی جداشده با کاما میگیرد) |
issues:read |
GET /sites |
یک مشکل، با صفحههای درگیر، شواهد، توضیح هوش مصنوعی، مقدارهای جدید پیشنهادی و آخرین تغییر تأییدشده | issues:read |
POST /sites |
بررسی دوباره را در صف میگذارد؛ مشکل فقط وقتی حلشده حساب میشود که بررسی دوباره دیگر پیدایش نکند | issues:recheck |
GET /sites |
اکشنها به ترتیب اولویت، با افزایش تخمینی امتیاز و مدتی که هرکدام باز مانده (limit، پیشفرض 25، حداکثر 100) |
issues:read |
POST /sites |
عنوان سئو، توضیحات متا، canonical یا noindex جدید را تأیید میکند و از طریق اتصال WordPress روی سایت مینویسد | actions:apply |
صفحهها
| متد و مسیر | خروجی | Scope |
|---|---|---|
GET /sites |
صفحههایی که کراول شدهاند (q برای جستوجو، page، per تا 200) |
pages:read |
GET /sites |
مشخصات صفحه، امتیازها و یافتهها | pages:read |
GET /sites |
همان، ولی با آدرس صفحه | pages:read |
Search Console
| متد و مسیر | خروجی | Scope |
|---|---|---|
GET /sites |
جمع 7، 28 یا 90 روز (days=) در مقایسه با دوره قبل، بههمراه صفحهها و عبارتهای جستوجوی برتر |
search:read |
GET /sites |
ردیفهای یک بازه تاریخ، به تفکیک عبارت جستوجو، صفحه، عبارت و صفحه با هم، یا روز؛ صفحهبندیشده، یا با format=csv در قالب یک فایل CSV |
search:read |
دیدهشدن و آمادگی برای هوش مصنوعی
| متد و مسیر | خروجی | Scope |
|---|---|---|
GET /sites |
دستیارهای هوش مصنوعی هر هفته به سؤالهایی که برای سایت دنبال میکنید چه جوابی دادهاند | ai:read |
GET /sites |
سؤالهایی که در جواب هوش مصنوعی اسم سایتهای دیگر میآید، ولی اسم این سایت هیچوقت نمیآید | ai:read |
GET /sites |
دسترسی خزندههای هوش مصنوعی در robots.txt، وضعیت llms.txt و سیگنالهای هویت برند از آخرین بررسی | ai:read |
GET /sites |
فایل /llms.txt فعلی سایت که همین لحظه خوانده میشود، بههمراه یک پیشنویس آماده انتشار که از صفحههای شما ساخته شده |
ai:read |
POST /sites |
یک /llms.txt جدید را تأیید میکند و از طریق اتصال WordPress روی سایت مینویسد |
actions:apply |
GET /sites |
robots.txt فعلی، که همین لحظه خوانده میشود، به هر خزنده هوش مصنوعی چه میگوید، و آخرین قوانینی که MonoRanks نوشته | ai:read |
POST /sites |
قوانین allow یا deny را برای هر خزنده هوش مصنوعی تأیید میکند و در robots.txt مینویسد | actions:apply |
GET /sites |
نتیجههای Agentic browsing (آیا یک ایجنت هوش مصنوعی میتواند با صفحه کار کند)، برای هر صفحه تستشده و هر دستگاه، با کارهایی که باید درست کنید | ai:read |
POST /sites |
تست Agentic browsing را برای یک صفحه دوباره اجرا میکند؛ پاسخ 202 با یک job id است |
issues:recheck |
GET /sites |
وضعیت و نتیجه یک اجرای دوباره | ai:read |
بررسیها
| متد و مسیر | خروجی | Scope |
|---|---|---|
GET /sites |
آخرین بررسیها، بررسیای که الان در حال اجراست، بررسی هفتگی بعدی، سقف صفحهها و تعداد شروعهایی که امروز باقی مانده | sites:read |
POST /sites |
همین حالا یک بررسی کامل شروع میکند، با pageBudget اختیاری؛ پاسخ 202 با یک audit id است |
audits:run |
GET /sites |
یک بررسی: وضعیت، تعداد صفحههایی که تا الان کراول شده، پوشش نقشه سایت، و اگر زودتر تمام شده، دلیلش | sites:read |
عمومی، بدون کلید
| متد و مسیر | خروجی |
|---|---|
GET /openapi.json |
سند OpenAPI 3.1 برای همه endpointهای بالا |
GET /plans |
پلنها و قیمتها |
GET /changelog |
یادداشتهای انتشار به فرمت Markdown |
صفحهبندی
صفحهبندی هر لیست کمی فرق دارد و جزئیاتش در سند OpenAPI هست:
GET /portfolio،GET /sites/{siteId}/pagesوGET /sites/{siteId}/agenticپارامترهایpage(از 1) وper(پیشفرض 50، حداکثر 200) را میگیرند.GET /sites/{siteId}/search/rowsمقدارnextCursorرا برمیگرداند؛ آن را بهعنوانcursorدوباره بفرستید تا وقتیnullشود.limitبین 1 تا 10,000 است (پیشفرض 1,000).- پیشنهادهای هر مشکل 100 تا 100 تا برمیگردند؛ پایینتر توضیح دادهایم.
GET /sites/{siteId}/actionsپارامترlimitمیگیرد؛GET /sites/{siteId}/auditsهمlimitمیگیرد (پیشفرض 5، حداکثر 25).
مقدارهای پیشنهادی برای یک مشکل
برای مشکلهایی که MonoRanks میتواند اصلاحشان کند (عنوان سئو، توضیحات متا، canonical یا ریدایرکت)، GET /sites/{siteId}/issues/{issueId} فیلد suggestions را هم برمیگرداند: برای هر صفحه درگیر، مقدار فعلی و مقداری که MonoRanks پیشنهاد میکند. اینها همان مقدارهایی هستند که اپ قبل از زدن Apply نشان میدهد.
"suggestions": [
{ "url": "https://example.com/pricing/", "pageId": "…", "current": "Pricing", "suggested": "Pricing | Example", "writable": true }
],
"suggestionsTotal": 240,
"suggestionsOffset": 0,
"suggestionsLimit": 100,
"suggestionsNextOffset": 100,
"suggestionsTruncated": true
- صفحهبندی. هر درخواست حداکثر 100 مورد برمیگرداند. برای بقیه، دوباره درخواست بدهید و
?suggestions_offset=را برابرsuggestionsNextOffsetبگذارید؛ بعد از آخرین صفحه این مقدارnullاست. اندازه هر صفحه را باsuggestions_limit(1 تا 100) تعیین کنید. نوشتن به شکلsuggestionsOffsetوsuggestionsLimitهم کار میکند. suggestedوقتیnullاست که MonoRanks مقدار جدید خوبی برای آن صفحه ندارد. عنوانهای خیلی بلند با قوانین ثابت کوتاه میشوند؛ موضوع صفحه حفظ میشود و هیچ عبارتی از وسط بریده نمیشود. اگر هیچ عنوان کوتاهتری جواب ندهد،suggestedبرابرnullاست و میتوانید خودتان در اپ عنوان بنویسید.suggestionsNote(فقط برای عنوانها) وقتی پر میشود که سایت حروف بزرگ و کوچک عنوانها را روی صفحه تغییر میدهد؛ مثلاً تنظیم Capitalize Titles در Rank Math.writableوقتیfalseاست (همراه باnotWritableReason) که apply نمیتواند روی آن صفحه بنویسد؛ مثلاً آرشیو یک دستهبندی که پست یا برگه WordPress نیست. این صفحهها را برای apply نفرستید.advice(فقط برای توضیحات متا) میگوید کدام صفحه شاید اصلاً توضیحات لازم نداشته باشد: صفحه حقوقی یا آرشیو (خالی بگذارید یا noindex کنید)، آرشیو خالی (پست اضافه کنید یا noindex کنید)، یا صفحه ورود، حساب کاربری، سبد خرید یا پرداخت (noindex کنید؛ برای اینها توضیحاتی پیشنهاد نمیشود).titleTemplate(برای عنوانهای خیلی بلند) وقتی پر میشود که یک بخش مشترک در انتهای قالب عنوان افزونه سئو بیشتر عنوانها را بلند کرده؛ در این حالت با یک تغییر در قالب، همه درست میشوند.lastRecheckنتیجه آخرین بررسی دوباره است. بررسی دوباره همه صفحههای لیست را از نو میخواند، پس صفحههایی که درستشان کردهاید از لیست بیرون میروند. صفحهای که پاسخ نداده در لیست میماند و درlastRecheck.notRecheckedشمرده میشود.lastChangeآخرین دسته تغییر تأییدشده است، با وضعیت هر تغییر.not_liveیعنی مقدار نوشته شده، ولی صفحه هنوز مقدار دیگری نشان میدهد؛notLiveReasonدلیلش را میگوید، از جمله اینکه کش صفحههای سایت بعد از نوشتن پاک شده یا نه. بررسی دوباره این تغییرها را هم دوباره چک میکند. اگر عنوان یا توضیحات فقط در حروف بزرگ و کوچک، فاصله، گیومه یا خطتیره فرق داشته باشد، live حساب میشود؛ در این حالتliveNoteمیگوید چه چیزی آن را تغییر داده است.
مقدارهایی را که تأیید میکنید با این شکل به POST /sites/{siteId}/actions/{issueId}/apply بفرستید: { "changes": [ { "url": "…", "value": "…" } ] } (حداکثر 500 مورد). apply از طریق API فقط عنوان سئو، توضیحات متا، canonical و noindex را مینویسد؛ متن alt تصویرها و ریدایرکتها را باید در اپ اعمال کنید.
آدرسهای ایمیل شخصی در متن صفحههایی که MonoRanks ذخیره میکند پنهان میشوند؛ مثلاً j•••@gmail.com.
مثال
curl -H "Authorization: Bearer mr_ws_…" \
"https://app.monoranks.com/api/v1/sites/SITE_ID/actions?limit=5"
{
"waiting": 1,
"actions": [
{ "rank": 1, "issueId": "…", "title": "Missing meta description", "severity": "serious", "effort": "low",
"priority": 8.4, "estimatedScoreGain": 3.2, "status": "open", "ageDays": 16, "waitingWeeks": 2,
"writableField": "seo_description", "link": "https://app.monoranks.com/sites/SITE_ID/actions/…" }
]
}
شروع یک بررسی
curl -X POST -H "Authorization: Bearer mr_ws_…" -H "Content-Type: application/json" \
-d '{ "pageBudget": 1000 }' "https://app.monoranks.com/api/v1/sites/SITE_ID/audits"
پاسخ فوراً با 202، یک auditId و یک آدرس poll برمیگردد. بعد حدوداً هر دقیقه یک بار با GET /sites/{siteId}/audits/{auditId} وضعیت را چک کنید. pageBudget اختیاری است و حداکثرش تعداد صفحههای هر بررسی در پلن شماست: Free 200، Starter 500، Agency 1,000، Enterprise 10,000. برای هر سایت در هر لحظه فقط یک کراول اجرا میشود، و از طریق API و MCP روزانه حداکثر 3 بررسی برای هر سایت میتوانید شروع کنید. بررسی هفتگی هم طبق روال اجرا میشود.
خطاها و محدودیتها
خطاها این شکل را دارند: { "error": { "code": "…", "message": "…" } }
| Status | معنی |
|---|---|
| 400 | پارامتر یا body اشتباه است؛ مثلاً بازه تاریخ نامعتبر، سقف صفحه بیشتر از پلن، یا صفحهای که نمیشود رویش نوشت |
| 401 | کلید ارسال نشده، ناشناخته است یا باطل شده |
| 403 | scope لازم را ندارد، سایت جزو سایتهای کلید نیست، یا صاحب کلید دسترسیاش را از دست داده |
| 404 | چنین سایت، مشکل، صفحه، بررسی یا مسیری وجود ندارد |
| 409 | چیزی از قبل در صف یا در حال اجراست (بررسی دوباره، بررسی کامل، یا همان اجرای Agentic browsing)، یا سایت اتصال WordPressای ندارد که بتواند بنویسد |
| 429 | به سقف ساعتی رسیدهاید (1,200 درخواست برای هر کلید در ساعت)، سهمیه روزانه تست سرعت تمام شده، یا امروز 3 بررسی شروع کردهاید |
| 503 | API یا این قابلیت فعلاً خاموش است |
هر کلید با دسترسی کسی کار میکند که آن را ساخته. اگر آن شخص از فضای کاری خارج شود یا نقشش به بیننده مشتری (client viewer) تغییر کند، کلید دیگر کار نمیکند.
سؤالهای رایج
SDK هم دارید؟
هنوز نه. اگر کلاینت تایپدار میخواهید، سند OpenAPI در /api/v1/openapi.json با ابزارهای رایج تولید کلاینت (openapi-generator، Kiota، oazapfts) کار میکند.
با API میشود داده نوشت؟
چند عملیات نوشتن داریم و هرکدام scope خودش را دارد: گذاشتن بررسی دوباره در صف یا اجرای دوباره تست Agentic browsing (issues:recheck)، شروع بررسی کامل (audits:run)، و تأیید عنوان سئو، توضیحات متا، canonical، فایل llms.txt یا قوانین خزندههای هوش مصنوعی که MonoRanks بعد از تأیید، از طریق اتصال WordPress روی سایت مینویسد (actions:apply). هر تغییر تأییدشده را تا 30 روز در اپ میتوانید برگردانید. بقیه endpointها فقط خواندنیاند.
endpointهای عمومی چطور؟
GET /api/v1/plans و GET /api/v1/changelog کلید نمیخواهند؛ سایت MonoRanks قیمتها و یادداشتهای انتشار را از همینها نشان میدهد.