Unreal Engine SDK
The official InvoSDK plugin for Unreal Engine enables seamless integration with the Invo platform for in-game currency management, item purchases, and player-to-player transfers.
Unreal Engine 4.27+ & 5.x Compatible
The InvoSDK plugin supports both Unreal Engine 4.27+ and Unreal Engine 5.x with full Blueprint and C++ integration.
Quick Integration - Get Started in 30 Minutes
The InvoSDK Unreal plugin is available on GitHub and designed for rapid integration. Get your game connected to the Invo Network in as little as 30 minutes. View on GitHub
Easy Installation
Drop into your Plugins folder and go
Blueprint Support
Full Blueprint integration for visual scripting
C++ Native
Direct C++ API for maximum control
Pre-built UI
Ready-to-use UMG widget components
Installation
Prerequisites
- Unreal Engine 4.27+ or Unreal Engine 5.x
- Windows 64-bit development environment
- Visual Studio 2019 or later (for C++ development)
- An Invo developer account
Step 1: Download the Plugin
Download the latest InvoSDK plugin from the Invo Developer Console or clone from GitHub:
git clone https://github.com/Invo-Technologies/invo-unreal-sdk.git
Step 2: Install the Plugin
Copy the InvoSDK folder into your project's Plugins directory:
YourProject/
├── Content/
├── Source/
└── Plugins/
└── InvoSDK/ ← Place here
├── Source/
├── Content/
└── InvoSDK.upluginStep 3: Enable the Plugin
- 1.Open your project in Unreal Editor
- 2.Go to Edit → Plugins
- 3.Search for "InvoSDK" and enable it
- 4.Restart the editor when prompted
Configuration
The setup wizard automatically creates an InvoSDKConfig asset on first launch. Configure it with your credentials:
| Field | Description | Required |
|---|---|---|
| sdkKey | Your Invo API secret key | Yes |
| gameId | Your unique game identifier | Yes |
| gameName | Display name for your game | Yes |
| playerEmail | Current player's email address | Yes |
| useProduction | Toggle between production/sandbox | Yes |
| gameIconUrl | URL to your game icon | No |
| gameCurrencyName | Name of your in-game currency | No |
Security Warning
Never ship sdkKey in client builds. Use server-side authentication for production deployments.
Blueprint Integration
The SDK provides full Blueprint support for visual scripting. Here's how to make an API request:
Making an API Request
- 1.Right-click in your Blueprint and search for "Invo Request" under InvoSDK | API
- 2.Configure the request parameters (Base URL, Endpoint, Headers, Body, Method)
- 3.Connect the OnSuccess and OnFail execution pins to your handlers
Blueprint Node Configuration
Input Parameters:
Base URL- API host URLEndpoint- API endpoint pathHeaders- HTTP headers mapBody- Request body (JSON)Method- GET, POST, PUT, DELETE
Output Delegates:
OnSuccess- Called on 2xx responseOnFail- Called on error/non-2xx
Delegate Parameters:
ResponseContent- Raw responseStatusCode- HTTP statusbWasSuccessful- Success flagJsonObject- Parsed JSON
JSON Helper Functions
Use the InvoSDK | JSON category for parsing JSON responses in Blueprints:
GetStringFieldExtract a string value from JSON
GetIntegerFieldExtract an integer value from JSON
GetBoolFieldExtract a boolean value from JSON
GetObjectsArrayExtract an array of JSON objects
C++ Integration
For maximum control, use the C++ API directly. Include the necessary headers and link against the InvoSDK module.
Include Headers
#include "InvoSDKApiManager.h" #include "InvoSDKJsonHelpers.h"
Example: Fetch Player Balance
// IMPORTANT: This must run on your dedicated server / authority, never on a
// shipped client build. The SDK key authenticates as your game.
void AMyActor::FetchPlayerBalance(const FString& PlayerEmail)
{
TMap<FString, FString> Headers;
Headers.Add(TEXT("X-Game-Secret-Key"), GetEnvSdkKey()); // server-side env
UInvoSDKApiManager* Request = UInvoSDKApiManager::InvoRequest(
this,
TEXT("https://sandbox.invo.network"),
FString::Printf(TEXT("/sandbox/api/player-balances/player/by-email/%s"),
*FGenericPlatformHttp::UrlEncode(PlayerEmail)),
Headers,
TEXT(""),
EInvoHttpMethod::GET
);
Request->OnSuccess.AddDynamic(this, &AMyActor::OnBalanceReceived);
Request->OnFail.AddDynamic(this, &AMyActor::OnRequestFailed);
Request->Activate();
}
void AMyActor::OnBalanceReceived(
const FString& Content,
int32 StatusCode,
bool bSuccess,
const FJsonObjectWrapper& Json)
{
// Response: { "player": { "player_email", ... }, "balances": [ { "currency_name",
// "available_balance", "reserved_balance", "total_balance" } ], "summary": { ... } }
// Amounts are decimal strings.
const TSharedPtr<FJsonObject>* Player = nullptr;
FString PlayerEmail;
if (Json.JsonObject.IsValid() && Json.JsonObject->TryGetObjectField(TEXT("player"), Player))
{
PlayerEmail = (*Player)->GetStringField(TEXT("player_email"));
}
for (const FJsonObjectWrapper& Row : UInvoSDKJsonHelpers::GetObjectsArray(Json, TEXT("balances")))
{
FString Currency = UInvoSDKJsonHelpers::GetStringField(Row, TEXT("currency_name"));
FString Available = UInvoSDKJsonHelpers::GetStringField(Row, TEXT("available_balance"));
UE_LOG(LogTemp, Log, TEXT("Player %s: %s %s available"), *PlayerEmail, *Available, *Currency);
}
}
void AMyActor::OnRequestFailed(
const FString& Content,
int32 StatusCode,
bool bSuccess,
const FJsonObjectWrapper& Json)
{
UE_LOG(LogTemp, Error, TEXT("Request failed [%d]: %s"), StatusCode, *Content);
}Example: Purchase Item
// Server / authority only, like the balance example above.
void AStoreManager::PurchaseItem(const FString& PlayerEmail, const FString& PlayerName,
const FString& ItemId,
const FString& ItemName, int32 Quantity,
const FString& UnitPrice, const FString& TotalPrice)
{
// Build JSON body (field names as on the Item Purchase page; prices are decimal strings)
TSharedPtr<FJsonObject> JsonBody = MakeShareable(new FJsonObject);
JsonBody->SetStringField(TEXT("client_request_id"), FGuid::NewGuid().ToString()); // reuse on retry
JsonBody->SetStringField(TEXT("player_email"), PlayerEmail);
JsonBody->SetStringField(TEXT("player_name"), PlayerName);
JsonBody->SetStringField(TEXT("item_id"), ItemId);
JsonBody->SetStringField(TEXT("item_name"), ItemName);
JsonBody->SetNumberField(TEXT("item_quantity"), Quantity);
JsonBody->SetStringField(TEXT("unit_price"), UnitPrice);
JsonBody->SetStringField(TEXT("total_price"), TotalPrice);
FString BodyString;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&BodyString);
FJsonSerializer::Serialize(JsonBody.ToSharedRef(), Writer);
TMap<FString, FString> Headers;
Headers.Add(TEXT("X-Game-Secret-Key"), GetEnvSdkKey()); // server-side env
Headers.Add(TEXT("Content-Type"), TEXT("application/json"));
UInvoSDKApiManager* Request = UInvoSDKApiManager::InvoRequest(
this,
TEXT("https://sandbox.invo.network"),
TEXT("/sandbox/api/item-purchases/purchase-item"),
Headers,
BodyString,
EInvoHttpMethod::POST
);
Request->OnSuccess.AddDynamic(this, &AStoreManager::OnPurchaseSuccess);
Request->OnFail.AddDynamic(this, &AStoreManager::OnPurchaseFailed);
Request->Activate();
}API Environments
Sandbox (Development)
- Host:
https://sandbox.invo.network - API:
/sandbox/api/* - Auth:
/sandbox/auth/* - Console: console.invo.network/test
Use for development and testing. No real money.
Production (Live)
- Host:
https://invo.network - API:
/api/* - Auth:
/auth/* - Console: console.invo.network
Live games only. Real money transactions.
Pre-built UI Components
The SDK includes ready-to-use UMG widgets located in Content/UI/ and Content/Widgets/:
Daily Deals
Daily rotating offers display
Featured Items
Showcase featured items and bundles
Item Purchase
Purchase confirmation flow
Send Currency
Player-to-player send flow
Transfer Currency
Cross-game transfer interface
Sender Approval
Not a widget: approval opens INVO's hosted page in the system browser (UInvoHostedApprovalLibrary), with an in-game prompt to compare the match code. The plugin's older SMS verification widget is legacy; do not build on it.
Troubleshooting
| Issue | Cause | Solution |
|---|---|---|
| "Config not found!" | InvoSDKConfig asset missing | Create and configure InvoSDKConfig asset |
| "Player email not set!" | Empty playerEmail in config | Set playerEmail in config or API call |
| 401 Unauthorized | Invalid/expired token | Re-authenticate and refresh token |
| 403 Forbidden | Game inactive or wrong environment | Verify the SDK key matches the environment (sandbox vs production) and the game is set to live or testing |
| Request timeout | Network issues | Verify connectivity and endpoint URL |
Enable Debug Logging
Add the following to your DefaultEngine.ini:
[Core.Log] LogTemp=Verbose
Resources
Additional documentation and support channels