## User Selection

`workflows.user_selection(strworkflow_id, WorkflowUserSelectionParams**kwargs)  -> WorkflowUserSelectionResponse`

**put** `/workflows/{workflowId}/user-selection`

Respond to a user-selection node in a workflow. Pass action="select" with selectedIndices to pick items and resume the workflow, or action="reject" to mark the node Rejected and cancel the workflow.

### Parameters

- `workflow_id: str`

- `project_id: str`

  The projectId used for ownership resource management. Either to assert ownership or to set the owner of the resource(s)

- `action: Literal["select", "reject"]`

  Decision taken on the selection node. "select" persists the picked items and advances the workflow; "reject" marks it Rejected and cancels the workflow.

  - `"select"`

  - `"reject"`

- `node_id: str`

  The ID of the user selection node to act on in the workflow

- `workflow_job_id: str`

  The ID of the workflow job that contains the user selection node

- `selected_indices: Optional[Iterable[int]]`

  Zero-based indices into the node's `items` (the candidate list frozen when the node started processing). Required when action is "select". Order is preserved in the node output.

### Returns

- `class WorkflowUserSelectionResponse: …`

  - `job: Job`

    - `created_at: str`

      The job creation date as an ISO string (example: "2023-02-03T11:19:41.579Z")

    - `job_id: str`

      The job ID (example: "job_ocZCnG1Df35XRL1QyCZSRxAG8")

    - `job_type: Literal["assets-download", "canvas-export", "caption", 37 more]`

      The type of job

      - `"assets-download"`

      - `"canvas-export"`

      - `"caption"`

      - `"caption-llava"`

      - `"custom"`

      - `"describe-style"`

      - `"detection"`

      - `"embed"`

      - `"flux"`

      - `"flux-model-training"`

      - `"generate-prompt"`

      - `"image-generation"`

      - `"image-prompt-editing"`

      - `"inference"`

      - `"mesh-preview-rendering"`

      - `"model-download"`

      - `"model-import"`

      - `"model-training"`

      - `"musubi-model-training"`

      - `"openai-image-generation"`

      - `"patch-image"`

      - `"pixelate"`

      - `"reframe"`

      - `"remove-background"`

      - `"repaint"`

      - `"restyle"`

      - `"segment"`

      - `"skybox-3d"`

      - `"skybox-base-360"`

      - `"skybox-hdri"`

      - `"skybox-upscale-360"`

      - `"splat"`

      - `"texture"`

      - `"translate"`

      - `"upload"`

      - `"upscale"`

      - `"upscale-skybox"`

      - `"upscale-texture"`

      - `"vectorize"`

      - `"workflow"`

    - `metadata: JobMetadata`

      Metadata of the job with some additional information

      - `asset_ids: Optional[List[str]]`

        List of produced assets for this job

      - `error: Optional[str]`

        Eventual error for the job

      - `flow: Optional[List[JobMetadataFlow]]`

        The flow of the job. Only available for workflow jobs.

        - `id: str`

          The id of the node.

        - `status: Literal["failure", "pending", "processing", 3 more]`

          The status of the node. Only available for WorkflowJob nodes.

          - `"failure"`

          - `"pending"`

          - `"processing"`

          - `"rejected"`

          - `"skipped"`

          - `"success"`

        - `type: Literal["custom-model", "for-each", "generate-prompt", 8 more]`

          The type of the job for the node.

          - `"custom-model"`

          - `"for-each"`

          - `"generate-prompt"`

          - `"list"`

          - `"logic"`

          - `"model"`

          - `"remove-background"`

          - `"transform"`

          - `"user-approval"`

          - `"user-selection"`

          - `"workflow"`

        - `assets: Optional[List[JobMetadataFlowAsset]]`

          List of produced assets for this node.

          - `asset_id: str`

          - `url: str`

        - `count: Optional[float]`

          Fixed number of iterations for a ForEach node.
          When set, the loop runs exactly `count` times regardless of array input.
          When not set, the loop iterates over the resolved array input.
          Only available for ForEach nodes.

        - `depends_on: Optional[List[str]]`

          The nodes that this node depends on.
          Only available for nodes that have dependencies. Mainly used for user approval nodes.

        - `include_outputs_in_workflow_job: Optional[Literal[true]]`

          If true, the outputs of this node will be included in the workflow job's final output.
          Only applicable to producing nodes (custom-model, inference, etc.).
          By default, only last nodes (nodes not referenced by other nodes) contribute to outputs.
          Set this to true to also include intermediate nodes in the final output.
          Note: This should only be set to `true` or left undefined.

          - `true`

        - `inputs: Optional[List[JobMetadataFlowInput]]`

          The inputs of the node.
          For a user-selection node, the array input's `min`/`max` bound how many
          items the user may pick (defaults: 1 and 100); conditional connections may
          be present as additional inputs.

          - `name: str`

            The name that must be user to call the model through the API

          - `type: Literal["boolean", "file", "file_array", 7 more]`

            The data type of the input

            - `"boolean"`

            - `"file"`

            - `"file_array"`

            - `"inputs_array"`

            - `"model"`

            - `"model_array"`

            - `"number"`

            - `"number_array"`

            - `"string"`

            - `"string_array"`

          - `allowed_values: Optional[List[object]]`

            The allowed values for the input. For `string` or `number` types, creates a single-select
            dropdown.
            For `string_array` type, creates a multi-select dropdown.

          - `background_behavior: Optional[Literal["opaque", "transparent"]]`

            Specifies the background behavior for the input. Only available for `file` and `file_array`
            input types with kind `image`.

            - `"opaque"`

            - `"transparent"`

          - `color: Optional[bool]`

            Whether the input is a color or not. Only available for `string` input type.

          - `cost_impact: Optional[bool]`

            Whether this input affects the model's cost calculation

          - `default: Optional[object]`

            The default value for the input

          - `description: Optional[str]`

            Help text displayed in the UI to provide additional information about the input

          - `group: Optional[str]`

            Used to visually group inputs together in the UI. Inputs with the same group value appear
            consecutively in the UI.

          - `hint: Optional[str]`

            Hint text displayed in the UI as a tooltip to guide the user

          - `inputs: Optional[List[Dict[str, object]]]`

            The list of inputs which form an object within a container array.
            All inputs are the same as the current object.
            This is only available for type inputs_array inputs.

          - `items: Optional[List[List[JobMetadataFlowInputItem]]]`

            The configured items for inputs_array type inputs.
            Each item is an array of SubNodeInput that need ref/value resolution.
            Only available for inputs_array type.

            - `name: str`

              The name that must be user to call the model through the API

            - `type: Literal["boolean", "file", "file_array", 7 more]`

              The data type of the input

              - `"boolean"`

              - `"file"`

              - `"file_array"`

              - `"inputs_array"`

              - `"model"`

              - `"model_array"`

              - `"number"`

              - `"number_array"`

              - `"string"`

              - `"string_array"`

            - `allowed_values: Optional[List[object]]`

              The allowed values for the input. For `string` or `number` types, creates a single-select
              dropdown.
              For `string_array` type, creates a multi-select dropdown.

            - `background_behavior: Optional[Literal["opaque", "transparent"]]`

              Specifies the background behavior for the input. Only available for `file` and `file_array`
              input types with kind `image`.

              - `"opaque"`

              - `"transparent"`

            - `color: Optional[bool]`

              Whether the input is a color or not. Only available for `string` input type.

            - `cost_impact: Optional[bool]`

              Whether this input affects the model's cost calculation

            - `default: Optional[object]`

              The default value for the input

            - `description: Optional[str]`

              Help text displayed in the UI to provide additional information about the input

            - `group: Optional[str]`

              Used to visually group inputs together in the UI. Inputs with the same group value appear
              consecutively in the UI.

            - `hint: Optional[str]`

              Hint text displayed in the UI as a tooltip to guide the user

            - `inputs: Optional[List[Dict[str, object]]]`

              The list of inputs which form an object within a container array.
              All inputs are the same as the current object.
              This is only available for type inputs_array inputs.

            - `kind: Optional[Literal["3d", "audio", "document", 5 more]]`

              The asset kind of the input. Only taken into account for `file` and `file_array` input types.
              If model provides multiple kinds,
              the input will be not able to create the asset on the flight on API side with dataurl without data:kind, prefix
              `file` and `file_array` inputs always expose a kind: when a model does not declare one,
              `image` is returned, which is the kind used at generation time.

              - `"3d"`

              - `"audio"`

              - `"document"`

              - `"image"`

              - `"image-hdr"`

              - `"json"`

              - `"text"`

              - `"video"`

            - `label: Optional[str]`

              The label displayed in the UI for this input

            - `mask_from: Optional[str]`

              The name of the file input field to use as the mask source

            - `max: Optional[float]`

              The maximum allowed value. Only available for `number` and `array` input types.

            - `max_duration: Optional[float]`

              The maximum allowed media duration in seconds. Only applies to `file` and `file_array` input types
              for video and audio assets. Validated against `asset.properties.duration` at job creation time.

            - `max_length: Optional[float]`

              The maximum allowed length for `string` and `model` inputs, in characters.
              For the array types (`string_array`, `model_array`) it bounds the NUMBER OF
              ITEMS instead — the length of each item is not constrained.

            - `max_size: Optional[float]`

              The maximum allowed file size in bytes. Only applies to `file` and `file_array` input types.
              Validated against `asset.properties.size` at job creation time.

            - `min: Optional[float]`

              The minimum allowed value. Only available for `number` and array input types.

            - `min_length: Optional[float]`

              The minimum allowed length for `string` and `model` inputs, in characters.
              For the array types (`string_array`, `model_array`) it bounds the NUMBER OF
              ITEMS instead — the length of each item is not constrained.

            - `model_types: Optional[List[Literal["custom", "elevenlabs-voice", "flux.1", 28 more]]]`

              The allowed model types for this input. Example: `["flux.1-lora"]`.
              Only available for `model_array` input type.

              - `"custom"`

              - `"elevenlabs-voice"`

              - `"flux.1"`

              - `"flux.1-composition"`

              - `"flux.1-kontext-dev"`

              - `"flux.1-kontext-lora"`

              - `"flux.1-krea-dev"`

              - `"flux.1-krea-lora"`

              - `"flux.1-lora"`

              - `"flux.1-pro"`

              - `"flux.1.1-pro-ultra"`

              - `"flux.2-dev-edit-lora"`

              - `"flux.2-dev-lora"`

              - `"flux.2-klein-4b-edit-lora"`

              - `"flux.2-klein-4b-lora"`

              - `"flux.2-klein-9b-edit-lora"`

              - `"flux.2-klein-9b-lora"`

              - `"flux.2-klein-base-4b-edit-lora"`

              - `"flux.2-klein-base-4b-lora"`

              - `"flux.2-klein-base-9b-edit-lora"`

              - `"flux.2-klein-base-9b-lora"`

              - `"flux1.1-pro"`

              - `"gpt-image-1"`

              - `"qwen-image-2512-lora"`

              - `"qwen-image-edit-2509-lora"`

              - `"qwen-image-edit-2511-lora"`

              - `"qwen-image-edit-lora"`

              - `"qwen-image-lora"`

              - `"zimage-de-turbo-lora"`

              - `"zimage-lora"`

              - `"zimage-turbo-lora"`

            - `parent: Optional[bool]`

              Whether this input represents a parent asset to assign to the produced assets.
              Only available for `file` and `file_array` input types.

              For `file_array`, the parent asset is the first item in the array.

            - `placeholder: Optional[str]`

              Placeholder text for the input. Only available for 'string' input type.

            - `prompt: Optional[bool]`

              Whether the input is a prompt. When true, displays as a text area with prompt spark feature.
              Only available for `string` input type.

            - `prompt_spark: Optional[bool]`

              Whether the input is used with prompt spark. Only available for `string` input type.

            - `ref: Optional[JobMetadataFlowInputItemRef]`

              The reference to another input or output of the same workflow.
              Must have at least one of node or conditional.

              - `conditional: Optional[List[str]]`

                The conditional nodes to reference.
                If the conditional nodes are successful, the node will be successful.
                If the conditional nodes are skipped, the node will be skipped.
                Contains an array of node ids used to check the status of the nodes.

              - `equal: Optional[str]`

                This is the desired node output value if ref is an if/else node.

              - `name: Optional[str]`

                The name of the input or output to reference.
                If the type is 'workflow', the name is the name of the input of the workflow is required
                If the type is 'node', the name is not mandatory, except if you want all outputs of the node.
                To get all outputs of a node, you can use the name 'all'.

              - `node: Optional[str]`

                The node id or 'workflow' if the source is a workflow input.

            - `required: Optional[JobMetadataFlowInputItemRequired]`

              Set of rules that describes when this input is required:

              - `always`: Input is always required
              - `ifNotDefined`: Input is required when another specified input is not defined
              - `ifDefined`: Input is required when another specified input is defined
              - `conditional`: Input is required when other inputs have specific values

              By default, the input is not required.

              - `always: Optional[bool]`

                Whether the input is always required

              - `conditional: Optional[JobMetadataFlowInputItemRequiredConditional]`

                Makes this input required when other inputs have one of the listed values

                - `values: object`

                  The conditions to check:

                  - Key: name of the input to check
                  - Value: values of that input that satisfy the condition

                - `operator: Optional[Literal["and", "or"]]`

                  How the conditions combine: `and` (all must match) or `or` (any must match)

                  - `"and"`

                  - `"or"`

              - `if_defined: Optional[object]`

                Makes this input required when another input is defined:

                - Key: name of the input that must be defined
                - Value: message to display when this input is required

              - `if_not_defined: Optional[object]`

                Makes this input required when another input is not defined:

                - Key: name of the input that must be undefined
                - Value: message to display when this input is required

            - `step: Optional[float]`

              The step increment for numeric inputs. Only available for `number` input type.

            - `value: Optional[object]`

              The value of the input.
              This is the value of the input that will be used to run the node.
              Only available for flows managed by a WorkflowJob.

          - `kind: Optional[Literal["3d", "audio", "document", 5 more]]`

            The asset kind of the input. Only taken into account for `file` and `file_array` input types.
            If model provides multiple kinds,
            the input will be not able to create the asset on the flight on API side with dataurl without data:kind, prefix
            `file` and `file_array` inputs always expose a kind: when a model does not declare one,
            `image` is returned, which is the kind used at generation time.

            - `"3d"`

            - `"audio"`

            - `"document"`

            - `"image"`

            - `"image-hdr"`

            - `"json"`

            - `"text"`

            - `"video"`

          - `label: Optional[str]`

            The label displayed in the UI for this input

          - `mask_from: Optional[str]`

            The name of the file input field to use as the mask source

          - `max: Optional[float]`

            The maximum allowed value. Only available for `number` and `array` input types.

          - `max_duration: Optional[float]`

            The maximum allowed media duration in seconds. Only applies to `file` and `file_array` input types
            for video and audio assets. Validated against `asset.properties.duration` at job creation time.

          - `max_length: Optional[float]`

            The maximum allowed length for `string` and `model` inputs, in characters.
            For the array types (`string_array`, `model_array`) it bounds the NUMBER OF
            ITEMS instead — the length of each item is not constrained.

          - `max_size: Optional[float]`

            The maximum allowed file size in bytes. Only applies to `file` and `file_array` input types.
            Validated against `asset.properties.size` at job creation time.

          - `min: Optional[float]`

            The minimum allowed value. Only available for `number` and array input types.

          - `min_length: Optional[float]`

            The minimum allowed length for `string` and `model` inputs, in characters.
            For the array types (`string_array`, `model_array`) it bounds the NUMBER OF
            ITEMS instead — the length of each item is not constrained.

          - `model_types: Optional[List[Literal["custom", "elevenlabs-voice", "flux.1", 28 more]]]`

            The allowed model types for this input. Example: `["flux.1-lora"]`.
            Only available for `model_array` input type.

            - `"custom"`

            - `"elevenlabs-voice"`

            - `"flux.1"`

            - `"flux.1-composition"`

            - `"flux.1-kontext-dev"`

            - `"flux.1-kontext-lora"`

            - `"flux.1-krea-dev"`

            - `"flux.1-krea-lora"`

            - `"flux.1-lora"`

            - `"flux.1-pro"`

            - `"flux.1.1-pro-ultra"`

            - `"flux.2-dev-edit-lora"`

            - `"flux.2-dev-lora"`

            - `"flux.2-klein-4b-edit-lora"`

            - `"flux.2-klein-4b-lora"`

            - `"flux.2-klein-9b-edit-lora"`

            - `"flux.2-klein-9b-lora"`

            - `"flux.2-klein-base-4b-edit-lora"`

            - `"flux.2-klein-base-4b-lora"`

            - `"flux.2-klein-base-9b-edit-lora"`

            - `"flux.2-klein-base-9b-lora"`

            - `"flux1.1-pro"`

            - `"gpt-image-1"`

            - `"qwen-image-2512-lora"`

            - `"qwen-image-edit-2509-lora"`

            - `"qwen-image-edit-2511-lora"`

            - `"qwen-image-edit-lora"`

            - `"qwen-image-lora"`

            - `"zimage-de-turbo-lora"`

            - `"zimage-lora"`

            - `"zimage-turbo-lora"`

          - `parent: Optional[bool]`

            Whether this input represents a parent asset to assign to the produced assets.
            Only available for `file` and `file_array` input types.

            For `file_array`, the parent asset is the first item in the array.

          - `placeholder: Optional[str]`

            Placeholder text for the input. Only available for 'string' input type.

          - `prompt: Optional[bool]`

            Whether the input is a prompt. When true, displays as a text area with prompt spark feature.
            Only available for `string` input type.

          - `prompt_spark: Optional[bool]`

            Whether the input is used with prompt spark. Only available for `string` input type.

          - `ref: Optional[JobMetadataFlowInputRef]`

            The reference to another input or output of the same workflow.
            Must have at least one of node or conditional.

            - `conditional: Optional[List[str]]`

              The conditional nodes to reference.
              If the conditional nodes are successful, the node will be successful.
              If the conditional nodes are skipped, the node will be skipped.
              Contains an array of node ids used to check the status of the nodes.

            - `equal: Optional[str]`

              This is the desired node output value if ref is an if/else node.

            - `name: Optional[str]`

              The name of the input or output to reference.
              If the type is 'workflow', the name is the name of the input of the workflow is required
              If the type is 'node', the name is not mandatory, except if you want all outputs of the node.
              To get all outputs of a node, you can use the name 'all'.

            - `node: Optional[str]`

              The node id or 'workflow' if the source is a workflow input.

          - `required: Optional[JobMetadataFlowInputRequired]`

            Set of rules that describes when this input is required:

            - `always`: Input is always required
            - `ifNotDefined`: Input is required when another specified input is not defined
            - `ifDefined`: Input is required when another specified input is defined
            - `conditional`: Input is required when other inputs have specific values

            By default, the input is not required.

            - `always: Optional[bool]`

              Whether the input is always required

            - `conditional: Optional[JobMetadataFlowInputRequiredConditional]`

              Makes this input required when other inputs have one of the listed values

              - `values: object`

                The conditions to check:

                - Key: name of the input to check
                - Value: values of that input that satisfy the condition

              - `operator: Optional[Literal["and", "or"]]`

                How the conditions combine: `and` (all must match) or `or` (any must match)

                - `"and"`

                - `"or"`

            - `if_defined: Optional[object]`

              Makes this input required when another input is defined:

              - Key: name of the input that must be defined
              - Value: message to display when this input is required

            - `if_not_defined: Optional[object]`

              Makes this input required when another input is not defined:

              - Key: name of the input that must be undefined
              - Value: message to display when this input is required

          - `step: Optional[float]`

            The step increment for numeric inputs. Only available for `number` input type.

          - `value: Optional[object]`

            The value of the input.
            This is the value of the input that will be used to run the node.
            Only available for flows managed by a WorkflowJob.

        - `items: Optional[List[str]]`

          Statically-configured items for a List node, or the frozen candidate list
          of a UserSelection node. The values can be strings, numbers, or asset IDs.

        - `iteration_index: Optional[float]`

          Zero-based index of the iteration this node copy belongs to.
          Set on dynamically-created copies of loop body nodes.

        - `job_id: Optional[str]`

          If the flow is part of a WorkflowJob, this is the jobId for the node.
          jobId is only available for nodes started. A node "Pending" for a running workflow job is not started.

        - `logic: Optional[JobMetadataFlowLogic]`

          The logic of the node.
          Only available for logic nodes.

          - `cases: Optional[List[JobMetadataFlowLogicCase]]`

            The cases of the logic.
            Only available for if/else nodes.

            - `condition: str`

            - `value: str`

          - `default: Optional[str]`

            The default case of the logic.
            Contains the id/output of the node to execute if no case is matched.
            Only available for if/else nodes.

          - `transform: Optional[str]`

            The transform of the logic.
            Only available for transform nodes.

        - `logic_type: Optional[Literal["if-else"]]`

          The type of the logic for the node.
          Only available for logic nodes.

          - `"if-else"`

        - `loop_body_node_ids: Optional[List[str]]`

          IDs of the body template nodes that belong to this ForEach loop.
          At runtime these templates are cloned once per iteration and marked Skipped.
          Only available for ForEach nodes.

        - `loop_node_id: Optional[str]`

          ID of the ForEach node that spawned this iteration copy.
          Set on dynamically-created copies of loop body nodes.

        - `model_id: Optional[str]`

          The model id for the node. Mainly used for custom model tasks.

        - `output: Optional[object]`

          The output of the node.
          Only available for logic nodes.

        - `workflow_id: Optional[str]`

          The workflow id for the node. Mainly used for workflow tasks.

      - `hint: Optional[str]`

        Actionable hint for the user explaining what went wrong and how to resolve it.

      - `input: Optional[Dict[str, object]]`

        The inputs for the job

      - `output: Optional[Dict[str, object]]`

        May contain the output of the job for specific custom models jobs.
        Only available for custom models which generate non-assets outputs.
        Example: LLM text results.

      - `output_model_id: Optional[str]`

        For voice-clone jobs: the ID of the model being trained.

      - `workflow_id: Optional[str]`

        The workflow ID of the job if job is part of a workflow.

      - `workflow_job_id: Optional[str]`

        The workflow job ID of the job if job is part of a workflow job.

    - `progress: float`

      Progress of the job (between 0 and 1)

    - `status: Literal["canceled", "failure", "finalizing", 5 more]`

      The current status of the job

      - `"canceled"`

      - `"failure"`

      - `"finalizing"`

      - `"in-progress"`

      - `"pending"`

      - `"queued"`

      - `"success"`

      - `"warming-up"`

    - `status_history: List[JobStatusHistory]`

      The history of the different statuses the job went through with the ISO string date
      of when the job reached each statuses.

      - `date: str`

      - `status: Literal["canceled", "failure", "finalizing", 5 more]`

        - `"canceled"`

        - `"failure"`

        - `"finalizing"`

        - `"in-progress"`

        - `"pending"`

        - `"queued"`

        - `"success"`

        - `"warming-up"`

    - `updated_at: str`

      The job last update date as an ISO string (example: "2023-02-03T11:19:41.579Z")

    - `author_id: Optional[str]`

      The author user ID (example: "dcf121faaa1a0a0bbbd9ca1b73d62aea")

    - `billing: Optional[JobBilling]`

      The billing of the job

      - `cu_cost: float`

      - `cu_discount: float`

      - `cu_cost_details: Optional[JobBillingCuCostDetails]`

        Compute Units charged for the ADD-ONS of this job, per action — the fees
        paid on top of the generation itself, such as `quality-gate`.

        `cuCost` above is the main action alone, so the job's total is `cuCost`
        plus the values here.

        Two caveats when displaying it:

        - These are a remaining refundable balance, not a receipt: a job that
          failed or was cancelled has had its add-ons refunded, so they read 0
          while `cuCost` still shows the main action's original charge.
        - `ip-detection` is part of the shape but is never populated today: that
          fee is charged outside the job and reported once, as
          `ipDetection.creativeUnitsCharged`, in the response of the request that
          ran it.

        Absent when the job paid for no add-on.

        - `ip_detection: Optional[float]`

        - `quality_gate: Optional[float]`

      - `disable_refund: Optional[bool]`

        When true, the credits charged for this job are not automatically
        refunded if the generation fails, because the model used does not
        support refund-on-failure. Absent or false means a failed generation is
        refunded as usual.

    - `owner_id: Optional[str]`

      The owner ID (example: "team_U3Qmc8PCdWXwAQJ4Dvw4tV6D")

### Example

```python
import os
from scenario_sdk import Scenario

client = Scenario(
    api_key=os.environ.get("SCENARIO_SDK_API_KEY"),  # This is the default and can be omitted
    api_secret=os.environ.get("SCENARIO_SDK_API_SECRET"),  # This is the default and can be omitted
)
response = client.workflows.user_selection(
    workflow_id="workflowId",
    project_id="projectId",
    action="select",
    node_id="nodeId",
    workflow_job_id="workflowJobId",
)
print(response.job)
```

#### Response

```json
{
  "job": {
    "createdAt": "createdAt",
    "jobId": "jobId",
    "jobType": "assets-download",
    "metadata": {
      "assetIds": [
        "string"
      ],
      "error": "error",
      "flow": [
        {
          "id": "id",
          "status": "failure",
          "type": "custom-model",
          "assets": [
            {
              "assetId": "assetId",
              "url": "url"
            }
          ],
          "count": 0,
          "dependsOn": [
            "string"
          ],
          "includeOutputsInWorkflowJob": true,
          "inputs": [
            {
              "name": "name",
              "type": "boolean",
              "allowedValues": [
                {}
              ],
              "backgroundBehavior": "opaque",
              "color": true,
              "costImpact": true,
              "default": {},
              "description": "description",
              "group": "group",
              "hint": "hint",
              "inputs": [
                {
                  "foo": "bar"
                }
              ],
              "items": [
                [
                  {
                    "name": "name",
                    "type": "boolean",
                    "allowedValues": [
                      {}
                    ],
                    "backgroundBehavior": "opaque",
                    "color": true,
                    "costImpact": true,
                    "default": {},
                    "description": "description",
                    "group": "group",
                    "hint": "hint",
                    "inputs": [
                      {
                        "foo": "bar"
                      }
                    ],
                    "kind": "3d",
                    "label": "label",
                    "maskFrom": "maskFrom",
                    "max": 0,
                    "maxDuration": 0,
                    "maxLength": 0,
                    "maxSize": 0,
                    "min": 0,
                    "minLength": 0,
                    "modelTypes": [
                      "custom"
                    ],
                    "parent": true,
                    "placeholder": "placeholder",
                    "prompt": true,
                    "promptSpark": true,
                    "ref": {
                      "conditional": [
                        "string"
                      ],
                      "equal": "equal",
                      "name": "name",
                      "node": "node"
                    },
                    "required": {
                      "always": true,
                      "conditional": {
                        "values": {},
                        "operator": "and"
                      },
                      "ifDefined": {},
                      "ifNotDefined": {}
                    },
                    "step": 1,
                    "value": {}
                  }
                ]
              ],
              "kind": "3d",
              "label": "label",
              "maskFrom": "maskFrom",
              "max": 0,
              "maxDuration": 0,
              "maxLength": 0,
              "maxSize": 0,
              "min": 0,
              "minLength": 0,
              "modelTypes": [
                "custom"
              ],
              "parent": true,
              "placeholder": "placeholder",
              "prompt": true,
              "promptSpark": true,
              "ref": {
                "conditional": [
                  "string"
                ],
                "equal": "equal",
                "name": "name",
                "node": "node"
              },
              "required": {
                "always": true,
                "conditional": {
                  "values": {},
                  "operator": "and"
                },
                "ifDefined": {},
                "ifNotDefined": {}
              },
              "step": 1,
              "value": {}
            }
          ],
          "items": [
            "string"
          ],
          "iterationIndex": 0,
          "jobId": "jobId",
          "logic": {
            "cases": [
              {
                "condition": "condition",
                "value": "value"
              }
            ],
            "default": "default",
            "transform": "transform"
          },
          "logicType": "if-else",
          "loopBodyNodeIds": [
            "string"
          ],
          "loopNodeId": "loopNodeId",
          "modelId": "modelId",
          "output": {},
          "workflowId": "workflowId"
        }
      ],
      "hint": "hint",
      "input": {
        "foo": "bar"
      },
      "output": {
        "foo": "bar"
      },
      "outputModelId": "outputModelId",
      "workflowId": "workflowId",
      "workflowJobId": "workflowJobId"
    },
    "progress": 0,
    "status": "canceled",
    "statusHistory": [
      {
        "date": "date",
        "status": "canceled"
      }
    ],
    "updatedAt": "updatedAt",
    "authorId": "authorId",
    "billing": {
      "cuCost": 0,
      "cuDiscount": 0,
      "cuCostDetails": {
        "ip-detection": 0,
        "quality-gate": 0
      },
      "disableRefund": true
    },
    "ownerId": "ownerId"
  }
}
```
