---
title: "Create a new attribute"
method: POST
path: "/attribute-tagging/v1/attributes/"
tags: ["Attributes"]
---

# Create a new attribute

`POST /attribute-tagging/v1/attributes/`

## Request

- Base URL: `https://api.cloudbeds.com`
- URL: `https://api.cloudbeds.com/attribute-tagging/v1/attributes/`
- Auth: HTTP bearer

## Headers

- `x-organization-id` string, required
- `accept-language` string

## Request body

- object
  - `label` string, required
  - `description` string
  - `entityTypes` string[], required
  - `isEnabled` boolean
  - `categoryId` string, nullable: Category this attribute belongs to. Omitted or null means Uncategorized.
  - `position` integer: Explicit slot within the category. Omitted, the row is appended after the current maximum. Capped at 500000, well below the column's int4 ceiling, so no single write can exhaust the scope's append space.
  - `icon` string, nullable: Icon name for this tag, from the Nebula icon set. Null defers to the icon on the category this attribute belongs to, then to the default tag glyph. Not validated against the icon set — an unknown name falls back the same way.
  - `color` string, nullable: Tag colour as a hex string, `#RGB` or `#RRGGBB`. Null defers to the colour on the category this attribute belongs to, then to a neutral tile. Stored verbatim, so compare against a preset case-insensitively.
  - `isPinned` boolean: Pins the attribute organization-wide, so it always renders first in a tag row and survives truncation. At most 5 per organization; pinning a sixth answers 409 PIN_LIMIT_EXCEEDED. Pinning an already-pinned attribute is a no-op.

## Response `201`

Default Response

- object
  - `id` union, required
    - string
    - 'vip' | 'blacklisted' | 'special_occasion' | 'pet' | 'late_checkout' | 'early_checkin' | 'upgrade' | 'late_arrival' | 'multi_room_reservation' | 'room_move' | 'parking' | 'breakfast'
  - `label` string, nullable, required
  - `name` string, required: The name to show: `label` when the organization set one (never translated), else the Standard Tag's default name in the `Content-Language` of the response (resolved from `Accept-Language`, falling back to `en_US`, then to `standardKey`).
  - `description` string, nullable, required
  - `entityTypes` string[], required
  - `isEnabled` boolean, required
  - `categoryId` string, nullable, required
  - `position` integer, required
  - `isPinned` boolean, required
  - `icon` string, nullable, required
  - `color` string, nullable, required
  - `standardKey` 'vip' | 'blacklisted' | 'special_occasion' | 'pet' | 'late_checkout' | 'early_checkin' | 'upgrade' | 'late_arrival' | 'multi_room_reservation' | 'room_move' | 'parking' | 'breakfast', nullable, required
  - `isStandard` boolean, required
  - `category` object, nullable: The category this attribute belongs to, or null when Uncategorized. Present on `GET /attributes`, `GET /tags` and `POST /tags/query`; omitted on `POST`/`PATCH /attributes` and on tag write responses (`POST /tags`, `POST /tags/bulk`).
    - `id` string, required
    - `key` string, nullable, required
    - `label` string, nullable, required
    - `icon` string, nullable, required
    - `color` string, nullable, required

## Other responses

- `400`: Default Response
- `404`: Default Response
- `409`: Default Response
- `421`: The property or organization in the headers is hosted in another region; the message names the base URL to use.
- `503`: Default Response

---

[API](https://skmtc.dev/cloudbeds/apis/attribute-tagging-service-api.md) - [All operations](https://skmtc.dev/cloudbeds/apis/attribute-tagging-service-api/llms.txt) - [OpenAPI document](https://skmtc.dev/cloudbeds/apis/attribute-tagging-service-api/revisions/1e636522d4c5?raw)
