This page describes the HTTP endpoints offered by the Remote Control API, and details the format of the message body you need to include when you call each endpoint.
GET remote/info
Use this endpoint to see all the HTTP routes available in the Remote Control API. The call returns a JSON payload with all the available HTTP routes and their descriptions.
Example
Send the request with an empty request body. A successful request returns a 200 status with the following response body:
{
"HttpRoutes": [
{
"Path": "/remote/info",
"Verb": "Get",
"Description": "Get information about different routes available on this API."
},
{
"Path": "/remote",
"Verb": "Options",
"Description": "Allows cross-origin http requests to the API."
},
{
"Path": "/remote/batch",
"Verb": "Put",
"Description": "Allows batching multiple calls into one request."
}
...
]
}
PUT remote/object/call
Use this endpoint to call a function exposed by a specified UObject
that is currently in memory in the Editor: typically an Actor in the current Level or an Asset in your Project.
You can call any function that is callable from Blueprint. This includes any function defined in C++ with the BlueprintCallable
specifier, or any function that is defined and implemented entirely in Blueprint.
When you call this endpoint, you must pass a JSON payload with the following properties:
Property | Description |
---|---|
objectPath |
The path that uniquely identifies the |
functionName |
The name of the function you want to call from the specified |
parameters |
An object that defines the parameters you want to pass to the function.
You don't have to include a property in this object for every parameter the function accepts. For any parameter that you omit, the Web Remote Control system will construct a default object of the appropriate type. |
generateTransaction |
Defines whether or not the Editor should record this function call in the Project's transaction history. Setting this property to
|
The call returns a JSON payload that contains the return value of the function called, along with any other output parameters specified in the function's definition.
Example
Request body:
{
"objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5",
"functionName" : "SetActorLocation",
"parameters" : {
"NewLocation" : {"X" : 100, "Y" : 0, "Z" : 30}, // These values are used to create a new Vector
"bSweep" : true
},
"generateTransaction" : true
}
A successful request gives a 200
status with the following response body:
{
"SweepHitResult":{
"bBlockingHit":true,
"bStartPenetrating":false,
"FaceIndex":-1,
"Time":0.338644,
"Distance":170.822,
"Location":{ "X":100, "Y":0, "Z":429.178 },
"ImpactPoint":{ "X":169, "Y":30, "Z":354 },
"Normal":{ "X":-1.51964e-11, "Y":4.01851e-8, "Z":1 },
"ImpactNormal":{ "X":-1.51964e-11, "Y":4.01851e-8, "Z":1 },
"TraceStart":{ "X":100, "Y":0, "Z":600 },
"TraceEnd":{ "X":100, "Y":0, "Z":100 },
"PenetrationDepth":0,
"Item":-1,
"PhysMaterial":"",
"Actor":"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Bump_StaticMesh",
"Component":"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Bump_StaticMesh.StaticMeshComponent0",
"BoneName":"None",
"MyBoneName":"None"
},
"ReturnValue":true
}
In this case, the SweepHitResult
is included in the return value because the original definition of the SetActorLocation()
function in the Engine/Source/Runtime/Engine/Classes/GameFramework/Actor.h
file defines it as an output parameter: that is, a non-const reference to a data value that is produced by the function call.
PUT remote/object/property
Use this endpoint to access property values exposed by a specified UObject currently in memory in the Editor: typically an Actor or an Asset.
If the UObject you are accessing is an instance of a C++ class, this includes any class members defined in C++ as properties that are accessible to Blueprint, subject to the restrictions below.
If the UObject you are accessing is an instance of a Blueprint class, this includes any Blueprint variables owned by that class, subject to the restrictions below.
This endpoint can only access properties that meet certain criteria:
- The property must be defined as
public
. It may not beprivate
orprotected
. - It must not have any
BlueprintGetter
orBlueprintSetter
functions defined. If it does, you must use those functions with theremote/object/call
endpoint described above instead of trying to read or write the values directly using theremote/object/property
endpoint. - If you are accessing the object in the Editor, the property must be set as
EditAnywhere
. In order to modify the value, the property must not be set asEditConst
. - If you are accessing an object in
-game
mode or Play In Editor (PIE) mode, the property must be set asBlueprintVisible
. In order to modify the value, the property must not be set asBlueprintReadOnly
.
Depending on the way you construct your request message, you can:
- Request all available properties exposed by the object, along with their current values.
- Request the value of any property that offers at least read access.
- Set the value of any properties that offer write access.
When you call this endpoint, you must pass a JSON payload with the following properties:
Property | Description |
---|---|
objectPath |
The path that uniquely identifies the |
propertyName |
The name of the property you want to read or modify. If you omit this property in a call with |
access |
Defines the kind of access request you are making for the property. This can be any of the following values:
|
propertyValue |
When you make a request with This must be a JSON object in which the name of each field matches the name of a writeable property on the specified |
The call returns a JSON payload that contains the information you requested, or the result of your write request.
Examples
Reading all Properties
Request body:
{
"objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5",
"access" : "READ_ACCESS"
}
A successful request gives a 200
status with the following response body:
{
"bStaticMeshReplicateMovement": false,
"NavigationGeometryGatheringMode": "Default",
"PrimaryActorTick": {
"TickGroup": "TG_PrePhysics",
"EndTickGroup": "TG_PrePhysics",
"bTickEvenWhenPaused": false,
"bCanEverTick": false,
"bStartWithTickEnabled": true,
"bAllowTickOnDedicatedServer": true,
"TickInterval": 0
},
"bHidden": false,
"bOnlyRelevantToOwner": false,
"bAlwaysRelevant": false,
"bReplicateMovement": false,
"bNetLoadOnClient": true,
"bNetUseOwnerRelevancy": false,
"bRelevantForLevelBounds": true,
"bReplayRewindable": false,
"bAllowTickBeforeBeginPlay": false,
"bBlockInput": false,
"bCanBeDamaged": false,
"bFindCameraComponentWhenViewTarget": true,
"bGenerateOverlapEventsDuringLevelStreaming": false,
"bIgnoresOriginShifting": false,
"bEnableAutoLODGeneration": true,
"bIsEditorOnlyActor": false,
"ReplicatedMovement": {
"LinearVelocity": { "X": 0, "Y": 0, "Z": 0 },
"AngularVelocity": { "X": 0, "Y": 0, "Z": 0 },
"Location": { "X": 0, "Y": 0, "Z": 0 },
"Rotation": { "Pitch": 0, "Yaw": 0, "Roll": 0 },
"bSimulatedPhysicSleep": false,
"bRepPhysics": false,
"LocationQuantizationLevel": "RoundWholeNumber",
"VelocityQuantizationLevel": "RoundWholeNumber",
"RotationQuantizationLevel": "ByteComponents"
},
"InitialLifeSpan": 0,
"NetDormancy": "DORM_Awake",
"SpawnCollisionHandlingMethod": "AlwaysSpawn",
"AutoReceiveInput": "Disabled",
"InputPriority": 0,
"NetCullDistanceSquared": 2.25e+08,
"NetUpdateFrequency": 100,
"MinNetUpdateFrequency": 2,
"NetPriority": 1,
"SpriteScale": 1,
"Tags": []
}
Reading a Single Property
Request body:
{
"objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5.StaticMeshComponent0",
"propertyName" : "StreamingDistanceMultiplier",
"access" : "READ_ACCESS",
}
A successful request gives a 200
status with the following response body:
{
"StreamingDistanceMultiplier": 1
}
Writing Properties
Request body:
{
"objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5.StaticMeshComponent0",
"access" : "WRITE_ACCESS",
"propertyName" : "StreamingDistanceMultiplier",
"propertyValue" : {
"StreamingDistanceMultiplier" : 2
}
}
A successful request gives a 200
status with an empty response body.
PUT remote/object/thumbnail
Use this endpoint to retrieve the thumbnail image of an Asset in the Content Browser. The call returns a JSON payload that contains the thumbnail.
Example
Request body:
{
"objectPath" : "/Game/Mannequin/Animations/ThirdPersonJump_Start.ThirdPersonJump_Start"
}
A successful request returns a 200 status with the thumbnail image in the response body:

PUT remote/search/assets
Use this endpoint to search for an Asset in the Asset Registry.
When you call this endpoint, you must pass a JSON payload with the following properties:
Property | Description |
---|---|
Query | The text you want to match in an asset's name. Leaving this field an empty string returns all results. |
Filter | A JSON object to specify how you want to filter the requested assets with the following optional properties:
|
The call returns a JSON payload that contains the information you requested.
Example
Request body:
{
"Query": "Cube",
"Filter": {
"PackageNames": [],
"ClassNames": [],
"PackagePaths": [],
"RecursiveClassesExclusionSet": [],
"RecursivePaths": false,
"RecursiveClasses": false
}
}
A successful request returns a 200 status with the following response body:
{
"Assets": [
{
"Name": "CubeMaterial",
"Class": "Material",
"Path": "/Game/Geometry/Meshes/CubeMaterial.CubeMaterial"
},
{
"Name": "1M_Cube",
"Class": "StaticMesh",
"Path": "/Game/Geometry/Meshes/1M_Cube.1M_Cube"
},
{
"Name": "1M_Cube_Chamfer",
"Class": "StaticMesh",
"Path": "/Game/Geometry/Meshes/1M_Cube_Chamfer.1M_Cube_Chamfer"
}
]
}
PUT remote/object/describe
Use this endpoint to see all the properties, functions, and other metadata about a UObject currently in memory in the Editor, such as an Actor or an Asset. The call returns a JSON payload that contains the information you requested.
Example
Request body:
{
"objectPath": "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5"
}
A successful request returns a 200 status with the following response body:
{
"Name": "CubeMesh_5",
"Class": "/Script/Engine.StaticMeshActor",
"Properties": [
{
"Name": "StaticMeshComponent",
"Description": "",
"Type": "UStaticMeshComponent*",
"ContainerType": "",
"KeyType": "",
"Metadata": {}
},
{
"Name": "PrimaryActorTick",
"Description": "Primary Actor tick function, which calls TickActor().\nTick functions can be configured to control whether ticking is enabled, at what time during a frame the update occurs, and to set up tick dependencies.\n@see https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/FTickFunction/\n@see AddTickPrerequisiteActor(), AddTickPrerequisiteComponent()",
"Type": "FActorTickFunction",
"ContainerType": "",
"KeyType": "",
"Metadata": {
"ToolTip": "Primary Actor tick function, which calls TickActor().\nTick functions can be configured to control whether ticking is enabled, at what time during a frame the update occurs, and to set up tick dependencies.\n@see https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/FTickFunction/\n@see AddTickPrerequisiteActor(), AddTickPrerequisiteComponent()"
}
},
{
"Name": "bOnlyRelevantToOwner",
"Description": "If true, this actor is only relevant to its owner. If this flag is changed during play, all non-owner channels would need to be explicitly closed.",
"Type": "uint8",
"ContainerType": "",
"KeyType": "",
"Metadata": {
"ToolTip": "If true, this actor is only relevant to its owner. If this flag is changed during play, all non-owner channels would need to be explicitly closed."
}
},
...
]
}
PUT remote/batch
Use this endpoint to group multiple HTTP requests into a single remote call. The order of execution is determined by the order of the elements in the Requests array.
Each request element in the Requests array must be a JSON object with the following properties:
Request Property | Description |
---|---|
RequestId | A unique ID to be able to match the request with the corresponding response. |
URL | The request target, such as /remote/object/describe . |
Verb | Options for the HTTP method are PUT, POST, GET, and DELETE. |
Body | The data that is sent to the server. Not at all requests have a body. |
The call returns a JSON payload that contains an array of responses for the multiple requests. Each element in the array has the following properties:
Response Property | Description |
---|---|
RequestId | A unique ID to match the response to the corresponding request. |
ResponseCode | The status code of the response. A successful response returns the status 200. |
ResponseBody | Payload containing any requested data. Not all responses have a response body. |
Example
Request body:
{
"Requests" : [
{
"RequestId" : 1,
"URL": "/remote/object/property",
"Verb" : "PUT",
"Body": {
"objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5.StaticMeshComponent0",
"propertyName": "StreamingDistanceMultiplier",
"access" : "READ_ACCESS"
}
},
{
"RequestId" : 2,
"URL": "/remote/object/property",
"Verb" : "PUT",
"Body": {
"objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5.StaticMeshComponent0",
"propertyName": "StreamingDistanceMultiplier",
"propertyValue": {
"StreamingDistanceMultiplier" : 2
},
"access" : "WRITE_ACCESS"
}
},
{
"RequestId" : 3,
"URL": "/remote/object/property",
"Verb" : "PUT",
"Body": {
"objectPath" : "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5.StaticMeshComponent0",
"propertyName": "StreamingDistanceMultiplier",
"access" : "READ_ACCESS"
}
}
]
}
A successful request returns the following response body with an array of responses for each request:
{
"Responses": [
{
"RequestId": 1,
"ResponseCode": 200,
"ResponseBody": {
"StreamingDistanceMultiplier": 1
}
},
{
"RequestId": 2,
"ResponseCode": 200,
"ResponseBody": null
},
{
"RequestId": 3,
"ResponseCode": 200,
"ResponseBody": {
"StreamingDistanceMultiplier": 2
}
}
]
}
PUT remote/object/event
This route is experimental. Enable it by adding the following console variable to your project's DefaultEngine.ini file.
[Console Variables]
WebControl.EnableExperimentalRoutes = 1
Use this endpoint to receive the object's next event, such as receiving an update when an object's property changes. The route will not return until the event has occurred.
The following events are currently supported:
-
ObjectPropertyChanged
-
PreObjectPropertyChanged
Example
Request body:
{
"EventType": "ObjectPropertyChanged",
"ObjectPath": "/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5.StaticMeshComponent0",
"PropertyName": "StaticMesh"
}
A successful request will not return until the event has occurred. When the StaticMesh property changes, a response with a 200 status will be returned with the following body:
{
"StaticMesh": "/Engine/EditorMeshes/ArcadeEditorSphere.ArcadeEditorSphere"
}
About UObject Paths
Every Asset and Actor that the Unreal Editor has loaded in memory has a path that uniquely identifies it. These paths are mostly for internal use within the Editor, so they aren't directly exposed to you in a way that's easy to access. And, because they're determined programmatically according to internal rules, they aren't always easy to predict.
In general, these object paths follow the format:
/path/PackageName.ObjectName:SubObjectName.SubObject
Programmers who work with the Engine in C++ may recognize this format as the same one accepted by functions like FindObject()
and StaticFindObject()
.
For example, to deconstruct an Actor path shown in the request examples above:
/Game/ThirdPersonBP/Maps/ |
The path to the Asset in the Content Browser. |
ThirdPersonExampleMap.ThirdPersonExampleMap: |
The name of the package and the object it contains (for many Assets, these will be the same). |
PersistentLevel.CubeMesh_5.StaticMeshComponent0 |
The path through a hierarchy of sub-objects to the object you want to affect. |
Although these paths are not easily exposed to view, the following sections describe some ways you can get at them.
Paths in the Undo History
When you modify a UObject, you can view its path in the Undo History panel.
-
Click the filter icon at the bottom right of the panel and enable Show transactions details.
-
Make a minor change to the Asset or Actor you want to access, such as moving an Actor to a new location. This will record a new transaction in the Undo History.
-
In the Transaction Details panel, hover over the entries in the Modified objects and properties column. The Tooltip contains the path to the highlighted object.
Paths in the Editor Scripting Utilities
Depending on the types of tasks you want to carry out remotely, it may be helpful for your web application to be aware of the paths for the Actors available in the current Level, or for Assets that exist in the Content Browser. The Editor Scripting Utilities Plugin exposes some helpful functions for interacting with Assets and Levels that you can use to achieve this.
For example, to get a list of the paths for all Actors in the current Level, you can remotely call the GetAllLevelActors
function exposed by the EditorLevelLibrary
class in the EditorScriptingUtilities
module. Send the following request body to the remote/object/call
endpoint:
{
"objectPath" : "/Script/EditorScriptingUtilities.Default__EditorLevelLibrary",
"functionName":"GetAllLevelActors"
}
The ReturnValue
field in the response body gives you an array of paths for all Actors in the Level. For example:
{
"ReturnValue": [
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightmassImportanceVolume_0",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.AtmosphericFog_1",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.SkySphereBlueprint",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.SphereReflectionCapture",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.NetworkPlayerStart",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.DocumentationActor1",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Linear_Stair_StaticMesh",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Bump_StaticMesh",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LeftArm_StaticMesh",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.RightArm_StaticMesh",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Ramp_StaticMesh",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.CubeMesh_5",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightSource_0",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.PostProcessVolume_0",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.SkyLight_0",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Floor_1",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Wall7_4",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Wall9",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Wall10",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.Wall11",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.TextRenderActor_1",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.MyBlueprint_5",
"/Game/ThirdPersonBP/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.ThirdPersonCharacter_167"
]
}
For details on installing the Editor Scripting Utilities Plugin, see Scripting and Automating the Editor.
During Play in Editor (PIE) mode, UEDPIE_X_ is added as a prefix to the Map's name, where X is the PIE instance ID. Using the first returned value above as an example, the object path during PIE would be:
"objectPath" : "/Game/ThirdPersonBP/Maps/UEDPIE_0_ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.LightmassImportanceVolume_0"
Paths for Blueprint Function Libraries
To remotely call custom Blueprint Function Libraries with static methods, the object path must point to the Class Default Object (CDO), which is the one object that a UCLASS maintains. The following sections explain how to build the object path for C++ and Python objects.
C++
The object path to a CDO in C++ follows the format:
/Script/ModuleName.Default__ClassName
The table below describes how to find the values for ModuleName and ClassName for your Blueprint Function Library.
ModuleName | ModuleName is the name of the DLL that contains the class you are looking for. In your Visual Studio project, there is a .build.cs file with the same name as the module, which specifies how that module should be built as well as the module's dependencies. |
ClassName | ClassName is the name of the class, which has a UCLASS macro. |
Python
The object path to a CDO in Python follows the format:
/Engine/PythonTypes.Default__ClassName
ClassName is the name of the class, which has a @unreal.uclass()
decorator.