وبهوکها
ده event، یک body از نوع JSON و یک امضای HMAC برای چک کردن. برای فرستادن پیام به Slack، باز کردن تیکت یا بهروز کردن داشبورد خودتان همین کافی است.
راهاندازی
به Settings → API and MCP → Webhooks → Add endpoint بروید، یک آدرس https:// وارد کنید و eventهایی را که میخواهید انتخاب کنید. یک secret برای چک کردن امضاها میگیرید که فقط یک بار نمایش داده میشود.
- با Edit آدرس و eventها را تغییر میدهید. secret عوض نمیشود.
- Test همان لحظه یک event از نوع
pingمیفرستد تا گیرندهتان را تست کنید. - Log آخرین ارسالها و تعداد تلاشهای هرکدام را نشان میدهد.
Eventها
| Event | چه وقت |
|---|---|
issue.resolved |
بررسی دوباره یا بررسی کامل، مشکل را دیگر پیدا نمیکند |
issue.reopened |
مشکلی که حل شده بود دوباره برگشته |
audit.finished |
یک بررسی کامل تمام شده (صفحهها، مشکلهای باز، امتیازها) |
score.changed |
امتیاز سایت بعد از یک بررسی 2 امتیاز یا بیشتر تغییر کرده |
connection.broken |
اتصال Google یا WordPress از کار افتاده |
recheck.failed |
بررسی دوباره اجرا شده و مشکل هنوز هست، اصلاحی که نوشته شده هنوز روی صفحه live نیست، یا خود بررسی دوباره اجرا نشده |
write.applied |
یک تغییر تأییدشده (فیلد سئو، llms.txt، قوانین خزندههای هوش مصنوعی) از طریق WordPress یا اپ Shopify نوشته شده |
write.failed |
یک تغییر تأییدشده نوشته نشده |
write.not_live |
بررسی دوباره، مقدار نوشتهشده را روی صفحه live پیدا نکرده |
agentic.finished |
اجرای دوباره Agentic browsing تمام شده یا ناموفق بوده |
ارسال
POST https://your-endpoint
Content-Type: application/json
User-Agent: MonoRanks-Webhooks/1
X-MonoRanks-Event: recheck.failed
X-MonoRanks-Delivery: <delivery id>
X-MonoRanks-Signature: sha256=<hex>
هر body این فیلدها را دارد: id (همان delivery id)، event، at، workspaceId و siteId. بیشتر eventها host و یک link به صفحه مربوط در اپ را هم دارند.
{
"id": "…",
"event": "recheck.failed",
"at": "2026-10-01T09:12:00.000Z",
"workspaceId": "…",
"siteId": "…",
"issue": { "id": "…", "ruleId": "SEO-ONP-011", "title": "Missing meta description", "severity": "serious", "pages": 3 },
"crawlId": "…",
"reason": "still_present",
"recheck": { "present": 3, "checked": 4 },
"link": "https://app.monoranks.com/sites/…/issues/…"
}
فیلدهایی که هر event اضافه میکند:
issue.resolved،issue.reopened:issue(id،ruleId،title،severity،pages) وcrawlId.audit.finished:crawlId،status،pagesCrawled،openIssuesوscore(site،health،aeo).score.changed:from،to،deltaوsince.connection.broken:connection(مثلاًgscیاwordpress) وerror.recheck.failed:issue،reason(still_present،not_liveیاerror) وrecheck(present،checked).write.applied،write.failed،write.not_live: برای هر دسته تغییر تأییدشده یک event، باbatchId،issueIds،source(wordpressیاshopify) و حداکثر 50 مورد درchangesکه هرکدامurl،field،value،statusوerrorدارند. درwrite.not_liveهر تغییرnotLiveReasonوliveValue(مقداری که صفحه نشان میدهد) را هم دارد.agentic.finished:jobId،url،strategy،status(doneیاfailed)،passedازapplicable، چکهای ناموفق درfailingوerror.
ظرف 20 ثانیه با یک status از نوع 2xx پاسخ بدهید. هر پاسخ دیگری باعث میشود ارسال دوباره امتحان شود.
چک کردن امضا
امضا یک HMAC-SHA256 از body خام request است که با secret همان endpoint ساخته میشود:
import { createHmac, timingSafeEqual } from 'node:crypto';
const expected = 'sha256=' + createHmac('sha256', SECRET).update(rawBody).digest('hex');
const ok = timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-monoranks-signature']));
همان body خامی را که دریافت کردهاید استفاده کنید، نه نسخهای که دوباره serialize شده.
سؤالهای رایج
اگر endpoint من از دسترس خارج باشد چه میشود؟
ارسال ناموفق بعد از 1، 5، 15 و 60 دقیقه دوباره امتحان میشود؛ در کل پنج بار. بعد از 20 خطای پشت سر هم، endpoint غیرفعال میشود. هر ارسال در header X-MonoRanks-Delivery یک id دارد تا بتوانید ارسالهای تکراری را کنار بگذارید.
میشود بر اساس سایت فیلتر کرد؟
id سایت (siteId) و معمولاً host آن در body هست؛ فیلتر را سمت خودتان انجام دهید. endpointها برای کل فضای کاری تعریف میشوند.
endpoint را قبل از اضافهشدن eventهای جدید ساختهام. آنها را هم دریافت میکنم؟
نه. هر endpoint فقط eventهایی را میگیرد که برایش تیک زدهاید. endpoint را ویرایش کنید و eventهای جدید را اضافه کنید.