نتایج گوگل

اهداف

چرخهٔ کامل هدف در سرویس نتایج گوگل؛ ساخت، فهرست، ویرایش، روشن و خاموش‌کردن، حذف، و تاریخچهٔ رتبه.

هدف یعنی یک پرس‌وجو که روی زمان‌بندی تکرار می‌شود. اگر می‌خواهید بدانید رتبهٔ یک دامنه برای یک عبارت در طول زمان چه بوده، چیزی که می‌خواهید یک هدف است.

هر بار که هدف اجرا می‌شود، یک پرس‌وجو تولید می‌کند، و آن پرس‌وجو به‌مرور نتیجه می‌سازد.

هویت یک هدف سه‌تایی است

هویت یک هدف برابر است با:

(domain, keyword, city)

برای همین، فرستادن دوبارهٔ همان سه‌تایی به‌روزرسانی می‌کند و تکراری نمی‌سازد. اگر کلاینت درخواست را دوباره بفرستد، زمان‌بندی دومی ساخته نمی‌شود.

تطبیق کلمهٔ کلیدی نرمالایز شده است. دو نگارش از یک عبارت، یک هدف‌اند. اگر دو بار با فاصله یا حروف بزرگ/کوچک متفاوت بفرستید، همان رکورد به‌روز می‌شود.

ساخت هدف

POST /targets → 201 — نیازمند targets:write.

یک هدف تازه می‌سازد، یا اگر همان سه‌تایی از قبل هست آن را به‌روز می‌کند.

نمونهٔ درخواست:

curl -s -X POST -H "X-API-Key: $KEY" -H 'Content-Type: application/json' \
  -d '{"domain":"example.ir","keyword":"shoes","city":"tehran","cadence_hours":6}' \
  https://serp.rasaad.ir/api/v1/operator/targets
فیلدنوعپیش‌فرضتوضیح
domainstring—الزامی، حداکثر ۲۵۵ نویسه. دامنه‌ای که رتبه‌اش را دنبال می‌کنید
keywordstring—الزامی، حداکثر ۵۱۲ نویسه. همان عبارتی که واقعاً جستجو می‌شود
citystring""یک اسلاگ (slug) شهر پشتیبانی‌شده، یا "" برای کل ایران
cadence_hoursnumber24باید بزرگ‌تر از صفر باشد. فاصلهٔ تکرار به ساعت
pagesinteger1تعداد صفحه‌های گوگل در هر اجرا. به limits.max_pages محدود می‌شود
expand_answersinteger0تعداد پاسخ‌های «افراد دیگر هم پرسیده‌اند» که باز شود. به limits.max_expand_answers محدود می‌شود

نمونهٔ پاسخ:

{"ok": true, "target_id": 12, "created": true, "target": { … }}

target_id شناسهٔ هدف است و در بقیهٔ مسیرهای همین صفحه استفاده می‌شود. فیلد created به شما می‌گوید این تازه ساخته شده یا به‌روزرسانی بود.

کد 201 به‌تنهایی مشخص نمی‌کند ساختید یا به‌روز کردید. درخواست دوم با همان سه‌تایی هم 201 می‌گیرد ولی چیزی نساخته؛ فقط به‌روزرسانی کرده. برای اینکه بفهمید رکورد تازه ساخته شده یا نه، created را بخوانید، نه کد وضعیت را.
فیلد ناشناخته 422 می‌گیرد، نه اینکه بی‌صدا دور ریخته شود. این عمدی است: یک املای غلط مثل cadence_hour بی‌صدا نادیده گرفته می‌شد و زمان‌بندی شما هرگز تغییر نمی‌کرد. در عوض درخواست رد می‌شود.

فهرست هدف‌ها

GET /targets — نیازمند targets:read.

همهٔ هدف‌های شما، مرتب بر اساس id صعودی.

نمونهٔ درخواست:

curl -s -H "X-API-Key: $KEY" \
  "https://serp.rasaad.ir/api/v1/operator/targets?limit=50"
پارامتریعنی چه
enabledبرای فیلتر 1 یا 0. نفرستادنش یعنی هر دو
qجست‌وجوی بخشی از متن در دامنه و کلمهٔ کلیدی
limit, cursorطبق صفحه‌بندی

نمونهٔ پاسخ:

{"ok": true, "rows": [ … ], "total": 12, "next_cursor": "…"}

هر ردیف یک هدف است:

{
  "id": 12, "domain": "example.ir", "keyword": "shoes", "city": "tehran",
  "cadence_hours": 6.0, "enabled": true, "pages": 1,
  "expand_answers": 0, "owner": "acme"
}

گرفتن یک هدف

GET /targets/{target_id} — نیازمند targets:read.

یک هدف را با شناسه‌اش برمی‌گرداند.

نمونهٔ درخواست:

curl -s -H "X-API-Key: $KEY" \
  https://serp.rasaad.ir/api/v1/operator/targets/12

نمونهٔ پاسخ:

{"ok": true, "target": { … }}

ویرایش هدف

PATCH /targets/{target_id} — نیازمند targets:write (و اگر بدنه enabled را ست کند، اضافه بر آن targets:delete هم لازم است).

فقط فیلدهایی که می‌فرستید عوض می‌شوند؛ بقیه دست‌نخورده می‌مانند.

نمونهٔ درخواست:

curl -s -X PATCH -H "X-API-Key: $KEY" -H 'Content-Type: application/json' \
  -d '{"cadence_hours":12}' \
  https://serp.rasaad.ir/api/v1/operator/targets/12

نمونهٔ پاسخ:

{"ok": true, "target": { … }}

اگر عملاً چیزی تغییر نکرده باشد پاسخ 404 است، تا بتوانید بفهمید ویرایش اعمال شد یا نه.

domain، keyword و city غیرقابل تغییرند. آن سه‌تایی هویت هدف است، و کلمهٔ کلیدیِ ذخیره‌شده همان چیزی است که واقعاً جستجو می‌شود. تغییرش آن را ویرایش نمی‌کند، تاریخچه را بازنویسی می‌کند. برای رهگیری یک پرس‌وجوی متفاوت، اول DELETE کنید و بعد POST.

روشن و خاموش کردن

POST /targets/{target_id}/enable و POST /targets/{target_id}/disable — هر دو نیازمند targets:delete.

هدف را روشن یا خاموش می‌کند بدون اینکه حذفش کند.

نمونهٔ درخواست:

curl -s -X POST -H "X-API-Key: $KEY" \
  https://serp.rasaad.ir/api/v1/operator/targets/12/disable

نمونهٔ پاسخ:

{"ok": true, "enabled": false, "queued_dropped": 2, "target": { … }}

خاموش‌کردن، کارهای در صف آن هدف را لغو می‌کند و تعدادشان را در queued_dropped گزارش می‌دهد.

خاموش‌کردن دوبارهٔ هدفی که خاموش است 404 می‌دهد، نه 200. یعنی کاری برای انجام نبود، نه اینکه درخواست شما اثر داشت.

حذف هدف

DELETE /targets/{target_id} — نیازمند targets:delete.

هدف را حذف می‌کند. پارامتر اختیاری ?with_history=1 تاریخچهٔ رتبه را هم پاک می‌کند.

نمونهٔ درخواست:

curl -s -X DELETE -H "X-API-Key: $KEY" \
  https://serp.rasaad.ir/api/v1/operator/targets/12

نمونهٔ پاسخ:

{"ok": true, "target_id": 12, "queued_dropped": 0, "history_deleted": false}
تاریخچهٔ رتبه می‌ماند، مگر with_history=1 بفرستید. توقف رهگیری معمولاً به معنی پاک کردن سوابق قبلی نیست. کارهای در صف در هر دو حالت لغو می‌شوند.

تاریخچهٔ رتبه

GET /targets/{target_id}/history — نیازمند targets:read.

رتبهٔ یک هدف در طول زمان، جدیدترین اول.

نمونهٔ درخواست:

curl -s -H "X-API-Key: $KEY" \
  "https://serp.rasaad.ir/api/v1/operator/targets/12/history?limit=200"

?since= و ?until= ثانیهٔ epoch هستند و روی finished فیلتر می‌کنند. اینها فیلتر هستند، هرگز کرسر صفحه‌بندی نیستند.

نمونهٔ پاسخ:

{
  "ok": true, "target_id": 12,
  "rows": [
    {"task_id": "5fa4d2c1", "keyword": "shoes", "city": "tehran", "domain": "example.ir",
     "bot_id": "tehran-…", "rank": 2, "previous_rank": 4, "rank_change": 2,
     "pages": 2, "finished": 1767225600.0, "out_path": "…"}
  ],
  "count": 1
}

out_path را استفاده نکنید؛ نتایج را با task_id بخوانید.

rank_change وقتی دامنه در صفحه بالا رفته مثبت است — یعنی عدد کوچک‌تر. پس جهت مثبت یعنی بهتر شدن رتبه، برخلاف تصور معمول از «تغییر». روی قدیمی‌ترین ردیف، و هرجا اجرای قبلی رتبه نداشته، null است.

خلاصه

کارمتد و مسیردسترسی
ساخت یا به‌روزرسانیPOST /targetstargets:write
فهرستGET /targetstargets:read
یک هدفGET /targets/{id}targets:read
ویرایشPATCH /targets/{id}targets:write
ویرایش enabledPATCH /targets/{id}targets:write + targets:delete
روشن‌کردنPOST /targets/{id}/enabletargets:delete
خاموش‌کردنPOST /targets/{id}/disabletargets:delete
حذفDELETE /targets/{id}targets:delete
تاریخچهGET /targets/{id}/historytargets:read
قدم بعدی: اگر به‌جای رهگیری مداوم فقط یک خزش لازم دارید، سراغ پرس‌وجوها بروید — هیچ هدفی نمی‌سازد و هیچ اثر جانبی ندارد.