Skill Tracer
Skills › Scientific Agent Skills › benchling-integration

benchling-integration

skill · 193 lines · MIT · skills/benchling-integration/SKILL.md

The facts

Its description

Benchling Python SDK and REST API integration for registry entities, inventory, ELN entries, workflows, Benchling Apps, and Data Warehouse queries. Use when automating lab data with benchling-sdk or the v2 API.

The description the agent reads to decide when to use it.

From its settingsline 3

Tools it may use, or may not

allowed-tools: Read Write Edit Bash

Tools it may use while it runs without asking you first.

From its settingsline 5

Files it mentions

references/authentication.md, references/core_capabilities.md, references/sdk_reference.md, references/api_endpoints.md (first 5 of 6 lines)

Files the text names, such as ones to read or write. Found by matching words, so treat them as pointers.

Found by matching wordsline 61 line 166 line 167 line 169 line 171

Licence

MIT, from the skill file

The terms its author shares it under, which let it be shown here.

From its settingsline 4 licence text

Other settings

compatibility: Requires Python 3.9+, benchling-sdk 1.25.0, network access, a Benchling tenant with API access, and API key or OAuth app credentials. metadata: name: BENCHLING_TENANT_URL, name: BENCHLING_API_KEY, name: BENCHLING_CLIENT_ID, name: BENCHLING_CLIENT_SECRET, name: BENCHLING_PROD_TENANT_URL, name: BENCHLING_PROD_API_KEY, name: BENCHLING_STAGING_TENANT_URL, name: BENCHLING_STAGING_API_KEY

More settings at the top of the file, shown as written.

From its settingsline 6 line 7
Other files in this skill (5) Close

The text

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1---
2name: benchling-integration
3description: Benchling Python SDK and REST API integration for registry entities, inventory, ELN entries, workflows, Benchling Apps, and Data Warehouse queries. Use when automating lab data with benchling-sdk or the v2 API.
4license: MIT
5allowed-tools: Read Write Edit Bash
6compatibility: Requires Python 3.9+, benchling-sdk 1.25.0, network access, a Benchling tenant with API access, and API key or OAuth app credentials.
7metadata:
8 version: "1.7"
9 last-reviewed: "2026-09-30"
10 skill-author: K-Dense Inc.
11 openclaw:
12 primaryEnv: BENCHLING_API_KEY
13 envVars:
14 - name: BENCHLING_TENANT_URL
15 required: true
16 description: Benchling tenant base URL.
17 - name: BENCHLING_API_KEY
18 required: false
19 description: API key auth (alternative to OAuth).
20 - name: BENCHLING_CLIENT_ID
21 required: false
22 description: OAuth app client id.
23 - name: BENCHLING_CLIENT_SECRET
24 required: false
25 description: OAuth app client secret.
26 - name: BENCHLING_PROD_TENANT_URL
27 required: false
28 description: Production tenant URL (multi-env setups).
29 - name: BENCHLING_PROD_API_KEY
30 required: false
31 description: Production API key (multi-env setups).
32 - name: BENCHLING_STAGING_TENANT_URL
33 required: false
34 description: Staging tenant URL (multi-env setups).
35 - name: BENCHLING_STAGING_API_KEY
36 required: false
37 description: Staging API key (multi-env setups).
38---
40# Benchling Integration

Benchling Integration

Raw lines 1 to 41
42## When to use
44Use this skill for Benchling registry entities, sequence imports, inventory, ELN entries,
45workflow tasks, apps, event-driven integrations, and warehouse analytics.
47**Reviewed 2026-09-30:** examples target the released **benchling-sdk 1.25.0** and its
48stable **v2** API models. The [current authentication guide](https://docs.benchling.com/docs/authentication)
49recommends V3 for new development, while the [V3 guide](https://docs.benchling.com/docs/v3-api-overview)
50still describes endpoint-specific early access. Confirm your tenant's V3 availability and
51stability before migrating; these v2 SDK examples must not be mechanically rewritten to V3.
53SDK imports, model serialization, and request construction were checked locally against
541.25.0. Tenant-dependent examples are **illustrative**: no authenticated requests,
55mutations, AWS deployment, or warehouse connection were run.

When to use

Use this skill for Benchling registry entities, sequence imports, inventory, ELN entries, workflow tasks, apps, event-driven integrations, and warehouse analytics.

Reviewed 2026-09-30: examples target the released benchling-sdk 1.25.0 and its stable v2 API models. The current authentication guide recommends V3 for new development, while the V3 guide still describes endpoint-specific early access. Confirm your tenant's V3 availability and stability before migrating; these v2 SDK examples must not be mechanically rewritten to V3.

SDK imports, model serialization, and request construction were checked locally against 1.25.0. Tenant-dependent examples are illustrative: no authenticated requests, mutations, AWS deployment, or warehouse connection were run.

Raw lines 42 to 56
57## Workflow
591. Identify the tenant, API version, identity, and permissions. Use OAuth app credentials
60 for background integrations; use delegated authorization when acting as an individual
61 user. See [authentication](references/authentication.md).
622. Read the relevant schema and resolve actual folder, registry, status, and dropdown IDs.
63 Preserve sequence alphabet/topology and sample units. A valid Python model does not
64 establish biological correctness or satisfaction of a tenant's required fields.
653. Read a small filtered page before writing. Use typed SDK methods and check their
66 actual parameter names; not all services share the same CRUD naming convention.
674. Construct and serialize a representative payload. For imports, retain external IDs
68 and returned Benchling IDs so a retry can reconcile a partial run without duplicates.
695. Perform the requested operation and read back the result. Check terminal async status;
70 completed polling can still mean `FAILED`.

Workflow

  1. Identify the tenant, API version, identity, and permissions. Use OAuth app credentials for background integrations; use delegated authorization when acting as an individual user. See authentication.
  2. Read the relevant schema and resolve actual folder, registry, status, and dropdown IDs. Preserve sequence alphabet/topology and sample units. A valid Python model does not establish biological correctness or satisfaction of a tenant's required fields.
  3. Read a small filtered page before writing. Use typed SDK methods and check their actual parameter names; not all services share the same CRUD naming convention.
  4. Construct and serialize a representative payload. For imports, retain external IDs and returned Benchling IDs so a retry can reconcile a partial run without duplicates.
  5. Perform the requested operation and read back the result. Check terminal async status; completed polling can still mean FAILED.
Raw lines 57 to 71
72## Setup and a read-only query
74```bash
75uv pip install "benchling-sdk==1.25.0"
76```
78```python
79import os
80from benchling_sdk.benchling import Benchling
81from benchling_sdk.auth.client_credentials_oauth2 import ClientCredentialsOAuth2
83tenant_url = os.environ["BENCHLING_TENANT_URL"].rstrip("/")
84benchling = Benchling(
85 url=tenant_url,
86 auth_method=ClientCredentialsOAuth2(
87 client_id=os.environ["BENCHLING_CLIENT_ID"],
88 client_secret=os.environ["BENCHLING_CLIENT_SECRET"],
89 token_url=f"{tenant_url}/oauth/token",
90 ),
92for page in benchling.dna_sequences.list(page_size=10, name_includes="plasmid"):
93 for sequence in page:
94 print(sequence.id, sequence.name)
95 break # deliberate first-page connectivity/permission check
96```
98A successful empty page is a valid connectivity result. It does not imply access to
99all projects. There is no documented v2 `users/me` route or SDK `users.get_me()`.

Setup and a read-only query

uv pip install "benchling-sdk==1.25.0"
import os
from benchling_sdk.benchling import Benchling
from benchling_sdk.auth.client_credentials_oauth2 import ClientCredentialsOAuth2

tenant_url = os.environ["BENCHLING_TENANT_URL"].rstrip("/")
benchling = Benchling(
    url=tenant_url,
    auth_method=ClientCredentialsOAuth2(
        client_id=os.environ["BENCHLING_CLIENT_ID"],
        client_secret=os.environ["BENCHLING_CLIENT_SECRET"],
        token_url=f"{tenant_url}/oauth/token",
    ),
)
for page in benchling.dna_sequences.list(page_size=10, name_includes="plasmid"):
    for sequence in page:
        print(sequence.id, sequence.name)
    break  # deliberate first-page connectivity/permission check

A successful empty page is a valid connectivity result. It does not imply access to all projects. There is no documented v2 users/me route or SDK users.get_me().

Raw lines 72 to 100
101## Important SDK conventions
103- Import `fields` from `benchling_sdk.helpers.serialization_helpers`. Its input is
104 `{"field_name": {"value": value}}`, including the inner `value` mapping.
105- Use `dna_sequence_id` for DNA updates and `workflow_task_id` for workflow updates.
106 Workflow task creation requires a `workflow_task_group_id`.
107- Entry methods are `create_entry`, `get_entry_by_id`, `list_entries`, and `update_entry`.
108- `list()` usually returns pages; iterate twice to reach the objects. `estimated_count`
109 is a property that can raise `NotImplementedError`, not a method or guaranteed count.
110- Moving a tube uses `ContainerUpdate(parent_storage_id=...)`. Material transfer is a
111 separate operation; it changes contents and quantities.
112- Register on creation with `registry_id` plus **either** `entity_registry_id` (a human
113 registry identifier) **or** `naming_strategy`. Do not confuse those with the registry's ID.

Important SDK conventions

  • Import fields from benchling_sdk.helpers.serialization_helpers. Its input is {"field_name": {"value": value}}, including the inner value mapping.
  • Use dna_sequence_id for DNA updates and workflow_task_id for workflow updates. Workflow task creation requires a workflow_task_group_id.
  • Entry methods are create_entry, get_entry_by_id, list_entries, and update_entry.
  • list() usually returns pages; iterate twice to reach the objects. estimated_count is a property that can raise NotImplementedError, not a method or guaranteed count.
  • Moving a tube uses ContainerUpdate(parent_storage_id=...). Material transfer is a separate operation; it changes contents and quantities.
  • Register on creation with registry_id plus either entity_registry_id (a human registry identifier) or naming_strategy. Do not confuse those with the registry's ID.
Raw lines 101 to 114
115## Common use cases

Common use cases

Raw lines 115 to 116
117### Import FASTA sequences
119Install Biopython separately (`uv pip install biopython`). This illustrative import
120creates unregistered linear DNA; choose topology and resolve collisions before running.
122```python
123from Bio import SeqIO
124from benchling_sdk.models import DnaSequenceCreate
126for record in SeqIO.parse("sequences.fasta", "fasta"):
127 payload = DnaSequenceCreate(
128 name=record.id,
129 bases=str(record.seq),
130 is_circular=False,
131 folder_id="lib_example",
132 )
133 created = benchling.dna_sequences.create(payload)
134 print(record.id, created.id) # persist this mapping for restart/reconciliation
135```

Import FASTA sequences

Install Biopython separately (uv pip install biopython). This illustrative import creates unregistered linear DNA; choose topology and resolve collisions before running.

from Bio import SeqIO
from benchling_sdk.models import DnaSequenceCreate

for record in SeqIO.parse("sequences.fasta", "fasta"):
    payload = DnaSequenceCreate(
        name=record.id,
        bases=str(record.seq),
        is_circular=False,
        folder_id="lib_example",
    )
    created = benchling.dna_sequences.create(payload)
    print(record.id, created.id)  # persist this mapping for restart/reconciliation
Raw lines 117 to 136
137### Audit inventory under a location
139```python
140for page in benchling.containers.list(ancestor_storage_id="box_example"):
141 for container in page:
142 print(container.id, container.name, container.barcode)
143```
145`ancestor_storage_id` includes descendants. For immediate children only, inspect the
146returned parent storage or use the documented storage-contents service.

Audit inventory under a location

for page in benchling.containers.list(ancestor_storage_id="box_example"):
    for container in page:
        print(container.id, container.name, container.barcode)

ancestor_storage_id includes descendants. For immediate children only, inspect the returned parent storage or use the documented storage-contents service.

Raw lines 137 to 147
148### Export sequences for one schema
150```python
151import csv
153with open("sequences.csv", "w", newline="", encoding="utf-8") as handle:
154 writer = csv.DictWriter(handle, fieldnames=["id", "name", "bases", "length"])
155 writer.writeheader()
156 for page in benchling.dna_sequences.list(schema_id="ts_example"):
157 for seq in page:
158 writer.writerow({
159 "id": seq.id, "name": seq.name,
160 "bases": seq.bases, "length": len(seq.bases),
161 })
162```

Export sequences for one schema

import csv

with open("sequences.csv", "w", newline="", encoding="utf-8") as handle:
    writer = csv.DictWriter(handle, fieldnames=["id", "name", "bases", "length"])
    writer.writeheader()
    for page in benchling.dna_sequences.list(schema_id="ts_example"):
        for seq in page:
            writer.writerow({
                "id": seq.id, "name": seq.name,
                "bases": seq.bases, "length": len(seq.bases),
            })
Raw lines 148 to 163
164## References
166- [Core capabilities](references/core_capabilities.md): scientific workflows and boundaries.
167- [SDK reference](references/sdk_reference.md): validated constructors, updates, inventory,
168 entries, workflow tasks, retries, and async handling.
169- [REST reference](references/api_endpoints.md): endpoint paths, payloads, filters,
170 response envelopes, pagination, and rate limits.
171- [Authentication](references/authentication.md): app credentials, personal keys,
172 delegated authorization, legacy OIDC, and HTTP clients.
173- [EventBridge](references/eventbridge.md): supported event types, payloads, setup,
174 and recovery; webhook differences.
175- [Official SDK 1.25.0](https://benchling.com/sdk-docs/1.25.0/index.html)
176- [Official REST reference](https://benchling.com/api/reference)

References

  • Core capabilities: scientific workflows and boundaries.
  • SDK reference: validated constructors, updates, inventory, entries, workflow tasks, retries, and async handling.
  • REST reference: endpoint paths, payloads, filters, response envelopes, pagination, and rate limits.
  • Authentication: app credentials, personal keys, delegated authorization, legacy OIDC, and HTTP clients.
  • EventBridge: supported event types, payloads, setup, and recovery; webhook differences.
  • Official SDK 1.25.0
  • Official REST reference
Raw lines 164 to 177
Boilerplate, lines 178 to 193. The same text appears in 125 other files here. Close
178## Citing Scientific Agent Skills
180This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a
181manuscript, report, presentation, or code release, add the paper to the references or
182software section and tell the user you did so:
184> Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent
185> Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065.
186> https://doi.org/10.48550/arXiv.2609.00065
188Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the
189latest arXiv version, so never append a version suffix such as `v1`. When network access is
190available, fetch https://arxiv.org/abs/2609.00065 (or
191http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take
192the author list, year, and version from that record. If the record lists a journal reference
193or publisher DOI, cite the published version instead.

From K-Dense-AI/scientific-agent-skills at 5f2bc03, 2026-10-26. Not read by a model yet. Summary and techniques by Claude Opus 5.5 on 2026-11-06.