/oauth/callback/{kind}. Unauthenticated —
identity comes from the HMAC-signed state param. Browsers get 302 redirects
on both success and failure; only Accept: application/json requests get
4xx JSON.
name: o-auth-callback-controller
- description: Redacted production configuration facts
name: Configuration Readiness
- description: Identity provider discovery (public)
name: Auth discovery
- description: Read-only access to practice evaluation results
name: Practice Results
- description: Global contributor information
name: Contributors
- description: User preferences
name: Account
- description: Instance-admin login provider management
name: Admin
- description: Per-workspace Slack channel consent + activation
name: Slack channel activation
- description: "Sign-in, refresh and sign-out for installed clients"
name: Client session
- description: Workspace-scoped per-purpose agent configuration
name: Agents
- description: The current developer's standing in each practice group
name: Practice Group Standings
- description: Asking for a review of a piece of work by hand
name: Practice review requests
- description: Current account transparency and research consent
name: Consent
- description: Adopt instance catalog practices into a workspace
name: Practice Catalog Adoption
- description: Team management within workspace
name: Teams
- description: Instance-wide email transport verification
name: Instance Email
- description: "Workspace-scoped \"bring your own\" AI provider connections, models\
\ and settings"
name: Workspace LLM
- description: Active sessions
name: Account
- description: |-
GitLab-specific REST endpoints used during the workspace creation wizard. Gated on the
GITLAB_WORKSPACE_CREATION feature flag.
name: git-lab-preflight-controller
- description: Instance-admin LLM connection and settings management
name: Admin LLM
- description: Public JWK set for verifying Hephaestus session JWTs
name: Auth discovery
- description: Workspace-scoped team settings management
name: Team Settings
- description: Repository contributions and open work
name: Activity
- description: Integration sync observability and manual controls
name: Sync
- description: "Current user identity, linked accounts, deletion"
name: Account
paths:
/.well-known/jwks.json:
get:
operationId: getJwks
responses:
"200":
content:
application/json:
schema:
type: object
additionalProperties: {}
description: OK
summary: JWK set (public keys only)
tags:
- Auth discovery
/admin/audit:
get:
operationId: adminListAuthEvents
parameters:
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 50
- in: query
name: accountId
required: false
schema:
type: integer
format: int64
- in: query
name: actingAccountId
required: false
schema:
type: integer
format: int64
- in: query
name: eventType
required: false
schema:
type: array
items:
type: string
enum:
- USER_VIEW
- LOGIN
- LOGIN_FAILED
- LOGOUT
- TOKEN_REFRESH
- JWT_REVOKED
- IDENTITY_LINKED
- IDENTITY_UNLINKED
- IMPERSONATION_BEGIN
- IMPERSONATION_END
- ACCOUNT_DELETED
- EXPORT_REQUESTED
- PERSON_DATA_PREVIEWED
- PERSON_DATA_EXPORTED
- PERSON_DATA_ERASURE_REQUESTED
- APP_ROLE_CHANGED
- RESEARCH_CONSENT_REVOKED
- WORKSPACE_ELEVATION
- LLM_CONNECTION_CREATED
- LLM_CONNECTION_UPDATED
- LLM_CONNECTION_DELETED
- LLM_MODEL_CREATED
- LLM_MODEL_UPDATED
- LLM_MODEL_DELETED
- LLM_MODEL_PRICE_CHANGED
- LLM_MODEL_SHARING_CHANGED
- LLM_SETTINGS_CHANGED
- LOGIN_PROVIDER_CREATED
- LOGIN_PROVIDER_UPDATED
- LOGIN_PROVIDER_DELETED
- SILENT_MODE_CHANGED
- PUBLIC_ACTIVITY_CHANGED
- in: query
name: result
required: false
schema:
type: array
items:
type: string
enum:
- SUCCESS
- FAILURE
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOAuthEventView"
description: OK
summary: "List auth audit events (paged, newest first)"
tags:
- Admin
/admin/audit/export:
get:
operationId: adminExportAuthEvents
parameters:
- in: query
name: accountId
required: false
schema:
type: integer
format: int64
- in: query
name: actingAccountId
required: false
schema:
type: integer
format: int64
- in: query
name: eventType
required: false
schema:
type: array
items:
type: string
enum:
- USER_VIEW
- LOGIN
- LOGIN_FAILED
- LOGOUT
- TOKEN_REFRESH
- JWT_REVOKED
- IDENTITY_LINKED
- IDENTITY_UNLINKED
- IMPERSONATION_BEGIN
- IMPERSONATION_END
- ACCOUNT_DELETED
- EXPORT_REQUESTED
- PERSON_DATA_PREVIEWED
- PERSON_DATA_EXPORTED
- PERSON_DATA_ERASURE_REQUESTED
- APP_ROLE_CHANGED
- RESEARCH_CONSENT_REVOKED
- WORKSPACE_ELEVATION
- LLM_CONNECTION_CREATED
- LLM_CONNECTION_UPDATED
- LLM_CONNECTION_DELETED
- LLM_MODEL_CREATED
- LLM_MODEL_UPDATED
- LLM_MODEL_DELETED
- LLM_MODEL_PRICE_CHANGED
- LLM_MODEL_SHARING_CHANGED
- LLM_SETTINGS_CHANGED
- LOGIN_PROVIDER_CREATED
- LOGIN_PROVIDER_UPDATED
- LOGIN_PROVIDER_DELETED
- SILENT_MODE_CHANGED
- PUBLIC_ACTIVITY_CHANGED
- in: query
name: result
required: false
schema:
type: array
items:
type: string
enum:
- SUCCESS
- FAILURE
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
responses:
"200":
content:
text/csv:
schema:
type: string
description: OK
summary: "Export the filtered audit log as CSV (newest first, capped)"
tags:
- Admin
/admin/config-audit:
get:
operationId: adminListConfigAuditEvents
parameters:
- in: query
name: workspaceId
required: false
schema:
type: integer
format: int64
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 50
- in: query
name: entityType
required: false
schema:
type: array
items:
type: string
enum:
- PRACTICE_REVIEW_SETTINGS
- AGENT_BINDING
- AGENT_CONFIG
- AI_CONFIG_BINDING
- WORKSPACE_ROLE
- ACTIVITY_AUTOMATION
- WORKSPACE_FEATURES
- WORKSPACE_STATUS
- WORKSPACE_TOKEN
- WORKSPACE_VISIBILITY
- PRACTICE_ACTIVE
- PRACTICE_USAGE
- PRACTICE_DEFINITION
- PRACTICE_GROUP
- CATALOG_PRACTICE
- CATALOG_GROUP
- WORKSPACE_INSTANCE_LLM_BUDGET
- WORKSPACE_OWN_PROVIDER_LLM_BUDGET
- WORKSPACE_LLM_BUDGET
- WORKSPACE_BYO_LLM_BUDGET
- REVIEW_BATCH
- REVIEW_SCHEDULE
- FEEDBACK_DELIVERY_RECHECK
- WORKSPACE_LLM_CONNECTION
- WORKSPACE_LLM_MODEL
- in: query
name: entityId
required: false
schema:
type: string
- in: query
name: changedKey
required: false
schema:
type: string
- in: query
name: action
required: false
schema:
type: array
items:
type: string
enum:
- CREATED
- UPDATED
- DELETED
- in: query
name: actorId
required: false
schema:
type: integer
format: int64
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOConfigAuditEntryView"
description: OK
summary: "List admin configuration changes across workspaces (paged, newest\
\ first)"
tags:
- Admin
/admin/configuration-readiness:
get:
operationId: adminGetConfigurationReadiness
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ConfigurationFact"
description: OK
summary: Get redacted configuration readiness
tags:
- Configuration Readiness
/admin/email/test:
post:
description: "Sends a test email through the configured relay to the given address,\
\ or to the caller's verified address when none is given."
operationId: adminSendTestEmail
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/EmailTestRequest"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/EmailTestResponse"
description: Email delivery outcome
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Malformed request or invalid recipient address
summary: Send a test email
tags:
- Instance Email
/admin/llm/connections:
get:
operationId: adminListLlmConnections
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/LlmConnection"
description: OK
summary: List LLM connections
tags:
- Admin LLM
post:
operationId: adminCreateLlmConnection
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateLlmConnectionRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmConnection"
description: Connection created; URL in the Location header
"409":
description: An LLM connection with this slug already exists
summary: Create an LLM connection
tags:
- Admin LLM
/admin/llm/connections/probe:
post:
operationId: adminProbeLlmConnectionDraft
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ProbeLlmConnectionRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmProbeResult"
description: OK
summary: Test a draft connection and fetch its models
tags:
- Admin LLM
/admin/llm/connections/{connectionId}/models:
post:
operationId: adminCreateLlmModel
parameters:
- in: path
name: connectionId
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateLlmModelRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmModel"
description: Model created; URL in the Location header
"404":
description: LLM connection not found
"409":
description: A model with this slug or upstream model id already exists
on the connection
summary: Create a model on an LLM connection
tags:
- Admin LLM
/admin/llm/connections/{id}:
delete:
operationId: adminDeleteLlmConnection
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"204":
description: Connection deleted
"404":
description: LLM connection not found
"409":
description: Cannot delete a connection still referenced by one or more
models
summary: Delete an LLM connection
tags:
- Admin LLM
get:
operationId: adminGetLlmConnection
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmConnection"
description: OK
"404":
description: LLM connection not found
summary: Get an LLM connection
tags:
- Admin LLM
patch:
operationId: adminUpdateLlmConnection
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateLlmConnectionRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmConnection"
description: OK
"404":
description: LLM connection not found
summary: Update an LLM connection
tags:
- Admin LLM
/admin/llm/connections/{id}/probe:
post:
operationId: adminProbeLlmConnection
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmProbeResult"
description: OK
summary: Test a stored connection and fetch its models
tags:
- Admin LLM
/admin/llm/models:
get:
operationId: adminListLlmModels
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/LlmModel"
description: OK
summary: List LLM catalog models
tags:
- Admin LLM
/admin/llm/models/{id}:
delete:
operationId: adminDeleteLlmModel
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"204":
description: Model deleted
"404":
description: LLM model not found
"409":
description: Cannot delete a model still bound to an agent configuration
summary: Delete an LLM catalog model
tags:
- Admin LLM
get:
operationId: adminGetLlmModel
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmModel"
description: OK
"404":
description: LLM model not found
summary: Get an LLM catalog model
tags:
- Admin LLM
patch:
operationId: adminUpdateLlmModel
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateLlmModelRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmModel"
description: OK
"404":
description: LLM model not found
"409":
description: Another model on the connection already uses this upstream
model id
summary: Update a model's metadata
tags:
- Admin LLM
/admin/llm/models/{id}/price:
put:
operationId: adminUpdateLlmModelPrice
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateLlmModelPriceRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmModel"
description: OK
"404":
description: LLM model not found
summary: Reprice a model
tags:
- Admin LLM
/admin/llm/models/{id}/sharing:
put:
operationId: adminUpdateLlmModelSharing
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateLlmModelSharingRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LlmModel"
description: OK
"404":
description: LLM model not found
summary: Share a model with all or selected workspaces
tags:
- Admin LLM
/admin/llm/settings:
get:
operationId: adminGetLlmSettings
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/InstanceLlmSettings"
description: OK
summary: Get instance-wide LLM governance settings
tags:
- Admin LLM
put:
operationId: adminUpdateLlmSettings
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateInstanceLlmSettingsRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/InstanceLlmSettings"
description: OK
summary: Update instance-wide LLM governance settings
tags:
- Admin LLM
/admin/llm/usage:
get:
operationId: adminGetLlmUsageReport
parameters:
- in: query
name: month
required: false
schema:
type: string
pattern: "\\d{4}-(0[1-9]|1[0-2])"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/AdminLlmUsageReport"
description: OK
summary: Per-workspace LLM spend rollup for one month (all workspaces)
tags:
- Admin
/admin/login-providers:
get:
operationId: adminListLoginProviders
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/LoginProviderView"
description: OK
summary: List login providers
tags:
- Admin
post:
operationId: adminCreateLoginProvider
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateLoginProviderRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/LoginProviderView"
description: Login provider created; URL in the Location header
summary: Create a login provider
tags:
- Admin
/admin/login-providers/{registrationId}:
delete:
operationId: adminDeleteLoginProvider
parameters:
- in: path
name: registrationId
required: true
schema:
type: string
responses:
"200":
description: OK
summary: Delete a login provider
tags:
- Admin
patch:
operationId: adminUpdateLoginProvider
parameters:
- in: path
name: registrationId
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateLoginProviderRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LoginProviderView"
description: OK
summary: Update a login provider
tags:
- Admin
/admin/person-data/preview:
post:
operationId: adminPreviewPersonData
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/PreviewRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PersonDataRequest"
description: OK
summary: Resolve exact identities and preview every personal-data store
tags:
- Person Data
/admin/person-data/providers:
get:
operationId: adminListPersonDataProviders
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PersonDataProvider"
description: OK
summary: List exact provider instances without credentials
tags:
- Person Data
/admin/person-data/{id}:
get:
operationId: adminGetPersonDataRequest
parameters:
- in: path
name: id
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PersonDataRequest"
description: OK
summary: Get a person-data preview or erasure receipt
tags:
- Person Data
/admin/person-data/{id}/erase:
post:
operationId: adminErasePersonData
parameters:
- in: path
name: id
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ErasureRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PersonDataRequest"
description: OK
summary: Start or resume the preview's audited erasure job
tags:
- Person Data
/admin/person-data/{id}/export:
post:
operationId: adminExportPersonData
parameters:
- in: path
name: id
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
type: string
format: binary
description: JSON file
summary: Download the preview's frozen scope as one JSON file
tags:
- Person Data
/admin/practice-catalog:
get:
operationId: getInstanceCatalog
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Catalog"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/definition-options:
get:
operationId: getInstanceDefinitionOptions
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeDefinitionOptions"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/groups:
post:
operationId: createCatalogGroup
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroupInput"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroup"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/groups/reorder:
patch:
operationId: reorderCatalogGroups
parameters:
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ReorderRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Catalog"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/groups/{slug}:
get:
operationId: getCatalogGroup
parameters:
- in: path
name: slug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroup"
description: OK
tags:
- catalog-admin
put:
operationId: updateCatalogGroup
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroupUpdate"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroup"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/groups/{slug}/override:
delete:
operationId: resetCatalogGroup
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroup"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/groups/{slug}/override/acknowledgement:
put:
operationId: acknowledgeCatalogGroup
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroup"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/groups/{slug}/status:
patch:
operationId: setCatalogGroupStatus
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SetCatalogStatusRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Catalog"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/order:
delete:
operationId: resetCatalogOrder
parameters:
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Catalog"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/practices:
post:
operationId: createCatalogPractice
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPracticeInput"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPractice"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/practices/{slug}:
get:
operationId: getCatalogPractice
parameters:
- in: path
name: slug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPractice"
description: OK
tags:
- catalog-admin
put:
operationId: updateCatalogPractice
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPracticeUpdate"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPractice"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/practices/{slug}/group:
patch:
operationId: moveCatalogPractice
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/MovePracticeRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Catalog"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/practices/{slug}/override:
delete:
operationId: resetCatalogPractice
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPractice"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/practices/{slug}/override/acknowledgement:
put:
operationId: acknowledgeCatalogPractice
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPractice"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/practices/{slug}/release:
get:
operationId: getCatalogPracticeRelease
parameters:
- in: path
name: slug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeReleaseProposal"
description: OK
tags:
- catalog-admin
put:
operationId: acceptCatalogPracticeRelease
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AcceptPracticeReleaseRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPractice"
description: OK
tags:
- catalog-admin
/admin/practice-catalog/practices/{slug}/status:
patch:
operationId: setCatalogPracticeStatus
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SetCatalogStatusRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPractice"
description: OK
tags:
- catalog-admin
/admin/product-feedback:
get:
operationId: adminListProductFeedback
parameters:
- in: query
name: status
required: false
schema:
type: string
default: OPEN
enum:
- OPEN
- RESOLVED
- ALL
- description: Zero-based page index (0..N)
in: query
name: page
required: false
schema:
type: integer
default: 0
minimum: 0
- description: The size of the page to be returned
in: query
name: size
required: false
schema:
type: integer
default: 50
minimum: 1
- description: "Sorting criteria in the format: property,(asc|desc). Default\
\ sort order is ascending. Multiple sort criteria are supported."
in: query
name: sort
required: false
schema:
type: array
items:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PagedModelFeedbackItem"
description: OK
summary: "List product feedback, newest first"
tags:
- feedback-admin
/admin/product-feedback/surveys:
get:
operationId: adminListProductSurveys
parameters:
- description: Zero-based page index (0..N)
in: query
name: page
required: false
schema:
type: integer
default: 0
minimum: 0
- description: The size of the page to be returned
in: query
name: size
required: false
schema:
type: integer
default: 50
minimum: 1
- description: "Sorting criteria in the format: property,(asc|desc). Default\
\ sort order is ascending. Multiple sort criteria are supported."
in: query
name: sort
required: false
schema:
type: array
default:
- "createdAt,DESC"
items:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PagedModelSurvey"
description: OK
summary: List product surveys with participation counts
tags:
- survey-admin
post:
operationId: adminCreateProductSurvey
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateSurvey"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Survey"
description: OK
summary: Publish a product survey
tags:
- survey-admin
/admin/product-feedback/surveys/{surveyId}:
delete:
operationId: adminDeleteProductSurvey
parameters:
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
responses:
"200":
description: OK
summary: Delete a survey and every response to it
tags:
- survey-admin
get:
operationId: adminGetProductSurvey
parameters:
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Survey"
description: OK
summary: Read one product survey
tags:
- survey-admin
put:
operationId: adminUpdateProductSurvey
parameters:
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SurveyEdit"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Survey"
description: OK
summary: "Edit a survey's title, purpose, schedule or pause state"
tags:
- survey-admin
/admin/product-feedback/surveys/{surveyId}/email-invitations:
get:
operationId: adminPreviewSurveyEmailInvitations
parameters:
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/SurveyEmailInvitationSummary"
description: OK
summary: Preview eligible survey email recipients and relay acceptance counts
tags:
- survey-admin
post:
operationId: adminSendSurveyEmailInvitations
parameters:
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SurveyEmailInvitationRequest"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/SurveyEmailInvitationSummary"
description: Invitation request summary
"503":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Email delivery is not configured; no invitations were requested
summary: Queue up to 1000 new or explicitly retried cancelled survey email invitations
tags:
- survey-admin
/admin/product-feedback/surveys/{surveyId}/responses:
get:
operationId: adminListProductSurveyResponses
parameters:
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
- description: Zero-based page index (0..N)
in: query
name: page
required: false
schema:
type: integer
default: 0
minimum: 0
- description: The size of the page to be returned
in: query
name: size
required: false
schema:
type: integer
default: 50
minimum: 1
- description: "Sorting criteria in the format: property,(asc|desc). Default\
\ sort order is ascending. Multiple sort criteria are supported."
in: query
name: sort
required: false
schema:
type: array
items:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PagedModelSurveyResponse"
description: OK
summary: "List responses and declines, newest first"
tags:
- survey-admin
/admin/product-feedback/surveys/{surveyId}/responses/export:
get:
operationId: adminExportProductSurveyResponses
parameters:
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
text/csv:
schema:
type: string
description: OK
summary: Export responses and declines as CSV
tags:
- survey-admin
/admin/product-feedback/surveys/{surveyId}/summary:
get:
operationId: adminGetProductSurveySummary
parameters:
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/SurveySummary"
description: OK
summary: Aggregate the responses per question
tags:
- survey-admin
/admin/product-feedback/{feedbackId}:
patch:
operationId: adminTriageProductFeedback
parameters:
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackTriage"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackItem"
description: OK
summary: Mark product feedback as resolved or reopen it
tags:
- feedback-admin
/admin/release:
get:
operationId: adminGetRelease
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReleaseStatus"
description: OK
summary: Get the running release and the last update check
tags:
- Instance Release
/admin/release/checks:
post:
operationId: adminCheckRelease
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReleaseStatus"
description: OK
summary: Check GitHub for a newer release now
tags:
- Instance Release
/admin/settings:
get:
operationId: adminGetInstanceSettings
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/InstanceSettings"
description: OK
summary: Get instance settings
tags:
- Instance Settings
/admin/settings/public-activity:
get:
operationId: getPublicActivityPolicy
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityPolicy"
description: OK
summary: Get the instance public activity policy
tags:
- public-activity-settings
put:
operationId: updatePublicActivityPolicy
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityPolicy"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityPolicy"
description: OK
summary: Allow or stop public activity pages
tags:
- public-activity-settings
/admin/settings/silent-mode:
patch:
operationId: adminUpdateSilentMode
parameters:
- description: Current settings ETag; required when releasing Silent Mode
in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateSilentModeRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/InstanceSettings"
description: Silent Mode updated
"412":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The supplied ETag is stale
"428":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: If-Match is required when releasing Silent Mode
summary: Engage or release the instance-wide silent mode
tags:
- Instance Settings
/admin/users:
get:
operationId: adminListUsers
parameters:
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 50
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/AdminAccountView"
description: OK
summary: List accounts (paged)
tags:
- Admin
/admin/users/{id}:
patch:
operationId: adminUpdateUser
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateAccountRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/AdminAccountView"
description: OK
summary: Update an account's app role
tags:
- Admin
/admin/users/{id}/sessions:
delete:
operationId: adminRevokeUserSessions
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/RevokeSessionsResult"
description: OK
summary: "Force sign-out: revoke all of an account's active sessions"
tags:
- Admin
/admin/workspaces:
get:
operationId: adminListWorkspaces
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/AdminWorkspaceView"
description: OK
summary: List all workspaces (metadata only)
tags:
- Admin
/admin/workspaces/{workspaceSlug}/llm/budget:
put:
operationId: adminUpdateWorkspaceLlmBudget
parameters:
- in: path
name: workspaceSlug
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateLlmBudgetRequest"
required: true
responses:
"204":
description: Cap updated
summary: Set or clear a workspace's monthly cap on host-funded LLM spend
tags:
- Admin
/auth/client/configuration:
get:
description: Public. A client that finds no such endpoint is talking to a server
without installed-client sign-in.
operationId: getClientSignInConfiguration
parameters:
- in: query
name: clientId
required: true
schema:
type: string
pattern: "^[a-p]{32}$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ClientSignInConfiguration"
description: Whether the client is registered
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The client id is not a Chrome extension id
summary: Whether this instance lets the given installed client sign in
tags:
- Client session
/auth/client/logout:
post:
operationId: logoutClientSession
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ClientRefreshRequest"
required: true
responses:
"204":
description: "Signed out, or the secret was already unknown"
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "The body is malformed, or a request with a valid CSRF token\
\ also carries the browser session cookie"
"403":
content:
application/json: {}
description: The request carries the browser session cookie without a valid
CSRF token. The server refuses it before the endpoint runs.
"429":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "This address sent too many installed-client requests. Wait\
\ the number of seconds in the Retry-After header, then try again."
summary: End the session its refresh secret belongs to
tags:
- Client session
/auth/client/refresh:
post:
operationId: refreshClientSession
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ClientRefreshRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ClientSessionTokens"
description: Rotated
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "The body is malformed, or a request with a valid CSRF token\
\ also carries the browser session cookie"
"401":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The session has ended. Sign in again.
"403":
content:
application/json: {}
description: The request carries the browser session cookie without a valid
CSRF token. The server refuses it before the endpoint runs.
"429":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "This address sent too many installed-client requests. Wait\
\ the number of seconds in the Retry-After header, then try again."
summary: Rotate the session's access token and refresh secret
tags:
- Client session
/auth/client/token:
post:
operationId: exchangeClientSignIn
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ClientTokenRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ClientSessionTokens"
description: Signed in
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "The body is malformed, the code is unknown, expired, used,\
\ or does not match the verifier, client or callback, or a request with\
\ a valid CSRF token also carries the browser session cookie"
"403":
content:
application/json: {}
description: The request carries the browser session cookie without a valid
CSRF token. The server refuses it before the endpoint runs.
"429":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "This address sent too many installed-client requests. Wait\
\ the number of seconds in the Retry-After header, then try again."
summary: Redeem a sign-in handoff code with its PKCE verifier
tags:
- Client session
/auth/csrf:
get:
description: "Fetch with credentials before any other credentialed request at\
\ startup and after sign-in or sign-out. Wait for this response before starting\
\ other requests. Send the token in the returned header on unsafe requests.\
\ With workspace subdomains enabled, a CSRF 403 has problem type urn:hephaestus:csrf.\
\ On that response, refetch once and retry the rejected request once."
operationId: getCsrfToken
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CsrfToken"
description: OK
summary: Get the raw CSRF token for the current browser
tags:
- Auth
/auth/logout:
post:
description: An installed-client access token ends its whole session.
operationId: logout
responses:
"200":
description: OK
summary: Log out — revoke the current token + clear the cookie
tags:
- Auth
/auth/refresh:
post:
operationId: refresh
responses:
"204":
description: Session renewal completed
"400":
description: The token belongs to an installed-client session
"401":
description: Session has ended
summary: "Rotate the access token (new jti, old revoked)"
tags:
- Auth
/contributors:
get:
description: Returns contributors to the Hephaestus project (for the About page)
operationId: listGlobalContributors
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/Contributor"
description: list of contributors sorted by contribution count
security: []
summary: List global contributors
tags:
- Contributors
/identity-providers:
get:
operationId: listIdentityProviders
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/IdentityProviderView"
description: OK
summary: List available identity providers
tags:
- Auth discovery
/internal/llm/admit-results:
post:
description: "Requires the private worker connector and a proxy-scoped worker\
\ credential bound to the workspace, job and attempt. Browser cookies and\
\ app-admin authority do not authorize this request."
operationId: admitResults
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AdmissionRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/AdmissionResponse"
description: OK
security:
- workerBearer: []
summary: Admit results for the current review attempt
tags:
- result-admission
/internal/llm/prepare-feedback:
post:
description: Requires the same fenced worker credential and admitted ITEM review.
Preparation persists the package before a provider write.
operationId: prepareFeedback
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/PrepareFeedbackRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PrepareFeedbackResponse"
description: OK
security:
- workerBearer: []
summary: Prepare feedback for an admitted item review
tags:
- result-admission
/internal/llm/public-feedback-history:
post:
description: "Requires the same fenced worker credential and admitted ITEM review.\
\ Returns confirmed same-item, same-developer copy history; a refused read\
\ is not an empty history."
operationId: readPublicFeedbackHistory
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicFeedbackHistory"
description: OK
security:
- workerBearer: []
summary: Read authorized feedback receipts for the current item review
tags:
- result-admission
/notifications/unsubscribe/{token}:
post:
operationId: unsubscribeEmail
parameters:
- in: path
name: token
required: true
schema:
type: string
requestBody:
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
List-Unsubscribe:
type: string
required:
- List-Unsubscribe
multipart/form-data:
schema:
type: object
properties:
List-Unsubscribe:
type: string
required:
- List-Unsubscribe
responses:
"204":
description: "Subscription disabled, or token no longer applicable"
security: []
summary: Unsubscribe from one optional email subscription
tags:
- Notification preferences
/oauth/callback/{kind}:
get:
operationId: callbackGet
parameters:
- in: path
name: kind
required: true
schema:
type: string
- in: query
name: state
required: false
schema:
type: string
- in: query
name: error
required: false
schema:
type: string
- in: query
name: error_description
required: false
schema:
type: string
- in: query
name: allParams
required: true
schema:
type: object
additionalProperties:
type: string
responses:
"200":
content:
application/json:
schema:
type: object
description: OK
tags:
- o-auth-callback
post:
operationId: callbackPost
parameters:
- in: path
name: kind
required: true
schema:
type: string
- in: query
name: state
required: false
schema:
type: string
- in: query
name: error
required: false
schema:
type: string
- in: query
name: error_description
required: false
schema:
type: string
- in: query
name: allParams
required: true
schema:
type: object
additionalProperties:
type: string
responses:
"200":
content:
application/json:
schema:
type: object
description: OK
tags:
- o-auth-callback
/product-feedback:
post:
operationId: submitInstanceProductFeedback
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackRequest"
required: true
responses:
"200":
description: OK
summary: Send instance-scoped product feedback
tags:
- instance-feedback
/public/workspaces/{slug}/activity:
get:
operationId: getPublicActivity
parameters:
- in: path
name: slug
required: true
schema:
type: string
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivity"
description: Public contributions counted
security: []
summary: Read human contributions to public repositories
tags:
- public-activity
/public/workspaces/{slug}/activity/people/{login}:
get:
operationId: getPublicActivityPerson
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: path
name: login
required: true
schema:
type: string
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityPersonDetail"
description: Public contributions counted
security: []
summary: Read a person's published repository contributions
tags:
- public-activity
/public/workspaces/{slug}/activity/people/{login}/work:
get:
operationId: getPublicActivityPersonWork
parameters:
- in: path
name: slug
required: true
schema:
type: string
- in: path
name: login
required: true
schema:
type: string
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
- description: Kinds of activity to list (repeatable); omit for every kind
in: query
name: kinds
required: false
schema:
type: array
items:
type: string
enum:
- PULL_REQUEST_OPENED
- PULL_REQUEST_MERGED
- PULL_REQUEST_CLOSED
- REVIEW_APPROVED
- REVIEW_CHANGES_REQUESTED
- REVIEW_COMMENTED
- COMMENTED
- CODE_COMMENTED
- ISSUE_OPENED
- ISSUE_CLOSED
uniqueItems: true
- description: The previous page's nextCursor; omit for the first page
in: query
name: cursor
required: false
schema:
type: string
- description: Page size from 1 to 100; defaults to 30
in: query
name: size
required: false
schema:
type: integer
format: int32
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityWorkPage"
description: Public work listed
security: []
summary: Read a person's published work timeline
tags:
- public-activity
/user:
delete:
operationId: deleteCurrentUser
parameters:
- in: header
name: X-Confirm-Delete
required: false
schema:
type: string
responses:
"200":
description: OK
summary: Delete the current account (GDPR Art. 17)
tags:
- Account
get:
operationId: getCurrentUser
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CurrentUserView"
description: OK
summary: Get the current user
tags:
- Account
/user/ai-choice:
get:
operationId: getAccountAiChoice
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/AccountAiChoice"
description: OK
summary: Get your AI choice
tags:
- Account
put:
operationId: updateAccountAiChoice
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AccountAiChoiceRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/AccountAiChoice"
description: OK
summary: Change your AI choice for every workspace you are in
tags:
- Account
/user/consent:
get:
operationId: getConsentStatus
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ConsentStatus"
description: OK
summary: Get the current consent notice and status
tags:
- Consent
put:
operationId: completeFirstLoginConsent
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/FirstLoginConsent"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ConsentStatus"
description: OK
summary: Complete the first-login transparency step
tags:
- Consent
/user/consent/research:
put:
operationId: updateResearchConsent
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ResearchConsent"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ConsentStatus"
description: OK
summary: Grant or withdraw research consent
tags:
- Consent
/user/exports:
post:
operationId: requestDataExport
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ExportCreated"
description: OK
summary: Request a data export (async)
tags:
- Account
/user/exports/{id}:
get:
operationId: getDataExportStatus
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ExportStatus"
description: OK
summary: Get data-export status
tags:
- Account
/user/exports/{id}/download:
get:
operationId: downloadDataExport
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
type: string
format: byte
description: OK
summary: Download the data-export bundle
tags:
- Account
/user/features:
get:
description: Returns all feature flags evaluated for the authenticated user.
Combines role checks and server-side config toggles.
operationId: getUserFeatures
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/FeatureFlags"
description: Feature flags evaluated successfully
summary: Get feature flags for the current user
tags:
- Account
/user/identities:
get:
operationId: listLinkedIdentities
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/IdentityView"
description: OK
summary: List linked identity providers
tags:
- Account
/user/identities/{id}:
delete:
operationId: unlinkIdentity
parameters:
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"204":
description: Identity unlinked
"404":
description: No such identity on the current account
"409":
description: Cannot unlink the account's only remaining sign-in method
summary: Unlink one of the current user's linked identity providers
tags:
- Account
/user/notification-preferences:
get:
operationId: getNotificationPreferences
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/NotificationPreferences"
description: Your current email subscriptions
headers:
ETag:
description: Strong validator for If-Match
schema:
type: string
style: simple
summary: Get your email subscriptions
tags:
- notification-preferences
put:
operationId: updateNotificationPreferences
parameters:
- description: Current preferences ETag
in: header
name: If-Match
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateNotificationPreferences"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/NotificationPreferences"
description: Email subscriptions updated
headers:
ETag:
description: Strong validator for the updated preferences
schema:
type: string
style: simple
"400":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Invalid preferences or If-Match header
"403":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Enabling this subscription requires instance administration
"409":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Enabling email requires a verified contact on an active account
"412":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The supplied ETag is stale
"428":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: If-Match is required
summary: Update your email subscriptions
tags:
- notification-preferences
/user/public-activity:
get:
operationId: getPublicActivityChoice
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityChoice"
description: OK
summary: Get your account-wide public activity choice
tags:
- account-public-activity
put:
operationId: updatePublicActivityChoice
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityChoice"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityChoice"
description: OK
summary: Show or hide your activity on all public pages
tags:
- account-public-activity
/user/public-activity/workspaces/{slug}/onboarding:
get:
operationId: getPublicActivityOnboarding
parameters:
- in: path
name: slug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityOnboarding"
description: OK
summary: Check your public-workspace onboarding
tags:
- public-activity-onboarding
put:
operationId: answerPublicActivityOnboarding
parameters:
- in: path
name: slug
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityOnboardingRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityOnboarding"
description: OK
summary: Show or hide yourself and finish this workspace's onboarding
tags:
- public-activity-onboarding
/user/sessions:
delete:
operationId: revokeOtherSessions
responses:
"200":
description: OK
summary: Revoke all sessions except the current one
tags:
- Account
get:
operationId: listSessions
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/SessionView"
description: OK
summary: List active sessions for the current user
tags:
- Account
/user/sessions/{jti}:
delete:
description: "Any token of an installed-client session, even one it rotated\
\ away, ends that session."
operationId: revokeSession
parameters:
- in: path
name: jti
required: true
schema:
type: string
format: uuid
responses:
"200":
description: OK
summary: Revoke a single session
tags:
- Account
/user/settings:
get:
operationId: getUserSettings
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/UserSettings"
description: OK
summary: Get user settings
tags:
- Account
post:
operationId: updateUserSettings
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UserSettings"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/UserSettings"
description: OK
summary: Update user settings
tags:
- Account
/user/slack/preferences:
get:
operationId: getSlackUserPreferences
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/SlackUserPreferences"
description: OK
summary: Get current user's Slack preferences
tags:
- Slack User Preferences
/workspaces:
get:
operationId: listWorkspaces
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/WorkspaceListItem"
description: Workspace list
summary: List all workspaces
tags:
- workspace-registry
post:
operationId: createWorkspace
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateWorkspaceRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
description: Workspace created
summary: Create a new workspace
tags:
- workspace-registry
/workspaces/gitlab/groups:
post:
operationId: listGitLabGroups
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/GitLabPreflightRequest"
required: true
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/GitLabGroup"
description: Accessible groups
summary: List GitLab groups accessible to a PAT
tags:
- git-lab-preflight
/workspaces/gitlab/preflight:
post:
operationId: gitLabPreflight
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/GitLabPreflightRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/GitLabPreflightResponse"
description: Validation result
summary: Validate a GitLab PAT before workspace creation
tags:
- git-lab-preflight
/workspaces/providers:
get:
description: Returns available workspace providers with their configuration.
Public endpoint — no authentication required.
operationId: getProviders
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceProviders"
description: OK
security: []
summary: List available workspace creation providers
tags:
- workspace-registry
/workspaces/{workspaceSlug}:
delete:
operationId: purgeWorkspace
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"204":
description: Workspace purged
summary: Permanently delete a workspace and purge its data
tags:
- workspace
get:
operationId: getWorkspace
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
description: Workspace returned
summary: Fetch a workspace by slug
tags:
- workspace
/workspaces/{workspaceSlug}/activity/facets:
get:
description: "The same lists the people read carries, without counting anyone.\
\ No period, team or repository changes them."
operationId: getActivityFacets
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ActivityFacets"
description: Repositories and teams listed
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: List the repositories and teams that activity can be narrowed to
tags:
- Activity
/workspaces/{workspaceSlug}/activity/hidden-contributors:
get:
operationId: listHiddenContributors
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/UserInfo"
description: Hidden contributors listed
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: List the contributors without a membership whom an admin hid from activity
tags:
- Activity
/workspaces/{workspaceSlug}/activity/me:
get:
operationId: getOwnActivity
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: team
required: false
schema:
type: string
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ActivityPersonDetail"
description: Your activity returned
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: Read your activity in this workspace
tags:
- Activity
/workspaces/{workspaceSlug}/activity/me/work:
get:
operationId: getOwnActivityWork
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: team
required: false
schema:
type: string
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
- description: Kinds of activity to list (repeatable); omit for every kind
in: query
name: kinds
required: false
schema:
type: array
items:
type: string
enum:
- PULL_REQUEST_OPENED
- PULL_REQUEST_MERGED
- PULL_REQUEST_CLOSED
- REVIEW_APPROVED
- REVIEW_CHANGES_REQUESTED
- REVIEW_COMMENTED
- COMMENTED
- CODE_COMMENTED
- ISSUE_OPENED
- ISSUE_CLOSED
uniqueItems: true
- description: The previous page's nextCursor; omit for the first page
in: query
name: cursor
required: false
schema:
type: string
- description: Page size from 1 to 100; defaults to 30
in: query
name: size
required: false
schema:
type: integer
format: int32
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ActivityWorkPage"
description: Your work listed
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: List the work on which your activity happened
tags:
- Activity
/workspaces/{workspaceSlug}/activity/members/{login}/open-work:
get:
description: "Review requests, open pull requests and assigned issues, most\
\ recently updated first. Pull requests carry their reviewers."
operationId: getOpenWork
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- description: The member's login
in: path
name: login
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/OpenWork"
description: Open work listed
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: List what is open for a member
tags:
- Activity
/workspaces/{workspaceSlug}/activity/people:
get:
operationId: getActivityPeople
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: team
required: false
schema:
type: string
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ActivityPeople"
description: Contributors counted
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: Count each contributor and automation account in one response
tags:
- Activity
/workspaces/{workspaceSlug}/activity/people/{userId}:
get:
operationId: getActivityPerson
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: userId
required: true
schema:
type: integer
format: int64
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: team
required: false
schema:
type: string
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ActivityPersonDetail"
description: Contributor activity counted
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: "Count a contributor by week, type and repository"
tags:
- Activity
/workspaces/{workspaceSlug}/activity/people/{userId}/automation:
patch:
operationId: updateActivityAutomation
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: userId
required: true
schema:
type: integer
format: int64
- in: query
name: treatAsAutomation
required: true
schema:
type: boolean
responses:
"204":
description: Automation classification updated
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: "Treat a contributor as automation, or reset the classification"
tags:
- Activity
/workspaces/{workspaceSlug}/activity/people/{userId}/public-visibility:
patch:
operationId: updatePublicActivityObjection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: userId
required: true
schema:
type: integer
format: int64
- in: query
name: hidden
required: true
schema:
type: boolean
responses:
"204":
description: Contributor visibility updated
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: "Honor a contributor publication objection, or restore workspace visibility"
tags:
- Activity
/workspaces/{workspaceSlug}/activity/people/{userId}/work:
get:
operationId: getActivityPersonWork
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: userId
required: true
schema:
type: integer
format: int64
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: team
required: false
schema:
type: string
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
- description: Kinds of activity to list (repeatable); omit for every kind
in: query
name: kinds
required: false
schema:
type: array
items:
type: string
enum:
- PULL_REQUEST_OPENED
- PULL_REQUEST_MERGED
- PULL_REQUEST_CLOSED
- REVIEW_APPROVED
- REVIEW_CHANGES_REQUESTED
- REVIEW_COMMENTED
- COMMENTED
- CODE_COMMENTED
- ISSUE_OPENED
- ISSUE_CLOSED
uniqueItems: true
- description: The previous page's nextCursor; omit for the first page
in: query
name: cursor
required: false
schema:
type: string
- description: Page size from 1 to 100; defaults to 30
in: query
name: size
required: false
schema:
type: integer
format: int32
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ActivityWorkPage"
description: One page of contributor work
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: List a contributor's work one page at a time
tags:
- Activity
/workspaces/{workspaceSlug}/activity/public-hidden-count:
get:
operationId: getPublicActivityHiddenCount
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityHiddenCount"
description: Hidden contributors counted
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: Count hidden public contributors without identifying them
tags:
- Activity
/workspaces/{workspaceSlug}/activity/work:
get:
description: "One member's activity when login is given, otherwise everyone's\
\ in the workspace or the team. With both, the member's activity within the\
\ team's scope. Each pull request or issue is listed once, by its latest activity\
\ in the range, newest first."
operationId: getActivityWork
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: login
required: false
schema:
type: string
- in: query
name: team
required: false
schema:
type: string
- in: query
name: repo
required: false
schema:
type: array
items:
type: string
uniqueItems: true
- description: Activity range
in: query
name: range
required: false
schema:
type: string
enum:
- 30d
- 90d
- 1y
- all
- custom
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- description: Kinds of activity to list (repeatable); omit for every kind
in: query
name: kinds
required: false
schema:
type: array
items:
type: string
enum:
- PULL_REQUEST_OPENED
- PULL_REQUEST_MERGED
- PULL_REQUEST_CLOSED
- REVIEW_APPROVED
- REVIEW_CHANGES_REQUESTED
- REVIEW_COMMENTED
- COMMENTED
- CODE_COMMENTED
- ISSUE_OPENED
- ISSUE_CLOSED
uniqueItems: true
- description: The previous page's nextCursor; omit for the first page
in: query
name: cursor
required: false
schema:
type: string
- description: Page size from 1 to 100; defaults to 30
in: query
name: size
required: false
schema:
type: integer
format: int32
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ActivityWorkPage"
description: One page of work
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: A request parameter is not valid
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of the workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Workspace, contributor, team or repository not found"
summary: "List activity by the pull request or issue it happened on, one page\
\ at a time"
tags:
- Activity
/workspaces/{workspaceSlug}/agents:
get:
operationId: listAgents
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/AgentBinding"
description: Bindings returned
summary: List the workspace's agents and how each is configured
tags:
- Agents
/workspaces/{workspaceSlug}/agents/{purpose}:
delete:
operationId: deleteAgent
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: purpose
required: true
schema:
type: string
enum:
- PRACTICE_REVIEW
- MENTOR
- PRACTICE_DECISION
- PRACTICE_EMBEDDING
- PRACTICE_RERANKING
- in: query
name: dataHandlingTier
required: false
schema:
type: string
default: UNDECLARED
enum:
- IN_HOUSE
- CLOUD
- UNDECLARED
responses:
"204":
description: Binding removed
summary: Remove the agent for one purpose (turn it off)
tags:
- Agents
put:
operationId: configureAgent
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: purpose
required: true
schema:
type: string
enum:
- PRACTICE_REVIEW
- MENTOR
- PRACTICE_DECISION
- PRACTICE_EMBEDDING
- PRACTICE_RERANKING
- in: query
name: dataHandlingTier
required: false
schema:
type: string
default: UNDECLARED
enum:
- IN_HOUSE
- CLOUD
- UNDECLARED
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AgentBindingRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/AgentBinding"
description: Binding saved
"404":
description: Model not found
"409":
description: "The model is undeclared, or declared as another tier than\
\ this slot (problem type agent-binding-slot-mismatch, property declaredTier)"
summary: Configure the agent for one purpose
tags:
- Agents
/workspaces/{workspaceSlug}/config-audit:
get:
operationId: listWorkspaceConfigAuditEvents
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 50
- in: query
name: entityType
required: false
schema:
type: array
items:
type: string
enum:
- PRACTICE_REVIEW_SETTINGS
- AGENT_BINDING
- AGENT_CONFIG
- AI_CONFIG_BINDING
- WORKSPACE_ROLE
- ACTIVITY_AUTOMATION
- WORKSPACE_FEATURES
- WORKSPACE_STATUS
- WORKSPACE_TOKEN
- WORKSPACE_VISIBILITY
- PRACTICE_ACTIVE
- PRACTICE_USAGE
- PRACTICE_DEFINITION
- PRACTICE_GROUP
- CATALOG_PRACTICE
- CATALOG_GROUP
- WORKSPACE_INSTANCE_LLM_BUDGET
- WORKSPACE_OWN_PROVIDER_LLM_BUDGET
- WORKSPACE_LLM_BUDGET
- WORKSPACE_BYO_LLM_BUDGET
- REVIEW_BATCH
- REVIEW_SCHEDULE
- FEEDBACK_DELIVERY_RECHECK
- WORKSPACE_LLM_CONNECTION
- WORKSPACE_LLM_MODEL
- in: query
name: entityId
required: false
schema:
type: string
- in: query
name: changedKey
required: false
schema:
type: string
- in: query
name: action
required: false
schema:
type: array
items:
type: string
enum:
- CREATED
- UPDATED
- DELETED
- in: query
name: actorId
required: false
schema:
type: integer
format: int64
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOConfigAuditEntryView"
description: OK
summary: "List this workspace's admin configuration changes (paged, newest first)"
tags:
- Config Audit
/workspaces/{workspaceSlug}/connections:
get:
operationId: list
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ConnectionSummary"
description: OK
tags:
- Connections
post:
operationId: initiate
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/InitiateConnectionRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/InitiateConnectionResponse"
description: OK
tags:
- Connections
/workspaces/{workspaceSlug}/connections/catalog:
get:
operationId: getIntegrationCatalog
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/IntegrationCatalogEntry"
description: OK
summary: "Every integration kind this workspace could connect, joined against\
\ existing connections"
tags:
- Sync
/workspaces/{workspaceSlug}/connections/outline/token:
get:
description: "Probes Outline directly. Reports whether the token is still accepted\
\ and, when the token may list its own key, its name, expiry and last use.\
\ Outline cannot rotate a key from a key, so an expiring token is renewed\
\ in Outline and re-entered here."
operationId: getOutlineTokenStatus
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/OutlineTokenStatus"
description: Token state returned
"404":
description: The workspace has no ACTIVE Outline connection
summary: Live state of the API token behind this workspace's Outline connection
tags:
- Connections
/workspaces/{workspaceSlug}/connections/{connectionId}/sync:
get:
operationId: getConnectionSyncStatus
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: connectionId
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ConnectionSyncStatus"
description: OK
summary: Unified sync status for one connection
tags:
- Sync
/workspaces/{workspaceSlug}/connections/{connectionId}/sync/jobs:
get:
operationId: listConnectionSyncJobs
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: connectionId
required: true
schema:
type: integer
format: int64
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 20
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOSyncJob"
description: OK
summary: Paginated sync job history for one connection
tags:
- Sync
post:
description: |-
Trigger a manual sync. Idempotent-absorb: a connection that already has an active job answers
200 with that job rather than erroring, so a double-click "Sync now" is harmless.
operationId: triggerSyncJob
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: connectionId
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/TriggerSyncJobRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/SyncJob"
description: "Idempotent-absorb: a same-type job was already running and\
\ is returned unchanged"
"202":
content:
application/json:
schema:
$ref: "#/components/schemas/SyncJob"
description: A new sync job was created and dispatched
"400":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Missing or invalid request body (e.g. absent sync type)
"404":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Connection not found in this workspace
"409":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Connection is not ACTIVE, a different sync type is already\
\ running, or manual sync is unsupported for the kind"
"503":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The server is too busy to dispatch the sync; retry later
summary: Trigger a manual sync or backfill
tags:
- Sync
/workspaces/{workspaceSlug}/connections/{connectionId}/sync/jobs/{jobId}:
patch:
operationId: updateConnectionSyncJob
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: connectionId
required: true
schema:
type: integer
format: int64
- in: path
name: jobId
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateSyncJobRequest"
required: true
responses:
"202":
content:
application/json:
schema:
$ref: "#/components/schemas/SyncJob"
description: Cancellation requested; the running job stops cooperatively
"400":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The update does not request cancellation
"404":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Job not found in this workspace, or not owned by this connection"
"409":
content:
application/json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Job is already in a terminal status
summary: Update a running sync job
tags:
- Sync
/workspaces/{workspaceSlug}/connections/{connectionId}/sync/resources:
get:
operationId: listConnectionSyncResources
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: connectionId
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/SyncResourceState"
description: OK
summary: Per-resource sync state (repos / channels / collections) for one connection
tags:
- Sync
/workspaces/{workspaceSlug}/connections/{id}:
get:
operationId: read
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ConnectionDetail"
description: OK
tags:
- Connections
/workspaces/{workspaceSlug}/connections/{id}/audit:
get:
operationId: audit
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ConnectionAuditEntry"
description: OK
tags:
- Connections
/workspaces/{workspaceSlug}/connections/{id}/status:
patch:
description: |-
Resource-oriented lifecycle transition: ACTIVE (reactivate), SUSPENDED
(suspend), or UNINSTALLED (disconnect). Disconnecting erases the integration's mirrored
data and then, best effort, removes what it installed at the provider; if the erase fails, the
connection is left unchanged. PENDING is internal to the OAuth handshake and rejected as
a bad request; illegal transitions surface as 409 via the state machine.
operationId: updateConnectionStatus
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateConnectionStatusRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ConnectionSummary"
description: OK
summary: |-
Resource-oriented lifecycle transition: ACTIVE (reactivate), SUSPENDED
(suspend), or UNINSTALLED (disconnect).
tags:
- Connections
/workspaces/{workspaceSlug}/features:
patch:
operationId: updateFeatures
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateWorkspaceFeaturesRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
description: Workspace updated
summary: Update workspace feature flags
tags:
- workspace
/workspaces/{workspaceSlug}/llm/available-models:
get:
operationId: workspaceListAvailableLlmModels
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/AvailableLlmModel"
description: OK
summary: List models this workspace can bind a Task to (shared + your own)
tags:
- Workspace LLM
/workspaces/{workspaceSlug}/llm/budget:
put:
operationId: updateWorkspaceLlmBudget
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateLlmBudgetRequest"
required: true
responses:
"204":
description: Cap updated
summary: Set or clear this workspace's monthly cap on its own-provider LLM spend
tags:
- LLM Usage
/workspaces/{workspaceSlug}/llm/connections:
get:
operationId: workspaceListLlmConnections
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/WorkspaceLlmConnection"
description: OK
summary: List your AI provider connections
tags:
- Workspace LLM
post:
operationId: workspaceCreateLlmConnection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateWorkspaceLlmConnectionRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmConnection"
description: Connection created; URL in the Location header
"409":
description: A connection with this slug already exists in this workspace
summary: Connect your own AI provider
tags:
- Workspace LLM
/workspaces/{workspaceSlug}/llm/connections/{connectionId}/models:
post:
operationId: workspaceCreateLlmModel
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: connectionId
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateWorkspaceLlmModelRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmModel"
description: Model created; URL in the Location header
"404":
description: AI provider connection not found
"409":
description: A model with this slug or upstream model id already exists
on the connection
summary: Create a model on your AI provider
tags:
- Workspace LLM
/workspaces/{workspaceSlug}/llm/connections/{id}:
delete:
operationId: workspaceDeleteLlmConnection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"204":
description: Connection removed
"404":
description: Connection not found
"409":
description: Cannot delete a connection still referenced by one or more
models
summary: Remove your AI provider connection
tags:
- Workspace LLM
get:
operationId: workspaceGetLlmConnection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmConnection"
description: OK
"404":
description: Connection not found
summary: Get one of your AI provider connections
tags:
- Workspace LLM
patch:
operationId: workspaceUpdateLlmConnection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateWorkspaceLlmConnectionRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmConnection"
description: OK
"404":
description: Connection not found
summary: Update your AI provider connection
tags:
- Workspace LLM
/workspaces/{workspaceSlug}/llm/connections/{id}/probe:
post:
operationId: workspaceProbeLlmConnection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmProbeResult"
description: OK
summary: Test your AI provider connection
tags:
- Workspace LLM
/workspaces/{workspaceSlug}/llm/models:
get:
operationId: workspaceListLlmModels
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/WorkspaceLlmModel"
description: OK
summary: List models on your AI provider
tags:
- Workspace LLM
/workspaces/{workspaceSlug}/llm/models/{id}:
delete:
operationId: workspaceDeleteLlmModel
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"204":
description: Model removed
"404":
description: Model not found
"409":
description: Cannot delete a model still bound to an agent configuration
summary: Remove a model on your AI provider
tags:
- Workspace LLM
get:
operationId: workspaceGetLlmModel
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmModel"
description: OK
"404":
description: Model not found
summary: Get a model on your AI provider
tags:
- Workspace LLM
patch:
operationId: workspaceUpdateLlmModel
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateWorkspaceLlmModelRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmModel"
description: OK
"404":
description: Model not found
"409":
description: Another model on the connection already uses this upstream
model id
summary: Update a model on your AI provider
tags:
- Workspace LLM
/workspaces/{workspaceSlug}/llm/settings:
get:
operationId: workspaceGetLlmSettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmSettings"
description: OK
summary: Get the instance LLM policy as it applies to this workspace
tags:
- Workspace LLM
/workspaces/{workspaceSlug}/llm/usage:
get:
operationId: getLlmUsageReport
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: month
required: false
schema:
type: string
pattern: "\\d{4}-(0[1-9]|1[0-2])"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceLlmUsageReport"
description: OK
summary: Get the workspace's LLM usage report for one month
tags:
- LLM Usage
/workspaces/{workspaceSlug}/members:
get:
operationId: listMemberships
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: q
required: false
schema:
type: string
- in: query
name: team
required: false
schema:
type: string
exclusiveMinimum: 0
- description: Zero-based page index (0..N)
in: query
name: page
required: false
schema:
type: integer
default: 0
minimum: 0
- description: The size of the page to be returned
in: query
name: size
required: false
schema:
type: integer
default: 50
minimum: 1
- description: "Sorting criteria in the format: property,(asc|desc). Default\
\ sort order is ascending. Multiple sort criteria are supported."
in: query
name: sort
required: false
schema:
type: array
default:
- "joinedAt,ASC"
items:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOWorkspaceMembership"
description: OK
summary: List workspace memberships
tags:
- membership
/workspaces/{workspaceSlug}/members/assign:
post:
operationId: assignMemberRole
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AssignRoleRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceMembership"
description: OK
summary: Assign a workspace role
tags:
- membership
/workspaces/{workspaceSlug}/members/me:
get:
operationId: getOwnMembership
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceMembership"
description: OK
summary: Get your workspace membership
tags:
- membership
/workspaces/{workspaceSlug}/members/{accountId}:
delete:
operationId: removeMember
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: accountId
required: true
schema:
type: string
maximum: 9223372036854776000
pattern: "^[1-9][0-9]*$"
responses:
"204":
description: Membership removed
summary: Remove a workspace member
tags:
- membership
get:
operationId: getMembership
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: accountId
required: true
schema:
type: string
maximum: 9223372036854776000
pattern: "^[1-9][0-9]*$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceMembership"
description: OK
summary: Get a workspace membership
tags:
- membership
/workspaces/{workspaceSlug}/members/{accountId}/hidden:
patch:
operationId: setMemberHidden
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: accountId
required: true
schema:
type: string
maximum: 9223372036854776000
pattern: "^[1-9][0-9]*$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SetMemberHiddenRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceMembership"
description: OK
summary: Change a member’s activity visibility
tags:
- membership
/workspaces/{workspaceSlug}/mentor/sandbox:
post:
operationId: prepareMentorSandbox
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"202":
description: Accepted; the sandbox starts unless it is already warm or Heph
could not answer anyway
summary: Prepare the current member's Heph sandbox in the background
tags:
- Mentor Chat
/workspaces/{workspaceSlug}/mentor/threads:
get:
operationId: listThreads
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ChatThreadSummary"
description: "Threads returned, newest first"
summary: List the current user's mentor threads in this workspace
tags:
- Mentor Threads
/workspaces/{workspaceSlug}/mentor/threads/{threadId}:
delete:
operationId: deleteThread
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: threadId
required: true
schema:
type: string
format: uuid
responses:
"204":
description: Thread deleted
"404":
description: Thread not found OR not owned by current user
summary: "Delete a mentor thread (cascades to messages, votes, parts)"
tags:
- Mentor Threads
get:
operationId: getThread
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: threadId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ChatThreadDetail"
description: "Thread, messages and the owner's votes returned"
"404":
description: Thread not found OR not owned by current user
summary: Get a mentor thread with its full message history
tags:
- Mentor Threads
/workspaces/{workspaceSlug}/mentor/threads/{threadId}/messages/{messageId}/vote:
delete:
operationId: removeVote
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: threadId
required: true
schema:
type: string
format: uuid
- in: path
name: messageId
required: true
schema:
type: string
format: uuid
responses:
"204":
description: Vote removed or did not exist
"404":
description: Thread or message not found (or not owned by current user)
summary: Remove a vote on an assistant message (idempotent)
tags:
- Mentor Votes
post:
operationId: vote
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: threadId
required: true
schema:
type: string
format: uuid
- in: path
name: messageId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ChatMessageVoteRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ChatMessageVote"
description: Vote recorded
"404":
description: Thread or message not found (or not owned by current user)
summary: Upsert a vote on an assistant message
tags:
- Mentor Votes
/workspaces/{workspaceSlug}/onboarding/me:
get:
operationId: getMemberOnboarding
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceOnboarding"
description: OK
summary: Get your first-visit setup and AI choice in this workspace
tags:
- workspace-onboarding
/workspaces/{workspaceSlug}/onboarding/me/ai-choice:
put:
operationId: updateAiChoice
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AiChoiceRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceOnboarding"
description: OK
summary: Change your AI choice without changing workspace membership
tags:
- workspace-onboarding
/workspaces/{workspaceSlug}/onboarding/me/dismissal:
put:
operationId: dismissMemberOnboarding
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceOnboarding"
description: OK
summary: Skip first-visit setup for now without treating that as an AI choice
tags:
- workspace-onboarding
/workspaces/{workspaceSlug}/onboarding/settings:
get:
operationId: getMemberOnboardingSettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceOnboardingSettings"
description: OK
summary: Get this workspace's member-onboarding settings
tags:
- workspace-onboarding
put:
operationId: updateMemberOnboardingSettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceOnboardingSettings"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceOnboardingSettings"
description: OK
summary: Configure first-visit setup and required workspace account links
tags:
- workspace-onboarding
/workspaces/{workspaceSlug}/onboarding/settings/links:
get:
operationId: getMemberOnboardingLinkOptions
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/WorkspaceOnboardingLink"
description: OK
summary: List workspace account links available for onboarding requirements
tags:
- workspace-onboarding
/workspaces/{workspaceSlug}/outline/collections:
get:
operationId: listOutlineCollections
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/OutlineCollection"
description: Mirrored collections returned
"404":
description: The workspace has no ACTIVE Outline connection
summary: List the workspace's mirrored Outline collections with their sync state
tags:
- Outline collections
post:
operationId: registerOutlineCollection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/RegisterOutlineCollectionRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/OutlineCollection"
description: Collection was already registered (idempotent repeat)
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/OutlineCollection"
description: Collection registered; the Location header points at the collection
resource
"404":
description: The workspace has no ACTIVE Outline connection
"409":
description: A concurrent registration of the same collection won the race
"422":
description: Outline does not know the requested collection id
summary: Register an Outline collection for mirroring (lands ENABLED + PENDING;
idempotent on the id)
tags:
- Outline collections
/workspaces/{workspaceSlug}/outline/collections/candidates:
get:
description: "Proxies Outline's collections.list with the stored token under\
\ a bounded interactive page budget. Served with Cache-Control: no-store —\
\ the live upstream view must not be cached."
operationId: listOutlineCollectionCandidates
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/OutlineCollectionCandidate"
description: "Candidate collections returned (Cache-Control: no-store)"
"404":
description: The workspace has no ACTIVE Outline connection
"502":
description: The Outline server could not be reached or answered with an
error
"503":
description: Outline limited the request rate. The Retry-After header carries
the seconds to wait before retrying.
summary: List the Outline collections available to mirror (live proxy; doubles
as connectivity probe)
tags:
- Outline collections
/workspaces/{workspaceSlug}/outline/collections/{collectionId}:
delete:
operationId: deleteOutlineCollection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: collectionId
required: true
schema:
type: string
responses:
"204":
description: Collection removed and its mirrored documents erased
"404":
description: "The collection is not registered for this workspace, or the\
\ workspace has no ACTIVE Outline connection"
summary: Remove a collection from the mirror and erase its mirrored documents
(terminal)
tags:
- Outline collections
get:
operationId: getOutlineCollection
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: collectionId
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/OutlineCollection"
description: Mirrored collection returned
"404":
description: "The collection is not registered for this workspace, or the\
\ workspace has no ACTIVE Outline connection"
summary: One mirrored Outline collection with its sync state and live document
count
tags:
- Outline collections
patch:
description: Resuming (PAUSED → ENABLED) resets the sync status to PENDING and
kicks a targeted sync; requesting the current state is an idempotent no-op.
operationId: updateOutlineCollectionState
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: collectionId
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateOutlineCollectionStateRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/OutlineCollection"
description: Collection state after the transition returned
"404":
description: "The collection is not registered for this workspace, or the\
\ workspace has no ACTIVE Outline connection"
summary: Transition a mirrored collection to a target mirror state (pause /
resume)
tags:
- Outline collections
/workspaces/{workspaceSlug}/practice-catalog/adoption:
get:
operationId: listAdoptablePractices
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/CatalogPracticeSummary"
description: Available practices returned
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Workspace administrator access is required
summary: List practices available for adoption
tags:
- Practice Catalog Adoption
/workspaces/{workspaceSlug}/practice-catalog/adoption/groups/{slug}:
get:
operationId: previewGroupAdoption
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroupAdoptionPreview"
description: OK
summary: Preview adoption of a catalog group and its practices
tags:
- Practice Catalog Adoption
post:
operationId: adoptGroup
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogGroupAdoptionResult"
description: OK
summary: Adopt all available practices in a catalog group
tags:
- Practice Catalog Adoption
/workspaces/{workspaceSlug}/practice-catalog/adoption/{slug}:
get:
operationId: previewPracticeAdoption
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/CatalogPracticePreview"
description: Adoption preview returned
headers:
ETag:
description: Strong validator for If-Match
style: simple
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Workspace administrator access is required
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Practice is not offered
summary: Get a practice adoption preview
tags:
- Practice Catalog Adoption
post:
operationId: adoptPractice
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/Practice"
description: Practice adopted
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Workspace administrator access is required
"409":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The practice slug already exists in the workspace
"412":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Catalog or workspace state changed since preview
"428":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The If-Match preview validator is required
summary: Adopt a catalog practice
tags:
- Practice Catalog Adoption
/workspaces/{workspaceSlug}/practice-groups:
get:
operationId: listPracticeGroups
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: shownToDevelopersOnly
required: false
schema:
type: boolean
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeGroup"
description: OK
tags:
- practice-group
post:
operationId: createPracticeGroup
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreatePracticeGroupRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeGroup"
description: Practice group created
tags:
- practice-group
/workspaces/{workspaceSlug}/practice-groups/reorder:
patch:
operationId: reorderPracticeGroups
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ReorderRequest"
required: true
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeGroup"
description: OK
tags:
- practice-group
/workspaces/{workspaceSlug}/practice-groups/standings:
get:
description: "Returns every active practice group's standing, direction, guidance,\
\ and supporting results."
operationId: getOwnGroupStandings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeGroupStanding"
description: Practice group standings returned
summary: List the current developer's practice group standings
tags:
- Practice Group Standings
/workspaces/{workspaceSlug}/practice-groups/{groupSlug}:
delete:
operationId: deletePracticeGroup
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: groupSlug
required: true
schema:
type: string
responses:
"204":
description: Practice group deleted
tags:
- practice-group
get:
operationId: getPracticeGroup
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: groupSlug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeGroup"
description: OK
tags:
- practice-group
patch:
operationId: updatePracticeGroup
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: groupSlug
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdatePracticeGroupRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeGroup"
description: OK
tags:
- practice-group
/workspaces/{workspaceSlug}/practice-groups/{groupSlug}/catalog-customization:
delete:
operationId: resetGroupToCatalog
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: groupSlug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeGroup"
description: OK
tags:
- practice-group
/workspaces/{workspaceSlug}/practice-groups/{groupSlug}/feedback-mode:
patch:
operationId: setGroupFeedbackMode
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: groupSlug
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SetFeedbackModeRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeGroup"
description: OK
tags:
- practice-group
/workspaces/{workspaceSlug}/practice-groups/{groupSlug}/reviews:
get:
operationId: listOwnGroupReviews
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: groupSlug
required: true
schema:
type: string
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: since
required: false
schema:
type: string
format: date-time
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 20
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOProfileReview"
description: OK
summary: List your reviews in a practice group
tags:
- practice-group-detail
/workspaces/{workspaceSlug}/practice-profile/overview:
get:
description: "Returns the practices met as a strength, every change to a standing,\
\ trend, group or piece of feedback inside the window, and the work reviewed\
\ inside it, as structured events. The window opens at the run before the\
\ latest one and closes now; with no such run it spans the standing's look-back\
\ of 90 days."
operationId: getOwnPracticeProfileOverview
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeProfileOverview"
description: Practice profile overview returned
summary: "What was met, what changed and which work was reviewed since the run\
\ before the latest one"
tags:
- Practice Profile
/workspaces/{workspaceSlug}/practice-profile/reviews:
get:
operationId: listOwnReviews
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: since
required: false
schema:
type: string
format: date-time
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 20
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOProfileReview"
description: OK
summary: List reviews with results about you
tags:
- practice-profile-review
/workspaces/{workspaceSlug}/practice-profile/reviews/{reviewId}:
get:
operationId: getOwnReview
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: reviewId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ProfileReviewDetail"
description: OK
summary: Get your results from a review
tags:
- practice-profile-review
/workspaces/{workspaceSlug}/practices:
get:
operationId: listPractices
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: feedbackMode
required: false
schema:
type: string
enum:
- "OFF"
- APPROVE_FIRST
- AUTOMATIC
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/Practice"
description: OK
tags:
- practice-catalog
post:
operationId: createPractice
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreatePracticeRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/Practice"
description: Practice created
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/definition-options:
get:
operationId: getPracticeDefinitionOptions
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeDefinitionOptions"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/feedback-modes:
get:
operationId: getFeedbackModeRollup
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackModeRollup"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/feedback/on-work:
get:
description: "Read-only metadata for up to 50 in-context pieces of feedback\
\ addressed to the caller with recorded provider comments, newest delivery\
\ first. Uses the exact connected-provider work lookup. Only recorded successful\
\ deliveries are included, even when the remaining delivery failed. Incomplete\
\ reviews omit draft practice metadata. No bodies, private conversations or\
\ replaced feedback; admin status does not broaden the recipient. Permalinks\
\ are recorded provider links, not live existence checks."
operationId: getOwnDeliveredWorkFeedback
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: url
required: true
schema:
type: string
maxLength: 2048
minLength: 0
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/DeliveredWorkFeedback"
description: OK
summary: The caller's recorded feedback comments on this work
tags:
- Practice feedback
/workspaces/{workspaceSlug}/practices/feedback/practice-page:
get:
operationId: getOwnPracticePageFeedback
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticePageFeedback"
description: OK
summary: Read your practice feedback
tags:
- practice-page-feedback
/workspaces/{workspaceSlug}/practices/feedback/resolution-counts:
get:
operationId: getOwnFeedbackResolutionCounts
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackResolutionCounts"
description: OK
summary: Get feedback resolution counts
tags:
- Feedback Response
/workspaces/{workspaceSlug}/practices/feedback/{feedbackId}/response:
delete:
operationId: clearOwnFeedbackResponse
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackResponse"
description: Complete cleared response returned
"404":
description: Delivered feedback not found for the current recipient
summary: Clear the response to delivered feedback
tags:
- Feedback Response
get:
operationId: getOwnFeedbackResponse
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackResponse"
description: Complete current response returned
"404":
description: Delivered feedback not found for the current recipient
summary: Get the current feedback response
tags:
- Feedback Response
put:
description: Sets the complete current response. Repeating the same request
has no effect.
operationId: replaceOwnFeedbackResponse
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackResponseRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackResponse"
description: Response replaced
"400":
description: Invalid response
"404":
description: Delivered feedback not found for the current recipient
"409":
description: A workspace admin withdrew this feedback
summary: Replace the response to delivered feedback
tags:
- Feedback Response
/workspaces/{workspaceSlug}/practices/items:
get:
operationId: listReviewItems
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 25
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOItemRef"
description: OK
summary: List items in the workspace
tags:
- item
/workspaces/{workspaceSlug}/practices/items/legacy-feedback/{artifactKind}/{artifactId}:
get:
operationId: resolveLegacyFeedbackItem
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: artifactKind
required: true
schema:
type: string
- in: path
name: artifactId
required: true
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/LegacyFeedbackItem"
description: OK
summary: Resolve a feedback link posted before item IDs
tags:
- item
/workspaces/{workspaceSlug}/practices/items/{itemId}:
get:
operationId: getReviewItem
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: itemId
required: true
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ItemRef"
description: OK
summary: Get an item
tags:
- item
/workspaces/{workspaceSlug}/practices/items/{itemId}/events:
get:
operationId: listItemEvents
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: itemId
required: true
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 25
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOItemEvent"
description: OK
summary: List item events
tags:
- item
/workspaces/{workspaceSlug}/practices/items/{itemId}/facts:
get:
operationId: getItemFacts
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: itemId
required: true
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ItemFacts"
description: OK
summary: Get current facts about an item
tags:
- item
/workspaces/{workspaceSlug}/practices/items/{itemId}/own-trace:
get:
operationId: getOwnItemTrace
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: itemId
required: true
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: reviewId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/OwnItemTrace"
description: OK
summary: Trace your results from an item review
tags:
- item-trace
/workspaces/{workspaceSlug}/practices/items/{itemId}/reviews:
get:
operationId: listOwnItemReviews
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: itemId
required: true
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 20
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOProfileReview"
description: OK
summary: List your reviews of an item
tags:
- item
/workspaces/{workspaceSlug}/practices/items/{itemId}/trace:
get:
operationId: getItemTrace
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: itemId
required: true
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ItemTrace"
description: OK
summary: Trace reviews of an item
tags:
- item-trace
/workspaces/{workspaceSlug}/practices/practice-script-needs:
get:
operationId: listPracticeScriptNeeds
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeScriptSummary"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/releases:
get:
operationId: listPracticeReleases
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeReleaseProposal"
description: OK
summary: List pending practice releases
tags:
- Practice Catalog
/workspaces/{workspaceSlug}/practices/releases/{slug}:
delete:
operationId: declinePracticeRelease
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: true
schema:
type: string
responses:
"204":
description: The offered version was declined
summary: Decline this version of a practice release
tags:
- Practice Catalog
get:
operationId: getPracticeRelease
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeReleaseProposal"
description: OK
summary: "Compare the adopted, current, and offered practice"
tags:
- Practice Catalog
put:
operationId: acceptPracticeRelease
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slug
required: true
schema:
type: string
- in: header
name: If-Match
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/AcceptPracticeReleaseRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Practice"
description: OK
summary: Accept selected fields from a practice release
tags:
- Practice Catalog
/workspaces/{workspaceSlug}/practices/reorder:
patch:
operationId: reorderPractices
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ReorderRequest"
required: true
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/Practice"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/results:
get:
description: Paginated results for the authenticated developer with optional
filters
operationId: listOwnResults
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: groupSlug
required: false
schema:
type: string
- in: query
name: outcome
required: false
schema:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: itemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: severity
required: false
schema:
type: array
items:
type: string
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- in: query
name: displayableOnly
required: false
schema:
type: boolean
- in: query
name: sort
required: false
schema:
type: string
enum:
- NEWEST
- ACTIONABILITY
- in: query
name: page
required: false
schema:
type: integer
format: int32
- in: query
name: size
required: false
schema:
type: integer
format: int32
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOResultList"
description: Paginated results returned
summary: List results for current developer
tags:
- Practice Results
/workspaces/{workspaceSlug}/practices/results/{resultId}:
get:
operationId: getOwnResult
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: resultId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ResultDetail"
description: Result detail returned
"404":
description: Result not found or not owned by current user
summary: Get result detail
tags:
- Practice Results
/workspaces/{workspaceSlug}/practices/review-batches:
get:
operationId: listReviewBatches
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 20
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOReviewBatch"
description: OK
summary: List review batches
tags:
- review-batch
post:
operationId: createReviewBatch
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateReviewBatchRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewBatch"
description: Created
summary: Create a review batch
tags:
- review-batch
/workspaces/{workspaceSlug}/practices/review-batches/{batchId}:
get:
operationId: getReviewBatch
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: batchId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewBatch"
description: OK
summary: Get a review batch
tags:
- review-batch
/workspaces/{workspaceSlug}/practices/review-batches/{batchId}/status:
patch:
operationId: updateReviewBatchStatus
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: batchId
required: true
schema:
type: string
format: uuid
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateReviewBatchStatusRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewBatch"
description: OK
summary: "Pause, resume or cancel a review batch"
tags:
- review-batch
/workspaces/{workspaceSlug}/practices/review-context:
get:
description: "Reads the address only: nothing is fetched from it. The address\
\ must be on the server this workspace is connected to. Every way of not finding\
\ the work — not mirrored, not monitored here, another server, deleted or\
\ confidential — is the same 404."
operationId: resolveReviewContext
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- description: "The provider page's address, as the browser shows it"
in: query
name: url
required: true
schema:
type: string
maxLength: 2048
minLength: 0
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewContext"
description: "The work, and what the caller may do about it"
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: "Not an HTTPS address, or not the page of a pull request, merge\
\ request or issue"
"403":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: The caller is not a member of this workspace
"404":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: This workspace has no reviewed work at this address
summary: Find the reviewed work a provider page shows
tags:
- Practice review requests
/workspaces/{workspaceSlug}/practices/review-requests:
post:
operationId: requestReview
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateReviewRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewRequestOutcome"
description: OK
summary: Ask for a review of an item
tags:
- review-request
/workspaces/{workspaceSlug}/practices/review-schedules:
get:
operationId: listReviewSchedules
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ReviewSchedule"
description: OK
summary: List review schedules
tags:
- review-schedule
post:
operationId: createReviewSchedule
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewScheduleInput"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewSchedule"
description: Created
summary: Create a review schedule
tags:
- review-schedule
/workspaces/{workspaceSlug}/practices/review-schedules/{scheduleId}:
delete:
operationId: deleteReviewSchedule
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scheduleId
required: true
schema:
type: string
format: uuid
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"204":
description: Deleted
summary: Delete an unused review schedule
tags:
- review-schedule
patch:
operationId: setReviewScheduleEnabled
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scheduleId
required: true
schema:
type: string
format: uuid
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SetReviewScheduleEnabledRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewSchedule"
description: OK
summary: Enable or disable a review schedule
tags:
- review-schedule
put:
operationId: updateReviewSchedule
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scheduleId
required: true
schema:
type: string
format: uuid
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewScheduleInput"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewSchedule"
description: OK
summary: Update a review schedule
tags:
- review-schedule
/workspaces/{workspaceSlug}/practices/review-settings:
get:
operationId: getPracticeReviewSettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeReviewSettings"
description: Policy returned
summary: Get the workspace's practice-review policy
tags:
- Practice Review Settings
patch:
operationId: updatePracticeReviewSettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: header
name: If-Match
required: false
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdatePracticeReviewSettingsRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeReviewSettings"
description: Policy updated
summary: Update the workspace's practice-review policy
tags:
- Practice Review Settings
/workspaces/{workspaceSlug}/practices/review-settings/scope-preview:
post:
operationId: previewReviewScope
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceReviewScope"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeReviewScopePreview"
description: OK
tags:
- Practice Review Settings
/workspaces/{workspaceSlug}/practices/reviewed:
get:
operationId: listReviewedPractices
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ReviewedPractice"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/reviews:
get:
description: Results are ordered newest first.
operationId: listReviews
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
minimum: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 25
maximum: 100
minimum: 1
- in: query
name: status
required: false
schema:
type: array
items:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
- in: query
name: kind
required: false
schema:
type: string
enum:
- ITEM
- SCAN
- in: query
name: reviewId
required: false
schema:
type: string
format: uuid
- in: query
name: itemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: developerId
required: false
schema:
type: integer
format: int64
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: groupSlug
required: false
schema:
type: string
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOReviewSummary"
description: Paginated review summaries returned
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Invalid filter or pagination
summary: List practice reviews with result and feedback outcomes
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/reviews/evidence-outcomes:
get:
description: "One entry per practice that recent reviews considered, with the\
\ sources that skipped it."
operationId: getReviewEvidenceOutcomes
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ReviewEvidenceOutcome"
description: Evidence outcomes returned
summary: Summarize how each practice's evidence requirements turned out on recent
reviews
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/reviews/feedback:
get:
operationId: listReviewFeedback
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: reviewId
required: false
schema:
type: string
format: uuid
- in: query
name: itemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: groupSlug
required: false
schema:
type: string
- in: query
name: developerId
required: false
schema:
type: string
exclusiveMinimum: 0
pattern: "^[1-9][0-9]*$"
- in: query
name: destination
required: false
schema:
type: array
items:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
- in: query
name: state
required: false
schema:
type: array
items:
type: string
enum:
- AWAITING_APPROVAL
- READY
- DELIVERED
- UNCONFIRMED
- WITHHELD
- REJECTED
- REPLACED
- FAILED
- in: query
name: location
required: false
schema:
type: string
enum:
- GITHUB
- GITLAB
- OTHER_WORK
- HEPH
- SLACK
- NEXT_CONVERSATION
- PRACTICE_PAGES
- in: query
name: stopReason
required: false
schema:
type: array
items:
type: string
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
- in: query
name: withdrawn
required: false
schema:
type: boolean
- in: query
name: disagreed
required: false
schema:
type: boolean
- in: query
name: sort
required: false
schema:
type: string
enum:
- NEWEST
- OLDEST
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
minimum: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 25
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOReviewFeedback"
description: OK
tags:
- feedback-review
/workspaces/{workspaceSlug}/practices/reviews/feedback/locations:
get:
operationId: countReviewFeedbackByLocation
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: reviewId
required: false
schema:
type: string
format: uuid
- in: query
name: itemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: groupSlug
required: false
schema:
type: string
- in: query
name: developerId
required: false
schema:
type: string
exclusiveMinimum: 0
pattern: "^[1-9][0-9]*$"
- in: query
name: destination
required: false
schema:
type: array
items:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
- in: query
name: state
required: false
schema:
type: array
items:
type: string
enum:
- AWAITING_APPROVAL
- READY
- DELIVERED
- UNCONFIRMED
- WITHHELD
- REJECTED
- REPLACED
- FAILED
- in: query
name: location
required: false
schema:
type: string
enum:
- GITHUB
- GITLAB
- OTHER_WORK
- HEPH
- SLACK
- NEXT_CONVERSATION
- PRACTICE_PAGES
- in: query
name: stopReason
required: false
schema:
type: array
items:
type: string
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
- in: query
name: withdrawn
required: false
schema:
type: boolean
- in: query
name: disagreed
required: false
schema:
type: boolean
- in: query
name: sort
required: false
schema:
type: string
enum:
- NEWEST
- OLDEST
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ReasonCount"
description: OK
tags:
- feedback-review
/workspaces/{workspaceSlug}/practices/reviews/feedback/reasons:
get:
operationId: countReviewFeedbackByReason
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: reviewId
required: false
schema:
type: string
format: uuid
- in: query
name: itemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: groupSlug
required: false
schema:
type: string
- in: query
name: developerId
required: false
schema:
type: string
exclusiveMinimum: 0
pattern: "^[1-9][0-9]*$"
- in: query
name: destination
required: false
schema:
type: array
items:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
- in: query
name: state
required: false
schema:
type: array
items:
type: string
enum:
- AWAITING_APPROVAL
- READY
- DELIVERED
- UNCONFIRMED
- WITHHELD
- REJECTED
- REPLACED
- FAILED
- in: query
name: location
required: false
schema:
type: string
enum:
- GITHUB
- GITLAB
- OTHER_WORK
- HEPH
- SLACK
- NEXT_CONVERSATION
- PRACTICE_PAGES
- in: query
name: stopReason
required: false
schema:
type: array
items:
type: string
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
- in: query
name: withdrawn
required: false
schema:
type: boolean
- in: query
name: disagreed
required: false
schema:
type: boolean
- in: query
name: sort
required: false
schema:
type: string
enum:
- NEWEST
- OLDEST
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ReasonCount"
description: OK
tags:
- feedback-review
/workspaces/{workspaceSlug}/practices/reviews/feedback/{feedbackId}:
get:
operationId: getReviewFeedback
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewFeedbackDetail"
description: OK
tags:
- feedback-review
/workspaces/{workspaceSlug}/practices/reviews/feedback/{feedbackId}/decisions:
get:
operationId: listFeedbackDecisions
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedbackDecision"
description: OK
tags:
- feedback-review
post:
operationId: createFeedbackDecision
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateFeedbackDecisionRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackDecision"
description: Feedback decision recorded
tags:
- feedback-review
/workspaces/{workspaceSlug}/practices/reviews/feedback/{feedbackId}/recheck:
post:
operationId: recheckFeedbackDelivery
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
responses:
"202":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewFeedbackDetail"
description: Feedback delivery recheck accepted
tags:
- feedback-review
/workspaces/{workspaceSlug}/practices/reviews/feedback/{feedbackId}/retry:
post:
operationId: retryFeedback
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: feedbackId
required: true
schema:
type: string
format: uuid
responses:
"202":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewFeedbackDetail"
description: Feedback retry accepted
tags:
- feedback-review
/workspaces/{workspaceSlug}/practices/reviews/lineage:
get:
operationId: getReviewLineage
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: kind
required: true
schema:
type: string
enum:
- ITEM
- REVIEW
- RESULT
- PROBLEM
- FEEDBACK
- in: query
name: itemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: reviewId
required: false
schema:
type: string
format: uuid
- in: query
name: resultId
required: false
schema:
type: string
format: uuid
- in: query
name: problemId
required: false
schema:
type: string
format: uuid
- in: query
name: feedbackId
required: false
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewLineage"
description: OK
summary: "Trace an item, review, result, problem or feedback"
tags:
- practice-review-output
/workspaces/{workspaceSlug}/practices/reviews/overview:
get:
description: "In total, over time and by practice. Reviews count by when they\
\ were created, results by when they were recorded and feedback by when it\
\ was created, as the review, result and feedback lists filter them. The range\
\ is split into days, weeks or months, by its length, in the given time zone."
operationId: getReviewOverview
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- description: Inclusive lower bound; defaults to seven days before to. A range
spans at most 400 days.
in: query
name: from
required: false
schema:
type: string
format: date-time
- description: Exclusive upper bound; defaults to now
in: query
name: to
required: false
schema:
type: string
format: date-time
- description: "The IANA time zone whose midnights start the buckets, such as\
\ Europe/Berlin"
in: query
name: zone
required: false
schema:
type: string
default: UTC
- description: "True counts all of the workspace's practice reviews: from the\
\ first one's request, whatever from says, so the range may span more than\
\ 400 days. The response's from says where it started."
in: query
name: allTime
required: false
schema:
type: boolean
default: false
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewOverview"
description: Practice reviews counted
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Invalid range or time zone
summary: "Count practice reviews, results and feedback in a time range"
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/reviews/problems:
get:
operationId: listReviewProblems
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: reviewId
required: false
schema:
type: string
format: uuid
- in: query
name: itemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: groupSlug
required: false
schema:
type: string
- in: query
name: developerId
required: false
schema:
type: integer
format: int64
- in: query
name: outcome
required: false
schema:
type: array
items:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
- in: query
name: severity
required: false
schema:
type: array
items:
type: string
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- in: query
name: currentness
required: false
schema:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
- in: query
name: markedIncorrect
required: false
schema:
type: boolean
- in: query
name: accepted
required: false
schema:
type: boolean
- in: query
name: disagreed
required: false
schema:
type: boolean
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: resultId
required: false
schema:
type: string
format: uuid
- in: query
name: path
required: false
schema:
type: string
- in: query
name: openOnly
required: false
schema:
type: boolean
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
minimum: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 25
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOReviewProblem"
description: OK
summary: List review problems
tags:
- practice-review-output
/workspaces/{workspaceSlug}/practices/reviews/problems/{problemId}:
get:
operationId: getReviewProblem
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: problemId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewProblemDetail"
description: OK
summary: Get a review problem
tags:
- practice-review-output
/workspaces/{workspaceSlug}/practices/reviews/queue:
get:
description: "How many practice reviews run, wait and are held for budget now,\
\ the oldest wait, the reviews at the head of the queue, and how many reviews\
\ finished in the last hour and the last 24 hours."
operationId: getReviewQueue
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewQueue"
description: Practice review queue returned
summary: Show the practice review queue as it stands now
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/reviews/results:
get:
operationId: listReviewResults
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: reviewId
required: false
schema:
type: string
format: uuid
- in: query
name: itemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: itemKind
required: false
schema:
type: string
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: groupSlug
required: false
schema:
type: string
- in: query
name: developerId
required: false
schema:
type: integer
format: int64
exclusiveMinimum: 0
- in: query
name: outcome
required: false
schema:
type: array
items:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
- in: query
name: severity
required: false
schema:
type: array
items:
type: string
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- in: query
name: currentness
required: false
schema:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
- in: query
name: markedIncorrect
required: false
schema:
type: boolean
- in: query
name: accepted
required: false
schema:
type: boolean
- in: query
name: disagreed
required: false
schema:
type: boolean
- in: query
name: from
required: false
schema:
type: string
format: date-time
- in: query
name: to
required: false
schema:
type: string
format: date-time
- in: query
name: sort
required: false
schema:
type: string
default: NEWEST
enum:
- NEWEST
- ACTIONABILITY
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
minimum: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 25
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOReviewResult"
description: OK
summary: List review results
tags:
- practice-review-output
/workspaces/{workspaceSlug}/practices/reviews/results/{resultId}:
get:
operationId: getReviewResult
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: resultId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewResultDetail"
description: OK
summary: Get a review result
tags:
- practice-review-output
/workspaces/{workspaceSlug}/practices/reviews/results/{resultId}/marks:
get:
operationId: listResultMarks
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: resultId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ResultMark"
description: OK
summary: List the marks on a result
tags:
- practice-review-output
post:
operationId: createResultMark
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: resultId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateResultMarkRequest"
required: true
responses:
"201":
content:
application/json:
schema:
$ref: "#/components/schemas/ResultMark"
description: Created
summary: Mark a result
tags:
- practice-review-output
/workspaces/{workspaceSlug}/practices/reviews/results/{resultId}/marks/{markId}:
delete:
operationId: removeResultMark
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: resultId
required: true
schema:
type: string
format: uuid
- in: path
name: markId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/RemoveResultMarkRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ResultMark"
description: OK
summary: Remove a result mark
tags:
- practice-review-output
/workspaces/{workspaceSlug}/practices/reviews/timing:
get:
description: "The median and 90th percentile of each stage, over the reviews\
\ created in the range as the overview counts them, and the reviews that need\
\ a look. Queue waits and budget holds are counted as they stand now, whenever\
\ the review was requested."
operationId: getReviewTiming
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- description: Inclusive lower bound; defaults to seven days before to. A range
spans at most 400 days.
in: query
name: from
required: false
schema:
type: string
format: date-time
- description: Exclusive upper bound; defaults to now
in: query
name: to
required: false
schema:
type: string
format: date-time
- description: "True counts all of the workspace's practice reviews: from the\
\ first one's request, whatever from says, so the range may span more than\
\ 400 days. The response's from says where it started."
in: query
name: allTime
required: false
schema:
type: boolean
default: false
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewTiming"
description: Practice reviews measured
"400":
content:
application/problem+json:
schema:
$ref: "#/components/schemas/ProblemDetail"
description: Invalid range
summary: Measure how long each stage of the practice reviews in a time range
took
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/reviews/{reviewId}:
get:
operationId: getReview
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: reviewId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewDetail"
description: OK
summary: Get a review
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/reviews/{reviewId}/cancel:
post:
operationId: cancelReview
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: reviewId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Review"
description: Completed
"202":
content:
application/json:
schema:
$ref: "#/components/schemas/Review"
description: Accepted
summary: Cancel a practice review
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/reviews/{reviewId}/feedback-checks:
get:
operationId: listReviewFeedbackChecks
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: reviewId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FeedbackCheck"
description: OK
tags:
- feedback-review
/workspaces/{workspaceSlug}/practices/reviews/{reviewId}/practice-scripts:
get:
operationId: listReviewPracticeScripts
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: reviewId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeScriptRun"
description: OK
summary: List scripts executed in a review
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/reviews/{reviewId}/usage:
get:
operationId: getReviewUsage
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: reviewId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewUsage"
description: OK
summary: Get review usage
tags:
- Practice reviews
/workspaces/{workspaceSlug}/practices/scans:
get:
operationId: listScans
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: repositoryItemId
required: false
schema:
type: string
maxLength: 19
pattern: "^[1-9][0-9]*$"
- in: query
name: status
required: false
schema:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
minimum: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 25
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOScanSummary"
description: OK
summary: List repository scans
tags:
- scan
post:
operationId: startScan
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: header
name: Idempotency-Key
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/StartScanRequest"
required: true
responses:
"202":
content:
application/json:
schema:
$ref: "#/components/schemas/ScanSummary"
description: Accepted
summary: Start a repository scan
tags:
- scan
/workspaces/{workspaceSlug}/practices/scans/{scanId}:
get:
operationId: getScan
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scanId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ScanDetail"
description: OK
summary: Read a repository scan
tags:
- scan
/workspaces/{workspaceSlug}/practices/scans/{scanId}/report:
get:
operationId: getScanReport
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scanId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ScanReport"
description: OK
summary: Read a scan report
tags:
- scan
/workspaces/{workspaceSlug}/practices/scans/{scanId}/report/items:
get:
operationId: listScanReportItems
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scanId
required: true
schema:
type: string
format: uuid
- in: query
name: cursor
required: false
schema:
type: string
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 50
maximum: 200
minimum: 1
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: outcome
required: false
schema:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
- in: query
name: status
required: false
schema:
type: string
- in: query
name: reused
required: false
schema:
type: boolean
- in: query
name: path
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ScanReportItemsPage"
description: OK
summary: List the items in a scan report
tags:
- scan
/workspaces/{workspaceSlug}/practices/scans/{scanId}/report/problems:
get:
operationId: listScanReportProblems
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scanId
required: true
schema:
type: string
format: uuid
- in: query
name: cursor
required: false
schema:
type: string
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 50
maximum: 200
minimum: 1
- in: query
name: practiceSlug
required: false
schema:
type: string
- in: query
name: severity
required: false
schema:
type: string
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- in: query
name: path
required: false
schema:
type: string
- in: query
name: baselineState
required: false
schema:
type: string
enum:
- NEW
- UNCHANGED
- UPDATED
- ABSENT
- in: query
name: openOnly
required: false
schema:
type: boolean
default: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ScanReportProblemsPage"
description: OK
summary: List the problems in a scan report
tags:
- scan
/workspaces/{workspaceSlug}/practices/scans/{scanId}/report/sarif:
get:
operationId: exportScanSarif
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scanId
required: true
schema:
type: string
format: uuid
responses:
"200":
content:
application/sarif+json:
schema:
type: string
format: binary
description: SARIF report
summary: Export a scan report as SARIF
tags:
- scan
/workspaces/{workspaceSlug}/practices/scans/{scanId}/status:
patch:
operationId: updateScanStatus
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: scanId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CancelScanRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ScanDetail"
description: Completed
"202":
content:
application/json:
schema:
$ref: "#/components/schemas/ScanDetail"
description: Accepted
summary: Cancel a repository scan
tags:
- scan
/workspaces/{workspaceSlug}/practices/standings:
get:
description: "Returns each practice's standing, direction, supporting results,\
\ and developer guidance."
operationId: getOwnPracticeStandings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeStanding"
description: Practice standings returned
summary: List the current developer's practice standings
tags:
- Practice Standings
/workspaces/{workspaceSlug}/practices/tiles:
get:
operationId: getPracticeWorkspaceTiles
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeWorkspaceTile"
description: OK
summary: List practice result totals across the workspace
tags:
- practices-across-workspace
/workspaces/{workspaceSlug}/practices/workspace-overview:
get:
operationId: getPracticeWorkspaceOverview
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeWorkspaceOverview"
description: OK
summary: Get practice results across the workspace
tags:
- practices-across-workspace
/workspaces/{workspaceSlug}/practices/{practiceSlug}:
delete:
operationId: deletePractice
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
responses:
"204":
description: Practice deleted
tags:
- practice-catalog
get:
operationId: getPractice
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Practice"
description: OK
tags:
- practice-catalog
patch:
operationId: updatePractice
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdatePracticeRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Practice"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/{practiceSlug}/catalog-customization:
delete:
operationId: resetPracticeToCatalog
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
- in: header
name: If-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Practice"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/{practiceSlug}/feedback-mode:
patch:
operationId: setPracticeFeedbackMode
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SetFeedbackModeRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Practice"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/{practiceSlug}/group:
patch:
operationId: movePractice
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/MovePracticeRequest"
required: true
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/Practice"
description: OK
tags:
- practice-catalog
put:
operationId: bindPracticeGroup
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/BindPracticeGroupRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Practice"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/{practiceSlug}/guidance:
get:
operationId: getPracticeGuidance
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
- in: header
name: If-None-Match
required: false
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PracticeGuidanceDTO"
description: Practice guidance
"304":
description: Guidance is unchanged
tags:
- practice-catalog
/workspaces/{workspaceSlug}/practices/{practiceSlug}/versions:
get:
operationId: listPracticeVersions
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: practiceSlug
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/PracticeVersion"
description: OK
tags:
- practice-catalog
/workspaces/{workspaceSlug}/product-feedback:
post:
operationId: submitWorkspaceProductFeedback
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackRequest"
required: true
responses:
"200":
description: OK
summary: Send product feedback to instance administrators
tags:
- feedback
/workspaces/{workspaceSlug}/product-feedback/surveys:
get:
operationId: listProductSurveyInvitations
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/SurveyInvitation"
description: OK
summary: List the open surveys the current account has neither answered nor
declined
tags:
- feedback
/workspaces/{workspaceSlug}/product-feedback/surveys/{surveyId}/decline:
delete:
operationId: undoProductSurveyDecline
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
responses:
"200":
description: OK
summary: Undo a decline; a submitted response is never touched
tags:
- feedback
put:
operationId: declineProductSurvey
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
responses:
"200":
description: OK
summary: Decline a survey for the current account
tags:
- feedback
/workspaces/{workspaceSlug}/product-feedback/surveys/{surveyId}/invitation:
put:
operationId: acknowledgeProductSurveyInvitation
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
responses:
"200":
description: OK
summary: Record that the invitation was shown to the current account
tags:
- feedback
/workspaces/{workspaceSlug}/product-feedback/surveys/{surveyId}/responses:
post:
operationId: submitProductSurveyResponse
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: surveyId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SubmitSurvey"
required: true
responses:
"200":
description: OK
summary: Submit a survey response once
tags:
- feedback
/workspaces/{workspaceSlug}/public-activity:
get:
operationId: getWorkspacePublicActivitySettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityWorkspaceSettings"
description: OK
summary: Get public activity and search indexing settings
tags:
- workspace
patch:
operationId: updatePublicActivity
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateWorkspacePublicActivityRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PublicActivityWorkspaceSettings"
description: Workspace updated
summary: Turn the public activity page and search indexing on or off
tags:
- workspace
/workspaces/{workspaceSlug}/repositories:
delete:
operationId: removeRepositoryToMonitor
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: nameWithOwner
required: true
schema:
type: string
responses:
"200":
description: OK
summary: Remove a repository from a workspace monitor list
tags:
- workspace
get:
operationId: getRepositoriesToMonitor
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
type: string
description: Repository list
summary: List repositories monitored by a workspace
tags:
- workspace
post:
operationId: addRepositoryToMonitor
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: nameWithOwner
required: true
schema:
type: string
responses:
"200":
description: OK
summary: Add a repository to a workspace monitor list
tags:
- workspace
/workspaces/{workspaceSlug}/slack/channels:
get:
operationId: listSlackChannels
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/SlackMonitoredChannel"
description: OK
summary: List the workspace's allow-listed Slack channels with their consent
state
tags:
- Slack channel activation
post:
operationId: registerSlackChannel
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/RegisterSlackChannelRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/SlackMonitoredChannel"
description: OK
summary: Allow-list a Slack channel (lands in PENDING; idempotent on the natural
key)
tags:
- Slack channel activation
/workspaces/{workspaceSlug}/slack/channels/candidates:
get:
operationId: listSlackChannelCandidates
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/SlackChannelCandidate"
description: OK
summary: List Slack channels available to add to monitoring
tags:
- Slack channel activation
/workspaces/{workspaceSlug}/slack/channels/{slackChannelId}:
patch:
operationId: updateSlackChannelConsent
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slackChannelId
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateSlackChannelConsentRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/SlackMonitoredChannel"
description: OK
summary: Transition a Slack channel to a target consent state (activate / pause
/ resume / revoke)
tags:
- Slack channel activation
/workspaces/{workspaceSlug}/slack/channels/{slackChannelId}/consent-events:
get:
operationId: listSlackChannelConsentEvents
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: slackChannelId
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/SlackChannelConsentEvent"
description: OK
summary: The immutable consent-transition audit trail of one Slack channel
tags:
- Slack channel activation
/workspaces/{workspaceSlug}/slack/me/preferences:
patch:
operationId: updateSlackUserPreferences
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateSlackUserPreferencesRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/SlackUserWorkspacePreferences"
description: OK
summary: Update current user's Slack workspace preferences
tags:
- Slack User Preferences
/workspaces/{workspaceSlug}/slug:
patch:
operationId: renameSlug
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/RenameWorkspaceSlugRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
description: Workspace renamed
summary: Rename workspace slug and create redirect
tags:
- workspace
/workspaces/{workspaceSlug}/status:
patch:
operationId: updateStatus
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateWorkspaceStatusRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
description: Workspace updated
summary: Update workspace lifecycle status
tags:
- workspace
/workspaces/{workspaceSlug}/team:
get:
description: Returns all teams in the workspace organization
operationId: getAllTeams
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/TeamInfo"
description: OK
summary: List teams
tags:
- Teams
/workspaces/{workspaceSlug}/team/{id}/visibility:
post:
description: Show or hide a team in workspace activity
operationId: updateTeamVisibility
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: id
required: true
schema:
type: integer
format: int64
- in: query
name: hidden
required: false
schema:
type: boolean
requestBody:
content:
application/json:
schema:
type: boolean
responses:
"200":
description: OK
summary: Update team visibility
tags:
- Teams
/workspaces/{workspaceSlug}/team/{teamId}/repositories/{repositoryId}/visibility:
post:
operationId: updateRepositoryVisibility
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
- in: path
name: repositoryId
required: true
schema:
type: integer
format: int64
- in: query
name: hiddenFromContributions
required: false
schema:
type: boolean
requestBody:
content:
application/json:
schema:
type: boolean
responses:
"200":
description: OK
tags:
- Teams
/workspaces/{workspaceSlug}/teams/{teamId}/labels/{labelId}:
delete:
operationId: removeLabelFromTeam
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
- in: path
name: labelId
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/TeamInfo"
description: OK
summary: Remove a repository label from a team
tags:
- workspace
/workspaces/{workspaceSlug}/teams/{teamId}/labels/{repositoryId}/{label}:
post:
operationId: addLabelToTeam
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
- in: path
name: repositoryId
required: true
schema:
type: integer
format: int64
- in: path
name: label
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/TeamInfo"
description: OK
summary: Add a repository label to a team
tags:
- workspace
/workspaces/{workspaceSlug}/teams/{teamId}/settings:
get:
description: Returns the visibility settings for a team in the workspace
operationId: getTeamSettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceTeamSettings"
description: Team settings returned
summary: Get team settings
tags:
- Team Settings
patch:
description: Updates the visibility settings for a team in the workspace
operationId: updateTeamSettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateTeamSettingsRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceTeamSettings"
description: Team settings updated
"404":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceTeamSettings"
description: Team not found in workspace
summary: Update team settings
tags:
- Team Settings
/workspaces/{workspaceSlug}/teams/{teamId}/settings/label-filters:
get:
description: Returns all labels configured as filters for a team in the workspace
operationId: getLabelFilters
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/LabelInfo"
description: Label filters returned
summary: Get team label filters
tags:
- Team Settings
/workspaces/{workspaceSlug}/teams/{teamId}/settings/label-filters/{labelId}:
delete:
description: Removes a label filter from a team in the workspace
operationId: removeLabelFilter
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
- in: path
name: labelId
required: true
schema:
type: integer
format: int64
responses:
"204":
description: Label filter removed
"404":
description: Label filter not found
summary: Remove label filter
tags:
- Team Settings
post:
description: Adds a label as a filter for a team in the workspace
operationId: addLabelFilter
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
- in: path
name: labelId
required: true
schema:
type: integer
format: int64
responses:
"201":
description: Label filter added
"404":
description: Team or label not found
summary: Add label filter
tags:
- Team Settings
/workspaces/{workspaceSlug}/teams/{teamId}/settings/repositories/{repositoryId}:
get:
description: Returns the contribution visibility settings for a repository in
a team
operationId: getRepositorySettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
- in: path
name: repositoryId
required: true
schema:
type: integer
format: int64
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceTeamRepositorySettings"
description: Repository settings returned
summary: Get repository settings
tags:
- Team Settings
patch:
description: Updates the contribution visibility settings for a repository in
a team
operationId: updateRepositorySettings
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: teamId
required: true
schema:
type: integer
format: int64
- in: path
name: repositoryId
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateRepositorySettingsRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceTeamRepositorySettings"
description: Repository settings updated
"404":
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceTeamRepositorySettings"
description: Team or repository not found
summary: Update repository settings
tags:
- Team Settings
/workspaces/{workspaceSlug}/token:
patch:
operationId: updateToken
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateWorkspaceTokenRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
description: Workspace updated
summary: Update workspace Personal Access Token
tags:
- workspace
/workspaces/{workspaceSlug}/user-view/users:
get:
operationId: listUserViewUsers
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 0
minimum: 0
- in: query
name: size
required: false
schema:
type: integer
format: int32
default: 25
maximum: 100
minimum: 1
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PageResponseDTOUserViewAccount"
description: OK
summary: List workspace users and their linked account status
tags:
- User view
/workspaces/{workspaceSlug}/user-view/users/{accountId}:
get:
operationId: getUserViewUser
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
- in: path
name: accountId
required: true
schema:
type: string
maximum: 9223372036854776000
pattern: "^[1-9][0-9]*$"
- description: "Why the administrator views this account: percent-encoded UTF-8,\
\ 1–500 characters"
in: header
name: X-User-View-Reason
required: true
schema:
type: string
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/UserViewAccount"
description: OK
summary: Confirm access to a workspace user
tags:
- User view
/workspaces/{workspaceSlug}/users:
get:
operationId: getUsersWithTeams
parameters:
- description: Workspace slug
in: path
name: workspaceSlug
required: true
schema:
type: string
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/UserTeams"
description: OK
summary: List workspace users and the teams they belong to
tags:
- workspace
components:
schemas:
AcceptPracticeReleaseRequest:
type: object
properties:
choices:
type: object
additionalProperties:
type: string
enum:
- CURRENT
- OFFERED
required:
- choices
AccountAiChoice:
type: object
description: One account-wide answer; model names belong only to workspace-specific
views.
properties:
choice:
type:
- string
- "null"
enum:
- NO_AI
- IN_HOUSE_ONLY
- CLOUD
- null
updatedAt:
type:
- string
- "null"
format: date-time
required:
- choice
- updatedAt
AccountAiChoiceRequest:
type: object
properties:
choice:
type: string
enum:
- NO_AI
- IN_HOUSE_ONLY
- CLOUD
required:
- choice
AccountRef:
type: object
properties:
avatarUrl:
type:
- string
- "null"
displayName:
type:
- string
- "null"
id:
type: string
pattern: "^[1-9][0-9]*$"
identities:
type: array
items:
$ref: "#/components/schemas/ProviderIdentityRef"
status:
type: string
enum:
- UNCLAIMED
- ACTIVE
- SUSPENDED
- DELETING
- DELETED
required:
- avatarUrl
- displayName
- id
- identities
- status
ActivityAction:
type: object
description: How often one kind of activity happened on a piece of work
properties:
count:
type: integer
format: int32
description: How often it was done
example: 3
kind:
type: string
description: What was done
enum:
- PULL_REQUEST_OPENED
- PULL_REQUEST_MERGED
- PULL_REQUEST_CLOSED
- REVIEW_APPROVED
- REVIEW_CHANGES_REQUESTED
- REVIEW_COMMENTED
- COMMENTED
- CODE_COMMENTED
- ISSUE_OPENED
- ISSUE_CLOSED
required:
- count
- kind
ActivityBreakdown:
type: object
properties:
approvals:
type: integer
format: int32
changeRequests:
type: integer
format: int32
codeComments:
type: integer
format: int32
commentReviews:
type: integer
format: int32
discussionComments:
type: integer
format: int32
issuesClosed:
type: integer
format: int32
pullRequestsClosed:
type: integer
format: int32
required:
- approvals
- changeRequests
- codeComments
- commentReviews
- discussionComments
- issuesClosed
- pullRequestsClosed
ActivityCounts:
type: object
properties:
activeWeeks:
type: integer
format: int64
comments:
type: integer
format: int64
contributions:
type: integer
format: int64
issuesOpened:
type: integer
format: int64
peopleHelped:
type: integer
format: int64
pullRequestsMerged:
type: integer
format: int64
pullRequestsOpened:
type: integer
format: int64
pullRequestsReviewed:
type: integer
format: int64
required:
- activeWeeks
- comments
- contributions
- issuesOpened
- peopleHelped
- pullRequestsMerged
- pullRequestsOpened
- pullRequestsReviewed
ActivityCoverage:
type: object
description: "Completion comes from backfill checkpoints, not the presence of\
\ ledger events."
properties:
completeRepositories:
type: integer
format: int64
since:
type: string
format: date-time
totalRepositories:
type: integer
format: int64
required:
- completeRepositories
- totalRepositories
ActivityFacets:
type: object
description: "The repositories and teams that workspace activity can be narrowed\
\ to: the lists the people read also carries."
properties:
repositories:
type: array
items:
$ref: "#/components/schemas/ActivityRepository"
teams:
type: array
items:
$ref: "#/components/schemas/ActivityTeam"
required:
- repositories
- teams
ActivityHighlights:
type: object
description: Identifiers refer only to the people in the same response.
properties:
firstContributors:
type: array
items:
type: integer
format: int64
mostPeopleHelped:
type: array
items:
type: integer
format: int64
required:
- firstContributors
- mostPeopleHelped
ActivityPeople:
type: object
properties:
automation:
type: array
items:
$ref: "#/components/schemas/ActivityPerson"
coverage:
$ref: "#/components/schemas/ActivityCoverage"
from:
type: string
format: date-time
highlights:
$ref: "#/components/schemas/ActivityHighlights"
people:
type: array
items:
$ref: "#/components/schemas/ActivityPerson"
repositories:
type: array
items:
$ref: "#/components/schemas/ActivityRepository"
teams:
type: array
items:
$ref: "#/components/schemas/ActivityTeam"
to:
type: string
format: date-time
required:
- automation
- coverage
- from
- highlights
- people
- repositories
- teams
- to
ActivityPerson:
type: object
properties:
counts:
$ref: "#/components/schemas/ActivityCounts"
firstContributionAt:
type: string
format: date-time
kind:
type: string
enum:
- PERSON
- BOT
- AUTOMATION
person:
$ref: "#/components/schemas/UserInfo"
weeks:
type: array
items:
$ref: "#/components/schemas/ActivitySparklineWeek"
required:
- counts
- kind
- person
- weeks
ActivityPersonDetail:
type: object
properties:
breakdown:
$ref: "#/components/schemas/ActivityBreakdown"
counts:
$ref: "#/components/schemas/ActivityCounts"
firstContributionAt:
type: string
format: date-time
from:
type: string
format: date-time
kind:
type: string
enum:
- PERSON
- BOT
- AUTOMATION
person:
$ref: "#/components/schemas/UserInfo"
repositories:
type: array
items:
$ref: "#/components/schemas/ActivityRepositoryCounts"
to:
type: string
format: date-time
weeks:
type: array
items:
$ref: "#/components/schemas/ActivityWeek"
required:
- breakdown
- counts
- from
- kind
- person
- repositories
- to
- weeks
ActivityRepository:
type: object
description: The full provider path avoids collisions between repositories with
the same name.
properties:
id:
type: integer
format: int64
key:
type: string
name:
type: string
required:
- id
- key
- name
ActivityRepositoryCounts:
type: object
properties:
breakdown:
$ref: "#/components/schemas/ActivityBreakdown"
counts:
$ref: "#/components/schemas/ActivityCounts"
repository:
$ref: "#/components/schemas/ActivityRepository"
required:
- breakdown
- counts
- repository
ActivitySparklineWeek:
type: object
properties:
contributions:
type: integer
format: int64
start:
type: string
format: date-time
required:
- contributions
- start
ActivityTeam:
type: object
properties:
id:
type: integer
format: int64
key:
type: string
name:
type: string
parentId:
type: integer
format: int64
required:
- id
- key
- name
ActivityWeek:
type: object
properties:
breakdown:
$ref: "#/components/schemas/ActivityBreakdown"
counts:
$ref: "#/components/schemas/ActivityCounts"
start:
type: string
format: date-time
required:
- breakdown
- counts
- start
ActivityWork:
type: object
description: The activity on one pull request or issue in a time range
properties:
actions:
type: array
description: "Each kind of activity that happened on it, in a fixed order\
\ of kinds"
items:
$ref: "#/components/schemas/ActivityAction"
id:
type: string
description: "Identifier of the group: work:displayName/email are null for deleted
accounts.
properties:
displayName:
type: string
email:
type: string
id:
type: integer
format: int64
required:
- id
AuthEventView:
type: object
description: "One audit row, flattened for the admin viewer."
properties:
account:
$ref: "#/components/schemas/AuthAuditAccount"
accountId:
type: integer
format: int64
actingAccountId:
type: integer
format: int64
actor:
$ref: "#/components/schemas/AuthAuditAccount"
details:
type: string
elevatedViaInstanceAdmin:
type: boolean
eventType:
type: string
failureReason:
type: string
id:
type: integer
format: int64
ipAddress:
type: string
occurredAt:
type: string
format: date-time
result:
type: string
userAgent:
type: string
viewedAccountId:
type: integer
format: int64
viewedActorId:
type: integer
format: int64
workspaceId:
type: integer
format: int64
required:
- elevatedViaInstanceAdmin
- eventType
- id
- occurredAt
- result
AvailableLlmModel:
type: object
description: A model available for this workspace to bind a Task to
properties:
brand:
type: string
description: Model brand declared by an admin; display only
enum:
- OPENAI
- ANTHROPIC
- GEMINI
- GEMMA
- META
- MISTRAL
- QWEN
- DEEPSEEK
- XAI
- COHERE
- Z_AI
- MOONSHOT
connectionDisplayName:
type: string
description: Owning connection's display name
dataHandlingTier:
type: string
description: Data-handling tier derived from the admin's declared facts
enum:
- IN_HOUSE
- CLOUD
- UNDECLARED
displayName:
type: string
description: Human-readable name
id:
type: integer
format: int64
description: "Model id, unique within its scope"
per1mCacheReadUsd:
type: number
format: decimal
description: Cache-read rate per 1M tokens (USD)
per1mCacheWriteUsd:
type: number
format: decimal
description: Cache-write rate per 1M tokens (USD)
per1mInputUsd:
type: number
format: decimal
description: Input rate per 1M tokens (USD)
per1mOutputUsd:
type: number
format: decimal
description: Output rate per 1M tokens (USD)
pricingMode:
type: string
description: Pricing mode
enum:
- PRICED
- NO_CHARGE
- UNPRICED
purposes:
type: array
description: "The purposes a binding may assign this model to, from its\
\ connection's protocol"
items:
type: string
enum:
- PRACTICE_REVIEW
- MENTOR
- PRACTICE_DECISION
- PRACTICE_EMBEDDING
- PRACTICE_RERANKING
reasoningEffort:
type: string
description: "Reasoning effort requested of the model; null sends none,\
\ the provider's default applies"
enum:
- NONE
- MINIMAL
- LOW
- MEDIUM
- HIGH
- XHIGH
- MAX
scope:
type: string
description: SHARED (instance catalog) or WORKSPACE (your own provider)
enum:
- SHARED
- WORKSPACE
required:
- connectionDisplayName
- dataHandlingTier
- displayName
- id
- pricingMode
- purposes
- scope
BackfillSummary:
type: object
description: Connection-level backfill rollup
properties:
percent:
type: integer
format: int32
description: "0-100 completion estimate, if computable"
state:
type: string
description: Integration-defined backfill state string
required:
- state
Basis:
type: object
properties:
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceSlug:
type: string
practiceVersionId:
type:
- string
- "null"
resultId:
type: string
format: uuid
required:
- outcome
- practiceSlug
- practiceVersionId
- resultId
BindPracticeGroupRequest:
type: object
properties:
groupSlug:
type:
- string
- "null"
required:
- groupSlug
BoundModelSlot:
type: object
properties:
kind:
type: string
enum:
- CHAT
- DECISION
- EMBEDDING
- RERANKING
model:
anyOf:
- $ref: "#/components/schemas/FrozenModel"
- type: "null"
slot:
type: string
required:
- kind
- model
- slot
CancelScanRequest:
type: object
properties:
status:
type: string
enum:
- CANCELLED
required:
- status
Catalog:
type: object
properties:
groups:
type: array
items:
$ref: "#/components/schemas/CatalogGroup"
practices:
type: array
items:
$ref: "#/components/schemas/CatalogPractice"
required:
- groups
- practices
CatalogAdoptionGroup:
type: object
properties:
definition:
$ref: "#/components/schemas/GroupDefinition"
disposition:
type: string
enum:
- UNASSIGNED
- REUSE_EXISTING_GROUP
- CREATE_CATALOG_GROUP
slug:
type: string
CatalogGroup:
type: object
properties:
changeKind:
type: string
enum:
- NONE
- WORDING
- PRESENTATION
- REVIEW
color:
type:
- string
- "null"
description:
type:
- string
- "null"
etag:
type: string
excluded:
type: boolean
icon:
type:
- string
- "null"
name:
type: string
offered:
type: boolean
position:
type: integer
format: int32
shipped:
anyOf:
- $ref: "#/components/schemas/GroupDefinition"
- type: "null"
slug:
type: string
state:
type: string
enum:
- FROM_HEPHAESTUS
- EDITED_HERE
- UPDATE_WAITING
- YOURS
- NO_LONGER_SHIPPED
required:
- changeKind
- color
- description
- etag
- excluded
- icon
- name
- offered
- position
- shipped
- slug
- state
CatalogGroupAdoptionPreview:
type: object
properties:
actions:
type: array
items:
$ref: "#/components/schemas/CatalogGroupPracticeAction"
definition:
$ref: "#/components/schemas/GroupDefinition"
disposition:
type: string
enum:
- UNASSIGNED
- REUSE_EXISTING_GROUP
- CREATE_CATALOG_GROUP
etag:
type: string
practices:
type: array
items:
$ref: "#/components/schemas/CatalogPracticePreview"
slug:
type: string
CatalogGroupAdoptionResult:
type: object
properties:
added:
type: array
items:
$ref: "#/components/schemas/Practice"
moved:
type: array
items:
$ref: "#/components/schemas/Practice"
required:
- added
- moved
CatalogGroupInput:
type: object
properties:
color:
type:
- string
- "null"
maxLength: 32
minLength: 0
description:
type:
- string
- "null"
maxLength: 2000
minLength: 0
icon:
type:
- string
- "null"
maxLength: 64
minLength: 0
name:
type: string
maxLength: 128
minLength: 0
position:
type:
- "null"
- integer
format: int32
minimum: 0
slug:
type: string
maxLength: 64
minLength: 0
pattern: "[a-z0-9]+(?:-[a-z0-9]+)*"
required:
- color
- description
- icon
- name
- position
- slug
CatalogGroupPracticeAction:
type: object
properties:
action:
type: string
enum:
- ADD
- MOVE_TO_GROUP
- KEEP
- BLOCKED
slug:
type: string
required:
- action
- slug
CatalogGroupUpdate:
type: object
properties:
color:
type:
- string
- "null"
maxLength: 32
minLength: 0
description:
type:
- string
- "null"
maxLength: 2000
minLength: 0
icon:
type:
- string
- "null"
maxLength: 64
minLength: 0
name:
type: string
maxLength: 128
minLength: 0
position:
type:
- "null"
- integer
format: int32
minimum: 0
required:
- color
- description
- icon
- name
- position
CatalogOrigin:
type: object
properties:
catalogSlug:
type:
- string
- "null"
localEdits:
type: array
items:
type: string
enum:
- NAME
- REVIEW_ON
- APPLIES_WHEN
- ABOUT
- READS
- REVIEWED_BY
- CRITERIA
- SCRIPT
- SCAN
- LINE_NOTES
- GUIDANCE
offeredDigest:
type:
- string
- "null"
state:
type: string
enum:
- FROM_HEPHAESTUS
- EDITED_HERE
- UPDATE_WAITING
- YOURS
- NO_LONGER_SHIPPED
required:
- catalogSlug
- localEdits
- offeredDigest
- state
CatalogPractice:
type: object
properties:
changeKind:
type: string
enum:
- NONE
- WORDING
- PRESENTATION
- REVIEW
definition:
$ref: "#/components/schemas/PracticeDefinition"
etag:
type: string
excluded:
type: boolean
groupSlug:
type:
- string
- "null"
kind:
type: string
offered:
type: boolean
position:
type: integer
format: int32
shipped:
anyOf:
- $ref: "#/components/schemas/PracticeDefinition"
- type: "null"
slug:
type: string
state:
type: string
enum:
- FROM_HEPHAESTUS
- EDITED_HERE
- UPDATE_WAITING
- YOURS
- NO_LONGER_SHIPPED
required:
- changeKind
- definition
- etag
- excluded
- groupSlug
- kind
- offered
- position
- shipped
- slug
- state
CatalogPracticeInput:
type: object
properties:
definition:
$ref: "#/components/schemas/PracticeDefinitionInput"
groupSlug:
type:
- string
- "null"
kind:
type: string
pattern: "[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*"
position:
type:
- "null"
- integer
format: int32
minimum: 0
slug:
type: string
maxLength: 64
minLength: 0
pattern: "[a-z0-9]+(?:-[a-z0-9]+)*"
required:
- definition
- groupSlug
- kind
- position
- slug
CatalogPracticePreview:
type: object
properties:
availability:
type: string
enum:
- AVAILABLE
- ADOPTED
- SLUG_CONFLICT
definition:
$ref: "#/components/schemas/PracticeDefinition"
etag:
type: string
group:
$ref: "#/components/schemas/CatalogAdoptionGroup"
initialFeedbackMode:
type: string
enum:
- "OFF"
- APPROVE_FIRST
- AUTOMATIC
kind:
type: string
offeredDigest:
type: string
slug:
type: string
CatalogPracticeSummary:
type: object
properties:
availability:
type: string
enum:
- AVAILABLE
- ADOPTED
- SLUG_CONFLICT
groupName:
type: string
groupSlug:
type: string
kind:
type: string
name:
type: string
reviewedBy:
$ref: "#/components/schemas/ReviewedBy"
slug:
type: string
whyItMatters:
type: string
CatalogPracticeUpdate:
type: object
properties:
definition:
$ref: "#/components/schemas/PracticeDefinitionInput"
groupSlug:
type:
- string
- "null"
kind:
type: string
pattern: "[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*"
position:
type:
- "null"
- integer
format: int32
minimum: 0
required:
- definition
- groupSlug
- kind
- position
ChatMessage:
type: object
description: Mentor chat message in AI SDK UIMessage shape.
properties:
createdAt:
type: string
format: date-time
id:
type: string
format: uuid
metadata:
type: object
additionalProperties: {}
description: "Per-turn metadata: status, model, costUsd, usage, …"
parentMessageId:
type: string
format: uuid
parts:
type: array
items:
description: AI SDK UIMessage part (text / data-result).
role:
type: string
ChatMessageVote:
type: object
description: User vote on a mentor assistant message.
properties:
isUpvoted:
type: boolean
messageId:
type: string
format: uuid
updatedAt:
type: string
format: date-time
ChatMessageVoteRequest:
type: object
description: Upsert a vote on a mentor assistant message
properties:
isUpvoted:
type: boolean
description: "true = upvote (helpful), false = downvote"
required:
- isUpvoted
ChatThreadDetail:
type: object
description: Mentor chat thread with all messages and the owner's votes on them.
properties:
createdAt:
type: string
format: date-time
id:
type: string
format: uuid
messages:
type: array
items:
$ref: "#/components/schemas/ChatMessage"
title:
type: string
votes:
type: object
additionalProperties:
type: boolean
ChatThreadSummary:
type: object
description: Mentor chat thread summary (no messages).
properties:
createdAt:
type: string
format: date-time
id:
type: string
format: uuid
title:
type: string
required:
- createdAt
- id
CitationCapabilities:
type: object
properties:
commit:
type: string
enum:
- REQUIRED
- OPTIONAL
- FORBIDDEN
side:
type: string
enum:
- REQUIRED
- OPTIONAL
- FORBIDDEN
CitationProof:
type: object
properties:
itemSha256:
type: string
quoteSha256:
type: string
status:
type: string
enum:
- VERIFIED
CitationProofDTO:
type: object
properties:
itemSha256:
type: string
quoteSha256:
type: string
status:
type: string
enum:
- VERIFIED
required:
- itemSha256
- quoteSha256
- status
ClaimBasis:
discriminator:
propertyName: type
properties:
type:
type: string
required:
- type
ClaimedCoverage:
allOf:
- $ref: "#/components/schemas/ResultCoverage"
- type: object
properties:
checked:
type: integer
format: int32
complete:
type: boolean
omitted:
type: array
items:
$ref: "#/components/schemas/CoverageOmission"
selected:
type: integer
format: int32
total:
type: integer
format: int32
ClientRefreshRequest:
type: object
properties:
refreshToken:
type: string
pattern: "^[A-Za-z0-9_-]{43}$"
required:
- refreshToken
ClientSessionTokens:
type: object
properties:
accessToken:
type: string
accessTokenExpiresAt:
type: string
format: date-time
refreshToken:
type: string
sessionExpiresAt:
type: string
format: date-time
required:
- accessToken
- accessTokenExpiresAt
- refreshToken
- sessionExpiresAt
ClientSignInConfiguration:
type: object
properties:
registered:
type: boolean
required:
- registered
ClientTokenRequest:
type: object
properties:
clientId:
type: string
pattern: "^[a-p]{32}$"
code:
type: string
pattern: "^[A-Za-z0-9_-]{43}$"
codeVerifier:
type: string
pattern: "^[A-Za-z0-9._~-]{43,128}$"
redirectUri:
type: string
maxLength: 200
minLength: 0
required:
- clientId
- code
- codeVerifier
- redirectUri
ClosedPracticePageSupport:
type: object
properties:
readAt:
type: string
format: date-time
refusal:
type:
- string
- "null"
state:
type: string
enum:
- UNAVAILABLE
- REFUSED
required:
- readAt
- refusal
- state
CompletePracticePageSupport:
type: object
properties:
practices:
type: array
items:
$ref: "#/components/schemas/PracticeSupport"
readAt:
type: string
format: date-time
state:
type: string
enum:
- COMPLETE
required:
- practices
- readAt
- state
ComposedFeedback:
type: object
properties:
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
notes:
type: array
items:
$ref: "#/components/schemas/Note"
page:
$ref: "#/components/schemas/Page"
resultIds:
type: array
items:
type: string
format: uuid
summary:
type: string
trace:
$ref: "#/components/schemas/FeedbackCompositionTrace"
withheldReason:
type: string
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
ConfigAuditActorRef:
type: object
description: |-
A human-readable actor identity on an audit row. Resolved at read time, so an erased account
degrades here without the trail being rewritten: AccountPurger clears the email, replaces
the display name with a placeholder, and nulls the row's actor references.
Named distinctly from the auth trail's own AccountRefDTO: the OpenAPI schema key is the
simple name minus the DTO suffix, so two AccountRefDTO records would collide and one
would be silently dropped from the spec.
properties:
displayName:
type: string
email:
type: string
id:
type: integer
format: int64
required:
- id
ConfigAuditEntryView:
type: object
description: "One audit row, flattened for a viewer. Crosses the module boundary,\
\ so it carries no entity."
properties:
actingAccountId:
type: integer
format: int64
actingActor:
$ref: "#/components/schemas/ConfigAuditActorRef"
description: "resolved impersonator, present only for {@link ConfigAuditActorKind#IMPERSONATED\
\ ConfigAuditActorKind#IMPERSONATED}"
action:
type: string
enum:
- CREATED
- UPDATED
- DELETED
actor:
$ref: "#/components/schemas/ConfigAuditActorRef"
description: |-
resolved identity of actorAccountId; null for SYSTEM rows or once the
account is gone. Read together with actorKind — that is what keeps
"a system did this" distinct from "we no longer know who did this".
actorAccountId:
type: integer
format: int64
actorKind:
type: string
enum:
- USER
- SYSTEM
- IMPERSONATED
changedKeys:
type: array
description: dot-paths that differ between oldValue and newValue
items:
type: string
elevatedViaInstanceAdmin:
type: boolean
description: whether the actor reached this workspace by instance-admin
elevation
entityId:
type: string
entityType:
type: string
enum:
- PRACTICE_REVIEW_SETTINGS
- AGENT_BINDING
- AGENT_CONFIG
- AI_CONFIG_BINDING
- WORKSPACE_ROLE
- ACTIVITY_AUTOMATION
- WORKSPACE_FEATURES
- WORKSPACE_STATUS
- WORKSPACE_TOKEN
- WORKSPACE_VISIBILITY
- PRACTICE_ACTIVE
- PRACTICE_USAGE
- PRACTICE_DEFINITION
- PRACTICE_GROUP
- CATALOG_PRACTICE
- CATALOG_GROUP
- WORKSPACE_INSTANCE_LLM_BUDGET
- WORKSPACE_OWN_PROVIDER_LLM_BUDGET
- WORKSPACE_LLM_BUDGET
- WORKSPACE_BYO_LLM_BUDGET
- REVIEW_BATCH
- REVIEW_SCHEDULE
- FEEDBACK_DELIVERY_RECHECK
- WORKSPACE_LLM_CONNECTION
- WORKSPACE_LLM_MODEL
id:
type: integer
format: int64
newValue:
type: string
occurredAt:
type: string
format: date-time
oldValue:
type: string
workspaceId:
type: integer
format: int64
required:
- elevatedViaInstanceAdmin
ConfigurationFact:
type: object
properties:
documentationUrl:
type: string
explanation:
type: string
id:
type: string
requirement:
type: string
enum:
- REQUIRED
- RECOMMENDED
- OPTIONAL
roles:
type: array
items:
type: string
enum:
- SERVER
- WORKER
- WEBHOOK
status:
type: string
enum:
- SATISFIED
- ACTION_REQUIRED
- NOT_CONFIGURED
- NOT_APPLICABLE
subject:
type: string
required:
- documentationUrl
- explanation
- id
- requirement
- roles
- status
- subject
ConnectionAuditEntry:
type: object
description: |-
Audit-log entry returned by GET /workspaces/{workspaceSlug/connections/{id}/audit}.
Lean projection of {@link ConnectionAudit ConnectionAudit} — the entity carries a back-reference to
Connection that this DTO omits.
properties:
actorAccountId:
type: integer
format: int64
actorKind:
type: string
actorRef:
type: string
correlationId:
type: string
eventType:
type: string
fromState:
type: string
enum:
- PENDING
- ACTIVE
- SUSPENDED
- UNINSTALLED
occurredAt:
type: string
format: date-time
toState:
type: string
enum:
- PENDING
- ACTIVE
- SUSPENDED
- UNINSTALLED
ConnectionDetail:
type: object
description: |-
Detailed view of a single Connection — extends {@link ConnectionSummaryDTO ConnectionSummaryDTO} with the
sealed config serialized to a free-form JSON object (Map<String, Object> →
type: object, additionalProperties: true in the spec, so it round-trips through
client codegen). NEVER carries credentials: the encrypted credential blob stays inside the
entity, and every secret-bearing key of the config itself is stripped by
redactSensitive before serialization.
Why redact here and not with @JsonIgnore on the record component? The very
same ObjectMapper bean serializes ConnectionConfig into the JSONB
connection.config column (Hibernate's json_format_mapper is wired to it in
HibernateJacksonFormatMapperConfig). Annotating the component would therefore drop the
secret on write and destroy the stored value — the API-boundary filter below is the only place
the two concerns can be separated.
Mirroring the summary fields (rather than embedding the summary record) keeps
the JSON shape flat — the API consumer sees one record, not a nested summary
object.
properties:
attentionProblem:
type: string
enum:
- CREDENTIAL_EXPIRING
- CREDENTIAL_REVOKED
- PROVIDER_SUSPENDED
capabilities:
type: array
items:
type: string
enum:
- WEBHOOK_INGEST
- TOKEN_REFRESH
- FEEDBACK_DELIVERY
- INLINE_FEEDBACK
- APPROVAL_WORKFLOW
- SCOPE_CHANGES
uniqueItems: true
config:
type: object
additionalProperties: {}
createdAt:
type: string
format: date-time
credentialsUnreadableSince:
type: string
format: date-time
displayName:
type: string
family:
type: string
enum:
- SCM
- MESSAGING
- DOCUMENTATION
id:
type: integer
format: int64
instanceKey:
type: string
kind:
type: string
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
state:
type: string
enum:
- PENDING
- ACTIVE
- SUSPENDED
- UNINSTALLED
stateReason:
type: string
tokenExpiresAt:
type: string
format: date
tokenExpiryCheckedAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
ConnectionSummary:
type: object
description: |-
Wire shape returned by the GET /workspaces/{workspaceSlug/connections}
list + by lifecycle endpoints (suspend, reactivate). Lightweight — no config, no
credentials, no audit. Capabilities are looked up from the per-kind manifest at
response build time so adding/removing a capability needs no DB migration.
properties:
capabilities:
type: array
items:
type: string
enum:
- WEBHOOK_INGEST
- TOKEN_REFRESH
- FEEDBACK_DELIVERY
- INLINE_FEEDBACK
- APPROVAL_WORKFLOW
- SCOPE_CHANGES
uniqueItems: true
createdAt:
type: string
format: date-time
credentialsUnreadableSince:
type: string
format: date-time
displayName:
type: string
family:
type: string
enum:
- SCM
- MESSAGING
- DOCUMENTATION
id:
type: integer
format: int64
instanceKey:
type: string
kind:
type: string
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
state:
type: string
enum:
- PENDING
- ACTIVE
- SUSPENDED
- UNINSTALLED
stateReason:
type: string
updatedAt:
type: string
format: date-time
ConnectionSyncStatus:
type: object
description: Unified sync-observability status for one connection
properties:
activeJob:
$ref: "#/components/schemas/SyncJob"
description: "Currently PENDING/RUNNING job, if any"
backfill:
$ref: "#/components/schemas/BackfillSummary"
description: "Connection-level backfill rollup, if applicable"
backfillSupported:
type: boolean
description: "Whether this kind's runner offers an explicitly triggerable\
\ backfill pass. Reflects the vendor capability only — the scheduled-backfill\
\ flag does not gate it, so a manual backfill stays available while the\
\ automatic cycle is administratively paused."
connectionId:
type: integer
format: int64
description: Connection id
connectionState:
type: string
description: Raw connection lifecycle state
enum:
- PENDING
- ACTIVE
- SUSPENDED
- UNINSTALLED
health:
type: string
description: Derived health
enum:
- PENDING
- HEALTHY
- DEGRADED
- FAILED
- SUSPENDED
kind:
type: string
description: Integration kind
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
lastEventProcessedAt:
type: string
format: date-time
description: "When the last inbound webhook/event was processed for this\
\ connection, if any"
lastJob:
$ref: "#/components/schemas/SyncJob"
description: "Most recently finished job, if any"
lastSuccessfulSyncAt:
type: string
format: date-time
description: Most recent successful job's finish time
nextScheduledSyncAt:
type: string
format: date-time
description: When the next periodic reconciliation is expected
rateLimit:
$ref: "#/components/schemas/RateLimitSnapshot"
description: "Current rate-limit budget, if known"
resourceCounts:
$ref: "#/components/schemas/ResourceCounts"
description: Resource-level rollup
syncIntervalSeconds:
type: integer
format: int64
description: "The periodic reconciliation's cadence in seconds, when the\
\ schedule has a regular one. This is what makes a resource's lastSyncedAt\
\ judgeable: \"synced 4h ago\" is only stale if the cadence is hourly,\
\ and a client cannot know that without this. Null when the schedule is\
\ irregular or unparseable — clients must then decline to judge staleness\
\ rather than assume a default, exactly as the server's own stale rollup\
\ does."
webhookRegistered:
type: boolean
description: Whether the vendor webhook registration is present; null if
not applicable/unknown
required:
- backfillSupported
- connectionId
- connectionState
- health
- kind
- resourceCounts
ConsentStatus:
type: object
properties:
completed:
type: boolean
noticeVersion:
type: string
description: Version of the first-login wording the client must be rendering
participateInResearch:
type: boolean
researchOrganization:
type: string
description: "Organization that runs the optional research program, or null\
\ when this instance runs none"
required:
- completed
- noticeVersion
- participateInResearch
Contributor:
type: object
description: Information about a contributor to the Hephaestus project
properties:
avatarUrl:
type: string
description: URL to the contributor's avatar image
contributions:
type: integer
format: int32
description: Number of contributions to the project
example: 42
htmlUrl:
type: string
description: URL to the contributor's GitHub profile
id:
type: integer
format: int64
description: GitHub user ID
login:
type: string
description: GitHub username
name:
type: string
description: Display name of the contributor
required:
- avatarUrl
- htmlUrl
- id
- login
- name
ConversationEligibility:
type: object
properties:
readAt:
type: string
format: date-time
results:
type: array
items:
$ref: "#/components/schemas/ResultDecision"
state:
type: string
enum:
- COMPLETE
- UNAVAILABLE
- REFUSED
required:
- readAt
- results
- state
Copy:
type: object
properties:
body:
type:
- string
- "null"
endLine:
type:
- "null"
- integer
format: int32
externalRef:
type:
- string
- "null"
externalUrl:
type:
- string
- "null"
id:
type: string
format: uuid
kind:
type: string
enum:
- SUMMARY
- LINE_NOTE
- FILE_NOTE
- CHAT_TURN
path:
type:
- string
- "null"
postedAt:
type: string
format: date-time
side:
type:
- string
- "null"
enum:
- OLD
- NEW
- null
startLine:
type:
- "null"
- integer
format: int32
state:
type: string
enum:
- PLANNED
- WRITE_STARTED
- POSTED
- FAILED
- WITHHELD
- RETRACTED
required:
- body
- endLine
- externalRef
- externalUrl
- id
- kind
- path
- postedAt
- side
- startLine
- state
CopySupport:
type: object
properties:
basedOn:
type: array
items:
$ref: "#/components/schemas/Support"
kind:
type: string
enum:
- SUMMARY
- LINE_NOTE
- FILE_NOTE
- CHAT_TURN
position:
type: integer
format: int32
CoverageOmission:
type: object
properties:
count:
type: integer
format: int32
items:
type: array
items:
type: string
reason:
type: string
enum:
- selection
- truncated
- unavailable
- budget
- deadline
- too-large
- off-format
- refused
- error
- cancelled
what:
type: string
CreateFeedbackDecisionRequest:
type: object
properties:
action:
type: string
enum:
- APPROVE
- REJECT
- WITHDRAW
- RESTORE
contentDigest:
type: string
pattern: "^[0-9a-f]{64}$"
note:
type: string
maxLength: 500
minLength: 0
reasonCode:
type: string
enum:
- INCORRECT
- MISSING_CONTEXT
- UNHELPFUL
- DUPLICATE
- INAPPROPRIATE_LOCATION
- OTHER
required:
- action
CreateLlmConnectionRequest:
type: object
description: Create an instance LLM provider connection
properties:
apiKey:
type: string
description: API key (write-only; never returned)
apiProtocol:
type: string
description: Wire protocol
enum:
- openai-completions
- openai-responses
- openai-decisions
- openai-embeddings
- cohere-rerank
example: openai-responses
authMode:
type: string
description: Credential shape (default BEARER)
enum:
- BEARER
- API_KEY
baseUrl:
type: string
description: Provider base URL
maxLength: 2048
minLength: 0
connectionPlatform:
type: string
description: Admin-declared connection platform; null when not declared
enum:
- LOGOS
- VLLM
- OLLAMA
- AZURE
- AWS_BEDROCK
- GOOGLE_VERTEX
- OPENAI
- GOOGLE_AI_STUDIO
- ALIBABA_CLOUD
- GROQ
- FIREWORKS
- TOGETHER_AI
- DEEPINFRA
- NEBIUS
- OPENROUTER
- CLOUDFLARE_AI_GATEWAY
- VERCEL_AI_GATEWAY
displayName:
type: string
description: Human-readable name
maxLength: 128
minLength: 0
enabled:
type: boolean
description: Whether the connection is enabled (default false)
slug:
type: string
description: Optional internal slug; generated from displayName when omitted
maxLength: 63
minLength: 0
required:
- apiProtocol
- baseUrl
- displayName
CreateLlmModelRequest:
type: object
description: Create a model on an instance LLM connection
properties:
brand:
type: string
description: Model brand declared by an admin; display only
enum:
- OPENAI
- ANTHROPIC
- GEMINI
- GEMMA
- META
- MISTRAL
- QWEN
- DEEPSEEK
- XAI
- COHERE
- Z_AI
- MOONSHOT
contextWindow:
type: integer
format: int32
description: Context window in tokens
minimum: 1
dataHandlingNote:
type: string
description: "Admin-only note: region, agreement, renewal date"
maxLength: 200
minLength: 0
displayName:
type: string
description: Human-readable name
maxLength: 128
minLength: 0
enabled:
type: boolean
description: Whether the model is active (default false)
maxOutputTokens:
type: integer
format: int32
description: Maximum output tokens
minimum: 1
operatedBy:
type: string
description: Who operates the systems the work is sent to; omit to leave
the model undeclared
enum:
- OWN_ORGANISATION
- PROVIDER
reasoningEffort:
type: string
description: "Reasoning effort to request; null sends none, so the provider's\
\ own default applies"
enum:
- NONE
- MINIMAL
- LOW
- MEDIUM
- HIGH
- XHIGH
- MAX
slug:
type: string
description: Optional internal slug; generated from displayName when omitted
maxLength: 63
minLength: 0
upstreamModelId:
type: string
description: Upstream provider model id
maxLength: 256
minLength: 0
required:
- displayName
- upstreamModelId
CreateLoginProviderRequest:
type: object
properties:
baseUrl:
type: string
description: Instance base URL (GitLab only; GitHub is always github.com)
example: https://gitlab.example.com
clientId:
type: string
minLength: 1
clientSecret:
type: string
description: "OAuth client secret; sealed at rest, never returned"
minLength: 1
displayName:
type: string
description: Label shown on the login button; defaults to the registrationId
registrationId:
type: string
description: Stable id used in the OAuth callback path and identity resolution
example: gitlab-acme
minLength: 1
scopes:
type: string
description: Space-separated scopes; defaulted by provider type if omitted
type:
type: string
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
required:
- clientId
- clientSecret
- registrationId
- type
CreatePracticeGroupRequest:
type: object
properties:
color:
type:
- string
- "null"
maxLength: 32
minLength: 0
description:
type:
- string
- "null"
maxLength: 2000
minLength: 0
icon:
type:
- string
- "null"
maxLength: 64
minLength: 0
name:
type: string
maxLength: 128
minLength: 0
position:
type:
- "null"
- integer
format: int32
minimum: 0
shownToDevelopers:
type: boolean
slug:
type: string
maxLength: 64
minLength: 0
pattern: "[a-z0-9]+(?:-[a-z0-9]+)*"
required:
- color
- description
- icon
- name
- position
- shownToDevelopers
- slug
CreatePracticeRequest:
type: object
properties:
definition:
$ref: "#/components/schemas/PracticeDefinitionInput"
groupSlug:
type:
- string
- "null"
kind:
type: string
pattern: "[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*"
position:
type:
- "null"
- integer
format: int32
minimum: 0
slug:
type: string
maxLength: 64
minLength: 0
pattern: "[a-z0-9]+(?:-[a-z0-9]+)*"
required:
- definition
- groupSlug
- kind
- position
- slug
CreateResultMarkRequest:
type: object
properties:
kind:
type: string
enum:
- INCORRECT
- ACCEPTED
reason:
type: string
required:
- kind
- reason
CreateReviewBatchRequest:
type: object
properties:
budgetUsd:
type:
- string
- "null"
from:
type:
- string
- "null"
format: date-time
itemKind:
type: string
to:
type:
- string
- "null"
format: date-time
required:
- budgetUsd
- from
- itemKind
- to
CreateReviewRequest:
type: object
properties:
itemId:
type: string
pattern: "^[1-9][0-9]*$"
required:
- itemId
CreateSurvey:
type: object
properties:
description:
type: string
maxLength: 500
minLength: 0
endsAt:
type: string
format: date-time
purpose:
type: string
enum:
- PRODUCT
- RESEARCH
questions:
type: array
items:
$ref: "#/components/schemas/Question"
maxItems: 20
minItems: 0
startsAt:
type: string
format: date-time
title:
type: string
maxLength: 160
minLength: 0
workspaceId:
type: integer
format: int64
required:
- description
- purpose
- questions
- startsAt
- title
CreateWorkspaceLlmConnectionRequest:
type: object
description: Connect your own AI provider
properties:
apiKey:
type: string
description: API key (write-only; never returned)
apiProtocol:
type: string
description: Wire protocol
enum:
- openai-completions
- openai-responses
- openai-decisions
- openai-embeddings
- cohere-rerank
example: openai-responses
authMode:
type: string
description: Credential shape (default BEARER)
enum:
- BEARER
- API_KEY
baseUrl:
type: string
description: Provider base URL
maxLength: 2048
minLength: 0
connectionPlatform:
type: string
description: Admin-declared connection platform; null when not declared
enum:
- LOGOS
- VLLM
- OLLAMA
- AZURE
- AWS_BEDROCK
- GOOGLE_VERTEX
- OPENAI
- GOOGLE_AI_STUDIO
- ALIBABA_CLOUD
- GROQ
- FIREWORKS
- TOGETHER_AI
- DEEPINFRA
- NEBIUS
- OPENROUTER
- CLOUDFLARE_AI_GATEWAY
- VERCEL_AI_GATEWAY
displayName:
type: string
description: Human-readable name
maxLength: 128
minLength: 0
enabled:
type: boolean
description: Whether the connection is active (default false)
slug:
type: string
description: Optional internal slug; generated from displayName when omitted
maxLength: 63
minLength: 0
required:
- apiProtocol
- baseUrl
- displayName
CreateWorkspaceLlmModelRequest:
type: object
description: Create a model on your AI provider
properties:
brand:
type: string
description: Model brand declared by an admin; display only
enum:
- OPENAI
- ANTHROPIC
- GEMINI
- GEMMA
- META
- MISTRAL
- QWEN
- DEEPSEEK
- XAI
- COHERE
- Z_AI
- MOONSHOT
contextWindow:
type: integer
format: int32
description: Context window in tokens
minimum: 1
dataHandlingNote:
type: string
description: "Admin-only note: region, agreement, renewal date"
maxLength: 200
minLength: 0
displayName:
type: string
description: Human-readable name
maxLength: 128
minLength: 0
enabled:
type: boolean
description: Whether the model is active (default false)
maxOutputTokens:
type: integer
format: int32
description: Maximum output tokens
minimum: 1
operatedBy:
type: string
description: Who operates the systems the work is sent to; omit to leave
the model undeclared
enum:
- OWN_ORGANISATION
- PROVIDER
per1mCacheReadUsd:
type: number
format: decimal
description: "Cache-read rate per 1M tokens (USD), if applicable"
per1mCacheWriteUsd:
type: number
format: decimal
description: "Cache-write rate per 1M tokens (USD), if applicable"
per1mInputUsd:
type: number
format: decimal
description: Input rate per 1M tokens (USD); required when the model has
a price
per1mOutputUsd:
type: number
format: decimal
description: Output rate per 1M tokens (USD); required when the model has
a price
priceNote:
type: string
description: "Note; required when the model is free (e.g. self-hosted, no\
\ cost)"
maxLength: 500
minLength: 0
pricingMode:
type: string
description: Pricing mode (default UNPRICED)
enum:
- PRICED
- NO_CHARGE
- UNPRICED
reasoningEffort:
type: string
description: "Reasoning effort to request; null sends none, so the provider's\
\ own default applies"
enum:
- NONE
- MINIMAL
- LOW
- MEDIUM
- HIGH
- XHIGH
- MAX
slug:
type: string
description: Optional internal slug; generated from displayName when omitted
maxLength: 63
minLength: 0
upstreamModelId:
type: string
description: Upstream provider model id
maxLength: 256
minLength: 0
required:
- displayName
- upstreamModelId
CreateWorkspaceRequest:
type: object
description: Request to create a new workspace
properties:
accountLogin:
type: string
description: Git provider account login (GitHub org/user or GitLab group
path)
example: my-org
maxLength: 255
minLength: 0
accountType:
type: string
description: Type of account (USER or ORG)
enum:
- ORG
- USER
displayName:
type: string
description: Human-readable name of the workspace
example: My Workspace
maxLength: 120
minLength: 0
kind:
type: string
description: "Integration kind to provision. SLACK flows through OAuth,\
\ not this endpoint."
enum:
- GITHUB
- GITLAB
example: GITLAB
ownerUserId:
type: integer
format: int64
deprecated: true
description: "Deprecated: ignored by the server. The authenticated user\
\ always becomes the owner."
personalAccessToken:
type: string
description: Personal Access Token. Required for both kinds (GitLab API
or GitHub PAT). Stored encrypted at rest.
example: glpat-...
maxLength: 512
minLength: 0
serverUrl:
type: string
description: "For GitLab, the default GitLab instance this server reads\
\ from, which is also used when omitted; any other instance is refused."
example: https://gitlab.example.com
workspaceSlug:
type: string
description: Non-reserved lowercase ASCII DNS label. Consecutive hyphens
are prohibited.
example: my-workspace
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
required:
- accountLogin
- accountType
- displayName
- kind
- workspaceSlug
CsrfToken:
type: object
properties:
headerName:
type: string
token:
type: string
required:
- headerName
- token
CurrentUserView:
type: object
properties:
accessTokenExpiresAt:
type: integer
format: int64
appRole:
type: string
avatarUrl:
type: string
displayName:
type: string
gitProviderId:
type: string
id:
type: integer
format: int64
identityProvider:
type: string
linkedProviders:
type: array
items:
$ref: "#/components/schemas/LinkedProvider"
primaryEmail:
type: string
profileUrl:
type: string
roles:
type: array
items:
type: string
status:
type: string
username:
type: string
DeliveredFeedbackPractice:
type: object
properties:
name:
type: string
slug:
type: string
required:
- name
- slug
DeliveredWorkFeedback:
type: object
properties:
feedback:
type: array
items:
$ref: "#/components/schemas/DeliveredWorkFeedbackItem"
item:
anyOf:
- $ref: "#/components/schemas/ItemRef"
- type: "null"
required:
- feedback
- item
DeliveredWorkFeedbackCopy:
type: object
properties:
endLine:
type:
- "null"
- integer
format: int32
externalRef:
type:
- string
- "null"
externalUrl:
type:
- string
- "null"
id:
type: string
format: uuid
kind:
type: string
enum:
- SUMMARY
- LINE_NOTE
- FILE_NOTE
- CHAT_TURN
path:
type:
- string
- "null"
postedAt:
type: string
format: date-time
side:
type:
- string
- "null"
enum:
- OLD
- NEW
- null
startLine:
type:
- "null"
- integer
format: int32
required:
- endLine
- externalRef
- externalUrl
- id
- kind
- path
- postedAt
- side
- startLine
DeliveredWorkFeedbackItem:
type: object
properties:
copies:
type: array
items:
$ref: "#/components/schemas/DeliveredWorkFeedbackCopy"
deliveredAt:
type: string
format: date-time
id:
type: string
format: uuid
practices:
type: array
items:
$ref: "#/components/schemas/DeliveredFeedbackPractice"
required:
- copies
- deliveredAt
- id
- practices
DutyBasis:
allOf:
- $ref: "#/components/schemas/ClaimBasis"
- type: object
properties:
criterionQuote:
type: string
event:
type: integer
format: int32
explanation:
type: string
EmailTestRequest:
type: object
properties:
to:
type: string
format: email
description: the mailbox to send the test email to; blank means the caller's
own verified address
maxLength: 254
minLength: 0
EmailTestResponse:
type: object
properties:
messageId:
type: string
description: "the accepted Message-ID, only for SENT;\
\ search for it in the relay's log"
outcome:
type: string
description: what became of the test email; SENT is the only
success
enum:
- SENT
- EXPIRED
- NOT_CONFIGURED
- SILENT_MODE
- NO_RECIPIENT
- UNSUBSCRIBED
- INVALID_ADDRESS
- REJECTED
- UNAVAILABLE
- RATE_LIMITED
to:
type: string
description: "the address it went to, or null when there was\
\ no recipient to resolve"
required:
- outcome
Entry:
type: object
properties:
basedOn:
type: array
items:
$ref: "#/components/schemas/Basis"
body:
type:
- string
- "null"
bodyUnavailable:
type: boolean
copies:
type: array
items:
$ref: "#/components/schemas/Copy"
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
deliveredAt:
type: string
format: date-time
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
id:
type: string
format: uuid
itemVersion:
type:
- string
- "null"
state:
type: string
enum:
- AWAITING_APPROVAL
- READY
- DELIVERED
- UNCONFIRMED
- WITHHELD
- REJECTED
- REPLACED
- FAILED
withdrawn:
type: boolean
required:
- basedOn
- body
- bodyUnavailable
- copies
- currentness
- deliveredAt
- destination
- id
- itemVersion
- state
- withdrawn
ErasureRequest:
type: object
properties:
externalCopiesRemoved:
type: boolean
required:
- externalCopiesRemoved
EvidenceCitation:
type: object
properties:
commit:
type:
- string
- "null"
endLine:
type:
- "null"
- integer
format: int32
path:
type:
- string
- "null"
quote:
type:
- string
- "null"
side:
type:
- string
- "null"
enum:
- OLD
- NEW
- null
sourceKind:
type: string
sourcePath:
type:
- string
- "null"
startLine:
type:
- "null"
- integer
format: int32
verification:
anyOf:
- $ref: "#/components/schemas/CitationProofDTO"
- type: "null"
required:
- commit
- endLine
- path
- quote
- side
- sourceKind
- sourcePath
- startLine
- verification
ExportCreated:
type: object
description: Acknowledgement returned when a data export is requested.
properties:
id:
type: integer
format: int64
status:
type: string
ExportStatus:
type: object
description: Status of a requested data export; timestamps are null until the
matching transition occurs.
properties:
completedAt:
type: string
format: date-time
expiresAt:
type: string
format: date-time
id:
type: integer
format: int64
requestedAt:
type: string
format: date-time
status:
type: string
ExternalDelivery:
type: object
properties:
locator:
type: string
workspaceId:
type: integer
format: int64
required:
- locator
- workspaceId
FeatureFlags:
type: object
description: Feature flags evaluated for the current user
properties:
ADMIN:
type: boolean
description: User has admin privileges
GITLAB_WORKSPACE_CREATION:
type: boolean
description: GitLab workspace creation feature is enabled
NOTIFICATION_ACCESS:
type: boolean
description: User can receive notifications
FeedbackAccountRef:
type: object
description: "Who produced a record, as an administrator sees it; absent once\
\ the account is erased."
properties:
displayName:
type: string
email:
type: string
id:
type: integer
format: int64
required:
- displayName
- id
FeedbackBasis:
type: object
properties:
ordinal:
type: integer
format: int32
problemId:
type:
- string
- "null"
format: uuid
result:
$ref: "#/components/schemas/ReviewBoundResult"
resultId:
type: string
format: uuid
required:
- ordinal
- problemId
- result
- resultId
FeedbackCheck:
type: object
properties:
allowed:
type: boolean
checkedAt:
type: string
format: date-time
facts:
$ref: "#/components/schemas/FeedbackCheckFacts"
reason:
type:
- string
- "null"
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
- null
stage:
type: string
enum:
- COMPOSITION
- AUTOMATIC
- APPROVED
- EGRESS
required:
- allowed
- checkedAt
- facts
- reason
- stage
FeedbackCheckFacts:
type: object
properties:
admittedRolloutRevision:
type: string
approvalCurrent:
type: boolean
currentVersion:
type: boolean
deliveryEnabled:
type: boolean
evaluatedRolloutRevision:
type: string
evidenceAllowed:
type: boolean
inScope:
type: boolean
incorrectBasis:
type: boolean
modelAllowed:
type: boolean
writeStarted:
type: boolean
required:
- admittedRolloutRevision
- approvalCurrent
- currentVersion
- deliveryEnabled
- evaluatedRolloutRevision
- evidenceAllowed
- inScope
- incorrectBasis
- modelAllowed
- writeStarted
FeedbackCompositionTrace:
type: object
description: |-
Exact support and quiet decisions retained with the immutable preparation receipt. A public piece also retains the
publication context of the history read it was composed from; the server sets it, never the composer.
properties:
copies:
type: array
items:
$ref: "#/components/schemas/CopySupport"
primaryResultId:
type: string
format: uuid
publicationContext:
type: string
replacesId:
type: string
format: uuid
withheld:
type: array
items:
$ref: "#/components/schemas/QuietDecision"
FeedbackCopy:
type: object
properties:
body:
type:
- string
- "null"
chatMessageId:
type:
- string
- "null"
format: uuid
endLine:
type:
- "null"
- integer
format: int32
externalRef:
type:
- string
- "null"
externalUrl:
type:
- string
- "null"
id:
type: string
format: uuid
kind:
type: string
enum:
- SUMMARY
- LINE_NOTE
- FILE_NOTE
- CHAT_TURN
lastError:
type:
- string
- "null"
path:
type:
- string
- "null"
position:
type: integer
format: int32
postedAt:
type:
- string
- "null"
format: date-time
readback:
type:
- string
- "null"
enum:
- ABSENT
- TRANSIENT
- UNKNOWN
- null
side:
type:
- string
- "null"
enum:
- OLD
- NEW
- null
startLine:
type:
- "null"
- integer
format: int32
state:
type: string
enum:
- PLANNED
- WRITE_STARTED
- POSTED
- FAILED
- WITHHELD
- RETRACTED
stopReason:
type:
- string
- "null"
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
- null
writeStartedAt:
type:
- string
- "null"
format: date-time
required:
- body
- chatMessageId
- endLine
- externalRef
- externalUrl
- id
- kind
- lastError
- path
- position
- postedAt
- readback
- side
- startLine
- state
- stopReason
- writeStartedAt
FeedbackCopyCounts:
type: object
properties:
failed:
type: integer
format: int32
planned:
type: integer
format: int32
posted:
type: integer
format: int32
retracted:
type: integer
format: int32
withheld:
type: integer
format: int32
writeStarted:
type: integer
format: int32
required:
- failed
- planned
- posted
- retracted
- withheld
- writeStarted
FeedbackDecision:
type: object
properties:
action:
type: string
enum:
- APPROVE
- REJECT
- WITHDRAW
- RESTORE
actor:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
contentDigest:
type:
- string
- "null"
decidedAt:
type: string
format: date-time
feedbackId:
type: string
format: uuid
id:
type: string
format: uuid
note:
type:
- string
- "null"
reasonCode:
type:
- string
- "null"
enum:
- INCORRECT
- MISSING_CONTEXT
- UNHELPFUL
- DUPLICATE
- INAPPROPRIATE_LOCATION
- OTHER
- null
required:
- action
- actor
- contentDigest
- decidedAt
- feedbackId
- id
- note
- reasonCode
FeedbackDisagreement:
type: object
properties:
comment:
type: string
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
feedbackId:
type: string
format: uuid
respondedAt:
type: string
format: date-time
required:
- comment
- destination
- feedbackId
- respondedAt
FeedbackItem:
type: object
properties:
account:
$ref: "#/components/schemas/FeedbackAccountRef"
appVersion:
type: string
createdAt:
type: string
format: date-time
id:
type: string
format: uuid
kind:
type: string
enum:
- IDEA
- BUG
- FEEDBACK
message:
type: string
pagePath:
type: string
resolvedAt:
type: string
format: date-time
resolvedBy:
$ref: "#/components/schemas/FeedbackAccountRef"
userAgent:
type: string
workspace:
$ref: "#/components/schemas/FeedbackWorkspaceRef"
required:
- createdAt
- id
- kind
- message
FeedbackModeAssignment:
type: object
properties:
effective:
type: string
enum:
- "OFF"
- APPROVE_FIRST
- AUTOMATIC
override:
type:
- string
- "null"
enum:
- "OFF"
- APPROVE_FIRST
- AUTOMATIC
- null
source:
type: string
enum:
- PRACTICE
- GROUP
- WORKSPACE
- INSTANCE
required:
- effective
- override
- source
FeedbackModeRollup:
type: object
properties:
approveFirst:
type: integer
format: int32
automatic:
type: integer
format: int32
defaultMode:
type: string
enum:
- "OFF"
- APPROVE_FIRST
- AUTOMATIC
"off":
type: integer
format: int32
required:
- approveFirst
- automatic
- defaultMode
- "off"
FeedbackRequest:
type: object
properties:
kind:
type: string
enum:
- IDEA
- BUG
- FEEDBACK
message:
type: string
maxLength: 5000
minLength: 0
pagePath:
type: string
maxLength: 500
minLength: 0
pattern: "/(?!/)[^?#\\p{Cc}]*"
userAgent:
type: string
maxLength: 500
minLength: 0
pattern: "[^\\p{Cc}]*"
required:
- kind
- message
FeedbackResolutionCounts:
type: object
properties:
addressed:
type: integer
format: int64
disagree:
type: integer
format: int64
notApplicable:
type: integer
format: int64
required:
- addressed
- disagree
- notApplicable
FeedbackResponse:
type: object
properties:
comment:
type:
- string
- "null"
createdAt:
type:
- string
- "null"
format: date-time
resolution:
type:
- string
- "null"
enum:
- ADDRESSED
- DISAGREE
- NOT_APPLICABLE
- null
usefulness:
type:
- string
- "null"
enum:
- HELPFUL
- UNHELPFUL
- null
required:
- comment
- createdAt
- resolution
- usefulness
FeedbackResponseRequest:
type: object
description: The complete response to delivered feedback
properties:
comment:
type: string
description: Optional explanation; required when resolution is DISAGREE.
maxLength: 2000
minLength: 0
resolution:
type: string
description: What the recipient decided to do with the feedback
enum:
- ADDRESSED
- DISAGREE
- NOT_APPLICABLE
usefulness:
type: string
description: How useful the feedback was
enum:
- HELPFUL
- UNHELPFUL
FeedbackSend:
type: object
properties:
action:
type: string
enum:
- POST
- RETRACT
attemptCount:
type: integer
format: int32
createdAt:
type: string
format: date-time
feedbackId:
type: string
format: uuid
lastError:
type:
- string
- "null"
nextAttemptAt:
type: string
format: date-time
state:
type: string
enum:
- PENDING
- SENDING
- UNCERTAIN
- DONE
updatedAt:
type: string
format: date-time
required:
- action
- attemptCount
- createdAt
- feedbackId
- lastError
- nextAttemptAt
- state
- updatedAt
FeedbackSourceCount:
type: object
properties:
count:
type: integer
format: int64
itemKind:
type: string
required:
- count
- itemKind
FeedbackTriage:
type: object
properties:
resolved:
type: boolean
required:
- resolved
FeedbackWorkspaceRef:
type: object
description: The workspace a record was submitted from; absent for instance-level
submissions.
properties:
displayName:
type: string
id:
type: integer
format: int64
slug:
type: string
required:
- displayName
- id
- slug
FirstLoginConsent:
type: object
properties:
noticeVersion:
type: string
participateInResearch:
type: boolean
description: "Required when the instance names a research organization,\
\ omitted otherwise"
researchOrganization:
type: string
description: The organization the research question named on screen; omitted
when it asked none
termsAccepted:
type: boolean
required:
- noticeVersion
- termsAccepted
FrozenModel:
type: object
properties:
modelId:
type: string
options:
type: object
additionalProperties:
$ref: "#/components/schemas/JsonNode"
providerModelId:
type: string
providerProtocol:
type: string
reasoningEffort:
type:
- string
- "null"
required:
- modelId
- options
- providerModelId
- providerProtocol
- reasoningEffort
FxRateInfo:
type: object
description: "Display-only currency conversion for the USD amounts in this response.\
\ Multiply a USD amount by ratePerUsd to get the display-currency estimate;\
\ always label it as an estimate and show rateDate, which is the date the\
\ rate was actually published on (not necessarily today), and attribute it\
\ to source."
properties:
currencyCode:
type: string
description: ISO 4217 code of the display currency
example: EUR
rateDate:
type: string
format: date
description: "The date the underlying reference rate was published. A closed\
\ month always reports a date inside that month, so its converted figure\
\ never changes once the month ends."
example: 2026-07-24
ratePerUsd:
type: number
format: decimal
description: "Units of the display currency per 1 USD, at 6 decimal places"
example: 0.878966
source:
type: string
description: "Who published the rate, so a disclosure can name it instead\
\ of saying \"a reference rate\". ECB = the European Central Bank's daily\
\ euro foreign-exchange reference rates."
enum:
- ECB
example: ECB
required:
- currencyCode
- rateDate
- ratePerUsd
- source
GeneratedPathReview:
type: object
properties:
excludedPaths:
type: array
items:
type: string
patterns:
type: array
items:
type: string
reason:
type:
- string
- "null"
withheld:
type: boolean
required:
- excludedPaths
- patterns
- reason
- withheld
GitHubProvider:
type: object
description: GitHub provider configuration
properties:
appInstallationUrl:
type: string
description: GitHub App installation URL
example: https://github.com/apps/hephaestus/installations/new
GitLabGroup:
type: object
description: GitLab group accessible to the provided PAT
properties:
avatarUrl:
type: string
description: Group avatar URL
fullPath:
type: string
description: Full group path including parent groups
example: my-org/my-team
id:
type: integer
format: int64
description: GitLab group numeric ID
name:
type: string
description: Group display name
visibility:
type: string
description: "Group visibility: public, internal, or private"
webUrl:
type: string
description: Group web URL
required:
- fullPath
- id
- name
GitLabPreflightRequest:
type: object
description: Request to validate a GitLab PAT or list accessible groups before
workspace creation
properties:
groupFullPath:
type: string
description: "GitLab group full path, used to validate the token against\
\ the group when /api/v4/user refuses it"
example: my-org/my-team
personalAccessToken:
type: string
description: GitLab Personal Access Token to validate
example: your-gitlab-token
minLength: 1
serverUrl:
type: string
description: "The default GitLab instance this server reads from, which\
\ is also used when omitted; any other instance is refused."
example: https://gitlab.example.com
required:
- personalAccessToken
GitLabPreflightResponse:
type: object
description: Result of GitLab PAT validation
properties:
error:
type: string
description: Error message if validation failed
userId:
type: integer
format: int64
description: GitLab user ID or group ID
username:
type: string
description: Username of the token owner (personal tokens) or group name
(group tokens)
valid:
type: boolean
description: Whether the token is valid
required:
- valid
GitLabProvider:
type: object
description: GitLab provider configuration
properties:
defaultServerUrl:
type: string
description: Origin of the one GitLab instance workspaces are created on
example: https://gitlab.lrz.de
GroupDefinition:
type: object
properties:
color:
type:
- string
- "null"
description:
type:
- string
- "null"
icon:
type:
- string
- "null"
name:
type: string
required:
- color
- description
- icon
- name
GroupRef:
type: object
properties:
color:
type:
- string
- "null"
icon:
type:
- string
- "null"
name:
type: string
slug:
type: string
required:
- color
- icon
- name
- slug
History:
type: object
properties:
feedback:
type: array
items:
$ref: "#/components/schemas/Entry"
item:
$ref: "#/components/schemas/ItemRef"
HostCoverage:
allOf:
- $ref: "#/components/schemas/ResultCoverage"
- type: object
properties:
complete:
type: boolean
failedReads:
type: integer
format: int32
omitted:
type: array
items:
$ref: "#/components/schemas/CoverageOmission"
reads:
type: integer
format: int32
receipts:
type: array
items:
$ref: "#/components/schemas/ReadReceipt"
truncatedReads:
type: integer
format: int32
Identity:
type: object
properties:
providerId:
type: integer
format: int64
exclusiveMinimum: 0
subject:
type: string
maxLength: 255
minLength: 1
teamId:
type: string
maxLength: 255
minLength: 1
required:
- providerId
- subject
IdentityProviderView:
type: object
description: |-
One row per sign-in option. providerType drives the SPA's icon choice; baseUrl is
the OAuth instance origin (scheme + host[:port]) of the authorization endpoint, so the
workspace-creation wizard can match a target instance to its login.
baseUrl is the OAuth origin, not the SCM API origin. It is only meaningful for GitLab rows,
where the OAuth origin and the API origin coincide (e.g. https://gitlab.example.com). For a
GitHub row it is https://github.com (the OAuth host), NOT https://api.github.com; the
sole consumer (the workspace wizard) matches GitLab self-hosted origins and never relies on the GitHub
value, so the discrepancy is harmless. Do not treat this as an SCM API base URL.
properties:
baseUrl:
type: string
displayName:
type: string
providerType:
type: string
registrationId:
type: string
IdentityView:
type: object
properties:
avatarUrl:
type: string
displayName:
type: string
id:
type: integer
format: int64
lastLoginAt:
type: string
format: date-time
providerType:
type: string
subject:
type: string
username:
type: string
required:
- id
- providerType
- subject
InapplicabilityWarrant:
type: object
properties:
consulted:
type: array
items:
type: string
prerequisite:
type: string
ruledOutBy:
type: string
InitiateConnectionRequest:
type: object
description: |-
Inbound payload for POST /workspaces/{workspaceSlug/connections}.
userInput is intentionally a free-form map so per-kind ConnectionStrategy
implementations can dictate their own field schema (e.g. Outline needs server_url; GitHub
needs nothing because the install URL is server-configured).
properties:
kind:
type: string
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
userInput:
type: object
additionalProperties:
type: string
required:
- kind
InitiateConnectionResponse:
type: object
description: |-
Flat response for POST /workspaces/{workspaceSlug/connections}.
Two outcomes, distinguished by type:
REDIRECT — OAuth / App-install flows (GitHub, Slack). vendorUrl is the
URL to bounce the browser to; the signed OAuth state is already embedded in it.LINKED — inline-credential flows (GitLab PAT). connectionId is the
newly-created Connection; no further round-trip is needed.Deliberately a flat record (nullable per-variant fields) rather than a sealed
oneOf hierarchy: a discriminated union serialises to OpenAPI oneOf +
discriminator, which the webapp's hey-api react-query transformer mishandles. A flat shape
round-trips cleanly through code generation, so the webapp consumes the generated client
instead of a hand-rolled fetch wrapper.
properties:
connectionId:
type: integer
format: int64
type:
type: string
enum:
- REDIRECT
- LINKED
vendorUrl:
type: string
format: uri
required:
- type
InstanceLlmSettings:
type: object
description: Instance-wide LLM governance settings
properties:
allowWorkspaceConnections:
type: boolean
description: Whether workspaces may register their own LLM connections
allowedEgressHosts:
type: string
description: Comma/newline-delimited egress host allowlist; blank = allow
any public host
example: "api.openai.com, llm-gateway.example.com"
required:
- allowWorkspaceConnections
InstanceSettings:
type: object
properties:
etag:
type: string
silentModeChangedAt:
type: string
format: date-time
silentModeChangedByAccountId:
type: integer
format: int64
silentModeEngaged:
type: boolean
silentModeReason:
type: string
required:
- etag
- silentModeEngaged
IntegrationCatalogEntry:
type: object
description: Integration kind availability + connection status for this workspace
properties:
connected:
type: boolean
description: Whether this workspace has a (non-UNINSTALLED) connection for
this kind
connectionId:
type: integer
format: int64
description: "Connection id, if connected"
connectionState:
type: string
description: "Connection state, if connected"
enum:
- PENDING
- ACTIVE
- SUSPENDED
- UNINSTALLED
credentialsUnreadableSince:
type: string
format: date-time
description: When the stored credential was first found unreadable with
the server's keys; absent while it reads
displayName:
type: string
description: Human-readable display name
kind:
type: string
description: Integration kind
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
required:
- connected
- displayName
- kind
IntroducedBasis:
allOf:
- $ref: "#/components/schemas/ClaimBasis"
- type: object
properties:
explanation:
type: string
head:
type: integer
format: int32
ItemEvent:
type: object
properties:
decidedAt:
type:
- string
- "null"
format: date-time
foundBy:
type: string
enum:
- WEBHOOK
- SYNC
- REQUEST
- BACKFILL
- SCHEDULE
id:
type: string
format: uuid
itemId:
type: string
pattern: "^[1-9][0-9]*$"
itemVersion:
type:
- string
- "null"
name:
type: string
occurredAt:
type: string
format: date-time
reason:
type:
- string
- "null"
enum:
- GATE_WITHHELD
- COOLDOWN_ACTIVE
- REQUEST_COOLDOWN_ACTIVE
- REQUESTER_QUOTA_EXHAUSTED
- CONCURRENT_DUPLICATE
- COALESCED
- OUT_OF_REVIEW_SCOPE
- BOT_AUTHOR
- BOT_REVIEWER
- STALE_ROLLOUT_REVISION
- WORKSPACE_INACTIVE
- PRACTICES_DISABLED
- NO_ACTIVE_PRACTICE
- REVIEW_MODEL_UNBOUND
- MEMBER_AI_DECLINED
- PERSON_DATA_ERASED
- FEEDBACK_MODE_OFF
- SUBJECT_UNLINKED
- MERGE_ACTOR_UNAVAILABLE
- MODEL_UNAVAILABLE
- BUDGET_EXHAUSTED
- ITEM_NOT_VISIBLE
- VERSION_SUPERSEDED
- PENDING_DEADLINE_EXCEEDED
- ITEM_GONE
- LEGACY_REVIEW_UNBOUND
- null
reviewId:
type:
- string
- "null"
format: uuid
state:
type: string
enum:
- RECORDED
- WAITING
- STARTED
- WITHHELD
- EXPIRED
required:
- decidedAt
- foundBy
- id
- itemId
- itemVersion
- name
- occurredAt
- reason
- reviewId
- state
ItemEventOption:
type: object
properties:
connected:
type: boolean
label:
type: string
name:
type: string
raisedBy:
type: array
items:
type: string
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
recommended:
type: boolean
required:
- connected
- label
- name
- raisedBy
- recommended
ItemFact:
type: object
properties:
name:
type: string
url:
type:
- string
- "null"
value:
type:
- string
- "null"
required:
- name
- url
- value
ItemFacts:
type: object
properties:
facts:
type: array
items:
$ref: "#/components/schemas/ItemFact"
item:
$ref: "#/components/schemas/ItemRef"
required:
- facts
- item
ItemRef:
type: object
properties:
container:
type:
- string
- "null"
id:
type: string
pattern: "^[1-9][0-9]*$"
kind:
type: string
label:
type: string
parentId:
type:
- string
- "null"
pattern: "^[1-9][0-9]*$"
path:
type:
- string
- "null"
provider:
type:
- string
- "null"
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
- null
removedAt:
type:
- string
- "null"
format: date-time
title:
type:
- string
- "null"
url:
type:
- string
- "null"
required:
- container
- id
- kind
- label
- parentId
- path
- provider
- removedAt
- title
- url
ItemTrace:
type: object
properties:
events:
type: array
items:
$ref: "#/components/schemas/ItemEvent"
item:
$ref: "#/components/schemas/ItemRef"
practices:
type: array
items:
$ref: "#/components/schemas/PracticeTraceEntry"
reviews:
type: array
items:
$ref: "#/components/schemas/ReviewRef"
required:
- events
- item
- practices
- reviews
JsonNode:
type: object
properties:
array:
type: boolean
bigDecimal:
type: boolean
bigInteger:
type: boolean
binary:
type: boolean
boolean:
type: boolean
container:
type: boolean
double:
type: boolean
embeddedValue:
type: boolean
empty:
type: boolean
float:
type: boolean
floatingPointNumber:
type: boolean
int:
type: boolean
integralNumber:
type: boolean
long:
type: boolean
missingNode:
type: boolean
nodeType:
type: string
enum:
- ARRAY
- BINARY
- BOOLEAN
- MISSING
- "NULL"
- NUMBER
- OBJECT
- POJO
- STRING
"null":
type: boolean
number:
type: boolean
object:
type: boolean
pojo:
type: boolean
short:
type: boolean
string:
type: boolean
textual:
type: boolean
deprecated: true
valueNode:
type: boolean
JudgedScanReportItem:
allOf:
- type: object
properties:
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type: string
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceName:
type: string
practiceSlug:
type: string
problemCount:
type: integer
format: int32
recordedAt:
type: string
format: date-time
resultId:
type: string
format: uuid
severity:
type:
- string
- "null"
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- null
sourceReviewId:
type: string
format: uuid
status:
type: string
enum:
- JUDGED
summary:
type:
- string
- "null"
required:
- currentness
- item
- itemVersion
- outcome
- practiceName
- practiceSlug
- problemCount
- recordedAt
- resultId
- severity
- sourceReviewId
- status
- summary
LabelInfo:
type: object
description: Information about a label from a repository
properties:
color:
type: string
description: "Hex color code of the label (without #)"
example: d73a4a
id:
type: integer
format: int64
description: Unique identifier of the label
name:
type: string
description: Name of the label
repository:
$ref: "#/components/schemas/RepositoryInfo"
description: Repository the label belongs to
required:
- color
- id
- name
LatestRelease:
type: object
description: |-
A published release. schemaMigrations is the flag the release workflow publishes for
that one release and is absent when the notes carry none; it says nothing about releases
between the running one and this one.
properties:
notesUrl:
type: string
publishedAt:
type: string
format: date-time
schemaMigrations:
type: boolean
version:
type: string
required:
- notesUrl
- publishedAt
- version
LegacyFeedbackItem:
type: object
properties:
itemId:
type: string
pattern: "^[1-9][0-9]*$"
required:
- itemId
LinkedProvider:
type: object
description: "A provider instance the current user is linked to: its type +\
\ server-url origin."
properties:
serverUrl:
type: string
type:
type: string
ListedScanReportItem:
allOf:
- type: object
properties:
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type: string
lastResult:
anyOf:
- $ref: "#/components/schemas/ResultList"
- type: "null"
practiceName:
type: string
practiceSlug:
type: string
reason:
type:
- string
- "null"
status:
type: string
enum:
- LISTED
required:
- item
- itemVersion
- lastResult
- practiceName
- practiceSlug
- reason
- status
LlmConnection:
type: object
description: Instance LLM provider connection (API key redacted)
properties:
apiKeyLast4:
type: string
description: "Last four characters of the stored API key, if any"
apiProtocol:
type: string
description: Wire protocol
enum:
- openai-completions
- openai-responses
- openai-decisions
- openai-embeddings
- cohere-rerank
example: openai-responses
authMode:
type: string
description: Credential shape
enum:
- BEARER
- API_KEY
baseUrl:
type: string
description: Provider base URL
connectionPlatform:
type: string
description: Admin-declared connection platform
enum:
- LOGOS
- VLLM
- OLLAMA
- AZURE
- AWS_BEDROCK
- GOOGLE_VERTEX
- OPENAI
- GOOGLE_AI_STUDIO
- ALIBABA_CLOUD
- GROQ
- FIREWORKS
- TOGETHER_AI
- DEEPINFRA
- NEBIUS
- OPENROUTER
- CLOUDFLARE_AI_GATEWAY
- VERCEL_AI_GATEWAY
createdAt:
type: string
format: date-time
description: Creation timestamp
displayName:
type: string
description: Human-readable name
enabled:
type: boolean
description: Whether the connection is enabled
hasApiKey:
type: boolean
description: Whether an API key is stored
id:
type: integer
format: int64
description: Connection ID
purposes:
type: array
description: "The purposes a model on this connection can serve, from its\
\ protocol"
items:
type: string
enum:
- PRACTICE_REVIEW
- MENTOR
- PRACTICE_DECISION
- PRACTICE_EMBEDDING
- PRACTICE_RERANKING
slug:
type: string
description: Unique slug
example: openai-prod
updatedAt:
type: string
format: date-time
description: Last update timestamp
required:
- apiProtocol
- authMode
- baseUrl
- createdAt
- displayName
- enabled
- hasApiKey
- id
- purposes
- slug
LlmModel:
type: object
description: Instance catalog model
properties:
brand:
type: string
description: Model brand declared by an admin; display only
enum:
- OPENAI
- ANTHROPIC
- GEMINI
- GEMMA
- META
- MISTRAL
- QWEN
- DEEPSEEK
- XAI
- COHERE
- Z_AI
- MOONSHOT
connectionDisplayName:
type: string
description: Owning connection's display name
connectionId:
type: integer
format: int64
description: Owning connection id
contextWindow:
type: integer
format: int32
description: Context window in tokens
createdAt:
type: string
format: date-time
description: Creation timestamp
currentPrice:
$ref: "#/components/schemas/LlmModelPrice"
description: Current price; null if none has ever been set
dataHandlingNote:
type: string
description: "Admin-only note: region, agreement, renewal date"
dataHandlingTier:
type: string
description: Data-handling tier derived from the operator; UNDECLARED until
it is set
enum:
- IN_HOUSE
- CLOUD
- UNDECLARED
displayName:
type: string
description: Human-readable name
enabled:
type: boolean
description: Active toggle
grantedWorkspaceIds:
type: array
description: Workspace ids shared with; only meaningful when visibility
is GRANTED
items:
type: integer
format: int64
id:
type: integer
format: int64
description: Model id
maxOutputTokens:
type: integer
format: int32
description: Maximum output tokens
operatedBy:
type: string
description: Who operates the systems the work is sent to; null until declared
enum:
- OWN_ORGANISATION
- PROVIDER
reasoningEffort:
type: string
description: "Reasoning effort requested of the model; null sends none,\
\ the provider's default applies"
enum:
- NONE
- MINIMAL
- LOW
- MEDIUM
- HIGH
- XHIGH
- MAX
slug:
type: string
description: Unique slug within the connection
updatedAt:
type: string
format: date-time
description: Last update timestamp
upstreamModelId:
type: string
description: Upstream provider model id
visibility:
type: string
description: Share with all workspaces (PUBLIC) or only selected ones (GRANTED)
enum:
- PUBLIC
- GRANTED
required:
- connectionDisplayName
- connectionId
- createdAt
- dataHandlingTier
- displayName
- enabled
- grantedWorkspaceIds
- id
- slug
- upstreamModelId
- visibility
LlmModelPrice:
type: object
description: "A model's price, per 1M tokens"
properties:
currency:
type: string
description: Currency code
effectiveFrom:
type: string
format: date-time
description: When this price took effect
effectiveTo:
type: string
format: date-time
description: When this price was superseded; null if still current
id:
type: integer
format: int64
description: Price row id
note:
type: string
description: Note
per1mCacheReadUsd:
type: number
format: decimal
description: Cache-read rate per 1M tokens (USD)
per1mCacheWriteUsd:
type: number
format: decimal
description: Cache-write rate per 1M tokens (USD)
per1mInputUsd:
type: number
format: decimal
description: Input rate per 1M tokens (USD)
per1mOutputUsd:
type: number
format: decimal
description: Output rate per 1M tokens (USD)
pricingMode:
type: string
description: Pricing mode
enum:
- PRICED
- NO_CHARGE
- UNPRICED
required:
- currency
- effectiveFrom
- id
- pricingMode
LlmProbeResult:
type: object
description: Result of testing an LLM connection's /models endpoint
properties:
message:
type: string
description: Human-readable diagnostic when not reachable
models:
type: array
description: Model ids returned by the provider (empty if unreachable)
items:
type: string
reachable:
type: boolean
description: Whether the provider answered with a successful models listing
statusCode:
type: integer
format: int32
description: "HTTP status returned by the provider, if any"
required:
- models
- reachable
LlmUsageByDay:
type: object
description: Spend for one UTC day
properties:
day:
type: string
format: date
events:
type: integer
format: int64
description: "Runs: job attempts and mentor turns. Rows of models for practice\
\ scripts are not runs."
instanceTotalCostUsd:
type: number
format: decimal
description: "Confirmed spend on shared (instance) models for this day,\
\ in USD."
ownProviderTotalCostUsd:
type: number
format: decimal
description: "Spend on this workspace's own connected provider(s) for this\
\ day, in USD."
unpricedEventCount:
type: integer
format: int64
description: Runs this day with at least one ledger row whose cost is unavailable
because a rate is missing or the measurement is unverified. A practice
script row counts toward the run of its review. Those rows are excluded
from both totals above.
required:
- day
- events
- instanceTotalCostUsd
- ownProviderTotalCostUsd
- unpricedEventCount
LlmUsageByJobType:
type: object
description: Month spend aggregated by job type
properties:
cacheReadTokens:
type: integer
format: int64
cacheWriteTokens:
type: integer
format: int64
events:
type: integer
format: int64
description: "Runs: job attempts and mentor turns. Rows of models for practice\
\ scripts are not runs."
inputTokens:
type: integer
format: int64
instanceTotalCostUsd:
type: number
format: decimal
description: "Confirmed spend on shared (instance) models for this job type,\
\ in USD."
jobType:
type: string
outputTokens:
type: integer
format: int64
ownProviderTotalCostUsd:
type: number
format: decimal
description: "Spend on this workspace's own connected provider(s) for this\
\ job type, in USD."
totalCalls:
type: integer
format: int64
description: "LLM API calls, as reported by the runtime. Practice reviews\
\ and mentor turns both include every assistant call in an internal tool\
\ loop."
unpricedEventCount:
type: integer
format: int64
description: Runs of this job type with at least one ledger row whose cost
is unavailable because a rate is missing or the measurement is unverified.
A practice script row counts toward the run of its review. Those rows
are excluded from both totals above.
required:
- cacheReadTokens
- cacheWriteTokens
- events
- inputTokens
- instanceTotalCostUsd
- jobType
- outputTokens
- ownProviderTotalCostUsd
- totalCalls
- unpricedEventCount
LlmUsageByPractice:
type: object
description: "The decision, embedding and reranking calls that one practice's\
\ script made in finished reviews this month. The cost of each review's calls\
\ is split between its practices by the priced tokens that each used."
properties:
calls:
type: integer
format: int64
inputTokens:
type: integer
format: int64
instanceTotalCostUsd:
type: number
format: decimal
description: "This practice's share of the spend on shared (instance) models,\
\ in USD."
outputTokens:
type: integer
format: int64
ownProviderTotalCostUsd:
type: number
format: decimal
description: "This practice's share of the spend on this workspace's own\
\ provider(s), in USD."
practiceName:
type: string
description: The practice name. Null when the slug names no current practice.
practiceSlug:
type: string
description: "The practice slug. Null for calls that cannot be split by\
\ practice any more, such as those of a deleted review."
purposes:
type: array
description: The models for practice scripts that the script called.
items:
type: string
enum:
- PRACTICE_REVIEW
- MENTOR
- PRACTICE_DECISION
- PRACTICE_EMBEDDING
- PRACTICE_RERANKING
reviews:
type: integer
format: int64
description: Reviews in which the script called a model for practice scripts.
A review with several practices counts for each of them.
unpricedEventCount:
type: integer
format: int64
description: "Reviews with a practice script ledger row whose price is not\
\ yet known and that holds this practice's calls, each review counted\
\ once. Those rows are excluded from both totals above. A review with\
\ several practices counts for each of them."
required:
- calls
- inputTokens
- instanceTotalCostUsd
- outputTokens
- ownProviderTotalCostUsd
- purposes
- reviews
- unpricedEventCount
LlmUsagePracticeScriptTotal:
type: object
description: "The decision, embedding and reranking calls of finished reviews\
\ this month, in total. calls, inputTokens, outputTokens and both costs equal\
\ the sums of the byPractice entries. reviews and unpricedEventCount do not:\
\ one review can count for several practices there."
properties:
calls:
type: integer
format: int64
inputTokens:
type: integer
format: int64
instanceTotalCostUsd:
type: number
format: decimal
description: "Confirmed practice script spend on shared (instance) models,\
\ in USD."
outputTokens:
type: integer
format: int64
ownProviderTotalCostUsd:
type: number
format: decimal
description: "Practice script spend on this workspace's own provider(s),\
\ in USD."
reviews:
type: integer
format: int64
description: Distinct reviews in which a practice script called a model
for practice scripts.
unpricedEventCount:
type: integer
format: int64
description: Distinct reviews with a practice script ledger row whose price
is not yet known. Those rows are excluded from both totals above.
required:
- calls
- inputTokens
- instanceTotalCostUsd
- outputTokens
- ownProviderTotalCostUsd
- reviews
- unpricedEventCount
LoginProviderView:
type: object
description: Admin view of a login provider. The client secret is never included.
properties:
baseUrl:
type: string
createdAt:
type: string
format: date-time
displayName:
type: string
enabled:
type: boolean
redirectUri:
type: string
description: Redirect/callback URI to register on the upstream OAuth app
registrationId:
type: string
scopes:
type: string
seededFromEnv:
type: boolean
type:
type: string
updatedAt:
type: string
format: date-time
required:
- baseUrl
- createdAt
- displayName
- redirectUri
- registrationId
- scopes
- type
- updatedAt
MovePracticeRequest:
type: object
properties:
groupSlug:
type:
- string
- "null"
position:
type: integer
format: int32
minimum: 0
required:
- groupSlug
- position
NotReviewedScanReportItem:
allOf:
- type: object
properties:
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type: string
lastResult:
anyOf:
- $ref: "#/components/schemas/ResultList"
- type: "null"
practiceName:
type: string
practiceSlug:
type: string
reason:
type:
- string
- "null"
status:
type: string
enum:
- NOT_REVIEWED
required:
- item
- itemVersion
- lastResult
- practiceName
- practiceSlug
- reason
- status
Note:
type: object
properties:
body:
type: string
citationIndex:
type: integer
format: int32
problemId:
type: string
format: uuid
required:
- citationIndex
NotificationPreferences:
type: object
properties:
deliveryConfigured:
type: boolean
description: This instance has an email transport and sender configured
emailAvailable:
type: boolean
description: The account has an active verified email address
etag:
type: string
productFeedback:
type: boolean
productSurveys:
type: boolean
researchSurveys:
type: boolean
surveySummaries:
type: boolean
workspaceAlerts:
type: boolean
required:
- deliveryConfigured
- emailAvailable
- etag
- productFeedback
- productSurveys
- researchSurveys
- surveySummaries
- workspaceAlerts
OpenQuestion:
type: object
properties:
citation:
anyOf:
- $ref: "#/components/schemas/EvidenceCitation"
- type: "null"
openQuestion:
type: string
wouldSettleIt:
type: string
required:
- citation
- openQuestion
- wouldSettleIt
OpenWork:
type: object
description: What is open for one member right now
properties:
issues:
$ref: "#/components/schemas/WorkItemList"
description: Open issues assigned to this member
pullRequests:
$ref: "#/components/schemas/WorkItemList"
description: "Open pull requests this member authored, drafts included"
reviewRequests:
$ref: "#/components/schemas/WorkItemList"
description: Open pull requests by other people that ask this member for
a review; drafts are excluded
teamReviewRequests:
$ref: "#/components/schemas/WorkItemList"
description: "Open pull requests by other people that ask one of this member's\
\ teams for a review, and not this member: not asking them directly, and\
\ not yet approved or sent back by them. Drafts are excluded. GitHub only;\
\ GitLab has no team reviewers, so a GitLab workspace lists none."
required:
- issues
- pullRequests
- reviewRequests
- teamReviewRequests
OptionCount:
type: object
properties:
count:
type: integer
format: int64
value:
type: string
required:
- count
- value
OutcomeVector:
type: object
properties:
couldNotDetermine:
type: integer
format: int32
doesNotApply:
type: integer
format: int32
met:
type: integer
format: int32
notMet:
type: integer
format: int32
required:
- couldNotDetermine
- doesNotApply
- met
- notMet
OutlineCollection:
type: object
description: A mirrored Outline collection with its sync state and live document
count
properties:
collectionId:
type: string
description: Outline collection id (UUID; the natural key)
color:
type:
- string
- "null"
description: Collection color as configured in Outline
createdAt:
type: string
format: date-time
description: When the collection was registered for mirroring
description:
type:
- string
- "null"
description: Collection description as shown in Outline
documentCount:
type: integer
format: int64
description: Live (non-tombstoned) mirrored document count
documentsUpstream:
type:
- "null"
- integer
format: int32
description: Documents upstream reported for this collection at the last
enumeration (coverage denominator)
exportsSkippedForBudget:
type:
- "null"
- integer
format: int32
description: Exports the last pass skipped because the shared budget ran
out (0 on a clean pass)
icon:
type:
- string
- "null"
description: Collection icon as configured in Outline
id:
type: string
description: Internal registry row id
pattern: "^[1-9][0-9]*$"
lastSyncError:
type:
- string
- "null"
description: "Last sync failure for this collection, cleared on the next\
\ clean pass"
lastSyncedAt:
type:
- string
- "null"
format: date-time
description: "When this collection last completed a full reconcile pass,\
\ if any"
name:
type:
- string
- "null"
description: "Collection name as shown in Outline, if known"
state:
type: string
description: Mirror lifecycle state (PAUSED freezes sync but keeps documents)
enum:
- ENABLED
- PAUSED
syncStatus:
type: string
description: Whether a clean full pass has completed since registration
or the last resume
enum:
- PENDING
- COMPLETE
urlId:
type:
- string
- "null"
description: Outline url id (the short slug in collection URLs)
required:
- collectionId
- color
- createdAt
- description
- documentCount
- documentsUpstream
- exportsSkippedForBudget
- icon
- id
- lastSyncError
- lastSyncedAt
- name
- state
- syncStatus
- urlId
OutlineCollectionCandidate:
type: object
description: "An Outline collection the token can see, offered in the add-collection\
\ picker"
properties:
alreadyMirrored:
type: boolean
description: Whether this collection is already registered for mirroring
collectionId:
type: string
description: Outline collection id (UUID)
color:
type: string
description: Collection color as configured in Outline
description:
type: string
description: Collection description as shown in Outline
icon:
type: string
description: Collection icon as configured in Outline
name:
type: string
description: Collection name as shown in Outline
urlId:
type: string
description: Outline url id (the short slug in collection URLs)
required:
- alreadyMirrored
- collectionId
OutlineTokenStatus:
type: object
description: Live state of the API token behind the workspace's Outline connection
properties:
accepted:
type: boolean
description: "Whether Outline still accepts the stored token. False means\
\ revoked, expired or rejected."
expiresAt:
type: string
format: date-time
description: When the token lapses. Absent for a key created without an
expiry.
last4:
type: string
description: "Last four characters of the token, as Outline reports them"
lastActiveAt:
type: string
format: date-time
description: When Outline last saw the token used
name:
type: string
description: "The token's name in Outline. Absent when the token cannot\
\ list its own key (a scoped key, or one owned by a user who cannot see\
\ it) — sync is unaffected."
required:
- accepted
OverviewWindow:
type: object
properties:
since:
type: string
format: date-time
until:
type: string
format: date-time
required:
- since
- until
OwnFeedbackCopyRef:
type: object
properties:
externalUrl:
type:
- string
- "null"
id:
type: string
format: uuid
kind:
type: string
enum:
- SUMMARY
- LINE_NOTE
- FILE_NOTE
- CHAT_TURN
postedAt:
type: string
format: date-time
required:
- externalUrl
- id
- kind
- postedAt
OwnFeedbackRef:
type: object
properties:
copies:
type: array
items:
$ref: "#/components/schemas/OwnFeedbackCopyRef"
deliveredAt:
type:
- string
- "null"
format: date-time
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
id:
type: string
format: uuid
response:
anyOf:
- $ref: "#/components/schemas/FeedbackResponse"
- type: "null"
state:
type: string
enum:
- AWAITING_APPROVAL
- READY
- DELIVERED
- UNCONFIRMED
- WITHHELD
- REJECTED
- REPLACED
- FAILED
required:
- copies
- deliveredAt
- destination
- id
- response
- state
OwnItemEvent:
type: object
properties:
name:
type: string
occurredAt:
type: string
format: date-time
required:
- name
- occurredAt
OwnItemTrace:
type: object
properties:
events:
type: array
items:
$ref: "#/components/schemas/OwnItemEvent"
item:
$ref: "#/components/schemas/ItemRef"
results:
type: array
items:
$ref: "#/components/schemas/ResultList"
review:
$ref: "#/components/schemas/ReviewRef"
required:
- events
- item
- results
- review
Page:
type: object
properties:
body:
type: string
nextStep:
type: string
title:
type: string
PageMetadata:
properties:
number:
type: integer
format: int64
size:
type: integer
format: int64
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int64
required:
- number
- size
- totalElements
- totalPages
PageResponseDTOAuthEventView:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/AuthEventView"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOConfigAuditEntryView:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ConfigAuditEntryView"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOItemEvent:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ItemEvent"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOItemRef:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ItemRef"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOProfileReview:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ProfileReview"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOResultList:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ResultList"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOReviewBatch:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ReviewBatch"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOReviewFeedback:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ReviewFeedback"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOReviewProblem:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ReviewProblem"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOReviewResult:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ReviewResult"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOReviewSummary:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ReviewSummary"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOScanSummary:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/ScanSummary"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOSyncJob:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/SyncJob"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOUserViewAccount:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/UserViewAccount"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
PageResponseDTOWorkspaceMembership:
type: object
description: |-
Stable wire representation for the APIs that expose flat page metadata. Spring Data's PageImpl
is an implementation detail, not a JSON contract; these fields preserve the existing clients'
response shape without relying on its bean properties. New APIs use Spring Data's PagedModel.
properties:
content:
type: array
items:
$ref: "#/components/schemas/WorkspaceMembership"
empty:
type: boolean
first:
type: boolean
last:
type: boolean
number:
type: integer
format: int32
numberOfElements:
type: integer
format: int32
pageable:
$ref: "#/components/schemas/Pageable"
size:
type: integer
format: int32
sort:
$ref: "#/components/schemas/Sort"
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
required:
- content
- empty
- first
- last
- number
- numberOfElements
- pageable
- size
- sort
- totalElements
- totalPages
Pageable:
type: object
properties:
offset:
type: integer
format: int64
pageNumber:
type: integer
format: int32
pageSize:
type: integer
format: int32
paged:
type: boolean
sort:
$ref: "#/components/schemas/Sort"
unpaged:
type: boolean
required:
- offset
- pageNumber
- pageSize
- paged
- sort
- unpaged
PagedModelFeedbackItem:
type: object
properties:
content:
type: array
items:
$ref: "#/components/schemas/FeedbackItem"
page:
$ref: "#/components/schemas/PageMetadata"
PagedModelSurvey:
type: object
properties:
content:
type: array
items:
$ref: "#/components/schemas/Survey"
page:
$ref: "#/components/schemas/PageMetadata"
PagedModelSurveyResponse:
type: object
properties:
content:
type: array
items:
$ref: "#/components/schemas/SurveyResponse"
page:
$ref: "#/components/schemas/PageMetadata"
ParticipationCounts:
type: object
properties:
declined:
type: integer
format: int64
invited:
type: integer
format: int64
description: "every account shown the invitation, including those who then\
\ responded or declined"
responded:
type: integer
format: int64
required:
- declined
- invited
- responded
PersonDataProvider:
type: object
properties:
id:
type: integer
format: int64
serverUrl:
type: string
type:
type: string
required:
- id
- serverUrl
- type
PersonDataRequest:
type: object
properties:
completed:
type: object
additionalProperties:
type: integer
format: int64
counts:
type: object
additionalProperties:
type: integer
format: int64
expiresAt:
type: string
format: date-time
externalDeliveries:
type: array
items:
$ref: "#/components/schemas/ExternalDelivery"
failureCode:
type: string
id:
type: string
format: uuid
scope:
$ref: "#/components/schemas/PersonDataScope"
state:
type: string
enum:
- PREVIEW
- ERASING
- FAILED
- COMPLETE
- EXPIRED
required:
- completed
- counts
- expiresAt
- externalDeliveries
- id
- state
PersonDataScope:
type: object
properties:
accountId:
type: integer
format: int64
identities:
type: array
items:
$ref: "#/components/schemas/Identity"
required:
- identities
Practice:
type: object
properties:
catalogOrigin:
$ref: "#/components/schemas/CatalogOrigin"
createdAt:
type: string
format: date-time
currentVersion:
$ref: "#/components/schemas/PracticeVersion"
feedbackMode:
$ref: "#/components/schemas/FeedbackModeAssignment"
groupSlug:
type:
- string
- "null"
id:
type: string
pattern: "^[1-9][0-9]*$"
kind:
type: string
position:
type: integer
format: int32
slug:
type: string
updatedAt:
type:
- string
- "null"
format: date-time
required:
- catalogOrigin
- createdAt
- currentVersion
- feedbackMode
- groupSlug
- id
- kind
- position
- slug
- updatedAt
PracticeDefinition:
type: object
additionalProperties: false
properties:
about:
type:
- string
- "null"
enum:
- AUTHOR
- REVIEWER
- ASSIGNEE
- MERGER
- null
appliesWhen:
anyOf:
- $ref: "#/components/schemas/AppliesWhen"
- type: "null"
criteria:
type: string
guidance:
$ref: "#/components/schemas/PracticeGuidance"
lineNotes:
type: boolean
name:
type: string
reads:
$ref: "#/components/schemas/PracticeReads"
reviewOn:
$ref: "#/components/schemas/ReviewOn"
reviewedBy:
$ref: "#/components/schemas/ReviewedBy"
scan:
anyOf:
- $ref: "#/components/schemas/ScanDefinition"
- type: "null"
script:
type:
- string
- "null"
required:
- about
- appliesWhen
- criteria
- guidance
- lineNotes
- name
- reads
- reviewOn
- reviewedBy
- scan
- script
PracticeDefinitionInput:
type: object
additionalProperties: false
properties:
about:
type:
- string
- "null"
enum:
- AUTHOR
- REVIEWER
- ASSIGNEE
- MERGER
- null
appliesWhen:
anyOf:
- $ref: "#/components/schemas/AppliesWhen"
- type: "null"
criteria:
type: string
minLength: 1
guidance:
$ref: "#/components/schemas/PracticeGuidance"
lineNotes:
type: boolean
name:
type: string
minLength: 1
reads:
$ref: "#/components/schemas/PracticeReads"
reviewOn:
$ref: "#/components/schemas/ReviewOn"
reviewedBy:
$ref: "#/components/schemas/ReviewedByInput"
scan:
anyOf:
- $ref: "#/components/schemas/ScanDefinition"
- type: "null"
script:
type:
- string
- "null"
required:
- about
- appliesWhen
- criteria
- guidance
- lineNotes
- name
- reads
- reviewOn
- reviewedBy
- scan
- script
PracticeDefinitionOptions:
type: object
properties:
itemTypes:
type: array
items:
$ref: "#/components/schemas/PracticeItemTypeOption"
sourceContract:
type: string
required:
- itemTypes
- sourceContract
PracticeGroup:
type: object
properties:
catalogOrigin:
$ref: "#/components/schemas/CatalogOrigin"
color:
type:
- string
- "null"
createdAt:
type: string
format: date-time
description:
type:
- string
- "null"
feedbackMode:
$ref: "#/components/schemas/FeedbackModeAssignment"
icon:
type:
- string
- "null"
id:
type: string
pattern: "^[1-9][0-9]*$"
name:
type: string
position:
type: integer
format: int32
shownToDevelopers:
type: boolean
slug:
type: string
updatedAt:
type:
- string
- "null"
format: date-time
required:
- catalogOrigin
- color
- createdAt
- description
- feedbackMode
- icon
- id
- name
- position
- shownToDevelopers
- slug
- updatedAt
PracticeGroupStanding:
type: object
properties:
direction:
type:
- string
- "null"
enum:
- IMPROVING
- DECLINING
- UNCERTAIN
- INSUFFICIENT_EVIDENCE
- null
feedbackSince:
type:
- string
- "null"
format: date-time
feedbackSpanDays:
type:
- "null"
- integer
format: int32
groupColor:
type:
- string
- "null"
groupDescription:
type:
- string
- "null"
groupIcon:
type:
- string
- "null"
groupName:
type: string
groupSlug:
type: string
guidance:
type:
- string
- "null"
guidanceSource:
type:
- string
- "null"
enum:
- RULE_BASED
- null
results:
type: array
items:
$ref: "#/components/schemas/PracticeStandingResult"
sources:
type: array
items:
$ref: "#/components/schemas/FeedbackSourceCount"
standing:
type: string
enum:
- DEVELOPING
- STRENGTH
- MIXED
- NOT_OBSERVED
- NO_OPPORTUNITY
trendSupport:
anyOf:
- $ref: "#/components/schemas/TrendSupport"
- type: "null"
required:
- direction
- feedbackSince
- feedbackSpanDays
- groupColor
- groupDescription
- groupIcon
- groupName
- groupSlug
- guidance
- guidanceSource
- results
- sources
- standing
- trendSupport
PracticeGuidance:
type: object
properties:
goingWell:
type:
- string
- "null"
guide:
anyOf:
- $ref: "#/components/schemas/PracticeGuide"
- type: "null"
visual:
anyOf:
- $ref: "#/components/schemas/PracticeVisual"
- type: "null"
whatGoodLooksLike:
type:
- string
- "null"
whyItMatters:
type:
- string
- "null"
required:
- goingWell
- guide
- visual
- whatGoodLooksLike
- whyItMatters
PracticeGuidanceDTO:
type: object
properties:
guide:
anyOf:
- $ref: "#/components/schemas/PracticeGuide"
- type: "null"
practiceSlug:
type: string
visual:
anyOf:
- $ref: "#/components/schemas/PracticeVisual"
- type: "null"
required:
- guide
- practiceSlug
- visual
PracticeGuide:
type: object
additionalProperties: false
description: "Developer guidance: the text of a practice's Guide tab and the\
\ SVG figures it shows. Never changes how the practice is reviewed"
properties:
figures:
type: object
additionalProperties:
type: string
description: "SVG markup of each figure the Markdown shows, by figure name"
markdown:
type: string
description: "Markdown. Shows a figure with . Every field except observedAt is present\
\ only if the vendor actually reported it."
properties:
limit:
type: integer
format: int32
description: "Window ceiling, if the vendor reported one. Survives window\
\ rollover — a ceiling is window-invariant."
observedAt:
type: string
format: date-time
description: When the underlying vendor response was seen
remaining:
type: integer
format: int32
description: "Remaining budget, if reported and still inside the observed\
\ window. Null once the window has rolled over."
resetAt:
type: string
format: date-time
description: "When the observed window ends, if reported and still in the\
\ future"
throttledUntil:
type: string
format: date-time
description: An observed 429's back-off deadline (observedAt + Retry-After);
null if the vendor never told us to back off
required:
- observedAt
ReadReceipt:
type: object
properties:
contentDigest:
type: string
endLine:
type: integer
format: int32
path:
type: string
sourceKind:
type: string
sourcePath:
type: string
startLine:
type: integer
format: int32
status:
type: string
enum:
- COMPLETE
- TRUNCATED
- FAILED
- BINARY
- ABSENT
version:
type: string
ReadSourceOption:
type: object
properties:
citation:
$ref: "#/components/schemas/CitationCapabilities"
label:
type: string
needs:
type: array
items:
type: string
enum:
- REQUIRED
- COMPLETE
- OPTIONAL
source:
type: string
required:
- citation
- label
- needs
- source
ReasonCount:
type: object
properties:
count:
type: integer
format: int32
description:
type: string
reason:
type: string
required:
- count
- description
- reason
RegisterOutlineCollectionRequest:
type: object
description: Register an Outline collection for mirroring (lands ENABLED + PENDING)
properties:
collectionId:
type: string
description: Outline collection id (UUID)
maxLength: 64
minLength: 0
required:
- collectionId
RegisterSlackChannelRequest:
type: object
description: Allow-list a Slack channel (lands in PENDING)
properties:
channelName:
type: string
description: Optional human-readable channel name to store alongside the
id
maxLength: 256
minLength: 0
slackChannelId:
type: string
description: Slack public/private channel id (stable C… or G… id)
maxLength: 32
minLength: 0
pattern: "^[CG][A-Z0-9]{8,}$"
required:
- slackChannelId
ReleaseStart:
type: object
description: A release the server role started on this instance.
properties:
channel:
type: string
enum:
- RELEASE
- COMMIT
- DEVELOPMENT
commit:
type: string
environment:
type: string
image:
type: string
startedAt:
type: string
format: date-time
description: when the server role first started this release; a restart
does not change it
version:
type: string
required:
- channel
- environment
- startedAt
- version
ReleaseStatus:
type: object
description: |-
The running release and what the last update check found. Discovery is advisory: nothing here
verifies an artifact or performs an upgrade.
properties:
failure:
type: string
description: "why the last attempt did not complete, when status\
\ is FAILED"
enum:
- RATE_LIMITED
- UNAVAILABLE
- MALFORMED
history:
type: array
description: "the releases this instance ran, newest first"
items:
$ref: "#/components/schemas/ReleaseStart"
lastAttempt:
type: string
format: date-time
description: "when a check was last started, on any outcome"
lastSuccess:
type: string
format: date-time
description: "when a check last completed, which is when latest\
\ was observed"
latest:
$ref: "#/components/schemas/LatestRelease"
description: the newest published release as of lastSuccess
nextCheck:
type: string
format: date-time
description: when the next automatic check is due
retryUntil:
type: string
format: date-time
description: the wait GitHub named on a rate limit; a manual check before
it is refused
running:
$ref: "#/components/schemas/RunningRelease"
description: the identity this process reports
runningSince:
type: string
format: date-time
description: "when this instance started the running release, absent unless\
\ the newest start is it"
status:
type: string
description: the verdict an administrator reads first
enum:
- DISABLED
- NOT_APPLICABLE
- NEVER_CHECKED
- CURRENT
- UPDATE_AVAILABLE
- FAILED
required:
- history
- running
- status
RemovalGuard:
type: object
properties:
previousFiles:
type: integer
format: int32
state:
type: string
enum:
- APPLIED
- NOT_NEEDED
- INCOMPLETE_LISTING
- SUSPECT_LISTING
wouldRemove:
type: integer
format: int32
required:
- previousFiles
- state
- wouldRemove
RemoveResultMarkRequest:
type: object
properties:
reason:
type: string
required:
- reason
RenameWorkspaceSlugRequest:
type: object
description: Request to rename a workspace's URL slug
properties:
newSlug:
type: string
description: Non-reserved lowercase ASCII DNS label. Consecutive hyphens
are prohibited.
example: new-workspace-slug
maxLength: 51
minLength: 3
pattern: "^(?!.*--)[a-z0-9][a-z0-9-]{1,49}[a-z0-9]$"
required:
- newSlug
ReorderRequest:
type: object
properties:
slugs:
type: array
items:
type: string
maxLength: 64
minLength: 0
pattern: "[a-z0-9]+(?:-[a-z0-9]+)*"
maxItems: 10000
minItems: 0
required:
- slugs
RepositoryInfo:
type: object
description: Information about a git repository
properties:
description:
type: string
description: Description of the repository
hiddenFromContributions:
type: boolean
description: Whether activity in this repository is left out of a team's
activity
htmlUrl:
type: string
description: URL to the repository on the git provider
id:
type: integer
format: int64
description: Unique identifier of the repository
labels:
type: array
description: Labels defined in the repository
items:
$ref: "#/components/schemas/LabelInfo"
name:
type: string
description: Name of the repository
nameWithOwner:
type: string
description: "Full name including owner (e.g., 'owner/repo')"
required:
- hiddenFromContributions
- htmlUrl
- id
- name
- nameWithOwner
ResearchConsent:
type: object
properties:
granted:
type: boolean
noticeVersion:
type: string
researchOrganization:
type: string
description: The organization this control named on screen
required:
- granted
- noticeVersion
ResourceCounts:
type: object
description: Resource-level rollup for the connection overview badge
properties:
errored:
type: integer
format: int64
description: Resources currently reporting a sync error
pending:
type: integer
format: int64
description: "Resources that have never completed a sync (no lastSyncedAt).\
\ Defined on the timestamp rather than on a provider's status vocabulary\
\ so it means the same thing for a repository, a Slack channel and an\
\ Outline collection."
stale:
type: integer
format: int64
description: "Resources whose last sync is older than twice the connection's\
\ scheduled cadence. Always 0 when the cadence is unknown or the schedule\
\ is irregular — staleness is a judgement against a known cron, and without\
\ one this declines to guess rather than flagging healthy resources."
total:
type: integer
format: int64
description: Total resources known to this connection
required:
- errored
- pending
- stale
- total
ResultCoverage:
discriminator:
propertyName: source
properties:
source:
type: string
required:
- source
ResultDecision:
type: object
properties:
decision:
type: string
enum:
- ADMIT
- FEEDBACK_OFF
- MENTOR_UNAVAILABLE
- GATE_REFUSED
- UNATTRIBUTABLE_SUBJECT
- HAS_INLINE_ANCHOR
- ALREADY_DELIVERED_ON_WORK
- REVIEWER_DEFERRED
- BACKFILL_QUIET
resultId:
type: string
format: uuid
stopReason:
type:
- string
- "null"
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
- null
required:
- decision
- resultId
- stopReason
ResultDetail:
type: object
properties:
acceptedAt:
type:
- string
- "null"
format: date-time
coverage:
anyOf:
- oneOf:
- $ref: "#/components/schemas/ClaimedCoverage"
- $ref: "#/components/schemas/HostCoverage"
- type: "null"
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
endReason:
type:
- string
- "null"
enum:
- REPLACED
- OUTRANKED
- WORK_CHANGED
- REPAIRED
- REMOVED
- null
endedAt:
type:
- string
- "null"
format: date-time
evidence:
anyOf:
- $ref: "#/components/schemas/ResultEvidence"
- type: "null"
example:
anyOf:
- $ref: "#/components/schemas/ResultExample"
- type: "null"
explanation:
type:
- string
- "null"
feedback:
type: array
items:
$ref: "#/components/schemas/OwnFeedbackRef"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type:
- string
- "null"
markedIncorrectAt:
type:
- string
- "null"
format: date-time
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceName:
type: string
practiceSlug:
type: string
practiceVersionId:
type:
- string
- "null"
pattern: "^[1-9][0-9]*$"
practiceVersionNumber:
type:
- "null"
- integer
format: int32
problems:
type: array
items:
$ref: "#/components/schemas/Problem"
recordedAt:
type: string
format: date-time
reviewId:
type: string
format: uuid
severity:
type:
- string
- "null"
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- null
summary:
type:
- string
- "null"
required:
- acceptedAt
- coverage
- currentness
- endReason
- endedAt
- evidence
- example
- explanation
- feedback
- id
- item
- itemVersion
- markedIncorrectAt
- origin
- outcome
- practiceName
- practiceSlug
- practiceVersionId
- practiceVersionNumber
- problems
- recordedAt
- reviewId
- severity
- summary
ResultEvidence:
type: object
properties:
citations:
type: array
items:
$ref: "#/components/schemas/EvidenceCitation"
inapplicability:
anyOf:
- $ref: "#/components/schemas/InapplicabilityWarrant"
- type: "null"
openQuestions:
type: array
items:
$ref: "#/components/schemas/OpenQuestion"
search:
anyOf:
- $ref: "#/components/schemas/SearchWarrant"
- type: "null"
required:
- citations
- inapplicability
- openQuestions
- search
ResultExample:
type: object
properties:
citation:
$ref: "#/components/schemas/EvidenceCitation"
note:
type: string
required:
- citation
- note
ResultList:
type: object
properties:
acceptedAt:
type:
- string
- "null"
format: date-time
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
markedIncorrectAt:
type:
- string
- "null"
format: date-time
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceName:
type: string
practiceSlug:
type: string
problems:
type: array
items:
$ref: "#/components/schemas/ProblemSummary"
recordedAt:
type: string
format: date-time
reviewId:
type: string
format: uuid
severity:
type:
- string
- "null"
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- null
summary:
type:
- string
- "null"
required:
- acceptedAt
- currentness
- id
- item
- markedIncorrectAt
- origin
- outcome
- practiceName
- practiceSlug
- problems
- recordedAt
- reviewId
- severity
- summary
ResultMark:
type: object
properties:
createdAt:
type: string
format: date-time
createdBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
id:
type: string
format: uuid
kind:
type: string
enum:
- INCORRECT
- ACCEPTED
reason:
type: string
removalReason:
type:
- string
- "null"
removedAt:
type:
- string
- "null"
format: date-time
removedBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
resultId:
type: string
format: uuid
required:
- createdAt
- createdBy
- id
- kind
- reason
- removalReason
- removedAt
- removedBy
- resultId
ReusedScanReportItem:
allOf:
- type: object
properties:
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type: string
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceName:
type: string
practiceSlug:
type: string
problemCount:
type: integer
format: int32
recordedAt:
type: string
format: date-time
resultId:
type: string
format: uuid
severity:
type:
- string
- "null"
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- null
sourceReviewId:
type: string
format: uuid
status:
type: string
enum:
- REUSED
summary:
type:
- string
- "null"
required:
- currentness
- item
- itemVersion
- outcome
- practiceName
- practiceSlug
- problemCount
- recordedAt
- resultId
- severity
- sourceReviewId
- status
- summary
Review:
type: object
properties:
activeJobCount:
type: integer
format: int32
batchId:
type:
- string
- "null"
format: uuid
completedAt:
type:
- string
- "null"
format: date-time
createdAt:
type: string
format: date-time
feedback:
$ref: "#/components/schemas/ReviewFeedbackCounts"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type:
- string
- "null"
jobCount:
type: integer
format: int32
kind:
type: string
enum:
- ITEM
- SCAN
model:
type:
- string
- "null"
orderedAt:
type: string
format: date-time
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
practices:
type: array
items:
$ref: "#/components/schemas/ReviewPractice"
requestedBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
results:
$ref: "#/components/schemas/ReviewResultCounts"
startedBy:
anyOf:
- $ref: "#/components/schemas/ItemEvent"
- type: "null"
status:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
stopReason:
type:
- string
- "null"
enum:
- TIMED_OUT
- EXECUTION_FAILED
- PREPARATION_FAILED
- PROCESSING_FAILED
- PERSON_DATA_ERASED
- STALE_ROLLOUT_REVISION
- CANCELLED_BY_ADMIN
- REPLACED
- LEGACY_FAILURE
- EXECUTION_INCOMPLETE
- RESULT_WITHHELD
- READINESS_REFUSED
- SUSPECT_LISTING
- BUDGET
- USAGE_UNVERIFIABLE
- DEADLINE
- CANCELLED
- ENUMERATION_FAILED
- ENUMERATION_LIMIT
- NO_SCAN_PRACTICES
- MODEL_CHANGED
- MODEL_UNAVAILABLE
- ERROR
- LEGACY_SCOPE_UNKNOWN
- CONTRACT_CHANGED
- null
required:
- activeJobCount
- batchId
- completedAt
- createdAt
- feedback
- id
- item
- itemVersion
- jobCount
- kind
- model
- orderedAt
- origin
- practices
- requestedBy
- results
- startedBy
- status
- stopReason
ReviewBatch:
type: object
properties:
budgetUsd:
type:
- string
- "null"
confirmedBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
createdAt:
type: string
format: date-time
estimatedCostUsd:
type:
- string
- "null"
estimatedItems:
type: integer
format: int32
etag:
type: string
failedCount:
type: integer
format: int32
finishedAt:
type:
- string
- "null"
format: date-time
from:
type:
- string
- "null"
format: date-time
id:
type: string
format: uuid
itemKind:
type: string
origin:
type: string
enum:
- BACKFILL
- SCHEDULE
pauseReason:
type:
- string
- "null"
enum:
- BUDGET_EXHAUSTED
- REVIEW_MODEL_UNBOUND
- WORKSPACE_UNAVAILABLE
- PAUSED_BY_ADMIN
- null
requestedBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
reviewIds:
type: array
items:
type: string
format: uuid
scheduleId:
type:
- string
- "null"
format: uuid
skippedCount:
type: integer
format: int32
startedAt:
type:
- string
- "null"
format: date-time
status:
type: string
enum:
- AWAITING_CONFIRMATION
- RUNNING
- PAUSED
- COMPLETED
- CANCELLED
submittedCount:
type: integer
format: int32
targetItemIds:
type: string
pattern: "^[1-9][0-9]*$"
to:
type:
- string
- "null"
format: date-time
version:
type: string
required:
- budgetUsd
- confirmedBy
- createdAt
- estimatedCostUsd
- estimatedItems
- etag
- failedCount
- finishedAt
- from
- id
- itemKind
- origin
- pauseReason
- requestedBy
- reviewIds
- scheduleId
- skippedCount
- startedAt
- status
- submittedCount
- targetItemIds
- to
- version
ReviewBoundFeedback:
type: object
properties:
deliveredAt:
type:
- string
- "null"
format: date-time
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
id:
type: string
format: uuid
state:
type: string
enum:
- AWAITING_APPROVAL
- READY
- DELIVERED
- UNCONFIRMED
- WITHHELD
- REJECTED
- REPLACED
- FAILED
withdrawn:
type: boolean
required:
- deliveredAt
- destination
- id
- state
- withdrawn
ReviewBoundResult:
type: object
properties:
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
developer:
anyOf:
- $ref: "#/components/schemas/ReviewDeveloper"
- type: "null"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceName:
type: string
practiceSlug:
type: string
recordedAt:
type: string
format: date-time
reviewId:
type: string
format: uuid
severity:
type:
- string
- "null"
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- null
summary:
type:
- string
- "null"
required:
- currentness
- developer
- id
- item
- outcome
- practiceName
- practiceSlug
- recordedAt
- reviewId
- severity
- summary
ReviewBucket:
type: object
properties:
feedback:
type: integer
format: int32
results:
type: integer
format: int32
reviews:
type: integer
format: int32
start:
type: string
format: date-time
required:
- feedback
- results
- reviews
- start
ReviewContext:
type: object
properties:
canInspectReviewDetails:
type: boolean
item:
anyOf:
- $ref: "#/components/schemas/ItemRef"
- type: "null"
reasonDescription:
type:
- string
- "null"
requestAllowed:
type: boolean
workspaceId:
type: string
pattern: "^[1-9][0-9]*$"
workspaceSlug:
type: string
required:
- canInspectReviewDetails
- item
- reasonDescription
- requestAllowed
- workspaceId
- workspaceSlug
ReviewDetail:
type: object
properties:
activeJobCount:
type: integer
format: int32
batchId:
type:
- string
- "null"
format: uuid
completedAt:
type:
- string
- "null"
format: date-time
createdAt:
type: string
format: date-time
feedback:
$ref: "#/components/schemas/ReviewFeedbackCounts"
generatedPaths:
anyOf:
- $ref: "#/components/schemas/GeneratedPathReview"
- type: "null"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type:
- string
- "null"
jobCount:
type: integer
format: int32
kind:
type: string
enum:
- ITEM
- SCAN
model:
type:
- string
- "null"
orderedAt:
type: string
format: date-time
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
practices:
type: array
items:
$ref: "#/components/schemas/ReviewPractice"
requestedBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
results:
$ref: "#/components/schemas/ReviewResultCounts"
runtime:
anyOf:
- $ref: "#/components/schemas/ReviewRuntime"
- type: "null"
stageTiming:
type: array
items:
$ref: "#/components/schemas/ReviewStageTiming"
startedBy:
anyOf:
- $ref: "#/components/schemas/ItemEvent"
- type: "null"
status:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
stopReason:
type:
- string
- "null"
enum:
- TIMED_OUT
- EXECUTION_FAILED
- PREPARATION_FAILED
- PROCESSING_FAILED
- PERSON_DATA_ERASED
- STALE_ROLLOUT_REVISION
- CANCELLED_BY_ADMIN
- REPLACED
- LEGACY_FAILURE
- EXECUTION_INCOMPLETE
- RESULT_WITHHELD
- READINESS_REFUSED
- SUSPECT_LISTING
- BUDGET
- USAGE_UNVERIFIABLE
- DEADLINE
- CANCELLED
- ENUMERATION_FAILED
- ENUMERATION_LIMIT
- NO_SCAN_PRACTICES
- MODEL_CHANGED
- MODEL_UNAVAILABLE
- ERROR
- LEGACY_SCOPE_UNKNOWN
- CONTRACT_CHANGED
- null
usage:
$ref: "#/components/schemas/ReviewUsage"
required:
- activeJobCount
- batchId
- completedAt
- createdAt
- feedback
- generatedPaths
- id
- item
- itemVersion
- jobCount
- kind
- model
- orderedAt
- origin
- practices
- requestedBy
- results
- runtime
- stageTiming
- startedBy
- status
- stopReason
- usage
ReviewDeveloper:
type: object
properties:
accountId:
type: string
pattern: "^[1-9][0-9]*$"
avatarUrl:
type:
- string
- "null"
displayName:
type:
- string
- "null"
providerLogin:
type:
- string
- "null"
required:
- accountId
- avatarUrl
- displayName
- providerLogin
ReviewEvidenceOutcome:
type: object
properties:
notReviewed:
type: integer
format: int32
outcomes:
$ref: "#/components/schemas/OutcomeVector"
practiceName:
type: string
practiceSlug:
type: string
withheld:
type: integer
format: int32
required:
- notReviewed
- outcomes
- practiceName
- practiceSlug
- withheld
ReviewFeedback:
type: object
properties:
bodyPreview:
type:
- string
- "null"
bodyTruncated:
type: boolean
copyCounts:
$ref: "#/components/schemas/FeedbackCopyCounts"
createdAt:
type: string
format: date-time
deliveredAt:
type:
- string
- "null"
format: date-time
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
developer:
$ref: "#/components/schemas/ReviewDeveloper"
disagreedAt:
type:
- string
- "null"
format: date-time
id:
type: string
format: uuid
item:
anyOf:
- $ref: "#/components/schemas/ItemRef"
- type: "null"
location:
type: string
enum:
- GITHUB
- GITLAB
- OTHER_WORK
- HEPH
- SLACK
- NEXT_CONVERSATION
- PRACTICE_PAGES
replacesId:
type:
- string
- "null"
format: uuid
resultCount:
type: integer
format: int32
reviewId:
type: string
format: uuid
state:
type: string
enum:
- AWAITING_APPROVAL
- READY
- DELIVERED
- UNCONFIRMED
- WITHHELD
- REJECTED
- REPLACED
- FAILED
stopReason:
type:
- string
- "null"
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
- null
textHidden:
type: boolean
unverifiedHistory:
type: boolean
withdrawn:
type: boolean
required:
- bodyPreview
- bodyTruncated
- copyCounts
- createdAt
- deliveredAt
- destination
- developer
- disagreedAt
- id
- item
- location
- replacesId
- resultCount
- reviewId
- state
- stopReason
- textHidden
- unverifiedHistory
- withdrawn
ReviewFeedbackCounts:
type: object
properties:
awaitingApproval:
type: integer
format: int32
delivered:
type: integer
format: int32
failed:
type: integer
format: int32
ready:
type: integer
format: int32
rejected:
type: integer
format: int32
replaced:
type: integer
format: int32
unconfirmed:
type: integer
format: int32
withheld:
type: integer
format: int32
required:
- awaitingApproval
- delivered
- failed
- ready
- rejected
- replaced
- unconfirmed
- withheld
ReviewFeedbackDetail:
type: object
properties:
basis:
type: array
items:
$ref: "#/components/schemas/FeedbackBasis"
body:
type:
- string
- "null"
bodyPreview:
type:
- string
- "null"
bodyTruncated:
type: boolean
checks:
type: array
items:
$ref: "#/components/schemas/FeedbackCheck"
contentDigest:
type:
- string
- "null"
copies:
type: array
items:
$ref: "#/components/schemas/FeedbackCopy"
copyCounts:
$ref: "#/components/schemas/FeedbackCopyCounts"
createdAt:
type: string
format: date-time
decisions:
type: array
items:
$ref: "#/components/schemas/FeedbackDecision"
deliveredAt:
type:
- string
- "null"
format: date-time
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
developer:
$ref: "#/components/schemas/ReviewDeveloper"
disagreedAt:
type:
- string
- "null"
format: date-time
id:
type: string
format: uuid
item:
anyOf:
- $ref: "#/components/schemas/ItemRef"
- type: "null"
location:
type: string
enum:
- GITHUB
- GITLAB
- OTHER_WORK
- HEPH
- SLACK
- NEXT_CONVERSATION
- PRACTICE_PAGES
replacesId:
type:
- string
- "null"
format: uuid
response:
anyOf:
- $ref: "#/components/schemas/FeedbackResponse"
- type: "null"
resultCount:
type: integer
format: int32
reviewId:
type: string
format: uuid
sends:
type: array
items:
$ref: "#/components/schemas/FeedbackSend"
state:
type: string
enum:
- AWAITING_APPROVAL
- READY
- DELIVERED
- UNCONFIRMED
- WITHHELD
- REJECTED
- REPLACED
- FAILED
stopReason:
type:
- string
- "null"
enum:
- VOLUME_CAPPED
- COMPOSER_WITHHELD
- NOTHING_NEW
- REPEATS_DELIVERED_NOTE
- REACTED_DISAGREE
- REACTED_NOT_APPLICABLE
- CONVERSATION_EXPIRED
- DELIVERY_UNCONFIRMED
- ITEM_GONE
- ITEM_CLOSED
- ITEM_MERGED
- ITEM_STATE_INELIGIBLE
- ISSUE_SNAPSHOT_CHANGED
- PUBLIC_SUBJECT_INELIGIBLE
- NO_AI
- DELIVERY_OFF
- PERSON_SUPPRESSED
- RECIPIENT_UNAVAILABLE
- EMPTY_AFTER_SANITIZE
- INSTANCE_SILENCED
- FEEDBACK_OFF
- WORKSPACE_DISABLED
- WORKSPACE_DELIVERY_PAUSED
- STALE_ROLLOUT_REVISION
- OUTSIDE_CURRENT_SCOPE
- APPROVAL_STALE
- APPROVAL_NO_LONGER_ELIGIBLE
- PRACTICE_REQUIRES_APPROVAL
- BACKFILL_QUIET
- RESULT_MARKED_INCORRECT
- REVIEWED_VERSION_CHANGED
- REVIEW_CANCELLED
- EVIDENCE_NOT_PERMITTED
- NO_EVIDENCE
- UNCORROBORATED
- PUBLIC_HISTORY_CHANGED
- PUBLIC_DELIVERY_UNRESOLVED
- null
textHidden:
type: boolean
unverifiedHistory:
type: boolean
withdrawn:
type: boolean
required:
- basis
- body
- bodyPreview
- bodyTruncated
- checks
- contentDigest
- copies
- copyCounts
- createdAt
- decisions
- deliveredAt
- destination
- developer
- disagreedAt
- id
- item
- location
- replacesId
- response
- resultCount
- reviewId
- sends
- state
- stopReason
- textHidden
- unverifiedHistory
- withdrawn
ReviewItemCounts:
type: object
properties:
listed:
type: integer
format: int32
notReviewed:
type: integer
format: int32
reused:
type: integer
format: int32
reviewed:
type: integer
format: int32
withheld:
type: integer
format: int32
required:
- listed
- notReviewed
- reused
- reviewed
- withheld
ReviewJob:
type: object
properties:
attempt:
type: integer
format: int32
availableAt:
type: string
format: date-time
completedAt:
type:
- string
- "null"
format: date-time
errorMessage:
type:
- string
- "null"
exitCode:
type:
- "null"
- integer
format: int32
id:
type: string
format: uuid
processingStatus:
type: string
enum:
- NONE
- PENDING
- DONE
- FAILED
startedAt:
type:
- string
- "null"
format: date-time
status:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETED
- FAILED
- TIMED_OUT
- CANCELLED
traceId:
type: string
required:
- attempt
- availableAt
- completedAt
- errorMessage
- exitCode
- id
- processingStatus
- startedAt
- status
- traceId
ReviewLimit:
type: object
properties:
code:
type: string
description:
type: string
required:
- code
- description
ReviewLimitInput:
type: object
additionalProperties: false
properties:
code:
type:
- string
- "null"
maxLength: 64
minLength: 0
description:
type: string
maxLength: 2000
minLength: 0
required:
- description
ReviewLineage:
type: object
properties:
edges:
type: array
items:
$ref: "#/components/schemas/ReviewLineageEdge"
nodes:
type: array
items:
$ref: "#/components/schemas/ReviewLineageNode"
rootId:
type: string
required:
- edges
- nodes
- rootId
ReviewLineageEdge:
type: object
properties:
from:
type: string
relation:
type: string
to:
type: string
required:
- from
- relation
- to
ReviewLineageNode:
type: object
properties:
feedback:
anyOf:
- $ref: "#/components/schemas/ReviewBoundFeedback"
- type: "null"
id:
type: string
item:
anyOf:
- $ref: "#/components/schemas/ItemRef"
- type: "null"
kind:
type: string
enum:
- ITEM
- REVIEW
- RESULT
- PROBLEM
- FEEDBACK
problem:
anyOf:
- $ref: "#/components/schemas/ProblemSummary"
- type: "null"
result:
anyOf:
- $ref: "#/components/schemas/ReviewBoundResult"
- type: "null"
review:
anyOf:
- $ref: "#/components/schemas/ReviewRef"
- type: "null"
required:
- feedback
- id
- item
- kind
- problem
- result
- review
ReviewMethod:
type: object
properties:
epoch:
type: integer
format: int32
modelDigest:
type: string
models:
type: array
items:
$ref: "#/components/schemas/BoundModelSlot"
required:
- epoch
- modelDigest
- models
ReviewOn:
type: object
properties:
events:
type: array
items:
type: string
state:
type: object
additionalProperties:
type: array
items:
type: string
uniqueItems: true
required:
- events
- state
ReviewOverview:
type: object
properties:
bucket:
type: string
enum:
- DAY
- WEEK
- MONTH
buckets:
type: array
items:
$ref: "#/components/schemas/ReviewBucket"
feedback:
$ref: "#/components/schemas/ReviewFeedbackCounts"
from:
type: string
format: date-time
practices:
type: array
items:
$ref: "#/components/schemas/ReviewPracticeCounts"
results:
$ref: "#/components/schemas/ReviewResultCounts"
resultsMarkedIncorrect:
type: integer
format: int32
reviews:
$ref: "#/components/schemas/ReviewStatusCounts"
to:
type: string
format: date-time
required:
- bucket
- buckets
- feedback
- from
- practices
- results
- resultsMarkedIncorrect
- reviews
- to
ReviewPractice:
type: object
properties:
itemCounts:
$ref: "#/components/schemas/ReviewItemCounts"
number:
type:
- "null"
- integer
format: int32
practiceName:
type: string
practiceSlug:
type: string
practiceVersionId:
type:
- string
- "null"
pattern: "^[1-9][0-9]*$"
reason:
type:
- string
- "null"
results:
$ref: "#/components/schemas/ReviewResultCounts"
script:
anyOf:
- $ref: "#/components/schemas/PracticeScriptRun"
- type: "null"
status:
type: string
enum:
- QUEUED
- READY
- RUNNING
- DONE
- WITHHELD
- FAILED
required:
- itemCounts
- number
- practiceName
- practiceSlug
- practiceVersionId
- reason
- results
- script
- status
ReviewPracticeCounts:
type: object
properties:
feedback:
$ref: "#/components/schemas/ReviewFeedbackCounts"
group:
anyOf:
- $ref: "#/components/schemas/GroupRef"
- type: "null"
practiceName:
type: string
practiceSlug:
type: string
results:
$ref: "#/components/schemas/ReviewResultCounts"
resultsMarkedIncorrect:
type: integer
format: int32
required:
- feedback
- group
- practiceName
- practiceSlug
- results
- resultsMarkedIncorrect
ReviewProblem:
type: object
properties:
acceptedAt:
type:
- string
- "null"
format: date-time
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
developer:
anyOf:
- $ref: "#/components/schemas/ReviewDeveloper"
- type: "null"
disagreedAt:
type:
- string
- "null"
format: date-time
endLine:
type:
- "null"
- integer
format: int32
evidenceHidden:
type: boolean
group:
anyOf:
- $ref: "#/components/schemas/GroupRef"
- type: "null"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
markedIncorrectAt:
type:
- string
- "null"
format: date-time
path:
type:
- string
- "null"
practiceName:
type: string
practiceSlug:
type: string
recordedAt:
type: string
format: date-time
resultId:
type: string
format: uuid
reviewId:
type: string
format: uuid
severity:
type: string
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
side:
type:
- string
- "null"
enum:
- OLD
- NEW
- null
sourceKind:
type:
- string
- "null"
startLine:
type:
- "null"
- integer
format: int32
summary:
type: string
required:
- acceptedAt
- currentness
- developer
- disagreedAt
- endLine
- evidenceHidden
- group
- id
- item
- markedIncorrectAt
- path
- practiceName
- practiceSlug
- recordedAt
- resultId
- reviewId
- severity
- side
- sourceKind
- startLine
- summary
ReviewProblemDetail:
type: object
properties:
acceptedAt:
type:
- string
- "null"
format: date-time
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
developer:
anyOf:
- $ref: "#/components/schemas/ReviewDeveloper"
- type: "null"
disagreedAt:
type:
- string
- "null"
format: date-time
endLine:
type:
- "null"
- integer
format: int32
evidenceHidden:
type: boolean
group:
anyOf:
- $ref: "#/components/schemas/GroupRef"
- type: "null"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
markedIncorrectAt:
type:
- string
- "null"
format: date-time
path:
type:
- string
- "null"
practiceName:
type: string
practiceSlug:
type: string
problem:
$ref: "#/components/schemas/Problem"
recordedAt:
type: string
format: date-time
result:
$ref: "#/components/schemas/ReviewBoundResult"
resultId:
type: string
format: uuid
reviewId:
type: string
format: uuid
severity:
type: string
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
side:
type:
- string
- "null"
enum:
- OLD
- NEW
- null
sourceKind:
type:
- string
- "null"
startLine:
type:
- "null"
- integer
format: int32
summary:
type: string
required:
- acceptedAt
- currentness
- developer
- disagreedAt
- endLine
- evidenceHidden
- group
- id
- item
- markedIncorrectAt
- path
- practiceName
- practiceSlug
- problem
- recordedAt
- result
- resultId
- reviewId
- severity
- side
- sourceKind
- startLine
- summary
ReviewQueue:
type: object
properties:
activeWorkers:
type: integer
format: int64
asOf:
type: string
format: date-time
finishedLastDay:
type: integer
format: int64
finishedLastHour:
type: integer
format: int64
finishedPerHourLastDay:
type: number
format: double
head:
type: array
items:
$ref: "#/components/schemas/ReviewQueueItem"
heldForBudget:
type: integer
format: int64
oldestWaitingSince:
type:
- string
- "null"
format: date-time
running:
type: integer
format: int64
waiting:
type: integer
format: int64
required:
- activeWorkers
- asOf
- finishedLastDay
- finishedLastHour
- finishedPerHourLastDay
- head
- heldForBudget
- oldestWaitingSince
- running
- waiting
ReviewQueueItem:
type: object
properties:
developer:
anyOf:
- $ref: "#/components/schemas/ReviewDeveloper"
- type: "null"
heldForBudget:
type: boolean
item:
$ref: "#/components/schemas/ItemRef"
jobId:
type: string
format: uuid
reviewId:
type: string
format: uuid
since:
type: string
format: date-time
status:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETED
- FAILED
- TIMED_OUT
- CANCELLED
required:
- developer
- heldForBudget
- item
- jobId
- reviewId
- since
- status
ReviewRef:
type: object
properties:
completedAt:
type:
- string
- "null"
format: date-time
createdAt:
type: string
format: date-time
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type:
- string
- "null"
kind:
type: string
enum:
- ITEM
- SCAN
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
status:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
required:
- completedAt
- createdAt
- id
- item
- itemVersion
- kind
- origin
- status
ReviewRequestOutcome:
type: object
properties:
reason:
type:
- string
- "null"
enum:
- GATE_WITHHELD
- COOLDOWN_ACTIVE
- REQUEST_COOLDOWN_ACTIVE
- REQUESTER_QUOTA_EXHAUSTED
- CONCURRENT_DUPLICATE
- COALESCED
- OUT_OF_REVIEW_SCOPE
- BOT_AUTHOR
- BOT_REVIEWER
- STALE_ROLLOUT_REVISION
- WORKSPACE_INACTIVE
- PRACTICES_DISABLED
- NO_ACTIVE_PRACTICE
- REVIEW_MODEL_UNBOUND
- MEMBER_AI_DECLINED
- PERSON_DATA_ERASED
- FEEDBACK_MODE_OFF
- SUBJECT_UNLINKED
- MERGE_ACTOR_UNAVAILABLE
- MODEL_UNAVAILABLE
- BUDGET_EXHAUSTED
- ITEM_NOT_VISIBLE
- VERSION_SUPERSEDED
- PENDING_DEADLINE_EXCEEDED
- ITEM_GONE
- LEGACY_REVIEW_UNBOUND
- null
reviewId:
type:
- string
- "null"
format: uuid
status:
type: string
enum:
- SUBMITTED
- REFUSED
required:
- reason
- reviewId
- status
ReviewResult:
type: object
properties:
acceptedAt:
type:
- string
- "null"
format: date-time
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
developer:
anyOf:
- $ref: "#/components/schemas/ReviewDeveloper"
- type: "null"
feedback:
$ref: "#/components/schemas/ReviewFeedbackCounts"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
markedIncorrectAt:
type:
- string
- "null"
format: date-time
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceName:
type: string
practiceSlug:
type: string
problemCount:
type: integer
format: int32
problems:
type: array
items:
$ref: "#/components/schemas/ProblemSummary"
recordedAt:
type: string
format: date-time
reviewId:
type: string
format: uuid
severity:
type:
- string
- "null"
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- null
summary:
type:
- string
- "null"
required:
- acceptedAt
- currentness
- developer
- feedback
- id
- item
- markedIncorrectAt
- origin
- outcome
- practiceName
- practiceSlug
- problemCount
- problems
- recordedAt
- reviewId
- severity
- summary
ReviewResultCounts:
type: object
properties:
couldNotDetermine:
type: integer
format: int32
doesNotApply:
type: integer
format: int32
met:
type: integer
format: int32
notMet:
type: integer
format: int32
required:
- couldNotDetermine
- doesNotApply
- met
- notMet
ReviewResultDetail:
type: object
properties:
acceptedAt:
type:
- string
- "null"
format: date-time
coverage:
anyOf:
- oneOf:
- $ref: "#/components/schemas/ClaimedCoverage"
- $ref: "#/components/schemas/HostCoverage"
- type: "null"
currentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
developer:
anyOf:
- $ref: "#/components/schemas/ReviewDeveloper"
- type: "null"
disagreements:
type: array
items:
$ref: "#/components/schemas/FeedbackDisagreement"
endReason:
type:
- string
- "null"
enum:
- REPLACED
- OUTRANKED
- WORK_CHANGED
- REPAIRED
- REMOVED
- null
endedAt:
type:
- string
- "null"
format: date-time
evidence:
anyOf:
- $ref: "#/components/schemas/ResultEvidence"
- type: "null"
evidenceHidden:
type: boolean
evidenceVersion:
type: integer
format: int32
example:
anyOf:
- $ref: "#/components/schemas/ResultExample"
- type: "null"
explanation:
type:
- string
- "null"
feedback:
type: array
items:
$ref: "#/components/schemas/ReviewBoundFeedback"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type:
- string
- "null"
markedIncorrectAt:
type:
- string
- "null"
format: date-time
marks:
type: array
items:
$ref: "#/components/schemas/ResultMark"
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceName:
type: string
practiceSlug:
type: string
practiceVersionId:
type:
- string
- "null"
pattern: "^[1-9][0-9]*$"
practiceVersionNumber:
type:
- "null"
- integer
format: int32
problems:
type: array
items:
$ref: "#/components/schemas/Problem"
recordedAt:
type: string
format: date-time
reviewId:
type: string
format: uuid
severity:
type:
- string
- "null"
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
- null
summary:
type:
- string
- "null"
required:
- acceptedAt
- coverage
- currentness
- developer
- disagreements
- endReason
- endedAt
- evidence
- evidenceHidden
- evidenceVersion
- example
- explanation
- feedback
- id
- item
- itemVersion
- markedIncorrectAt
- marks
- origin
- outcome
- practiceName
- practiceSlug
- practiceVersionId
- practiceVersionNumber
- problems
- recordedAt
- reviewId
- severity
- summary
ReviewRuntime:
type: object
properties:
jobs:
type: array
items:
$ref: "#/components/schemas/ReviewJob"
required:
- jobs
ReviewSchedule:
type: object
properties:
budgetUsd:
type:
- string
- "null"
cadence:
type: string
enum:
- DAILY
- WEEKLY
createdAt:
type: string
format: date-time
createdBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
enabled:
type: boolean
id:
type: string
format: uuid
itemKind:
type: string
lastRunAt:
type:
- string
- "null"
format: date-time
lookbackDays:
type:
- "null"
- integer
format: int32
nextRunAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
version:
type: string
required:
- budgetUsd
- cadence
- createdAt
- createdBy
- enabled
- id
- itemKind
- lastRunAt
- lookbackDays
- nextRunAt
- updatedAt
- version
ReviewScheduleInput:
type: object
properties:
budgetUsd:
type:
- string
- "null"
cadence:
type: string
enum:
- DAILY
- WEEKLY
enabled:
type: boolean
itemKind:
type: string
lookbackDays:
type:
- "null"
- integer
format: int32
required:
- budgetUsd
- cadence
- enabled
- itemKind
- lookbackDays
ReviewScopeRepository:
type: object
properties:
baseBranches:
type: array
items:
type: string
repositoryItemId:
type: string
pattern: "[1-9][0-9]*"
required:
- baseBranches
- repositoryItemId
ReviewStageTiming:
type: object
properties:
completedAt:
type:
- string
- "null"
format: date-time
durationMs:
type:
- "null"
- integer
format: int32
stage:
type: string
startedAt:
type:
- string
- "null"
format: date-time
required:
- completedAt
- durationMs
- stage
- startedAt
ReviewStatusCounts:
type: object
properties:
cancelled:
type: integer
format: int32
complete:
type: integer
format: int32
failed:
type: integer
format: int32
partial:
type: integer
format: int32
queued:
type: integer
format: int32
running:
type: integer
format: int32
required:
- cancelled
- complete
- failed
- partial
- queued
- running
ReviewSummary:
type: object
properties:
activeJobCount:
type: integer
format: int32
batchId:
type:
- string
- "null"
format: uuid
completedAt:
type:
- string
- "null"
format: date-time
createdAt:
type: string
format: date-time
feedback:
$ref: "#/components/schemas/ReviewFeedbackCounts"
id:
type: string
format: uuid
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type:
- string
- "null"
jobCount:
type: integer
format: int32
kind:
type: string
enum:
- ITEM
- SCAN
model:
type:
- string
- "null"
orderedAt:
type: string
format: date-time
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
practices:
type: array
items:
$ref: "#/components/schemas/ReviewPractice"
requestedBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
results:
$ref: "#/components/schemas/ReviewResultCounts"
startedBy:
anyOf:
- $ref: "#/components/schemas/ItemEvent"
- type: "null"
status:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
stopReason:
type:
- string
- "null"
enum:
- TIMED_OUT
- EXECUTION_FAILED
- PREPARATION_FAILED
- PROCESSING_FAILED
- PERSON_DATA_ERASED
- STALE_ROLLOUT_REVISION
- CANCELLED_BY_ADMIN
- REPLACED
- LEGACY_FAILURE
- EXECUTION_INCOMPLETE
- RESULT_WITHHELD
- READINESS_REFUSED
- SUSPECT_LISTING
- BUDGET
- USAGE_UNVERIFIABLE
- DEADLINE
- CANCELLED
- ENUMERATION_FAILED
- ENUMERATION_LIMIT
- NO_SCAN_PRACTICES
- MODEL_CHANGED
- MODEL_UNAVAILABLE
- ERROR
- LEGACY_SCOPE_UNKNOWN
- CONTRACT_CHANGED
- null
required:
- activeJobCount
- batchId
- completedAt
- createdAt
- feedback
- id
- item
- itemVersion
- jobCount
- kind
- model
- orderedAt
- origin
- practices
- requestedBy
- results
- startedBy
- status
- stopReason
ReviewTimeShares:
type: object
properties:
asked:
type: number
format: double
model:
type: number
format: double
posted:
type:
- number
- "null"
format: double
preparation:
type: number
format: double
queue:
type: number
format: double
runUnsplit:
type: number
format: double
required:
- asked
- model
- posted
- preparation
- queue
- runUnsplit
ReviewTiming:
type: object
properties:
asked:
$ref: "#/components/schemas/ReviewTimingStage"
feedbackWithheldAsMerged:
type: integer
format: int64
finished:
$ref: "#/components/schemas/ReviewTimingStage"
finishedAfterMerge:
type: integer
format: int64
finishedAfterMergeStartedByMerge:
type: integer
format: int64
finishedShares:
anyOf:
- $ref: "#/components/schemas/ReviewTimeShares"
- type: "null"
from:
type: string
format: date-time
model:
$ref: "#/components/schemas/ReviewTimingStage"
posted:
$ref: "#/components/schemas/ReviewTimingStage"
preparation:
$ref: "#/components/schemas/ReviewTimingStage"
queue:
$ref: "#/components/schemas/ReviewTimingStage"
read:
$ref: "#/components/schemas/ReviewTimingStage"
to:
type: string
format: date-time
total:
$ref: "#/components/schemas/ReviewTimingStage"
totalShares:
anyOf:
- $ref: "#/components/schemas/ReviewTimeShares"
- type: "null"
waitingLong:
type: integer
format: int64
required:
- asked
- feedbackWithheldAsMerged
- finished
- finishedAfterMerge
- finishedAfterMergeStartedByMerge
- finishedShares
- from
- model
- posted
- preparation
- queue
- read
- to
- total
- totalShares
- waitingLong
ReviewTimingStage:
type: object
properties:
count:
type: integer
format: int64
medianSeconds:
type:
- number
- "null"
format: double
p90Seconds:
type:
- number
- "null"
format: double
required:
- count
- medianSeconds
- p90Seconds
ReviewUsage:
type: object
properties:
attempts:
type: array
items:
$ref: "#/components/schemas/ReviewUsageAttempt"
calls:
type: integer
format: int64
costUsd:
type:
- string
- "null"
inputTokens:
type: integer
format: int64
outputTokens:
type: integer
format: int64
priced:
type: boolean
required:
- attempts
- calls
- costUsd
- inputTokens
- outputTokens
- priced
ReviewUsageAttempt:
type: object
properties:
attempt:
type: integer
format: int32
cacheReadTokens:
type: integer
format: int64
cacheWriteTokens:
type: integer
format: int64
calls:
type: integer
format: int64
costUsd:
type:
- string
- "null"
inputTokens:
type: integer
format: int64
jobId:
type: string
format: uuid
outputTokens:
type: integer
format: int64
pricingState:
type: string
enum:
- PRICED
- NO_CHARGE
- UNPRICED
reasoningTokens:
type: integer
format: int64
required:
- attempt
- cacheReadTokens
- cacheWriteTokens
- calls
- costUsd
- inputTokens
- jobId
- outputTokens
- pricingState
- reasoningTokens
ReviewedBy:
type: object
properties:
by:
type: string
enum:
- HEPHAESTUS
- PEOPLE
- NOBODY
humanReason:
anyOf:
- $ref: "#/components/schemas/ReviewLimit"
- type: "null"
limits:
type: array
items:
$ref: "#/components/schemas/ReviewLimit"
required:
- by
- humanReason
- limits
ReviewedByInput:
type: object
additionalProperties: false
properties:
by:
type: string
enum:
- HEPHAESTUS
- PEOPLE
- NOBODY
humanReason:
anyOf:
- $ref: "#/components/schemas/ReviewLimitInput"
- type: "null"
limits:
type: array
items:
$ref: "#/components/schemas/ReviewLimitInput"
maxItems: 100
minItems: 0
required:
- by
- humanReason
- limits
ReviewedPractice:
type: object
properties:
group:
anyOf:
- $ref: "#/components/schemas/GroupRef"
- type: "null"
name:
type: string
slug:
type: string
whatGoodLooksLike:
type:
- string
- "null"
whyItMatters:
type:
- string
- "null"
required:
- group
- name
- slug
- whatGoodLooksLike
- whyItMatters
Reviewer:
type: object
description: "Someone reviewing a pull request, and where their review stands"
properties:
state:
type: string
description: "REQUESTED while a review is asked of them, otherwise the verdict\
\ of their latest review that was not dismissed"
enum:
- CHANGES_REQUESTED
- APPROVED
- COMMENTED
- REQUESTED
user:
$ref: "#/components/schemas/UserInfo"
description: The reviewer
required:
- state
- user
RevokeSessionsResult:
type: object
properties:
revoked:
type: integer
format: int32
required:
- revoked
RunningRelease:
type: object
description: |-
Deployment-reported identity: the values the verified lock env handed this process, not an
observation of the container. commit and image are absent outside a lock-driven
deployment.
properties:
channel:
type: string
description: what kind of build that version names
enum:
- RELEASE
- COMMIT
- DEVELOPMENT
commit:
type: string
description: the source commit the lock names
environment:
type: string
description: the name the deployment gives this instance
image:
type: string
description: the digest reference this container was started from
roles:
type: array
description: the runtime roles this process booted with
items:
type: string
enum:
- SERVER
- WORKER
- WEBHOOK
version:
type: string
description: the version the deployment passed as APP_VERSION
required:
- channel
- environment
- roles
- version
RuntimeNonResult:
type: object
description: "An assigned practice that runtime execution could not complete,\
\ without an outcome about the work."
properties:
practiceSlug:
type: string
reason:
type: string
enum:
- TIMED_OUT
- EXECUTION_FAILED
- PREPARATION_FAILED
- PROCESSING_FAILED
- PERSON_DATA_ERASED
- STALE_ROLLOUT_REVISION
- CANCELLED_BY_ADMIN
- REPLACED
- LEGACY_FAILURE
- EXECUTION_INCOMPLETE
- RESULT_WITHHELD
- READINESS_REFUSED
- SUSPECT_LISTING
- BUDGET
- USAGE_UNVERIFIABLE
- DEADLINE
- CANCELLED
- ENUMERATION_FAILED
- ENUMERATION_LIMIT
- NO_SCAN_PRACTICES
- MODEL_CHANGED
- MODEL_UNAVAILABLE
- ERROR
- LEGACY_SCOPE_UNKNOWN
- CONTRACT_CHANGED
required:
- practiceSlug
- reason
ScanAvailability:
type: object
properties:
expired:
type: boolean
expiredProofPairs:
type: integer
format: int32
rawRetentionEndsAt:
type:
- string
- "null"
format: date-time
withheldProofPairs:
type: integer
format: int32
required:
- expired
- expiredProofPairs
- rawRetentionEndsAt
- withheldProofPairs
ScanCounts:
type: object
properties:
couldNotDetermine:
type: integer
format: int32
doesNotApply:
type: integer
format: int32
files:
type:
- "null"
- integer
format: int32
met:
type: integer
format: int32
notMet:
type: integer
format: int32
notReviewed:
type: integer
format: int32
openProblems:
type: integer
format: int32
practiceItemPairs:
type:
- "null"
- integer
format: int32
problems:
type: integer
format: int32
reused:
type: integer
format: int32
reviewed:
type: integer
format: int32
withheld:
type: integer
format: int32
required:
- couldNotDetermine
- doesNotApply
- files
- met
- notMet
- notReviewed
- openProblems
- practiceItemPairs
- problems
- reused
- reviewed
- withheld
ScanDefinition:
type: object
properties:
context:
type: array
items:
type: string
exclude:
type: array
items:
type: string
include:
type: array
items:
type: string
itemKind:
type: string
reads:
$ref: "#/components/schemas/PracticeReads"
required:
- context
- exclude
- include
- itemKind
- reads
ScanDetail:
type: object
properties:
baselineScanId:
type:
- string
- "null"
format: uuid
budgetUsd:
type: string
chargedCostUsd:
type:
- string
- "null"
completedAt:
type:
- string
- "null"
format: date-time
counts:
$ref: "#/components/schemas/ScanCounts"
createdAt:
type: string
format: date-time
id:
type: string
format: uuid
itemVersion:
type: string
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
practiceCount:
type: integer
format: int32
practices:
type: array
items:
$ref: "#/components/schemas/ScanPracticeRef"
progress:
$ref: "#/components/schemas/ScanProgress"
ref:
type: string
repository:
$ref: "#/components/schemas/ItemRef"
requestedBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
startedAt:
type:
- string
- "null"
format: date-time
status:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
stopReason:
type:
- string
- "null"
enum:
- TIMED_OUT
- EXECUTION_FAILED
- PREPARATION_FAILED
- PROCESSING_FAILED
- PERSON_DATA_ERASED
- STALE_ROLLOUT_REVISION
- CANCELLED_BY_ADMIN
- REPLACED
- LEGACY_FAILURE
- EXECUTION_INCOMPLETE
- RESULT_WITHHELD
- READINESS_REFUSED
- SUSPECT_LISTING
- BUDGET
- USAGE_UNVERIFIABLE
- DEADLINE
- CANCELLED
- ENUMERATION_FAILED
- ENUMERATION_LIMIT
- NO_SCAN_PRACTICES
- MODEL_CHANGED
- MODEL_UNAVAILABLE
- ERROR
- LEGACY_SCOPE_UNKNOWN
- CONTRACT_CHANGED
- null
required:
- baselineScanId
- budgetUsd
- chargedCostUsd
- completedAt
- counts
- createdAt
- id
- itemVersion
- origin
- practiceCount
- practices
- progress
- ref
- repository
- requestedBy
- startedAt
- status
- stopReason
ScanExcludedFile:
type: object
properties:
itemId:
type: string
path:
type: string
reason:
type: string
enum:
- FILE_TOO_LARGE
- BINARY_FILE
sizeBytes:
type: integer
format: int64
required:
- itemId
- path
- reason
- sizeBytes
ScanPracticeRef:
type: object
properties:
number:
type: integer
format: int32
practiceId:
type: string
pattern: "^[1-9][0-9]*$"
practiceName:
type: string
practiceSlug:
type: string
practiceVersionId:
type: string
pattern: "^[1-9][0-9]*$"
reviewDigest:
type: string
required:
- number
- practiceId
- practiceName
- practiceSlug
- practiceVersionId
- reviewDigest
ScanPracticeReport:
type: object
properties:
comparison:
type: string
enum:
- COMPARABLE
- FIRST_SCAN
- METHOD_CHANGED
- STANDARD_CHANGED
- INCOMPLETE
- MIXED
counts:
$ref: "#/components/schemas/ScanCounts"
listingComplete:
type: boolean
method:
$ref: "#/components/schemas/ReviewMethod"
number:
type: integer
format: int32
practiceId:
type: string
pattern: "^[1-9][0-9]*$"
practiceName:
type: string
practiceSlug:
type: string
practiceVersionId:
type: string
pattern: "^[1-9][0-9]*$"
reason:
type:
- string
- "null"
reviewDigest:
type: string
status:
type: string
enum:
- QUEUED
- READY
- RUNNING
- DONE
- WITHHELD
- FAILED
required:
- comparison
- counts
- listingComplete
- method
- number
- practiceId
- practiceName
- practiceSlug
- practiceVersionId
- reason
- reviewDigest
- status
ScanProgress:
type: object
properties:
activeJobs:
type: integer
format: int32
listedPairs:
type:
- "null"
- integer
format: int32
queuedJobs:
type: integer
format: int32
terminalPairs:
type: integer
format: int32
required:
- activeJobs
- listedPairs
- queuedJobs
- terminalPairs
ScanReport:
type: object
properties:
availability:
$ref: "#/components/schemas/ScanAvailability"
baselineScanId:
type:
- string
- "null"
format: uuid
comparison:
type: string
enum:
- COMPARABLE
- FIRST_SCAN
- METHOD_CHANGED
- STANDARD_CHANGED
- INCOMPLETE
- MIXED
complete:
type: boolean
counts:
$ref: "#/components/schemas/ScanCounts"
exclusions:
type:
- "null"
- array
items:
$ref: "#/components/schemas/ScanExcludedFile"
listingComplete:
type: boolean
notReviewedReasons:
type: array
items:
$ref: "#/components/schemas/ReasonCount"
practices:
type: array
items:
$ref: "#/components/schemas/ScanPracticeReport"
problemChanges:
$ref: "#/components/schemas/ProblemChanges"
recordedCounts:
anyOf:
- $ref: "#/components/schemas/ScanCounts"
- type: "null"
removalGuard:
$ref: "#/components/schemas/RemovalGuard"
scan:
$ref: "#/components/schemas/ScanSummary"
withheldReasons:
type: array
items:
$ref: "#/components/schemas/ReasonCount"
required:
- availability
- baselineScanId
- comparison
- complete
- counts
- exclusions
- listingComplete
- notReviewedReasons
- practices
- problemChanges
- recordedCounts
- removalGuard
- scan
- withheldReasons
ScanReportItem:
discriminator:
mapping:
JUDGED: "#/components/schemas/JudgedScanReportItem"
LISTED: "#/components/schemas/ListedScanReportItem"
NOT_REVIEWED: "#/components/schemas/NotReviewedScanReportItem"
REUSED: "#/components/schemas/ReusedScanReportItem"
WITHHELD: "#/components/schemas/WithheldScanReportItem"
propertyName: status
oneOf:
- $ref: "#/components/schemas/JudgedScanReportItem"
- $ref: "#/components/schemas/ReusedScanReportItem"
- $ref: "#/components/schemas/WithheldScanReportItem"
- $ref: "#/components/schemas/ListedScanReportItem"
- $ref: "#/components/schemas/NotReviewedScanReportItem"
properties:
status:
type: string
required:
- status
ScanReportItemsPage:
type: object
properties:
content:
type: array
items:
$ref: "#/components/schemas/ScanReportItem"
hasNext:
type: boolean
nextCursor:
type:
- string
- "null"
required:
- content
- hasNext
- nextCursor
ScanReportProblem:
type: object
properties:
absentReason:
type:
- string
- "null"
enum:
- REPAIRED
- null
baselineState:
type:
- string
- "null"
enum:
- NEW
- UNCHANGED
- UPDATED
- ABSENT
- null
item:
$ref: "#/components/schemas/ItemRef"
practiceName:
type: string
practiceSlug:
type: string
previousProblemId:
type:
- string
- "null"
format: uuid
problem:
$ref: "#/components/schemas/Problem"
resultId:
type: string
format: uuid
required:
- absentReason
- baselineState
- item
- practiceName
- practiceSlug
- previousProblemId
- problem
- resultId
ScanReportProblemsPage:
type: object
properties:
content:
type: array
items:
$ref: "#/components/schemas/ScanReportProblem"
hasNext:
type: boolean
nextCursor:
type:
- string
- "null"
required:
- content
- hasNext
- nextCursor
ScanSummary:
type: object
properties:
baselineScanId:
type:
- string
- "null"
format: uuid
completedAt:
type:
- string
- "null"
format: date-time
counts:
$ref: "#/components/schemas/ScanCounts"
createdAt:
type: string
format: date-time
id:
type: string
format: uuid
itemVersion:
type: string
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
practiceCount:
type: integer
format: int32
ref:
type: string
repository:
$ref: "#/components/schemas/ItemRef"
requestedBy:
anyOf:
- $ref: "#/components/schemas/AccountRef"
- type: "null"
startedAt:
type:
- string
- "null"
format: date-time
status:
type: string
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
stopReason:
type:
- string
- "null"
enum:
- TIMED_OUT
- EXECUTION_FAILED
- PREPARATION_FAILED
- PROCESSING_FAILED
- PERSON_DATA_ERASED
- STALE_ROLLOUT_REVISION
- CANCELLED_BY_ADMIN
- REPLACED
- LEGACY_FAILURE
- EXECUTION_INCOMPLETE
- RESULT_WITHHELD
- READINESS_REFUSED
- SUSPECT_LISTING
- BUDGET
- USAGE_UNVERIFIABLE
- DEADLINE
- CANCELLED
- ENUMERATION_FAILED
- ENUMERATION_LIMIT
- NO_SCAN_PRACTICES
- MODEL_CHANGED
- MODEL_UNAVAILABLE
- ERROR
- LEGACY_SCOPE_UNKNOWN
- CONTRACT_CHANGED
- null
required:
- baselineScanId
- completedAt
- counts
- createdAt
- id
- itemVersion
- origin
- practiceCount
- ref
- repository
- requestedBy
- startedAt
- status
- stopReason
SearchWarrant:
type: object
properties:
boundary:
type: string
consulted:
type: array
items:
type: string
lookedFor:
type: string
SessionView:
type: object
properties:
client:
type: string
description: what signed in
enum:
- WEB
- BROWSER_EXTENSION
current:
type: boolean
expiresAt:
type: string
format: date-time
description: "when the token expires; for an installed client, the session's\
\ own deadline"
ip:
type: string
issuedAt:
type: string
format: date-time
jti:
type: string
format: uuid
userAgent:
type: string
required:
- client
- current
- expiresAt
- jti
SetCatalogStatusRequest:
type: object
properties:
excluded:
type: boolean
required:
- excluded
SetFeedbackModeRequest:
type: object
properties:
feedbackMode:
type:
- string
- "null"
enum:
- "OFF"
- APPROVE_FIRST
- AUTOMATIC
- null
required:
- feedbackMode
SetMemberHiddenRequest:
type: object
properties:
hidden:
type: boolean
required:
- hidden
SetReviewScheduleEnabledRequest:
type: object
properties:
enabled:
type: boolean
SlackChannelCandidate:
type: object
description: A Slack channel the app can offer in the workspace channel picker
properties:
archived:
type: boolean
description: Whether Slack reports the channel as archived
channelName:
type: string
description: Current Slack channel name
consentState:
type: string
description: "Existing Hephaestus monitoring state, if already allow-listed"
enum:
- PENDING
- ACTIVE
- PAUSED
- REVOKED
member:
type: boolean
description: Whether the app bot is already a member
privateChannel:
type: boolean
description: Whether this is a private channel
slackChannelId:
type: string
description: Stable Slack channel id
required:
- channelName
- slackChannelId
SlackChannelConsentEvent:
type: object
description: An immutable Slack channel consent-transition audit entry
properties:
actorAccountId:
type:
- string
- "null"
description: Account id of the admin who made the change
pattern: "^[1-9][0-9]*$"
createdAt:
type: string
format: date-time
description: When the transition was recorded
fromState:
type:
- string
- "null"
description: State the channel left (absent for the very first record)
enum:
- PENDING
- ACTIVE
- PAUSED
- REVOKED
- null
id:
type: string
description: Audit entry id
pattern: "^[1-9][0-9]*$"
reason:
type:
- string
- "null"
description: Optional free-text reason the admin supplied
slackChannelId:
type: string
description: Slack channel id the transition applied to
toState:
type: string
description: State the channel entered
enum:
- PENDING
- ACTIVE
- PAUSED
- REVOKED
required:
- actorAccountId
- createdAt
- fromState
- id
- reason
- slackChannelId
- toState
SlackMonitoredChannel:
type: object
description: An allow-listed Slack channel with its consent state and person
opt-out count
properties:
channelName:
type:
- string
- "null"
description: "Human-readable channel name, if known"
consentAnnouncedAt:
type:
- string
- "null"
format: date-time
description: When the in-channel consent announcement was posted (stamped
on first activation)
consentState:
type: string
description: Current per-channel consent lifecycle state
enum:
- PENDING
- ACTIVE
- PAUSED
- REVOKED
createdAt:
type: string
format: date-time
description: When the channel was first discovered / allow-listed
id:
type: string
description: Internal allow-list row id
pattern: "^[1-9][0-9]*$"
optedOutMemberCount:
type: integer
format: int64
description: Number of workspace members who have opted out of ingestion
(workspace-wide)
slackChannelId:
type: string
description: Slack channel id (stable C…/G… id; the natural key)
slackTeamId:
type: string
description: Slack team (workspace) id the channel belongs to
required:
- channelName
- consentAnnouncedAt
- consentState
- createdAt
- id
- optedOutMemberCount
- slackChannelId
- slackTeamId
SlackUserPreferences:
type: object
properties:
workspaces:
type: array
items:
$ref: "#/components/schemas/SlackUserWorkspacePreferences"
required:
- workspaces
SlackUserWorkspacePreferences:
type: object
properties:
activeMonitoredChannelCount:
type: integer
format: int64
channelMessagesAllowed:
type: boolean
slackDisplayName:
type: string
slackTeamId:
type: string
slackTeamName:
type: string
slackUserId:
type: string
workspaceName:
type: string
workspaceSlug:
type: string
required:
- slackTeamId
- slackUserId
- workspaceName
- workspaceSlug
Sort:
type: object
properties:
empty:
type: boolean
sorted:
type: boolean
unsorted:
type: boolean
required:
- empty
- sorted
- unsorted
StartScanRequest:
type: object
properties:
budgetUsd:
type: string
expectedVersion:
type:
- string
- "null"
maxLength: 1024
minLength: 1
practiceSlugs:
type:
- "null"
- array
items:
type: string
maxLength: 128
minLength: 0
maxItems: 1000
minItems: 1
ref:
type:
- string
- "null"
maxLength: 1024
minLength: 1
repositoryItemId:
type: string
pattern: "[1-9][0-9]*"
reuse:
type:
- boolean
- "null"
required:
- budgetUsd
- expectedVersion
- practiceSlugs
- ref
- repositoryItemId
- reuse
StateBasis:
allOf:
- $ref: "#/components/schemas/ClaimBasis"
- type: object
properties:
explanation:
type: string
StateDimension:
type: object
properties:
label:
type: string
name:
type: string
values:
type: array
items:
$ref: "#/components/schemas/Value"
required:
- label
- name
- values
SubmitSurvey:
type: object
properties:
answers:
type: array
items:
$ref: "#/components/schemas/Answer"
maxItems: 20
minItems: 0
required:
- answers
SubmittedResult:
type: object
properties:
candidate:
$ref: "#/components/schemas/JsonNode"
itemId:
type: string
itemVersion:
type: string
practiceSlug:
type: string
readReceipts:
type: array
items:
$ref: "#/components/schemas/ReadReceipt"
Support:
type: object
properties:
problemId:
type: string
format: uuid
resultId:
type: string
format: uuid
SupportOccurrence:
type: object
properties:
evidence:
anyOf:
- $ref: "#/components/schemas/JsonNode"
- type: "null"
explanation:
type:
- string
- "null"
itemId:
type: string
itemKind:
type: string
origin:
type: string
enum:
- EVENT
- REQUEST
- SCHEDULE
- BACKFILL
outcome:
type: string
enum:
- MET
- NOT_MET
- DOES_NOT_APPLY
- COULD_NOT_DETERMINE
practiceVersionId:
type:
- string
- "null"
recordedAt:
type: string
format: date-time
resultId:
type: string
format: uuid
summary:
type: string
required:
- evidence
- explanation
- itemId
- itemKind
- origin
- outcome
- practiceVersionId
- recordedAt
- resultId
- summary
Survey:
type: object
properties:
active:
type: boolean
createdAt:
type: string
format: date-time
createdBy:
$ref: "#/components/schemas/FeedbackAccountRef"
description:
type: string
endsAt:
type: string
format: date-time
id:
type: string
format: uuid
participation:
$ref: "#/components/schemas/ParticipationCounts"
purpose:
type: string
enum:
- PRODUCT
- RESEARCH
questions:
type: array
items:
$ref: "#/components/schemas/Question"
researchOrganization:
type: string
description: the organisation a research survey was published for; absent
for a product survey
startsAt:
type: string
format: date-time
title:
type: string
workspace:
$ref: "#/components/schemas/FeedbackWorkspaceRef"
required:
- active
- createdAt
- description
- id
- participation
- purpose
- questions
- startsAt
- title
SurveyEdit:
type: object
properties:
active:
type: boolean
description:
type: string
maxLength: 500
minLength: 0
endsAt:
type: string
format: date-time
startsAt:
type: string
format: date-time
title:
type: string
maxLength: 160
minLength: 0
required:
- active
- description
- startsAt
- title
SurveyEmailInvitationRequest:
type: object
properties:
sendReminder:
type: boolean
SurveyEmailInvitationSummary:
type: object
description: "Counts refer to email requests, not in-app invitations or responses.\
\ Accepted means SMTP relay acceptance."
properties:
accepted:
type: integer
format: int32
alreadyRequested:
type: integer
format: int32
deliveryConfigured:
type: boolean
eligible:
type: integer
format: int32
queued:
type: integer
format: int32
remaining:
type: integer
format: int32
required:
- accepted
- alreadyRequested
- deliveryConfigured
- eligible
- queued
- remaining
SurveyInvitation:
type: object
properties:
description:
type: string
endsAt:
type: string
format: date-time
id:
type: string
format: uuid
purpose:
type: string
enum:
- PRODUCT
- RESEARCH
questions:
type: array
items:
$ref: "#/components/schemas/Question"
researchOrganization:
type: string
description: "set for a research survey: the organisation whose study the\
\ answers join"
seen:
type: boolean
description: the account has been shown this invitation; the webapp nudges
only while false
title:
type: string
required:
- description
- id
- purpose
- questions
- seen
- title
SurveyResponse:
type: object
properties:
account:
$ref: "#/components/schemas/FeedbackAccountRef"
answers:
type: array
items:
$ref: "#/components/schemas/Answer"
decidedAt:
type: string
format: date-time
id:
type: string
format: uuid
status:
type: string
enum:
- INVITED
- RESPONDED
- DECLINED
workspace:
$ref: "#/components/schemas/FeedbackWorkspaceRef"
required:
- decidedAt
- id
- status
SurveySummary:
type: object
properties:
participation:
$ref: "#/components/schemas/ParticipationCounts"
questions:
type: array
items:
$ref: "#/components/schemas/QuestionSummary"
required:
- participation
- questions
SyncJob:
type: object
description: One sync_job row — a single INITIAL/RECONCILIATION/BACKFILL pass
for a connection
properties:
cancelRequested:
type: boolean
description: Whether a cooperative cancel was requested
createdAt:
type: string
format: date-time
description: When the job row was created
errorSummary:
type: string
description: "Truncated error summary, set on FAILED"
finishedAt:
type: string
format: date-time
description: When the job finished (any terminal status)
id:
type: integer
format: int64
description: Job id
itemsProcessed:
type: integer
format: int32
description: "Coarse progress: items processed so far"
itemsTotal:
type: integer
format: int32
description: "Coarse progress: total items, if known"
progress:
type: object
additionalProperties: {}
description: "Per-phase progress detail, integration-specific shape"
startedAt:
type: string
format: date-time
description: When the job started running
status:
type: string
description: Job status
enum:
- PENDING
- RUNNING
- SUCCEEDED
- SUCCEEDED_WITH_WARNINGS
- FAILED
- CANCELLED
trigger:
type: string
description: What initiated this job
enum:
- SCHEDULED
- MANUAL
- LIFECYCLE
- SYSTEM
triggeredByAccountId:
type: integer
format: int64
description: "Account id of the admin who triggered this job, if MANUAL"
type:
type: string
description: What kind of pass this is
enum:
- INITIAL
- RECONCILIATION
- BACKFILL
required:
- cancelRequested
- createdAt
- id
- status
- trigger
- type
SyncResourceCount:
type: object
description: "One entity class mirrored within a resource (issues, pull requests,\
\ comments, messages, …)"
properties:
count:
type: integer
format: int64
description: Mirrored row count for this class
key:
type: string
description: Stable machine token for this class
enum:
- issues
- pullRequests
- issueComments
- reviews
- reviewComments
- commits
- messages
- documents
example: pullRequests
label:
type: string
description: Display name
example: Pull requests
lastSyncedAt:
type: string
format: date-time
description: When this class was last synced. Null means the integration
does not track a per-class watermark — not that the class has never synced.
required:
- count
- key
- label
SyncResourceState:
type: object
description: One synced resource (repository / channel / collection) — unified
read-model row
properties:
backfillCompletedThrough:
type: string
format: date-time
description: Per-resource backfill horizon
backfillPercent:
type: integer
format: int32
description: Per-resource backfill percent
counts:
type: array
description: "Per-entity-class breakdown behind itemCount. One entry per\
\ class the integration actually mirrors — 6 for an SCM repository, 1\
\ for a Slack channel or Outline collection. Never null; empty when the\
\ resource has never synced."
items:
$ref: "#/components/schemas/SyncResourceCount"
externalId:
type: string
description: Vendor-side identifier
id:
type: integer
format: int64
description: The integration's own row id
itemCount:
type: integer
format: int64
description: Headline mirrored item count — the rollup of `counts`
lastError:
type: string
description: "Last sync error, if any"
lastSyncedAt:
type: string
format: date-time
description: Last successful sync timestamp across all entity classes
name:
type: string
description: Display name
state:
type: string
description: Integration-defined status string
type:
type: string
description: Resource kind
enum:
- REPOSITORY
- CHANNEL
- COLLECTION
upstreamCount:
type: integer
format: int64
description: "Vendor-reported upstream count, if cheaply available"
required:
- counts
- externalId
- id
- name
- state
- type
TeamInfo:
type: object
description: "Detailed information about a team including members, repositories,\
\ and labels"
properties:
description:
type: string
description: Description of the team
hidden:
type: boolean
description: Whether the team is hidden from workspace activity
htmlUrl:
type: string
description: URL to the team's page on the git provider
id:
type: integer
format: int64
description: Unique identifier of the team
labels:
type: array
description: Labels configured as filters for this team
items:
$ref: "#/components/schemas/LabelInfo"
members:
type: array
description: Members of the team (excluding bots)
items:
$ref: "#/components/schemas/UserInfo"
membershipCount:
type: integer
format: int32
description: Total count of team memberships
name:
type: string
description: Name of the team
organization:
type: string
description: Organization the team belongs to
parentId:
type: integer
format: int64
description: "ID of the parent team, if this is a sub-team"
privacy:
type: string
description: Privacy level of the team (SECRET or VISIBLE)
enum:
- SECRET
- VISIBLE
repoPermissionCount:
type: integer
format: int32
description: Count of repository permissions
repositories:
type: array
description: Repositories the team has access to
items:
$ref: "#/components/schemas/RepositoryInfo"
slug:
type: string
description: Stable team key for URL filters
required:
- hidden
- id
- labels
- members
- membershipCount
- name
- repoPermissionCount
- repositories
- slug
TeamRef:
type: object
description: "A team, by name"
properties:
id:
type: integer
format: int64
description: Identifier of the team
name:
type: string
description: Name of the team
example: Platform
required:
- id
- name
TeamSummary:
type: object
description: Lightweight summary of a team without member/repository details
properties:
description:
type: string
description: Description of the team
hidden:
type: boolean
description: Whether the team is hidden from workspace activity
htmlUrl:
type: string
description: URL to the team's page on the git provider
id:
type: integer
format: int64
description: Unique identifier of the team
name:
type: string
description: Name of the team
organization:
type: string
description: Organization the team belongs to
parentId:
type: integer
format: int64
description: "ID of the parent team, if this is a sub-team"
privacy:
type: string
description: Privacy level of the team (SECRET or VISIBLE)
enum:
- SECRET
- VISIBLE
required:
- hidden
- id
- name
TrendSupport:
type: object
properties:
bundleSize:
type: integer
format: int32
calendarSpanDays:
type:
- "null"
- integer
format: int32
comparablePractices:
type:
- "null"
- integer
format: int32
credibilityThreshold:
type: number
format: double
currentOpportunities:
type: integer
format: int32
eligiblePractices:
type:
- "null"
- integer
format: int32
firstOpportunityAt:
type:
- string
- "null"
format: date-time
lastOpportunityAt:
type:
- string
- "null"
format: date-time
opportunities:
type: integer
format: int32
opportunitiesUntilComparable:
type: integer
format: int32
previousOpportunities:
type: integer
format: int32
reviewedWork:
type: integer
format: int32
reviewedWorkKind:
type:
- string
- "null"
ropeHalfWidth:
type: number
format: double
standingWork:
type: integer
format: int32
required:
- bundleSize
- calendarSpanDays
- comparablePractices
- credibilityThreshold
- currentOpportunities
- eligiblePractices
- firstOpportunityAt
- lastOpportunityAt
- opportunities
- opportunitiesUntilComparable
- previousOpportunities
- reviewedWork
- reviewedWorkKind
- ropeHalfWidth
- standingWork
TriggerSyncJobRequest:
type: object
description: Manual sync trigger request body
properties:
type:
type: string
description: "RECONCILIATION for a full re-sync, BACKFILL for historical\
\ data"
enum:
- INITIAL
- RECONCILIATION
- BACKFILL
required:
- type
UpdateAccountRequest:
type: object
properties:
appRole:
type: string
UpdateConnectionStatusRequest:
type: object
description: Request to update a connection's lifecycle status
properties:
reason:
type: string
description: Optional human-readable reason recorded on the audit trail
state:
type: string
description: "Target lifecycle state. Admin-settable: ACTIVE, SUSPENDED,\
\ UNINSTALLED."
enum:
- PENDING
- ACTIVE
- SUSPENDED
- UNINSTALLED
required:
- state
UpdateInstanceLlmSettingsRequest:
type: object
description: Update instance-wide LLM governance settings (all fields optional)
properties:
allowWorkspaceConnections:
type: boolean
description: Whether workspaces may register their own LLM connections
allowedEgressHosts:
type: string
description: Comma/newline-delimited egress host allowlist; blank clears
it
UpdateLlmBudgetRequest:
type: object
description: Set or clear a monthly LLM budget cap
properties:
monthlyBudgetUsd:
type: number
format: decimal
description: "Cap in USD; 0 pauses the affected work immediately, null removes\
\ the cap. The purse it governs is the one the path names, and only that\
\ one: /admin/workspaces/{workspaceSlug}/llm/budget caps spend on shared\
\ (instance) models, /workspaces/{workspaceSlug}/llm/budget caps the workspace's\
\ spend on its own connected provider. The two are never added together."
minimum: 0.00
UpdateLlmConnectionRequest:
type: object
description: Update an instance LLM provider connection (all fields optional)
properties:
apiKey:
type: string
description: New API key (write-only; never returned)
clearApiKey:
type: boolean
description: Set true to clear the stored API key
clearConnectionPlatform:
type: boolean
description: Set true to clear the declared connection platform
connectionPlatform:
type: string
description: Admin-declared connection platform
enum:
- LOGOS
- VLLM
- OLLAMA
- AZURE
- AWS_BEDROCK
- GOOGLE_VERTEX
- OPENAI
- GOOGLE_AI_STUDIO
- ALIBABA_CLOUD
- GROQ
- FIREWORKS
- TOGETHER_AI
- DEEPINFRA
- NEBIUS
- OPENROUTER
- CLOUDFLARE_AI_GATEWAY
- VERCEL_AI_GATEWAY
displayName:
type: string
description: Human-readable name
maxLength: 128
minLength: 0
enabled:
type: boolean
description: Whether the connection is enabled
UpdateLlmModelPriceRequest:
type: object
description: Reprice a model; supersedes the current price
properties:
note:
type: string
description: "Note; required when the model is free (e.g. self-hosted, no\
\ cost)"
maxLength: 500
minLength: 0
per1mCacheReadUsd:
type: number
format: decimal
description: "Cache-read rate per 1M tokens (USD), if applicable"
per1mCacheWriteUsd:
type: number
format: decimal
description: "Cache-write rate per 1M tokens (USD), if applicable"
per1mInputUsd:
type: number
format: decimal
description: Input rate per 1M tokens (USD); required when the model has
a price
per1mOutputUsd:
type: number
format: decimal
description: Output rate per 1M tokens (USD); required when the model has
a price
pricingMode:
type: string
description: PRICED shows the price itself; NO_CHARGE is a deliberate no-cost
declaration; UNPRICED shows "No price set"
enum:
- PRICED
- NO_CHARGE
- UNPRICED
required:
- pricingMode
UpdateLlmModelRequest:
type: object
description: Update a model's metadata (all fields optional; pricing and sharing
are separate)
properties:
brand:
type: string
description: Model brand declared by an admin; null keeps current
enum:
- OPENAI
- ANTHROPIC
- GEMINI
- GEMMA
- META
- MISTRAL
- QWEN
- DEEPSEEK
- XAI
- COHERE
- Z_AI
- MOONSHOT
clearBrand:
type: boolean
description: Clear the declared model brand
clearReasoningEffort:
type: boolean
description: "True clears the reasoning effort, so the provider's own default\
\ applies"
contextWindow:
type: integer
format: int32
description: Context window in tokens
minimum: 1
dataHandlingNote:
type: string
description: "Admin-only note: region, agreement, renewal date"
maxLength: 200
minLength: 0
displayName:
type: string
description: Human-readable name
maxLength: 128
minLength: 0
enabled:
type: boolean
description: Active toggle (off = existing settings stop working)
maxOutputTokens:
type: integer
format: int32
description: Maximum output tokens
minimum: 1
operatedBy:
type: string
description: Who operates the systems the work is sent to; omit to leave
the model undeclared
enum:
- OWN_ORGANISATION
- PROVIDER
reasoningEffort:
type: string
description: Reasoning effort to request; null keeps the current one (see
clearReasoningEffort)
enum:
- NONE
- MINIMAL
- LOW
- MEDIUM
- HIGH
- XHIGH
- MAX
UpdateLlmModelSharingRequest:
type: object
description: "Share with: all workspaces, or a selected set"
properties:
visibility:
type: string
description: Share with all workspaces (PUBLIC) or only the selected ones
(GRANTED)
enum:
- PUBLIC
- GRANTED
workspaceIds:
type: array
description: Workspace ids to share with when visibility is GRANTED; empty
or omitted stages the model without workspace access
items:
type: integer
format: int64
required:
- visibility
UpdateLoginProviderRequest:
type: object
properties:
baseUrl:
type: string
clientId:
type: string
clientSecret:
type: string
description: Omit to leave the existing secret unchanged
displayName:
type: string
enabled:
type: boolean
scopes:
type: string
UpdateNotificationPreferences:
type: object
properties:
productFeedback:
type: boolean
productSurveys:
type: boolean
researchSurveys:
type: boolean
surveySummaries:
type: boolean
workspaceAlerts:
type: boolean
required:
- productFeedback
- productSurveys
- researchSurveys
- surveySummaries
- workspaceAlerts
UpdateOutlineCollectionStateRequest:
type: object
description: Transition a mirrored Outline collection to a target mirror state
(pause / resume)
properties:
state:
type: string
description: Target mirror state
enum:
- ENABLED
- PAUSED
required:
- state
UpdatePracticeGroupRequest:
type: object
properties:
color:
type:
- string
- "null"
maxLength: 32
minLength: 0
description:
type:
- string
- "null"
maxLength: 2000
minLength: 0
icon:
type:
- string
- "null"
maxLength: 64
minLength: 0
name:
type: string
maxLength: 128
minLength: 0
shownToDevelopers:
type: boolean
required:
- color
- description
- icon
- name
- shownToDevelopers
UpdatePracticeRequest:
type: object
properties:
definition:
$ref: "#/components/schemas/PracticeDefinitionInput"
expectedVersionId:
type: string
pattern: "[1-9][0-9]*"
required:
- definition
- expectedVersionId
UpdatePracticeReviewSettingsRequest:
type: object
description: Update per-workspace practice-review policy. Null fields unchanged;
'reset' clears to inherit.
properties:
cooldownMinutes:
type: integer
format: int32
description: Minimum minutes between reviews for the same PR; 0 disables
the cooldown
maximum: 1440
minimum: 0
defaultFeedbackMode:
type: string
description: The default feedback mode. Null leaves it unchanged; DEFAULT_FEEDBACK_MODE
in reset restores inheritance.
enum:
- "OFF"
- APPROVE_FIRST
- AUTOMATIC
deliverToMerged:
type: boolean
description: Deliver feedback to already-merged PRs/MRs
deliveryStatus:
type: string
description: Pause or activate external feedback. Resume never releases
work from an older revision.
enum:
- ACTIVE
- PAUSED
generatedPaths:
type: object
additionalProperties:
type: array
items:
type: string
description: Patch generated-path patterns per monitored repository. An
empty list clears that repository. Null leaves all unchanged.
reset:
type: array
description: Fields to reset back to inherit
items:
type: string
enum:
- DELIVER_TO_MERGED
- COOLDOWN_MINUTES
- REVIEW_SCOPE
- DEFAULT_FEEDBACK_MODE
uniqueItems: true
reviewScope:
$ref: "#/components/schemas/WorkspaceReviewScope"
description: Replaces repository and person coverage wholesale. Null leaves
it unchanged.
UpdateRepositorySettingsRequest:
type: object
description: Request to update repository contribution visibility settings in
a workspace
properties:
hiddenFromContributions:
type: boolean
description: Whether activity in this repository should be left out of the
team's activity
required:
- hiddenFromContributions
UpdateReviewBatchStatusRequest:
type: object
properties:
status:
type: string
enum:
- AWAITING_CONFIRMATION
- RUNNING
- PAUSED
- COMPLETED
- CANCELLED
required:
- status
UpdateSilentModeRequest:
type: object
properties:
engaged:
type: boolean
reason:
type: string
maxLength: 500
minLength: 0
required:
- engaged
UpdateSlackChannelConsentRequest:
type: object
description: Transition a Slack channel to a target consent state
properties:
consentState:
type: string
description: Target consent state
enum:
- PENDING
- ACTIVE
- PAUSED
- REVOKED
reason:
type: string
description: Optional free-text reason recorded in the immutable audit trail
maxLength: 2000
minLength: 0
required:
- consentState
UpdateSlackUserPreferencesRequest:
type: object
properties:
channelMessagesAllowed:
type: boolean
required:
- channelMessagesAllowed
UpdateSyncJobRequest:
type: object
properties:
cancelRequested:
type: boolean
required:
- cancelRequested
UpdateTeamSettingsRequest:
type: object
description: Request to update team visibility settings in a workspace
properties:
hidden:
type: boolean
description: Whether the team should be hidden from workspace activity
required:
- hidden
UpdateWorkspaceFeaturesRequest:
type: object
description: Request to turn practice reviews and their triggers on or off.
Null fields are left unchanged.
properties:
practiceReviewAutoTriggerEnabled:
type: boolean
description: Enable automatic practice reviews triggered by PR events
practiceReviewManualTriggerEnabled:
type: boolean
description: Enable manual practice reviews triggered through a bot command
practicesEnabled:
type: boolean
description: Enable the practice review feature
UpdateWorkspaceLlmConnectionRequest:
type: object
description: Update your AI provider connection (all fields optional)
properties:
apiKey:
type: string
description: New API key (write-only; never returned)
clearApiKey:
type: boolean
description: Set true to clear the stored API key
clearConnectionPlatform:
type: boolean
description: Set true to clear the declared connection platform
connectionPlatform:
type: string
description: Admin-declared connection platform
enum:
- LOGOS
- VLLM
- OLLAMA
- AZURE
- AWS_BEDROCK
- GOOGLE_VERTEX
- OPENAI
- GOOGLE_AI_STUDIO
- ALIBABA_CLOUD
- GROQ
- FIREWORKS
- TOGETHER_AI
- DEEPINFRA
- NEBIUS
- OPENROUTER
- CLOUDFLARE_AI_GATEWAY
- VERCEL_AI_GATEWAY
displayName:
type: string
description: Human-readable name
maxLength: 128
minLength: 0
enabled:
type: boolean
description: Whether the connection is active
UpdateWorkspaceLlmModelRequest:
type: object
description: Update a model on your AI provider (all fields optional)
properties:
brand:
type: string
description: Model brand declared by an admin; null keeps current
enum:
- OPENAI
- ANTHROPIC
- GEMINI
- GEMMA
- META
- MISTRAL
- QWEN
- DEEPSEEK
- XAI
- COHERE
- Z_AI
- MOONSHOT
clearBrand:
type: boolean
description: Clear the declared model brand
clearReasoningEffort:
type: boolean
description: "True clears the reasoning effort, so the provider's own default\
\ applies"
contextWindow:
type: integer
format: int32
description: Context window in tokens
minimum: 1
dataHandlingNote:
type: string
description: "Admin-only note: region, agreement, renewal date"
maxLength: 200
minLength: 0
displayName:
type: string
description: Human-readable name
maxLength: 128
minLength: 0
enabled:
type: boolean
description: Active toggle
maxOutputTokens:
type: integer
format: int32
description: Maximum output tokens
minimum: 1
operatedBy:
type: string
description: Who operates the systems the work is sent to; omit to leave
the model undeclared
enum:
- OWN_ORGANISATION
- PROVIDER
per1mCacheReadUsd:
type: number
format: decimal
description: "Cache-read rate per 1M tokens (USD), if applicable"
per1mCacheWriteUsd:
type: number
format: decimal
description: "Cache-write rate per 1M tokens (USD), if applicable"
per1mInputUsd:
type: number
format: decimal
description: Input rate per 1M tokens (USD)
per1mOutputUsd:
type: number
format: decimal
description: Output rate per 1M tokens (USD)
priceNote:
type: string
description: "Note; required when the model is free (e.g. self-hosted, no\
\ cost)"
maxLength: 500
minLength: 0
pricingMode:
type: string
description: "Pricing mode; when given, replaces the price wholesale (see\
\ class docs)"
enum:
- PRICED
- NO_CHARGE
- UNPRICED
reasoningEffort:
type: string
description: Reasoning effort to request; null keeps the current one (see
clearReasoningEffort)
enum:
- NONE
- MINIMAL
- LOW
- MEDIUM
- HIGH
- XHIGH
- MAX
UpdateWorkspacePublicActivityRequest:
type: object
properties:
allowSearchEngines:
type: boolean
publicActivityEnabled:
type: boolean
required:
- allowSearchEngines
- publicActivityEnabled
UpdateWorkspaceStatusRequest:
type: object
description: Request to update the workspace lifecycle status
properties:
status:
type: string
description: "Target lifecycle status. PURGED is not a status transition:\
\ purge is irreversible and owner-only, so it lives at DELETE /workspaces/{workspaceSlug}."
enum:
- ACTIVE
- SUSPENDED
required:
- status
UpdateWorkspaceTokenRequest:
type: object
description: Request to update the workspace's SCM Personal Access Token
properties:
personalAccessToken:
type: string
description: SCM Personal Access Token for API access
minLength: 1
required:
- personalAccessToken
UserInfo:
type: object
description: Information about a user from the git provider
properties:
avatarUrl:
type: string
description: URL to the user's avatar image
email:
type: string
description: "Email address of the user, if public"
htmlUrl:
type: string
description: URL to the user's profile on the git provider
id:
type: integer
format: int64
description: Unique identifier of the user
login:
type: string
description: Login/username of the user
name:
type: string
description: Display name of the user
required:
- avatarUrl
- htmlUrl
- id
- login
- name
UserSettings:
type: object
description: User preferences and settings
properties:
practiceFeedbackDeliveryEnabled:
type: boolean
description: "Whether new practice-feedback comments may be delivered on\
\ issues, pull requests, and merge requests authored by the user, together\
\ with related Slack reminders"
required:
- practiceFeedbackDeliveryEnabled
UserTeams:
type: object
properties:
email:
type: string
hidden:
type: boolean
id:
type: integer
format: int64
login:
type: string
name:
type: string
teams:
type: array
items:
$ref: "#/components/schemas/TeamSummary"
uniqueItems: true
url:
type: string
required:
- id
- login
- name
- teams
- url
UserViewAccount:
type: object
properties:
account:
$ref: "#/components/schemas/AccountRef"
accountId:
type: string
pattern: "^[1-9][0-9]*$"
providerLogin:
type:
- string
- "null"
required:
- account
- accountId
- providerLogin
Value:
type: object
properties:
label:
type: string
value:
type: string
Withheld:
type: object
properties:
itemId:
type: string
practiceSlug:
type: string
reason:
type: string
WithheldScanReportItem:
allOf:
- type: object
properties:
item:
$ref: "#/components/schemas/ItemRef"
itemVersion:
type: string
practiceName:
type: string
practiceSlug:
type: string
reason:
type: string
status:
type: string
enum:
- WITHHELD
required:
- item
- itemVersion
- practiceName
- practiceSlug
- reason
- status
WorkItem:
type: object
description: A pull request or issue
properties:
author:
$ref: "#/components/schemas/UserInfo"
description: The author
checks:
type: string
description: "What the checks said about the pull request's current head,\
\ when known"
enum:
- SUCCESS
- FAILURE
- PENDING
- CANCELLED
- NONE
- NO_PIPELINE
- SKIPPED
createdAt:
type: string
format: date-time
description: When it was created
htmlUrl:
type: string
description: Link to the pull request or issue on the provider
id:
type: integer
format: int64
description: Identifier of the pull request or issue
isDraft:
type: boolean
description: Whether the pull request is a draft; false for issues
number:
type: integer
format: int32
description: Number within the repository
example: 42
repository:
$ref: "#/components/schemas/RepositoryInfo"
description: The repository
requestedTeams:
type: array
description: The member's teams the pull request asks for a review; only
team review requests list them
items:
$ref: "#/components/schemas/TeamRef"
reviewDecision:
type: string
description: "The pull request's review decision, when the provider reported\
\ one"
enum:
- APPROVED
- CHANGES_REQUESTED
- REVIEW_REQUIRED
reviewers:
type: array
description: "The pull request's reviewers besides its author, where each\
\ review stands; only open work lists them"
items:
$ref: "#/components/schemas/Reviewer"
state:
type: string
description: Current state
enum:
- OPEN
- CLOSED
- MERGED
title:
type: string
description: Title
type:
type: string
description: Whether this is a pull request or an issue
enum:
- PULL_REQUEST
- ISSUE
updatedAt:
type: string
format: date-time
description: When it was last updated
required:
- id
- isDraft
- number
- state
- title
- type
WorkItemList:
type: object
description: "Pull requests or issues, most recently updated first, up to a\
\ limit"
properties:
content:
type: array
description: "The work, most recently updated first"
items:
$ref: "#/components/schemas/WorkItem"
hasMore:
type: boolean
description: Whether more work exists than the list holds
required:
- content
- hasMore
Workspace:
type: object
description: Complete workspace information including configuration and settings
properties:
accountLogin:
type: string
description: Git provider account login associated with this workspace
createdAt:
type: string
format: date-time
description: Timestamp when the workspace was created
displayName:
type: string
description: Human-readable name of the workspace
gitlabWebhookRegistered:
type: boolean
description: Whether a GitLab webhook has been auto-registered for this
workspace
hasPersonalAccessToken:
type: boolean
description: Whether a Personal Access Token is configured
hasSlackToken:
type: boolean
description: Whether Slack token is configured
id:
type: integer
format: int64
description: Unique identifier of the workspace
installationId:
type: integer
format: int64
description: "GitHub App installation ID, if linked"
installationLinkedAt:
type: string
format: date-time
description: Timestamp when the GitHub App installation was linked
kind:
type: string
description: Integration kind backing this workspace (GITHUB or GITLAB)
practiceReviewAutoTriggerEnabled:
type: boolean
description: Whether automatic practice reviews triggered by PR events are
enabled
practiceReviewManualTriggerEnabled:
type: boolean
description: Whether manual practice reviews triggered through a bot command
are enabled
practicesEnabled:
type: boolean
description: Whether practice reviews are on
providerType:
type: string
description: High-level git provider type for the workspace's SCM connection
(null if none bound)
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
publicActivityEnabled:
type: boolean
description: Whether this workspace has enabled its public activity page
serverUrl:
type: string
description: Custom server URL for self-hosted instances (null for cloud
defaults)
slackConnectionId:
type: integer
format: int64
description: "ID of the active Slack connection, if any — addresses PATCH\
\ /connections/{id}/status"
status:
type: string
description: "Current lifecycle status of the workspace (PENDING, ACTIVE,\
\ ARCHIVED)"
updatedAt:
type: string
format: date-time
description: Timestamp when the workspace was last updated
workspaceAddress:
type: string
description: Canonical workspace address. Uses the apex path when subdomains
are off.
workspaceSlug:
type: string
description: URL-friendly identifier for the workspace
example: my-workspace
required:
- accountLogin
- createdAt
- displayName
- gitlabWebhookRegistered
- hasPersonalAccessToken
- hasSlackToken
- id
- practiceReviewAutoTriggerEnabled
- practiceReviewManualTriggerEnabled
- practicesEnabled
- publicActivityEnabled
- status
- updatedAt
- workspaceAddress
- workspaceSlug
WorkspaceAiModel:
type: object
description: A model this answer would use here.
properties:
brand:
type: string
enum:
- OPENAI
- ANTHROPIC
- GEMINI
- GEMMA
- META
- MISTRAL
- QWEN
- DEEPSEEK
- XAI
- COHERE
- Z_AI
- MOONSHOT
connectionPlatform:
type: string
enum:
- LOGOS
- VLLM
- OLLAMA
- AZURE
- AWS_BEDROCK
- GOOGLE_VERTEX
- OPENAI
- GOOGLE_AI_STUDIO
- ALIBABA_CLOUD
- GROQ
- FIREWORKS
- TOGETHER_AI
- DEEPINFRA
- NEBIUS
- OPENROUTER
- CLOUDFLARE_AI_GATEWAY
- VERCEL_AI_GATEWAY
dataHandlingTier:
type: string
enum:
- IN_HOUSE
- CLOUD
- UNDECLARED
name:
type: string
required:
- dataHandlingTier
- name
WorkspaceAiOption:
type: object
properties:
choice:
type: string
enum:
- NO_AI
- IN_HOUSE_ONLY
- CLOUD
mentorReady:
type: boolean
models:
type: array
items:
$ref: "#/components/schemas/WorkspaceAiModel"
practiceReviewsReady:
type: boolean
required:
- choice
- mentorReady
- models
- practiceReviewsReady
WorkspaceListItem:
type: object
description: Summary information about a workspace for list views
properties:
accountLogin:
type: string
description: Git provider account login associated with this workspace
createdAt:
type: string
format: date-time
description: Timestamp when the workspace was created
displayName:
type: string
description: Human-readable name of the workspace
id:
type: integer
format: int64
description: Unique identifier of the workspace
practicesEnabled:
type: boolean
description: Whether practice reviews are on
providerType:
type: string
description: "High-level git provider type (GITHUB or GITLAB), or null if\
\ no SCM connection bound"
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
publishesPublicActivity:
type: boolean
description: "Whether the public activity page is live: the instance allows\
\ it and the workspace turned it on"
status:
type: string
description: "Current lifecycle status of the workspace (PENDING, ACTIVE,\
\ ARCHIVED)"
workspaceAddress:
type: string
description: Canonical workspace address. Uses the apex path when subdomains
are off.
workspaceSlug:
type: string
description: URL-friendly identifier for the workspace
example: my-workspace
required:
- accountLogin
- createdAt
- displayName
- id
- practicesEnabled
- publishesPublicActivity
- status
- workspaceAddress
- workspaceSlug
WorkspaceLlmConnection:
type: object
description: Your AI provider connection (API key redacted)
properties:
apiKeyLast4:
type: string
description: "Last four characters of the stored API key, if any"
apiProtocol:
type: string
description: Wire protocol
enum:
- openai-completions
- openai-responses
- openai-decisions
- openai-embeddings
- cohere-rerank
example: openai-responses
authMode:
type: string
description: Credential shape
enum:
- BEARER
- API_KEY
baseUrl:
type: string
description: Provider base URL
connectionPlatform:
type: string
description: Admin-declared connection platform
enum:
- LOGOS
- VLLM
- OLLAMA
- AZURE
- AWS_BEDROCK
- GOOGLE_VERTEX
- OPENAI
- GOOGLE_AI_STUDIO
- ALIBABA_CLOUD
- GROQ
- FIREWORKS
- TOGETHER_AI
- DEEPINFRA
- NEBIUS
- OPENROUTER
- CLOUDFLARE_AI_GATEWAY
- VERCEL_AI_GATEWAY
createdAt:
type: string
format: date-time
description: Creation timestamp
displayName:
type: string
description: Human-readable name
enabled:
type: boolean
description: Whether the connection is active
hasApiKey:
type: boolean
description: Whether an API key is stored
id:
type: integer
format: int64
description: Connection ID
purposes:
type: array
description: "The purposes a model on this connection can serve, from its\
\ protocol"
items:
type: string
enum:
- PRACTICE_REVIEW
- MENTOR
- PRACTICE_DECISION
- PRACTICE_EMBEDDING
- PRACTICE_RERANKING
slug:
type: string
description: Unique slug within the workspace
example: openai-prod
updatedAt:
type: string
format: date-time
description: Last update timestamp
required:
- apiProtocol
- authMode
- baseUrl
- createdAt
- displayName
- enabled
- hasApiKey
- id
- purposes
- slug
WorkspaceLlmModel:
type: object
description: A model on your AI provider
properties:
brand:
type: string
description: Model brand declared by an admin; display only
enum:
- OPENAI
- ANTHROPIC
- GEMINI
- GEMMA
- META
- MISTRAL
- QWEN
- DEEPSEEK
- XAI
- COHERE
- Z_AI
- MOONSHOT
connectionDisplayName:
type: string
description: Owning connection's display name
connectionId:
type: integer
format: int64
description: Owning connection id
contextWindow:
type: integer
format: int32
description: Context window in tokens
createdAt:
type: string
format: date-time
description: Creation timestamp
currency:
type: string
description: Currency code
dataHandlingNote:
type: string
description: "Admin-only note: region, agreement, renewal date"
dataHandlingTier:
type: string
description: Data-handling tier derived from the operator; UNDECLARED until
it is set
enum:
- IN_HOUSE
- CLOUD
- UNDECLARED
displayName:
type: string
description: Human-readable name
enabled:
type: boolean
description: Active toggle
id:
type: integer
format: int64
description: Model id
maxOutputTokens:
type: integer
format: int32
description: Maximum output tokens
operatedBy:
type: string
description: Who operates the systems the work is sent to; null until declared
enum:
- OWN_ORGANISATION
- PROVIDER
per1mCacheReadUsd:
type: number
format: decimal
description: Cache-read rate per 1M tokens (USD)
per1mCacheWriteUsd:
type: number
format: decimal
description: Cache-write rate per 1M tokens (USD)
per1mInputUsd:
type: number
format: decimal
description: Input rate per 1M tokens (USD)
per1mOutputUsd:
type: number
format: decimal
description: Output rate per 1M tokens (USD)
priceNote:
type: string
description: Price note
pricingMode:
type: string
description: Pricing mode
enum:
- PRICED
- NO_CHARGE
- UNPRICED
reasoningEffort:
type: string
description: "Reasoning effort requested of the model; null sends none,\
\ the provider's default applies"
enum:
- NONE
- MINIMAL
- LOW
- MEDIUM
- HIGH
- XHIGH
- MAX
slug:
type: string
description: Unique slug within the workspace
updatedAt:
type: string
format: date-time
description: Last update timestamp
upstreamModelId:
type: string
description: Upstream provider model id
required:
- connectionDisplayName
- connectionId
- createdAt
- currency
- dataHandlingTier
- displayName
- enabled
- id
- pricingMode
- slug
- upstreamModelId
WorkspaceLlmProbeResult:
type: object
description: Result of testing your AI provider connection
properties:
message:
type: string
description: Human-readable diagnostic when not reachable
modelCount:
type: integer
format: int32
description: How many models the provider listed (0 if unreachable)
reachable:
type: boolean
description: Whether the provider answered
statusCode:
type: integer
format: int32
description: "HTTP status returned by the provider, if any"
required:
- modelCount
- reachable
WorkspaceLlmSettings:
type: object
description: The instance LLM policy as it applies to this workspace (read-only)
properties:
ownProviderAllowed:
type: boolean
description: Whether this workspace may register its own LLM provider connections
required:
- ownProviderAllowed
WorkspaceLlmUsageReport:
type: object
description: "One calendar month of a workspace's LLM spend, rolled up from\
\ the usage ledger"
properties:
byDay:
type: array
items:
$ref: "#/components/schemas/LlmUsageByDay"
byJobType:
type: array
items:
$ref: "#/components/schemas/LlmUsageByJobType"
byPractice:
type: array
description: "The decision, embedding and reranking calls of practice scripts,\
\ one entry per practice, most spend first. Their spend is already part\
\ of byJobType. Chat calls of practice scripts are in each review's own\
\ cost and not here."
items:
$ref: "#/components/schemas/LlmUsageByPractice"
fx:
$ref: "#/components/schemas/FxRateInfo"
description: Display-only conversion when the instance has a display currency.
Absent = show USD only.
instanceBudgetVerdict:
type: string
description: "Whether host-funded (shared-model) spend is within its cap,\
\ has reached it, or cannot be confirmed because shared-model rates are\
\ missing or usage measurements are unverified."
enum:
- WITHIN
- EXHAUSTED
- UNVERIFIABLE
instanceMonthlyBudgetUsd:
type: number
format: decimal
description: Monthly cap in USD on spend the host pays for (shared models);
null = uncapped. Set by instance admins only — a workspace admin can see
it but not change it.
instancePaused:
type: boolean
description: "Whether work on SHARED models is currently paused for this\
\ workspace. Authoritative — it mirrors the live gate rather than being\
\ derivable from the verdict alone. Always false for a past month, which\
\ cannot pause anything."
instanceTotalCostUsd:
type: number
format: decimal
description: "This month's confirmed spend on shared (instance) models,\
\ in USD — the figure instanceMonthlyBudgetUsd compares against. A floor,\
\ not the full total, while unpricedEventCount is non-zero."
month:
type: string
description: "Calendar month (UTC), ISO yyyy-MM"
example: 2026-07
ownProviderBudgetVerdict:
type: string
description: "The same verdict for spend on this workspace's own provider,\
\ against its own cap."
enum:
- WITHIN
- EXHAUSTED
- UNVERIFIABLE
ownProviderInUse:
type: boolean
description: "Whether this month has an own-provider purse to show. True\
\ when the month has at least one own-provider call, priced or not, so\
\ a month of confirmed $0.00 calls counts. For the current month, also\
\ true when the workspace has an enabled own-provider model on an enabled\
\ connection, so its admins can set a provider cap before the first call.\
\ The spend and cap fields cannot answer this."
ownProviderMonthlyBudgetUsd:
type: number
format: decimal
description: Monthly cap in USD on spend this workspace pays for through
its own connected provider; null = uncapped. Set by this workspace's own
admins.
ownProviderPaused:
type: boolean
description: Whether work on this workspace's OWN provider is currently
paused.
ownProviderTotalCostUsd:
type: number
format: decimal
description: "This month's confirmed spend on this workspace's own connected\
\ provider(s), in USD — the figure ownProviderMonthlyBudgetUsd compares\
\ against. Different money from instanceTotalCostUsd: the two are never\
\ added together."
practiceScriptTotal:
$ref: "#/components/schemas/LlmUsagePracticeScriptTotal"
description: "The byPractice entries in total, read from the ledger."
unpricedEventCount:
type: integer
format: int64
description: "Runs this month (job attempts and mentor turns, either purse)\
\ with at least one ledger row whose cost is unavailable because a rate\
\ is missing or the measurement is unverified, each counted once. A practice\
\ script row counts toward the run of its review. Those rows are excluded\
\ from both totals above, so a non-zero value means the real spend may\
\ be higher than shown."
required:
- byDay
- byJobType
- byPractice
- instanceBudgetVerdict
- instancePaused
- instanceTotalCostUsd
- month
- ownProviderBudgetVerdict
- ownProviderInUse
- ownProviderPaused
- ownProviderTotalCostUsd
- practiceScriptTotal
- unpricedEventCount
WorkspaceMembership:
type: object
properties:
account:
$ref: "#/components/schemas/AccountRef"
eligibleForPracticeReview:
type: boolean
hidden:
type: boolean
joinedAt:
type: string
format: date-time
leftAt:
type:
- string
- "null"
format: date-time
reviewSelected:
type: boolean
role:
type: string
enum:
- OWNER
- ADMIN
- MEMBER
required:
- account
- eligibleForPracticeReview
- hidden
- joinedAt
- leftAt
- reviewSelected
- role
WorkspaceOnboarding:
type: object
description: |-
One member's view of setup in one workspace. aiChoice is the account's answer, the same
in every workspace; aiOptions says what this workspace has set up under each answer,
which is what differs between workspaces.
properties:
aiChoice:
type: string
enum:
- NO_AI
- IN_HOUSE_ONLY
- CLOUD
aiChoiceRequired:
type: boolean
aiOptions:
type: array
items:
$ref: "#/components/schemas/WorkspaceAiOption"
enabled:
type: boolean
links:
type: array
items:
$ref: "#/components/schemas/WorkspaceOnboardingLink"
needsSetup:
type: boolean
workspaceName:
type: string
required:
- aiChoiceRequired
- aiOptions
- enabled
- links
- needsSetup
- workspaceName
WorkspaceOnboardingLink:
type: object
properties:
available:
type: boolean
connectionId:
type: integer
format: int64
displayName:
type: string
linked:
type: boolean
providerType:
type: string
registrationId:
type: string
required:
type: boolean
teamName:
type: string
required:
- available
- connectionId
- displayName
- linked
- providerType
- required
WorkspaceOnboardingSettings:
type: object
description: |-
aiChoiceRequired is read on GET and ignored on PUT: the server latches it the first time
the setup page is enabled and never clears it.
properties:
aiChoiceRequired:
type: boolean
enabled:
type: boolean
requiredConnectionIds:
type: array
items:
type: integer
format: int64
exclusiveMinimum: 0
maxItems: 20
minItems: 0
revision:
type: integer
format: int64
required:
- aiChoiceRequired
- enabled
- requiredConnectionIds
- revision
WorkspaceProviders:
type: object
description: Available workspace creation providers and their configuration
properties:
creationPolicy:
type: string
description: Who may create workspaces — ADMIN_ONLY restricts creation to
instance admins
enum:
- ADMIN_ONLY
- SELF_SERVICE
github:
$ref: "#/components/schemas/GitHubProvider"
description: "GitHub workspace provider config, null if not available"
gitlab:
$ref: "#/components/schemas/GitLabProvider"
description: "GitLab workspace provider config, null if not available"
WorkspaceReviewScope:
type: object
properties:
accountIds:
type: array
items:
type: string
pattern: "[1-9][0-9]*"
people:
type: string
enum:
- ALL
- SELECTED
repositories:
type: string
enum:
- ALL
- SELECTED
selectedRepositories:
type: array
items:
$ref: "#/components/schemas/ReviewScopeRepository"
required:
- accountIds
- people
- repositories
- selectedRepositories
WorkspaceTeamRepositorySettings:
type: object
description: Repository contribution visibility settings for a specific team
within a workspace
properties:
hiddenFromContributions:
type: boolean
description: Whether activity in this repository is left out of the team's
activity
repositoryId:
type: integer
format: int64
description: The repository ID these settings apply to
teamId:
type: integer
format: int64
description: The team ID these settings apply to
workspaceId:
type: integer
format: int64
description: The workspace ID these settings belong to
required:
- hiddenFromContributions
- repositoryId
- teamId
- workspaceId
WorkspaceTeamSettings:
type: object
description: Team visibility settings for a specific workspace
properties:
hidden:
type: boolean
description: Whether the team is hidden from workspace activity
teamId:
type: integer
format: int64
description: The team ID these settings apply to
workspaceId:
type: integer
format: int64
description: The workspace ID these settings belong to
required:
- hidden
- teamId
- workspaceId
WorsenedBasis:
allOf:
- $ref: "#/components/schemas/ClaimBasis"
- type: object
properties:
base:
type: integer
format: int32
explanation:
type: string
head:
type: integer
format: int32
securitySchemes:
bearerAuth:
bearerFormat: JWT
description: Hephaestus-native JWT bearer authentication. The SPA normally authenticates
through the `__Host-HEPHAESTUS_AT` session cookie. This scheme documents the
equivalent bearer token.
scheme: bearer
type: http
workerBearer:
bearerFormat: JWT
description: "Worker credential on the private sandbox gateway connector. Bound\
\ to the worker, workspace, job and attempt, with the required proxy scope.\
\ Browser cookies and app-admin authority do not authorize it."
scheme: bearer
type: http