Web Remote Control Endpoint Reference

Details about the endpoints offered by the Web Remote Control system.

Windows
MacOS
Linux

This page describes the endpoints offered by the Web Remote Control system, and details the format of the message body you need to include when you call each endpoint.

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 UObject you want to interact with. For more information on finding this path, see About UObject Paths below.

functionName

The name of the function you want to call from the specified UObject. If your function is defined in C++, its original name may not match the display name shown in Blueprint. In this case, use the function name defined in C++.

parameters

An object that defines the parameters you want to pass to the function.

  • The name of each property in this object should be the name of a parameter accepted by the function you call.

    If your function is defined in C++, the original parameter name may not match the value you see in the Blueprint Editor. In this case, use the paramter name defined in C++. For example, in the code below, the second parameter needs to be specified as bSweep to match its C++ definition, although it is exposed in the equivalent Blueprint node as Sweep.

  • The value of the property may be any simple value such as a number or a Boolean value. Or, if the function requires you to pass an object, you can provide a JSON object that encapsulates the properties of that object. The Remote Control system will use the values you provide to attempt to create a new object of the necessary type. For example, in the code below, the NewLocation is automatically used to create a new Vector.

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 true has the following effects:

  • Any changes made by the function will be undoable. The Editor records an entry in the Project's Undo History panel for this function call. A user working in the Unreal Editor can then roll back the effect of the change. This entry is always under the name Remote Call Transaction Wrap, regardless of the function you call:
    Remote transactions listed in the Undo History

  • If you're in a Multi-User Editing session, the change will be replicated to other connected users.

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.

This endpoint can only access properties that meet certain criteria:

  • The property must not be defined as private or protected.

  • It must not have any BlueprintGetter or BlueprintSetter functions defined. If it does, you must use those functions with the remote/object/call endpoint described above instead of trying to read or write the values directly using the remote/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 as EditConst.

  • If you are accessing an object in -game mode or Play In Editor (PIE) mode, the object must be set as BlueprintVisible. In order to modify the value, the property must not be set as BlueprintReadOnly.

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 UObject you want to interact with. For more information on finding this path, see About UObject Paths below.

property

The name of the property you want to read or modify. If you omit this property in a call with READ_ACCESS, the response will list all readable properties available on the specified UObject.

access

Defines the kind of access request you are making for the property. This can be any of the following values:

  • READ_ACCESS specifies that you are making a request for the current value of a property, or for all properties on the specified UObject.

  • WRITE_ACCESS specifies that you want to set a new value for one or more properties, which you define in the propertyValue object.

  • WRITE_TRANSACTION_ACCESS is the same as WRITE_ACCESS, but records the property value change in the Project's transaction history. This is similar to the generateTransaction property of the remote/object/call endpoint. It has the following effects:

    • The Editor handles the property modification exactly as if it had been done in the Details panel of the Unreal Editor. This may invoke additional code inside the Editor to handle pre-change and post-change events linked to that property.

    • If you're in a Multi-User Editing session, the change will be replicated to other connected users.

    • This option makes the change undoable. If you set this property to true, the Editor records an entry in the Project's Undo History panel for this property change. A user working in the Unreal Editor can then roll back the effect of the change. This entry is always under the name Remote Set Object Property:
      Remote Set Object Property

propertyValue

When you make a request with WRITE_ACCESS or WRITE_TRANSACTION_ACCESS, you use this object to specify the properties you want to modify, and the new value you want to set for each of those properties.

This must be a JSON object in which the name of each field matches the name of a writeable property on the specified UObject, and the value of each field is the new value that you want to set for that property.

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",
    "property" : "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.

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.

  1. Click the filter icon at the bottom right of the panel and enable Show transactions details.

    Show transactions details

  2. 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.

  3. 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.

    Object path shown in the Tooltip

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.

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback