# Achievements

**URL:** https://heroiclabs.com/docs/hiro/cpp/achievements/
**Keywords:** achievements, hiro
**Categories:** hiro, cpp, achievements

---


# Achievements

Read more about the Achievements system in Hiro [here](../../concepts/achievements/).

## Get all achievements

Get all achievements with progress accumulated by the player.

```cpp
void onAchievementsGet(const Hiro::AchievementList& achievementList)
{
    for (auto it = achievementList.achievements.begin(); it != achievementList.achievements.end(); it++)
    {
        std::cout << "Found achievement: " << it->second.name << '\n';
    }

    for (auto it = achievementList.repeatAchievements.begin(); it != achievementList.repeatAchievements.end(); it++)
    {
        std::cout << "Found repeating achievement: " << it->second.name << '\n';
    }
}

void onError(const Nakama::NError& error)
{
    std::cout << Nakama::toString(error.code) << ": " << error.message << '\n';
}

hiroClient->achievementsGet(session, onAchievementsGet, onError);
```

## Get active achievements

Check `IsActive` on each achievement to show only those in an active time window.

```cpp
void onAchievementsGet(const Hiro::AchievementList& achievementList)
{
    for (auto it = achievementList.achievements.begin(); it != achievementList.achievements.end(); it++)
    {
        if (it->second.IsActive)
        {
            std::cout << "Active achievement: " << it->second.name << '\n';
        }
    }

    for (auto it = achievementList.repeatAchievements.begin(); it != achievementList.repeatAchievements.end(); it++)
    {
        if (it->second.IsActive)
        {
            std::cout << "Active repeating achievement: " << it->second.name << '\n';
        }
    }
}

void onError(const Nakama::NError& error)
{
    std::cout << Nakama::toString(error.code) << ": " << error.message << '\n';
}

hiroClient->achievementsGet(session, onAchievementsGet, onError);
```


## Claim achievements

Claim one or more achievements which have completed their progress.

```cpp
void onAchievementsClaim(const Hiro::AchievementsUpdateAck& achievementsUpdateAck)
{
    for (auto it = achievementsUpdateAck.achievements.begin(); it != achievementsUpdateAck.achievements.end(); it++)
    {
        std::cout << "Found achievement: " << it->second.name << '\n';
    }

    for (auto it = achievementsUpdateAck.repeatAchievements.begin(); it != achievementsUpdateAck.repeatAchievements.end(); it++)
    {
        std::cout << "Found repeating achievement: " << it->second.name << '\n';
    }
}

void onError(const Nakama::NError& error)
{
    std::cout << Nakama::toString(error.code) << ": " << error.message << '\n';
}

Hiro::AchievementsClaimRequest request;
request.ids = {"achievement_1", "achievement_2"};
request.claimTotalReward = true;

hiroClient->achievementsClaim(session, request, onAchievementsClaim, onError);
```


## Update achievement progress

Update one or more achievements with the same progress amount.

```cpp
void onAchievementsUpdate(const Hiro::AchievementsUpdateAck& achievementsUpdateAck)
{
    for (auto it = achievementsUpdateAck.achievements.begin(); it != achievementsUpdateAck.achievements.end(); it++)
    {
        std::cout << "Found achievement: " << it->second.name << '\n';
    }

    for (auto it = achievementsUpdateAck.repeatAchievements.begin(); it != achievementsUpdateAck.repeatAchievements.end(); it++)
    {
        std::cout << "Found repeating achievement: " << it->second.name << '\n';
    }
}

void onError(const Nakama::NError& error)
{
    std::cout << Nakama::toString(error.code) << ": " << error.message << '\n';
}

Hiro::AchievementsUpdateRequest request;
request.ids = {"achievement_1", "achievement_2"};
request.amount = 1;

hiroClient->achievementsUpdate(session, request, onAchievementsUpdate, onError);
```