---
layout: api
page_title: Recommendations - HTTP API
sidebar_title: Recommendations
description: >-
The /recommendation endpoints are used to query for and interact with Dynamic
Application Sizing recommendations.
---
# Recommendation HTTP API
The `/recommendation` endpoints are used to query and interact with Dynamic
Application Sizing recommendations.
This API endpoint and functionality only exists in
Nomad Enterprise. This is not present in the open source version of Nomad.
## List Recommendations
This endpoint lists all the currently available recommendations and provides
optional filtering of that list.
| Method | Path | Produces |
| ------ | --------------------- | ------------------ |
| `GET` | `/v1/recommendations` | `application/json` |
The table below shows this endpoint's support for
[blocking queries](/api-docs#blocking-queries) and
[required ACLs](/api-docs#acls).
| Blocking Queries | ACL Required |
| ---------------- | ----------------------------------------------------------------------------------- |
| `YES` | `namespace:read-job` or `namespace:submit-recommendation` or `namespace:submit-job` |
### Parameters
- `group` `(string: "")` - Specifies the task group name to filter within a job. If
specified, the `job` parameter must also be specified.
- `job` `(string: "")` - Specifies the job ID to filter the recommendations list by.
- `namespace` `(string: "default")` - Specifies the namespace to search. Specifying
`*` would return all recommendations across all the authorized namespaces.
- `task` `(string: "")` - Specifies the task name to filter within a job and task
group. If specified, the `job` and `group` query parameters must also be
specified.
### Sample Request
```shell-session
$ curl \
https://localhost:4646/v1/recommendations
```
```shell-session
$ curl \
https://localhost:4646/v1/recommendations?namespace=*
```
```shell-session
$ curl \
https://localhost:4646/v1/recommendations?namespace=*&job=example&group=cache&task=redis
```
### Sample Response
```json
[
{
"ID": "cb80a13d-20d8-fb05-db3f-4ea0fe667b1b",
"Region": "global",
"Namespace": "default",
"JobID": "example",
"JobVersion": 0,
"Group": "cache",
"Task": "redis",
"Resource": "MemoryMB",
"Value": 10,
"Current": 200,
"Meta": {
"nomad_autoscaler.count.capped": true,
"nomad_autoscaler.count.original": 6,
"nomad_autoscaler.reason_history": [],
"nomad_policy_id": "c355d0ec-7aa1-2604-449d-4ec79c813d2c",
"num_evaluated_windows": 1148,
"window_size": 300000000000
},
"Stats": {
"min": 2.6640625,
"p99": 6.51171875,
"max": 6.515625,
"mean": 4.816847859995009
},
"EnforceVersion": false,
"SubmitTime": 1603372587714807000,
"CreateIndex": 5193,
"ModifyIndex": 10437
},
{
"ID": "fdd2b5f1-e6ad-110e-75b9-8f9410e1d8ab",
"Region": "global",
"Namespace": "default",
"JobID": "example",
"JobVersion": 0,
"Group": "cache",
"Task": "redis",
"Resource": "CPU",
"Value": 57,
"Current": 500,
"Meta": {
"window_size": 300000000000,
"nomad_policy_id": "b2c64295-4315-2fdc-6158-a27156808729",
"num_evaluated_windows": 1117
},
"Stats": {
"min": 0,
"p99": 50,
"max": 63.46186447143555,
"mean": 0.3649455045779875
},
"EnforceVersion": false,
"SubmitTime": 1603372287894356000,
"CreateIndex": 5275,
"ModifyIndex": 10419
}
]
```
## Read Recommendation
This endpoint reads information about a specific recommendation.
| Method | Path | Produces |
| ------ | --------------------------------------- | ------------------ |
| `GET` | `/v1/recommendation/:recommendation_id` | `application/json` |
The table below shows this endpoint's support for
[blocking queries](/api-docs#blocking-queries) and
[required ACLs](/api-docs#acls).
| Blocking Queries | ACL Required |
| ---------------- | -------------------- |
| `YES` | `namespace:read-job` |
### Parameters
- `:recommendation_id` `(string: )`- Specifies the recommendation ID to
query. This is specified as part of the path.
### Sample Request
```shell-session
$ curl \
https://localhost:4646/v1/recommendation/cb80a13d-20d8-fb05-db3f-4ea0fe667b1b
```
### Sample Response
```json
{
"ID": "cb80a13d-20d8-fb05-db3f-4ea0fe667b1b",
"Region": "global",
"Namespace": "default",
"JobID": "example",
"JobVersion": 0,
"Group": "cache",
"Task": "redis",
"Resource": "MemoryMB",
"Value": 10,
"Current": 200,
"Meta": {
"nomad_autoscaler.count.original": 6,
"nomad_autoscaler.reason_history": [],
"nomad_policy_id": "c355d0ec-7aa1-2604-449d-4ec79c813d2c",
"num_evaluated_windows": 1148,
"window_size": 300000000000,
"nomad_autoscaler.count.capped": true
},
"Stats": {
"min": 2.6640625,
"p99": 6.51171875,
"max": 6.515625,
"mean": 4.816847859995009
},
"EnforceVersion": false,
"SubmitTime": 1603372587714807000,
"CreateIndex": 5193,
"ModifyIndex": 10437
}
```
## Apply and Dismiss Recommendations
This endpoint is used to apply and dismiss recommendations.
| Method | Path | Produces |
| ------ | --------------------------- | ------------------ |
| `POST` | `/v1/recommendations/apply` | `application/json` |
The table below shows this endpoint's support for
[blocking queries](/api-docs#blocking-queries) and
[required ACLs](/api-docs#acls).
| Blocking Queries | ACL Required |
| ---------------- | --------------------------------------------------------------------------------- |
| `NO` | `namespace:submit-job` with `namespace:sentinel-override` if `PolicyOverride` set |
### Parameters
- `Apply` `(array: nil)` - Specifies a set of recommendation IDs to be
applied. This results in Nomad applying the recommendation to the job
specification and performing a job register.
- `Dismiss` `(array: nil)` - Specifies a set of recommendation IDs to be
dismissed. This results in Nomad deleting them from the state store.
- `PolicyOverride` `(bool: false)` - If set, any soft mandatory Sentinel policies
will be overridden. This allows a recommendation to be applied when it would be
denied by a policy.
### Sample Payload
```json
{
"Apply": ["cb80a13d-20d8-fb05-db3f-4ea0fe667b1b"]
}
```
### Sample Request
```shell-session
$ curl \
--request POST \
--data @payload.json \
https://localhost:4646/v1/recommendations/apply
```
### Sample Response
```json
{
"Errors": [],
"LastIndex": 0,
"RequestTime": 0,
"UpdatedJobs": [
{
"EvalCreateIndex": 51,
"EvalID": "3c91a755-f314-e2fb-500b-437ad08e13ea",
"JobID": "example",
"JobModifyIndex": 51,
"Namespace": "default",
"Recommendations": ["cb80a13d-20d8-fb05-db3f-4ea0fe667b1b"],
"Warnings": ""
}
]
}
```
## Create or Update a Recommendation
This endpoint is used to create or update a recommendation.
| Method | Path | Produces |
| ------ | -------------------- | ------------------ |
| `POST` | `/v1/recommendation` | `application/json` |
The table below shows this endpoint's support for
[blocking queries](/api-docs#blocking-queries) and
[required ACLs](/api-docs#acls).
| Blocking Queries | ACL Required |
| ---------------- | ----------------------------------------------------------- |
| `NO` | `namespace:submit-recommendation` or `namespace:submit-job` |
### Parameters
- `ID` `(string: "")` - The ID of an existing recommendation to update.
- `Region` `(string: "")`- The Nomad region identifier which contains the job
that the recommendation is for. If omitted, this defaults to that of the Nomad
agent.
- `Namespace` `(string: "")`- The namespace within which the target job is running
within. If omitted, this defaults to `default`.
- `JobID` `(string: )`- The job ID which this recommendation is for.
- `Group` `(string: )`- The task group name within the job which this
recommendation is for.
- `Task` `(string: )`- The task name within the task group which this
recommendation is for.
- `Resource` `(string: )`- The resource that the recommendation is for.
Possible values are `CPU` and `MemoryMB`.
- `Value` `(int: )`- The value recommendation for the resource. This
must met the minimum requirements which are `1` for `CPU` and `10` for `MemoryMB`.
- `Meta` `(map: nil)`- JSON block that is persisted as part of the
recommendation providing arbitrary, useful information.
- `Stats` `(map: nil)` - A mapping of statistics that are persisted
as part of the recommendation providing insight into the recommendation
calculation.
- `EnforceVersion` `(bool: false)`- Indicates that the recommendation is only valid
for the current version of the job. Subsequent job updates will automatically
dismiss this recommendation.
### Sample Payload
```json
{
"Region": "global",
"Namespace": "default",
"JobID": "example",
"Group": "cache",
"Task": "redis",
"Resource": "MemoryMB",
"Value": 512,
"Meta": {
"nomad_policy_id": "c355d0ec-7aa1-2604-449d-4ec79c813d2c"
},
"Stats": {
"min": 2.6640625,
"p99": 6.51171875,
"max": 6.515625,
"mean": 4.816847859995009
}
}
```
### Sample Request
```shell-session
$ curl \
--request POST \
--data @payload.json \
https://localhost:4646/v1/recommendation
```
### Sample Response
```json
{
"CreateIndex": 22,
"Current": 256,
"EnforceVersion": false,
"Group": "cache",
"ID": "47c97404-918f-8b19-873b-36d802f16f23",
"JobID": "example",
"JobVersion": 0,
"Meta": {
"nomad_policy_id": "c355d0ec-7aa1-2604-449d-4ec79c813d2c"
},
"ModifyIndex": 25,
"Namespace": "default",
"Region": "global",
"Resource": "MemoryMB",
"Stats": {
"mean": 4.816847859995009,
"min": 2.6640625,
"p99": 6.51171875,
"max": 6.515625
},
"SubmitTime": 1603444202372926000,
"Task": "redis",
"Value": 512
}
```