ادگیمز · برای کسب‌وکارها

بازی‌های ادگیمز در سایت و اپلیکیشن شما

ادگیمز بازی‌های کوتاه و رقابتی خود را به‌صورت سرویس در اختیار کسب‌وکارها قرار می‌دهد. بازی‌ها روی سرورهای ادگیمز اجرا و امتیازدهی می‌شوند و شما آن‌ها را با یک iframe در صفحه خود به کاربرانتان نمایش می‌دهید.

نمایشiframe در سایت یا اپلیکیشن شما، برای موبایل و دسکتاپ
کاربرانکاربران سیستم خودتان، با شناسه‌ای که خودتان دارید. اطلاعات شخصی لازم نیست.
رتبه‌بندیجدول اختصاصی هر بازی برای کاربران شما، در دوره‌های کلی، هفتگی و ماهانه
امتیازدهیروی سرور ادگیمز؛ از سمت مرورگر قابل تغییر نیست
هزینهپس‌پرداخت ماهانه، فقط برای بازی‌هایی که دست‌کم ۳۰ ثانیه انجام شده‌اند

نمونه زنده

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

کاربر
بازی
🎮بازی اینجا باز می‌شود
برترین‌ها
بهترین امتیازها

راهنمای فنی

اتصال در شش قدم. قدم‌های «سرور» روی سرور شما اجرا می‌شوند و کلید API را لازم دارند؛ قدم‌های «صفحه» در مرورگر کاربر. جزئیات هر درخواست در API Reference آمده است.

۱کلید API بگیرید

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

export ADGAMES_KEY="agk_..."
export API="https://api.adgames.ir/partner/v1"
۲کاربر را ثبت کنیدسرور · PUT /players/{externalId}

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

curl -X PUT "$API/players/user-1" \
  -H "X-Api-Key: $ADGAMES_KEY" \
  -H "Content-Type: application/json" \
  -d '{"displayName": "سارا"}'
۳لینک بازی بسازیدسرور · POST /sessions

هر بار که کاربر می‌خواهد بازی کند، یک لینک بسازید و playUrl را به صفحه بفرستید. لینک یک بار باز می‌شود و ۱۰ دقیقه اعتبار دارد.

curl -X POST "$API/sessions" \
  -H "X-Api-Key: $ADGAMES_KEY" \
  -H "Content-Type: application/json" \
  -d '{"externalId": "user-1", "gameId": "GAME_ID"}'

# → {"sessionId": "…", "playUrl": "https://adgames.ir/embed/play?t=…", "expiresAt": "…"}
۴بازی را نمایش دهیدصفحه · HTML

playUrl را در یک iframe بگذارید.

<iframe src="PLAY_URL" style="width:100%; aspect-ratio:9/16; border:0" allow="autoplay"></iframe>
۵نتیجه را دریافت کنیدصفحه · JavaScript · رویدادها

پس از پایان بازی، iframe نتیجه را با postMessage به صفحه شما اعلام می‌کند. امتیاز پیش از این روی سرور ما ثبت شده است.

window.addEventListener('message', (e) => {
  if (e.origin !== 'https://adgames.ir') return;
  if (e.data.type === 'ADGAMES_RESULT') {
    // { sessionId, score, playedMs, billable }
  }
});
۶جدول رتبه‌بندی را بخوانیدسرور · GET /leaderboards/{gameId}

دوره را با period انتخاب کنید (all، هفته یا ماه، از GET /periods). با externalId رتبه همان کاربر هم برمی‌گردد.

curl "$API/leaderboards/GAME_ID?period=all&limit=10&externalId=user-1" \
  -H "X-Api-Key: $ADGAMES_KEY"

API Reference

کلیات

Base URLhttps://api.adgames.ir/partner/v1
Authenticationکلید را در هدر X-Api-Key بفرستید. همه درخواست‌ها باید از سرور شما ارسال شوند، نه از مرورگر.
Request bodyJSON، با هدر Content-Type: application/json
Responseهمیشه JSON. همه شناسه‌ها string هستند.
TimeUTC با فرمت ISO 8601 (RFC 3339)، مثل 2026-11-03T10:20:00Z. ممکن است کسر ثانیه داشته باشد (…:00.123456789Z)؛ parser شما باید آن را بپذیرد. مدت‌ها به میلی‌ثانیه.
Monthماه شمسی با فرمت YYYY-MM، مثل 1405-08 برای آبان ۱۴۰۵ (وقت تهران)، از 1405-01 تا ماه جاری
Idempotencyهدر اختیاری Idempotency-Key برای POST و PUT. اگر درخواست را با همان مقدار و همان body تکرار کنید، همان پاسخ قبلی (تا ۲۴ ساعت) برمی‌گردد و عملیات دوباره انجام نمی‌شود. پاسخ 429 نگه داشته نمی‌شود، پس پس از انتظار می‌توانید با همان مقدار دوباره بفرستید. همان مقدار با body دیگر: 409 IDEMPOTENCY_CONFLICT.
Errorsکد وضعیت HTTP به همراه {"code": "...", "message": "..."}. فهرست کامل در خطاها.
Rate limitپیش‌فرض ۱۲۰ درخواست و ۳۰ POST /sessions در دقیقه برای هر کلید. بیش از آن: 429 RATE_LIMITED با هدر Retry-After (ثانیه).
Errors on every endpoint401 UNAUTHORIZED (کلید نادرست) و 429 RATE_LIMITED. در هر endpoint فقط خطاهای خاص همان endpoint آمده است.
Test key only503 SANDBOX_UNAVAILABLE: نمونهٔ آزمایشی چند لحظه در دسترس نیست، کمی بعد دوباره تلاش کنید. 410 SANDBOX_ENDED: این کلید آزمایشی تمام شده، کلید تازه بگیرید. کلید واقعی هیچ‌وقت این دو را نمی‌گیرد.

در همه مثال‌ها کلید در متغیر $ADGAMES_KEY است:

export ADGAMES_KEY="agk_..."
export API="https://api.adgames.ir/partner/v1"

Endpoints

GET/gamesبازی‌های فعال روی کلید شما
PUT/players/{externalId}ثبت کاربر یا تغییر نام نمایشی
POST/sessionsساخت لینک بازی
GET/periodsدوره‌های جدول رتبه‌بندی
GET/leaderboards/{gameId}جدول رتبه‌بندی یک بازی
GET/players/{externalId}/recordsبهترین امتیاز کاربر در هر بازی
GET/playsریز بازی‌های تمام‌شده یک ماه
GET/statements/{month}صورت‌حساب یک ماه
GET/usage/{month}آمار یک ماه به تفکیک بازی و روز

GET/games

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

چه زمانی: هنگام ساخت صفحه بازی‌ها در سایت خود، یا هر بار که می‌خواهید فهرست را به‌روز کنید. نتیجه را می‌توانید چند ساعت cache کنید.

پارامترها

ندارد.

درخواست
curl "$API/games" \
  -H "X-Api-Key: $ADGAMES_KEY"
پاسخ 200 OK
{
  "games": [
    {
      "id": "6aea1559b1079f24e6abb33e",
      "name": "Snake",
      "title": "مار",
      "description": "نقطه‌ها را بخور و به دیوار یا به خودت نزن.",
      "thumbnailUrl": "https://adgames.ir/games/snake/thumbnail.svg",
      "durationSeconds": 60
    }
  ]
}
فیلدهای پاسخ
FieldTypeتوضیح
games[].idstringشناسه بازی. در POST /sessions و GET /leaderboards به کار می‌رود.
games[].namestringنام انگلیسی و ثابت بازی، برای کد شما
games[].titlestringنام فارسی بازی، برای نمایش به کاربر
games[].descriptionstringتوضیح کوتاه بازی، برای نمایش به کاربر
games[].thumbnailUrlstringآدرس تصویر بازی. ممکن است خالی باشد.
games[].durationSecondsintمدت یک دور بازی به ثانیه. برای هر بازی متفاوت است.
خطاها
401 UNAUTHORIZEDکلید ارسال نشده، نادرست است یا غیرفعال شده
429 RATE_LIMITEDاز سقف درخواست در دقیقه عبور کرده‌اید

PUT/players/{externalId}

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

چه زمانی: وقتی کاربر برای اولین بار به بخش بازی می‌آید، یا وقتی نامش را در سایت شما تغییر می‌دهد. این درخواست اختیاری است، چون POST /sessions هم کاربر را خودکار ثبت می‌کند.

پارامترها
NameInTypeRequiredتوضیح
externalIdpathstringyesشناسه کاربر در سیستم شما. ۱ تا ۱۲۸ کاراکتر از A-Z a-z 0-9 _ . : @ -. برای یک کاربر همیشه همان مقدار را بفرستید. شماره تلفن یا ایمیل نفرستید.
displayNamebodystringnoنامی که در جدول رتبه‌بندی نمایش داده می‌شود. حداکثر ۴۰ کاراکتر؛ بیشتر از آن بریده می‌شود. اگر خالی باشد، نام فعلی تغییر نمی‌کند. کاربر جدید بدون نام، با externalId نمایش داده می‌شود.
درخواست
curl -X PUT "$API/players/user-42" \
  -H "X-Api-Key: $ADGAMES_KEY" \
  -H "Content-Type: application/json" \
  -d '{"displayName": "Sara"}'
پاسخ 200 OK
{
  "externalId": "user-42",
  "displayName": "Sara",
  "createdAt": "2026-11-03T10:00:00Z",
  "updatedAt": "2026-11-03T10:05:00Z"
}
فیلدهای پاسخ
FieldTypeتوضیح
externalIdstringهمان شناسه‌ای که فرستادید
displayNamestringنام نمایشی فعلی کاربر
createdAttimeزمان اولین ثبت کاربر
updatedAttimeزمان آخرین تغییر
خطاها
400 INVALID_INPUTexternalId خالی است، بیش از ۱۲۸ کاراکتر است یا کاراکتر غیرمجاز دارد
401 UNAUTHORIZEDکلید نادرست است
429 RATE_LIMITEDاز سقف درخواست در دقیقه عبور کرده‌اید

POST/sessions

یک بازی برای یک کاربر می‌سازد و لینک آن (playUrl) را برمی‌گرداند. این لینک را در iframe صفحه خود نشان دهید.

چه زمانی: هر بار که کاربر روی «بازی» می‌زند. برای هر بازی یک session تازه بسازید؛ لینک قبلی را دوباره به کار نبرید.

پارامترها
NameInTypeRequiredتوضیح
externalIdbodystringyesشناسه کاربر در سیستم شما، با همان قواعد PUT /players. اگر ثبت نشده باشد، خودکار ثبت می‌شود.
gameIdbodystringyesid یکی از بازی‌های GET /games
displayNamebodystringnoاگر بفرستید، نام نمایشی کاربر هم به‌روز می‌شود
درخواست
curl -X POST "$API/sessions" \
  -H "X-Api-Key: $ADGAMES_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 3f1c2a9e-5b7d-4c11-9a3e-2b8f6d0e7a41" \
  -d '{"externalId": "user-42", "gameId": "6aea1559b1079f24e6abb33e", "displayName": "Sara"}'
پاسخ 201 Created
{
  "sessionId": "6aea158c3d97053dda240b08",
  "playUrl": "https://adgames.ir/embed/play?t=6aea158c3d97053dda240b08.1793726436.GanLKX…",
  "expiresAt": "2026-11-03T10:20:00Z"
}
فیلدهای پاسخ
FieldTypeتوضیح
sessionIdstringشناسه این بازی. آن را نگه دارید؛ در رویدادهای iframe، وب‌هوک و GET /plays همین شناسه برمی‌گردد.
playUrlstringلینکی که در iframe قرار می‌گیرد. فقط یک بار باز می‌شود. آن را ذخیره نکنید.
expiresAttimeتا این زمان (۱۰ دقیقه) باید لینک باز شود. لینکی که باز شد تا پایان همان بازی کار می‌کند، حتی اگر این زمان بگذرد.
خطاها
400 INVALID_INPUTexternalId یا gameId ارسال نشده یا فرمت externalId نادرست است
400 INVALID_IDgameId شناسه معتبری نیست
400 GAME_INACTIVEبازی موقتاً غیرفعال است
403 FORBIDDENاین بازی روی کلید شما فعال نیست
404 GAME_NOT_FOUNDاین بازی دیگر وجود ندارد
429 RATE_LIMITEDاز سقف ساخت بازی در دقیقه یا سقف روزانه عبور کرده‌اید. Retry-After می‌گوید چند ثانیه صبر کنید (سقف روزانه: تا نیمه‌شب تهران).

GET/periods

دوره‌هایی که جدول رتبه‌بندی می‌پذیرد: کلی، هفته جاری، هفته قبل، ماه جاری و ۷ ماه قبل.

چه زمانی: پیش از GET /leaderboards، برای ساختن انتخابگر دوره. مقدار key را از همین پاسخ بردارید و خودتان نسازید.

پارامترها

ندارد.

درخواست
curl "$API/periods" \
  -H "X-Api-Key: $ADGAMES_KEY"
پاسخ 200 OK
{
  "periods": [
    {"key": "all",          "kind": "all"},
    {"key": "w:2026-10-31", "kind": "week"},
    {"key": "w:2026-10-24", "kind": "week"},
    {"key": "m:1405-08",    "kind": "month"},
    {"key": "m:1405-07",    "kind": "month"},
    …
  ],
  "currentMonth": "1405-08"
}
فیلدهای پاسخ
FieldTypeتوضیح
periods[].keystringمقداری که در period جدول رتبه‌بندی می‌فرستید. all: کلی. w:YYYY-MM-DD: هفته‌ای که از این شنبه (تاریخ میلادی، وقت تهران) شروع می‌شود. m:YYYY-MM: ماه شمسی.
periods[].kindstringall، week یا month
currentMonthstringماه شمسی جاری، برای /plays، /statements و /usage
خطاها
401 UNAUTHORIZEDکلید نادرست است

GET/leaderboards/{gameId}

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

چه زمانی: برای نمایش جدول در سایت شما، مثلاً بعد از پایان هر بازی. ترتیب: امتیاز بیشتر بالاتر؛ در امتیاز برابر، کسی که زودتر به آن رسیده بالاتر است.

پارامترها
NameInTypeRequiredتوضیح
gameIdpathstringyesشناسه بازی
periodquerystringnoیکی از keyهای GET /periods. پیش‌فرض: all
pagequeryintnoشماره صفحه، از ۱. پیش‌فرض: ۱
limitqueryintnoتعداد ردیف در هر صفحه، ۱ تا ۵۰. پیش‌فرض و مقدار خارج از این بازه: ۲۰
externalIdquerystringnoاگر بفرستید، ردیف همین کاربر در فیلد me برمی‌گردد، حتی اگر در این صفحه نباشد
درخواست
curl "$API/leaderboards/6aea1559b1079f24e6abb33e?period=all&page=1&limit=10&externalId=user-42" \
  -H "X-Api-Key: $ADGAMES_KEY"
پاسخ 200 OK
{
  "gameId": "6aea1559b1079f24e6abb33e",
  "period": "all",
  "total": 128,
  "page": 1,
  "limit": 10,
  "items": [
    {"rank": 1, "externalId": "user-7",  "displayName": "Ali",  "score": 214, "at": "2026-11-02T18:40:11Z"},
    {"rank": 2, "externalId": "user-19", "displayName": "Mina", "score": 180, "at": "2026-11-01T09:12:03Z"}
  ],
  "me": {"rank": 31, "externalId": "user-42", "displayName": "Sara", "score": 96, "at": "2026-11-03T10:12:40Z"}
}
فیلدهای پاسخ
FieldTypeتوضیح
gameId، periodstringهمان مقدارهایی که درخواست شد
totalintتعداد کل کاربران این جدول؛ برای ساختن صفحه‌بندی
page، limitintصفحه و اندازه صفحه‌ای که برگشت
items[].rankintرتبه، از ۱
items[].externalIdstringشناسه کاربر در سیستم شما
items[].displayNamestringنام نمایشی کاربر
items[].scoreintبهترین امتیاز کاربر در این دوره
items[].attimeزمانی که این امتیاز ثبت شد
meobject?ردیف کاربر externalId، با همان فیلدها. اگر کاربر در این دوره امتیازی نداشته باشد، در پاسخ نیست.
خطاها
400 INVALID_INPUTperiod در فهرست GET /periods نیست
400 INVALID_IDgameId شناسه معتبری نیست
400 GAME_INACTIVEبازی موقتاً غیرفعال است
403 FORBIDDENاین بازی روی کلید شما فعال نیست
404 GAME_NOT_FOUNDاین بازی دیگر وجود ندارد

GET/players/{externalId}/records

بهترین امتیاز همیشگی یک کاربر در هر بازی که انجام داده است.

چه زمانی: برای صفحه پروفایل کاربر در سایت شما.

پارامترها
NameInTypeRequiredتوضیح
externalIdpathstringyesشناسه کاربر در سیستم شما
درخواست
curl "$API/players/user-42/records" \
  -H "X-Api-Key: $ADGAMES_KEY"
پاسخ 200 OK
{
  "records": [
    {"gameId": "6aea1559b1079f24e6abb33e", "score": 96,  "at": "2026-11-03T10:12:40Z"},
    {"gameId": "6aea1559b1079f24e6abb341", "score": 412, "at": "2026-10-28T16:02:19Z"}
  ]
}
فیلدهای پاسخ
FieldTypeتوضیح
records[].gameIdstringشناسه بازی
records[].scoreintبهترین امتیاز کاربر در این بازی
records[].attimeزمان ثبت این امتیاز

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

خطاها
404 USER_NOT_FOUNDکاربری با این شناسه ثبت نشده است

GET/plays

همه بازی‌های تمام‌شده یک ماه، از قدیمی به جدید. صورت‌حساب از همین ردیف‌ها ساخته می‌شود.

چه زمانی: برای نگه داشتن نسخه خودتان از بازی‌ها، بررسی صورت‌حساب، یا جایزه دادن بر اساس داده سرور. ردیف یک بازی تمام‌شده دیگر تغییر نمی‌کند.

پارامترها
NameInTypeRequiredتوضیح
monthquerystringnoماه شمسی YYYY-MM. پیش‌فرض: ماه جاری
limitqueryintnoتعداد ردیف، ۱ تا ۵۰۰. پیش‌فرض و مقدار خارج از این بازه: ۱۰۰
afterquerystringnoبرای صفحه بعد: مقدار next پاسخ قبلی. برای صفحه اول نفرستید.
درخواست
# first page
curl "$API/plays?month=1405-08&limit=500" \
  -H "X-Api-Key: $ADGAMES_KEY"

# next page: pass the "next" value of the previous answer
curl "$API/plays?month=1405-08&limit=500&after=6aea158c3d97053dda240b08" \
  -H "X-Api-Key: $ADGAMES_KEY"
پاسخ 200 OK
{
  "month": "1405-08",
  "items": [
    {
      "sessionId": "6aea158c3d97053dda240b08",
      "externalId": "user-42",
      "gameId": "6aea1559b1079f24e6abb33e",
      "status": "submitted",
      "createdAt": "2026-11-03T10:10:36Z",
      "startedAt": "2026-11-03T10:10:41Z",
      "roundStartedAt": "2026-11-03T10:10:49Z",
      "endedAt": "2026-11-03T10:11:49Z",
      "playedMs": 60012,
      "score": 96,
      "billable": true,
      "month": "1405-08"
    }
  ],
  "next": "6aea158c3d97053dda240b0f"
}
فیلدهای پاسخ
FieldTypeتوضیح
monthstringماهی که درخواست شد
items[].sessionIdstringشناسه بازی، همان که POST /sessions داد
items[].externalIdstringشناسه کاربر در سیستم شما
items[].gameIdstringشناسه بازی
items[].statusstringsubmitted: بازی تمام شد و امتیاز ثبت شد. abandoned: کاربر صفحه را بست. expired: نتیجه در زمان مجاز نرسید یا پذیرفته نشد (امتیاز ۰).
items[].createdAttimeزمان POST /sessions
items[].startedAttime?زمانی که بازی در iframe بارگذاری شد. اگر لینک باز نشده باشد، نیست.
items[].roundStartedAttime?زمانی که کاربر راهنما را بست و بازی شروع شد. اگر بازی شروع نشده باشد، نیست.
items[].endedAttimeزمان پایان بازی
items[].playedMsintمدت بازی به میلی‌ثانیه: endedAt − roundStartedAt، با ساعت سرور ادگیمز
items[].scoreintامتیاز تأییدشده روی سرور
items[].billablebooltrue اگر playedMs دست‌کم ۳۰۰۰۰ باشد؛ یعنی در صورت‌حساب حساب می‌شود
items[].monthstringماه شمسی پایان بازی؛ همان ماه صورت‌حساب
nextstringنشانگر صفحه بعد؛ مقدار آن را تفسیر نکنید و همان را در after بفرستید (شناسه بازی نیست). اگر خالی باشد، صفحه آخر است.
خطاها
400 INVALID_INPUTmonth فرمت YYYY-MM ندارد یا after نامعتبر است

GET/statements/{month}

صورت‌حساب یک ماه: تعداد بازی‌ها، تعداد بازی‌های قابل محاسبه و digest برای تطبیق.

چه زمانی: پایان هر ماه، برای مقایسه با صورت‌حسابی که از ما دریافت می‌کنید.

پارامترها
NameInTypeRequiredتوضیح
monthpathstringyesماه شمسی YYYY-MM
درخواست
curl "$API/statements/1405-08" \
  -H "X-Api-Key: $ADGAMES_KEY"
پاسخ 200 OK
{
  "month": "1405-08",
  "plays": 1840,
  "billable": 1712,
  "playedMs": 98455120,
  "perGame": [
    {"gameId": "6aea1559b1079f24e6abb33e", "plays": 1022, "billable": 951, "playedMs": 55120344}
  ],
  "digest": "9f2c51d0a7…e41a",
  "generatedAt": "2026-11-03T10:30:00Z"
}
فیلدهای پاسخ
FieldTypeتوضیح
monthstringماهی که درخواست شد
playsintتعداد همه بازی‌های تمام‌شده در این ماه
billableintتعداد بازی‌های قابل محاسبه (دست‌کم ۳۰ ثانیه)؛ مبنای صورت‌حساب
playedMsintمجموع مدت بازی‌ها به میلی‌ثانیه
perGame[]arrayهمین سه عدد برای هر بازی، با gameId
digeststringهش SHA-256 شناسه‌های بازی‌های قابل محاسبه. روش ساخت در صورت‌حساب.
generatedAttimeزمان ساخت. پاسخ حداکثر ۵ دقیقه cache می‌شود.
خطاها
400 INVALID_INPUTmonth فرمت YYYY-MM ندارد

GET/usage/{month}

خلاصه آمار یک ماه به تفکیک بازی و روز.

چه زمانی: برای داشبورد داخلی شما. سریع است و هر چند بار که بخواهید می‌توانید بخوانید. برای صورت‌حساب از /statements استفاده کنید.

پارامترها
NameInTypeRequiredتوضیح
monthpathstringyesماه شمسی YYYY-MM
درخواست
curl "$API/usage/1405-08" \
  -H "X-Api-Key: $ADGAMES_KEY"
پاسخ 200 OK
{
  "month": "1405-08",
  "plays": 1840,
  "billable": 1712,
  "playedMs": 98455120,
  "perGame": [{"gameId": "6aea1559b1079f24e6abb33e", "plays": 1022, "billable": 951, "playedMs": 55120344}],
  "perDay":  [{"day": "1405-08-12", "plays": 74, "billable": 70}]
}
فیلدهای پاسخ
FieldTypeتوضیح
plays، billable، playedMsintمثل /statements
perGame[]arrayآمار هر بازی
perDay[].daystringروز شمسی YYYY-MM-DD (وقت تهران)
perDay[].plays، perDay[].billableintتعداد بازی‌ها و بازی‌های قابل محاسبه در آن روز
خطاها
400 INVALID_INPUTmonth فرمت YYYY-MM ندارد

نمایش بازی در صفحه شما

playUrl را در یک iframe قرار دهید. بازی‌ها برای موبایل طراحی شده‌اند؛ iframe تمام‌عرض با نسبت ۹ به ۱۶ بهترین نتیجه را می‌دهد. اگر دامنه‌های سایت شما روی کلید ثبت شده باشد، بازی فقط در همان دامنه‌ها نمایش داده می‌شود؛ اگر دامنه‌ای ثبت نشده باشد، هر سایتی می‌تواند آن را نمایش دهد. دامنه‌های خود را هنگام دریافت کلید به ما اعلام کنید.

<iframe id="adgames" src="PLAY_URL" allow="autoplay"
        style="width:100%;aspect-ratio:9/16;max-height:100vh;border:0;border-radius:16px"></iframe>
<script>
  window.addEventListener('message', (e) => {
    if (e.origin !== 'https://adgames.ir') return;
    const m = e.data || {};
    if (m.type === 'ADGAMES_RESULT') {
      // { sessionId, score, billable, playedMs } — refresh your board here.
      // For anything that matters (rewards), trust your server: the webhook or GET /plays.
    }
  });
</script>
رویداددادهزمان ارسال
ADGAMES_READYsessionId, gameIdلینک پذیرفته شد و بارگذاری بازی شروع شد
ADGAMES_ROUND_STARTEDsessionIdکاربر راهنما را بست و زمان بازی شروع شد
ADGAMES_RESULTsessionId, score, billable, playedMsبازی تمام شد و امتیاز روی سرور ثبت شد
ADGAMES_ERRORcodeبازی اجرا نشد. code: INVALID_TOKEN، TOKEN_EXPIRED و SESSION_ALREADY_SUBMITTED (لینک نامعتبر، منقضی یا قبلاً باز شده)، GAME_ERROR (بازی خطا داد)، کد هر خطای دیگر API، یا خالی (خطای شبکه)

وب‌هوک

اگر آدرس وب‌هوک داشته باشید، پایان هر بازی با یک درخواست POST به سرور شما اعلام می‌شود. این درخواست فقط یک بار ارسال می‌شود. اگر سرور شما در دسترس نبود، همان اطلاعات را از GET /plays بخوانید.

برای اطمینان از اینکه درخواست از طرف ادگیمز است، امضای هدر X-AdGames-Signature را بررسی کنید: hex(HMAC-SHA256(webhookSecret, body)).

body درخواست:

{"event": "play.completed", "sessionId": "6aea158c…", "externalId": "user-42", "gameId": "6aea1559…",
 "status": "submitted", "score": 96, "billable": true, "playedMs": 60012,
 "endedAt": "2026-11-03T10:11:49Z", "month": "1405-08"}

بررسی امضا (body را دقیقاً همان‌طور که رسیده در فایل body.json ذخیره کنید):

openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" -r body.json | cut -d' ' -f1
# this hex value must equal the X-AdGames-Signature header

صورت‌حساب

ساختن digest از روی GET /plays (نیاز به jq):

برای یک ماه تمام‌شده اجرا کنید؛ ماه جاری هنوز تغییر می‌کند.

MONTH=1405-07; AFTER=""; : > billable.txt
while :; do
  PAGE=$(curl -sf "$API/plays?month=$MONTH&limit=500&after=$AFTER" -H "X-Api-Key: $ADGAMES_KEY") || exit 1
  echo "$PAGE" | jq -r '.items[] | select(.billable) | .sessionId' >> billable.txt
  AFTER=$(echo "$PAGE" | jq -r '.next // ""')
  [ -z "$AFTER" ] && break
done
sha256sum billable.txt
# equals "digest" of: curl "$API/statements/$MONTH" -H "X-Api-Key: $ADGAMES_KEY"

خطاها

هر خطا یک کد وضعیت HTTP و یک body با این شکل دارد. در کد خود بر اساس code تصمیم بگیرید؛ message فقط برای log است و ممکن است تغییر کند.

HTTP/1.1 403 Forbidden
{"code": "FORBIDDEN", "message": "this game is not enabled for your key"}
HTTPcodeعلتچه باید کرد
400INVALID_INPUTbody یا پارامتر نادرست است (مثلاً externalId یا month با فرمت اشتباه)درخواست را اصلاح کنید
400INVALID_IDgameId شناسه معتبری نیستid را از GET /games بردارید
400GAME_INACTIVEبازی موقتاً غیرفعال استبعداً دوباره تلاش کنید یا بازی دیگری نشان دهید
401UNAUTHORIZEDکلید ارسال نشده، نادرست است یا غیرفعال شدهکلید را بررسی کنید یا با ما تماس بگیرید
403FORBIDDENاین بازی روی کلید شما فعال نیستفقط بازی‌های GET /games را به کار ببرید
404USER_NOT_FOUNDکاربری با این externalId ثبت نشدهابتدا PUT /players یا POST /sessions
404GAME_NOT_FOUNDبازی دیگر وجود نداردGET /games را دوباره بخوانید
404NOT_FOUNDچنین endpointی وجود نداردمسیر و متد را بررسی کنید
409IDEMPOTENCY_CONFLICTهمان Idempotency-Key با body دیگری فرستاده شدهبرای هر درخواست تازه، کلید تازه بسازید
429RATE_LIMITEDسقف درخواست در دقیقه، سقف POST /sessions در دقیقه یا سقف روزانهپس از Retry-After ثانیه دوباره بفرستید
5xxINTERNAL_ERRORخطای سرور ادگیمزبا همان Idempotency-Key دوباره بفرستید

محدودیت‌ها

موردپیش‌فرض
درخواست در دقیقه، برای هر کلید۱۲۰
POST /sessions در دقیقه۳۰
لینک بازی در روزبدون سقف، مگر اینکه برای کلید شما تعیین شده باشد. شمارش: هر POST /sessions در روز شمسی (وقت تهران)
اعتبار playUrl۱۰ دقیقه، یک بار باز شدن

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

پرسش‌های رایج

بازی‌ها چقدر طول می‌کشند؟

بازی‌ها کوتاه هستند و مدت هر کدام متفاوت است. مدت هر بازی در durationSeconds از GET /games آمده است.

آیا کاربر می‌تواند امتیاز را دست‌کاری کند؟

خیر. حرکت‌های بازی روی سرور ادگیمز بررسی و امتیاز همان‌جا محاسبه می‌شود.

اگر کاربر وسط بازی صفحه را ببندد چه می‌شود؟

بازی با مدتی که انجام شده ثبت می‌شود. اگر این مدت کمتر از ۳۰ ثانیه باشد، در صورت‌حساب محاسبه نمی‌شود.

آیا بازی‌ها در اپلیکیشن موبایل هم کار می‌کنند؟

بله. هر WebView یا مرورگری که iframe را پشتیبانی کند کافی است.

بازی‌ها تبلیغ دارند؟

خیر. در بازی‌هایی که از این راه نمایش می‌دهید تبلیغی پخش نمی‌شود.