Superb AI Image Assets API

The image_assets API from Superb AI — 10 operation(s) for image_assets.

Operations 10

POST /tenants/{slug}/datasets/images/{dataset_id}/assets/upload-init Upload Init #
POST /tenants/{slug}/datasets/images/{dataset_id}/assets/upload-init/batch Upload Init Batch #
POST /tenants/{slug}/datasets/images/{dataset_id}/assets/upload-init/{upload_id}/complete Upload Complete #
GET /tenants/{slug}/datasets/images/{dataset_id}/assets List Assets #
GET /tenants/{slug}/datasets/images/{dataset_id}/assets/{asset_id} Get Asset #
GET /tenants/{slug}/datasets/images/{dataset_id}/assets/{asset_id}/download-url Get Asset Download Url #
GET /tenants/{slug}/datasets/images/{dataset_id}/assets/{asset_id}/thumbnail-url Get Asset Thumbnail Url #
POST /tenants/{slug}/datasets/images/{dataset_id}/assets/search Search Assets #
POST /tenants/{slug}/datasets/images/{dataset_id}/assets/bulk-delete Bulk Delete #
POST /tenants/{slug}/datasets/images/{dataset_id}/assets/batch-delete Batch Delete Image Assets #

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/superb-ai-image-assets-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

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

OpenAPI Specification

superb-ai-image-assets-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: MLOps Platform Image Assets API
  description: Multi-tenant labeling-platform backend.
  version: 0.1.0
tags:
- name: image_assets
paths:
  /tenants/{slug}/datasets/images/{dataset_id}/assets/upload-init:
    post:
      tags:
      - image_assets
      summary: Upload Init
      operationId: image_assets-upload_init
      security:
      - HTTPBearer: []
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssetUploadInitRequest'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/AssetUploadInitSinglePartResponse'
                - $ref: '#/components/schemas/AssetUploadInitMultipartResponse'
                discriminator:
                  propertyName: upload_type
                  mapping:
                    single: '#/components/schemas/AssetUploadInitSinglePartResponse'
                    multipart: '#/components/schemas/AssetUploadInitMultipartResponse'
                title: Response Image Assets-Upload Init
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets/upload-init/batch:
    post:
      tags:
      - image_assets
      summary: Upload Init Batch
      description: 'Fan-out of `/upload-init` for SDK / CLI ingest workflows: the caller passes up to 100 files, the server returns one presigned URL per file. Slashes the per-file RPC count by ~100×, which is the dominant cost when ingesting a folder of small images.


        Per-file failures (wrong MIME, oversized, etc.) are returned with `upload_type=''error''` instead of failing the whole batch — the client maps responses back to inputs via `client_ref` and retries or skips individual items.


        Files larger than the multipart threshold return `error_code=''USE_PER_FILE_INIT''`; the caller falls back to the regular `/upload-init` for those (multipart needs per-part presigning that doesn''t fit a batch shape).


        **`X-Upload-Session-Id` header (optional, ADR-0039)**: pass a UUID and the server uses it as the rollup correlation_id for every file in this call. SDK clients reuse one UUID across all chunks of one logical `upload()` invocation so the activity feed shows a single *"uploaded N assets"* row instead of one row per 100-file chunk. When omitted, the server mints a fresh UUID per call (current default; backwards compatible).'
      operationId: image_assets-upload_init_batch
      security:
      - HTTPBearer: []
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      - name: X-Upload-Session-Id
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: X-Upload-Session-Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssetUploadInitBatchRequest'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetUploadInitBatchResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets/upload-init/{upload_id}/complete:
    post:
      tags:
      - image_assets
      summary: Upload Complete
      operationId: image_assets-upload_complete
      security:
      - HTTPBearer: []
      parameters:
      - name: upload_id
        in: path
        required: true
        schema:
          type: string
          minLength: 1
          title: Upload Id
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssetUploadCompleteRequest'
      responses:
        '204':
          description: Successful Response
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets:
    get:
      tags:
      - image_assets
      summary: List Assets
      operationId: image_assets-list_assets
      security:
      - HTTPBearer: []
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 1
          description: Max rows per page.
          default: 50
          title: Limit
        description: Max rows per page.
      - name: cursor
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Opaque pagination cursor from a previous response's `next_cursor`; omit for the first page.
          title: Cursor
        description: Opaque pagination cursor from a previous response's `next_cursor`; omit for the first page.
      - name: q
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            minLength: 1
            maxLength: 255
          - type: 'null'
          description: Case-insensitive substring search (min 1 char). Wildcards are matched literally.
          title: Q
        description: Case-insensitive substring search (min 1 char). Wildcards are matched literally.
      - name: uploaded_by
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            format: uuid
          - type: 'null'
          description: Filter to assets uploaded by this user.
          title: Uploaded By
        description: Filter to assets uploaded by this user.
      - name: created_at_from
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          description: Inclusive lower bound (>=) on `created_at` (ISO-8601).
          title: Created At From
        description: Inclusive lower bound (>=) on `created_at` (ISO-8601).
      - name: created_at_to
        in: query
        required: false
        schema:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          description: Exclusive upper bound (<) on `created_at` (ISO-8601).
          title: Created At To
        description: Exclusive upper bound (<) on `created_at` (ISO-8601).
      - name: status
        in: query
        required: false
        schema:
          anyOf:
          - $ref: '#/components/schemas/AssetStatus'
          - type: 'null'
          description: Filter on asset processing `status` (e.g. 'ready'). Exact match.
          title: Status
        description: Filter on asset processing `status` (e.g. 'ready'). Exact match.
      - name: content_type
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter on MIME `content_type` (e.g. 'image/jpeg'). Exact match.
          title: Content Type
        description: Filter on MIME `content_type` (e.g. 'image/jpeg'). Exact match.
      - name: embedding_status
        in: query
        required: false
        schema:
          anyOf:
          - $ref: '#/components/schemas/EmbeddingStatus'
          - type: 'null'
          description: Filter on `embedding_status` ('pending' / 'ready'). Use `pending` to list assets the next /embed pass will pick up.
          title: Embedding Status
        description: Filter on `embedding_status` ('pending' / 'ready'). Use `pending` to list assets the next /embed pass will pick up.
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: CSV. `projects` → `[{id,name}]` per asset; `thumbnail_url` → presigned thumbnail URL per asset (saves the per-asset round trip in grid views).
          title: Include
        description: CSV. `projects` → `[{id,name}]` per asset; `thumbnail_url` → presigned thumbnail URL per asset (saves the per-asset round trip in grid views).
      - name: include_total
        in: query
        required: false
        schema:
          type: boolean
          description: When true, response carries `total` = COUNT(*) for the same filter (ignores cursor/limit). ~150ms extra at the 1M-row dataset cap; opt in only when the FE needs a 'showing X of Y' header.
          default: false
          title: Include Total
        description: When true, response carries `total` = COUNT(*) for the same filter (ignores cursor/limit). ~150ms extra at the 1M-row dataset cap; opt in only when the FE needs a 'showing X of Y' header.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetPage'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets/{asset_id}:
    get:
      tags:
      - image_assets
      summary: Get Asset
      operationId: image_assets-get_asset
      security:
      - HTTPBearer: []
      parameters:
      - name: asset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Asset Id
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets/{asset_id}/download-url:
    get:
      tags:
      - image_assets
      summary: Get Asset Download Url
      description: 'Presigned GET URL for the asset''s S3 object. 1-hour expiry.

        Used by the labeling app to render the image on canvas.'
      operationId: image_assets-get_asset_download_url
      security:
      - HTTPBearer: []
      parameters:
      - name: asset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Asset Id
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetDownloadUrl'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets/{asset_id}/thumbnail-url:
    get:
      tags:
      - image_assets
      summary: Get Asset Thumbnail Url
      description: 'Presigned GET URL for the 320px-long-edge JPEG thumbnail (ADR-0026).

        Returns 404 if the thumbnail wasn''t generated (extraction soft-failed, or

        the asset was uploaded pre-feature). FE should fall back to /download-url

        on 404.'
      operationId: image_assets-get_asset_thumbnail_url
      security:
      - HTTPBearer: []
      parameters:
      - name: asset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Asset Id
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetDownloadUrl'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets/search:
    post:
      tags:
      - image_assets
      summary: Search Assets
      description: 'Multimodal similarity search over the dataset''s embedded assets (ADR-0033).


        Top-K (default 50, max 200), no pagination. Filters AND the vector ranking

        — items that don''t match the filters are excluded even if visually identical.

        Only assets with `embedding_status = ''ready''` participate; unembedded assets

        are skipped.


        `query.parts` is an ordered list of {text|image_uri|asset_id} blocks; the

        model accepts mixed inputs in one query. `query.instruction` is optional

        (server picks a default per dataset kind; must be English for the

        retrieval-quality boost — ADR-0033).'
      operationId: image_assets-search_assets
      security:
      - HTTPBearer: []
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      - name: include
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: CSV. `thumbnail_url` → presigned 320px-thumbnail GET per hit; `image_url` → full-res presigned GET per hit. Render the whole results grid in one round trip instead of a per-hit /thumbnail-url|/download-url fetch.
          title: Include
        description: CSV. `thumbnail_url` → presigned 320px-thumbnail GET per hit; `image_url` → full-res presigned GET per hit. Render the whole results grid in one round trip instead of a per-hit /thumbnail-url|/download-url fetch.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets/bulk-delete:
    post:
      tags:
      - image_assets
      summary: Bulk Delete
      operationId: image_assets-bulk_delete
      security:
      - HTTPBearer: []
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      - name: Idempotency-Key
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Idempotency-Key
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkOpRequest'
      responses:
        '202':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /tenants/{slug}/datasets/images/{dataset_id}/assets/batch-delete:
    post:
      tags:
      - image_assets
      summary: Batch Delete Image Assets
      description: 'Sync counterpart to `/bulk-delete`. Selection-driven: `asset_ids` only. Cap `MAX_SYNC_BATCH_SIZE = 1000`. Hard-deletes via the central `hard_delete_assets` helper (ADR-0051); idempotent. ADR-0041.'
      operationId: image_assets-batch_delete_image_assets
      security:
      - HTTPBearer: []
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          title: Slug
      - name: dataset_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Dataset Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssetsBatchDeleteRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetsBatchDeleteResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '401':
          description: Unauthenticated — missing, malformed, or expired Bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Authenticated but not authorized for this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in this tenant
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict — resource state prevents this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate-limited (per-tenant token bucket)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    AssetUploadInitMultipartResponse:
      properties:
        upload_type:
          type: string
          const: multipart
          title: Upload Type
          default: multipart
        s3_key:
          type: string
          title: S3 Key
        upload_id:
          type: string
          title: Upload Id
        parts:
          items:
            $ref: '#/components/schemas/MultipartPartUrl'
          type: array
          title: Parts
        expires_at:
          type: string
          format: date-time
          title: Expires At
      type: object
      required:
      - s3_key
      - upload_id
      - parts
      - expires_at
      title: AssetUploadInitMultipartResponse
    ErrorResponse:
      type: object
      required:
      - error
      properties:
        error:
          type: object
          required:
          - code
          - message
          properties:
            code:
              $ref: '#/components/schemas/ErrorCode'
            message:
              type: string
              description: Human-readable; free to evolve. Don't pattern-match on this.
            hint:
              type: string
              nullable: true
              description: When present, a concrete next step (often references a CLI command).
            details:
              type: object
              nullable: true
              description: Per-`code` structured payload; schema documented per code.
            request_id:
              type: string
              nullable: true
              description: Correlation id for support / log lookups.
    AssetUploadInitBatchItem:
      properties:
        client_ref:
          type: string
          maxLength: 512
          minLength: 1
          title: Client Ref
          description: Opaque caller-supplied token echoed back on the matching response item
        filename:
          type: string
          maxLength: 512
          minLength: 1
          title: Filename
          description: Original file name
        size_bytes:
          type: integer
          exclusiveMinimum: 0.0
          title: Size Bytes
          description: Declared size; validated against per-format max
        content_type:
          type: string
          maxLength: 128
          minLength: 1
          title: Content Type
          description: MIME; validated against the kind's accepted list (ADR-0017)
      type: object
      required:
      - client_ref
      - filename
      - size_bytes
      - content_type
      title: AssetUploadInitBatchItem
      description: 'One file in a batch upload-init request. `client_r

# --- truncated at 32 KB (54 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/superb-ai/refs/heads/main/openapi/superb-ai-image-assets-api-openapi.yml