رفتن به محتوا

بای‌باکس و رقبا

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

در دیجی‌کالا وقتی چند فروشنده یک تنوع را می‌فروشند، فقط یکی از آن‌ها بای‌باکس را در اختیار دارد: پیشنهادی که دکمه‌ی «افزودن به سبد» صفحه‌ی کالا به آن تعلق دارد و بیشترین سهم فروش را می‌برد. دیجی‌کالا برنده را با یک امتیاز رتبه انتخاب می‌کند که قیمت مهم‌ترین بخش آن است. ربات قیمت‌گذاری سلر ۳۶۰ در هر دور بازار هر تنوع را می‌خواند؛ مسیرهای این صفحه همان خواندن‌ها را به شما می‌دهند.

با مسیرهای این صفحه می‌توانید:

کار مسیر در دسترس
وضعیت بای‌باکس همه‌ی تنوع‌ها GET /v1/buybox فعال
وضعیت بای‌باکس یک تنوع GET /v1/buybox/{variant_id} فعال
فهرست رقبا GET /v1/competitors فعال
نمایه‌ی یک رقیب GET /v1/competitors/{rival_seller_id} فعال
حالت پایش و یادداشت یک رقیب PATCH /v1/competitors/{rival_seller_id} فعال
تاریخچه‌ی تغییر قیمت رقیب GET /v1/competitors/{rival_seller_id}/history فعال
خواندن تنظیمات رصد فعال GET /v1/competitors/watch-settings فعال
تغییر تنظیمات رصد فعال PUT /v1/competitors/watch-settings فعال

و با رویدادهای وب‌هوک buybox.won، buybox.lost و competitor.below_floor از هر تغییر صاحب بای‌باکس خبردار شوید.

دسترسی برای
competition:read همه‌ی مسیرهای خواندن این صفحه و رویدادهای buybox.* و competitor.*
competition:write تغییر تنظیمات رصد، حالت پایش و یادداشت رقیب
bot:write پیشنهاد می‌شود: برای تغییر حداقل قیمت تنوع‌هایی که حداقل قیمت مانع بردن آن‌هاست (ربات قیمت‌گذاری)

جزئیات ساخت کلید در صفحه‌ی ورود و دسترسی‌ها آمده است. هیچ‌کدام از مسیرهای این صفحه چیزی در دیجی‌کالا تغییر نمی‌دهد؛ تغییرها فقط تنظیمات سلر ۳۶۰ هستند.

ماژول «API و وب‌هوک» باید برای پنل فعال باشد؛ در غیر این صورت همه‌ی مسیرها با کد 403 و خطای module_inactive (ماژول API) یا module_required (ماژول این بخش، با نام آن در detail) پاسخ می‌دهند.

https://api.seller360.ir
مقدار برچسب در پنل معنی
winner «برنده بای‌باکس» یا «برنده تنوع» بای‌باکس در اختیار شماست؛ box_scope می‌گوید بای‌باکس کل کالا (product) است یا فقط همین تنوع و رنگ (variant).
winnable «به‌زودی برنده» قیمت تخمینی بردن بالاتر یا برابر حداقل قیمت شماست؛ ربات تا آن پایین می‌آید.
structural «خارج از دسترس» حتی قیمت تخمینی بردن زیر حداقل قیمت شماست و ربات بدون کاهش حداقل نمی‌تواند ببرد.
فیلد برچسب در پنل معنی
winner «بای‌باکس در اختیار شماست» بای‌باکس در اختیار شماست.
box_scope «برنده بای‌باکس»، «برنده تنوع» برای برنده‌ها: کل کالا یا فقط همین تنوع.
live — خواندن ربات تازه است (حداکثر ۶ ساعت)؛ در غیر این صورت برنده بودن از همگام‌سازی روزانه‌ی پنل است.
reading_age_hours — سن خواندن ربات به ساعت.
position — جایگاه شما در فهرست فروشندگان؛ ۱ یعنی برنده.
rival_count — تعداد رقبا در این بای‌باکس.
our_price «قیمت شما» قیمت شما در صفحه‌ی عمومی دیجی‌کالا.
rival_price «قیمت رقیب» قیمت واقعی صاحب فعلی بای‌باکس.
rival_is_fbd — کالای صاحب بای‌باکس در انبار دیجی‌کالاست.
holder «بای‌باکس در اختیار» صاحب بای‌باکس در آخرین مشاهده: نام، شناسه، is_you و is_own_panel (یکی از پنل‌های دیگر حساب شما، نه رقیب).
win_price «قیمت بردن» قیمت تخمینی لازم برای بردن (بخش بعد).
drop_to_win «چقدر باید کم شود» کاهش لازم از قیمت فعلی تا قیمت بردن؛ فقط برای غیربرنده با خواندن تازه.
headroom — فضای افزایش قیمت بدون از دست دادن بای‌باکس؛ فقط برای برنده با خواندن تازه.
floor، floor_source «حداقل قیمت شما» حداقل قیمتی که ربات رعایت می‌کند و منشا آن.
floor_gap، floor_gap_pct «حداقل قیمت تا قیمت بردن» فاصله‌ی حداقل قیمت تا قیمت بردن، وقتی حداقل بالاتر است؛ به ریال و به درصد حداقل قیمت.
floor_blocks «حداقل قیمت اجازه نمی‌دهد» تنها حداقل قیمت شما مانع بردن است و بردن با قیمت بردن هنوز زیان‌ده نیست.
breakeven — کمترین قیمت با سود خالص صفر (تخمینی).
profit_pct، win_profit_pct — سود خالص فعلی و سود خالص در قیمت بردن، به درصد قیمت.
synced_at — زمان آخرین خواندن ربات.

همه‌ی مبالغ به ریال است. مبلغی که شیء { "value": …, "estimated": true } دارد، تخمین سلر ۳۶۰ است، نه عددی که دیجی‌کالا اعلام کرده باشد.

قیمت بردن چگونه تخمین زده می‌شود

Section titled “قیمت بردن چگونه تخمین زده می‌شود”

دیجی‌کالا امتیاز رتبه‌ی هر پیشنهاد را در صفحه‌ی کالا نشان می‌دهد ولی فرمول آن را منتشر نمی‌کند. سلر ۳۶۰ رابطه‌ی قیمت و امتیاز رتبه را با پژوهش روی جفت پیشنهادهای واقعی اندازه‌گیری کرده است و win_price را این‌گونه تخمین می‌زند:

  • قیمت مهم‌ترین عامل است. اگر امتیاز رتبه‌ی شما و صاحب بای‌باکس هر دو معلوم باشد، قیمتی محاسبه می‌شود که در آن امتیاز شما از امتیاز صاحب بای‌باکس بالاتر برود.
  • بودن در انبار دیجی‌کالا امتیاز ثابتی دارد. کالایی که در انبار دیجی‌کالاست (rival_is_fbd) با قیمت کمی بالاتر هم می‌تواند ببرد؛ این امتیاز در تخمین منظور می‌شود. اثر عامل‌های دیگر مانند امتیاز فروشنده و یک یا دو روز تفاوت زمان ارسال در اندازه‌گیری‌ها ناچیز بود.
  • برای کالای ارزان، که رابطه‌ی قیمت و رتبه پایدار نیست، تخمین بر پایه‌ی قیمت خود رقیب و تفاوت انبار ساخته می‌شود.
  • حاشیه‌ی امنیت: قیمتی که دقیقا روی آستانه باشد همیشه نمی‌برد؛ ربات همیشه کمی زیر آستانه قیمت می‌گذارد و precision استراتژی فقط می‌تواند این حاشیه را بیشتر کند (ربات قیمت‌گذاری).

win_price قول قطعی نیست؛ بالای دامنه‌ای است که ربات تا آن پایین می‌آید. در یک اندازه‌گیری هفت‌روزه روی پنل‌های واقعی، رسیدن به قیمت تخمینی بردن در حدود ۷۸ درصد موارد در همان دور بعد بای‌باکس را برد و افزایش قیمت برنده‌ها تا مرز headroom در حدود ۸۹ درصد موارد بای‌باکس را حفظ کرد.

برچسب (label) و احتمال ربات بودن (bot_score)

Section titled “برچسب (label) و احتمال ربات بودن (bot_score)”

احتمال ربات بودن هر رقیب از ۰ تا ۱۰۰، از تاریخچه‌ی ۳۰ روز اخیر تغییرات قیمت او محاسبه می‌شود.

برچسب برچسب در پنل معنی
unknown «نامشخص» داده‌ی کافی نیست؛ کمتر از ۶ تغییر قیمت.
human «انسان» به‌احتمال زیاد انسان؛ امتیاز کمتر از ۳۰.
suspect «مشکوک» امتیاز ۳۰ تا کمتر از ۶۰.
bot «ربات» به‌احتمال زیاد ربات؛ امتیاز ۶۰ و بیشتر.

امتیاز از چند نشانه ساخته می‌شود؛ برای هر نشانه، شدت آن (value، ۰ تا ۱۰۰) و وزن آن در امتیاز (weight_pct) اعلام می‌شود.

کلید معنی
reaction سرعت واکنش به تغییر قیمت شما.
frequency تعداد تغییر قیمت در روز.
regularity نظم زمانی تغییرها.
undercut فاصله‌ی ثابت زیر قیمت شما.
nonround قیمت‌های غیرگرد.
فیلد برچسب در پنل معنی
rival_seller_id، name — شناسه و نام فروشنده در دیجی‌کالا؛ همان شناسه‌ای که در seller_blacklist و seller_whitelist استراتژی می‌آید.
variants_overlap — روی چند تنوع شما رقابت دارد.
overlap_pct — درصد تنوع‌های فعال شما که این رقیب می‌فروشد.
win_rate — درصد مشاهده‌هایی که این رقیب صاحب بای‌باکس بود.
est_floor «حداقل قیمت تخمینی» حداقل قیمت تخمینی رقیب؛ کمترین قیمت دیده‌شده از او.
sample_changes — تعداد تغییرهای پشت این امتیاز.
watch_mode، is_watched «رصد فعال این رقیب» حالت پایش و اینکه اکنون تحت‌نظر است.
strategy_note، strategy_updated_at — یادداشت استراتژی شما برای این رقیب؛ متن خود شماست و هیچ محاسبه‌ای آن را تغییر نمی‌دهد.
synced_at — زمان آخرین محاسبه‌ی نمایه.
مقدار برچسب در پنل معنی
auto «خودکار» اگر رقیب دست‌کم overlap_pct درصد از تنوع‌های فعال شما را بفروشد، تحت‌نظر است.
on «همیشه رصد» همیشه تحت‌نظر.
off «رصد نشود» هرگز تحت‌نظر نیست.
فیلد برچسب در پنل معنی
enabled «رصد فعال رقبا» رصد فعال روشن است.
poll_seconds «هر ۵ دقیقه» و گزینه‌های دیگر هر چند ثانیه کالاهای رقبای تحت‌نظر دوباره خوانده شوند؛ ۶۰ تا ۳۶۰۰، پیش‌فرض ۳۰۰.
overlap_pct «حداقل اشتراک برای رصد (درصد)» آستانه‌ی حالت auto؛ ۰ تا ۱۰۰.
last_poll_at — آخرین خواندن رصدگر.
study_started_at — نخستین روشن شدن رصد.
  • بای‌باکس: با هر دور ربات خوانده می‌شود. خواندن ربات تا ۶ ساعت «زنده» است (live: true)؛ پس از آن برنده بودن از همگام‌سازی روزانه‌ی پنل است و drop_to_win و headroom خالی می‌شوند. سن خواندن در reading_age_hours است.
  • رصد فعال: اگر روشن باشد، کالاهای رقبای تحت‌نظر هر poll_seconds ثانیه (پیش‌فرض ۵ دقیقه) از صفحه‌ی عمومی دیجی‌کالا دوباره خوانده می‌شوند، بدون مصرف سهمیه‌ی درخواست پنل شما.
  • نمایه‌ی رقبا: حداکثر هر یک ساعت دوباره محاسبه می‌شود (synced_at).
  • تاریخچه‌ی رقیب: فقط تغییرها ثبت می‌شوند، نه هر مشاهده؛ و پس از دوره‌ی نگهداری پاک می‌شوند.

GET /v1/buybox — وضعیت بای‌باکس تنوع‌ها فعال

Section titled “GET /v1/buybox — وضعیت بای‌باکس تنوع‌ها ”

وضعیت بای‌باکس هر تنوعی که ربات آن را خوانده است.

GET /v1/buybox?status=winnable&size=100 HTTP/1.1
Host: api.seller360.ir
Authorization: Bearer s360_live_...
پارامتر نوع اجباری توضیح
status winner، winnable یا structural خیر فقط تنوع‌هایی با این وضعیت.
floor_blocks 0 یا 1 خیر فقط تنوع‌هایی که تنها حداقل قیمت شما مانع بردن است (1).
variant_ids متن خیر فهرست شناسه‌ی تنوع‌ها با ویرگول، حداکثر ۱۰۰ شناسه.
page، size عدد خیر صفحه‌بندی.

پاسخ نمونه

{
"status": "ok",
"data": [
{
"variant_id": 84780448,
"sku": "PE-5144",
"status": "winnable",
"winner": false,
"box_scope": null,
"live": true,
"reading_age_hours": 0.2,
"position": 2,
"rival_count": 4,
"our_price": 23990000,
"rival_price": 23650000,
"rival_is_fbd": true,
"holder": { "name": "الکترو آرین", "seller_id": 1083422, "is_you": false, "is_own_panel": false },
"win_price": { "value": 23420000, "estimated": true },
"drop_to_win": 570000,
"headroom": null,
"floor": 21800000,
"floor_source": "cost_plus",
"floor_gap": null,
"floor_gap_pct": null,
"floor_blocks": false,
"breakeven": { "value": 19900000, "estimated": true },
"profit_pct": 8.4,
"win_profit_pct": 6.3,
"synced_at": "2026-11-12T10:03:12+03:30"
}
],
"pager": { "page": 1, "item_per_page": 100, "total_pages": 1, "total_rows": 30 }
}

GET /v1/buybox/{variant_id} — وضعیت بای‌باکس یک تنوع فعال

Section titled “GET /v1/buybox/{variant_id} — وضعیت بای‌باکس یک تنوع ”

همان ساختار، برای یک تنوع. اگر تنوع در این پنل نباشد، کد 404 و خطای variant_not_found برمی‌گردد.

GET /v1/competitors — فهرست رقبا فعال

Section titled “GET /v1/competitors — فهرست رقبا ”

هر فروشنده‌ای که روی تنوع‌های شما دیده شده است، به ترتیب احتمال ربات بودن.

پارامتر نوع اجباری توضیح
label unknown، human، suspect یا bot خیر فقط رقبایی با این برچسب.
watched 0 یا 1 خیر فقط رقبای تحت‌نظر (1) یا غیر آن (0).
page، size عدد خیر صفحه‌بندی.

پاسخ نمونه

{
"status": "ok",
"data": [
{
"rival_seller_id": 1083422,
"name": "الکترو آرین",
"bot_score": 72,
"label": "bot",
"signals": [
{ "key": "reaction", "value": 94, "weight_pct": 35 },
{ "key": "frequency", "value": 81, "weight_pct": 25 },
{ "key": "regularity", "value": 60, "weight_pct": 15 },
{ "key": "undercut", "value": 55, "weight_pct": 15 },
{ "key": "nonround", "value": 20, "weight_pct": 10 }
],
"variants_overlap": 23,
"overlap_pct": 14.6,
"win_rate": 41.0,
"est_floor": { "value": 22900000, "estimated": true },
"sample_changes": 312,
"watch_mode": "auto",
"is_watched": true,
"strategy_note": "در ساعات شب قیمت را کاهش نمی‌دهد.",
"strategy_updated_at": "2026-11-02T14:12:00+03:30",
"synced_at": "2026-11-12T10:00:05+03:30"
}
],
"pager": { "page": 1, "item_per_page": 50, "total_pages": 2, "total_rows": 64 }
}

GET /v1/competitors/{rival_seller_id} — یک رقیب فعال

Section titled “GET /v1/competitors/{rival_seller_id} — یک رقیب ”

همان ساختار، برای یک رقیب. اگر این فروشنده روی تنوع‌های پنل دیده نشده باشد، کد 404 و خطای competitor_not_found برمی‌گردد.

PATCH /v1/competitors/{rival_seller_id} — پایش و یادداشت رقیب فعال

Section titled “PATCH /v1/competitors/{rival_seller_id} — پایش و یادداشت رقیب ”

فقط فیلدهای ارسال‌شده تغییر می‌کنند. پاسخ موفق: نمایه‌ی کامل رقیب.

PATCH /v1/competitors/1083422 HTTP/1.1
Host: api.seller360.ir
Authorization: Bearer s360_live_...
Idempotency-Key: rival-1083422-watch-on
Content-Type: application/json
{ "watch_mode": "on", "strategy_note": "در ساعات شب قیمت را کاهش نمی‌دهد." }
فیلد بدنه نوع توضیح
watch_mode auto، on یا off حالت پایش.
strategy_note متن، حداکثر ۵۰۰۰ نویسه یادداشت استراتژی؛ رشته‌ی خالی یادداشت را پاک می‌کند.
کد HTTP خطا معنی تکرار بی‌خطر است؟
400 invalid_parameter مقدار نامعتبر. خیر؛ بدنه را اصلاح کنید.
404 competitor_not_found این رقیب روی تنوع‌های پنل دیده نشده است. خیر.
409 idempotency_mismatch این کلید یکتا قبلا با بدنه‌ی دیگری استفاده شده است. خیر؛ کلید تازه بسازید.

GET /v1/competitors/{rival_seller_id}/history — تاریخچه‌ی رقیب فعال

Section titled “GET /v1/competitors/{rival_seller_id}/history — تاریخچه‌ی رقیب ”

هر مشاهده‌ای که در آن قیمت، رتبه یا صاحب بای‌باکس این رقیب روی یکی از تنوع‌های شما تغییر کرده است، تازه‌ترین اول.

پارامتر نوع اجباری توضیح
variant_id عدد خیر فقط تغییرات روی این تنوع.
observed_from، observed_to زمان خیر بازه‌ی زمان مشاهده.
page، size عدد خیر صفحه‌بندی.

پاسخ نمونه

{
"status": "ok",
"data": [
{
"variant_id": 84780448,
"product_id": 22961150,
"price": 23650000,
"rank": 4.21,
"rate": 4.3,
"is_fbd": true,
"has_box": true,
"our_price": 23990000,
"observed_at": "2026-11-12T09:58:40+03:30"
}
],
"pager": { "page": 1, "item_per_page": 50, "total_pages": 3, "total_rows": 141 }
}

rank امتیاز رتبه‌ی پیشنهاد رقیب در دیجی‌کالا و rate امتیاز رضایت از کالای رقیب است.

GET /v1/competitors/watch-settings و PUT — تنظیمات رصد فعال فعال

Section titled “GET /v1/competitors/watch-settings و PUT — تنظیمات رصد فعال ”

با PUT فقط فیلدهای ارسال‌شده تغییر می‌کنند. تغییر overlap_pct رقبای تحت‌نظر را همان لحظه دوباره تعیین می‌کند.

PUT /v1/competitors/watch-settings HTTP/1.1
Host: api.seller360.ir
Authorization: Bearer s360_live_...
Idempotency-Key: watch-settings-2026-11-12
Content-Type: application/json
{ "enabled": true, "poll_seconds": 300, "overlap_pct": 5.0 }

پاسخ نمونه

{
"status": "ok",
"data": {
"enabled": true,
"poll_seconds": 300,
"overlap_pct": 5.0,
"last_poll_at": "2026-11-12T10:12:00+03:30",
"study_started_at": "2026-10-01T09:00:00+03:30"
}
}
کد HTTP خطا معنی تکرار بی‌خطر است؟
400 invalid_parameter مثلا poll_seconds بیرون از ۶۰ تا ۳۶۰۰. خیر؛ بدنه را اصلاح کنید.
409 idempotency_mismatch این کلید یکتا قبلا با بدنه‌ی دیگری استفاده شده است. خیر؛ کلید تازه بسازید.

همه‌ی رویدادهای این بخش با دسترسی competition:read دریافت می‌شوند.

رویداد چه وقت
buybox.won خواندن ربات نشان دهد بای‌باکسی که در اختیار شما نبود، اکنون در اختیار شماست. تنوعی که اولین بار خوانده می‌شود این رویداد را نمی‌فرستد.
buybox.lost خواندن ربات نشان دهد بای‌باکسی که در اختیار شما بود، اکنون در اختیار فروشنده‌ی دیگری است.
competitor.below_floor صاحب بای‌باکس یک تنوع فعال و موجود قیمتی کمتر از حداقل قیمت دستی شما دارد؛ ربات بدون کاهش حداقل قیمت نمی‌تواند ببرد. برای هر تنوع یک بار هنگام شروع این وضعیت.

نمونه‌ی پیام competitor.below_floor

{
"id": "evt_01J0C4TR",
"type": "competitor.below_floor",
"created_at": "2026-11-12T10:03:15+03:30",
"panel_id": 1,
"livemode": true,
"data": {
"variant_id": 84780448,
"sku": "PE-5144",
"floor": 21800000,
"rival_price": 21360000,
"gap_pct": 2.0,
"rival_seller_id": 1083422,
"rival_seller_name": "الکترو آرین"
}
}

پیام‌های buybox.won و buybox.lost شیء کامل buybox را با همان ساختار GET /v1/buybox/{variant_id} دارند. پیام‌ها ممکن است تکراری یا جابه‌جا برسند (معرفی وب‌هوک). پیش از استفاده از هر پیام، امضای آن را بررسی کنید.

💻 نمونه‌کد: تنوع‌هایی که فقط حداقل قیمت مانع بردن آن‌هاست

Section titled “💻 نمونه‌کد: تنوع‌هایی که فقط حداقل قیمت مانع بردن آن‌هاست”
Terminal window
curl "https://api.seller360.ir/v1/buybox?floor_blocks=1&size=100" \
-H "Authorization: Bearer $S360_API_KEY"