Prosper

    Provider Integration Guide

    The reverse integration: how game providers plug into the Prosper Aggregator. Implement catalog, launch, and promotion endpoints — then call our wallet and promotion event callbacks.

    Version 1.1.1Catalog, launch, wallet & promotionsHMAC SHA-256, signed both directionsDownload PDF
    NameValue
    TransportHTTPS, JSON request bodies, HMAC SHA-256 request signing.
    Provider implementsCatalog, launch, and promotion action endpoints.
    Provider callsProsper wallet and promotion event callbacks.

    All examples use placeholder URLs and credentials. Prosper supplies the real base URLs, public keys, shared secrets, provider code, operator scope, site code, and environment for each integration.

    1. Overview

    Use this guide to implement the Prosper provider integration endpoints and callbacks.

    1.1 Integration scope

    Prosper configures one integration record per provider, operator, site, and environment.

    FieldMeaning
    providerCodeStable lowercase provider identifier used in Prosper routes and records.
    operatorIdProsper operator UUID. Prosper sends this in provider-pull requests.
    siteCodeSite or brand scope. Default is default.
    environmentEnvironment scope such as staging or production.
    apiBaseUrlProvider base URL used by Prosper for catalog, launch, and promotion actions.
    publicKey and secretPer-integration HMAC credentials. Do not reuse secrets across environments.

    1.2 Traffic directions

    DirectionAuthenticationPurpose
    Prosper to providerX-Axis-* HMAC headersCatalog pull, launch, promotion offers, campaigns, grants, jackpot reports, and tournament reports.
    Provider to ProsperX-Provider-* HMAC headersWallet authenticate, balance, debit, credit, debit-credit, rollback, adjustment, session terminate, and promotion event callbacks.

    1.3 Integration steps

    1. Receive providerCode, operatorId, siteCode, environment, Prosper callback base URL, public key, shared secret, and configured provider paths from Prosper.
    2. Implement the Prosper-to-provider endpoints for the selected capability profile.
    3. Verify every Prosper-to-provider request with X-Axis-* headers.
    4. Call Prosper wallet and promotion event endpoints with X-Provider-* headers.
    5. Use the DTOs, response envelopes, retry rules, and idempotency keys defined in this guide.

    1.4 Capability profiles

    ProfileRequired capabilities
    coreCatalog, launch, wallet authenticate, balance, debit, credit, debit-credit, rollback, adjustment, session terminate, auth failure handling, nonce replay rejection, invalid amount rejection, and duplicate transaction idempotency.
    promotionsEverything in core, plus offers list, campaign create/cancel, grant create/cancel, and provider promotion event callback.
    fullEverything in promotions, plus jackpot and tournament reports.

    1.5 JSON rules

    • All request and response bodies are JSON.
    • All timestamps are ISO 8601 strings with an offset, for example 2026-06-03T12:00:00.000Z.
    • traceId is a UUID used for tracing. Echo it in provider-to-Prosper callback bodies.
    • Money amounts sent to Prosper are decimal strings, not numbers.
    • Wallet amounts must be greater than zero and have up to 6 decimal places.
    • Currency codes are uppercase strings, 3 to 6 characters.
    • Provider-specific data belongs in metadata, payload, or providerConfig.
    • Providers must ignore unknown JSON fields sent by Prosper.
    • Provider-to-Prosper callback DTOs are strict. Do not send extra top-level fields outside the documented DTOs.

    1.6 Base paths

    Path typeValue
    Provider-to-Prosper baseProsper callback base URL supplied by Prosper for each environment.
    Catalog pathProvider path configured in Prosper. Default: /catalog/games.
    Launch pathProvider path configured in Prosper. Default: /launch.
    Promotion base pathProvider path configured in Prosper. Default: /promotions.

    Prosper will provide the exact callback base URL for each environment.

    2. Authentication

    Both traffic directions use HMAC SHA-256 over the exact raw request body sent on the wire.

    2.1 Signature algorithm

    Signature payload:

    text
    {timestamp}.{nonce}.{rawBody}

    Signature output:

    text
    hex(hmac_sha256(sharedSecret, signaturePayload))

    Node.js signing example:

    javascript
    import { createHmac, timingSafeEqual } from "node:crypto";
    
    function sign(secret, timestamp, nonce, rawBody) {
      return createHmac("sha256", secret)
        .update(`${timestamp}.${nonce}.${rawBody}`)
        .digest("hex");
    }
    
    function signaturesMatch(expectedHex, actualHex) {
      const expected = Buffer.from(expectedHex, "hex");
      const actual = Buffer.from(actualHex, "hex");
      return expected.length === actual.length && timingSafeEqual(expected, actual);
    }

    Use the raw body bytes/string exactly as received. Do not verify against a parsed and re-serialized object unless it is guaranteed to be byte-for-byte identical.

    2.2 Prosper to provider headers

    Prosper signs every provider-pull request with these headers:

    HeaderMeaning
    X-Axis-Provider-KeyPublic key for the integration.
    X-Axis-TimestampISO timestamp generated by Prosper.
    X-Axis-NonceUnique nonce generated by Prosper.
    X-Axis-SignatureHex HMAC SHA-256 signature.

    Provider requirements:

    • Verify the public key maps to the expected integration.
    • Reject timestamps outside a 5 minute window.
    • Reject replayed nonces inside the timestamp window.
    • Compare signatures using a timing-safe comparison.
    • Return HTTP 401 for invalid credentials, stale timestamp, replayed nonce, or invalid signature.

    2.3 Provider to Prosper headers

    Providers must sign every callback to Prosper with:

    HeaderMeaning
    X-Provider-KeyPublic key Prosper issued for this integration.
    X-Provider-TimestampISO timestamp generated by provider.
    X-Provider-NonceUnique nonce, 8 to 128 characters.
    X-Provider-SignatureHex HMAC SHA-256 signature.

    Prosper validation rules:

    • Timestamp tolerance is 5 minutes.
    • Nonce must be unique per integration inside the timestamp window.
    • Integration must be enabled and the callback base URL must match the public key.
    • If an IP allowlist is configured, the request IP must match exactly.
    • Authentication failures return HTTP 401.
    • Validation failures return HTTP 400.

    2.4 Signed callback example

    http
    POST {prosperCallbackBaseUrl}/wallet/balance
    Content-Type: application/json
    Accept: application/json
    X-Provider-Key: gpk_staging_acme
    X-Provider-Timestamp: 2026-06-03T12:00:00.000Z
    X-Provider-Nonce: 6e8e4a2b-9468-4b7d-b66c-85d7c12e7568
    X-Provider-Signature: 1ec8d8ab...
    json
    {
      "traceId": "4090b86e-15fd-497a-9fa4-795e98dc8472",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-123",
      "currency": "USD"
    }

    3. Prosper to provider endpoints

    Prosper sends POST requests to the provider base URL configured for the integration. Prosper signs every request with X-Axis-* headers.

    Provider responses may be an envelope with data or the raw data object directly. Prosper unwraps data when present. HTTP non-2xx responses are treated as failed provider requests.

    3.1 Catalog games

    Default path: POST /catalog/games

    Prosper request:

    FieldRequiredDescription
    traceIdYesUUID for this request.
    providerCodeYesProvider code configured in Prosper.
    operatorIdYesProsper operator UUID.
    siteCodeYesSite scope for the integration.
    environmentYesEnvironment scope for the integration.
    queryYesOriginal Prosper game-list query. Providers should ignore unknown fields.

    Sample request:

    json
    {
      "traceId": "4f2b4817-e7dd-45aa-9f29-d210cf72e675",
      "providerCode": "acme-games",
      "operatorId": "5d7778e2-e86f-4173-9e11-7f0f3d23227e",
      "siteCode": "default",
      "environment": "staging",
      "query": {
        "traceId": "4f2b4817-e7dd-45aa-9f29-d210cf72e675",
        "vendorCode": "acme-games",
        "pageNo": 1,
        "pageSize": 100,
        "currency": "USD",
        "fetchFromApi": true
      }
    }

    Game DTO:

    FieldRequiredDescription
    gameCodeYesStable provider game code.
    gameNameYesDisplay name.
    categoryCodeYesCategory code such as slots, live, table.
    languageCodesNoSupported language codes.
    platformCodesNoSupported platforms such as WEB, MOBILE.
    currencyCodesNoSupported currency codes.
    isOpenNoWhether the game is open for play.
    isAvailableNoWhether the game is available for this integration.
    isVipNoWhether the game is VIP-only.
    rtpNoRTP value as string or number.
    volatilityNoProvider volatility label.
    imageSquareNoSquare image URL.
    imageWideNoWide image URL.
    imageLandscapeNoLandscape image URL.
    imagePortraitNoPortrait image URL.
    imageStandardNoStandard image URL.
    vendorCodeNoProvider/vendor code.
    vendorNameNoProvider/vendor display name.
    availabilityUpdatedAtNoISO timestamp or null.
    metadataNoProvider-specific JSON object.

    Sample response:

    json
    {
      "status": "OK",
      "message": "Successful response.",
      "data": {
        "games": [
          {
            "gameCode": "acme-slot-100",
            "gameName": "Acme Slot 100",
            "categoryCode": "slots",
            "languageCodes": ["en"],
            "platformCodes": ["WEB", "MOBILE"],
            "currencyCodes": ["USD", "EUR"],
            "isOpen": true,
            "isAvailable": true,
            "rtp": "96.50",
            "vendorCode": "acme-games",
            "vendorName": "Acme Games",
            "metadata": {}
          }
        ]
      }
    }

    3.2 Launch

    Default path: POST /launch

    Prosper creates a session token first, then sends it to the provider. Providers should bind their playable session to sessionToken; wallet callbacks should prefer this token for session lookup.

    FieldRequiredDescription
    traceIdYesUUID for launch.
    sessionTokenYesProsper session token. Prefer this in wallet callbacks.
    operatorIdYesProsper operator UUID.
    providerCodeYesProvider code.
    siteCodeYesSite scope.
    environmentYesEnvironment scope.
    usernameYesPlayer username.
    nicknameNoPlayer nickname.
    subOperatorNoSub-operator or brand reference.
    gameCodeYesProvider game code.
    currencyYesCurrency code.
    languageYesLanguage code.
    platformYesPlatform code.
    playModeNoREAL or DEMO.
    lobbyUrlYesURL to return the player to the operator lobby.
    depositUrlNoDeposit URL.
    countryNoPlayer country or market.
    ipAddressYesPlayer IP address passed by operator.
    playerTypeNoVIP or TEST.

    Sample request:

    json
    {
      "traceId": "8e89d29d-7d89-4637-9696-4c68c17fae70",
      "sessionToken": "6f628e10-b229-4279-b7f4-aa8139d7488e",
      "operatorId": "5d7778e2-e86f-4173-9e11-7f0f3d23227e",
      "providerCode": "acme-games",
      "siteCode": "default",
      "environment": "staging",
      "username": "player123",
      "nickname": "Player 123",
      "gameCode": "acme-slot-100",
      "currency": "USD",
      "language": "en",
      "platform": "WEB",
      "playMode": "REAL",
      "lobbyUrl": "https://operator.example/lobby",
      "depositUrl": "https://operator.example/deposit",
      "country": "US",
      "ipAddress": "203.0.113.10",
      "playerType": "TEST"
    }

    Launch response DTO:

    FieldRequiredDescription
    launchUrlYesURL Prosper returns to the operator for the player to open.
    providerSessionIdNoProvider session id. If returned, Prosper stores it for future callbacks.
    clientSessionIdNoOptional provider/client session reference.
    clientPlayerIdNoOptional provider/client player reference.
    usernameNoOptional normalized username.
    metadataNoProvider-specific JSON object.

    Sample response:

    json
    {
      "status": "OK",
      "data": {
        "launchUrl": "https://provider.example/play?token=6f628e10-b229-4279-b7f4-aa8139d7488e",
        "providerSessionId": "gps-20260603-10001",
        "clientSessionId": "client-session-1",
        "clientPlayerId": "client-player-123",
        "username": "player123",
        "metadata": {}
      }
    }

    3.3 Promotion actions

    Default promotion base path: /promotions

    Promotion endpoints are required for the promotions and full profiles.

    PathPurpose
    /promotions/offers/listReturn provider promotion offers that Prosper can store and expose to operators.
    /promotions/campaigns/createCreate or activate a campaign at the provider.
    /promotions/campaigns/cancelCancel a campaign at the provider.
    /promotions/grants/createGrant a promotion to a player.
    /promotions/grants/cancelCancel a player grant.
    /promotions/reports/jackpotsReturn jackpot report data. Required for full.
    /promotions/reports/tournamentsReturn tournament report data. Required for full.

    Offers list

    Request:

    json
    {
      "traceId": "386917ad-6db7-418e-9e4e-a142e59c8818",
      "providerCode": "acme-games",
      "operatorId": "5d7778e2-e86f-4173-9e11-7f0f3d23227e",
      "siteCode": "default",
      "environment": "staging"
    }

    Offer response fields:

    FieldRequiredDescription
    idNoProvider offer id. Used as fallback for providerOfferRef.
    typeNoPromotion type. Defaults to provider_specific. Supported values are listed below.
    providerOfferRefNoStable provider offer reference.
    scopeNoJSON object describing scope, such as games, brands, currencies, or markets.
    rewardNoJSON object describing reward, such as spins, bet amount, bonus amount, or jackpot config.
    offerHashNoProvider hash/version. Prosper can store it when present.
    expiresAtNoISO timestamp after which the offer is unavailable.
    configSchemaNoJSON schema or free-form config definition for operator/provider config.
    availableNoDefaults to true unless explicitly false.
    unavailableReasonNoReason when unavailable.
    metadataNoProvider-specific JSON object.

    Supported promotion type values:

    text
    free_bet, bonus_money, bonus_game, free_chips, tournament, prize_drop,
    jackpot, cashback, deposit_bonus, welcome_bonus, provider_specific

    Sample response:

    json
    {
      "status": "OK",
      "data": {
        "offers": [
          {
            "id": "offer-free-spins-10",
            "type": "free_bet",
            "providerOfferRef": "fs10-usd-web",
            "scope": { "games": ["acme-slot-100"], "currencies": ["USD"] },
            "reward": { "spins": 10, "betAmount": "0.10" },
            "configSchema": { "type": "object", "additionalProperties": true },
            "available": true,
            "metadata": {}
          }
        ]
      }
    }

    Promotion request object fields

    Promotion action requests include full Prosper promotion objects. Providers should validate the fields they use and ignore unknown nested fields.

    Action pathRequest body fields
    /promotions/offers/listtraceId, providerCode, operatorId, siteCode, environment.
    /promotions/campaigns/createtraceId, offer, campaign, providerConfig.
    /promotions/campaigns/canceltraceId, campaign.
    /promotions/grants/createtraceId, campaign, grant, providerConfig.
    /promotions/grants/canceltraceId, campaign, grant.
    /promotions/reports/jackpotsOperator report payload plus traceId.
    /promotions/reports/tournamentsOperator report payload plus traceId.

    Offer object — sent in /promotions/campaigns/create:

    FieldJSON valueDescription
    idUUID stringProsper offer id.
    createdAtISO timestamp stringOffer creation time.
    updatedAtISO timestamp stringLast offer update time.
    operatorIdUUID stringProsper operator id.
    typestringPromotion type. Values are listed above.
    providerCodestringProvider code configured in Prosper.
    scopeobjectEligible scope such as games, currencies, brands, markets, or player segments.
    rewardobjectReward definition such as spins, bet amount, bonus amount, jackpot config, or provider-specific reward data.
    providerOfferRefstring or nullStable provider offer reference.
    offerHashstringProsper offer version/hash.
    expiresAtISO timestamp string or nullOffer expiry time.
    configSchemaobjectProvider/operator configuration schema or free-form config definition.
    availablebooleanWhether the offer can be used for new campaigns.
    unavailableReasonstring or nullReason when available is false.
    rawProviderResponseJSON value or nullOriginal provider offer item stored by Prosper.
    metadataobjectProvider-specific metadata stored with the offer.

    Campaign object — sent with /promotions/campaigns/create, /promotions/campaigns/cancel, /promotions/grants/create, and /promotions/grants/cancel:

    FieldJSON valueDescription
    idUUID stringProsper campaign id.
    createdAtISO timestamp stringCampaign creation time.
    updatedAtISO timestamp stringLast campaign update time.
    offerIdUUID stringProsper offer id used to create the campaign.
    operatorIdUUID stringProsper operator id.
    typestringPromotion type. Values are listed above.
    namestringCampaign display name, max 160 chars.
    statusstringCampaign status. Values: draft, validating, scheduled, active, processing, cancelled, expired, failed, partial.
    operatorReferencestring or nullOperator campaign reference.
    providerCodestringProvider code configured in Prosper.
    providerCampaignRefstring or nullProvider campaign reference returned by provider. Null before the provider creates the campaign.
    providerStatusstring or nullProvider campaign status returned by provider.
    providerRawResponseJSON value or nullLast raw provider response stored for this campaign.
    scopeobjectCampaign scope. If the operator sends an empty object, Prosper uses the offer scope.
    rewardobjectCampaign reward. If the operator sends an empty object, Prosper uses the offer reward.
    scheduleobjectOriginal schedule object from the operator request. May include startsAt, endsAt, and timezone.
    startsAtISO timestamp string or nullParsed campaign start time.
    endsAtISO timestamp string or nullParsed campaign end time.
    providerConfigobjectProvider-specific campaign configuration.
    idempotencyKeystring or nullOperator idempotency key for campaign creation.
    metadataobjectCampaign metadata.

    Grant object — sent in /promotions/grants/create and /promotions/grants/cancel:

    FieldJSON valueDescription
    idUUID stringProsper grant id.
    createdAtISO timestamp stringGrant creation time.
    updatedAtISO timestamp stringLast grant update time.
    campaignIdUUID stringProsper campaign id.
    operatorIdUUID stringProsper operator id.
    providerCodestringProvider code configured in Prosper.
    statusstringGrant status. Values: pending, processing, active, used, finished, expired, cancelled, failed.
    playerIdUUID string or nullProsper player id when available.
    playerUsernamestringPlayer username, max 128 chars.
    playerExternalIdstring or nullOperator/player external id when supplied.
    operatorGrantReferencestring or nullOperator grant reference.
    providerGrantRefstring or nullProvider grant reference returned by provider. Null before the provider creates the grant.
    providerStatusstring or nullProvider grant status returned by provider.
    providerRawResponseJSON value or nullLast raw provider response stored for this grant.
    rewardSnapshotobjectReward assigned to this player. If the operator does not override reward, Prosper uses the campaign reward.
    usedCountintegerNumber of consumed reward units recorded by Prosper.
    remainingCountinteger or nullRemaining reward count when Prosper can derive it from the reward.
    idempotencyKeystring or nullOperator idempotency key for grant creation.
    metadataobjectGrant metadata.

    Campaign create

    Request:

    json
    {
      "traceId": "fac5f1d7-d3fd-420a-9427-d384d4c4acc9",
      "offer": {
        "id": "88b7688d-3b81-4d74-b0b7-52bdb80fd049",
        "type": "free_bet",
        "providerCode": "acme-games",
        "providerOfferRef": "fs10-usd-web",
        "scope": { "games": ["acme-slot-100"] },
        "reward": { "spins": 10 },
        "configSchema": {},
        "metadata": {}
      },
      "campaign": {
        "id": "4364c972-39e3-4ce9-98cc-3fb34135fd7c",
        "offerId": "88b7688d-3b81-4d74-b0b7-52bdb80fd049",
        "operatorId": "5d7778e2-e86f-4173-9e11-7f0f3d23227e",
        "type": "free_bet",
        "name": "Weekend Free Spins",
        "status": "active",
        "operatorReference": "promo-2026-06",
        "providerCode": "acme-games",
        "scope": { "games": ["acme-slot-100"] },
        "reward": { "spins": 10 },
        "schedule": {
          "startsAt": "2026-06-03T12:00:00.000Z",
          "endsAt": "2026-06-10T12:00:00.000Z"
        },
        "providerConfig": {},
        "idempotencyKey": "campaign-2026-06",
        "metadata": {}
      },
      "providerConfig": {}
    }

    Provider response:

    json
    {
      "status": "OK",
      "message": "Campaign created.",
      "data": {
        "providerCampaignRef": "provider-campaign-10001",
        "providerStatus": "active"
      }
    }

    Campaign cancel

    Request:

    json
    {
      "traceId": "ec47a2d7-7261-4a2c-bdc0-77ce5f3a6633",
      "campaign": {
        "id": "4364c972-39e3-4ce9-98cc-3fb34135fd7c",
        "providerCode": "acme-games",
        "providerCampaignRef": "provider-campaign-10001",
        "status": "active",
        "metadata": {}
      }
    }

    Provider response:

    json
    {
      "status": "OK",
      "data": {
        "providerCampaignRef": "provider-campaign-10001",
        "providerStatus": "cancelled"
      }
    }

    Grant create

    Request:

    json
    {
      "traceId": "e3f9dc53-f5df-4acd-8705-a99d9de2fe51",
      "campaign": {
        "id": "4364c972-39e3-4ce9-98cc-3fb34135fd7c",
        "providerCampaignRef": "provider-campaign-10001",
        "providerCode": "acme-games",
        "status": "active",
        "reward": { "spins": 10 }
      },
      "grant": {
        "id": "9809f059-ecb5-4462-9a2d-2c7f98e2e888",
        "campaignId": "4364c972-39e3-4ce9-98cc-3fb34135fd7c",
        "operatorId": "5d7778e2-e86f-4173-9e11-7f0f3d23227e",
        "providerCode": "acme-games",
        "status": "active",
        "playerUsername": "player123",
        "playerExternalId": "external-player-123",
        "operatorGrantReference": "grant-2026-06-player123",
        "rewardSnapshot": { "spins": 5 },
        "remainingCount": 5,
        "idempotencyKey": "grant-2026-06-player123",
        "metadata": {}
      },
      "providerConfig": {}
    }

    Provider response:

    json
    {
      "status": "OK",
      "data": {
        "providerGrantRef": "provider-grant-20001",
        "providerStatus": "active"
      }
    }

    Grant cancel

    Request:

    json
    {
      "traceId": "09cf642e-caa1-461c-a1fd-2ce3dc18c53b",
      "campaign": {
        "id": "4364c972-39e3-4ce9-98cc-3fb34135fd7c",
        "providerCampaignRef": "provider-campaign-10001",
        "providerCode": "acme-games"
      },
      "grant": {
        "id": "9809f059-ecb5-4462-9a2d-2c7f98e2e888",
        "providerCode": "acme-games",
        "providerGrantRef": "provider-grant-20001",
        "playerUsername": "player123",
        "status": "active"
      }
    }

    Provider response:

    json
    {
      "status": "OK",
      "data": {
        "providerGrantRef": "provider-grant-20001",
        "providerStatus": "cancelled"
      }
    }

    Jackpot and tournament reports

    Prosper forwards the operator report payload plus the current traceId. Providers may return any JSON object useful for reconciliation and display.

    Request:

    json
    {
      "traceId": "03c43944-f7cb-410f-91ec-cae4e3bf1b8b",
      "providerCode": "acme-games",
      "from": "2026-06-01T00:00:00.000Z",
      "to": "2026-06-03T23:59:59.000Z",
      "options": {}
    }

    Response:

    json
    {
      "status": "OK",
      "data": {
        "items": [],
        "generatedAt": "2026-06-03T12:00:00.000Z"
      }
    }

    4. Provider to Prosper endpoints

    Prosper provides the callback base URL for each environment. The endpoint paths below are relative to that base URL: {prosperCallbackBaseUrl}.

    All provider callbacks must be signed with X-Provider-* headers.

    4.1 Response envelope

    Successful wallet and event callbacks return HTTP 200 with:

    json
    {
      "traceId": "1d8eb955-cdc2-4d43-a217-1b8b83fb9eb9",
      "status": "SC_OK",
      "message": "Successful response.",
      "data": {}
    }

    Validation failures return HTTP 400. Authentication failures return HTTP 401. Wallet business errors usually return HTTP 200 with a non-SC_OK status.

    4.2 Wallet status values

    StatusMeaning
    SC_OKSuccessful response.
    SC_INSUFFICIENT_FUNDSPlayer balance cannot cover debit.
    SC_ACCOUNT_NOT_FOUNDWallet account not found.
    SC_USER_NOT_EXISTSSession or user not found.
    SC_WRONG_CURRENCYCurrency is invalid for the player/account.
    SC_LIMIT_REACHEDOperator or player limit reached.
    SC_INVALID_OPERATOROperator configuration is invalid or missing.
    SC_INVALID_SIGNATUREWallet downstream signature error. Provider-to-Prosper auth failures still use HTTP 401.
    SC_INVALID_GAMEGame is invalid.
    SC_INVALID_REQUESTBusiness request is invalid.
    SC_SYSTEM_ERRORSystem error.
    SC_DUPLICATE_TRANSACTIONDownstream wallet duplicate transaction response. Prosper itself returns stored success for duplicate successful provider transaction ids.
    SC_TRANSACTION_NOT_FOUNDTransaction not found.
    SC_TRANSACTION_NOT_EXISTSTransaction does not exist.

    4.3 Common field rules

    FieldRuleDescription
    traceIdUUIDRequired in every callback.
    token1-512 charsPreferred session lookup key. Token is sent by Prosper in launch.
    providerSessionId1-128 charsProvider session id. Prosper stores it when returned from launch or authenticate.
    username1-128 charsSession lookup fallback. Requires currency when no token/provider session id is sent.
    currency3-6 uppercase charsRequired for transactions and username-only lookup.
    amountdecimal stringGreater than zero, up to 6 decimal places. Examples: 1, 1.00, 1.123456.
    metadataobjectOptional provider-specific data. Defaults to {} when omitted.

    Session lookup rule: send token whenever possible. If token is unavailable, send providerSessionId. If both are unavailable, send username and currency.

    4.4 Wallet authenticate

    Path: POST /wallet/authenticate

    FieldRequiredDescription
    traceIdYesUUID.
    tokenYesProsper session token from launch.
    providerSessionIdNoProvider session id to store/update on the Prosper session.
    usernameNoPlayer username.
    currencyNoCurrency code.
    metadataNoJSON object.

    Request:

    json
    {
      "traceId": "cbac4edc-7ac2-47d0-97d5-21fd64c69e1f",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1",
      "username": "player123",
      "currency": "USD",
      "metadata": {}
    }

    Success data:

    json
    {
      "username": "player123",
      "currency": "USD",
      "balance": 100.5,
      "cashBalance": 100.5,
      "bonusBalance": 0,
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1"
    }

    4.5 Wallet balance

    Path: POST /wallet/balance

    Request fields are the common lookup fields, traceId, and optional metadata. At least one of token, providerSessionId, or username is required.

    json
    {
      "traceId": "da66322f-1ff2-45f2-bc5c-4bb76ed3a7b7",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1",
      "currency": "USD",
      "metadata": {}
    }

    Success data is the same as authenticate success data.

    4.6 Wallet debit

    Path: POST /wallet/debit

    FieldRequiredDescription
    traceIdYesUUID.
    token / providerSessionId / usernameYesSession lookup. Username-only lookup requires currency.
    transactionIdYesProvider debit id. Idempotency key, 1-128 chars.
    roundIdYesProvider round id, 1-128 chars.
    gameCodeYesProvider game code, 1-128 chars.
    amountYesPositive decimal string.
    currencyYesCurrency code.
    eventIdNoProvider event id, 1-128 chars.
    eventTimeNoISO timestamp with offset.
    metadataNoJSON object.
    json
    {
      "traceId": "3e25a693-4cb2-424b-b2c2-116c6dc0f12e",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1",
      "transactionId": "provider-bet-1",
      "roundId": "round-1",
      "gameCode": "acme-slot-100",
      "amount": "1.00",
      "currency": "USD",
      "eventId": "event-1",
      "eventTime": "2026-06-03T12:00:00.000Z",
      "metadata": {}
    }

    Success data for debit, credit, debit-credit, rollback, and adjustment:

    json
    {
      "transactionId": "operator-wallet-transaction-1",
      "balance": 99.5,
      "currency": "USD"
    }

    4.7 Wallet credit

    Path: POST /wallet/credit

    Fields are the same as debit, plus:

    FieldRequiredDescription
    isWinNoBoolean. Defaults to true.
    json
    {
      "traceId": "b43f39f5-f505-4a1a-8821-85e448a92530",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1",
      "transactionId": "provider-win-1",
      "roundId": "round-1",
      "gameCode": "acme-slot-100",
      "amount": "2.00",
      "currency": "USD",
      "isWin": true,
      "metadata": {}
    }

    4.8 Wallet debit-credit

    Path: POST /wallet/debit-credit

    Use this endpoint when one provider event contains both bet and result.

    FieldRequiredDescription
    traceIdYesUUID.
    token / providerSessionId / usernameYesSession lookup.
    debitTransactionIdYesProvider debit id.
    creditTransactionIdYesProvider credit id.
    roundIdYesProvider round id.
    gameCodeYesProvider game code.
    debitAmountYesPositive decimal string.
    creditAmountYesPositive decimal string.
    currencyYesCurrency code.
    eventTimeNoISO timestamp with offset.
    metadataNoJSON object.
    json
    {
      "traceId": "72e00c42-bf33-4339-bf80-3d03c950ed3b",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1",
      "debitTransactionId": "provider-bet-2",
      "creditTransactionId": "provider-win-2",
      "roundId": "round-2",
      "gameCode": "acme-slot-100",
      "debitAmount": "1.00",
      "creditAmount": "2.00",
      "currency": "USD",
      "eventTime": "2026-06-03T12:00:00.000Z",
      "metadata": {}
    }

    4.9 Wallet rollback

    Path: POST /wallet/rollback

    FieldRequiredDescription
    traceIdYesUUID.
    token / providerSessionId / usernameYesSession lookup. Inactive sessions may still be resolved for rollback.
    transactionIdYesProvider rollback id. Idempotency key.
    originalTransactionIdYesOriginal provider transaction id to rollback.
    roundIdYesProvider round id.
    gameCodeYesProvider game code.
    amountYesPositive decimal string.
    currencyYesCurrency code.
    metadataNoJSON object.
    json
    {
      "traceId": "6b0bd6b8-84d6-477b-8dc8-0cfc95e73701",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1",
      "transactionId": "provider-rollback-1",
      "originalTransactionId": "provider-bet-1",
      "roundId": "round-1",
      "gameCode": "acme-slot-100",
      "amount": "1.00",
      "currency": "USD",
      "metadata": {}
    }

    4.10 Wallet adjustment

    Path: POST /wallet/adjustment

    FieldRequiredDescription
    traceIdYesUUID.
    token / providerSessionId / usernameYesSession lookup. Inactive sessions may still be resolved for adjustment.
    transactionIdYesProvider adjustment id. Idempotency key.
    amountYesPositive decimal string.
    currencyYesCurrency code.
    adjustmentTypeNoREWARD, GIFT, or CANCEL_GIFT. Defaults to REWARD.
    adjustmentTimeNoISO timestamp with offset. Defaults to current Prosper time.
    originalTransactionIdNoOriginal provider transaction/reference if applicable.
    metadataNoJSON object.
    json
    {
      "traceId": "f56666b1-9918-4930-a438-405e03420c75",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1",
      "transactionId": "provider-reward-1",
      "amount": "3.00",
      "currency": "USD",
      "adjustmentType": "REWARD",
      "adjustmentTime": "2026-06-03T12:00:00.000Z",
      "metadata": {}
    }

    4.11 Session terminate

    Path: POST /wallet/session/terminate

    FieldRequiredDescription
    traceIdYesUUID.
    token / providerSessionId / usernameYesSession lookup. Username-only lookup requires currency.
    currencyConditionalRequired only for username-only lookup.
    reasonNoTermination reason, 1-512 chars.
    json
    {
      "traceId": "d80b7445-0d06-47a9-9407-d15301c433ff",
      "token": "prosper-session-token",
      "providerSessionId": "provider-session-1",
      "reason": "Provider session closed"
    }

    Success data:

    json
    {
      "providerSessionId": "provider-session-1"
    }

    4.12 Promotion event callback

    Path: POST /promotions/events

    Use this endpoint for provider-originated promotion lifecycle, settlement, jackpot, tournament, grant, or usage events.

    FieldRequiredDescription
    traceIdYesUUID.
    eventTypeYesEvent type, 1-64 chars. Example: free_spins.granted.
    providerRefNoProvider event/reference id, 1-256 chars.
    campaignRefNoProvider campaign reference, 1-256 chars.
    grantRefNoProvider grant reference, 1-256 chars.
    playerUsernameNoPlayer username, 1-128 chars.
    payloadNoEvent payload JSON object. Defaults to {}.
    occurredAtNoISO timestamp with offset. Defaults to current Prosper time.
    metadataNoProvider-specific JSON object. Defaults to {}.
    json
    {
      "traceId": "9d488da2-1d49-4a23-afec-12a32ea1c8c8",
      "eventType": "free_spins.granted",
      "providerRef": "provider-event-30001",
      "campaignRef": "provider-campaign-10001",
      "grantRef": "provider-grant-20001",
      "playerUsername": "player123",
      "payload": {
        "spins": 10,
        "remainingSpins": 10
      },
      "occurredAt": "2026-06-03T12:00:00.000Z",
      "metadata": {}
    }

    Success data:

    json
    {
      "accepted": true
    }

    5. Runtime rules

    5.1 Timeouts

    Prosper-to-provider HTTP requests use a default timeout of 5000 ms. Providers should target:

    FlowTarget
    Wallet callbacks to ProsperProvider should retry only after receiving no response or an ambiguous network failure.
    Catalog, launch, promotion actionsProvider should respond within 5 seconds. Faster is preferred for launch.

    5.2 Retry and idempotency

    FlowIdempotency keyExpected retry behavior
    CatalogtraceId for tracing onlyProvider may recompute response.
    LaunchsessionTokenIf the same token is received again, provider should return the same playable session when possible.
    DebittransactionIdRetry with the same transactionId and a new nonce. Prosper returns stored success after first successful debit.
    CredittransactionIdRetry with the same transactionId and a new nonce. Prosper returns stored success after first successful credit.
    Debit-creditdebitTransactionId, creditTransactionIdEach transaction id is idempotent independently.
    Rollbackrollback transactionIdRetry with the same rollback id.
    AdjustmenttransactionIdRetry with the same adjustment id.
    Promotion actionsProsper record id or idempotency key in the recordProvider should return existing provider reference/status for duplicate creates or cancels when possible.

    Never create a new provider transaction id for the same player action after a timeout. Reuse the original transaction id and sign the retry with a fresh nonce.

    5.3 Error handling

    • Provider-to-Prosper authentication error: Prosper returns HTTP 401.
    • Provider-to-Prosper validation error: Prosper returns HTTP 400.
    • Wallet business error: Prosper returns HTTP 200 with non-SC_OK status.
    • Prosper-to-provider HTTP non-2xx: Prosper treats the action as failed.
    • Prosper-to-provider malformed JSON: Prosper treats the action as failed.
    • Prosper-to-provider launch without launchUrl: Prosper treats launch as failed.
    Talk to the team