Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/benchling-plates-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
title: Benchling AA Sequences Plates API
version: 2.0.0
description: 'AA Sequences are the working units of cells that make everything run (they help make structures, catalyze reactions and allow for signaling - a kind of internal cell communication). On Benchling, these are comprised of a string of amino acids and collections of other attributes, such as annotations.
'
servers:
- url: /api/v2
security:
- oAuth: []
- basicApiKeyAuth: []
tags:
- description: '
Plates are a structured inventory type, grids of wells that each function like containers. Plates come in two types: a traditional "fixed" type, where the wells cannot move, and a "matrix" type. A matrix plate has similar functionality to a box, where the containers inside can be moved around and removed altogether.
Plates are all associated with schemas, which define the type of the plate (e.g. "96 Well Plate") along with the fields that are tracked, the dimensions of the plate, and whether or not the plate is a matrix plate or a traditional well plate.
Like all inventory, every Plate has a barcode that is unique across the registry.
'
name: Plates
paths:
/plates:
get:
description: List plates
operationId: listPlates
parameters:
- description: 'Number of results to return. Defaults to 50, maximum of 100.
'
in: query
name: pageSize
schema:
default: 50
maximum: 100
minimum: 0
type: integer
- description: Token for pagination
in: query
name: nextToken
schema:
type: string
- description: 'Method by which to order search results. Valid sorts are barcode, name, modifiedAt, and createdAt. Optionally add :asc or :desc to specify ascending or descending order. Default is modifiedAt.
'
in: query
name: sort
schema:
default: modifiedAt:desc
enum:
- barcode
- barcode:asc
- barcode:desc
- modifiedAt
- modifiedAt:asc
- modifiedAt:desc
- name
- name:asc
- name:desc
- createdAt
- createdAt:asc
- createdAt:desc
type: string
- description: 'ID of a schema. Restricts results to those of the specified schema.
'
in: query
name: schemaId
schema:
type: string
- description: 'Filter based on schema field value (not display value). Restricts results to those with a field whose value matches the filter. For Integer, Float, and Date type fields, supports the >= and <= operators (but not < or >). If any schemaField filters are present, the schemaId param must also be present. Note that all operators must be separated from any values by a single space.
'
in: query
name: schemaFields
schema:
$ref: '#/components/schemas/SchemaFieldsQueryParam'
- description: 'Datetime, in RFC 3339 format. Supports the > and < operators. Time zone defaults to UTC. Restricts results to those created in the specified range. e.g. > 2017-04-30. Date ranges can be specified with the following nomenclature > YYYY-MM-DD AND <YYYY-MM-DD.
'
examples:
and-range:
summary: Filter for all models created within a certain range using the AND operator.
value: '> 2022-03-01 AND < 2022-04-01'
full-rfc-3339-format:
summary: Filter for created models using the full RFC 3339 format
value: '> 2020-12-31T21:07:14-05:00'
greater-than-example:
summary: Filter for all models created after a certain date
value: '> 2022-03-01'
in: query
name: createdAt
schema:
type: string
- description: 'Datetime, in RFC 3339 format. Supports the > and < operators. Time zone defaults to UTC. Restricts results to those modified in the specified range. e.g. > 2017-04-30. Date ranges can be specified with the following nomenclature > YYYY-MM-DD AND <YYYY-MM-DD.
'
examples:
and-range:
summary: Filter for all models modified within a certain range using the AND operator.
value: '> 2022-03-01 AND < 2022-04-01'
full-rfc-3339-format:
summary: Filter for modified models using the full RFC 3339 format
value: '> 2020-12-31T21:07:14-05:00'
greater-than-example:
summary: Filter for all models modified after a certain date
value: '> 2022-03-01'
in: query
name: modifiedAt
schema:
type: string
- description: Name of a plate. Restricts results to those with the specified name.
in: query
name: name
schema:
type: string
- description: 'Name substring of a plate. Restricts results to those with names that include the provided substring.
'
in: query
name: nameIncludes
schema:
type: string
- description: 'Only return plates that have the specified number of empty positions
'
in: query
name: emptyPositions
schema:
type: integer
- description: 'Only return plates that have greater-than or equal-to the specified number of empty positions.
'
in: query
name: emptyPositions.gte
schema:
type: integer
- description: 'Only return plates that have greater-than the specified number of empty positions.
'
in: query
name: emptyPositions.gt
schema:
type: integer
- description: 'Only return plates that have less-than or equal-to the specified number of empty positions.
'
in: query
name: emptyPositions.lte
schema:
type: integer
- description: 'Only return plates that have less-than the specified number of empty positions.
'
in: query
name: emptyPositions.lt
schema:
type: integer
- description: 'Only return plates that have the specified number of empty containers (containers without contents).
'
in: query
name: emptyContainers
schema:
type: integer
- description: 'Only return plates that have greater-than or equal-to the specified number of empty containers (containers without contents).
'
in: query
name: emptyContainers.gte
schema:
type: integer
- description: 'Only return plates that have greater-than the specified number of empty containers (containers without contents).
'
in: query
name: emptyContainers.gt
schema:
type: integer
- description: 'Only return plates that have less-than or equal-to the specified number of empty containers (containers without contents).
'
in: query
name: emptyContainers.lte
schema:
type: integer
- description: 'Only return plates that have less-than the specified number of empty containers (containers without contents).
'
in: query
name: emptyContainers.lt
schema:
type: integer
- description: 'ID of a location. Restricts results to those located in the specified inventory.
'
in: query
name: ancestorStorageId
schema:
type: string
- description: 'ID of a entity, or entity schema. Restricts results to those that hold containers with entities.
'
in: query
name: storageContentsId
schema:
type: string
- description: 'Comma-separated list of IDs of entities. Restricts results to those that hold containers with at least one of the specified entities.
'
in: query
name: storageContentsIds
schema:
type: string
- description: 'Archive reason. Restricts items to those with the specified archive reason. Use "NOT_ARCHIVED" to filter for unarchived plates. Use "ANY_ARCHIVED" to filter for archived plates regardless of reason. Use "ANY_ARCHIVED_OR_NOT_ARCHIVED" to return items for both archived and unarchived.
'
examples:
1_not_archived:
summary: Only include unarchived items (default).
value: NOT_ARCHIVED
2_archived_reason:
summary: Includes items archived for a specific reason.
value: Retired
3_any_archived:
summary: Includes items archived for any reason.
value: ANY_ARCHIVED
4_any_archived_or_not_archived:
summary: Includes both archived and unarchived items.
value: ANY_ARCHIVED_OR_NOT_ARCHIVED
in: query
name: archiveReason
schema:
type: string
- description: 'Comma-separated list of ids. Matches all of the provided IDs, or returns a 400 error that includes a list of which IDs are invalid.
'
in: query
name: ids
schema:
example: plt_xd4hj4eB,plt_xd4hj4C
type: string
- description: 'Comma-separated list of barcodes. Matches all of the provided barcodes, or returns a 400 error that includes a list of which barcodes are invalid.
'
in: query
name: barcodes
schema:
example: W102477,W102478
type: string
- description: 'Comma-separated list of names. Maximum of 100. Restricts results to those that match any of the specified names, case insensitive. Warning - this filter can be non-performant due to case insensitivity.
'
in: query
name: names.anyOf
schema:
example: MyName1,MyName2
type: string
- description: 'Comma-separated list of names. Maximum of 100. Restricts results to those that match any of the specified names, case sensitive.
'
in: query
name: names.anyOf.caseSensitive
schema:
example: MyName1,MyName2
type: string
- description: 'Comma-separated list of fields to return. Modifies the output shape. To return all keys at a given level, enumerate them or use the wildcard, ''*''. For more information, [click here](https://docs.benchling.com/docs/getting-started-1#returning-query-parameter).
'
in: query
name: returning
schema:
example: plates.id,plates.wells.*.webURL
type: string
- description: Comma separated list of users IDs
in: query
name: creatorIds
schema:
example: ent_a0SApq3z
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PlatesPaginatedList'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestError'
description: Bad Request
summary: List plates
tags:
- Plates
post:
description: Create a plate
operationId: createPlate
parameters:
- description: 'Comma-separated list of fields to return. Modifies the output shape. To return all keys at a given level, enumerate them or use the wildcard, ''*''. For more information, [click here](https://docs.benchling.com/docs/getting-started-1#returning-query-parameter).
'
in: query
name: returning
schema:
example: id,webURL
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PlateCreate'
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/Plate'
description: Created
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestError'
description: Bad Request
summary: Create a plate
tags:
- Plates
/plates/{plate_id}:
get:
description: Get a plate
operationId: getPlate
parameters:
- in: path
name: plate_id
required: true
schema:
type: string
- description: 'Comma-separated list of fields to return. Modifies the output shape. To return all keys at a given level, enumerate them or use the wildcard, ''*''. For more information, [click here](https://docs.benchling.com/docs/getting-started-1#returning-query-parameter).
'
in: query
name: returning
schema:
example: id,webURL
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Plate'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestError'
description: Bad Request
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundError'
description: Not Found
summary: Get a plate
tags:
- Plates
patch:
description: Update a plate
operationId: updatePlate
parameters:
- in: path
name: plate_id
required: true
schema:
type: string
- description: 'Comma-separated list of fields to return. Modifies the output shape. To return all keys at a given level, enumerate them or use the wildcard, ''*''. For more information, [click here](https://docs.benchling.com/docs/getting-started-1#returning-query-parameter).
'
in: query
name: returning
schema:
example: id,webURL
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PlateUpdate'
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Plate'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestError'
description: Bad Request
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenError'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundError'
description: Not Found
summary: Update a plate
tags:
- Plates
/plates:archive:
post:
description: Archive plates and any containers of the plates
operationId: archivePlates
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PlatesArchive'
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PlatesArchivalChange'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestError'
description: Bad Request
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenRestrictedSampleError'
description: Forbidden
summary: Archive plates
tags:
- Plates
/plates:bulk-get:
get:
description: BulkGet plates
operationId: bulkGetPlates
parameters:
- description: Comma-separated list of plate IDs.
in: query
name: plateIds
schema:
type: string
- description: Comma-separated list of plate barcodes.
explode: false
in: query
name: barcodes
schema:
type: string
- description: 'Comma-separated list of fields to return. Modifies the output shape. To return all keys at a given level, enumerate them or use the wildcard, ''*''. For more information, [click here](https://docs.benchling.com/docs/getting-started-1#returning-query-parameter).
'
in: query
name: returning
schema:
example: plates.id,plates.wells.*.webURL
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PlatesBulkGet'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestError'
description: Bad Request
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundError'
description: Not Found
summary: BulkGet plates
tags:
- Plates
/plates:unarchive:
post:
description: Unarchive plates and the containers that were archived along with them
operationId: unarchivePlates
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PlatesUnarchive'
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PlatesArchivalChange'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestError'
description: Bad Request
summary: Unarchive plates
tags:
- Plates
components:
schemas:
Molecule:
additionalProperties: false
properties:
aliases:
description: Array of aliases.
items:
type: string
type: array
apiURL:
description: The canonical url of the Molecule in the API.
format: uri
readOnly: true
type: string
archiveRecord:
allOf:
- $ref: '#/components/schemas/ArchiveRecord'
authors:
items:
$ref: '#/components/schemas/UserSummary'
type: array
canonicalizedSmiles:
description: The canonicalized chemical structure in SMILES format.
example: Nc1nc(=O)n([H])cc1C1CC1
type: string
createdAt:
description: DateTime the Molecule was created.
format: date-time
readOnly: true
type: string
creator:
$ref: '#/components/schemas/UserSummary'
customFields:
allOf:
- $ref: '#/components/schemas/CustomFields'
description: Custom fields set on the Molecule.
entityRegistryId:
description: Registry ID of the Molecule if registered.
type:
- string
- 'null'
fields:
$ref: '#/components/schemas/Fields'
folderId:
description: ID of the folder that contains the Molecule.
type:
- string
- 'null'
id:
description: ID of the Molecule.
example: mol_bhuDUw9D
type: string
modifiedAt:
description: DateTime the Molecule was last modified.
format: date-time
readOnly: true
type: string
name:
description: Name of the Molecule.
type: string
originalSmiles:
description: The original chemical structure supplied by the user in SMILES format. Null if the user did not originally supply SMILES.
example: Nc1nc(=O)n([H])cc1C1CC1
type:
- string
- 'null'
registrationOrigin:
allOf:
- $ref: '#/components/schemas/RegistrationOrigin'
readOnly: true
registryId:
description: Registry the Molecule is registered in.
type:
- string
- 'null'
schema:
allOf:
- $ref: '#/components/schemas/SchemaSummary'
webURL:
description: URL of the Molecule.
example: https://benchling.com/benchling/f/lib_R8KcsjhW-molecules/mol_xCUXNVyG-molecule1/edit
format: uri
readOnly: true
type: string
type: object
RnaSequenceWithEntityType:
allOf:
- $ref: '#/components/schemas/RnaSequence'
- properties:
entityType:
enum:
- rna_sequence
type: string
type: object
type: object
DeprecatedContainerVolumeForResponse:
allOf:
- $ref: '#/components/schemas/ContainerQuantity'
- description: 'The deprecated "volume" type key in API responses can also contain non-volume quantities for back-compatibility purposes. Use the "quantity" type key instead.
'
CheckoutRecord:
description: '
*assignee field* is set if status is "RESERVED" or "CHECKED_OUT", or null if status is "AVAILABLE".
*comment field* is set when container was last reserved, checked out, or checked into.
*modifiedAt field* is the date and time when container was last checked out, checked in, or reserved
'
properties:
assignee:
oneOf:
- $ref: '#/components/schemas/UserSummary'
- $ref: '#/components/schemas/TeamSummary'
comment:
type: string
modifiedAt:
format: date-time
type: string
status:
enum:
- AVAILABLE
- RESERVED
- CHECKED_OUT
type: string
type: object
SequenceFeatureBase:
properties:
color:
description: Hex color code used when displaying this feature in the UI.
example: '#F58A5E'
type: string
customFields:
items:
$ref: '#/components/schemas/SequenceFeatureCustomField'
maxItems: 100
type: array
name:
maxLength: 2048
type: string
notes:
example: Cong et al Science. 2013 Jan 3.
maxLength: 10000
type: string
type: object
AaAnnotation:
properties:
color:
type: string
end:
description: 0-based exclusive end index. The end of the AA sequence is always represented as 0.
type: integer
id:
example: prtnann_o7zMPG0P
type: string
name:
maxLength: 255
type: string
notes:
example: Cong et al Science. 2013 Jan 3.
maxLength: 10000
type: string
start:
description: 0-based inclusive start index.
type: integer
type:
example: Site
maxLength: 255
type: string
type: object
Entity:
discriminator:
mapping:
aa_sequence: '#/components/schemas/AaSequenceWithEntityType'
custom_entity: '#/components/schemas/CustomEntityWithEntityType'
dna_oligo: '#/components/schemas/DnaOligoWithEntityType'
dna_sequence: '#/components/schemas/DnaSequenceWithEntityType'
mixture: '#/components/schemas/MixtureWithEntityType'
molecule: '#/components/schemas/MoleculeWithEntityType'
rna_oligo: '#/components/schemas/RnaOligoWithEntityType'
rna_sequence: '#/components/schemas/RnaSequenceWithEntityType'
propertyName: entityType
oneOf:
- $ref: '#/components/schemas/DnaSequenceWithEntityType'
- $ref: '#/components/schemas/RnaSequenceWithEntityType'
- $ref: '#/components/schemas/AaSequenceWithEntityType'
- $ref: '#/components/schemas/MixtureWithEntityType'
- $ref: '#/components/schemas/DnaOligoWithEntityType'
- $ref: '#/components/schemas/RnaOligoWithEntityType'
- $ref: '#/components/schemas/MoleculeWithEntityType'
- $ref: '#/components/schemas/CustomEntityWithEntityType'
type: object
MoleculeWithEntityType:
allOf:
- $ref: '#/components/schemas/Molecule'
- properties:
entityType:
enum:
- molecule
type: string
type: object
type: object
FieldType:
enum:
- dna_sequence_link
- aa_sequence_link
- custom_entity_link
- entity_link
- mixture_link
- molecule_link
- dropdown
- part_link
- translation_link
- aa_part_link
- base_molecule_link
- blob_link
- text
- long_text
- batch_link
- storage_link
- entry_link
- assay_request_link
- assay_result_link
- assay_run_link
- boolean
- float
- integer
- datetime
- date
- json
type: string
Fields:
additionalProperties:
$ref: '#/components/schemas/Field'
type: object
BadRequestError:
properties:
error:
allOf:
- $ref: '#/components/schemas/BaseError'
- properties:
type:
enum:
- invalid_request_error
type: string
type: object
DnaSequencePart:
allOf:
- $ref: '#/components/schemas/NucleotideSequencePart'
- properties:
strand:
example: 1
maximum: 1
minimum: -1
type: integer
type: object
Oligo:
discriminator:
mapping:
DNA: DnaOligo
RNA: RnaOligo
propertyName: nucleotideType
properties:
aliases:
description: Array of aliases
items:
type: string
type: array
apiURL:
description: The canonical url of the Oligo in the API.
format: uri
readOnly: true
type: string
archiveRecord:
allOf:
- $ref: '#/components/schemas/ArchiveRecord'
authors:
items:
$ref: '#/components/schemas/UserSummary'
type: array
bases:
description: Base pairs of the Oligo.
example: ACTTTTT
type: string
createdAt:
description: DateTime the Oligo was created.
format: date-time
readOnly: true
type: string
creator:
$ref: '#/components/schemas/UserSummary'
customFields:
allOf:
- $ref: '#/components/schemas/CustomFields'
description: Custom fields set on the Oligo.
entityRegistryId:
description: Registry ID of the Oligo if registered.
type:
- string
- 'null'
fields:
$ref: '#/components/schemas/Fields'
folderId:
description: ID of the folder that contains the Oligo.
type:
- string
- 'null'
id:
description: ID of the Oligo.
example: seq_bhuDUw9D
type: string
length:
description: Number of bases in the Oligo.
type: integer
modifiedAt:
description: DateTime the Oligo was last modified.
format: date-time
readOnly: true
type: string
name:
description: Name of the Oligo.
type: string
nucleotideType:
description: Nucleotide type of the Oligo.
enum:
- DNA
- RNA
type: string
registrationOrigin:
allOf:
- $ref: '#/components/schemas/RegistrationOrigin'
readOnly: true
registryId:
description: Registry the Oligo is registered in.
type:
- string
- 'null'
schema:
allOf:
- $ref: '#/components/schemas/SchemaSummary'
webURL:
description: URL of the Oligo.
example: https://benchling.com/benchling/f/lib_hBHqKbzE-oligos/seq_bhuDUw9D-test-oligo-abc/edit
format: uri
readOnly: true
type: string
type: object
AaSequence:
properties:
aliases:
description: Array of aliases
items:
type: string
type: array
aminoAcids:
description: Amino acids of the AA sequence.
example: IKTATARRELAETSWTGDRLWGFSDNWAPALRRPSPSALGK
type: string
annotations:
description: Array of annotation objects on the AA sequence.
items:
$ref: '#/components/schemas/AaAnnotation'
type: array
apiURL:
description: The canonical url of the AA Sequence in the API.
example: https://benchling.com/api/v2/aa-sequences/prtn_7nMBOMm0
format: uri
readOnly: true
type: string
archiveRecord:
allOf:
- $ref: '#/components/schemas/ArchiveRecord'
authors:
items:
$ref: '#/components/schemas/UserSummary'
type: array
createdAt:
description: DateTime the AA sequence was created.
format: date-time
readOnly: true
type: string
creator:
$ref: '#/components/schemas/UserSummary'
customFields:
allOf:
- $ref: '#/components/schemas/CustomFields'
description: Custom fields set on the AA sequence.
entityRegistryId:
description: Registry ID of the AA sequence if registered.
type:
- string
- 'null'
fields:
$ref: '#/components/schemas/Fields'
folderId:
description: ID of the folder that contains the AA sequence.
type:
- string
- 'null'
id:
description: ID of the AA sequence.
example: prtn_ObbdtGhC
type: string
length:
description: Number of amino acids in the AA sequence.
type: integer
modifiedAt:
description: DateTime the AA sequence was last modified.
format: date-time
readOnly: true
type: string
name:
description: Name of the AA sequence.
type: string
registrationOrigin:
allOf:
- $ref: '#/components/schemas/RegistrationOrigin'
readOnly: true
registryId:
description: Registry the AA sequence is registered in.
type:
- string
- 'null'
schema:
allOf:
- $ref: '#/components/schemas/SchemaSummary'
url:
description: The path of the web URL, omitting the tenant domain
type: string
webURL:
description: URL of the AA sequence.
example: https://benchling.com/benchling/f/lib_55UxcIps-registry/prtn_7nMBOMm0-kedchain11/edit"
format: uri
readOnly: true
type: string
type: object
RnaOligo:
allOf:
- $ref: '#/components/schemas/Oligo'
- properties:
annotations:
description: Annotations on the Oligo.
items:
$ref: '#/components/schemas/RnaAnnotation'
type: array
apiURL:
example: https://benchling.com/api/v2/rna-oligos/seq_bhuDUw9D
type: string
bases:
example: ACUUUUU
type: string
customNotation:
description: Representation of the oligo in the custom notation specified in the request. Null if no notation was specified.
type:
- string
- 'null'
customNotationName:
description: Name of the custom notation specified in the request. Null if no notation was specified.
type:
- string
- 'null'
helm:
description: Representation of the oligo in HELM syntax, including any chemical modifications
example: RNA1{r(A)p.r(C)[Ssp].r(U)p.r(U)p.r(U)p.r(U)p.r(U)p}$$$$V2.0
type: string
nucleotideType:
example: RNA
type: string
Well:
additionalProperties: false
# --- truncated at 32 KB (71 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/benchling/refs/heads/main/openapi/benchling-plates-api-openapi.yml