This blog post follows the same idea we covered in my previous post about executing a rule as an Administrator using PowerShell.
We are going to look at how to do this using the REST API in OneStream.
How is it done
You’ll need an external authentication setup for REST API to work. Also, your OS environment must be 5.2+ 🙂
Now that is covered, let’s look at how to use REST API. The documentation for REST API is located under the following URL.
http://<servername>:<portnumber>/OneStreamApi

Like we saw in the previous post, the first thing we need is the SSO token, as that is the only way you can log in using the REST API.
Let’s create a function for that.
GetSSOToken
I’m using Newtonsoft JSON dll for parsing JSON objects. I think this is now included with OneStream (not sure which version it started. I had to add an external reference in 5.3 version, and I see the code is working without that reference in the latest 5.3 patch update.)
I’m using HttpClient. Line 7 is where I’m adding the header to accept JSON.
You’ll need the following to generate the token. My client is using PING for SSO, and yours could be different.
- Client Secret
- Client ID
- Token Manager ID
- OAuth URL
Line 18 is where you should specify your OAuth URL.
The result is a JSON like the one given below.

All we need to do is parse the JSON and the access_token, and this is what we are doing in lines 21-29.
Public Function GetAccessToken(ByVal si As SessionInfo, ByVal pingBaseURL As String, ByVal clientID As String, ByVal clientSecret As String, ByVal accessTokenMgrID As String) As String
Try
Dim accessToken As String = String.Empty
Dim client As New HttpClient()
' Add headers
client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
' Convert the credentials to Base64 endoded string
Dim authInfo As String = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(clientID & ":" & clientSecret))
client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Basic", authInfo)
'create the body Of the request
Dim tokenBody As String = "grant_type=client_credentials&scope=openid&client_id=" & clientID & "&access_token_manager_id=" & accessTokenMgrID
' Add content and mention the encoding and the content-type
Dim content As New StringContent(tokenBody, Encoding.UTF8, "application/x-www-form-urlencoded")
Dim result As HttpResponseMessage = client.PostAsync(pingBaseURL & "/as/token.oauth2", content).Result
Dim resultContent As String = result.Content.ReadAsStringAsync().Result
' parse the result using a JObject
Dim jsonResult As JObject = JObject.Parse(resultContent)
If result.IsSuccessStatusCode Then
accessToken = jsonResult("access_token")
Else
Throw New XFException("Error getting access token" & vbCrLf & result.StatusCode & vbCrLf & result.ReasonPhrase _
& vbCrLf & jsonResult("error_description").toString() & vbCrLf & jsonResult("error").toString())
End If
Return accessToken
Catch ex As Exception
Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
End Try
End Function
Running the DM sequence
Now that we got the token, the next step is to run the DM sequence.
We need to add an authorization header to our request, and since our token is of type bearer, we are going to use that as our scheme in Line 7.
Now are going to add a payload to our request. I’m going to use a Dictionary to create a JSON payload. You can use Json conversion to create a formatted payload, as shown below.
Dim dictbody As New Dictionary(Of String, String)
dictbody.Add("BaseWebServerUrl", "your OS URL")
dictbody.Add("ApplicationName", "your app Name")
dictbody.Add("SequenceName", "Your sequence name")
dictbody.Add("CustomSubstVarsAsCommaSeparatedPairs", "var1=var1value,var2=var2value")
Dim payLoad As String = JsonConvert.SerializeObject(dictbody, Formatting.Indented)

It is pretty easy and neat.
Now that we have the payload, all we got to do now is to POST it. This is what is happening at line 20.
Public Sub ExecuteDMSequence(ByVal si As SessionInfo, ByVal OSBaseURL As String, ByVal OSAppName As String, ByVal DMSequenceName As String, ByVal CommaSeperatedParamPairs As String, ByVal XFAPIVersion As String)
Try
Dim client As New HttpClient()
' add token to the header
client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer",Me.GetAccessToken(si, "pingBaseURL", "clientID", "clientSecret", "accessTokenMgrID"))
Dim dictbody As New Dictionary(Of String, String)
dictbody.Add("BaseWebServerUrl", OSBaseURL & "/OneStreamWeb")
dictbody.Add("ApplicationName", OSAppName)
dictbody.Add("SequenceName", DMSequenceName)
dictbody.Add("CustomSubstVarsAsCommaSeparatedPairs", CommaSeperatedParamPairs)
Dim payLoad As String = JsonConvert.SerializeObject(dictbody, Formatting.Indented)
' Add content and mention the encoding and the content-type
Dim content As New StringContent(payLoad, Encoding.UTF8, "application/json")
Dim result As HttpResponseMessage = client.PostAsync(OSBaseURL + "/OneStreamApi/api/DataManagement/ExecuteSequence?api-version=" + XFAPIVersion, content).Result
Dim resultContent As String = result.Content.ReadAsStringAsync().Result
If resultContent.XFContainsIgnoreCase("Error") Then
Throw New XFException(resultContent)
End If
Catch ex As Exception
Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
End Try
End Sub
You can call the function as shown below.
Me.ExecuteDMSequence(si, "serverURL", "APP Name", "DM Sequence Name", "InitiatedUserName=" & si.UserName, "5.2.0")
Hope it helps.