> 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 sample glossary items

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

Updates between 1 and 100 sample 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 sample types that changed. System sample types cannot be updated.

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

## Authentication

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

## Request

### Body (application/json)

This endpoint expects a list of TeamSampleGlossaryBulkUpdateV1.

- `list of TeamSampleGlossaryBulkUpdateV1`

## Response

### 200

The updated sample types.

- `data` (list of TeamSampleGlossaryV1, required) — The sample 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

### TeamSampleGlossaryBulkUpdateV1

The changes to apply to one sample type in your team's glossary. Omitted properties are left untouched. Only `description` can be cleared with an explicit null. An archived sample 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 sample type. Must not be blank, must be unique among your team's sample types, and cannot change while samples use the sample type.
- `label` (string, optional) — A short label for the sample type. Must not be blank and must be unique among your team's sample types.
- `status` (enum, optional) — Whether a team glossary entry is available for use or archived.
  - Allowed values: `active`, `archived`
- `description` (string, optional, nullable) — A longer description of the sample type.
- `details` (list of enum, optional) — The details to record when a sample of this type is collected. An empty list removes them all.
  - Allowed values: `weight`, `volume`, `width`, `length`, `depth`

### TeamSampleGlossaryV1

A sample 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 sample type.
- `label` (string, required, nullable) — A short label for the sample type.
- `description` (string, required, nullable) — A longer description of the sample type.
- `status` (enum, required) — Whether a team glossary entry is available for use or archived.
  - Allowed values: `active`, `archived`
- `details` (list of string, required, nullable) — The details to record when a sample of this type is collected. Null when none are configured. Entries created through this API are always one of `weight`, `volume`, `width`, `length` or `depth`, but entries configured in the In Vivo app are not restricted to those values.

### 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.

## Examples

**Request**

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

**Response**

```json
{
  "data": [
    {
      "id": "tgy_6vQ3mKpNvR7zTw8YbCdFgW",
      "title": "string",
      "label": "string",
      "description": "string",
      "status": "active",
      "details": [
        "string"
      ]
    }
  ]
}
```

**SDK Code**

```python
import requests

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

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/samples';
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);
}
```