---
title: "Save an installation's settings (append a new config version)"
method: PUT
path: "/v1/skill-installations/{installation_id}/config"
tags: ["skill-hub"]
---

# Save an installation's settings (append a new config version)

`PUT /v1/skill-installations/{installation_id}/config`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/skill-installations/{installation_id}/config`
- Auth: HTTP bearer

Validate + persist the settings an admin set in the form. Only declared config_fields are kept (unknown keys dropped); an invalid value returns a per-field 422. Appends a new config version (append-only history) and bumps the projection generation so the next sweep re-projects. A partial save is allowed (untouched fields keep their value); go-live completeness is enforced on activation. A LIVE delivery skill can't be saved into an undeliverable state (422).

## Path parameters

- `installation_id` string, uuid, required

## Headers

- `X-Tenant-Id` string, nullable

## Request body

- SkillConfigUpdateRequest: Save an installation's settings: the complete desired values for the declared config fields. Unknown keys are dropped server-side (only declared fields persist, G2); an invalid value is rejected with a per-field 422. A partial save is allowed (untouched fields keep their current value), so an admin can fill settings incrementally; go-live completeness is enforced at activation.
  - `values` object

## Response `200`

Successful Response

- SkillConfigResponse: The manifest-driven settings form for one installation: the field schema + the current values. ``fields`` is the projected ``config_fields`` schema (what to render); ``values`` is the install's active typed ``config_json`` (what to pre-fill). ``status_code`` lets the form gate the activate control (an admin can't take a skill live until the required fields are set; the backend also enforces this on activation).
  - `installation_id` string, uuid, required
  - `config_version` integer, required
  - `status_code` string, required
  - `fields` ConfigFieldSchema[], required
    - `key` string, required
    - `type` string, required
    - `label` string, required
    - `description` string, nullable
    - `group` string, nullable
    - `required` boolean
    - `default` unknown
    - `options` ConfigFieldOptionSchema[]
      - `value` string, required
      - `label` string, required
    - `minimum` integer, nullable
    - `maximum` integer, nullable
    - `unit` string, nullable
    - `placeholder` string, nullable
  - `values` object, required

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)
- `404`: Not found
- `409`: Conflict
- `422`: Validation error

---

[API](https://skmtc.dev/patricia/apis/patricia-api.md) · [All operations](https://skmtc.dev/patricia/apis/patricia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/patricia/apis/patricia-api/revisions/0dfb44495ea1?raw)
