---
title: "Create or replace one attribute (admin)"
method: PUT
path: "/v1/attributes/{key}"
tags: ["vocabulary"]
---

# Create or replace one attribute (admin)

`PUT /v1/attributes/{key}`

## Request

- Base URL: `https://api.sixminute.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.sixminute.ai/v1/attributes/{key}`
- Auth: HTTP bearer

The body's `key` must be the path's. `default_set_ids` must name sets this firm already holds AND holds under this attribute (422 otherwise, naming the set and both attributes): a default set of another attribute renders nothing on every matter that inherits it. The `position` is the server's and a body's is accepted and ignored: a new key goes one past the firm's last, and a key the firm holds keeps its place. On a row the connector owns or has bound, `label` and `proposed` are the firm's and the rest, `position` aside, is the connector's: a body that differs from the stored row in any other field is a 409 naming the fields, because the connector declared them and its options and sets are written by the sync. On any other row a body that says `source: connector`, or carries a `binding` the row does not already have, is a 409: both are set by connecting a practice system, never by a write.

## Path parameters

- `key` string, required

## Request body

- object
  - `key` string, required
  - `label` string, required
  - `required` boolean
  - `proposed` boolean
  - `source` 'firm' | 'connector'
  - `binding` object, nullable
    - `kind` string, required
    - `field` string, required
  - `default_set_ids` string[]
  - `active` boolean
  - `position` integer

## Response `200`

The attribute as stored.

- object
  - `key` string, required
  - `label` string, required
  - `required` boolean
  - `proposed` boolean
  - `source` 'firm' | 'connector'
  - `binding` object, nullable
    - `kind` string, required
    - `field` string, required
  - `default_set_ids` string[]
  - `active` boolean
  - `position` integer

## Other responses

- `400`: The body, query or path did not validate; `errors` lists the fields.
- `401`: No bearer token, or one that does not verify or has expired.
- `403`: The token verified but may not do this: no organisation, not provisioned, wrong role, or a device problem.
- `409`: The id or the email already belongs to something else.
- `422`: The request is well-formed but cannot be carried out as it stands.

---

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