> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.benchling.com/in-vivo/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.benchling.com/in-vivo/_mcp/server.

# Update team observation glossary items

PATCH https://acme-api.invivo.benchling.com/api/public/v1/team-glossary/observations
Content-Type: application/json

Updates between 1 and 100 observation types in your team's glossary, including archiving and unarchiving them through `status`. The request is validated as a whole; if any item is invalid, none are updated. The response lists only the observation types that changed. System observation types cannot be updated.

Reference: https://docs.benchling.com/in-vivo/team-glossary/team-observation-glossary-update

## Authentication

- OAuth2 — send the obtained token as `Authorization: Bearer <token>`

## Request

### Body (application/json)

This endpoint expects a list of TeamObservationGlossaryBulkUpdateV1.

- `list of TeamObservationGlossaryBulkUpdateV1`

## Response

### 200

The updated observation types.

- `data` (list of TeamObservationGlossaryV1, required) — The observation types.

## Errors

### 400 Bad Request Error

The request was rejected. Validation failures return a `ValidationErrorResponse`; an unrecognised `X-Studies-Api-Version` header returns an `AuthErrorResponse` with the code `invalid_header`.

- `BadRequestErrorResponse`

### 401 Unauthorized Error

Authentication failed. The body is normally empty; when an otherwise valid access token is missing required claims the body is an `AuthErrorResponse` with the code `invalid_token`.

- `any`

### 403 Forbidden Error

The access token does not grant the scopes this operation requires. The body is normally empty; when the token's team is missing or deleted the body is an `AuthErrorResponse` with the code `invalid_data`.

- `any`

### 429 Too Many Requests Error

A rate limit was exceeded. Retry once the window resets; no `Retry-After` header is sent, so use `X-RateLimit-Reset`.

- `error` ("rate_limit_exceeded", required) — A machine-readable error code.
- `message` (string, required) — A human-readable explanation of the failure.

## Types

### TeamObservationGlossaryBulkUpdateV1

The changes to apply to one observation type in your team's glossary. Omitted properties are left untouched. An archived observation type accepts field changes only when the same item also sets `status` to `active`.

- `id` (string, required) — Unique identifier for an entry in your team's own glossary.
- `title` (string, optional) — The title of the observation type. Must not be blank, must be unique among your team's observation types, and cannot change while observations use the observation type.
- `label` (string, optional) — A short label for the observation type. Must not be blank and must be unique among your team's observation types.
- `description` (string, optional, nullable) — A longer description of the observation type. Null clears it.
- `status` (enum, optional) — Whether a team glossary entry is available for use or archived.
  - Allowed values: `active`, `archived`
- `type` (enum, optional) — How values are recorded against a team glossary entry. `numeric` entries have a configured min/max range, `severity` entries accept Mild/Moderate/Severe, and `none` entries carry free-form text with no structured value.
  - Allowed values: `none`, `severity`, `numeric`
- `numeric` (ObservationTeamGlossaryOptionsPatchV1, optional, nullable) — The bounds to change. Only allowed when the resulting type is `numeric`. Changing the type away from `numeric` drops the stored bounds; null is accepted then but rejected while the type stays `numeric`.

### TeamObservationGlossaryV1

An observation type in your team's glossary.

- `id` (string, required) — Unique identifier for an entry in your team's own glossary.
- `title` (string, required) — The title of the observation type.
- `label` (string, required, nullable) — A short label for the observation type.
- `description` (string, required, nullable) — A longer description of the observation type.
- `status` (enum, required) — Whether a team glossary entry is available for use or archived.
  - Allowed values: `active`, `archived`
- `type` (enum, required) — How values are recorded against a team glossary entry. `numeric` entries have a configured min/max range, `severity` entries accept Mild/Moderate/Severe, and `none` entries carry free-form text with no structured value.
  - Allowed values: `none`, `severity`, `numeric`
- `numeric` (ObservationTeamGlossaryOptionsV1, optional) — The bounds of a numeric observation type. At least one of `min` and `max` is set.

### ValidationErrorResponse

Returned when a request body or parameter fails validation.

- `message` (string, required) — A summary of the failure.
- `errors` (map from string to list of string, required) — Failure messages keyed by the offending field, using the field's name as it appears on the wire. Nested fields are dotted, e.g. `schedule.duration`.

### AuthErrorResponse

Returned when a request is rejected during authentication, before it is processed.

- `error` (enum, required) — A machine-readable error code.
  - Allowed values: `invalid_header`, `invalid_token`, `invalid_data`
- `error_description` (string, required) — A human-readable explanation of the failure.

### ProblemDetail

An RFC 9457 problem detail, returned when a request is rejected before it reaches a controller method — most commonly an unparseable or absent JSON body. Unlike the rest of this API, null members are omitted rather than serialised as `null`.

- `title` (string, required) — A short, human-readable summary of the problem type.
- `status` (integer, required) — The HTTP status code, repeated in the body.
- `detail` (string, required) — A human-readable explanation specific to this occurrence.
- `instance` (string, required) — The path of the request that produced the problem.

### ObservationTeamGlossaryOptionsPatchV1

The bounds to change on a numeric observation type. An omitted, null or blank bound keeps its stored value, so at least one of `min` and `max` must be set when the observation type is already numeric. Both are required when changing the type to `numeric`.

- `min` (string, optional, nullable) — The minimum accepted value, as a string. Must be a finite, non-negative number below the effective `max`.
- `max` (string, optional, nullable) — The maximum accepted value, as a string. Must be a finite number above the effective `min`.

### ObservationTeamGlossaryOptionsV1

The bounds of a numeric observation type. At least one of `min` and `max` is set.

- `min` (string, required, nullable) — The minimum accepted value, as a string.
- `max` (string, required, nullable) — The maximum accepted value, as a string.

## Examples

**Request**

```json
[
  {
    "id": "tgy_6vQ3mKpNvR7zTw8YbCdFgW"
  }
]
```

**Response**

```json
{
  "data": [
    {
      "id": "tgy_6vQ3mKpNvR7zTw8YbCdFgW",
      "title": "string",
      "label": "string",
      "description": "string",
      "status": "active",
      "type": "numeric",
      "numeric": {
        "min": "0",
        "max": "6"
      }
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://acme-api.invivo.benchling.com/api/public/v1/team-glossary/observations"

payload = [{ "id": "tgy_6vQ3mKpNvR7zTw8YbCdFgW" }]
headers = {
    "Authorization": "<token>.",
    "Content-Type": "application/json"
}

response = requests.patch(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://acme-api.invivo.benchling.com/api/public/v1/team-glossary/observations';
const options = {
  method: 'PATCH',
  headers: {Authorization: '<token>.', 'Content-Type': 'application/json'},
  body: '[{"id":"tgy_6vQ3mKpNvR7zTw8YbCdFgW"}]'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```