diff --git a/openapi.yaml b/openapi.yaml
index 82ff5b003..2446e64e4 100644
--- a/openapi.yaml
+++ b/openapi.yaml
@@ -673,6 +673,35 @@ components:
- created_at
- updated_at
type: object
+ JobsCancelRequest:
+ additionalProperties: false
+ description: Request to cancel multiple jobs by ID.
+ properties:
+ job_ids:
+ description: Job identifiers (UUIDs) to cancel.
+ items:
+ format: uuid
+ type: string
+ maxItems: 100
+ minItems: 1
+ type: array
+ required:
+ - job_ids
+ type: object
+ JobsCancelResponse:
+ description: Response for POST /api/jobs/cancel.
+ properties:
+ cancelled:
+ description: |
+ Job IDs for which a cancel event was successfully dispatched by this
+ call. Jobs already in a terminal or cancelling state are idempotently
+ skipped and will not appear here.
+ items:
+ type: string
+ type: array
+ required:
+ - cancelled
+ type: object
JobsListResponse:
description: Paginated list of jobs for the authenticated user.
properties:
@@ -1006,7 +1035,7 @@ components:
description: If true, clear all pending jobs from the queue
type: boolean
delete:
- description: Array of PENDING job IDs to cancel
+ description: Array of job IDs to cancel; pending and running jobs transition to cancelled
items:
type: string
type: array
@@ -1822,6 +1851,83 @@ paths:
summary: Update asset metadata
tags:
- file
+ /api/assets/{id}/content:
+ get:
+ description: |
+ Returns the binary content of an asset by ID.
+
+ The contract is the same across runtimes — "GET this path and you
+ receive the asset's bytes" — but the mechanism differs:
+ - **Local ComfyUI** streams the bytes directly (`200`,
+ `application/octet-stream`).
+ - **Cloud** does not proxy large files; it responds `302` with a
+ `Location` redirect to a short-lived signed storage URL. Clients that
+ follow redirects (browsers, `fetch`/XHR, `
`/`