---
title: "Append a custom attribute option to a meeting"
method: POST
path: "/api/v1/meetings/{id}/custom-attributes/{attributeId}/values"
tags: ["Custom Attributes"]
---

# Append a custom attribute option to a meeting

`POST /api/v1/meetings/{id}/custom-attributes/{attributeId}/values`

## Request

- Base URL: `https://api.recruitwithatlas.com`
- URL: `https://api.recruitwithatlas.com/api/v1/meetings/{id}/custom-attributes/{attributeId}/values`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/recruitwithatlas/apis/atlas-api/docs/api/v1/meetings/:id/custom-attributes/:attributeId/values/post.ts> (a function with typed inputs; its response is checked against the schema)

Adds a single option selection to an `options`-type custom attribute on a meeting record **without replacing the existing selections**.

Appending an option that is already selected is idempotent: the existing selection is returned with `200` and no duplicate is created. For single-select attributes (`multipleValues: false`) the append is rejected with `409` when another value is already set.

Returns `404` if the attribute, option, or meeting does not exist for this agency, and `422` if the attribute is not of type `options`.

Also returns `422` if the id belongs to an interview (use the `/api/v1/interviews` endpoints instead) or the meeting has no meeting log, and `403` if the API key's user is neither the meeting log's creator nor an agency admin.

## Path parameters

- `id` string, uuid, required: Record identifier (person, company or meeting ID)
- `attributeId` string, uuid, required: Custom attribute ID

## Request body

- object
  - `optionId` string, uuid, required: Option to select on the record. Must belong to the attribute in the URL.

## Response `200`

Option was already selected (idempotent no-op)

- object
  - `status` 'ok', required
  - `data` object, required
    - `id` string, uuid, required: Identifier of the stored value row
    - `customAttributeId` string, uuid, required: Attribute the value belongs to
    - `optionId` string, uuid, nullable, required: The selected option

## Other responses

- `201`: Option appended
- `401`: Unauthorized - missing or invalid API key
- `403`: Forbidden — the API key's user is neither the meeting log's creator nor an agency admin
- `404`: Resource not found
- `409`: Conflict - the request cannot be fulfilled because of a conflict with the current state of the resource
- `422`: Validation error - the request failed schema validation (`errors.fieldErrors`) or a business rule (`errors.formErrors`)
- `429`: Too many requests - the caller has exceeded the per-agency rate limit for the tier this endpoint counts against (default per minute: 1200 read / 400 write / 60 upload). Inspect the `RateLimit-*` headers — returned on every response, not only on 429s — and back off until the window resets. See the "Rate limits" section of the introduction for details.
- `500`: Internal server error

## Changes

- **2026-10-16** `2c0c6a89d8e7`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/recruitwithatlas/apis/atlas-api/changes/api/v1/meetings/:id/custom-attributes/:attributeId/values/post.md)

---

[API](https://skmtc.dev/recruitwithatlas/apis/atlas-api.md) - [All operations](https://skmtc.dev/recruitwithatlas/apis/atlas-api/llms.txt) - [OpenAPI document](https://skmtc.dev/recruitwithatlas/apis/atlas-api/revisions/158ee454751c?raw)
