Skip to main content
Last updated on November 10, 2025

Additional functions for Turn Manager in SDK

The Turn Manager API in the AGS SDK supports several utility functions for additional requirements of your game client.

Get TURN servers

This function is called by the game client to retrieve a list of all available TURN servers.

AccelByteOnlineSubsystemPtr->GetApiClient()->TurnManager.GetTurnServersV2(THandler<FAccelByteModelsTurnServerList>::CreateLambda(
[](const FAccelByteModelsTurnServerList& Result)
{
UE_LOG(LogTemp, Log, TEXT("Get Turn Servers Success!"));
}),
FErrorHandler::CreateLambda([](const int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Log, TEXT("Get Turn Servers Failed! [%d]: %s"), ErrorCode, *ErrorMessage);
}));

Get closest TURN server

This function automatically retrieves a list of all available TURN servers and pings all servers to provide the closest region.

AccelByteOnlineSubsystemPtr->GetApiClient()->TurnManager.GetClosestTurnServerV2(THandler<FAccelByteModelsTurnServer>::CreateLambda(
[](const FAccelByteModelsTurnServer& Result)
{
UE_LOG(LogTemp, Log, TEXT("Get Closest Turn Server Success!"));
}),
FErrorHandler::CreateLambda([](const int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Log, TEXT("Get Closest Turn Server Failed! [%d]: %s"), ErrorCode, *ErrorMessage);
}));

Get TURN server latency by region

This function returns the total latency in milliseconds using a specific region in a parameter.

AccelByteOnlineSubsystemPtr->GetApiClient()->TurnManager.GetTurnServerLatencyByRegion(Region, THandler<int32>::CreateLambda(
[&FuncName, &OutResponse, &bIsOk, &bIsDone](const int32& Result)
{
UE_LOG(LogTemp, Log, TEXT("Get Turn Server Latency By Region Success!"));
}),
FErrorHandler::CreateLambda([&bIsDone](const int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Log, TEXT("Get Turn Server Latency By Region Failed! [%d]: %s"), ErrorCode, *ErrorMessage);
}));

Get TURN server latencies

This function returns all available TURN server regions latencies.

AccelByteOnlineSubsystemPtr->GetApiClient()->TurnManager.GetTurnServerLatencies(THandler<TArray<TPair<FString, float>>>::CreateLambda(
[&FuncName, &OutResponse, &bIsOk, &bIsDone](const TArray<TPair<FString, float>>& Result)
{
UE_LOG(LogTemp, Log, TEXT("Get Turn Server Latencies Success!"));
}),
FErrorHandler::CreateLambda([&bIsDone](const int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Log, TEXT("Get Turn Server Latencies Failed! [%d]: %s"), ErrorCode, *ErrorMessage);
}));

Get cached latencies

The AGS Unreal SDK caches latencies after pinging the available regions. This function returns cached latencies:

AccelByteOnlineSubsystemPtr->GetApiClient()->TurnManager.GetCachedLatencies();

Manually calculate latencies

To retrieve the server list and skip latencies calculation, follow this code example:

GetTurnServerOptionalParameters optionalParameters = new GetTurnServerOptionalParameters();
optionalParameters.AutoCalculateLatency = false;
TurnServerList getTurnServerResult = null;
AccelByteSDK.GetClientRegistry().GetApi().GetTurnManager().GetTurnServers(optionalParameters, result =>
{
if (result.IsError)
{
// Do something if the operation fails
UnityEngine.Debug.LogError($"failed to get TURN servers [{result.Error.Code}]:{result.Error.Message}");
return;
}

// Do something if the operation succeeds
getTurnServerResult = result.Value;
});

The SDK also provide helper functions to calculate the latencies:

// Get this value from the result of GetTurnServers() interface
TurnServerList getTurnServerResult;
// Define a specific server
TurnServer turnServer = getTurnServerResult.servers[0];

#if !UNITY_WEBGL || UNITY_EDITOR
AccelByte.Models.AccelByteResult<int ,Error> pingResult = AccelByte.Utils.Networking.UdpPing(turnServer.ip, (uint) turnServer.qos_port);
#else
// Web platform doesn't support UDP
// Latency must be estimated to the region by sending an HTTP request
string url = AccelByte.Utils.Networking.GetTestServerUrlByRegion(turnServer.region);
AccelByte.Models.AccelByteResult<int ,Error> pingResult = AccelByte.Utils.Networking.HttpPing(url);
#endif
pingResult.OnSuccess(latency =>
{
Debug.Log($"Server {turnServer.region} has latency {latency} ms");
});
pingResult.OnFailed(error =>
{
Debug.LogWarning($"Failed calculating server {turnServer.region} latency.\n{error.Message}");
});