PlaySuper LogoPlaySuper
Unity SDK

Touchpoints & Curated Lists

Fetch and display reward widgets, product collections, and promotional content in your Unity game

Touchpoints & Curated Lists

Beyond the built-in store, you can render reward widgets and product collections directly in your game UI using touchpoints and curated lists.

Touchpoints

Touchpoints are visual widget configurations that control how rewards and promotions appear in your game. Use the TouchpointManager to fetch touchpoint data and render custom widgets.

Fetching touchpoints

// Fetch by name (recommended for most use cases)
TouchpointResponse store = await TouchpointManager.GetTouchpointByName("flash-sale-card", "coin-uuid-abcd");

// Fetch by ID
TouchpointResponse offer = await TouchpointManager.GetTouchpointById(
    "6f9a5737-0247-4a71-89eb-b5d02212f179",
    "coin-uuid-abcd"
);

// List all active touchpoints
TouchpointListResponse list = await TouchpointManager.ListTouchpoints("coin-uuid-abcd");

Processing touchpoint data

if (store?.nodes?.Length > 0)
{
    TouchpointNode node = store.nodes[0];

    Debug.Log($"Layout: {node.layoutHint}");

    string bgImage = node.background?.images?[0];
    string titleText = node.title?[0]?.text;
    string titleColor = node.title?[0]?.color;
    string ctaAction = node.cta?.action;
    string ctaText = node.cta?.text;

    bool timerEnabled = node.GetStyleHint<bool>("timerEnabled", false);

    if (node.HasReward)
    {
        HydratedReward reward = node.GetReward();
        string brandName = reward?.brandName;
    }
}

For the full touchpoint data model, example responses, and all available node fields, see the Touchpoints API Reference.

Curated lists

Curated lists are pre-configured collections of products or rewards set up by PlaySuper. Fetch them by name and display them in your game's UI.

Fetching a curated list

// Products
var products = await PlaySuperUnitySDK.Instance.GetCuratedList(
    CuratedListType.Products,
    "homepage_featured",
    "your-coin-id"
);

// Rewards
var rewards = await PlaySuperUnitySDK.Instance.GetCuratedList(
    CuratedListType.Rewards,
    "daily_deals",
    "your-coin-id"
);
ParameterTypeRequiredDescription
typeCuratedListTypeYesCuratedListType.Products or .Rewards
listNamestringYesName of the curated list (provided by PlaySuper)
coinIdstringYesYour game's coin ID
versionstringNoAPI version for rewards (e.g., "2.0.0")

Working with products

public async void LoadFeaturedProducts()
{
    try
    {
        var response = await PlaySuperUnitySDK.Instance.GetCuratedList(
            CuratedListType.Products,
            "homepage_featured",
            "your-coin-id"
        );

        foreach (var product in response.products)
        {
            Debug.Log($"Product: {product.name}");
            Debug.Log($"Brand: {product.brandName}");
            Debug.Log($"Image: {product.imageUrl}");

            var sku = product.skus[0];
            if (sku.playSuperPrice != null)
            {
                Debug.Log($"Price: {sku.playSuperPrice.discountedListingPrice}");
            }
        }
    }
    catch (Exception ex)
    {
        Debug.LogError($"Failed to load products: {ex.Message}");
    }
}

Key product fields:

FieldDescription
nameProduct display name
brandNameBrand name
imageUrlPrimary product image
imagesAdditional product images
descriptionHTML description
plainTextDescriptionPlain text description
skusAvailable variants with pricing
optionTypesProduct options (size, color, etc.)
ctaUrlDeep link to view/purchase in store

SKU pricing (sku.playSuperPrice):

FieldDescription
listingPriceOriginal price
discountedListingPriceFinal price after discount
discountPercentDiscount percentage

Working with rewards

public async void LoadRewards()
{
    try
    {
        var response = await PlaySuperUnitySDK.Instance.GetCuratedList(
            CuratedListType.Rewards,
            "gift_cards",
            "your-coin-id"
        );

        foreach (var reward in response.rewards)
        {
            Debug.Log($"Title: {reward.metadata.campaignTitle}");
            Debug.Log($"Brand: {reward.brandName}");
            Debug.Log($"Image: {reward.metadata.campaignCoverImage}");

            if (reward.price.Count > 0)
            {
                Debug.Log($"Price: {reward.price[0].amount} coins");
            }

            Debug.Log($"Available: {reward.inventory.availableQuantity}");
        }
    }
    catch (Exception ex)
    {
        Debug.LogError($"Failed to load rewards: {ex.Message}");
    }
}

Key reward fields:

FieldDescription
brandNameBrand name
metadata.campaignTitleReward title
metadata.campaignSubTitleReward subtitle
metadata.campaignCoverImageCover image URL
metadata.brandLogoImageBrand logo URL
metadata.termsAndConditionsTerms and conditions
metadata.howToRedeemRedemption instructions
price[0].amountPrice in coins
inventory.availableQuantityStock remaining
ctaUrlDeep link to store page

Deep-linking to a product or reward

Both products and rewards include a ctaUrl that opens the store directly to that item:

PlaySuperUnitySDK.Instance.OpenStore(product.ctaUrl);
PlaySuperUnitySDK.Instance.OpenStore(reward.ctaUrl);

// With UTM tracking
PlaySuperUnitySDK.Instance.OpenStore(product.ctaUrl, "featured_banner");

Contact your PlaySuper integration team to get curated list names and configure custom lists for your game.

Next, see the Complete Example for a full integration script, offline support, user properties, and troubleshooting.