---
title: "Mark recommendations as implemented"
method: POST
path: "/v1/recommendations/implemented/bulk"
tags: ["Recommendations"]
---

# Mark recommendations as implemented

`POST /v1/recommendations/implemented/bulk`

## Request

- Base URL: `https://api.nops.io`
- URL: `https://api.nops.io/v1/recommendations/implemented/bulk`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/nops/apis/nops-public-api/docs/v1/recommendations/implemented/bulk/post.ts> (a function with typed inputs; its response is checked against the schema)

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.

## Headers

- `Idempotency-Key` string, required: Unique key for safe retries on write requests (required, max 64 characters).

## Request body

- object
  - `recommendationIds` string[], required: Recommendation IDs (`recommendation_id` from the recommendations list), up to 200.
  - `implementedAt` string, nullable: When the change was made (ISO 8601). Defaults to now; at most 90 days ago. A time later than now but on the same UTC day or within the next 14 hours is recorded as now; a later one is rejected.
  - `note` string, nullable: Shown in the recommendation history.

## Response `200`

Mark recommendations as implemented

- object
  - `data` object, required: JSON object

## Other responses

- `401`: Unauthorized — invalid or missing API key
- `403`: Forbidden — insufficient permissions or entitlement

---

[API](https://skmtc.dev/nops/apis/nops-public-api.md) - [All operations](https://skmtc.dev/nops/apis/nops-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/nops/apis/nops-public-api/revisions/ac549fa495dd?raw)
