> ## Documentation Index
> Fetch the complete documentation index at: https://developer.qminder.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Editing an Input Field

> Update an existing input field's properties.

To update an input field, send a PATCH request to `/input-fields/{inputFieldId}`. Only include fields you want to change — omitted fields remain unchanged.

<CodeGroup>
  ```bash curl theme={null}
  curl -X PATCH https://api.qminder.com/input-fields/550e8400-e29b-41d4-a716-446655440000 \
    -H "X-Qminder-REST-API-Key: YOUR_API_KEY" \
    -H "X-Qminder-API-Version: 2020-09-01" \
    -H "Content-Type: application/json" \
    -d '{
      "title": "Visit reason",
      "isVisibleInWaitingDrawer": false,
      "isMandatoryBeforeServed": true
    }'
  ```
</CodeGroup>

**Response:** `200 OK` with an empty body.

### Editable Fields

All fields are optional — only include the fields you want to change.

| Field                       | Type           | Description                                                                                                 |
| --------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------- |
| `title`                     | string         | Display title (max 50 characters). Only for TEXT, SELECT, URL, DATE, NUMERIC.                               |
| `visitorFacingTitle`        | string \| null | Title shown to visitors (max 200 characters). Set to `null` to clear. Only for TEXT, SELECT, DATE, NUMERIC. |
| `isVisibleInWaitingDrawer`  | boolean        | Shown in the waiting drawer                                                                                 |
| `isVisibleInServingDrawer`  | boolean        | Shown in the serving drawer                                                                                 |
| `isMandatoryBeforeAdded`    | boolean        | Must be filled before ticket is added                                                                       |
| `isMandatoryBeforeServed`   | boolean        | Must be filled before ticket is served                                                                      |
| `isMandatoryInRemoteSignIn` | boolean        | Must be filled in remote sign-in                                                                            |
| `showInRemoteSignIn`        | boolean        | Show in remote sign-in                                                                                      |
| `visibleForLines`           | array          | Lines this field applies to: `[{"id": number}]`. Empty array means all lines.                               |
| `multiSelect`               | boolean        | Allow multiple selections. Only for SELECT.                                                                 |
| `options`                   | array          | Select options. Only for SELECT.                                                                            |
| `constraints`               | object         | Numeric constraints (`min`, `max`, `scale`). Only for NUMERIC.                                              |
| `translations`              | array          | Translations (see below). Only for TEXT, SELECT, URL, DATE, NUMERIC.                                        |

### Type-Specific Restrictions

Not all fields can be set on all input field types. Setting a restricted field returns a `400` error:

* **`title`** — cannot be set on FIRST\_NAME, LAST\_NAME, EMAIL, PHONE\_NUMBER
* **`visitorFacingTitle`** — cannot be set on FIRST\_NAME, LAST\_NAME, EMAIL, PHONE\_NUMBER, URL
* **`multiSelect`** and **`options`** — can only be set on SELECT
* **`constraints`** — only applies to NUMERIC

### Translations

When `translations` is provided, **all existing translations are replaced** with the new set. There is no way to update a single translation — you must send the complete list.

```json theme={null}
{
  "translations": [
    { "languageCode": "fr", "title": "Raison de la visite", "visitorFacingTitle": "Votre raison" },
    { "languageCode": "es", "title": "Motivo de la visita" }
  ]
}
```

### SELECT Options

When `options` is provided for a SELECT field, options are matched by `id`:

* Options with a matching `id` are **updated**
* Options with a new `id` are **added**
* Existing options not included in the request are **removed**

```json theme={null}
{
  "options": [
    { "id": "770e8400-e29b-41d4-a716-446655440001", "title": "Updated title" },
    { "id": "990e8400-e29b-41d4-a716-446655440001", "title": "New option" }
  ]
}
```

### Error Responses

| Status | Code                         | Description                                                              |
| ------ | ---------------------------- | ------------------------------------------------------------------------ |
| 400    | `invalid_arguments`          | Type-specific field set on wrong type (e.g., `title` on EMAIL)           |
| 400    | `duplicate_items_in_request` | SELECT options have duplicate titles                                     |
| 400    | `parameter_invalid_blank`    | Title, visitor-facing title, or translation title is blank               |
| 400    | Validation error             | Title too long (>50 chars) or visitor-facing title too long (>200 chars) |
| 404    | `resource_missing`           | Input field not found                                                    |
