---
title: "Complete, archive or restore a recommendation item"
method: PATCH
path: "/recommendations/{id}/items/{item_id}"
tags: ["Recommendations"]
---

# Complete, archive or restore a recommendation item

`PATCH /recommendations/{id}/items/{item_id}`

## Request

- Base URL: `https://api.llmpulse.ai/api/v1`
- URL: `https://api.llmpulse.ai/api/v1/recommendations/{id}/items/{item_id}`
- Auth: API key in header `Authorization`

Moves one item of a recommendation run between `active`, `completed` and `archived`, exactly like the complete, archive and restore buttons on the Recommendations page, and stamps `status_changed_at`. When archiving, an optional `reason` teaches later runs: `not_relevant` and `too_complex` steer the next recommendations away from similar ones, and on a PR & Citation Building item that targets a domain (`metadata.domain`), `competitor` or `not_relevant` stops that site from being suggested again. The reason is stored in `metadata.archive_reason` and dropped when the item leaves `archived`. A reason with another status, an unknown one, or `competitor` on an item without a domain returns `ERR_INVALID_PARAM`. Returns the item in the shape `GET /recommendations/{id}` lists items. Requires a `read_write` scope API key and, for team members, create permission on Recommendations (the permission the page uses for these buttons).

## Path parameters

- `id` integer, required
- `item_id` integer, required

## Request body

- object
  - `project_id` integer, required
  - `status` 'active' | 'completed' | 'archived', required: completed, archived, or active to restore the item
  - `reason` 'not_relevant' | 'too_complex' | 'competitor': Optional, with status archived only. competitor only on a PR & Citation Building item that targets a domain.

## Response `200`

The updated item

- RecommendationItemUpdateResponse
  - `project_id` integer, required
  - `item` RecommendationItem, required: One recommendation item, in the shape GET /recommendations/{id} lists items
    - `id` integer, required
    - `recommendation_id` integer, required
    - `recommendation_type` string, required
    - `category` string, required
    - `title` string, required
    - `description` string, nullable
    - `priority` 'high' | 'medium' | 'low', required
    - `estimated_impact` string, nullable
    - `action_items` string[], required
    - `source_refs` string[], required: Evidence codes (e.g. P1, C2) resolved in resolved_source_refs
    - `status` 'active' | 'completed' | 'archived', required
    - `status_changed_at` string, date-time, nullable
    - `position` integer, required
    - `metadata` object: Free-form details. Carries effort (low, medium or high) when the generator rated it, archive_reason (not_relevant, too_complex or competitor) on an item archived with a reason, and domain on PR & Citation Building items.
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `resolved_source_refs` object[]: The evidence each source_refs code points to (prompt, citation or own page)
    - `unresolved_source_refs` string[]: Present only when a code points to no stored evidence
  - `request_id` string, required

## Other responses

- `403`: API key lacks write permission
- `404`: Resource not found
- `422`: Invalid parameters

## Changes

- **2026-10-16** `dd090b1e1154`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/llmpulse/apis/llm-pulse-api/changes/recommendations/:id/items/:item_id/patch.md)

---

[API](https://skmtc.dev/llmpulse/apis/llm-pulse-api.md) - [All operations](https://skmtc.dev/llmpulse/apis/llm-pulse-api/llms.txt) - [OpenAPI document](https://skmtc.dev/llmpulse/apis/llm-pulse-api/revisions/38a31f123641?raw)
