---
title: "Show friends and presence"
description: "Show player profiles, relationships, and current game activity."
seo:
  noindex: true
---

{/* Copyright (c) 2026 Betide Studio. All Rights Reserved. */}

Configure **Social** providers and sign in to each service you want to query. Reading friends does not start a login. Use **Get Crossplay Social Capabilities** to hide unavailable actions.

## Read friends

**Blueprint**

<BlueprintViewer title="Read friends" src="/blueprints/crossplay-read-friends.txt" />

**C++**

Game module dependencies: `UCIKCore`, `BetideCore`.

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadFriends(UGameInstance &GameInstance)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;

    Service->QueryFriends(
        true, FBetideCallback<TArray<FUCIK_Friend>>::CreateWeakLambda(
                  &GameInstance, [](const TBetideResult<TArray<FUCIK_Friend>> &Result) {
                      if (!Result.bOk)
                      {
                          UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                          return;
                      }
                      for (const FUCIK_Friend &Friend : Result.GetValue())
                          UE_LOG(LogUCIK, Log, TEXT("%s"), *Friend.DisplayName);
                  }));
}
```

Keep the returned provider handles for invites and profiles. A display name is not an ID. Bind **On Friends Changed** to refresh the list and **On Friend Presence Changed** for status updates.

## Publish presence

**Blueprint**

<BlueprintViewer title="Publish presence" src="/blueprints/crossplay-publish-presence.txt" />

**C++**

Game module dependencies: `UCIKCore`, `BetideCore`.

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void PublishMenuPresence(UGameInstance &GameInstance)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;

    FUCIK_PresenceUpdate Presence;
    Presence.Status = EUCIK_PresenceStatus::Online;
    Presence.RichPresenceText = TEXT("Choosing a match");
    Service->SetPresence(
        Presence, FBetideCallback<TMap<FBetideProviderId, bool>>::CreateWeakLambda(
                      &GameInstance, [](const TBetideResult<TMap<FBetideProviderId, bool>> &Result) {
                          if (!Result.bOk)
                          {
                              UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                              return;
                          }
                          for (const TPair<FBetideProviderId, bool> &Receipt : Result.GetValue())
                              UE_LOG(LogUCIK, Log, TEXT("%s: %d"), *Receipt.Key.Value.ToString(),
                                     Receipt.Value);
                      }));
}
```

A presence write can succeed on only some providers. Check the returned map for every provider you require; failed providers may be absent.

## Requests and profiles

**Blueprint**

<Accordion>
  <AccordionItem title="Send a friend request">
<BlueprintViewer title="Send a friend request" src="/blueprints/crossplay-send-friend-invite.txt" />
  </AccordionItem>
  <AccordionItem title="List incoming requests">
<BlueprintViewer title="List incoming requests" src="/blueprints/crossplay-pending-friend-invites.txt" />
  </AccordionItem>
  <AccordionItem title="List outgoing requests">
<BlueprintViewer title="List outgoing requests" src="/blueprints/crossplay-outgoing-friend-invites.txt" />
  </AccordionItem>
  <AccordionItem title="Accept a friend request">
<BlueprintViewer title="Accept a friend request" src="/blueprints/crossplay-accept-friend-invite.txt" />
  </AccordionItem>
  <AccordionItem title="Reject a friend request">
<BlueprintViewer title="Reject a friend request" src="/blueprints/crossplay-reject-friend-invite.txt" />
  </AccordionItem>
  <AccordionItem title="Read player profiles">
<BlueprintViewer title="Read player profiles" src="/blueprints/crossplay-player-profiles.txt" />
  </AccordionItem>
  <AccordionItem title="Read player presence">
<BlueprintViewer title="Read player presence" src="/blueprints/crossplay-query-presence.txt" />
  </AccordionItem>
</Accordion>

**C++**

Game module dependencies: `UCIKCore`, `BetideCore`.

<Accordion>

  <AccordionItem title="Send a friend request">

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void SendFriendRequest(UGameInstance &GameInstance, const FUCIK_PlayerHandle &Player)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->SendFriendInvite(
        Player,
        FBetideCallback<bool>::CreateWeakLambda(&GameInstance, [](const TBetideResult<bool> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            UE_LOG(LogUCIK, Log, TEXT("Friend request operation completed: %d"), Result.GetValue());
        }));
}
```

  </AccordionItem>

  <AccordionItem title="Accept a friend request">

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void AcceptFriendRequest(UGameInstance &GameInstance, const FUCIK_PlayerHandle &Player)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->AcceptFriendInvite(
        Player,
        FBetideCallback<bool>::CreateWeakLambda(&GameInstance, [](const TBetideResult<bool> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            UE_LOG(LogUCIK, Log, TEXT("Friend request operation completed: %d"), Result.GetValue());
        }));
}
```

  </AccordionItem>

  <AccordionItem title="Reject a friend request">

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void RejectFriendRequest(UGameInstance &GameInstance, const FUCIK_PlayerHandle &Player)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->RejectFriendInvite(
        Player,
        FBetideCallback<bool>::CreateWeakLambda(&GameInstance, [](const TBetideResult<bool> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            UE_LOG(LogUCIK, Log, TEXT("Friend request operation completed: %d"), Result.GetValue());
        }));
}
```

  </AccordionItem>

  <AccordionItem title="List incoming requests">

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadIncomingRequests(UGameInstance &GameInstance)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->GetPendingFriendInvites(FBetideCallback<TArray<FUCIK_Friend>>::CreateWeakLambda(
        &GameInstance, [](const TBetideResult<TArray<FUCIK_Friend>> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            for (const FUCIK_Friend &Entry : Result.GetValue())
                UE_LOG(LogUCIK, Log, TEXT("%s"), *Entry.DisplayName);
        }));
}
```

  </AccordionItem>

  <AccordionItem title="List outgoing requests">

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadOutgoingRequests(UGameInstance &GameInstance)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->GetOutgoingFriendInvites(FBetideCallback<TArray<FUCIK_Friend>>::CreateWeakLambda(
        &GameInstance, [](const TBetideResult<TArray<FUCIK_Friend>> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            for (const FUCIK_Friend &Entry : Result.GetValue())
                UE_LOG(LogUCIK, Log, TEXT("%s"), *Entry.DisplayName);
        }));
}
```

  </AccordionItem>

  <AccordionItem title="Read player profiles">

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadPlayerProfiles(UGameInstance &GameInstance, const TArray<FUCIK_PlayerHandle> &Players)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->QueryPlayerProfiles(
        Players, FBetideCallback<TArray<FUCIK_PlayerProfile>>::CreateWeakLambda(
                     &GameInstance, [](const TBetideResult<TArray<FUCIK_PlayerProfile>> &Result) {
                         if (!Result.bOk)
                         {
                             UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                             return;
                         }
                         for (const FUCIK_PlayerProfile &Entry : Result.GetValue())
                             UE_LOG(LogUCIK, Log, TEXT("%s"), *Entry.DisplayName);
                     }));
}
```

  </AccordionItem>

  <AccordionItem title="Read player presence">

```cpp
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadPlayerPresence(UGameInstance &GameInstance, const TArray<FUCIK_PlayerHandle> &Players)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->QueryPresence(
        Players, FBetideCallback<TArray<FUCIK_Presence>>::CreateWeakLambda(
                    &GameInstance, [](const TBetideResult<TArray<FUCIK_Presence>> &Result) {
                        if (!Result.bOk)
                        {
                            UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                            return;
                        }
                        for (const FUCIK_Presence &Entry : Result.GetValue())
                            UE_LOG(LogUCIK, Log, TEXT("%s"), *Entry.RichPresenceText);
                    }));
}
```

  </AccordionItem>

</Accordion>

<Accordion>
  <AccordionItem title="Store differences">

The available actions depend on the signed-in provider. A friends list does not imply support for sending friend requests. Avatars may be missing; supply your own fallback image.

Steam owns a separate startup login even when EOS is the primary Crossplay identity. One Steam account cannot represent multiple independent PIE clients; see [testing](/start/testing).

Rich-presence text alone does not make a match joinable. Use [party invites](/crossplay/parties-invites) and the plugin's published lobby/session destination.

  </AccordionItem>
</Accordion>
