---
title: "Update Exercise Savoirs Faire"
method: PATCH
path: "/admin/public-exercises/{exercise_id}/savoirs-faire"
tags: ["Admin Public Exercises"]
---

# Update Exercise Savoirs Faire

`PATCH /admin/public-exercises/{exercise_id}/savoirs-faire`

Replace the `savoirs_faire_ids` list on a single exercise.

Phase B.2. Mirrors `/type` and `/category-path` as a one-click curation
action (no fat payload, no unintended side effects on siblings like
`content` or `category_path`). The request body is a full list — callers
should always send the desired end state, not a diff.

## Path parameters

- `exercise_id` string, required

## Request body

- SavoirsFaireIdsUpdate — Replace the full `savoirs_faire_ids` list on an exercise. Set semantics (not diff): the list coming in is persisted verbatim, so clearing all tags is expressed as `{savoirs_faire_ids: []}`.
  - `savoirs_faire_ids` string[]

## Response `200`

Successful Response

- PublicExerciseDetail — Full detail used by the edit panel.
  - `id` string, required
  - `category_path` string[], required
  - `difficulty` string, nullable
  - `content` string, required
  - `solution` string, required
  - `figure_content` string[], nullable
  - `figure_solution` string[], nullable
  - `themes` string[]
  - `updated_at` string, nullable
  - `library` 'excellence' | 'cpge' | 'remediation'
  - `type` 'exercice' | 'automatisme' | 'application_du_cours'
  - `cpge` RoutersAdminPublicExercisesCpgeMetadata
    - `hints` string[]
    - `banque` string, nullable
  - `likes_count` integer
  - `savoirs_faire_ids` string[]
  - `title` string, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/excellence-ai/apis/excellence-learning.md) · [All operations](https://skmtc.dev/excellence-ai/apis/excellence-learning/llms.txt) · [OpenAPI document](https://skmtc.dev/excellence-ai/apis/excellence-learning/revisions/c81ed506912f?raw)
