Bem

Bem Workflows API

Workflows orchestrate one or more functions into a directed acyclic graph (DAG) for document processing. Use these endpoints to create, update, list, and manage workflows, and to invoke them with file input via `POST /v3/workflows/{workflowName}/call`. The call endpoint accepts files as either multipart form data or JSON with base64-encoded content. In the Bem CLI, use `@path/to/file` inside JSON values to automatically read and encode files: ``` bem workflows call --workflow-name my-workflow \ --input.single-file '{"inputContent": "@file.pdf", "inputType": "pdf"}' \ --wait ```

Operations 9

GET /v3/workflows List Workflows #
POST /v3/workflows Create a Workflow #
POST /v3/workflows/copy Copy a Workflow #
DELETE /v3/workflows/{workflowName} Delete a Workflow #
GET /v3/workflows/{workflowName} Get a Workflow #
PATCH /v3/workflows/{workflowName} Update a Workflow #
POST /v3/workflows/{workflowName}/call Call a Workflow Call a Workflow #
GET /v3/workflows/{workflowName}/versions List Workflow Versions #
GET /v3/workflows/{workflowName}/versions/{versionNum} Get a Workflow Version #

Work with this as data

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/bem-workflows-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 email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

bem-workflows-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Bem Workflows API
  version: 1.0.0
  description: "Workflows orchestrate one or more functions into a directed acyclic graph (DAG) for document processing.\n\nUse these endpoints to create, update, list, and manage workflows, and to invoke them\nwith file input via `POST /v3/workflows/{workflowName}/call`.\n\nThe call endpoint accepts files as either multipart form data or JSON with base64-encoded\ncontent. In the Bem CLI, use `@path/to/file` inside JSON values to automatically read and\nencode files:\n\n```\nbem workflows call --workflow-name my-workflow \\\n  --input.single-file '{\"inputContent\": \"@file.pdf\", \"inputType\": \"pdf\"}' \\\n  --wait\n```"
servers:
- url: https://api.bem.ai
  description: US Region API
  variables: {}
- url: https://api.eu1.bem.ai
  description: EU Region API
  variables: {}
security:
- API Key: []
tags:
- name: Workflows
  description: "Workflows orchestrate one or more functions into a directed acyclic graph (DAG) for document processing.\n\nUse these endpoints to create, update, list, and manage workflows, and to invoke them\nwith file input via `POST /v3/workflows/{workflowName}/call`.\n\nThe call endpoint accepts files as either multipart form data or JSON with base64-encoded\ncontent. In the Bem CLI, use `@path/to/file` inside JSON values to automatically read and\nencode files:\n\n```\nbem workflows call --workflow-name my-workflow \\\n  --input.single-file '{\"inputContent\": \"@file.pdf\", \"inputType\": \"pdf\"}' \\\n  --wait\n```"
paths:
  /v3/workflows:
    get:
      operationId: v3-list-workflows
      summary: List Workflows
      description: '**List workflows in the current environment.**


        Returns each workflow''s current version, including its node graph

        and main node. Combine filters freely — they AND together.


        ## Filtering


        - `workflowIDs` / `workflowNames`: exact-match identity filters.

        - `displayName`: case-insensitive substring match.

        - `tags`: returns workflows tagged with any of the supplied tags.

        - `functionIDs` / `functionNames`: returns only workflows that

        reference the named functions in any node. Useful for "which

        workflows depend on this function?" lookups before changing or

        deleting a function.


        ## Pagination


        Cursor-based with `startingAfter` and `endingBefore` (workflowIDs).

        Default limit 50, maximum 100.'
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 50
      - name: workflowIDs
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
          minItems: 1
        explode: false
      - name: workflowNames
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
          minItems: 1
        explode: false
      - name: displayName
        in: query
        required: false
        schema:
          type: string
        explode: false
      - name: sortOrder
        in: query
        required: false
        schema:
          type: string
          enum:
          - asc
          - desc
          default: asc
      - name: startingAfter
        in: query
        required: false
        schema:
          type: string
      - name: endingBefore
        in: query
        required: false
        schema:
          type: string
      - name: tags
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
          minItems: 1
        explode: false
      - name: functionIDs
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
          minItems: 1
        explode: false
      - name: functionNames
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
          minItems: 1
        explode: false
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowsListResponseV3'
      tags:
      - Workflows
    post:
      operationId: v3-create-workflow
      summary: Create a Workflow
      description: '**Create a workflow.**


        A workflow is a directed acyclic graph of nodes (each pointing at a

        function) with one entry point (`mainNodeName`). The graph runs

        end-to-end on every call.


        ## Required structure


        - `name`: unique within the environment, alphanumeric plus hyphens

        and underscores.

        - `mainNodeName`: must match one of the `nodes[].name` values, and

        must not be the destination of any edge.

        - `nodes`: at least one. Each node has a unique `name` and a

        `function` reference (by `functionName` or `functionID`, optionally

        pinned to a `versionNum`).

        - `edges`: optional for single-node workflows. For branching

        sources (Classify, semantic Split), each edge carries a

        `destinationName` matching a `classifications[].name` or

        `itemClasses[].name` on the source function.


        The created workflow is at `versionNum: 1`. Subsequent

        `PATCH /v3/workflows/{workflowName}` calls produce new versions.


        ## Common patterns


        - **Single-node**: one extract/classify function, no edges.

        - **Sequential**: extract → enrich → payload_shaping (linear edges).

        - **Branching**: classify → multiple extracts (one edge per

        classification name).

        - **Split-then-process**: split → multiple extracts (one edge per

        item class).


        See [Workflows explained](/guide/workflows-explained) for end-to-end

        examples of each pattern.'
      parameters: []
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowV3CreateResponse'
      tags:
      - Workflows
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkflowCreateRequestV3'
  /v3/workflows/copy:
    post:
      operationId: v3-copy-workflow
      summary: Copy a Workflow
      description: '**Copy a workflow to a new name.**


        Forks the source workflow''s current version into a brand-new

        workflow at `versionNum: 1`. The full node graph and edges are

        carried over, but the *functions* the copied nodes reference are

        shared, not duplicated — both workflows now point at the same

        functions.


        Useful for forking a production workflow to test a topology change

        without disturbing the live caller.'
      parameters: []
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowCopyResponseV3'
        '400':
          description: The server could not understand the request due to invalid syntax.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowCopyResponseV3'
        '404':
          description: The server cannot find the requested resource.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowCopyResponseV3'
      tags:
      - Workflows
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkflowCopyRequest'
  /v3/workflows/{workflowName}:
    delete:
      operationId: v3-delete-workflow
      summary: Delete a Workflow
      description: '**Delete a workflow and every one of its versions.**


        Permanent. Running and queued calls against this workflow continue

        to completion against the version they captured at call time;

        subsequent attempts to call the workflow return `404 Not Found`.


        Functions referenced by the deleted workflow are not removed — they

        remain available to other workflows or for direct reference.'
      parameters:
      - name: workflowName
        in: path
        required: true
        schema:
          type: string
      responses:
        '204':
          description: 'There is no content to send for this request, but the headers may be useful. '
      tags:
      - Workflows
    get:
      operationId: v3-get-workflow
      summary: Get a Workflow
      description: '**Retrieve a workflow''s current version by name.**


        Returns the full workflow record: `currentVersionNum`, `mainNodeName`,

        the `nodes` array (with each node''s function reference and pinned

        `versionNum` if any), and the `edges` array. To inspect a historical

        version, use `GET /v3/workflows/{workflowName}/versions/{versionNum}`.'
      parameters:
      - name: workflowName
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowV3GetResponse'
      tags:
      - Workflows
    patch:
      operationId: v3-update-workflow
      summary: Update a Workflow
      description: '**Update a workflow. Updates create a new version.**


        The previous version remains addressable and immutable. Pending and

        running calls captured at the old version continue against it; new

        calls run against the new version.


        ## Topology updates


        To change the graph you must provide `mainNodeName`, `nodes`, AND

        `edges` together — partial topology updates are rejected. The full

        graph is replaced atomically.


        ## Metadata-only updates


        Omit all three fields to update only `displayName`, `tags`, or

        `name` while keeping the topology of the current version.


        ## Reverting


        To roll back, fetch the desired prior version and resubmit its

        `mainNodeName`/`nodes`/`edges` as a new update. Versions themselves

        are immutable — there is no "pin to version N" operation at the

        workflow level (use `nodes[].function.versionNum` to pin individual

        functions).'
      parameters:
      - name: workflowName
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowV3UpdateResponse'
      tags:
      - Workflows
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkflowUpdateRequestV3'
  /v3/workflows/{workflowName}/call:
    post:
      operationId: v3-call-workflow
      parameters:
      - name: workflowName
        in: path
        required: true
        description: The name of the workflow to invoke.
        schema:
          type: string
      - name: wait
        in: query
        required: false
        description: 'Block until the call completes (up to 30 seconds) and return the finished

          call object. Default: `false`. This is a boolean flag — use `--wait` or

          `--wait=true`, not `--wait true`.'
        schema:
          type: boolean
        explode: false
      description: "**Invoke a workflow.**\n\nSubmit the input file as either a multipart form request or a JSON request with\nbase64-encoded file content. The workflow name is derived from the URL path.\n\n## Input Formats\n\n- **Multipart form** (`multipart/form-data`): attach the file directly via the `file`\nor `files` fields. Set `wait` in the form body to control synchronous behaviour.\n- **JSON** (`application/json`): base64-encode the file content and set it in\n`input.singleFile.inputContent` or `input.batchFiles.inputs[*].inputContent`.\nPass `wait=true` as a query parameter to control synchronous behaviour.\n\n## Synchronous vs Asynchronous\n\nBy default the call is created asynchronously and this endpoint returns `202 Accepted`\nimmediately with a `pending` call object. Set `wait` to `true` to block until\nthe call completes (up to 30 seconds):\n\n- On success: returns `200 OK` with the completed call, `outputs` populated\n- On failure: returns `500 Internal Server Error` with the call and an `error` message\n- On timeout: returns `202 Accepted` with the still-running call\n\n## Tracking\n\nPoll `GET /v3/calls/{callID}` to check status, or configure a webhook subscription\nto receive events when the call finishes.\n\n## CLI Usage\n\nUse `@path/to/file` inside JSON string values to embed file contents automatically.\nBinary files (PDF, images, audio) are base64-encoded; text files are embedded as strings.\n\nSingle file (synchronous):\n```bash\nbem workflows call \\\n  --workflow-name my-workflow \\\n  --input.single-file '{\"inputContent\": \"@invoice.pdf\", \"inputType\": \"pdf\"}' \\\n  --wait\n```\n\nSingle file (asynchronous, returns callID immediately):\n```bash\nbem workflows call \\\n  --workflow-name my-workflow \\\n  --input.single-file '{\"inputContent\": \"@invoice.pdf\", \"inputType\": \"pdf\"}'\n```\n\nBatch files:\n```bash\nbem workflows call \\\n  --workflow-name my-workflow \\\n  --input.batch-files '{\"inputs\": [{\"inputContent\": \"@a.pdf\", \"inputType\": \"pdf\"}, {\"inputContent\": \"@b.png\", \"inputType\": \"png\"}]}'\n```\n\nAlternative: pass the full `--input` flag as JSON:\n```bash\nbem workflows call \\\n  --workflow-name my-workflow \\\n  --input '{\"singleFile\": {\"inputContent\": \"@invoice.pdf\", \"inputType\": \"pdf\"}}' \\\n  --wait\n```\n\n**Important:** `--wait` is a boolean flag. Use `--wait` or `--wait=true`.\nDo **not** use `--wait true` (with a space) — the `true` will be parsed as an\nunexpected positional argument.\n\nSupported `inputType` values: csv, docx, email, heic, heif, html, jpeg, json,\nm4a, mp3, pdf, png, text, wav, webp, xls, xlsx, xml."
      summary: Call a Workflow Call a Workflow
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallGetResponseV3'
      tags:
      - Workflows
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/WorkflowCallMultipartFormData'
            encoding:
              file:
                contentType: '*/*'
              files:
                contentType: '*/*'
          application/json:
            schema:
              $ref: '#/components/schemas/WorkflowCallJsonBody'
  /v3/workflows/{workflowName}/versions:
    get:
      operationId: v3-list-workflow-versions
      summary: List Workflow Versions
      description: '**List every version of a workflow.**


        Versions are immutable. Each row captures what the workflow looked

        like between updates: graph topology, metadata, and timestamps.

        Returns newest-first by default. Cursor pagination via

        `startingAfter` / `endingBefore` over `versionNum`.'
      parameters:
      - name: workflowName
        in: path
        required: true
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 50
      - name: sortOrder
        in: query
        required: false
        schema:
          type: string
          enum:
          - asc
          - desc
          default: asc
      - name: startingAfter
        in: query
        required: false
        schema:
          type: integer
      - name: endingBefore
        in: query
        required: false
        schema:
          type: integer
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListWorkflowVersionsResponseV3'
      tags:
      - Workflows
  /v3/workflows/{workflowName}/versions/{versionNum}:
    get:
      operationId: v3-get-workflow-version
      summary: Get a Workflow Version
      description: '**Retrieve a specific historical version of a workflow.**


        Versions are immutable. Use this endpoint to see what a workflow

        looked like at the moment a particular call was made — every call

        record carries the workflow `versionNum` it ran against.'
      parameters:
      - name: workflowName
        in: path
        required: true
        schema:
          type: string
      - name: versionNum
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: The request has succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetWorkflowVersionResponseV3'
      tags:
      - Workflows
components:
  schemas:
    SendEventS3Output:
      type: object
      required:
      - bucketName
      - key
      properties:
        bucketName:
          type: string
          description: Name of the S3 bucket the payload was written to.
        key:
          type: string
          description: Object key under which the payload was stored.
      description: Metadata returned when a Send function delivers to an S3 bucket.
    SendEventWebhookOutput:
      type: object
      required:
      - httpStatusCode
      - httpResponseBody
      properties:
        httpStatusCode:
          type: integer
          description: HTTP status code returned by the webhook endpoint.
        httpResponseBody:
          type: string
          description: Raw HTTP response body returned by the webhook endpoint.
      description: Metadata returned when a Send function delivers to a webhook.
    SendDestinationType:
      type: string
      enum:
      - webhook
      - s3
      - google_drive
      description: Destination type for a Send function.
    BatchFilesInputItemResponse:
      type: object
      properties:
        inputType:
          type: string
          description: Input type of the file
        itemReferenceID:
          type: string
          description: Item reference ID
        s3URL:
          type: string
          description: Presigned S3 URL for the file
    ParagonConnectorConfig:
      type: object
      required:
      - integration
      - configuration
      - syncID
      properties:
        integration:
          type: string
          description: Paragon integration key (e.g. "googledrive").
        configuration:
          type: object
          unevaluatedProperties: {}
          description: 'Opaque per-integration configuration (e.g. `{"folderId": "..."}`).'
        syncID:
          type: string
          description: Paragon sync ID managed by the server. Read-only.
          readOnly: true
      description: Paragon-integration configuration on a workflow connector.
    ExtractEvent:
      type: object
      required:
      - eventID
      - referenceID
      - functionID
      - functionName
      - transformedContent
      - itemOffset
      - itemCount
      properties:
        functionCallTryNumber:
          type: integer
          description: The attempt number of the function call that created this event. 1 indexed.
        eventID:
          type: string
          description: Unique ID generated by bem to identify the event.
        createdAt:
          type: string
          format: date-time
          description: Timestamp indicating when the event was created.
        referenceID:
          type: string
          description: The unique ID you use internally to refer to this data point, propagated from the original function input.
        inboundEmail:
          allOf:
          - $ref: '#/components/schemas/EventInboundEmail'
          description: The inbound email that triggered this event.
        metadata:
          type: object
          properties:
            durationFunctionToEventSeconds:
              type: number
        eventType:
          type: string
          enum:
          - extract
        functionCallID:
          type: string
          description: Unique identifier of function call that this event is associated with.
        functionID:
          type: string
          description: Unique identifier of function that this event is associated with.
        functionName:
          type: string
          description: Unique name of function that this event is associated with.
        functionVersionNum:
          type: integer
          description: Version number of function that this event is associated with.
        callID:
          type: string
          description: Unique identifier of workflow call that this event is associated with.
        workflowID:
          type: string
          description: Unique identifier of workflow that this event is associated with.
        workflowName:
          type: string
          description: Name of workflow that this event is associated with.
        workflowVersionNum:
          type: integer
          description: Version number of workflow that this event is associated with.
        inputType:
          $ref: '#/components/schemas/InputType'
        transformationID:
          type: string
          description: Unique ID for each transformation output generated by bem following Segment's KSUID conventions.
        s3URL:
          anyOf:
          - type: string
          - type: 'null'
          description: Presigned S3 URL for the input content uploaded to S3.
        inputs:
          anyOf:
          - type: array
            items:
              type: object
              properties:
                inputType:
                  anyOf:
                  - type: string
                  - type: 'null'
                inputContent:
                  anyOf:
                  - type: string
                  - type: 'null'
                jsonInputContent:
                  anyOf:
                  - type: object
                    unevaluatedProperties: {}
                  - type: 'null'
                s3URL:
                  anyOf:
                  - type: string
                  - type: 'null'
          - type: 'null'
          description: Array of transformation inputs with their types and S3 URLs.
        transformedContent:
          type: object
          unevaluatedProperties: {}
          description: The transformed content of the input. The structure of this object is defined by the function configuration.
        correctedContent:
          anyOf:
          - type: object
            properties:
              output:
                type: array
                items:
                  $ref: '#/components/schemas/AnyType'
          - $ref: '#/components/schemas/AnyType'
          description: Corrected feedback provided for fine-tuning purposes.
        invalidProperties:
          type: array
          items:
            type: string
          description: List of properties that were invalid in the input.
        itemOffset:
          type: integer
          description: The offset of the first item that was transformed. Used for batch transformations to indicate which item in the batch this event corresponds to.
        itemCount:
          type: integer
          description: The number of items that were transformed. Used for batch transformations to indicate how many items were transformed.
        fieldBoundingBoxes:
          type: object
          unevaluatedProperties: {}
          description: 'Per-field bounding boxes. A JSON object mapping RFC 6901 JSON Pointer paths (e.g. `"/invoiceNumber"`,

            `"/items/0/price"`) to the document regions from which each extracted value was sourced.'
        fieldConfidences:
          type: object
          unevaluatedProperties:
            type: number
            format: float
          description: 'Per-field confidence scores. A JSON object mapping RFC 6901 JSON Pointer paths (e.g. `"/invoiceNumber"`)

            to float values in the range [0, 1] indicating the model''s confidence in each extracted field value.'
        avgConfidence:
          anyOf:
          - type: number
            format: float
          - type: 'null'
          description: Average confidence score across all extracted fields, in the range [0, 1].
      description: 'V3 event variants that do not exist in the shared `Event` union.


        `ExtractEvent` and `ClassifyEvent` are emitted only by V3-era function types

        (`extract` and `classify`). The shared `Event` union in `specs/events/models.tsp`

        predates these types and continues to describe V2 / V1-alpha responses verbatim;

        V3 response payloads add the new variants via the `EventV3` union below while

        keeping every shared variant intact for backward compatibility.'
      title: Extract Event
    BatchFilesInput:
      type: object
      properties:
        inputs:
          type: array
          items:
            type: object
            properties:
              inputType:
                allOf:
                - $ref: '#/components/schemas/InputType'
                description: 'The input type of the content you''re sending for transformation.


                  Must match the actual file format. See `InputType` for allowed values.'
              inputContent:
                type: string
                contentEncoding: base64
                description: Base64-encoded file content. In the Bem CLI, use `@path/to/file` to embed file contents automatically.
              itemReferenceID:
                type: string
            required:
            - inputType
            - inputContent
    BatchFilesInputResponse:
      type: object
      properties:
        inputs:
          type: array
          items:
            $ref: '#/components/schemas/BatchFilesInputItemResponse'
    AnyType:
      anyOf:
      - type: object
        unevaluatedProperties: {}
      - type: array
        items: {}
      - type: string
      - type: number
      - type: integer
      - type: boolean
      - type: 'null'
    ParagonConnectorRequestConfig:
      type: object
      properties:
        integration:
          type: string
          description: Paragon integration key. Required on create.
        configuration:
          type: object
          unevaluatedProperties: {}
          description: Opaque per-integration configuration. Required on create.
      description: Request-side config block for a Paragon connector. Fields absent on update are unchanged.
    CallV3:
      type: object
      required:
      - callID
      - createdAt
      - outputs
      - errors
      - url
      - traceUrl
      properties:
        callID:
          type: string
          description: Unique identifier of the call.
        status:
          type: string
          enum:
          - pending
          - running
          - completed
          - failed
          description: Status of call.
        createdAt:
          type: string
          format: date-time
          description: The date and time the call was created.
        finishedAt:
          type: string
          format: date-time
          description: The date and time the call finished. Only set once status is `completed` or `failed`.
        workflowID:
          type: string
          description: Unique identifier of the workflow.
        workflowName:
          type: string
          description: Name of the workflow.
        workflowVersionNum:
          type: integer
          description: Version number of the workflow.
        callReferenceID:
          type: string
          description: Your reference ID for this call, propagated from the original request.
        outputs:
          type: array
          items:
            $ref: '#/components/schemas/EventV3'
          description: 'Terminal non-error outputs of this call: primary events (non-split-collection) that did not

            trigger any downstream function calls. Workflow calls are not atomic — `outputs` and `errors`

            may both be non-empty if some enclosed function calls succeeded and others failed.


            Each element is a polymorphic event object; inspect `eventType` to determine the type.

            Retrieve individual outputs via `GET /v3/outputs/{eventID}`.'
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ErrorEvent'
          description: 'Terminal error events of this call. Workflow calls are not atomic — `errors` and `outputs`

            may both be non-empty if some enclosed function calls succeeded and others failed.


            Retrieve individual errors via `GET /v3/errors/{eventID}`.'
        input:
          allOf:
          - $ref: '#/components/schemas/FunctionCallCreateInputResponse'
          description: Input to the main function call.
        url:
          type: string
          description: 'Hint URL for retrieving this call: `GET /v3/calls/{callID}`.'
        traceUrl:
          type: string
          description: 'Hint URL for the full execution trace: `GET /v3/calls/{callID}/trace`.'
      description: 'A workflow call returned by the V3 API.


        Compared to the V2 `Call` model:

        - Terminal outputs are split into `outputs` (non-error events) and `errors` (error events)

        - `callType` and function-scoped fields are removed — V3 calls are always workflow calls

        - The deprecated `functionCalls` field is removed (use `GET /v3/calls/{callID}/trace`)

        - `url` and `traceUrl` hint fields are included for resource discovery'
    WorkflowV3:
      type: object
      required:
      - id
      - name
      - versionNum
      - mainNodeName
      - nodes
      - edges
      - connectors
      - createdAt
      - updatedAt
      properties:
        id:
          type: string
          description: Unique identifier of the workflow.
        name:
          type: string
          description: Unique name of the workflow within the environment.
        versionNum:
          type: integer
          description: Version number of this workflow version.
        displayName:
          type: string
          description: Human-readable display name.
        emailAddress:
          type: string
          description: Inbound email address associated with the workflow, if any.
        tags:
          type: array
          items:
            type: string
          description: Tags associated with the workflow.
        mainNodeName:
          type: string
          description: Name of the entry-point call-site node.
        nodes:
          type: array
          items:
            $ref: '#/components/schemas/WorkflowNodeResponse'
          description: All call-site nodes in this workflow version's DAG.
        edges:
          type: array
          items:
            $ref: '#/components/schemas/WorkflowEdgeResponse'
          description: All directed edges in this workflow version's DAG.
        connectors:
          type: array
          items:
            $ref: '#/components/schemas/WorkflowConnector'
          description: 'Connectors currently attached to this workflow. For version-scoped reads

            (`/versions/{n}`) this is always empty — connectors are current-state and

            not part of version history.'
        createdAt:
          type: string
          format: date-time
          description: The date and time the workflow was created.
        updatedAt:
          type: string
          format: date-time
          description: The date and time the workflow was last updated.
        audit:
          allOf:
          - $ref: '#/components/schemas/WorkflowAudit'
          description: Audit trail information.
      description: V3 read representation of a workflow version.
    EvaluationEvent:
      type: object
      required:
      - eventID
      - referenceID
      - functionID
      - functionName
      - transform

# --- truncated at 32 KB (108 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/bem/refs/heads/main/openapi/bem-workflows-api-openapi.yml