> ## Documentation Index
> Fetch the complete documentation index at: https://docs.almedia.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Reward hub

> How to integrate the Almedia SDK — synced from the source repository.

Linked players have a reward progression screen - a webview showing what they have earned and what is next. Open it with:

```csharp theme={"theme":{"light":"github-light","dark":"night-owl"}}
Almedia.ShowRewardHub();
```

Check `CanShowRewardHub` on the `Linked` status before calling, gate your entry point on it, and refresh on `OnStatusChanged` - see [What can actually be shown](https://docs.almedia.dev/technical/integration-guide/status-and-lifecycle.md#what-can-actually-be-shown). A linked player does not always have the reward hub, and availability can change mid-session.

Calling in any state is still safe. The screen opens only for a linked player for whom the reward hub is currently available; otherwise the call does nothing and the reason is logged through `OnLog`. Before the SDK is ready (the first `OnStatusChanged`), it no-ops with a warning.

Only one in-app screen can be open at a time. A call made while another screen is already open is ignored with a log.

## Screen lifecycle

The reward hub reports its lifecycle through the unified screen events - see [Pausing your game](https://docs.almedia.dev/technical/integration-guide/pausing-your-game.md). The dismissal reports how it was closed:

```csharp theme={"theme":{"light":"github-light","dark":"night-owl"}}
Almedia.OnScreenDismissed += (screen, result) =>
{
    if (screen != AlmediaScreen.RewardHub) return;
    switch (result)
    {
        case AlmediaInAppScreenResult.Completed _:   // closed by the web client
            break;
        case AlmediaInAppScreenResult.Cancelled _:   // player closed it themselves
            break;
        case AlmediaInAppScreenResult.Failed failed: // the screen could not load
            Debug.LogWarning(failed.Error.Message);
            break;
        default:
            break;
    }
};
```

Only `Failed` carries an `Error`. The SDK re-syncs the player's state **before** the dismissal fires, so state read in the handler is already up to date; an `OnStatusChanged` may arrive around the same moment.

***


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.