Prosper

    Unified Operator Integration Guide

    The operator-facing integration contract for the Prosper Aggregator. Integrate once — every supported game vendor, one API, one wallet, one promotions engine.

    Final integration contract22 unified routesHMAC-SHA256, signed both directionsDownload PDF

    1. Purpose and scope

    This document is the operator-facing integration contract for the Prosper Aggregator. It describes only the unified APIs that an operator uses once across all supported game vendors. Included:

    • Unified aggregator APIs under /api/v1/game-operators.
    • Unified free-spins, jackpots, and promotions APIs under /api/v1/game-operators/promotions.
    • Unified operator wallet callback API that the operator implements once for all game vendors.
    • Credential handling needed to sign requests.
    • Authentication, signing, DTOs, response envelopes, status codes, and integration checklist.

    Any API not listed in this guide is outside the operator integration contract.

    2. Base URL and unified routes

    Use these integration bases:

    NameValue
    API base URLhttps://<aggregator-host>/api/v1
    Unified operator prefix/game-operators
    Operator wallet callback baseOperator-provided callbackUrl

    Unified operator route inventory:

    MethodRoutePurposeAuth
    POST/game-operators/game/vendorsList vendors available to the operator.HMAC
    POST/game-operators/game/listList games for a vendor.HMAC
    POST/game-operators/game/urlCreate game launch URL/session.HMAC
    POST/game-operators/game/terminateTerminate a player session.HMAC
    POST/game-operators/transaction/listList operator-scoped transactions.HMAC
    POST/game-operators/transaction/detailFetch one transaction by betId.HMAC
    POST/game-operators/promotions/campaigns/createCreate or register a promotion campaign.HMAC
    POST/game-operators/promotions/campaigns/listList promotion campaigns.HMAC
    POST/game-operators/promotions/campaigns/detailGet one promotion campaign.HMAC
    POST/game-operators/promotions/campaigns/cancelCancel a promotion campaign.HMAC
    POST/game-operators/promotions/campaigns/players/addAssign players to a campaign.HMAC
    POST/game-operators/promotions/campaigns/players/removeRemove players from a campaign.HMAC
    POST/game-operators/promotions/campaigns/players/listList player campaign state.HMAC
    POST/game-operators/promotions/catalog/reward-valuesQuery reward values for campaign setup.HMAC
    POST/game-operators/promotions/reports/winnersList campaign winners.HMAC
    POST/game-operators/promotions/reports/leaderboardGet campaign leaderboard.HMAC
    POST/game-operators/promotions/reports/prizesGet campaign prizes.HMAC
    POST/game-operators/promotions/reports/detailGet campaign report detail.HMAC
    POST/game-operators/promotions/jackpots/activeList active jackpot pools.HMAC
    POST/game-operators/promotions/jackpots/winnersList jackpot winners.HMAC
    POST/game-operators/promotions/jackpots/winningsGet jackpot winnings.HMAC
    POST/game-operators/promotions/jackpots/contributionsList jackpot contribution records.HMAC

    3. Authentication and signing

    3.1 Operator to aggregator

    Unified systematic routes use API-key HMAC headers:

    HeaderRequiredValue
    Content-TypeYes for JSON bodiesapplication/json
    AcceptRecommendedapplication/json
    X-API-KeyYesPublic API key, usually pk_...
    X-SignatureYesLowercase hex HMAC-SHA256 of the canonical request payload described below.

    HMAC payload rules for JSON requests:

    • Build the JSON request body before signing.
    • Use compact UTF-8 JSON: no spaces or newlines outside string values.
    • Sign the same field names, values, and field order that are sent in the HTTP body.
    • Do not sign a pretty-printed JSON body.
    • Do not let the HTTP client mutate, reorder, or reserialize the body after signing.
    • For a route with no body, sign an empty string.

    The signature is the lowercase hexadecimal HMAC-SHA256 digest of that payload. Use the full provisioned secretKey, including the sk_ prefix, as the HMAC key when signing operator-to-aggregator calls. The game launch route requires the same HMAC validation as the other unified routes. Missing or invalid launch authentication returns an operator envelope with SC_INVALID_OPERATOR or SC_INVALID_SIGNATURE.

    3.2 Aggregator to operator wallet

    The aggregator calls the operator's configured callbackUrl with:

    HeaderRequiredValue
    Content-TypeYesapplication/json
    AcceptYesapplication/json
    X-API-KeyYesStored operator API key
    X-SignatureYesLowercase hex HMAC-SHA256 of the wallet request body.

    Wallet callback verification rules:

    • Prosper sends wallet callbacks as compact UTF-8 JSON.
    • Verify the signature against the raw HTTP request body received by the wallet endpoint.
    • If the operator framework parses the request before application code can read it, enable raw-body capture for the wallet routes.
    • Derive the wallet HMAC key by removing one leading sk_ prefix from the provisioned secretKey. If the secret has no sk_ prefix, use it unchanged.
    • The expected signature is the lowercase hexadecimal HMAC-SHA256 digest.

    The wallet callback key rule is intentionally different from operator-to-aggregator signing.

    4. Common response and error DTOs

    4.1 Operator envelope

    Most unified responses use:

    FieldTypeRequiredDescription
    traceIdUUID stringYes when request has traceIdEchoes request trace.
    statusstringYesSC_* status code.
    messagestringOftenHuman-readable message.
    dataroute-specificOn successSuccess payload.

    4.2 Validation error

    DTO validation failures return:

    FieldTypeDescription
    statusCodenumberUsually 400.
    messagestring arrayValidation messages.
    errorstringError label.

    4.3 Unauthorized error

    Authentication failures return:

    FieldTypeDescription
    statusCodenumber401.
    messagestringMissing/invalid key or signature.
    errorstringUnauthorized.

    5. Status code catalog

    CodeMeaningRetryOperator action
    SC_OKSuccess.NoContinue.
    SC_INSUFFICIENT_FUNDSWallet balance too low for debit.NoReject debit/bet.
    SC_ACCOUNT_NOT_FOUNDAccount or wallet missing.NoCheck provisioning.
    SC_USER_NOT_EXISTSPlayer username not found.NoCreate/map player before launch.
    SC_WRONG_CURRENCYPlayer lacks requested currency wallet.NoProvision currency wallet or reject.
    SC_LIMIT_REACHEDOperator-side limit blocks operation.NoSurface limit rejection.
    SC_INVALID_OPERATOROperator/API-key binding invalid.NoCheck key and operator setup.
    SC_INVALID_SIGNATUREHMAC signature mismatch.NoCheck exact payload and secret prefix rule.
    SC_INVALID_GAMEGame/vendor/play mode unavailable.NoRefresh catalog and check request.
    SC_INVALID_REQUESTInvalid business request.NoFix payload.
    SC_SYSTEM_ERRORUnexpected system error.Yes, carefullyRetry only idempotent operations.
    SC_DUPLICATE_TRANSACTIONDuplicate semantic transaction.NoUse original transaction state.
    SC_TRANSACTION_NOT_FOUNDOriginal transaction missing.NoReconcile transaction history.
    SC_TRANSACTION_NOT_EXISTSCompatibility alias.NoTreat as SC_TRANSACTION_NOT_FOUND.
    SC_PROMOTION_UNSUPPORTEDPromotion type or operation unavailable for the selected catalog scope.NoQuery reward values or change campaign setup.
    SC_PROMOTION_ALREADY_EXISTScampaignId already exists with different content.NoUse the existing campaign or create a new ID.
    SC_PROMOTION_NOT_FOUNDCampaign does not exist.NoCheck campaignId.
    SC_PROMOTION_NOT_ACTIVECampaign is not assignable.NoCheck campaign status.
    SC_PROMOTION_EXPIREDCampaign or reward validity expired.NoCreate a new campaign.
    SC_PLAYER_ALREADY_ASSIGNEDPlayer is already assigned to the campaign.NoQuery player state.
    SC_PLAYER_NOT_ASSIGNEDRemove/query operation references a non-assigned player.NoReconcile player state.
    SC_JACKPOT_UNSUPPORTEDJackpot reporting is unavailable for the selected catalog scope.NoRemove the filter or choose another supported scope.
    SC_JACKPOT_NOT_FOUNDJackpot pool does not exist or is not available to the operator.NoCheck jackpotId and catalog scope.
    SC_INVALID_TIME_RANGEReport time range is invalid or too large.NoSubmit a smaller valid range.

    Wallet status normalization:

    Input statusNormalized status
    SUCCESSSC_OK
    INSUFFICIENT_BALANCESC_INSUFFICIENT_FUNDS
    SC_TRANSACTION_NOT_EXISTSSC_TRANSACTION_NOT_FOUND

    6. Operator-implemented unified wallet API

    The operator implements this API once. The aggregator maps all supported game activity into these callbacks.

    6.1 Wallet routes

    MethodRoutePurposeRequest DTOSuccess data
    POST/wallet/balanceFetch player balance.OperatorBalanceRequestOperatorWalletBalanceData
    POST/wallet/betDebit bet amount.OperatorBetRequestOperatorWalletTransactionData
    POST/wallet/bet_resultSettle win/loss result.OperatorBetResultRequestOperatorWalletTransactionData
    POST/wallet/rollbackRefund/rollback a previous transaction.OperatorRollbackRequestOperatorWalletTransactionData
    POST/wallet/adjustmentApply reward/gift/cancel-gift adjustment.OperatorAdjustmentRequestOperatorWalletTransactionData

    6.2 Wallet request DTOs

    DTOFieldTypeRequiredNotes
    OperatorBalanceRequesttraceIdstringYesTrace from aggregator.
    OperatorBalanceRequestusernamestringYesOperator player username.
    OperatorBalanceRequestcurrencystringYesCurrency code.
    OperatorBalanceRequesttokenstringYesAggregator session token.
    OperatorBetRequesttraceIdstringYesTrace from aggregator.
    OperatorBetRequestusernamestringYesPlayer username.
    OperatorBetRequestcurrencystringYesCurrency code.
    OperatorBetRequestamountnumber/stringYesDebit amount.
    OperatorBetRequesttransactionIdstringYesWallet idempotency key.
    OperatorBetRequestroundIdstringYesRound ID.
    OperatorBetRequestgameCodestringYesGame code from catalog/launch.
    OperatorBetRequesttokenstringYesAggregator session token.
    OperatorBetResultRequestisWinbooleanYestrue credits positive amount; false records loss/no credit.
    OperatorRollbackRequestoriginalTransactionIdstringYesOriginal transaction to refund.
    OperatorAdjustmentRequestadjustmentTypeenumYesREWARD, GIFT, CANCEL_GIFT.
    OperatorAdjustmentRequestadjustmentTimestringYesTimestamp string.
    OperatorAdjustmentRequestoriginalTransactionIdstringConditionalRequired for CANCEL_GIFT.
    OperatorAdjustmentRequestdetailsobjectNoOptional metadata.

    OperatorBetResultRequest and OperatorRollbackRequest include all common transaction fields from OperatorBetRequest. OperatorAdjustmentRequest includes traceId, username, currency, amount, transactionId, adjustmentType, adjustmentTime, token, optional originalTransactionId, and optional details.

    6.3 Wallet response DTOs

    DTOFieldTypeRequiredNotes
    Any wallet responsetraceIdstringYesEcho request trace.
    Any wallet responsestatusSC_*YesBusiness status.
    Any wallet responsemessagestringNoRecommended for failures.
    OperatorBalanceResponse.datausernamestringSuccessPlayer username.
    OperatorBalanceResponse.datacurrencystringSuccessCurrency code.
    OperatorBalanceResponse.databalancenumberSuccessTotal balance.
    OperatorBalanceResponse.datacashBalancenumberRecommendedCash balance.
    OperatorBalanceResponse.databonusBalancenumberRecommendedBonus balance.
    OperatorBalanceResponse.datausedPromonumberOptionalUsually 0.
    Transaction response datatransactionIdstringSuccessWallet transaction ID.
    Transaction response databalancenumberSuccessBalance after operation.
    Transaction response datacashBalancenumberRecommendedCash after operation.
    Transaction response databonusBalancenumberRecommendedBonus after operation.
    Transaction response datausedPromonumberOptionalBonus amount consumed.

    6.4 Wallet idempotency

    • Idempotency key is transactionId.
    • Enforce uniqueness by (operatorId, transactionId).
    • Duplicate final bet, bet_result, rollback, and adjustment calls should return cached SC_OK snapshots without moving balance again.
    • Unknown rollback original should return SC_TRANSACTION_NOT_FOUND.
    • Already-rolled-back originals may return no-op SC_OK if the operator can prove the previous rollback completed.
    • The aggregator wallet client does not retry automatically, but upstream systems can replay requests, so operator wallet behavior must be idempotent.

    7. Unified aggregator API DTOs

    7.1 List vendors — /game-operators/game/vendors

    Request ListVendorsV1Dto:

    FieldTypeRequiredConstraints
    traceIdUUID stringYesRequest trace.
    providedByCodestringNo1..64 chars.
    displayLanguagestringNo2..16 chars, language code.
    currencystringNo3..6 uppercase chars.

    Response data[]:

    FieldTypeDescription
    namestringVendor display name.
    slugstringVendor slug.
    currencyCodestringCurrency.
    codestringVendor code used in requests.
    categoryCodestringCategory code.
    providedBy, providedByName, providedBySlugstring/nullParent vendor metadata.
    isAvailablebooleanAvailability for operator use.
    availableGameCount, totalGameCountintegerCounts.
    lastSyncedAtstring/nullLast sync timestamp.

    7.2 List games — /game-operators/game/list

    Request ListGamesV1Dto:

    FieldTypeRequiredConstraints
    traceIdUUID stringYesRequest trace.
    vendorCodestringYes1..64 chars.
    gameVendorCodestringNo1..64 chars.
    pageNointegerYesPositive; default 1.
    pageSizeintegerNoPositive, max 500.
    displayLanguagestringNo2..16 chars.
    currencystringNo3..6 uppercase chars.
    fetchFromApibooleanNoRefresh catalog where supported.

    Response data:

    FieldTypeDescription
    headersobjectIndex map for games rows.
    gamesarray[]Row arrays decoded by headers.
    currentPage, totalItems, totalPagesintegerPagination.
    sourceenumdatabase or api.

    Game row indexes:

    IndexField
    0gameCode
    1gameName
    2categoryCode
    3square_1x1
    4wide_2x1
    5landscape_3x2
    6portrait_3x4
    7standard_4x3
    8languageCode
    9platformCode
    10currencyCode
    11isOpen
    12isAvailable
    13isVip
    14rtp
    15volatility
    16vendorCode
    17vendorName
    18availabilityUpdatedAt

    7.3 Game launch — /game-operators/game/url

    Request RequestGameUrlV1Dto:

    FieldTypeRequiredConstraints
    traceIdUUID stringYesRequest trace.
    usernamestringYes1..64 chars.
    clientPlayerIdstringNo1..128 chars.
    nicknamestringNo1..128 chars.
    subOperatorstringNo1..128 chars, metadata.
    gameCodestringYes1..128 chars.
    vendorCodestringNoVendor code returned by /game-operators/game/vendors.
    languagestringYes2..16 chars.
    platformstringYes1..32 chars.
    playModeenumNoREAL or DEMO.
    currencystringYes3..6 uppercase chars.
    lobbyUrlURL stringYesReturn URL.
    depositUrlURL stringNoCashier/deposit URL.
    countrystringNoISO alpha-2.
    additionalParamsstringNoContinuity marker where supported.
    ipAddressstringYes3..64 chars.
    playerTypeenumNoVIP or TEST.

    Response data:

    FieldTypeRequiredDescription
    gameUrlURL stringYesLaunch URL.
    tokenstringYesAggregator session token.
    providerSessionIdstringNoUpstream session ID.
    clientSessionIdstringNoClient-facing session ID.
    clientPlayerIdstringNoOperator player ID.
    usernamestringNoUsername.

    7.4 Terminate session — /game-operators/game/terminate

    Request TerminateGameV1Dto:

    FieldTypeRequiredConstraints
    traceIdUUID stringYesRequest trace.
    usernamestringYes1..128 chars.

    Response:

    FieldTypeDescription
    traceIdUUID stringEchoed trace.
    statusstringUsually SC_OK.
    messagestringSuccess message.

    7.5 List transactions — /game-operators/transaction/list

    Request ListTransactionsV1Dto:

    FieldTypeRequiredConstraints
    traceIdUUID stringYesRequest trace.
    fromTimeintegerYesNon-negative timestamp.
    toTimeintegerYesNon-negative timestamp.
    pageNointegerYesMin 1.
    pageSizeintegerNo1..5000, default 2000.

    Transaction row indexes:

    IndexField
    0betId
    1roundId
    2externalTransactionId
    3username
    4currencyCode
    5gameCode
    6vendorCode
    7gameCategoryCode
    8betAmount
    9winAmount
    10winLoss
    11effectiveTurnover
    12jackpotAmount
    13refundAmount
    14status
    15vendorBetTime
    16vendorSettleTime
    17isFreeSpin
    18subOperator

    7.6 Transaction detail — /game-operators/transaction/detail

    Request GetTransactionDetailV1Dto:

    FieldTypeRequiredConstraints
    traceIdUUID stringYesRequest trace.
    betIdstringYes1..128 chars.
    displayLanguagestringNo2..16 chars.

    Response data:

    FieldTypeDescription
    detailUrlURL/nullDetail/replay URL when available.
    betDetailobjectUnified transaction detail.

    betDetail fields: betId, externalTransactionId, roundId, username, subOperator, currencyCode, gameCode, vendorCode, gameCategoryCode, betAmount, winAmount, winLoss, effectiveTurnover, jackpotAmount, refundAmount, status, isFreeSpin, vendorBetTime, and vendorSettleTime.

    8. Unified free-spins, jackpots, and promotions API

    This section defines the only operator-facing contract for free spins, free chips, jackpots, tournaments, prize drops, bonus cards, and promotion reporting. Operators call the same Prosper routes regardless of the upstream game vendor. Prosper owns all vendor routing and payload translation behind this API. All routes in this section use the authentication headers and HMAC signing rules from Section 3.1, and all responses use the operator envelope from Section 4.1.

    8.1 Design model

    Unified promotion and jackpot behavior is represented by these public concepts:

    ConceptPurpose
    CampaignOperator-facing promotion container identified by campaignId.
    RewardCampaign benefit such as free spins, free chips, tournament prize, prize drop, or bonus card.
    Player assignmentGrant or remove campaign eligibility for one or more players.
    JackpotJackpot pool, winner, winning amount, or contribution record exposed independently from a campaign.
    ReportRead-only campaign state, winners, leaderboard, prizes, assignments, jackpot rows, or reconciliation data.

    Promotion types:

    TypeMeaning
    FREE_SPINSCampaign that grants a configured number of free spins/free rounds on one or more games.
    FREE_CHIPSCampaign that grants configured live-game chips or chip value.
    TOURNAMENTLeaderboard or tournament campaign.
    PRIZE_DROPPrize-drop campaign with winners and prize metadata.
    BONUS_CARDBonus-card style campaign with active campaign and winner reporting.

    Jackpots are not a promotionType unless Prosper later introduces an explicit jackpot campaign product. Operators use the jackpot routes for jackpot pools, jackpot winners, jackpot winnings, and contribution reports.

    Campaign statuses:

    StatusMeaning
    DRAFTCreated locally but not active for assignment.
    ACTIVECan receive assignments or be queried.
    PAUSEDTemporarily blocked from new assignments.
    CANCELLEDCancelled by operator or Prosper.
    EXPIREDEnd date has passed.
    COMPLETEDCampaign has ended and final report data is available.

    8.2 Route inventory

    All routes are relative to https://<aggregator-host>/api/v1.

    MethodRoutePurposeIdempotency
    POST/game-operators/promotions/campaigns/createCreate or register a promotion campaign.requestId required
    POST/game-operators/promotions/campaigns/listList campaigns.Not required
    POST/game-operators/promotions/campaigns/detailGet one campaign.Not required
    POST/game-operators/promotions/campaigns/cancelCancel a campaign.requestId required
    POST/game-operators/promotions/campaigns/players/addAssign players to a campaign.requestId required
    POST/game-operators/promotions/campaigns/players/removeRemove players from a campaign.requestId required
    POST/game-operators/promotions/campaigns/players/listList player campaign state.Not required
    POST/game-operators/promotions/catalog/reward-valuesQuery available reward values for games/currencies.Not required
    POST/game-operators/promotions/reports/winnersList campaign winners.Not required
    POST/game-operators/promotions/reports/leaderboardGet campaign leaderboard.Not required
    POST/game-operators/promotions/reports/prizesGet campaign prizes.Not required
    POST/game-operators/promotions/reports/detailGet unified campaign detail.Not required
    POST/game-operators/promotions/jackpots/activeList active jackpot pools.Not required
    POST/game-operators/promotions/jackpots/winnersList jackpot winners for a time range.Not required
    POST/game-operators/promotions/jackpots/winningsGet winning amounts for one jackpot pool.Not required
    POST/game-operators/promotions/jackpots/contributionsList jackpot contribution records.Not required

    8.3 Shared promotion DTOs

    Common request fields:

    FieldTypeRequiredNotes
    traceIdUUID stringYesOperator-generated request trace.
    requestIdstringMutating routesIdempotency key for create, cancel, add, and remove operations.
    campaignIdstringCampaign-specific routesOperator-facing campaign ID, unique per operator.
    promotionTypeenumWhere campaign type mattersFREE_SPINS, FREE_CHIPS, TOURNAMENT, PRIZE_DROP, or BONUS_CARD.
    vendorCodestringOptionalVendor code from the unified game catalog when campaign support is vendor-scoped.
    currencyListstring[]OptionalISO currency codes.
    gameListstring[]OptionalGame codes from the unified game catalog.
    cursorstringOptionalOpaque pagination cursor for list routes.
    limitintegerOptionalDefaults to 100; maximum 500 unless a route states otherwise.
    metadataobjectOptionalOperator metadata. Prosper stores and echoes this object but does not branch on it.

    Timestamps are Unix epoch seconds unless the field explicitly says otherwise.

    FreeSpinsReward:

    FieldTypeRequiredNotes
    roundsintegerYesNumber of free spins/free rounds.
    betValuesobject[]YesAt least one bet value by currency.
    betValues[].currencystringYesISO currency code.
    betValues[].totalBetnumberConditionalRequired when betPerLine is absent.
    betValues[].betPerLinenumberConditionalRequired when totalBet is absent.
    periodOfTimeSecondsintegerNoOptional period-based validity rule.

    FreeChipsReward:

    FieldTypeRequiredNotes
    chipsNumbernumberYesNumber of chips/credits granted.
    chipValuenumberConditionalRequired when chipValuePerCurrency is absent.
    chipValuePerCurrencyobjectConditionalCurrency-to-value map. Required when chipValue is absent.
    maxBetLimitnumberNoMaximum bet allowed by campaign.
    maxWinLimitnumberNoMaximum win limit.
    maxWinLimitPlayerCurrencynumberNoMaximum win limit in player currency.

    TournamentReward, PrizeDropReward, and BonusCardReward:

    FieldTypeRequiredNotes
    externalCampaignRefstringOptionalExternal campaign reference if the campaign already exists outside Prosper.
    leaderboardSizeintegerNoMaximum leaderboard rows to return for tournaments.
    listSizeintegerNoMaximum latest-wins rows for prize drops, max 300.
    activityDatestringNoYYYY-MM-DD or campaign activity date.

    PromotionCampaign:

    FieldTypeRequiredNotes
    campaignIdstringYesOperator-facing campaign ID.
    promotionTypeenumYesCampaign type.
    statusenumYesDRAFT, ACTIVE, PAUSED, CANCELLED, EXPIRED, or COMPLETED.
    vendorCodestring/nullNoVendor selected by Prosper or requested by operator.
    gameListstring[]NoGames covered by campaign.
    currencyListstring[]NoCurrencies covered by campaign.
    startAtinteger/nullNoCampaign start time.
    expiresAtinteger/nullNoCampaign expiration time.
    validUntilinteger/nullNoLast time a player can use the reward.
    rewardobjectYesOne of the reward DTOs.
    metadataobject/nullNoOperator metadata.
    createdAt, updatedAtdatetime stringYesProsper timestamps.
    supportedOperationsstring[]YesOperations currently available for this campaign.

    PromotionPlayer:

    FieldTypeRequiredNotes
    playerIdstringYesOperator player identifier.
    usernamestringNoProsper username if different from playerId.
    currencystringNoPlayer currency.
    metadataobjectNoOperator metadata.

    PromotionPlayerState:

    FieldTypeDescription
    campaignIdstringCampaign ID.
    playerIdstringPlayer ID.
    statusenumASSIGNED, USED, EXPIRED, REMOVED, or FAILED.
    roundsinteger/nullFree-spin rounds granted when applicable.
    roundsPlayedinteger/nullFree-spin rounds already consumed.
    chipsNumbernumber/nullFree-chip count when applicable.
    assignedAt, updatedAtdatetime stringAssignment timestamps.

    8.4 Jackpot DTOs

    JackpotPool:

    FieldTypeRequiredNotes
    jackpotIdstringYesProsper jackpot pool identifier.
    namestring/nullNoDisplay name when available.
    statusenumYesACTIVE, PAUSED, CLOSED, or UNKNOWN.
    currencystring/nullNoISO currency code.
    amountnumber/nullNoCurrent jackpot amount in currency.
    gameListstring[]NoUnified game codes linked to the pool.
    updatedAtdatetime string/nullNoLast known update time.
    metadataobject/nullNoExtra normalized jackpot metadata.

    JackpotWinner:

    FieldTypeRequiredNotes
    jackpotIdstringYesJackpot pool identifier.
    playerIdstringYesOperator player identifier.
    usernamestring/nullNoUsername when different from playerId.
    gameCodestring/nullNoUnified game code.
    currencystring/nullNoISO currency code.
    amountnumberYesJackpot win amount.
    transactionIdstring/nullNoProsper/operator transaction reference when available.
    roundIdstring/nullNoRound reference when available.
    wonAtdatetime stringYesJackpot win time.

    JackpotWinning:

    FieldTypeRequiredNotes
    jackpotIdstringYesJackpot pool identifier.
    currencystring/nullNoISO currency code.
    amountnumberYesWinning amount.
    gameCodestring/nullNoUnified game code when the winning is game-scoped.
    updatedAtdatetime string/nullNoLast known update time.

    JackpotContribution:

    FieldTypeRequiredNotes
    jackpotIdstringYesJackpot pool identifier.
    gameCodestring/nullNoUnified game code.
    currencystring/nullNoISO currency code.
    amountnumberYesContribution amount.
    transactionIdstring/nullNoRelated bet transaction when available.
    roundIdstring/nullNoRelated game round when available.
    contributedAtdatetime stringYesContribution time.

    8.5 Campaign lifecycle endpoints

    Create campaign — /game-operators/promotions/campaigns/create

    Request CreatePromotionCampaignRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    requestIdstringYesIdempotency key.
    campaignIdstringYesOperator-facing campaign ID.
    promotionTypeenumYesCampaign type.
    vendorCodestringNoOptional vendor from catalog.
    gameListstring[]ConditionalRequired for game-scoped rewards.
    currencyListstring[]NoCampaign currencies.
    startAtintegerNoDefaults to now when supported.
    expiresAtintegerNoCampaign expiration.
    validUntilintegerNoReward validity end.
    rewardreward objectYesShape depends on promotionType.
    metadataobjectNoOperator metadata.

    Response data:

    FieldTypeDescription
    campaignPromotionCampaignCreated or existing idempotent campaign.
    createdbooleantrue if created during this request.

    Idempotency:

    • Repeating the same requestId with the same body returns the same campaign result.
    • Reusing the same requestId with different campaign content returns SC_DUPLICATE_REQUEST.
    • Reusing an existing campaignId with a different requestId returns SC_PROMOTION_ALREADY_EXISTS.

    List campaigns — /game-operators/promotions/campaigns/list

    Request ListPromotionCampaignsRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    promotionTypeenumNoFilter by type.
    statusenumNoFilter by status.
    vendorCodestringNoFilter by catalog vendor.
    fromTimeintegerNoCreated/updated lower bound.
    toTimeintegerNoCreated/updated upper bound.
    cursorstringNoOpaque pagination cursor.
    limitintegerNoDefault 100, max 500.

    Response data: items as PromotionCampaign[] and nextCursor as string/null.

    Campaign detail — /game-operators/promotions/campaigns/detail

    Request GetPromotionCampaignRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    campaignIdstringYesCampaign ID.

    Response data: campaign as PromotionCampaign.

    Cancel campaign — /game-operators/promotions/campaigns/cancel

    Request CancelPromotionCampaignRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    requestIdstringYesIdempotency key.
    campaignIdstringYesCampaign ID.
    reasonstringNoOperator cancellation reason.

    Response data: campaign as PromotionCampaign, and cancelled as boolean.

    8.6 Player assignment endpoints

    Add players — /game-operators/promotions/campaigns/players/add

    Request AddPromotionPlayersRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    requestIdstringYesIdempotency key.
    campaignIdstringYesCampaign ID.
    playersPromotionPlayer[]Yes1..5000 players.
    assignmentOverridesobjectNoPer-request override for dates, rounds, chips, or limits when supported.

    Response data:

    FieldTypeDescription
    campaignIdstringCampaign ID.
    assignedstring[]Player IDs assigned by this request.
    alreadyAssignedstring[]Player IDs already assigned on an idempotent repeat.
    failedobject[]Player-level failures with playerId, status, and message.

    Remove players — /game-operators/promotions/campaigns/players/remove

    Request RemovePromotionPlayersRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    requestIdstringYesIdempotency key.
    campaignIdstringYesCampaign ID.
    playerIdsstring[]Yes1..5000 player IDs.
    reasonstringNoOperator removal reason.

    Response data:

    FieldTypeDescription
    campaignIdstringCampaign ID.
    removedstring[]Player IDs removed by this request.
    notAssignedstring[]Player IDs that were not assigned.
    failedobject[]Player-level failures with playerId, status, and message.

    List player state — /game-operators/promotions/campaigns/players/list

    Request ListPromotionPlayersRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    campaignIdstringNoFilter by campaign.
    playerIdstringNoFilter by player.
    statusenumNoASSIGNED, USED, EXPIRED, REMOVED, or FAILED.
    cursorstringNoOpaque pagination cursor.
    limitintegerNoDefault 100, max 500.

    Response data: items as PromotionPlayerState[] and nextCursor as string/null.

    8.7 Catalog and reporting endpoints

    Reward values — /game-operators/promotions/catalog/reward-values

    Request GetPromotionRewardValuesRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    promotionTypeenumYesFREE_SPINS or FREE_CHIPS.
    vendorCodestringNoOptional catalog vendor.
    gameListstring[]NoGame codes to inspect.
    currencyListstring[]YesCurrencies to inspect.

    Response data:

    FieldTypeDescription
    rewardValuesobject[]Available reward values by game/currency.
    currencyMultipliersobject[]Currency multiplier data when available.
    unsupportedobject[]Game/currency pairs not supported for the requested reward type.

    Campaign winners — /game-operators/promotions/reports/winners

    Request ListPromotionWinnersRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    promotionTypeenumYesCampaign type.
    campaignIdstringNoCampaign ID when known.
    fromTimeintegerNoLower time bound.
    toTimeintegerNoUpper time bound.
    cursorstringNoOpaque pagination cursor.
    limitintegerNoDefault 100, max 500.

    Response data: items as PromotionWinner[] and nextCursor as string/null.

    Leaderboard — /game-operators/promotions/reports/leaderboard

    Request GetPromotionLeaderboardRequest: traceId as UUID string, campaignId as string, and optional limit integer. Response data contains campaignId and entries as LeaderboardEntry[].

    Prizes — /game-operators/promotions/reports/prizes

    Request GetPromotionPrizesRequest: traceId as UUID string, campaignId as string, and optional currencyList as string[]. Response data contains campaignId and prizes as object array.

    Report detail — /game-operators/promotions/reports/detail

    Request GetPromotionReportDetailRequest: traceId as UUID string and campaignId as string. Response data contains campaign as PromotionCampaign and summary as object.

    Reporting row DTOs:

    DTOFieldTypeDescription
    PromotionWinnercampaignIdstringCampaign ID.
    PromotionWinnerplayerIdstringPlayer ID.
    PromotionWinnercurrencystring/nullCurrency.
    PromotionWinneramountnumber/nullWin or prize amount.
    PromotionWinnerprizeIdstring/nullPrize identifier when available.
    PromotionWinnerwonAtdatetime/string/nullWin timestamp.
    LeaderboardEntryrankintegerRanking position.
    LeaderboardEntryplayerIdstringPlayer ID.
    LeaderboardEntryscorenumber/stringLeaderboard score.
    LeaderboardEntrycurrencystring/nullCurrency.
    LeaderboardEntryprizeobject/nullPrize attached to this rank.

    8.8 Jackpot endpoints

    Jackpot endpoints are read-only. They do not require requestId, and retries are safe.

    Active jackpots — /game-operators/promotions/jackpots/active

    Request ListActiveJackpotsRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    vendorCodestringNoOptional catalog vendor filter.
    currencystringNoISO currency filter.
    gameCodestringNoUnified game code filter.
    cursorstringNoOpaque pagination cursor.
    limitintegerNoDefault 100, max 500.

    Response data: items as JackpotPool[] and nextCursor as string/null.

    Jackpot winners — /game-operators/promotions/jackpots/winners

    Request ListJackpotWinnersRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    vendorCodestringNoOptional catalog vendor filter.
    jackpotIdstringNoOptional jackpot pool filter.
    currencystringNoISO currency filter.
    startTimepointintegerYesInclusive Unix epoch seconds.
    endTimepointintegerYesExclusive Unix epoch seconds.
    cursorstringNoOpaque pagination cursor.
    limitintegerNoDefault 100, max 500.

    Response data: items as JackpotWinner[] and nextCursor as string/null.

    Validation:

    • endTimepoint must be greater than startTimepoint.
    • Prosper may cap the maximum time window. If capped, return SC_INVALID_TIME_RANGE.

    Jackpot winnings — /game-operators/promotions/jackpots/winnings

    Request GetJackpotWinningsRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    jackpotIdstringYesJackpot pool identifier.
    currencystringNoISO currency filter.
    cursorstringNoOpaque pagination cursor.
    limitintegerNoDefault 100, max 500.

    Response data:

    FieldTypeDescription
    jackpotIdstringJackpot pool identifier.
    currencystring/nullRequested currency filter.
    itemsJackpotWinning[]Winning rows for the jackpot pool.
    nextCursorstring/nullCursor for the next page.

    Jackpot contributions — /game-operators/promotions/jackpots/contributions

    Request ListJackpotContributionsRequest:

    FieldTypeRequiredNotes
    traceIdUUID stringYesRequest trace.
    vendorCodestringNoOptional catalog vendor filter.
    jackpotIdstringNoOptional jackpot pool filter.
    currencystringNoISO currency filter.
    gameCodestringNoUnified game code filter.
    fromTimeintegerNoInclusive Unix epoch seconds.
    toTimeintegerNoExclusive Unix epoch seconds.
    cursorstringNoOpaque pagination cursor.
    limitintegerNoDefault 100, max 500.

    Response data: items as JackpotContribution[] and nextCursor as string/null.

    8.9 Promotion and jackpot idempotency

    • Mutating promotion requests must include requestId.
    • Prosper dedupes by (operatorId, route, requestId).
    • Exact replay returns the original response.
    • Same requestId with a different payload returns SC_DUPLICATE_REQUEST.
    • Player assignment is idempotent per (operatorId, campaignId, playerId, requestId).
    • A bulk assignment may partially succeed. The response includes success, already-processed, and failed arrays so the operator can retry only failed players.
    • Jackpot list/report routes are read-only and do not require requestId.

    8.10 Promotion and jackpot examples

    Create a free-spins campaign:

    json
    {
      "traceId": "00000000-0000-4000-8000-000000000101",
      "requestId": "promo-create-001",
      "campaignId": "fs-2026-05-operator-a",
      "promotionType": "FREE_SPINS",
      "vendorCode": "vendor-demo",
      "gameList": ["game-001"],
      "currencyList": ["USD"],
      "startAt": 1779436800,
      "expiresAt": 1779840000,
      "validUntil": 1779840000,
      "reward": {
        "rounds": 10,
        "betValues": [
          {
            "currency": "USD",
            "totalBet": 1
          }
        ]
      }
    }

    Assign players to a campaign:

    json
    {
      "traceId": "00000000-0000-4000-8000-000000000102",
      "requestId": "promo-assign-001",
      "campaignId": "fs-2026-05-operator-a",
      "players": [
        {
          "playerId": "john.doe",
          "currency": "USD"
        }
      ]
    }

    Query reward values:

    json
    {
      "traceId": "00000000-0000-4000-8000-000000000103",
      "promotionType": "FREE_CHIPS",
      "vendorCode": "vendor-demo",
      "gameList": ["game-001"],
      "currencyList": ["USD", "EUR"]
    }

    Query active jackpots:

    json
    {
      "traceId": "00000000-0000-4000-8000-000000000104",
      "vendorCode": "vendor-demo",
      "currency": "USD",
      "limit": 100
    }

    Query jackpot winners:

    json
    {
      "traceId": "00000000-0000-4000-8000-000000000105",
      "jackpotId": "jp-main-usd",
      "currency": "USD",
      "startTimepoint": 1779436800,
      "endTimepoint": 1779523200,
      "limit": 100
    }

    8.11 Promotion contract boundary

    The operator should not need to know which upstream adapter handles a campaign or jackpot report. Prosper owns that routing behind this unified API.

    Behavior familyUnified API concept
    Free-spin/free-round create, cancel, and listCampaign lifecycle with promotionType: FREE_SPINS.
    Free-spin/free-round player grant and statePlayer assignment lifecycle.
    Free-chip create, cancel, and value lookupCampaign lifecycle plus reward value lookup with promotionType: FREE_CHIPS.
    Free-chip player grant, removal, and statePlayer assignment lifecycle.
    Tournament, prize-drop, and bonus-card reportingReporting endpoints under /game-operators/promotions/reports/*.
    Active jackpot pools, jackpot winners, jackpot winnings, and contributionsJackpot endpoints under /game-operators/promotions/jackpots/*.
    Jackpot win amount on game transactionsExposed through jackpot reports and transaction reconciliation fields, not as a provider callback.

    9. Credentials

    Prosper provides one active credential pair per integration environment:

    FieldTypeNotes
    publicKeystringUse as X-API-Key.
    secretKeystringUse for HMAC signing. Store securely.

    Credential rules:

    • Keep separate credentials per environment.
    • Treat secretKey as write-only after provisioning.
    • Rotate credentials before disabling an old key.
    • Sign every unified aggregator request with the active credential pair.
    • Verify every aggregator-to-wallet callback using the configured wallet secret rule in Section 3.2.

    10. Unified integration checklist

    1. Configure operator record and callback URL.
    2. Create an API key and store publicKey plus one-time secretKey.
    3. Implement wallet endpoints exactly once for all game vendors.
    4. Verify HMAC in both directions, including the sk_ prefix difference.
    5. Enforce idempotency by (operatorId, transactionId).
    6. Provision players and currency wallets before launch.
    7. Pull vendors and games from /game/vendors and /game/list.
    8. Launch games using /game/url.
    9. Process balance, bet, result, rollback, and adjustment callbacks.
    10. Reconcile transactions using /transaction/list and /transaction/detail.
    11. Integrate free-spins, free-chips, promotion, and jackpot routes only through /game-operators/promotions/*.
    12. Pass negative tests for invalid signature, missing player, wrong currency, insufficient funds, duplicate transaction, rollback missing original, duplicate promotion request, invalid campaign, and invalid jackpot time range.

    11. Minimal examples

    11.1 Signed game list request

    Body:

    json
    {
      "traceId": "00000000-0000-4000-8000-000000000010",
      "vendorCode": "vendor-demo",
      "pageNo": 1,
      "pageSize": 100,
      "currency": "USD"
    }

    Headers:

    http
    Content-Type: application/json
    Accept: application/json
    X-API-Key: pk_example
    X-Signature: lowercase_hex_hmac_sha256(secretKey, compact_json_body)

    11.2 Wallet bet callback

    Request from aggregator to operator:

    json
    {
      "traceId": "00000000-0000-4000-8000-000000000001",
      "username": "john.doe",
      "currency": "USD",
      "amount": "10.00",
      "transactionId": "bet-123",
      "roundId": "round-123",
      "gameCode": "game-001",
      "token": "session-token"
    }

    Response from operator:

    json
    {
      "traceId": "00000000-0000-4000-8000-000000000001",
      "status": "SC_OK",
      "data": {
        "transactionId": "bet-123",
        "balance": 90,
        "cashBalance": 80,
        "bonusBalance": 10,
        "usedPromo": 0
      }
    }

    12. Contract boundary

    Only the APIs listed in this guide are part of the operator integration contract. New functionality should appear through one of these unified surfaces before an operator relies on it:

    • Catalog and launch: /game-operators/game/vendors, /game-operators/game/list, /game-operators/game/url.
    • Money movement: the operator wallet callback API.
    • Reconciliation: /game-operators/transaction/list and /game-operators/transaction/detail.
    • Free-spins, free chips, promotions, and jackpots: /game-operators/promotions/*.
    Talk to the team