> This page is for Developer Documentation.

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

# Batch update Entry

PATCH https://{tenant_name}.benchling.com/api/v3/entry:batch-update
Content-Type: application/json

Batch update Entry synchronously in one transaction. Maximum 25 items per request.

Reference: https://docs.benchling.com/docs/api/benchling-api/entry/batchupdate

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Headers

- `EARLY-ACCESS` (string, optional) — Set to true to access beta operations via /api/v3.

### Body (application/json)

This endpoint expects an object.

- `items` (list of UpdateEntryInputWithPathParams, required)

## Response

### 200

OK

- `items` (list of Entry, required)

## Errors

### 400 Entry Batch Update Request Bad Request Error

Bad Request

- `detail` (GeneralErrorDetail, required, nullable)
- `instance` (string, required)
- `status` (integer, required)
- `title` (string, required, nullable)
- `type` (string, required)
- `invalidId` (string, optional)

### 403 Entry Batch Update Request Forbidden Error

Forbidden

- `detail` (GeneralErrorDetail, required, nullable)
- `instance` (string, required)
- `status` (integer, required)
- `title` (string, required, nullable)
- `type` (string, required)
- `invalidId` (string, optional)

### 404 Entry Batch Update Request Not Found Error

Not Found

- `detail` (GeneralErrorDetail, required, nullable)
- `instance` (string, required)
- `status` (integer, required)
- `title` (string, required, nullable)
- `type` (string, required)
- `invalidId` (string, optional)

### 409 Entry Batch Update Request Conflict Error

Conflict

- `detail` (GeneralErrorDetail, required, nullable)
- `instance` (string, required)
- `status` (integer, required)
- `title` (string, required, nullable)
- `type` (string, required)
- `invalidId` (string, optional)

### 429 Entry Batch Update Request Too Many Requests Error

Too Many Requests

- `detail` (TooManyRequestsErrorBodyDetail, required, nullable)
- `instance` (string, required)
- `status` (integer, required)
- `title` (string, required, nullable)
- `type` (string, required)
- `invalidId` (string, optional)
- `violated-policies` (list of enum, optional) — The budget policies that rejected the request, in canonical order: `user`, `integration`, then `tenant`.
  - Allowed values: `user`, `integration`, `tenant`

### 500 Entry Batch Update Request Internal Server Error

Internal Server Error

- `detail` (InternalServerErrorBodyDetail, required, nullable)
- `instance` (string, required)
- `status` (integer, required)
- `title` (string, required, nullable)
- `type` (string, required)
- `errorId` (string, optional)

## Types

### UpdateEntryInputWithPathParams

- `id` (string, required)
- `archiveReason` (string, optional) — Specifies the archive reason when the entry is archived.
- `archived` (boolean, optional) — Specifies whether the entry is archived.
- `authorIds` (list of string, optional) — Specifies user or app IDs to set as entry authors. Omit to leave authors unchanged. Provide IDs to replace the current author list. Pass an empty array to clear all authors.
- `content` (list of CreateEntryContentInput, optional)
- `name` (string, optional) — Specifies the entry title. Omit to leave the title unchanged.
- `partsMutation` (UpdateDocumentPartsInput, optional) — Specifies a mutation to perform on document content parts. Omit to leave document content unchanged. Rejected on protected entries.
- `schemaFields` (map from string to FieldValueInput, optional) — Specifies values for fields defined by the entry schema. Keys must be field API identifiers. Values must be API identifiers or JSON values matching the field type. Exceptions are assay run and assay result link fields, which must be warehouse UUIDs. Permitted only when the entry has a schema associated with it, or schemaId is supplied in the same request. Omit to leave schema field values unchanged.
- `schemaId` (string, optional, nullable) — Specifies the ID of the entry schema to assign when the entry has no schema. Omit to leave the schema unchanged. Reassigning the schema is not supported. The schema ID can be retrieved from the entry schema listing resource.
- `sectionUuid` (string, optional) — Specifies the UUID of the section where legacy content is inserted when using the content field. Content is appended at the end of that section. Omit to append at the end of the document.
- `selectors` (list of SelectorInput, optional) — Specifies dropdown selectors to create, update, or delete for unstructured tables. To create or update a selector, provide a non-empty name and at least one option. In the case of updates, provide the selector ID. To delete a selector, set delete to true and provide the selector ID.

### Entry

- `__typename` (string, optional)
- `authors` (string, optional, nullable) — Lists the authors of the entry. Defaults to the creator but may be edited.
- `creator` (PrincipalRef, optional, nullable) — Identifies who created the entry.
- `parts` (string, optional) — Lists ordered document parts that make up the document content.
- `schemaFields` (list of SchemaFieldValue, optional, nullable) — Lists values for fields defined by the entry schema.
- `applicableReviewProcesses` (string, optional) — Lists review processes configured for the entry's project. Use the paginated list of applicable review processes for the full list including stages and version details.
- `archiveReason` (string, optional, nullable) — Specifies the archive reason when the entry is archived.
- `archived` (boolean, optional) — Specifies whether the entry is archived.
- `createdAt` (string, optional, nullable) — Specifies when the entry was created.
- `customFields` (list of CustomField, optional, nullable) — Lists custom field values on the entry.
- `displayId` (string, optional, nullable) — Specifies the display ID for the entry.
- `folder` (FolderRef, optional, nullable) — Specifies the folder that contains the entry.
- `id` (string, optional) — Identifies the entry.
- `modifiedAt` (string, optional, nullable) — Specifies when the entry was last modified.
- `name` (string, optional, nullable) — Specifies the title of the entry.
- `review` (ReviewRef, optional, nullable) — Specifies the active review for the entry when one exists. Null when the entry has not been sent for review or the review was retracted.
- `reviewSource` (ProjectRef, optional) — Specifies the project that owns the entry and determines which review processes apply.
- `schema` (EntrySchemaRef, optional, nullable) — Specifies the entry schema when one is configured.
- `sections` (list of EntrySection, optional, nullable)
- `selectors` (list of TableCellSelector, optional) — Lists dropdown selectors available to table cells in the document.
- `typedSchema` (EntrySchemaRef, optional, nullable)
- `versionMetadata` (DocumentLikeVersionMetadata, optional) — Specifies version metadata for the current revision of the entry.

### GeneralErrorDetail

### TooManyRequestsErrorBodyDetail

### InternalServerErrorBodyDetail

### CreateEntryContentInput

- `contentType` (enum, required)
  - Allowed values: `external_file`, `registration_table`, `result_table`, `text`
- `entitySchemaId` (string, optional)
- `resultSchemaId` (string, optional)
- `text` (string, optional)
- `url` (string, optional, deprecated) — Deprecated: prefer the attachment content flow (AttachmentContentInput via partsMutation), which takes a scratchFileId instead of a URL. The URL must be a Benchling-hosted S3 URL, as returned when uploading a file to Benchling; arbitrary external URLs are rejected.

### UpdateDocumentPartsInput

- `operationType` (enum, required) — Specifies which document parts operation to perform.
  - Allowed values: `delete`, `insert`, `insert_table_rows`, `move`, `update_table_cells`
- `sourceRange` (DocumentPartRangeInput, optional) — Specifies the inclusive range of document parts to delete.
- `version` (string, optional) — Specifies the current document version ID. The version ID can be retrieved by querying for the document via the API or one of its parts on the parts listing resource. If the version provided does not match the server's current version, the request will return HTTP 409.
- `parts` (list of DocumentContentInput, optional) — Specifies the document content parts to insert, in order. At least one part is required.
- `position` (UpdateDocumentPartsInputPosition, optional) — Specifies where to insert the new document parts. A document part ID inserts immediately before that part.
- `documentPartId` (string, optional) — API ID of the structured table document part to append rows to. Retrieve valid IDs from the entry or document content.
- `replaceEmptyTrailingRows` (boolean, optional) — Set to true to replace any empty trailing rows on the table with the new rows. An empty row is an unsubmitted row whose cells all match their column's default value. Supported only when position is end_of_table. Defaults to false.
- `rows` (list of InsertTableRowInput, optional) — Rows to insert, in order. Each row's cells are addressed individually by columnIndex; columns without a provided cell receive the column's default value with formulas shifted to the new row.
- `destinationPosition` (UpdateDocumentPartsInputDestinationPosition, optional) — Specifies where to move the source range. A document part ID moves the range immediately before that part, and that part cannot be inside the source range.
- `cellUpdates` (list of CellUpdateInput, optional) — Specifies the table cell updates to perform.

### FieldValueInput

- `value` (any, required)

### SelectorInput

- `delete` (boolean, optional) — When true, deletes the selector identified by the provided ID.
- `name` (string, optional) — Specifies the display name of the selector.
- `options` (list of string, optional) — Specifies the allowed dropdown option values.
- `selectorId` (string, optional) — Specifies the ID of an existing selector to update or delete. Omit to create a new selector.

### PrincipalRef

- `__typename` (string, optional)
- `id` (string, optional)

### SchemaFieldValue

Represents a field value on a schematized object, pairing a `fieldDefinition` (describing the field's type and constraints) with its actual `value` (a `BenchlingValue` such as text, number, date, or link to another object). The value may be null if no value has been set. Used within the `schemaFields` collection on objects that implement `HasSchema` to provide access to all custom field values defined by the object's schema.

- `__typename` (string, optional)
- `fieldDefinition` (SchemaFieldDefinitionRef, optional)
- `id` (string, optional)
- `linkedEntityId` (string, optional, nullable)
- `value` (SchemaFieldValueValue, optional, nullable) — Union of BooleanValue, DateTimeValue, DateValue, DecimalValue, IntegerValue, JsonValue, ObjectLinkValue, ObjectLinkListValue, TextAndUrlValue, TextValue, ArrayValue

### CustomField

A name-value pair for storing additional metadata on objects that support custom fields. CustomFields provide a flexible way to attach arbitrary string data to entities, containers, datasets, and other Benchling objects without modifying their schemas. Objects that can have custom fields implement the HasCustomFields interface. Unlike schema-defined fields, custom fields are not validated against a schema and can be freely added or modified.

- `__typename` (string, optional)
- `name` (string, optional, nullable)
- `value` (string, optional, nullable)

### FolderRef

- `__typename` (string, optional)
- `id` (string, optional)

### ReviewRef

- `__typename` (string, optional)
- `id` (string, optional)

### ProjectRef

- `__typename` (string, optional)
- `id` (string, optional)

### EntrySchemaRef

- `__typename` (string, optional)
- `id` (string, optional)

### EntrySection

Represents a logical section within an Entry used to organize content into collapsible groups. While sections include a date field and were historically known as "Entry Days," they are flexible groupings that users can organize however they want—chronologically, thematically, or by any other criteria. Each section may have a title, date, and contains a list of content items (see `EntryContent`) such as text blocks, tables, and attachments. Sections are collapsible in the UI, which helps when rendering large notebook entries.

- `__typename` (string, optional)
- `contents` (list of EntryContent, optional, nullable)
- `date` (string, optional, nullable)
- `provenanceUuid` (string, optional)
- `title` (string, optional, nullable)

### TableCellSelector

Specifies a predefined dropdown selector that can be assigned to table cells.

- `__typename` (string, optional)
- `name` (string, optional) — Specifies the display name of the selector.
- `options` (list of string, optional) — Lists the allowed dropdown option values.
- `selectorId` (string, optional) — Specifies the selector identifier within the document. Matches the selectorId field on table cells.

### DocumentLikeVersionMetadata

Version metadata for a document such as an entry, template, or subtemplate. Identifies a specific content revision and records when that revision was produced. Use this to detect changes, pin a revision, or reference a particular version without loading the full version record.

- `__typename` (string, optional)
- `createdAt` (string, optional, nullable) — Specifies when this version was created. Versions are immutable; this is the time the parent document was last edited to produce this revision.
- `versionId` (string, optional) — Identifies this version of the document.

### DocumentPartRangeInput

- `end` (DocumentPartRangeInputEnd, required) — Specifies the last document part in the range, inclusive. Must refer to the same part as start, or a part after it in document order.
- `start` (DocumentPartRangeInputStart, required) — Specifies the first document part in the range, inclusive.

### DocumentContentInput

- `contentType` (enum, required) — Specifies the type of document content.
  - Allowed values: `analysis`, `attachment`, `attachment_placeholder`, `benchling_item`, `code_block`, `header`, `list_item`, `results_table`, `section`, `text`, `unstructured_table`
- `analysisTemplateId` (string, optional) — Specifies the ID of the analysis template to instantiate and embed. A new analysis is created from the template and the template is applied to it asynchronously after the content is created. The template must be published (draft templates are rejected), and the caller must have permission to apply analysis templates. Analyses can only be embedded in a notebook entry, not other document types.
- `indentation` (integer, optional) — Specifies the indentation level for this content within the document. Accepted values are integers from 0 through 5.
- `displayWidth` (integer, optional, nullable) — Specifies the custom display width in pixels, when set. The value must be greater than 0.
- `scratchFileId` (string, optional) — Specifies the ID of a ScratchFile uploaded through the scratch-file workflow. The file upload must be complete before it can be attached.
- `itemId` (string, optional) — Specifies the ID of the Benchling item to embed. Supported items include sequences, AA sequences, custom entities, oligo conjugates and duplexes, proteins, entries, protocols, and other basic folder items.
- `text` (string, optional) — Specifies the plain-text body.
- `formats` (list of TextFormatInput, optional) — Specifies inline styling applied to character ranges in the plain-text body.
- `headerType` (enum, optional) — Specifies the heading level and style.
  - Allowed values: `HEADER_1`, `HEADER_2`, `SUBHEADER_1`
- `links` (list of LinkSpanInput, optional) — Specifies hyperlinks applied to character ranges in the plain-text body.
- `mentions` (list of MentionInput, optional) — Specifies inline mentions of other Benchling items in the plain-text body.
- `listType` (enum, optional) — Specifies the list marker style.
  - Allowed values: `BULLET`, `NUMBER`, `CHECKBOX_CHECKED`, `CHECKBOX_UNCHECKED`
- `name` (string, optional) — Specifies the display name of the table. The name must not be empty or blank, and must be at most 100 characters.
- `resultSchemaId` (string, optional) — Specifies the ID of the result schema that defines the table's columns. The schema ID can be retrieved from the result schema listing resource.
- `date` (DocumentContentInputDate, optional) — Specifies the section date, when set.
- `title` (string, optional) — Specifies the section title, when set.
- `caption` (CaptionInput, optional, nullable) — Specifies an optional rich-text caption for the table, when set.
- `columnDefinitions` (list of UnstructuredTableColumnInput, optional) — Specifies the column definitions for the table. The table must have at least one column, but no more than 255.
- `rows` (list of UnstructuredTableRowInput, optional) — Specifies the rows in the table. The table must have at least one row. Each row must contain one cell for each column.

### UpdateDocumentPartsInputPosition

Specifies where to insert the new document parts. A document part ID inserts immediately before that part.

### InsertTableRowInput

- `cells` (list of ColumnIndexedCellInput, required) — The cells to populate for this appended row. Each entry targets one column via columnIndex; columns not listed receive the column's default value (formulas are shifted to the appended row).

### UpdateDocumentPartsInputDestinationPosition

Specifies where to move the source range. A document part ID moves the range immediately before that part, and that part cannot be inside the source range.

### CellUpdateInput

- `columnIndex` (integer, required) — Specifies the zero-based index of the column this cell belongs to.
- `rowIndex` (integer, required) — Specifies the zero-based index of the row this cell belongs to.
- `format` (TableCellFormatInput, optional, nullable)
- `inputValue` (BenchlingValueInput, optional, nullable) — Specifies the cell input value. Set to null to clear the cell's value, or omit to keep the existing value.
- `mergeRange` (TableMergeRangeInput, optional, nullable)
- `mergeRangeParent` (TableMergeRangeParentInput, optional, nullable)
- `selectorId` (string, optional, nullable) — Specifies the ID of a table cell selector to associate with this cell.

### SchemaFieldDefinitionRef

- `__typename` (string, optional)
- `id` (string, optional)

### SchemaFieldValueValue

### EntryContent

Represents a single content item within an EntrySection. The `type` field indicates what kind of content this is (see `ContentType`). This provides a simplified view of entry content categorization.

- `__typename` (string, optional)
- `type` (enum, optional, nullable)
  - Allowed values: `TEXT`, `LIST_ITEM`, `HEADER`, `CODE_BLOCK`, `UNSTRUCTURED_TABLE`, `PLACEHOLDER`, `EXTERNAL_FILE`, `ASSAY_RUN`, `STRUCTURED_TABLE`, `OTHER`

### DocumentPartRangeInputEnd

Specifies the last document part in the range, inclusive. Must refer to the same part as start, or a part after it in document order.

### DocumentPartRangeInputStart

Specifies the first document part in the range, inclusive.

### TextFormatInput

- `end` (integer, required) — Specifies the exclusive end index of the character range within the plain-text body. Accepted values are integers from 1 through the length of the plain-text body. The end index must be greater than the start index.
- `start` (integer, required) — Specifies the inclusive start index of the character range within the plain-text body. Accepted values are integers from 0 through the length of the plain-text body. The end index must be greater than the start index.
- `backgroundColor` (string, optional, nullable) — Specifies the background color applied to the character range, when set. The value must be a hexadecimal color code such as #RGB or #RRGGBB.
- `foregroundColor` (string, optional, nullable) — Specifies the text color applied to the character range, when set. The value must be a hexadecimal color code such as #RGB or #RRGGBB.
- `properties` (list of enum, optional) — Specifies the character style properties applied to the range.
  - Allowed values: `BOLD`, `ITALIC`, `UNDERLINE`, `STRIKETHROUGH`, `SUBSCRIPT`, `SUPERSCRIPT`, `MONOSPACE`

### LinkSpanInput

- `end` (integer, required) — Specifies the exclusive end index of the character range within the plain-text body. Accepted values are integers from 1 through the length of the plain-text body. The end index must be greater than the start index.
- `start` (integer, required) — Specifies the inclusive start index of the character range within the plain-text body. Accepted values are integers from 0 through the length of the plain-text body. The end index must be greater than the start index.
- `url` (string, required) — Specifies the URL of the hyperlink. Only http and https URLs are accepted.

### MentionInput

- `itemId` (string, required) — Specifies the ID of the referenced Benchling item.
- `position` (integer, required) — Specifies the zero-based insertion index within the plain-text body where this mention appears. Mentions do not occupy characters in the plain-text body for purposes of format range start and end positions. Accepted values are integers from 0 through the length of the plain-text body.

### DocumentContentInputDate

Specifies the section date, when set.

### CaptionInput

- `text` (string, required) — Specifies the plain-text body. Character indices in formats, links, and mentions refer to positions in this string.
- `formats` (list of TextFormatInput, optional) — Specifies inline styling applied to character ranges in the plain-text body.
- `links` (list of LinkSpanInput, optional) — Specifies hyperlinks applied to character ranges in the plain-text body.
- `mentions` (list of MentionInput, optional) — Specifies inline mentions of other Benchling items in the plain-text body.

### UnstructuredTableColumnInput

- `name` (string, required) — Specifies the column display name.
- `isLocked` (boolean, optional)
- `width` (double, optional, nullable)

### UnstructuredTableRowInput

- `cells` (list of UnstructuredTableCellInput, required) — Specifies the cells in the row, in column order.

### ColumnIndexedCellInput

- `columnIndex` (integer, required) — Specifies the zero-based index of the column this cell belongs to.
- `format` (TableCellFormatInput, optional, nullable)
- `inputValue` (BenchlingValueInput, optional, nullable) — Specifies the cell input value. Set to null to clear the cell's value, or omit to keep the existing value.
- `mergeRange` (TableMergeRangeInput, optional, nullable)
- `mergeRangeParent` (TableMergeRangeParentInput, optional, nullable)
- `selectorId` (string, optional, nullable) — Specifies the ID of a table cell selector to associate with this cell.

### TableCellFormatInput

- `alignment` (enum, optional, nullable) — Specifies horizontal text alignment for the cell, when set.
  - Allowed values: `LEFT`, `CENTER`, `RIGHT`
- `backgroundColor` (string, optional, nullable)
- `foregroundColor` (string, optional, nullable)
- `link` (string, optional, nullable)
- `precision` (integer, optional, nullable) — Specifies the decimal precision used to display a numeric cell, when set. Accepted values are integers from 0 through 20.
- `properties` (list of enum, optional) — Lists the character styles applied to the cell. A style the list leaves out is removed from the cell.
  - Allowed values: `BOLD`, `ITALIC`, `UNDERLINE`, `STRIKETHROUGH`, `IMPORTANT`
- `scientificNotation` (boolean, optional, nullable) — Specifies whether a numeric cell is displayed in scientific notation, when set.

### BenchlingValueInput

- `type` (enum, required)
  - Allowed values: `boolean_value`, `date_value`, `datetime_value`, `decimal_value`, `integer_value`, `object_link_list_value`, `object_link_value`, `text_and_url_value`, `text_value`
- `value` (boolean, optional)
- `ids` (list of string, optional)
- `id` (string, optional)
- `url` (string, optional)

### TableMergeRangeInput

- `mergeColSpan` (integer, required)
- `mergeRowSpan` (integer, required)

### TableMergeRangeParentInput

- `col` (integer, required)
- `row` (integer, required)

### BooleanValue

A type that represents boolean values.

- `__typename` (string, optional)
- `value` (boolean, optional) — The boolean value.

### DateTimeValue

A type that represents datetime values.

- `__typename` (string, optional)
- `value` (string, optional) — The datetime value with UTC as the timezone.

### DateValue

A type that represents date values.

- `__typename` (string, optional)
- `value` (date, optional) — The date value.

### DecimalValue

A type that represents decimal value as strings.

- `__typename` (string, optional)
- `value` (string, optional, nullable) — The decimal value in a string representation
- `numericValue` (double, optional, nullable, deprecated) — Deprecated. The float representation of the decimal value.

### IntegerValue

A type that represents integer values.

- `__typename` (string, optional)
- `value` (integer, optional) — The integer value.

### JsonValue

A type that represents JSON values.

- `__typename` (string, optional)
- `value` (map from string to any, optional) — The JSON value.

### ObjectLinkValue

A type that represents links to other objects.

- `__typename` (string, optional)
- `value` (ObjectRef, optional) — The object that this value links to, or an Inaccessible object if not found with the current permission set.

### ObjectLinkListValue

A type that represents a list of links to other objects.

- `__typename` (string, optional)
- `value` (list of ObjectRef, optional) — The list of objects that this value links to. Inaccessible objects may be returned instead if the object is not found with the current permission set.

### TextAndUrlValue

A type that represents text (string) values with an associated URL.

- `__typename` (string, optional)
- `url` (string, optional) — The URL associated with the value. Please use `TextValue` if you don't want a URL.
- `value` (string, optional) — The text value. It may or may not be an empty string.

### TextValue

A type that represents text (string) values.

- `__typename` (string, optional)
- `value` (string, optional) — The text value. It may or may not be an empty string.

### ArrayValue

A type that represents a list of BenchlingValues, used for multi-value cells (e.g. alias columns).

- `__typename` (string, optional)
- `value` (list of ArrayValueValueItem, optional)

### UnstructuredTableCellInput

- `inputValue` (TextValueInput, required) — Specifies the cell input value. For unstructured tables this is always a text value.
- `format` (TableCellFormatInput, optional, nullable)
- `mergeRange` (TableMergeRangeInput, optional, nullable)
- `mergeRangeParent` (TableMergeRangeParentInput, optional, nullable)
- `selectorId` (string, optional, nullable) — Specifies the ID of a table cell selector to associate with this cell.

### ObjectRef

- `__typename` (string, optional)
- `id` (string, optional)

### ArrayValueValueItem

Union of BooleanValue, DateTimeValue, DateValue, DecimalValue, IntegerValue, JsonValue, ObjectLinkValue, ObjectLinkListValue, TextAndUrlValue, TextValue

### TextValueInput

- `type` (enum, required)
  - Allowed values: `text_value`
- `value` (string, required)

## Examples

**Request**

```json
{
  "items": [
    {
      "id": "etr_8rVKW0g7",
      "authorIds": [
        "ent_a0SApq3z"
      ],
      "name": "Protein Concentration Assay 2025-01-16",
      "partsMutation": {
        "operationType": "insert",
        "version": "etrver_Ax7b2kR9",
        "parts": [
          {
            "contentType": "text",
            "text": "Sample A showed elevated concentration.",
            "formats": [
              {
                "end": 8,
                "start": 0,
                "properties": [
                  "BOLD"
                ]
              }
            ]
          },
          {
            "contentType": "attachment",
            "scratchFileId": "scrfile_lHftrqPCF3WZ"
          },
          {
            "contentType": "unstructured_table",
            "name": "Follow-up Measurements",
            "columnDefinitions": [
              {
                "name": "Sample"
              },
              {
                "name": "Concentration (mg/mL)"
              }
            ],
            "rows": [
              {
                "cells": [
                  {
                    "inputValue": {
                      "type": "text_value",
                      "value": "Sample D"
                    }
                  },
                  {
                    "inputValue": {
                      "type": "text_value",
                      "value": "1.05"
                    }
                  }
                ]
              }
            ]
          }
        ],
        "position": "end_of_document"
      }
    }
  ]
}
```

**Response**

```json
{
  "items": [
    {
      "__typename": "__typename",
      "authors": "authors",
      "parts": "parts",
      "schemaFields": [
        {}
      ],
      "applicableReviewProcesses": "applicableReviewProcesses",
      "archiveReason": "archiveReason",
      "archived": true,
      "createdAt": "createdAt",
      "customFields": [
        {}
      ],
      "displayId": "displayId",
      "id": "id",
      "modifiedAt": "modifiedAt",
      "name": "name",
      "sections": [
        {}
      ],
      "selectors": [
        {}
      ]
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://{tenant_name}.benchling.com/api/v3/entry:batch-update"

payload = { "items": [
        {
            "id": "etr_8rVKW0g7",
            "authorIds": ["ent_a0SApq3z"],
            "name": "Protein Concentration Assay 2025-01-16",
            "partsMutation": {
                "operationType": "insert",
                "version": "etrver_Ax7b2kR9",
                "parts": [
                    {
                        "contentType": "text",
                        "text": "Sample A showed elevated concentration.",
                        "formats": [
                            {
                                "end": 8,
                                "start": 0,
                                "properties": ["BOLD"]
                            }
                        ]
                    },
                    {
                        "contentType": "attachment",
                        "scratchFileId": "scrfile_lHftrqPCF3WZ"
                    },
                    {
                        "contentType": "unstructured_table",
                        "name": "Follow-up Measurements",
                        "columnDefinitions": [{ "name": "Sample" }, { "name": "Concentration (mg/mL)" }],
                        "rows": [{ "cells": [{ "inputValue": {
                                            "type": "text_value",
                                            "value": "Sample D"
                                        } }, { "inputValue": {
                                            "type": "text_value",
                                            "value": "1.05"
                                        } }] }]
                    }
                ],
                "position": "end_of_document"
            }
        }
    ] }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript
const url = 'https://{tenant_name}.benchling.com/api/v3/entry:batch-update';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"items":[{"id":"etr_8rVKW0g7","authorIds":["ent_a0SApq3z"],"name":"Protein Concentration Assay 2025-01-16","partsMutation":{"operationType":"insert","version":"etrver_Ax7b2kR9","parts":[{"contentType":"text","text":"Sample A showed elevated concentration.","formats":[{"end":8,"start":0,"properties":["BOLD"]}]},{"contentType":"attachment","scratchFileId":"scrfile_lHftrqPCF3WZ"},{"contentType":"unstructured_table","name":"Follow-up Measurements","columnDefinitions":[{"name":"Sample"},{"name":"Concentration (mg/mL)"}],"rows":[{"cells":[{"inputValue":{"type":"text_value","value":"Sample D"}},{"inputValue":{"type":"text_value","value":"1.05"}}]}]}],"position":"end_of_document"}}]}'
};

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