Superb AI Projects Workflow API
The projects-workflow API from Superb AI — 15 operation(s) for projects-workflow.
The projects-workflow API from Superb AI — 15 operation(s) for projects-workflow.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/superb-ai-projects-workflow-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: 3.2.0
info:
title: MLOps Platform Projects Workflow API
description: Multi-tenant labeling-platform backend.
version: 0.1.0
tags:
- name: projects-workflow
paths:
/tenants/{slug}/projects/{project_id}/assets/{asset_id}/claim:
post:
tags:
- projects-workflow
summary: Claim Asset
description: 'Labeler claims a to_label task for themselves.
Allowed when the project''s `assignment_mode=''self_claim''` AND the task is
not already assigned to someone else. In `manual` mode, only the assigned
labeler can claim — and they get there via /assign first.'
operationId: projects-workflow-claim_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: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStateResponse'
'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}/projects/{project_id}/assets/{asset_id}/assign:
post:
tags:
- projects-workflow
summary: Assign Asset
description: 'Manager assigns a task to a specific user. The user must be a project
member with role labeler/reviewer/manager (anyone who can label).'
operationId: projects-workflow-assign_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: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AssignRequest'
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStateResponse'
'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}/projects/{project_id}/assets/{asset_id}/unassign:
post:
tags:
- projects-workflow
summary: Unassign Asset
description: 'Manager clears the current assignee. If the row is `in_progress`,
status reverts to `to_label`. No-op (skipped) when already unassigned.'
operationId: projects-workflow-unassign_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: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStateResponse'
'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}/projects/{project_id}/assets/{asset_id}/submit:
post:
tags:
- projects-workflow
summary: Submit Asset
description: Labeler submits their work for review. Must be the assigned labeler.
operationId: projects-workflow-submit_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: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStateResponse'
'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}/projects/{project_id}/assets/{asset_id}/approve:
post:
tags:
- projects-workflow
summary: Approve Asset
operationId: projects-workflow-approve_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: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStateResponse'
'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}/projects/{project_id}/assets/{asset_id}/reject:
post:
tags:
- projects-workflow
summary: Reject Asset
description: Reviewer rejects work — auto-routes back to the original labeler.
operationId: projects-workflow-reject_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: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RejectRequest'
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStateResponse'
'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}/projects/{project_id}/assets/{asset_id}/skip:
post:
tags:
- projects-workflow
summary: Skip Asset
description: 'Labeler sets the asset aside — ''nothing to label'' or unusable data (ADR-0110).
Terminal `skipped` state, distinct from a done label. No reason captured (the
skip guide is looser; labeler judgment is trusted). Waives required
classifications — skip means there''s nothing to answer, including no scene.'
operationId: projects-workflow-skip_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: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStateResponse'
'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}/projects/{project_id}/assets/{asset_id}/reopen:
post:
tags:
- projects-workflow
summary: Reopen Asset
description: 'Reviewer/manager revives a skipped asset back into the queue (ADR-0110) —
e.g. when data is scarce and a set-aside asset must be labeled after all.'
operationId: projects-workflow-reopen_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: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStateResponse'
'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}/projects/{project_id}/queue:
get:
tags:
- projects-workflow
summary: Get My Queue
description: 'Labeler''s queue: tasks they should work on now.
- Their assigned in_progress / to_label tasks
- In `self_claim` mode, also unassigned to_label tasks (claimable)
Optional `?status=` and `?rework=` filters power the 4-card hero UX
(All / New / Rework / Continue) per ADR-0029.'
operationId: projects-workflow-get_my_queue
security:
- HTTPBearer: []
parameters:
- name: slug
in: path
required: true
schema:
type: string
title: Slug
- name: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project 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: status
in: query
required: false
schema:
anyOf:
- enum:
- to_label
- in_progress
type: string
- type: 'null'
description: 'Optional: `to_label` or `in_progress`. Maps the FE 4-card hero (per ADR-0029).'
title: Status
description: 'Optional: `to_label` or `in_progress`. Maps the FE 4-card hero (per ADR-0029).'
- name: rework
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
description: 'Optional: `true` filters to `rework_count > 0`; `false` to `rework_count = 0`. Combine with `status=in_progress` for the Rework / Continue split.'
title: Rework
description: 'Optional: `true` filters to `rework_count > 0`; `false` to `rework_count = 0`. Combine with `status=in_progress` for the Rework / Continue split.'
- name: include
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'CSV: `thumbnail_url` to embed a presigned thumbnail URL on each row''s `asset.thumbnail_url`. Unknown values → 400.'
title: Include
description: 'CSV: `thumbnail_url` to embed a presigned thumbnail URL on each row''s `asset.thumbnail_url`. Unknown values → 400.'
- name: include_total
in: query
required: false
schema:
type: boolean
description: When true, response carries `total` = COUNT(*) for the same filter (ignores cursor/limit). `/queue/stats` is the cheaper choice for the unfiltered hero counts.
default: false
title: Include Total
description: When true, response carries `total` = COUNT(*) for the same filter (ignores cursor/limit). `/queue/stats` is the cheaper choice for the unfiltered hero counts.
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AssetStatePage'
'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}/projects/{project_id}/queue/stats:
get:
tags:
- projects-workflow
summary: Queue Stats
description: 'Bucket counts for the labeler''s 4-card hero (ADR-0029).
Scoped to the caller''s queue (their assigned tasks + the unassigned pool
when `assignment_mode=self_claim`). Same scoping rules as `/queue`.'
operationId: projects-workflow-queue_stats
security:
- HTTPBearer: []
parameters:
- name: slug
in: path
required: true
schema:
type: string
title: Slug
- name: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/QueueStatsResponse'
'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}/projects/{project_id}/assets:
get:
tags:
- projects-workflow
summary: List Asset States
description: 'Paginated list of asset states across the project (manager dashboard).
`?q=` matches the asset filename; `?tags=` is contains-ALL over the
per-(project,asset) tag set (ADR-0050); `?classes=` is ANY-of over the asset''s
live annotations (ADR-0100). Each has a negative twin (`tags_none`,
`classes_none`, `status_not`, plus the `assigned`/`tagged` tri-states) that
composes by AND — "all of these, except those" (ADR-0115).'
operationId: projects-workflow-list_asset_states
security:
- HTTPBearer: []
parameters:
- name: slug
in: path
required: true
schema:
type: string
title: Slug
- name: project_id
in: path
required: true
schema:
type: string
format: uuid
title: Project 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: status
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/WorkflowStatus'
- type: 'null'
description: Filter to a single `WorkflowStatus` (`to_label`, `in_progress`, `in_review`, `done`). Unknown values → 422.
title: Status
description: Filter to a single `WorkflowStatus` (`to_label`, `in_progress`, `in_review`, `done`). Unknown values → 422.
- name: status_not
in: query
required: false
schema:
anyOf:
- type: array
items:
$ref: '#/components/schemas/WorkflowStatus'
- type: 'null'
description: Repeatable `?status_not=done&status_not=skipped` — exclude the listed statuses (ADR-0115). Unknown values → 422; a value repeated in `status` → 400.
title: Status Not
description: Repeatable `?status_not=done&status_not=skipped` — exclude the listed statuses (ADR-0115). Unknown values → 422; a value repeated in `status` → 400.
- name: assigned_to
in: query
required: false
schema:
anyOf:
- type: string
format: uuid
- type: 'null'
description: Filter to tasks assigned to a specific labeler (manager dashboard).
title: Assigned To
description: Filter to tasks assigned to a specific labeler (manager dashboard).
- name: assigned
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
description: '`true`: tasks assigned to anyone; `false`: the unassigned pool (ADR-0115). Contradictory with `assigned_to` when false (400).'
title: Assigned
description: '`true`: tasks assigned to anyone; `false`: the unassigned pool (ADR-0115). Contradictory with `assigned_to` when false (400).'
- name: reviewer_id
in: query
required: false
schema:
anyOf:
- type: string
format: uuid
- type: 'null'
description: Filter to tasks last reviewed by a specific reviewer.
title: Reviewer Id
description: Filter to tasks last reviewed by a specific reviewer.
- name: rework_count_min
in: query
required: false
schema:
anyOf:
- type: integer
minimum: 1
- type: 'null'
description: Filter to tasks with `rework_count >= N`. Useful for QA queues.
title: Rework Count Min
description: Filter to tasks with `rework_count >= N`. Useful for QA queues.
- name: tags
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
- type: 'null'
description: 'Repeatable `?tags=a&tags=b`. Contains-ALL: matches rows whose tag set includes every listed value (ADR-0050).'
title: Tags
description: 'Repeatable `?tags=a&tags=b`. Contains-ALL: matches rows whose tag set includes every listed value (ADR-0050).'
- name: tags_none
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
- type: 'null'
description: Repeatable `?tags_none=a&tags_none=b`. Excludes rows carrying ANY listed tag (untagged rows match). Combine with `tags` for “all of these, except those” (ADR-0115). A value repeated in `tags` → 400.
title: Tags None
description: Repeatable `?tags_none=a&tags_none=b`. Excludes rows carrying ANY listed tag (untagged rows match). Combine with `tags` for “all of these, except those” (ADR-0115). A value repeated in `tags` → 400.
- name: tagged
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
description: '`true`: rows with at least one tag; `false`: untagged rows. Contradictory with `tags` when false (400).'
title: Tagged
description: '`true`: rows with at least one tag; `false`: untagged rows. Contradictory with `tags` when false (400).'
- name: classes
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
format: uuid
- type: 'null'
description: 'Repeatable `?classes=a&classes=b`. ANY-of: matches assets carrying at least one annotation of any listed class (ADR-0100). Unknown class ids match nothing.'
title: Classes
description: 'Repeatable `?classes=a&classes=b`. ANY-of: matches assets carrying at least one annotation of any listed class (ADR-0100). Unknown class ids match nothing.'
# --- truncated at 32 KB (83 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/superb-ai/refs/heads/main/openapi/superb-ai-projects-workflow-api-openapi.yml