# Custom fields

### Custom fields
A contact carries your organisation's contact custom columns in
`custom_fields`, keyed by the column **label** — the same keys in both
directions, so a value you read on `GET` can be sent straight back on
`POST` or `PATCH`. Values of a multi-select column are the option
labels, not their internal ids.

```json
{
  "parent_type": "customer",
  "parent_id": "K-10042",
  "external_id": "ASP-00815",
  "custom_fields": {
    "Funktion": "Niederlassungsleiter",
    "Zuständigkeiten": ["Einkauf", "Technik"]
  }
}
```
Both write paths **merge** — only the labels you send are written:
- Omit a label and its stored value is left alone. A feed that
maintains one field never drops fields another system owns.
- Send `{"Funktion": null}` to clear that one field. A `null`
`custom_fields` object is rejected — it would be ambiguous between
"clear everything" and "no change".
- An unknown label is rejected with `400 VALIDATION_FAILED`; the
response `details[]` name the offending contact and label. On
`POST` this happens before the job is queued, so nothing is applied
and your `Idempotency-Key` stays reusable.

Columns are defined by your Mercura administrator under
Settings → Custom Columns; labels are resolved per organisation, so a
label defined for customers is not a valid contact field.

Version: 1.79.2

## Description:

  - `Custom fields` ()
    A contact carries your organisation's contact custom columns in
`custom_fields`, keyed by the column **label** — the same keys in both
directions, so a value you read on `GET` can be sent straight back on
`POST` or `PATCH`. Values of a multi-select column are the option
labels, not their internal ids. ```json
{
  "parent_type": "customer",
  "parent_id": "K-10042",
  "external_id": "ASP-00815",
  "custom_fields": {
    "Funktion": "Niederlassungsleiter",
    "Zuständigkeiten": ["Einkauf", "Technik"]
  }
}
``` Both write paths **merge** — only the labels you send are written: - Omit a label and its stored value is left alone. A feed that
maintains one field never drops fields another system owns.
- Send `{"Funktion": null}` to clear that one field. A `null`
`custom_fields` object is rejected — it would be ambiguous between
"clear everything" and "no change".
- An unknown label is rejected with `400 VALIDATION_FAILED`; the
response `details[]` name the offending contact and label. On
`POST` this happens before the job is queued, so nothing is applied
and your `Idempotency-Key` stays reusable. Columns are defined by your Mercura administrator under
Settings → Custom Columns; labels are resolved per organisation, so a
label defined for customers is not a valid contact field.

