Element Biosciences Run Service API

RunService provides access to instrument runs, both sequencing and multiomics. Listing and reading run metadata requires the "runs:read" scope; listing run files and obtaining download credentials requires the "runs:download" scope.

OpenAPI Specification

element-biosciences-runservice-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Element Biosciences Cloud Run Service API
  description: 'The Element Biosciences Cloud API provides programmatic access to data in

    the Element Biosciences Cloud platform: instrument runs (sequencing and

    multiomics), workflow executions, registered instruments, storage

    connections, and the files those resources produce.


    All paths are versioned under `/v1`.


    ## Authentication

    Every request must include an API key in the `x-api-key` header. Create and

    manage keys in the Element Biosciences Cloud console. Call `GET /v1/auth` to

    confirm which tenant a key belongs to.


    ## Scopes

    Each API key carries one or more scopes of the form

    `resource:action[:resource_id]`, for example `runs:read`,

    `executions:download`, or `storage:download:{connection_id}`. A request that

    is authenticated but lacks the required scope fails with HTTP 403 and the

    `INSUFFICIENT_SCOPE` reason. List endpoints transparently restrict results

    to the resources a key is scoped to.


    ## Pagination

    List endpoints are cursor-paginated. Set `page_size` to control the page

    length and pass the `next_page_token` from one response as the `page_token`

    of the next; an empty `next_page_token` indicates the last page.


    ## Errors

    Errors return a JSON body with an integer `code`, a human-readable

    `message`, and a `details` array. Each detail carries a machine-readable

    `reason` (for example `RUN_NOT_FOUND` or `INVALID_API_KEY`) and the

    `domain` `cloud-api.elembio.io`. The `request_id` in the detail metadata

    matches the `X-Request-ID` response header; include it when reporting

    problems.

    '
  version: 1.0.0
  contact:
    name: Element Biosciences
    url: https://www.elembio.io
servers:
- url: https://cloud-api.usw2.elembio.io
security:
- apiKey: []
tags:
- name: RunService
  description: "RunService provides access to instrument runs, both sequencing and\n multiomics. Listing and reading run metadata requires the \"runs:read\"\n scope; listing run files and obtaining download credentials requires the\n \"runs:download\" scope."
paths:
  /v1/runs:
    get:
      tags:
      - RunService
      summary: ListRuns
      description: List runs accessible to the authenticated tenant, optionally filtered.
      operationId: RunService_ListRuns
      parameters:
      - name: filter
        in: query
        description: "Search and filter expression. Space-separated `keyword:value` terms are\n ANDed together; bare text with no keyword searches all string fields. For\n numeric and date fields, replace the colon with a comparison operator\n (`>=`, `<=`, `>`, `<`, `!=`). List alternatives for one keyword with\n commas, e.g. `status:completed,failed`. Dates accept ISO-8601 or relative\n offsets such as `7d` or `1mo`.\n\n Filterable keywords:\n\n - **String:** `name`, `id`, `description`, `tags`, `instrument.name`, `instrument.serial_number`, `instrument.model`, `storage.connection_id`, `setup.sequencing.kit_name`, `setup.sequencing.library_structure`, `setup.sequencing.prep_type`, `setup.sequencing.polony_density`, `setup.sequencing.filter_mask`, `setup.sequencing.panel.name`, `setup.multiomics.panel.name`, `setup.multiomics.cartridge.name`\n - **Enum:** `type` (`sequencing`, `multiomics`), `status`, `output.kind` (`sequencing_run`, `multiomics_run`; an alias for `type`), `setup.multiomics.kit_type` (`cytoprofiling`, `direct_in_sample_sequencing`, `antibody_screening`, `tissue`, `protein_screening`), `setup.multiomics.well_layout` (`twelve_well_circle`, `twelve_well_square`, `two_well`, `one_well`, `twelve_well_standard`, `forty_eight_well`)\n - **Date:** `time_created`, `time_started`, `time_completed`, `time_updated`\n - **Numeric:** `metrics.sequencing.total_reads`, `metrics.sequencing.total_yield`, `metrics.sequencing.estimated_reads`, `metrics.sequencing.q30`, `metrics.sequencing.q40`, `metrics.sequencing.q50`, `metrics.sequencing.avg_q`, `metrics.sequencing.error_rate`, `metrics.sequencing.phix_alignment_rate`, `metrics.multiomics.total_cell_count`, `metrics.multiomics.total_cell_confluency`, `metrics.multiomics.total_percent_assigned`, `setup.sequencing.pmg_shift`\n - **Boolean:** `setup.sequencing.low_diversity`\n\n Examples:\n\n - `type:sequencing status:completed time_completed>=7d`\n - `instrument.serial_number:AV223501 metrics.sequencing.q30>=90`"
        schema:
          type: string
          title: filter
          description: "Search and filter expression. Space-separated `keyword:value` terms are\n ANDed together; bare text with no keyword searches all string fields. For\n numeric and date fields, replace the colon with a comparison operator\n (`>=`, `<=`, `>`, `<`, `!=`). List alternatives for one keyword with\n commas, e.g. `status:completed,failed`. Dates accept ISO-8601 or relative\n offsets such as `7d` or `1mo`.\n\n Filterable keywords:\n\n - **String:** `name`, `id`, `description`, `tags`, `instrument.name`, `instrument.serial_number`, `instrument.model`, `storage.connection_id`, `setup.sequencing.kit_name`, `setup.sequencing.library_structure`, `setup.sequencing.prep_type`, `setup.sequencing.polony_density`, `setup.sequencing.filter_mask`, `setup.sequencing.panel.name`, `setup.multiomics.panel.name`, `setup.multiomics.cartridge.name`\n - **Enum:** `type` (`sequencing`, `multiomics`), `status`, `output.kind` (`sequencing_run`, `multiomics_run`; an alias for `type`), `setup.multiomics.kit_type` (`cytoprofiling`, `direct_in_sample_sequencing`, `antibody_screening`, `tissue`, `protein_screening`), `setup.multiomics.well_layout` (`twelve_well_circle`, `twelve_well_square`, `two_well`, `one_well`, `twelve_well_standard`, `forty_eight_well`)\n - **Date:** `time_created`, `time_started`, `time_completed`, `time_updated`\n - **Numeric:** `metrics.sequencing.total_reads`, `metrics.sequencing.total_yield`, `metrics.sequencing.estimated_reads`, `metrics.sequencing.q30`, `metrics.sequencing.q40`, `metrics.sequencing.q50`, `metrics.sequencing.avg_q`, `metrics.sequencing.error_rate`, `metrics.sequencing.phix_alignment_rate`, `metrics.multiomics.total_cell_count`, `metrics.multiomics.total_cell_confluency`, `metrics.multiomics.total_percent_assigned`, `setup.sequencing.pmg_shift`\n - **Boolean:** `setup.sequencing.low_diversity`\n\n Examples:\n\n - `type:sequencing status:completed time_completed>=7d`\n - `instrument.serial_number:AV223501 metrics.sequencing.q30>=90`"
      - name: pageSize
        in: query
        description: 'Maximum number of runs to return (default: 100, max: 1000)'
        schema:
          type: integer
          title: page_size
          format: int32
          description: 'Maximum number of runs to return (default: 100, max: 1000)'
      - name: pageToken
        in: query
        description: Token for pagination
        schema:
          type: string
          title: page_token
          description: Token for pagination
      - name: includeTotalCount
        in: query
        description: If true, include total_count in the response (adds a count query)
        schema:
          type: boolean
          title: include_total_count
          description: If true, include total_count in the response (adds a count query)
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/elembio.cloud.v1.ListRunsResponse'
        '400':
          description: Bad request — the request was malformed or a parameter was invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized — the API key is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden — the API key lacks the required scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not found — the requested resource does not exist or is not accessible.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /v1/runs/{id}:
    get:
      tags:
      - RunService
      summary: GetRun
      description: Get a single run by its ID.
      operationId: RunService_GetRun
      parameters:
      - name: id
        in: path
        description: The unique identifier of the run
        required: true
        schema:
          type: string
          title: id
          description: The unique identifier of the run
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/elembio.cloud.v1.GetRunResponse'
        '400':
          description: Bad request — the request was malformed or a parameter was invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized — the API key is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden — the API key lacks the required scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not found — the requested resource does not exist or is not accessible.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /v1/runs/{run_id}/credentials:
    get:
      tags:
      - RunService
      summary: GetRunDownloadCredentials
      description: "Get temporary, read-only S3 credentials scoped to a run's storage\n location. Use these for bulk or repeated downloads via the AWS CLI or\n SDK instead of per-object presigned URLs."
      operationId: RunService_GetRunDownloadCredentials
      parameters:
      - name: run_id
        in: path
        description: The run ID
        required: true
        schema:
          type: string
          title: run_id
          description: The run ID
      - name: prefix
        in: query
        description: "Optional path prefix within the run to scope credentials to.\n Run-relative, identical semantics to ListRunFilesRequest.prefix.\n \"..\" segments are rejected. When omitted, credentials are scoped to\n the whole run (the run root)."
        schema:
          type: string
          title: prefix
          description: "Optional path prefix within the run to scope credentials to.\n Run-relative, identical semantics to ListRunFilesRequest.prefix.\n \"..\" segments are rejected. When omitted, credentials are scoped to\n the whole run (the run root)."
      - name: expirationSeconds
        in: query
        description: "Lifetime of the returned credentials, in seconds. Optional; defaults to\n 1 hour (when 0 or unset). Minimum 900s. Capped by AWS: up to 36h (129600s)\n for federation-token connections, or the role's MaxSessionDuration (12h\n typical) for role-backed connections. Values below the minimum or above the\n cap are rejected."
        schema:
          type: integer
          title: expiration_seconds
          format: int32
          description: "Lifetime of the returned credentials, in seconds. Optional; defaults to\n 1 hour (when 0 or unset). Minimum 900s. Capped by AWS: up to 36h (129600s)\n for federation-token connections, or the role's MaxSessionDuration (12h\n typical) for role-backed connections. Values below the minimum or above the\n cap are rejected."
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/elembio.cloud.v1.GetRunDownloadCredentialsResponse'
        '400':
          description: Bad request — the request was malformed or a parameter was invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized — the API key is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden — the API key lacks the required scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not found — the requested resource does not exist or is not accessible.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /v1/runs/{run_id}/files:
    get:
      tags:
      - RunService
      summary: ListRunFiles
      description: List the files produced by a run, drawn from the run's storage location.
      operationId: RunService_ListRunFiles
      parameters:
      - name: run_id
        in: path
        description: The run ID
        required: true
        schema:
          type: string
          title: run_id
          description: The run ID
      - name: prefix
        in: query
        description: "Path prefix within the run, e.g. \"visualization/\" or \"Stats/foo\".\n The run is a self-contained namespace: paths do not include any\n bucket-level or workflow-level layout. Round-trips with File.path\n returned by this RPC. \"..\" segments are rejected.\n Optional: when omitted, lists the whole run (the run root)."
        schema:
          type: string
          title: prefix
          description: "Path prefix within the run, e.g. \"visualization/\" or \"Stats/foo\".\n The run is a self-contained namespace: paths do not include any\n bucket-level or workflow-level layout. Round-trips with File.path\n returned by this RPC. \"..\" segments are rejected.\n Optional: when omitted, lists the whole run (the run root)."
      - name: recursive
        in: query
        description: "If true, list all files recursively under the prefix (default: true)\n If false, list only files and subdirectories at the current level"
        schema:
          type: boolean
          title: recursive
          description: "If true, list all files recursively under the prefix (default: true)\n If false, list only files and subdirectories at the current level"
      - name: pageSize
        in: query
        description: 'Maximum number of files to return per page (default: 1000, max: 1000)'
        schema:
          type: integer
          title: page_size
          format: int32
          description: 'Maximum number of files to return per page (default: 1000, max: 1000)'
      - name: pageToken
        in: query
        description: Continuation token from previous response (passthrough from storage)
        schema:
          type: string
          title: page_token
          description: Continuation token from previous response (passthrough from storage)
      - name: includeDownloadUrl
        in: query
        description: "If true, populate File.download_url (a presigned URL) on each returned\n file. Defaults to false. Set to true only when the caller intends to\n fetch file content from the response: generating presigned URLs has a\n per-object cost and the URLs themselves are credentials with a\n multi-hour lifetime. Use GetRunDownloadCredentials when long-lived\n bulk access is required."
        schema:
          type: boolean
          title: include_download_url
          description: "If true, populate File.download_url (a presigned URL) on each returned\n file. Defaults to false. Set to true only when the caller intends to\n fetch file content from the response: generating presigned URLs has a\n per-object cost and the URLs themselves are credentials with a\n multi-hour lifetime. Use GetRunDownloadCredentials when long-lived\n bulk access is required."
      - name: downloadUrlExpirationSeconds
        in: query
        description: "Lifetime of the presigned download_url, in seconds. Optional; defaults to\n 1 hour. Only applies when include_download_url = true. Max 7 days."
        schema:
          type: integer
          title: download_url_expiration_seconds
          format: int32
          description: "Lifetime of the presigned download_url, in seconds. Optional; defaults to\n 1 hour. Only applies when include_download_url = true. Max 7 days."
      - name: includeDownloadChecksum
        in: query
        description: "If true, presign each download_url with S3 ChecksumMode=ENABLED so the\n object's stored checksum is returned on the GET (in the\n x-amz-checksum-<algo> response header) and a client can verify download\n integrity in a single streaming pass. Defaults false; has no effect unless\n include_download_url = true. When enabled the presigned URL signs the\n x-amz-checksum-mode request header, so the fetch MUST send\n x-amz-checksum-mode:ENABLED — a plain GET that omits it fails with HTTP\n 403. Best-effort: objects stored without a checksum return none.\n\n Applies only to AWS S3-backed storage connections; other storage backends\n do not presign S3 GETs and silently ignore this field."
        schema:
          type: boolean
          title: include_download_checksum
          description: "If true, presign each download_url with S3 ChecksumMode=ENABLED so the\n object's stored checksum is returned on the GET (in the\n x-amz-checksum-<algo> response header) and a client can verify download\n integrity in a single streaming pass. Defaults false; has no effect unless\n include_download_url = true. When enabled the presigned URL signs the\n x-amz-checksum-mode request header, so the fetch MUST send\n x-amz-checksum-mode:ENABLED — a plain GET that omits it fails with HTTP\n 403. Best-effort: objects stored without a checksum return none.\n\n Applies only to AWS S3-backed storage connections; other storage backends\n do not presign S3 GETs and silently ignore this field."
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/elembio.cloud.v1.ListRunFilesResponse'
        '400':
          description: Bad request — the request was malformed or a parameter was invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized — the API key is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden — the API key lacks the required scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not found — the requested resource does not exist or is not accessible.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    google.protobuf.Timestamp:
      type: string
      examples:
      - '2023-01-15T01:30:15.01Z'
      - '2024-12-25T12:00:00Z'
      format: date-time
      description: "A Timestamp represents a point in time independent of any time zone or local\n calendar, encoded as a count of seconds and fractions of seconds at\n nanosecond resolution. The count is relative to an epoch at UTC midnight on\n January 1, 1970, in the proleptic Gregorian calendar which extends the\n Gregorian calendar backwards to year one.\n\n All minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\n second table is needed for interpretation, using a [24-hour linear\n smear](https://developers.google.com/time/smear).\n\n The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\n restricting to that range, we ensure that we can convert to and from [RFC\n 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n\n # Examples\n\n Example 1: Compute Timestamp from POSIX `time()`.\n\n     Timestamp timestamp;\n     timestamp.set_seconds(time(NULL));\n     timestamp.set_nanos(0);\n\n Example 2: Compute Timestamp from POSIX `gettimeofday()`.\n\n     struct timeval tv;\n     gettimeofday(&tv, NULL);\n\n     Timestamp timestamp;\n     timestamp.set_seconds(tv.tv_sec);\n     timestamp.set_nanos(tv.tv_usec * 1000);\n\n Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.\n\n     FILETIME ft;\n     GetSystemTimeAsFileTime(&ft);\n     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;\n\n     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n     Timestamp timestamp;\n     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n\n Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.\n\n     long millis = System.currentTimeMillis();\n\n     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)\n         .setNanos((int) ((millis % 1000) * 1000000)).build();\n\n Example 5: Compute Timestamp from Java `Instant.now()`.\n\n     Instant now = Instant.now();\n\n     Timestamp timestamp =\n         Timestamp.newBuilder().setSeconds(now.getEpochSecond())\n             .setNanos(now.getNano()).build();\n\n Example 6: Compute Timestamp from current time in Python.\n\n     timestamp = Timestamp()\n     timestamp.GetCurrentTime()\n\n # JSON Mapping\n\n In JSON format, the Timestamp type is encoded as a string in the\n [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\n format is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\n where {year} is always expressed using four digits while {month}, {day},\n {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\n seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\n are optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\n is required. A ProtoJSON serializer should always use UTC (as indicated by\n \"Z\") when printing the Timestamp type and a ProtoJSON parser should be\n able to accept both UTC and other timezones (as indicated by an offset).\n\n For example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n 01:30 UTC on January 15, 2017.\n\n In JavaScript, one can convert a Date object to this format using the\n standard\n [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\n method. In Python, a standard `datetime.datetime` object can be converted\n to this format using\n [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\n the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\n the Joda Time's [`ISODateTimeFormat.dateTime()`](\n http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()\n ) to obtain a formatter capable of generating timestamps in this format."
    elembio.cloud.v1.RunInstrument:
      type: object
      properties:
        id:
          type: string
          title: id
          description: Instrument identifier.
        name:
          type: string
          title: name
          description: 'Human-readable instrument name. Example: "AV223501".'
        serialNumber:
          type: string
          title: serial_number
          description: 'Instrument serial number. Example: "AV223501".'
        model:
          type: string
          title: model
          description: "Instrument model as recorded for the run. Free-form text passed through\n from the run record; example: \"AVITI\"."
        softwareVersion:
          type: string
          title: software_version
          description: "AOS (instrument operating system) software version at run time.\n Example: \"2.6.1\"."
      title: RunInstrument
      additionalProperties: false
      description: "Instrument that performed a run. These fields are a snapshot captured at\n run time and may differ from the instrument's current state as returned by\n InstrumentService."
    elembio.cloud.v1.ListRunsResponse:
      type: object
      properties:
        runs:
          type: array
          items:
            $ref: '#/components/schemas/elembio.cloud.v1.Run'
          title: runs
          description: List of runs
        nextPageToken:
          type: string
          title: next_page_token
          description: Token for the next page (empty if no more results)
        previousPageToken:
          type: string
          title: previous_page_token
          description: Token for the previous page (empty if on first page)
        totalCount:
          type:
          - integer
          - 'null'
          title: total_count
          format: int32
          description: Total number of runs matching the filter (only if include_total_count was true)
      title: ListRunsResponse
      additionalProperties: false
      description: Response containing a list of runs
    elembio.cloud.v1.RunDesign:
      type: object
      properties:
        id:
          type: string
          title: id
        name:
          type: string
          title: name
        kind:
          type: string
          title: kind
          description: e.g., "spike_in_panel", "diss_panel", "focus_spike_in_panel"
      title: RunDesign
      additionalProperties: false
      description: Design associated with a run
    elembio.cloud.v1.RunMetrics:
      type: object
      properties:
        sequencing:
          oneOf:
          - $ref: '#/components/schemas/elembio.cloud.v1.SequencingMetrics'
          - type: 'null'
          title: sequencing
        multiomics:
          oneOf:
          - $ref: '#/components/schemas/elembio.cloud.v1.MultiomicsMetrics'
          - type: 'null'
          title: multiomics
      title: RunMetrics
      additionalProperties: false
      description: "Run metrics/results, grouped by run type.\n Only one of the type-specific sub-messages will be populated per run."
    elembio.cloud.v1.RunRecipe:
      type: object
      properties:
        id:
          type: string
          title: id
          description: Recipe identifier.
        name:
          type: string
          title: name
          description: Recipe name.
      title: RunRecipe
      additionalProperties: false
      description: Element recipe selected for a run.
    ErrorDetail:
      type: object
      description: Structured error detail with a machine-readable reason code.
      properties:
        '@type':
          type: string
          description: Type identifier for this error detail
        reason:
          type: string
          description: 'Machine-readable error code identifying the specific failure

            (e.g. RUN_NOT_FOUND, INVALID_API_KEY, INSUFFICIENT_SCOPE).

            '
          examples:
          - RUN_NOT_FOUND
          - INVALID_API_KEY
          - MISSING_API_KEY
          - INSUFFICIENT_SCOPE
          - INTERNAL_ERROR
        domain:
          type: string
          description: Identifies the system that generated the error
          const: cloud-api.elembio.io
        metadata:
          type: object
          description: Additional context for the error
          properties:
            request_id:
              type: string
              description: Request ID matching the X-Request-ID response header
      required:
      - reason
      - domain
    elembio.cloud.v1.Panel:
      type: object
      properties:
        id:
          type: string
          title: id
        name:
          type: string
          title: name
        version:
          type: string
          title: version
      title: Panel
      additionalProperties: false
      description: Panel information for multiomics runs
    elembio.cloud.v1.SequencingSetup:
      type: object
      properties:
        kitName:
          type: string
          title: kit_name
        kitPartNumber:
          type: string
          title: kit_part_number
        libraryStructure:
          type: string
          title: library_structure
          description: '"circular" or "linear"'
        prepType:
          type: string
          title: prep_type
          description: e.g., "adept", "elevate"
        dualLibrary:
          type: boolean
          title: dual_library
        reads:
          type: array
          items:
            $ref: '#/components/schemas/elembio.cloud.v1.ReadConfig'
          title: reads
        chemistryVersion:
          type: string
          title: chemistry_version
        pmgShift:
          type:
          - integer
          - 'null'
          title: pmg_shift
          format: int32
          description: Advanced settings (AOS 2.6.0+)
        filterMask:
          type:
          - string
          - 'null'
          title: filter_mask
        polonyDensity:
          type:
          - string
          - 'null'
          title: polony_density
          description: '"standard" or "high"'
        lowDiversity:
          type: boolean
          title: low_diversity
          description: Low Diversity High Multiplex
        panel:
          oneOf:
          - $ref: '#/components/schemas/elembio.cloud.v1.Panel'
          - type: 'null'
          title: panel
          description: Panel information (AOS 2.7.0+; run-level pre-3.5, per-lane 3.5+)
        flowcell:
          oneOf:
          - $ref: '#/components/schemas/elembio.cloud.v1.Consumable'
          - type: 'null'
          title: flowcell
          description: Sequencing consumable details from run setup
        buffer:
          oneOf:
          - $ref: '#/components/schemas/elembio.cloud.v1.Consumable'
          - type: 'null'
          title: buffer
        sequencingCartridge:
          oneOf:
          - $ref: '#/components/schemas/elembio.cloud.v1.Consumable'
          - type: 'null'
          title: sequencing_cartridge
      title: SequencingSetup
      additionalProperties: false
      description: Sequencing run setup/configuration fields
    elembio.cloud.v1.Run:
      type: object
      properties:
        id:
          type: string
          title: id
          description: Unique identifier for the run
        name:
          type: string
          title: name
          description: Human-readable name of the run
        description:
          type: string
          title: description
          description: Optional description
        type:
          type: string
          title: type
          description: 'Type of run. Possible values: "sequencing", "multiomics".'
        status:
          title: status
          description: Current status of the run
          $ref: '#/components/schemas/elembio.cloud.v1.RunStatus'
        instrument:
          title: instrument
          description: Instrument that performed the run
          $ref: '#/components/schemas/elembio.cloud.v1.RunInstrument'
        output:
          title: output
          description: Output location and content kinds for run data
          $ref: '#/components/schemas/elembio.cloud.v1.Output'
        timeCreated:
          title: time_created
          description: Timestamps
          $ref: '#/components/schemas/google.protobuf.Timestamp'
        timeStarted:
          oneOf:
          - $ref: '#/components/schemas/google.protobuf.Timestamp'
          - type: 'null'
          title: time_started
        timeCompleted:
          oneOf:
          - $ref: '#/components/schemas/google.protobuf.Timesta

# --- truncated at 32 KB (48 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/element-biosciences/refs/heads/main/openapi/element-biosciences-runservice-api-openapi.yml