The official Unreal Engine plugin for integrating with the Invo platform
Installation • Quick Start • Features • API Reference • Support
InvoSDK is an enterprise-grade Unreal Engine plugin that seamlessly integrates your game with the Invo platform — enabling in-game currency management, item purchases, player-to-player transfers, and real-money transactions. Built with performance and ease-of-use in mind, the SDK provides both C++ and Blueprint interfaces for maximum flexibility.
- Production-Ready: Battle-tested infrastructure handling millions of transactions
- Dual Interface: Full C++ API with complete Blueprint exposure
- Async by Design: Non-blocking HTTP operations for smooth gameplay
- Pre-built UI: Ready-to-use UMG widgets for common flows
- Secure: Industry-standard authentication and encryption
┌─────────────────────────────────────────────────────────────────────────────┐
│ YOUR GAME │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ Blueprints │────▶│ BP_InvoSDK │────▶│ Pre-built UI │ │
│ │ (Your Game) │ │ Manager │ │ Widgets │ │
│ └──────────────┘ └────────┬─────────┘ └─────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ C++ Game │────▶│ UInvoSDKApi │────▶│ UInvoSDKJson │ │
│ │ Code │ │ Manager │ │ Helpers │ │
│ └──────────────┘ └────────┬─────────┘ └─────────────────────┘ │
│ │ │
├─────────────────────────────────┼───────────────────────────────────────────┤
│ INVOSDK PLUGIN │
│ │ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ Unreal HTTP Module │ │
│ │ (Async Requests) │ │
│ └────────────┬───────────┘ │
│ │ │
└─────────────────────────────────┼───────────────────────────────────────────┘
│
▼ HTTPS
┌─────────────────────────┐
│ INVO PLATFORM │
│ ┌───────────────────┐ │
│ │ Authentication │ │
│ │ /auth/* │ │
│ └───────────────────┘ │
│ ┌───────────────────┐ │
│ │ API Services │ │
│ │ /api/* │ │
│ └───────────────────┘ │
└─────────────────────────┘
┌─────────┐ ┌──────────────┐ ┌─────────────┐ ┌───────────┐ ┌─────────┐
│ Game │ │ InvoRequest │ │ Activate │ │ HTTP │ │ Invo │
│ Code │ │ (Factory) │ │ (Execute) │ │ Module │ │ API │
└────┬────┘ └──────┬───────┘ └──────┬──────┘ └─────┬─────┘ └────┬────┘
│ │ │ │ │
│ Create Node │ │ │ │
│───────────────▶│ │ │ │
│ │ │ │ │
│ │ Configure │ │ │
│ │──────────────────▶│ │ │
│ │ │ │ │
│ │ │ Send Request │ │
│ │ │────────────────▶│ │
│ │ │ │ │
│ │ │ │ HTTPS POST │
│ │ │ │──────────────▶│
│ │ │ │ │
│ │ │ │ JSON Response│
│ │ │ │◀──────────────│
│ │ │ │ │
│ │ │ HandleResponse │ │
│ │ │◀────────────────│ │
│ │ │ │ │
│ OnSuccess/OnFail (Delegate) │ │ │
│◀───────────────────────────────────│ │ │
│ │ │ │ │
┌─────────────────────────────────────────────────────────────┐
│ InvoSDK Module │
├─────────────────────────────────────────────────────────────┤
│ │
│ Public Dependencies Private Dependencies │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Core │ │ CoreUObject │ │
│ │ HTTP │ │ Engine │ │
│ │ Json │ │ Slate │ │
│ │ JsonUtilities │ │ SlateCore │ │
│ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
- 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 (Register here)
Download the latest release from the Invo Developer Portal or clone this repository.
Copy the InvoSDK folder into your project's Plugins directory:
YourProject/
├── Content/
├── Source/
└── Plugins/
└── InvoSDK/ ← Place here
├── Source/
├── Content/
├── Binaries/
└── InvoSDK.uplugin
- Open your project in Unreal Editor
- Go to Edit → Plugins
- Search for "InvoSDK"
- Enable the plugin and restart the editor
The setup wizard will automatically create 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 | Yes |
gameIconUrl |
URL to your game icon | No |
gameCurrencyName |
Name of your in-game currency | No |
gameCurrencyUrl |
URL to currency icon | No |
gameVersion |
Your game version string | No |
useProduction |
Toggle production/sandbox | Yes |
⚠️ Security Warning: Never shipsdkKeyin client builds. Use server-side authentication for production deployments.
InvoSDK supports two environments for development and production use:
Host: https://sandbox.invo.network
API: /sandbox/api/*
Auth: /sandbox/auth/*
Console: https://dev.console.invo.network
Always use sandbox for development and testing. Sandbox provides:
- Test accounts with unlimited currency
- No real money transactions
- Full API feature parity with production
- Isolated data that won't affect production
Host: https://invo.network
API: /api/*
Auth: /auth/*
Console: https://console.invo.network
🔒 Important: Only switch to production when your game is ready for release. All transactions in production involve real money.
-
Create an API Request Node
In your Blueprint, right-click and search for
Invo Requestunder the InvoSDK | API category. -
Configure the Request
Base URL: https://sandbox.invo.network Endpoint: /sandbox/api/player/balance Method: GET Headers: Authorization: Bearer <your_token> Body: (empty for GET) -
Handle the Response
Connect the
OnSuccessandOnFailexecution pins to your response handlers.
#include "InvoSDKApiManager.h"
#include "InvoSDKJsonHelpers.h"
void AMyActor::FetchPlayerBalance()
{
TMap<FString, FString> Headers;
Headers.Add(TEXT("Authorization"), TEXT("Bearer ") + AuthToken);
UInvoSDKApiManager* Request = UInvoSDKApiManager::InvoRequest(
this,
TEXT("https://sandbox.invo.network"),
TEXT("/sandbox/api/player/balance"),
Headers,
TEXT(""), // Empty body for GET
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)
{
int32 Balance = UInvoSDKJsonHelpers::GetIntegerField(Json, TEXT("balance"));
UE_LOG(LogTemp, Log, TEXT("Player balance: %d"), Balance);
}
void AMyActor::OnRequestFailed(const FString& Content, int32 StatusCode,
bool bSuccess, const FJsonObjectWrapper& Json)
{
UE_LOG(LogTemp, Error, TEXT("Request failed [%d]: %s"), StatusCode, *Content);
}| Feature | Description | Blueprint | C++ |
|---|---|---|---|
| Player Balance | Get/update player currency balance | ✅ | ✅ |
| Item Catalog | Fetch available items for purchase | ✅ | ✅ |
| Item Purchase | Process item purchases | ✅ | ✅ |
| Currency Transfer | Player-to-player transfers | ✅ | ✅ |
| SMS Verification | Two-factor authentication | ✅ | ✅ |
| Transaction History | View past transactions | ✅ | ✅ |
The SDK includes ready-to-use UMG widgets located in Content/UI/:
| Widget Category | Description |
|---|---|
DailyDeals/ |
Daily rotating offers display |
Featured/ |
Featured items showcase |
FeaturedBundleBox/ |
Bundle promotion displays |
Item/ |
Individual item cards |
ItemPurchase/ |
Purchase confirmation flow |
NavBar/ |
Navigation components |
QuickSend/ |
Quick currency send interface |
RecentPurchases/ |
Purchase history display |
SendCurrency/ |
Currency sending flow |
TransferCurrency/ |
Full transfer interface |
WeeklyFeaturedBundle/ |
Weekly bundle promotions |
The core class for making HTTP requests to the Invo API.
Creates and configures a new API request node.
UFUNCTION(BlueprintCallable, Category = "InvoSDK|API")
static UInvoSDKApiManager* InvoRequest(
UObject* WorldContextObject,
const FString& BaseUrl,
const FString& Endpoint,
const TMap<FString, FString>& Headers,
const FString& Body,
EInvoHttpMethod Method
);| Parameter | Type | Description |
|---|---|---|
WorldContextObject |
UObject* |
World context for the request |
BaseUrl |
FString |
Base URL (e.g., https://sandbox.invo.network) |
Endpoint |
FString |
API endpoint (e.g., /sandbox/api/player/balance) |
Headers |
TMap<FString, FString> |
HTTP headers (Authorization, etc.) |
Body |
FString |
Request body (JSON string for POST/PUT) |
Method |
EInvoHttpMethod |
HTTP method (GET, POST, PUT, DELETE) |
// Called on successful response (2xx status codes)
UPROPERTY(BlueprintAssignable)
FInvoSDKOnResponse OnSuccess;
// Called on failed response (non-2xx or network error)
UPROPERTY(BlueprintAssignable)
FInvoSDKOnResponse OnFail;DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(
FInvoSDKOnResponse,
const FString&, ResponseContent, // Raw response body
int32, StatusCode, // HTTP status code
bool, bWasSuccessful, // Network success flag
const FJsonObjectWrapper&, JsonObject // Parsed JSON response
);Enumeration of supported HTTP methods.
UENUM(BlueprintType)
enum class EInvoHttpMethod : uint8
{
GET UMETA(DisplayName = "GET"),
POST UMETA(DisplayName = "POST"),
PUT UMETA(DisplayName = "PUT"),
DELETE UMETA(DisplayName = "DELETE")
};Blueprint function library for parsing JSON responses.
UFUNCTION(BlueprintPure, Category = "InvoSDK|JSON")
static FString GetStringField(
const FJsonObjectWrapper& JsonWrapper,
const FString& FieldName
);UFUNCTION(BlueprintPure, Category = "InvoSDK|JSON")
static int32 GetIntegerField(
const FJsonObjectWrapper& JsonWrapper,
const FString& FieldName
);UFUNCTION(BlueprintPure, Category = "InvoSDK|JSON")
static bool GetBoolField(
const FJsonObjectWrapper& JsonWrapper,
const FString& FieldName
);UFUNCTION(BlueprintPure, Category = "InvoSDK|JSON")
static TArray<FJsonObjectWrapper> GetObjectsArray(
const FJsonObjectWrapper& JsonWrapper,
const FString& FieldName
);┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ User │ │ Your Game │ │ InvoSDK │ │ Invo API │
└────┬────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │ │
│ Login Request │ │ │
│────────────────▶│ │ │
│ │ │ │
│ │ POST /auth/login │ │
│ │──────────────────▶│ │
│ │ │ │
│ │ │ HTTPS Request │
│ │ │──────────────────▶│
│ │ │ │
│ │ │ Access Token │
│ │ │◀──────────────────│
│ │ │ │
│ │ OnSuccess │ │
│ │◀──────────────────│ │
│ │ │ │
│ │ GET /auth/csrf │ │
│ │──────────────────▶│ │
│ │ │──────────────────▶│
│ │ │◀──────────────────│
│ │◀──────────────────│ │
│ │ │ │
│ Login Success │ │ │
│◀────────────────│ │ │
│ │ │ │
-
Login Request
- Endpoint:
POST /sandbox/auth/login - Body:
{"email": "[email protected]", "password": "..."}
- Endpoint:
-
Get CSRF Token
- Endpoint:
GET /sandbox/auth/csrf-token - Store the token for subsequent requests
- Endpoint:
-
Make Authenticated Requests
- Include
Authorization: Bearer <access_token>header - Include
X-CSRF-Token: <csrf_token>header for mutations
- Include
void AStoreManager::PurchaseItem(const FString& ItemId, int32 Quantity)
{
// Build request body
TSharedPtr<FJsonObject> JsonBody = MakeShareable(new FJsonObject);
JsonBody->SetStringField(TEXT("itemId"), ItemId);
JsonBody->SetNumberField(TEXT("quantity"), Quantity);
FString BodyString;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&BodyString);
FJsonSerializer::Serialize(JsonBody.ToSharedRef(), Writer);
// Configure headers
TMap<FString, FString> Headers;
Headers.Add(TEXT("Authorization"), TEXT("Bearer ") + AccessToken);
Headers.Add(TEXT("X-CSRF-Token"), CSRFToken);
// Make request
UInvoSDKApiManager* Request = UInvoSDKApiManager::InvoRequest(
this,
TEXT("https://sandbox.invo.network"),
TEXT("/sandbox/api/store/purchase"),
Headers,
BodyString,
EInvoHttpMethod::POST
);
Request->OnSuccess.AddDynamic(this, &AStoreManager::OnPurchaseSuccess);
Request->OnFail.AddDynamic(this, &AStoreManager::OnPurchaseFailed);
Request->Activate();
}| Issue | Cause | Solution |
|---|---|---|
| "Config not found!" | InvoSDKConfig asset missing or not loaded |
Ensure the config asset exists in your project and is properly referenced |
| "Player email not set!" | Empty playerEmail in config |
Set the player's email in InvoSDKConfig or pass it directly to API calls |
| Request timeout | Network issues or incorrect endpoint | Verify network connectivity and endpoint URLs |
| 401 Unauthorized | Invalid or expired token | Re-authenticate and obtain a fresh access token |
| 403 Forbidden | Missing CSRF token or permissions | Include CSRF token in headers; verify API permissions |
| JSON parse errors | Malformed response | Check API endpoint and request format |
InvoSDK logs all requests and responses. Enable verbose logging in your project settings:
- Open
DefaultEngine.ini - Add the following:
[Core.Log]
LogTemp=VerboseCheck the Output Log in Unreal Editor for InvoSDK Request Success and InvoSDK Request Failed messages.
To verify connectivity to Invo servers:
// Test request to verify API connectivity
UInvoSDKApiManager* TestRequest = UInvoSDKApiManager::InvoRequest(
this,
TEXT("https://sandbox.invo.network"),
TEXT("/sandbox/api/health"),
TMap<FString, FString>(),
TEXT(""),
EInvoHttpMethod::GET
);
TestRequest->OnSuccess.AddDynamic(this, &AMyActor::OnConnected);
TestRequest->OnFail.AddDynamic(this, &AMyActor::OnConnectionFailed);
TestRequest->Activate();- Never expose API keys in client builds — Use server-side authentication
- Always use HTTPS — The SDK enforces this by default
- Implement token refresh — Access tokens expire; implement automatic refresh
- Validate on server — Never trust client-side validation alone
- Cache responses — Store frequently-accessed data (catalogs, player info)
- Batch requests — Combine multiple API calls when possible
- Handle offline gracefully — Implement retry logic and offline queuing
- Show loading states — Indicate when API calls are in progress
- Handle errors gracefully — Display user-friendly error messages
- Implement optimistic UI — Update UI immediately, reconcile with server
If upgrading from an earlier version of InvoSDK:
- Back up your project
- Remove the old
InvoSDKplugin folder - Install the new version following the Installation steps
- Update any deprecated API calls (see changelog)
- Regenerate project files and rebuild
- Email: [email protected]
- Discord: Invo Developer Community
- GitHub Issues: Report bugs and feature requests
- Initial release
- Core API manager with async HTTP support
- Blueprint integration for all API calls
- JSON helper utilities
- Pre-built UI components
- Sandbox and production environment support
This SDK is proprietary software. See LICENSE for terms and conditions.
Built with ❤️ by the Invo Team