بایباکس و رقبا
مخاطب: برنامهنویس داشبورد فروش یا ابزار تحلیل رقابت که میخواهد بداند کدام تنوعها بایباکس را در اختیار دارند، بردن کدامها ممکن است و رقبا چگونه رفتار میکنند.
📖 مقدمه
Section titled “📖 مقدمه”در دیجیکالا وقتی چند فروشنده یک تنوع را میفروشند، فقط یکی از آنها بایباکس را در اختیار دارد: پیشنهادی که دکمهی «افزودن به سبد» صفحهی کالا به آن تعلق دارد و بیشترین سهم فروش را میبرد. دیجیکالا برنده را با یک امتیاز رتبه انتخاب میکند که قیمت مهمترین بخش آن است. ربات قیمتگذاری سلر ۳۶۰ در هر دور بازار هر تنوع را میخواند؛ مسیرهای این صفحه همان خواندنها را به شما میدهند.
با مسیرهای این صفحه میتوانید:
| کار | مسیر | در دسترس |
|---|---|---|
| وضعیت بایباکس همهی تنوعها | 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 از هر تغییر صاحب بایباکس خبردار شوید.
⚙️ پیشنیازها
Section titled “⚙️ پیشنیازها”دسترسی (Scope)
Section titled “دسترسی (Scope)”| دسترسی | برای |
|---|---|
competition:read |
همهی مسیرهای خواندن این صفحه و رویدادهای buybox.* و competitor.* |
competition:write |
تغییر تنظیمات رصد، حالت پایش و یادداشت رقیب |
bot:write |
پیشنهاد میشود: برای تغییر حداقل قیمت تنوعهایی که حداقل قیمت مانع بردن آنهاست (ربات قیمتگذاری) |
جزئیات ساخت کلید در صفحهی ورود و دسترسیها آمده است. هیچکدام از مسیرهای این صفحه چیزی در دیجیکالا تغییر نمیدهد؛ تغییرها فقط تنظیمات سلر ۳۶۰ هستند.
فعال بودن ماژول
Section titled “فعال بودن ماژول”ماژول «API و وبهوک» باید برای پنل فعال باشد؛ در غیر این صورت همهی مسیرها با کد 403 و خطای module_inactive (ماژول API) یا module_required (ماژول این بخش، با نام آن در detail) پاسخ میدهند.
آدرس پایه
Section titled “آدرس پایه”https://api.seller360.ir🧮 مدل بایباکس
Section titled “🧮 مدل بایباکس”وضعیتها (status)
Section titled “وضعیتها (status)”| مقدار | برچسب در پنل | معنی |
|---|---|---|
winner |
«برنده بایباکس» یا «برنده تنوع» | بایباکس در اختیار شماست؛ box_scope میگوید بایباکس کل کالا (product) است یا فقط همین تنوع و رنگ (variant). |
winnable |
«بهزودی برنده» | قیمت تخمینی بردن بالاتر یا برابر حداقل قیمت شماست؛ ربات تا آن پایین میآید. |
structural |
«خارج از دسترس» | حتی قیمت تخمینی بردن زیر حداقل قیمت شماست و ربات بدون کاهش حداقل نمیتواند ببرد. |
فیلدها
Section titled “فیلدها”| فیلد | برچسب در پنل | معنی |
|---|---|---|
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 در حدود ۸۹ درصد موارد بایباکس را حفظ کرد.
👥 مدل رقیب
Section titled “👥 مدل رقیب”برچسب (label) و احتمال ربات بودن (bot_score)
Section titled “برچسب (label) و احتمال ربات بودن (bot_score)”احتمال ربات بودن هر رقیب از ۰ تا ۱۰۰، از تاریخچهی ۳۰ روز اخیر تغییرات قیمت او محاسبه میشود.
| برچسب | برچسب در پنل | معنی |
|---|---|---|
unknown |
«نامشخص» | دادهی کافی نیست؛ کمتر از ۶ تغییر قیمت. |
human |
«انسان» | بهاحتمال زیاد انسان؛ امتیاز کمتر از ۳۰. |
suspect |
«مشکوک» | امتیاز ۳۰ تا کمتر از ۶۰. |
bot |
«ربات» | بهاحتمال زیاد ربات؛ امتیاز ۶۰ و بیشتر. |
نشانهها (signals)
Section titled “نشانهها (signals)”امتیاز از چند نشانه ساخته میشود؛ برای هر نشانه، شدت آن (value، ۰ تا ۱۰۰) و وزن آن در امتیاز (weight_pct) اعلام میشود.
| کلید | معنی |
|---|---|
reaction |
سرعت واکنش به تغییر قیمت شما. |
frequency |
تعداد تغییر قیمت در روز. |
regularity |
نظم زمانی تغییرها. |
undercut |
فاصلهی ثابت زیر قیمت شما. |
nonround |
قیمتهای غیرگرد. |
فیلدهای دیگر رقیب
Section titled “فیلدهای دیگر رقیب”| فیلد | برچسب در پنل | معنی |
|---|---|---|
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 |
— | زمان آخرین محاسبهی نمایه. |
حالت پایش (watch_mode)
Section titled “حالت پایش (watch_mode)”| مقدار | برچسب در پنل | معنی |
|---|---|---|
auto |
«خودکار» | اگر رقیب دستکم overlap_pct درصد از تنوعهای فعال شما را بفروشد، تحتنظر است. |
on |
«همیشه رصد» | همیشه تحتنظر. |
off |
«رصد نشود» | هرگز تحتنظر نیست. |
تنظیمات رصد فعال
Section titled “تنظیمات رصد فعال”| فیلد | برچسب در پنل | معنی |
|---|---|---|
enabled |
«رصد فعال رقبا» | رصد فعال روشن است. |
poll_seconds |
«هر ۵ دقیقه» و گزینههای دیگر | هر چند ثانیه کالاهای رقبای تحتنظر دوباره خوانده شوند؛ ۶۰ تا ۳۶۰۰، پیشفرض ۳۰۰. |
overlap_pct |
«حداقل اشتراک برای رصد (درصد)» | آستانهی حالت auto؛ ۰ تا ۱۰۰. |
last_poll_at |
— | آخرین خواندن رصدگر. |
study_started_at |
— | نخستین روشن شدن رصد. |
🔢 تازگی
Section titled “🔢 تازگی”- بایباکس: با هر دور ربات خوانده میشود. خواندن ربات تا ۶ ساعت «زنده» است (
live: true)؛ پس از آن برنده بودن از همگامسازی روزانهی پنل است وdrop_to_winوheadroomخالی میشوند. سن خواندن درreading_age_hoursاست. - رصد فعال: اگر روشن باشد، کالاهای رقبای تحتنظر هر
poll_secondsثانیه (پیشفرض ۵ دقیقه) از صفحهی عمومی دیجیکالا دوباره خوانده میشوند، بدون مصرف سهمیهی درخواست پنل شما. - نمایهی رقبا: حداکثر هر یک ساعت دوباره محاسبه میشود (
synced_at). - تاریخچهی رقیب: فقط تغییرها ثبت میشوند، نه هر مشاهده؛ و پس از دورهی نگهداری پاک میشوند.
⚠️ هشدارها
Section titled “⚠️ هشدارها”📡 مسیرها
Section titled “📡 مسیرها”GET /v1/buybox — وضعیت بایباکس تنوعها فعال
Section titled “GET /v1/buybox — وضعیت بایباکس تنوعها ”وضعیت بایباکس هر تنوعی که ربات آن را خوانده است.
GET /v1/buybox?status=winnable&size=100 HTTP/1.1Host: api.seller360.irAuthorization: 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.1Host: api.seller360.irAuthorization: Bearer s360_live_...Idempotency-Key: rival-1083422-watch-onContent-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.1Host: api.seller360.irAuthorization: Bearer s360_live_...Idempotency-Key: watch-settings-2026-11-12Content-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 |
این کلید یکتا قبلا با بدنهی دیگری استفاده شده است. | خیر؛ کلید تازه بسازید. |
🔔 رویدادهای وبهوک
Section titled “🔔 رویدادهای وبهوک”همهی رویدادهای این بخش با دسترسی 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 “💻 نمونهکد: تنوعهایی که فقط حداقل قیمت مانع بردن آنهاست”curl "https://api.seller360.ir/v1/buybox?floor_blocks=1&size=100" \ -H "Authorization: Bearer $S360_API_KEY"$ch = curl_init("https://api.seller360.ir/v1/buybox?floor_blocks=1&size=100");curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("S360_API_KEY")], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 20,]);$res = json_decode(curl_exec($ch), true);foreach ($res["data"] as $b) { if ($b["live"]) { echo $b["variant_id"], " ", $b["floor_gap"], "\n"; }}import os, requests
res = requests.get( "https://api.seller360.ir/v1/buybox", params={"floor_blocks": "1", "size": 100}, headers={"Authorization": f"Bearer {os.environ['S360_API_KEY']}"}, timeout=20,).json()for b in res["data"]: if b["live"]: print(b["variant_id"], b["floor_gap"], b["win_price"]["value"])const res = await fetch('https://api.seller360.ir/v1/buybox?floor_blocks=1&size=100', { headers: { Authorization: `Bearer ${process.env.S360_API_KEY}` },})const body = await res.json()for (const b of body.data.filter((x) => x.live)) { console.log(b.variant_id, b.floor_gap)}using var http = new HttpClient();http.DefaultRequestHeaders.Add("Authorization", $"Bearer {Environment.GetEnvironmentVariable("S360_API_KEY")}");var body = await http.GetFromJsonAsync<JsonElement>( "https://api.seller360.ir/v1/buybox?floor_blocks=1&size=100");foreach (var b in body.GetProperty("data").EnumerateArray()) if (b.GetProperty("live").GetBoolean()) Console.WriteLine(b.GetProperty("variant_id").GetInt64());