Workflow Engine
  • Dark
    Light
  • PDF

Workflow Engine

  • Dark
    Light
  • PDF

Deprecations in Workflow Engine

Deprecations in Workflow Engine are listed in the table below.

Item Description Deprecation Release Removal Release Replacement Method Name Route
getTaskIterations Get job task iterations. 2020.2 2021.2 WorkFlowEngine : searchTasks POST /workflow_engine/tasks/search
addWatchers Add watchers to a job. 2021.2 2022.2 OperationsManager : watchJobs POST /operations-manager/jobs/:jobId/watch
cancelJob Cancel a job. 2021.2 2022.2 OperationsManager : cancelJobs POST /operations-manager/jobs/cancel
claimTask Claim a manual task. 2021.2 2022.2 OperationsManager : claimTask POST /operations-manager/tasks/:id/claim
continueJob Continues a job at a task using the finish state of the last iteration. 2021.2 2022.2 OperationsManager : continueJobFrom POST /operations-manager/tasks/:id/continue
createJobGroupEntry Add a group to a job. 2021.2 2022.2 OperationsManager : addJobGroup POST /operations-manager/jobs/:id/groups
deleteJobGroups Delete all groups for a job. 2021.2 2022.2 OperationsManager : replaceJobGroups PUT /operations-manager/jobs/:id/groups
find Find job documents. 2021.2 2022.2 OperationsManager : getJobs GET /operations-manager/jobs
findForwardPaths Find the paths between two tasks in a workflow. 2021.2 2022.2 N/A
finishManualTask Completes a manual task. 2021.2 2022.2 OperationsManager : finishManualTask POST /operations-manager/jobs/:jobId/tasks/:taskId/finish
fixJob Revert an errored job. 2021.2 2022.2 OperationsManager : revertJob POST /operations-manager/jobs/:id/revert
getAllLoopTasks Get all loop tasks. 2021.2 2022.2 N/A
getAssociatedJobs Get associated jobs. 2021.2 2022.2 OperationsManager : getJobs GET /operations-manager/jobs
getEntireJob Get the entire data of a job. 2021.2 2022.2 OperationsManager : getJobs GET /operations-manager/jobs
getJob Get a job. 2021.2 2022.2 OperationsManager : getJob GET /operations-manager/jobs/:id
getJobDetails Get details of an active job. 2021.2 2022.2 OperationsManager : getJob GET /operations-manager/jobs/:id
getJobFromTaskQuery Get job from a task query. 2021.2 2022.2 OperationsManager : getTasks GET /operations-manager/tasks?dereference=job
getJobList Get a list of jobs by status. 2021.2 2022.2 OperationsManager : getJobs GET /operations-manager/jobs
getJobOutput Get the output of a completed job. 2021.2 2022.2 OperationsManager : getJob GET /operations-manager/job/:id?dereference=output&include=output
getJobShallow Get shallow data of a job. 2021.2 2022.2 OperationsManager : getJob GET /operations-manager/jobs/:id
getJobVisualizationData Get the visualization data of a job. 2021.2 2022.2 N/A
getManualTaskController Get the controller of a manual task. 2021.2 2022.2 OperationsManager : getManualTaskController GET /operations-manager/jobs/:jobId/tasks/:taskId/manual-controller
getTask Get a task. 2021.2 2022.2 OperationsManager : getTasks GET /operations-manager/tasks
getTaskStatuses Get the status of each task in a job. 2021.2 2022.2 OperationsManager : getTasks GET /operations-manager/tasks?equals[job._id]=<job_id>
listJobGroups List the groups that have access to a job. 2021.2 2022.2 OperationsManager : getJobs GET /operations-manager/jobs?dereference=groups&include=groups instead
pauseJob Pause a job. 2021.2 2022.2 OperationsManager : pauseJobs POST /operations-manager/jobs/pause
prepareMetricsLogs Prepare the metrics logs tarball. 2021.2 2022.2 N/A
queryJobs Get jobs matching the query. 2021.2 2022.2 OperationsManager : getJobs GET /operations-manager/jobs
queryTasksBrief Get brief information about tasks from the tasks collection. 2021.2 2022.2 OperationsManager : getTasks GET /operations-manager/tasks
releaseTask Release a manual task. 2021.2 2022.2 OperationsManager : releaseTask POST /operations-manager/tasks/:id/release
removeJobGroup Remove a group from the list of authorized groups for a job. 2021.2 2022.2 OperationsManager : deleteJobGroup DELETE /operations-manager/jobs/:jobId/groups/:groupId
replaceJobGroups Overwrite the list of groups that have access to a job. 2021.2 2022.2 OperationsManager : replaceJobGroups PUT /operations-manager/jobs/:id/groups
resumeJob Resume a paused or errored job. 2021.2 2022.2 OperationsManager : resumeJobs POST /operations-manager/jobs/resume
retryTask Retries a task with new variables. 2021.2 2022.2 OperationsManager : retryTask POST /operations-manager/jobs/:jobId/tasks/:taskId/retry
revertToTask Revert a job from the current task to the target task. 2021.2 2022.2 OperationsManager : revertJob POST /operations-manager/jobs/:id/revert
searchJobs Search jobs. 2021.2 2022.2 OperationsManager : getJobs GET /operations-manager/jobs
searchTasks Search tasks. 2021.2 2022.2 OperationsManager : getTasks GET /operations-manager/tasks
startJobWithOptions Initiate a job in a workflow with options. 2021.2 2022.2 OperationsManager : startJob POST /operations-manager/jobs/start
unwatchJob Unwatch a job. 2021.2 2022.2 OperationsManager : unwatchJobs POST /operations-manager/jobs/:jobId/unwatch
validateAllLoops Validate all loops. 2021.2 2022.2 N/A
watchJob Watch a job. 2021.2 2022.2 OperationsManager : watchJob POST /operations-manager/jobs/:jobId/watch


Starting Jobs with Incorrect DataTypes

When starting a job with variables, users will no longer be able to input incorrect values for those variables. For example, let's take a simple automation like this one below.

Figure 1: Example Automation

01_variableAutomationEx (1).png

The correct types for the job variables are pictured below. Notice the form_name should be a string, resembling "this is a string", and the instance_data should be an object, resembling { "key": "data" }.

Figure 2: Input Job Variables

02_typeEx.png

With the example below, the variables are set incorrectly, where an object is used for the form_name and a string for the instance_data.

Figure 3: Set Variables

03_jobInputEx.png

Even with the incorrect variable types that were supplied, the automation will actually run when the user clicks Start.

Figure 4: Run Automation

04_ranAutomation.png

Beginning with IAP 2020.2, however, the system will now display a warning message (at the bottom) to alert users they have given the job incorrect variables.

Figure 5: Warning Message for Incorrect Input Types

05_warningMessage.png


What should I do?

At a minimum of two releases from IAP 2020.2, this automation will no longer run if the job variable inputs do not match the type defined in the task. Begin now to modify your task input behavior to only start jobs with the correct input types for job variables so that once it becomes required, it will not impact your operations.

Item Description Deprecation Release Removal Release Replacement
startJobWithOptions Users will no longer be able to pass in values for job variables if the supplied value does not match the type (string, number, object, array, boolean, null) where the job variable is used.
Note: If the value passed in is undefined, it processed as type null.
2020.2 2021.2 N/A


Replacement for Activate Property within Service Config Layer

Workfow Engine will no longer support the activate property within its service_config. Currently, this property allows a specific configuration of the Workflow Engine application to allow or disallow working tasks upon startup. The replacement for this call is the processTasksOnStart property that exists in the properties.json. The replacement property can be set to true to allow working tasks on a specific server on startup, or it can be set to false to disallow working tasks on startup. See sample configuration below.

One special case is if a job is started via child job and passes in a value of undefined for a variable. This will be processed as type null instead of being processed with an undefined type.

Item Description Deprecation Release Removal Release Replacement
activate (service_config property) Establishes if the Workflow Engine task worker is active on startup; this will no longer be determined at the service_config layer. 2021.1 2022.1 processTasksOnStart (properties.json property)

Sample configuration in properties.json

{
  "processTasksOnStart" : false ,
  "pathProps": {
    "description": "File Path Variables",
    "sdk_dir": "/opt/pronghorn-applications",
    "encrypted": true
  },
  "id": "profile1",
  "mongoProps": {
    "credentials": {
      "passwd": "itentialPassword",
      "user": "itentialUser"
    },
    "db": "pronghorn",
    "url": "mongodb://localhost:27017"
  }
}

Structural changes in API responses between Operations Manager (OM) and Workflow Engine (WFE) APIs

With the jobs and tasks APIs moving to Operations Manager (OM), there are some differences from the Workflow Engine (WFE) APIs they replace which will need to be considered for any usage of these APIs. The differences include both the parameters these methods expect and the responses they return.

In general, Operations Manager responses are formatted with a uniform top level structure; all responses will be objects with the following keys: message, data, and metadata.

Key Description
message This property will always be populated with a human readable string. This exists for debugging purposes, as well as proxying actionable feedback to a human user.
data This property will contain any data relevant to the method response, such as a list of jobs, or the result of some action, but is not necessary for every context. In situations where data is not meaningful, it will be set to null.
metadata This property is used as a container for descriptive data. It is used for things like pagination data in a search API, as well as more detailed context for errors such as input validation failures. If a response has no metadata, the key will be set to an empty object ({}).

Differences between WFE and OM equivalent methods

This section details the WFE methods that have been proxied and/or replaced in Operations Manager (OM), along with the success and error responses that are returned.

WFE Method OM Equivalent Method
POST /cancelJob { job_id } POST /jobs/cancel { jobIds } (limits jobIds to length <= 100)
POST /pauseJob { job_id } POST /jobs/pause { jobIds } (limited to 100 jobs)
POST /resumeJob { job_id } POST /jobs/resume { jobIds } (limited to 100 jobs)

Success response:

WFE: Full updated job document

OM: { message: <success-message>, data: null, metadata: {} }
If you consume the updated job document from WFE cancel/pause/resume, perform a second API call in OM to get the updated jobs: GET /jobs?in[_id]=_id1,_id2,...

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad data, 401 for unauthorized, and 500 for internal error.


WFE Method OM Equivalent Method
POST /tasks/claim { task_id, user } POST /tasks/:id/claim
and
POST /tasks/:id/assign { userId }

Success response:

WFE: Updated task document

OM: { message: <success-message>, data: null, metadata: {} }
If you depend on the updated task document, perform a second API call in OM to get the updated task: GET /tasks/:id

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad data, 401 for unauthorized, and 500 for internal error.


WFE Method OM Equivalent Method
POST /tasks/release { task_id } POST /tasks/:id/release

Success response:

WFE: Updated task document provided at the root of the response

OM: { message: <success-message>, data: null, metadata: {} }
If you depend on the updated task document, perform a second API call in OM to get the updated task: GET /tasks/:id

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad data, 401 for unauthorized, and 500 for internal error


WFE Method OM Equivalent Method
GET /jobs/:id/groups GET /jobs?dereference=groups&include=groups
DELETE /jobs/:id/groups/:group DELETE /jobs/:jobId/groups/:groupId
PUT /jobs/:id/groups PUT /jobs/:id/groups
POST /jobs/:id/groups { group } POST /jobs/:id/groups { groupId }
DELETE /jobs/:id/groups DELETE /jobs/:id/groups

Success response:

WFE: Boolean indicating success or failure

OM: { message: <success-message>, data: null, metadata: {} }

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad data, 401 for unauthorized, and 500 for internal error.


WFE Method OM Equivalent Method
POST /jobs/:jobId/continueJob { jobId, taskId } POST /jobs/:id/continue { taskId }

Success response:

WFE: Updated job document

OM: { message: <success-message>, data: null, metadata: {} }
If you depend on the updated job document, perform a second API call to get the updated job: GET /jobs/:jobId

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad data, 401 for unauthorized, and 500 for internal error.


WFE Method OM Equivalent Method
POST /fixJob { job_id, errored_task, revert_task } POST /jobs/:id/revert { fromTask, toTask }

Success response:

WFE: Updated job document

OM: { message: <success-message>, data: null, metadata: {} }
If you depend on the updated job document, perform a second API call to get the updated job: GET /jobs/:jobId

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad data, 401 for unauthorized, and 500 for internal error.


WFE Method OM Equivalent Method
DELETE /job/:job_id/watch POST /jobs/:id/unwatch
PUT /job/:job_id/watch POST /jobs/:id/watch

Success response:

WFE: Username of the user added to the watchers list is provided at the root of the response.

OM:

{
  message: <success-message>,
  data: null,
  metadata: {}
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Equivalent Method
POST /jobs/:jobId/retryTask { taskId, variables } POST jobs/:jobId/tasks/:taskId/retry { variables }

Success response:

WFE: Updated job document provided at the root of the response

OM: { message: <success-message>, data: null, metadata: {} }
If you depend on the updated job document, perform a second API call in OM to get the updated job: GET /jobs/:id

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad data, 401 for unauthorized, and 500 for internal error.


WFE Method OM Equivalent Method
POST /finishTask { job_id, task_id } POST jobs/:jobId/tasks/:taskId/finish { finish_state, variables }

Success response:

WFE: Updated job document

OM: { message: <success-message>, data: null, metadata: {} }
If you depend on the updated job document, perform a second API call to get the updated job: GET /jobs/:jobId

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad data, 401 for unauthorized, and 500 for internal error.


WFE Method OM Replacement Method
POST /jobs/find { query, options } GET /jobs

Note on querying: The replacement call uses a query parameter based searching interface rather than one based on JSON in the post body. Refer to the associated docs for more details.

Success response:

WFE: [{ ...job1 }, { ...job2 }, ...]
Array of job documents returned at the root of the response

OM:

{
  message: <success-message>,
  data: [...jobs],
  metadata: {
    "skip": <number>,
    "limit": <number>,
    "nextPageSkip": <null | number>,
    "previousPageSkip": <null | number>,
    "total": <number>,
    "currentPageSize": <number>,
  }
}

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
POST /getAssociatedJobs { options } GET /jobs?exclude=transitions,variables&dereference=accounts.metrics.user + Search terms equivalent to options.filter

Notes:

  • On querying: POST /getAssociatedJobs supports filtering via options.filter. Refer to the OM search API documentation on details related to filtering with GET /jobs

  • On pagination: POST /getAssociatedJobs options.skip and options.limit become ?skip=...&limit=... in GET /jobs

Success response:

WFE:

{
  results: [...searchResults],
  skip: <number>,
  limit: <number>,
  total: <number>
}

OM:

{
  message: <success-message>,
  data: [...searchResults],
  metadata: {
    skip: <number>,
    limit: <number>,
    nextPageSkip: <null | number>,
    previousPageSkip: <null | number>,
    total: <number>,
    currentPageSize: <number>,
    }
}

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
GET /getEntireJob/:job_data GET /jobs/:id?dereference=tasks

Success response:

WFE: Job document is returned at the root of the response

OM:

{
  message: <success-response>,
  data: <job>,
  metadata: {}
}

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
GET /getJob/:job_id GET /jobs/:id

Success response:

WFE: Job document is returned at the root of the response

OM:

{
  message: <success-response>,
  data: <job>,
  metadata: {}
}

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
GET /job/:job_id/details GET /jobs/:id

Success response:

WFE: Job document is returned at the root of the response

OM:

{
  message: <success-response>,
  data: <job>,
  metadata: {}
}

Error response:

WFE: String message with response code 500

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacemment Method
POST /getJobFromTaskQuery { task_query, options } GET /tasks?dereference=job&<...search-params>

Success response:

WFE:

{
  results: [...jobDocuments],
  skip: <number>,
  limit: <number>,
  total: <number>
}

OM: 

Overall response

{
  message: <success-message>,
  data: [...taskDocumentsWithJobs],
  metadata: {
    skip: <number>,
    limit: <number>,
    nextPageSkip: <null | number>,
    previousPageSkip: <null | number>,
    total: <number>,
    currentPageSize: <number>,
  }
}

Individual task documents
- Note the difference in job document location with the WFE method.

{
  ...ordinaryTaskData,
  job: <complete-parent-job-document>
}

Note on output: Whereas the WFE method returns only jobs themselves as output, the OM replacement method will return tasks at the top level, with jobs nested within the tasks. There is not a direct way to get a list of just the unique jobs returned by this query; this is up to the API caller to implement.

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
POST /getJobList/:status { options } GET /jobs?equals[status]=

Success response:

WFE:

{
  results: [...jobDocuments],
  skip: <number>,
  limit: <number>,
  total: <number>
}

OM:

{
  message: <success-message>,
  data: [...jobDocuments],
  metadata: {
    skip: <number>,
    limit: <number>,
    nextPageSkip: <null | number>,
    previousPageSkip: <null | number>,
    total: <number>,
    currentPageSize: <number>,
  }
}

Error responses:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
GET /job/:job_id/output GET /job/:id?dereference=output&include=output,variables

Success response:

WFE: Raw job output is included at the root of the document. This output is from the workflow's output schema, if it exists; otherwise it is just the current state of the jobs variables.

OM:

{
  message: <success-message>,
  data: {
    output: <null | job-output>,
    variables: <job-variables>
  },
  metadata: {}
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
GET /getJobShallow/:job_data GET /job/:id?exclude=variables&dereference=tasks

Success response:

WFE: Job is included at the root of the response

OM:

{
  message: <success-message>,
  data: <job-document>,
  metadata: {}
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Proxy Method
GET /tasks/controller/job/:jobId/task/:taskId GET /jobs/:jobId/tasks/:taskId/manual-controller

Success response:

WFE: Manual task controller is returned at the root of the response

OM:

{
  message: <success-message>,
  data: <manual-task-controller>,
  metadata: {}
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs, 401 for unauthorized, and 500 for internal error.


WFE Method OM Replacement Method
POST /getTask { query, filter } GET /tasks?limit=1&include=<...fields-from-filter>

Note on the filter parameter: The Workflow Engine POST /getTask uses the filter parameter to specify which fields to include in the response. To construct an equivalent include expression, please refer to projection section of the OM search API documentation and use the keys of your filter parameter as values in both the include and exclude.

Success responses:

WFE: Task document provided in the root of the response

OM:

{
  message: <success-message>,
  data: <task-document>,
  metadata: {}
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs, 401 for unauthorized, and 500 for internal error.


WFE Method OM Replacement Method
GET /getTaskIterations/:job_id/:task GET /job/:id?dereference=tasks&include=tasks..iterations

Success response:

WFE: [{ ...task1 }, { ...task2 }, ...]

OM:

{
  message: <success-message>,
  data: {
    tasks: {
      [<task-id>]: {
        iterations: [
          { ...task1 },
          { ...task2 },
          ...
        ]
      }
    }
  },
  metadata: {}
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs, 401 for unauthorized, and 500 for internal error.


WFE Method OM Replacement Method
GET /job/statuses/:job_id GET /tasks?equals[job._id]=<job_id>&equals[job.task]=&include=status&dereference=accounts.metrics.owner

Success response:

WFE: Full task documents are provided at the root of the response

OM:

{
  message: <success-message>,
  data: [...taskDocuments],
  metadata: {
    skip: <number>,
    limit: <number>,
    nextPageSkip: <null | number>,
    previousPageSkip: <null | number>,
    total: <number>,
    currentPageSize: <number>,
  }
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
POST /queryJobs GET /jobs

⚠ Please use the OM search API documentation as a reference when translating queries provided to POST /queryJobs into query parameters to GET /jobs.

Success response:

WFE: [{ ...job1 }, { ...job2 }, ...]

OM:

{
  message: <success-message>,
  data: [{ ...job1 }, { ...job2 }, ...],
  metadata: {
    skip: <number>,
    limit: <number>,
    nextPageSkip: <null | number>,
    previousPageSkip: <null | number>,
    total: <number>,
    currentPageSize: <number>,
  }
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
POST /queryTasksBrief GET /tasks?exclude=variables

Success response:

WFE: [{ ...task1 }, { ...task2 }, ...]

OM:

{
  message: <success-message>,
  data: [{ ...task1 }, { ...task2 }, ...],
  metadata: {
    skip: <number>,
    limit: <number>,
    nextPageSkip: <null | number>,
    previousPageSkip: <null | number>,
    total: <number>,
    currentPageSize: <number>,
  }
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
POST /jobs/search GET /jobs

⚠ Please use the OM search documentation as a reference when translating search parameters between these two endpoints.

Success response:

WFE: [{ ...job1 }, { ...job2 }, ...]

OM:

{
  message: <success-message>,
  data: [{ ...job1 }, { ...job2 }, ...],
  metadata: {
    skip: <number>,
    limit: <number>,
    nextPageSkip: <null | number>,
    previousPageSkip: <null | number>,
    total: <number>,
    currentPageSize: <number>,
  }
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.


WFE Method OM Replacement Method
POST /tasks/search GET /tasks

⚠ Please use the OM search documentation as a reference when translating search parameters between these two endpoints.

Success response:

WFE: [{ ...task1 }, { ...task2 }, ...]

OM:

{
  message: <success-message>,
  data: [{ ...task1 }, { ...task2 }, ...],
  metadata: {
    skip: <number>,
    limit: <number>,
    nextPageSkip: <null | number>,
    previousPageSkip: <null | number>,
    total: <number>,
    currentPageSize: <number>,
  }
}

Error response:

WFE: String message with 500 response code

OM: { message: <error-message>, data: null, metadata: {} } with response code 400 for bad inputs and 500 for internal error.

What's Next