curl --request POST \
--url https://api.nops.io/v1/recommendations/implemented/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"recommendationIds": [
"rec_0a1b2c",
"rec_3d4e5f"
]
}
'import requests
url = "https://api.nops.io/v1/recommendations/implemented/bulk"
payload = { "recommendationIds": ["rec_0a1b2c", "rec_3d4e5f"] }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({recommendationIds: ['rec_0a1b2c', 'rec_3d4e5f']})
};
fetch('https://api.nops.io/v1/recommendations/implemented/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.nops.io/v1/recommendations/implemented/bulk"
payload := strings.NewReader("{\n \"recommendationIds\": [\n \"rec_0a1b2c\",\n \"rec_3d4e5f\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"data": {}
}{
"error": {
"code": "forbidden_scope",
"message": "API key is missing required scope: budgets:write",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "forbidden_scope",
"message": "API key is missing required scope: budgets:write",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Mark recommendations as implemented
Marks up to 200 recommendations as implemented in one request, under the same rules as marking one, with one implementedAt and note for all. Returns claimed (each with savingsConfirmedBy) and skipped (each with a reason: not_found, ignored (the organization ignored it), already_tracked or not_verifiable). Billing checks follow on the next hourly verification run.
curl --request POST \
--url https://api.nops.io/v1/recommendations/implemented/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"recommendationIds": [
"rec_0a1b2c",
"rec_3d4e5f"
]
}
'import requests
url = "https://api.nops.io/v1/recommendations/implemented/bulk"
payload = { "recommendationIds": ["rec_0a1b2c", "rec_3d4e5f"] }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({recommendationIds: ['rec_0a1b2c', 'rec_3d4e5f']})
};
fetch('https://api.nops.io/v1/recommendations/implemented/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.nops.io/v1/recommendations/implemented/bulk"
payload := strings.NewReader("{\n \"recommendationIds\": [\n \"rec_0a1b2c\",\n \"rec_3d4e5f\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"data": {}
}{
"error": {
"code": "forbidden_scope",
"message": "API key is missing required scope: budgets:write",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "forbidden_scope",
"message": "API key is missing required scope: budgets:write",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Authorizations
API key from Settings → Security → API Keys. Pass as Authorization: Bearer YOUR_API_KEY.
Headers
Unique key for safe retries on write requests (required, max 64 characters).
64Body
Recommendation IDs (recommendation_id from the recommendations list), up to 200.
1 - 200 elementsWhen the change was made (ISO 8601). Defaults to now; at most 90 days ago.
Shown in the recommendation history.
500Response
Mark recommendations as implemented
JSON object
Was this page helpful?