Skip to main content

Promotion Operations

This document provides comprehensive documentation for all GraphQL operations available in the Main App Promotion API.

Queries​

promotion​

Get a single promotion by its slug identifier.

query GetPromotion($slug: String!, $ip: String, $userAgent: String) {
promotion(slug: $slug, ip: $ip, userAgent: $userAgent) {
id
name
description
slug
category
type
status
imageUrl
altText
backgroundColor
primaryButton {
text
action {
modal
externalUrl
internalUrl
}
}
secondaryButton {
action {
modal
externalUrl
internalUrl
}
}
seo {
title
description
socialImage
}
slider {
description
imageUrl
btnText
link
actionType
initialClickCount
}
popup {
description
imageUrl
btnText
link
actionType
layout
initialClickCount
}
videoSlider {
description
videoUrl
btnText
link
actionType
initialClickCount
}
isClaimed
isClicked
usersClaimed {
count
sampleUsers {
id
avatarUrl
}
}
remainedSecondsToOptIn
}
}

Arguments:

  • slug (String!, required): The unique slug identifier for the promotion
  • ip (String, optional): Client IP address for geo-targeting
  • userAgent (String, optional): Client user agent for device targeting

Returns: Promotion or null if not found

Access: Public (optional authentication)


promotions​

Get a paginated list of promotions with filtering and sorting options.

query GetPromotions(
$category: PromotionCategory
$type: PromotionType
$limit: Int
$offset: Int
$order: SortOrder
$orderBy: PromotionOrderBy
$ip: String
$userAgent: String
) {
promotions(
category: $category
type: $type
limit: $limit
offset: $offset
order: $order
orderBy: $orderBy
ip: $ip
userAgent: $userAgent
) {
count
data {
id
name
description
slug
category
type
imageUrl
primaryButton {
text
action {
modal
}
}
isClaimed
isClicked
}
limit
offset
}
}

Arguments:

  • category (PromotionCategory, optional): Filter by promotion category (CASINO, SPORTS, GENERAL)
  • type (PromotionType, optional): Filter by promotion type (SMALL, BIG)
  • limit (Int, optional): Maximum number of results (default: 10)
  • offset (Int, optional): Number of results to skip (default: 0)
  • order (SortOrder, optional): Sort order (ASC, DESC)
  • orderBy (PromotionOrderBy, optional): Sort field (CREATED_AT, UPDATED_AT, NAME)
  • ip (String, optional): Client IP for geo-targeting
  • userAgent (String, optional): Client user agent for device targeting

Returns: PromotionPaginationResponse

Access: Public (optional authentication)


sliders​

Get a paginated list of slider content with category filtering.

query GetSliders(
$category: PromotionCategory
$sliderCategory: SliderCategory
$limit: Int
$offset: Int
$order: SortOrder
$ip: String
$userAgent: String
) {
sliders(
category: $category
sliderCategory: $sliderCategory
limit: $limit
offset: $offset
order: $order
ip: $ip
userAgent: $userAgent
) {
count
data {
id
description
slug
category
type
slider {
description
imageUrl
btnText
link
actionType
initialClickCount
}
primaryButton {
text
action {
modal
}
}
isClaimed
isClicked
}
limit
offset
}
}

Arguments:

  • category (PromotionCategory, optional): Filter by promotion category
  • sliderCategory (SliderCategory, optional): Filter by slider category (HOME_PAGE, CASINO_LOBBY, etc.)
  • limit (Int, optional): Maximum number of results
  • offset (Int, optional): Number of results to skip
  • order (SortOrder, optional): Sort order
  • ip (String, optional): Client IP for geo-targeting
  • userAgent (String, optional): Client user agent for device targeting

Returns: PromotionPaginationResponse

Access: Public (optional authentication)


popups​

Get a paginated list of popup content with category filtering.

query GetPopups(
$category: PromotionCategory
$popupCategory: PopupCategory
$limit: Int
$offset: Int
$order: SortOrder
$ip: String
$userAgent: String
) {
popups(
category: $category
popupCategory: $popupCategory
limit: $limit
offset: $offset
order: $order
ip: $ip
userAgent: $userAgent
) {
count
data {
id
description
slug
category
type
popup {
description
imageUrl
btnText
link
actionType
layout
initialClickCount
}
primaryButton {
text
action {
modal
}
}
isClaimed
isClicked
}
limit
offset
}
}

Arguments:

  • category (PromotionCategory, optional): Filter by promotion category
  • popupCategory (PopupCategory, optional): Filter by popup category (POPUP, NOTIFICATION, etc.)
  • limit (Int, optional): Maximum number of results
  • offset (Int, optional): Number of results to skip
  • order (SortOrder, optional): Sort order
  • ip (String, optional): Client IP for geo-targeting
  • userAgent (String, optional): Client user agent for device targeting

Returns: PromotionPaginationResponse

Access: Public (optional authentication)


videoSliders​

Get a paginated list of video slider content with category filtering.

query GetVideoSliders(
$category: PromotionCategory
$videoSliderCategory: VideoSliderCategory
$limit: Int
$offset: Int
$order: SortOrder
$ip: String
$userAgent: String
) {
videoSliders(
category: $category
videoSliderCategory: $videoSliderCategory
limit: $limit
offset: $offset
order: $order
ip: $ip
userAgent: $userAgent
) {
count
data {
id
description
slug
category
type
videoSlider {
description
videoUrl
btnText
link
actionType
initialClickCount
}
primaryButton {
text
action {
modal
}
}
isClaimed
isClicked
}
limit
offset
}
}

Arguments:

  • category (PromotionCategory, optional): Filter by promotion category
  • videoSliderCategory (VideoSliderCategory, optional): Filter by video slider category (CASINO_EXPLORE, SPORTS_HIGHLIGHT, etc.)
  • limit (Int, optional): Maximum number of results
  • offset (Int, optional): Number of results to skip
  • order (SortOrder, optional): Sort order
  • ip (String, optional): Client IP for geo-targeting
  • userAgent (String, optional): Client user agent for device targeting

Returns: PromotionPaginationResponse

Access: Public (optional authentication)

Mutations​

claimBonus​

Claim a bonus associated with a promotion.

mutation ClaimBonus($bonusId: String!) {
claimBonus(bonusId: $bonusId)
}

Arguments:

  • bonusId (String!, required): The ID of the bonus to claim

Returns: Boolean - Success status

Access: Authenticated users only

Requirements:

  • User must be authenticated
  • User must be migrated to new system
  • Bonus must be available and valid

increasePromotionClicks (Deprecated)​

Track promotion clicks for analytics.

mutation IncreasePromotionClicks($id: String!) {
increasePromotionClicks(id: $id)
}

Arguments:

  • id (String!, required): The promotion ID

Returns: Boolean - Success status

Access: Authenticated users only

Status: Deprecated - Use BigQuery events instead

Error Handling​

Common Errors​

PROMOTION_NOT_FOUND

{
"message": "Promotion not found",
"code": "PROMOTION_NOT_FOUND"
}

ACCESS_DENIED

{
"message": "Access denied due to policy restrictions",
"code": "ACCESS_DENIED"
}

AUTHENTICATION_REQUIRED

{
"message": "Authentication required for this operation",
"code": "AUTHENTICATION_REQUIRED"
}

BONUS_CLAIM_FAILED

{
"message": "Bonus claim failed: already claimed",
"code": "BONUS_CLAIM_FAILED"
}

Usage Examples​

Basic Promotion Listing​

query {
promotions(limit: 10, category: CASINO) {
count
data {
id
name
description
imageUrl
primaryButton {
text
}
}
}
}

Slider Content for Homepage​

query {
sliders(sliderCategory: HOME_PAGE, limit: 5) {
data {
id
slider {
imageUrl
btnText
actionType
}
}
}
}
query {
popups(popupCategory: POPUP, limit: 3) {
data {
id
popup {
layout
imageUrl
actionType
}
}
}
}

Video Content for Casino​

query {
videoSliders(videoSliderCategory: CASINO_EXPLORE, limit: 4) {
data {
id
videoSlider {
videoUrl
btnText
actionType
}
}
}
}