/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: The developer's conversation with Heph
name: Mentor
- 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
- PASSKEY_CHANGED
- PASSKEY_VERIFIED
- 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
- RESEARCH_DATASET_RELEASED
- RESEARCH_REMOVAL_RECORDED
- 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
- PASSKEY_CHANGED
- PASSKEY_VERIFIED
- 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
- RESEARCH_DATASET_RELEASED
- RESEARCH_REMOVAL_RECORDED
- 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/research-disclosures:
post:
description: Records a disclosure and returns its JSON file once. The file is
pseudonymous personal data. It is not stored for redownload. The configured
research question and fixed dataset purpose apply; the request cannot override
them.
operationId: releaseResearchDataset
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ReleaseResearchDataset"
required: true
responses:
"200":
content:
application/json:
schema:
type: string
format: binary
description: Research dataset JSON attachment
summary: Release and download one consented research dataset
tags:
- Research
/admin/research-disclosures/removal-checks:
post:
description: "Records newly detected obligations and returns every open disclosure,\
\ including those with no removals owed. Closed disclosures are excluded."
operationId: checkResearchRemovals
responses:
"200":
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ResearchRemovalDisclosure"
description: OK
summary: Check and record research removal obligations
tags:
- Research
/admin/research-disclosures/{datasetId}/closure:
post:
description: "Closes the disclosure and deletes its protected subject mapping.\
\ This is an operator attestation, not a check of the research team's storage."
operationId: closeResearchDisclosure
parameters:
- in: path
name: datasetId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CloseResearchDisclosure"
required: true
responses:
"200":
description: OK
summary: Attest destruction or anonymization of every retained research copy
tags:
- Research
/admin/research-disclosures/{datasetId}/removal-receipts:
post:
description: Records the operator's statement. Hephaestus cannot inspect or
revoke downloaded copies.
operationId: recordResearchRemovals
parameters:
- in: path
name: datasetId
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/RecordResearchRemovals"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/ResearchRemovalReceipt"
description: OK
summary: Attest removal of participant keys from retained research copies
tags:
- Research
/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/passkeys:
get:
operationId: getPasskeyStatus
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PasskeyStatus"
description: OK
summary: Get passkey settings
tags:
- Passkeys
post:
operationId: registerPasskey
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/RegisterPasskeyRequest"
required: true
responses:
"200":
description: OK
summary: Register a passkey
tags:
- Passkeys
/user/passkeys/protection:
patch:
operationId: updatePasskeyProtection
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/PasskeyProtectionRequest"
required: true
responses:
"200":
description: OK
summary: Update personal admin protection
tags:
- Passkeys
/user/passkeys/recovery:
post:
operationId: recoverPasskeys
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/RecoverPasskeyRequest"
required: true
responses:
"200":
description: OK
summary: Start restricted passkey recovery
tags:
- Passkeys
/user/passkeys/recovery-codes:
post:
operationId: createPasskeyRecoveryCodes
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PasskeyRecoveryCodes"
description: OK
summary: Replace passkey recovery codes
tags:
- Passkeys
/user/passkeys/registration-options:
post:
operationId: getPasskeyRegistrationOptions
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PasskeyOptions"
description: OK
summary: Start passkey enrollment
tags:
- Passkeys
/user/passkeys/verification:
post:
operationId: verifyPasskey
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/VerifyPasskeyRequest"
required: true
responses:
"200":
description: OK
summary: Verify a passkey for this browser session
tags:
- Passkeys
/user/passkeys/verification-options:
post:
operationId: getPasskeyVerificationOptions
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/PasskeyOptions"
description: OK
summary: Start passkey verification
tags:
- Passkeys
/user/passkeys/{credentialId}:
delete:
operationId: removePasskey
parameters:
- in: path
name: credentialId
required: true
schema:
type: string
responses:
"200":
description: OK
summary: Remove a passkey
tags:
- Passkeys
/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/gitlab/projects:
post:
operationId: listGitLabProjects
parameters:
- in: query
name: page
required: false
schema:
type: integer
format: int32
default: 1
exclusiveMinimum: 0
- in: query
name: search
required: false
schema:
type: string
maxLength: 255
minLength: 0
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/GitLabPreflightRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/GitLabProjectPage"
description: One page of projects; nextPage is absent on the last page
summary: List one page of the projects in a GitLab group and its subgroups that
a PAT can read
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/conversation:
get:
operationId: getMentorConversation
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/MentorConversation"
description: OK
summary: "The developer's conversation: what runs now, its threads and how far\
\ it reached"
tags:
- Mentor
/workspaces/{workspaceSlug}/mentor/conversation/read:
put:
description: "Records how far the developer read, for every device. The marker\
\ keeps the latest time: an earlier one changes nothing."
operationId: markMentorConversationRead
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/MentorReadRequest"
required: true
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/MentorRead"
description: "The marker after the request: this time or a later one"
summary: Mark the conversation read
tags:
- Mentor
/workspaces/{workspaceSlug}/mentor/entries:
get:
operationId: listMentorEntries
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: before
required: false
schema:
type: integer
format: int64
- in: query
name: limit
required: false
schema:
type: integer
format: int32
default: 50
responses:
"200":
content:
application/json:
schema:
$ref: "#/components/schemas/MentorEntryPage"
description: OK
summary: "A page of top-level messages, oldest first; pass before=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
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
CloseResearchDisclosure:
type: object
properties:
closure:
type: string
enum:
- DESTROYED
- ANONYMIZED
required:
- closure
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
Coverage:
type: object
properties:
hasMore:
type: boolean
description: older matching feedback exists beyond maxEntries
maxEntries:
type: integer
format: int32
omittedWithoutCopyAuthority:
type: integer
format: int32
description: matching feedback left out because its support may not be copied
here
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
repositorySelection:
type: string
description: "GitLab only. ALL monitors every project of the group, including\
\ ones created later; SELECTED monitors only selectedProjectIds. Omitted\
\ means ALL."
enum:
- ALL
- SELECTED
selectedProjectIds:
type: array
description: "GitLab project IDs to monitor. Required, and only allowed,\
\ when repositorySelection is SELECTED. The server checks each with the\
\ token."
items:
type: integer
format: int64
exclusiveMinimum: 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
Delivered:
type: object
properties:
basedOn:
type: array
items:
$ref: "#/components/schemas/PrivateFeedbackHistoryBasis"
body:
type:
- string
- "null"
bodyRole:
type:
- string
- "null"
enum:
- PRACTICE_PAGE_CARD
- CONVERSATION_WORDS
- MENTOR_NOTES
- null
deliveredAt:
type: string
format: date-time
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
id:
type: string
format: uuid
recordedClaimCurrentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
withdrawn:
type: boolean
required:
- basedOn
- body
- bodyRole
- deliveredAt
- destination
- id
- recordedClaimCurrentness
- withdrawn
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"
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"
mentorEntryId:
type:
- string
- "null"
format: uuid
description: The Heph answer that showed a conversation copy
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
- endLine
- externalRef
- externalUrl
- id
- kind
- lastError
- mentorEntryId
- 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
GitLabProject:
type: object
description: GitLab project of a group that the provided PAT can read
properties:
fullPath:
type: string
description: Full project path including its groups
example: my-org/my-team/my-project
id:
type: integer
format: int64
description: GitLab project numeric ID
name:
type: string
description: Project display name
webUrl:
type: string
description: Project web URL
required:
- fullPath
- id
- name
GitLabProjectPage:
type: object
description: One page of the projects of a GitLab group that the provided PAT
can read
properties:
nextPage:
type: integer
format: int32
description: The page that follows this one; absent on the last page
projects:
type: array
description: "Projects on this page, ordered by path"
items:
$ref: "#/components/schemas/GitLabProject"
required:
- projects
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
GitLabRepositorySelection:
type: object
description: Whether a GitLab workspace follows every project of its group or
only the projects it monitors
properties:
repositorySelection:
type: string
description: "ALL admits projects that discovery later finds in the group,\
\ except stopped ones. SELECTED admits only the projects the workspace\
\ monitors."
enum:
- ALL
- SELECTED
required:
- repositorySelection
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
- OCCASION_EVIDENCE_UNAVAILABLE
- 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
MentorConversation:
type: object
description: The developer's Heph conversation in a workspace at one moment
properties:
activeTurns:
type: array
description: "Queued and running turns in the conversation and its threads,\
\ oldest first"
items:
$ref: "#/components/schemas/MentorTurn"
id:
type: string
format: uuid
description: The main conversation; absent until the developer writes to
Heph or gets a weekly digest
lastAnswerAt:
type: string
format: date-time
description: When Heph's newest shown answer in the conversation or any
of its threads was written; absent before the first. Compare it with the
newest answer the client has seen.
lastReadAt:
type: string
format: date-time
description: How far the developer read the conversation on any device;
absent before the first read. Heph has an unread answer when lastAnswerAt
is later.
latestSeq:
type: integer
format: int64
description: Sequence number of the newest top-level message shown; 0 when
there is none
threads:
type: array
description: "The newest threads, latest activity first"
items:
$ref: "#/components/schemas/MentorThreadSummary"
required:
- activeTurns
- latestSeq
- threads
MentorEntry:
type: object
description: One message of a Heph conversation
properties:
conversationId:
type: string
format: uuid
createdAt:
type: string
format: date-time
deleted:
type: boolean
description: The message was deleted; its text is gone
digest:
$ref: "#/components/schemas/WeeklyDigest"
description: The weekly digest as it reads now; only on a weekly digest
that was not erased
editedAt:
type: string
format: date-time
description: Set when the developer edited the message in Slack
id:
type: string
format: uuid
kind:
type: string
enum:
- USER
- HEPH
- DIGEST
links:
type: array
description: "The results, problems and prepared feedback Heph showed in\
\ this message, in order"
items:
$ref: "#/components/schemas/MentorLink"
parentEntryId:
type: string
format: uuid
description: "Set when the message is in a thread: the top-level message\
\ the thread replies to"
requestId:
type: string
description: The submission that wrote the message; the app matches its
own optimistic message by it
seq:
type: integer
format: int64
description: Order within its conversation
slackDelivery:
type: string
description: "Only on a question asked in Slack: whether Heph's reply reached\
\ Slack. FAILED means Slack does not show the whole reply: it is not there,\
\ or a stream showed only part of it before Slack or Silent Mode refused\
\ the rest; the full reply is in the app. UNCERTAIN means Slack cannot\
\ tell."
enum:
- PENDING
- DELIVERED
- UNCERTAIN
- FAILED
surface:
type: string
description: Where the message was written; SYSTEM for a weekly digest
enum:
- APP
- SLACK
- SYSTEM
text:
type: string
description: "The developer's words or Heph's answer; for a weekly digest,\
\ the note that points Heph to it; empty when the message was deleted"
thread:
$ref: "#/components/schemas/MentorThreadSummary"
description: The thread on this message; only on top-level messages that
have one
turnError:
type: string
description: "Why the turn this question asked failed, in words for the\
\ developer; only when it FAILED"
turnId:
type: string
format: uuid
description: The turn the message asked or answered
turnStatus:
type: string
description: The status of the turn this question asked; only on the developer's
messages
enum:
- QUEUED
- RUNNING
- DONE
- FAILED
- STOPPED
vote:
type: string
description: The developer's vote; only on Heph's messages
enum:
- HELPFUL
- NOT_HELPFUL
required:
- conversationId
- createdAt
- deleted
- id
- kind
- links
- seq
- surface
- text
MentorEntryPage:
type: object
description: "One page of a conversation's messages, oldest first"
properties:
earlierBefore:
type: integer
format: int64
description: Pass as before to read the older messages; absent when there
are none
entries:
type: array
items:
$ref: "#/components/schemas/MentorEntry"
required:
- entries
MentorLink:
type: object
description: "A practice result, problem or prepared feedback Heph showed in\
\ a message"
properties:
id:
type: string
format: uuid
description: "The result, problem or feedback id, by kind"
itemId:
type: integer
format: int64
description: "The item (pull request, issue, conversation or document) it\
\ is about, when the developer may still read it: a problem's through\
\ its result"
kind:
type: string
enum:
- RESULT
- PROBLEM
- FEEDBACK
practiceSlug:
type: string
description: "The practice it is about: a problem's through its result,\
\ feedback's when it is about one practice; absent when the developer\
\ can no longer read it"
text:
type: string
description: "Heph's words about it, shown to the developer"
required:
- id
- kind
- text
MentorRead:
type: object
description: How far the developer read their Heph conversation
properties:
lastReadAt:
type: string
format: date-time
description: The read marker; absent when the developer has no conversation
yet
MentorReadRequest:
type: object
description: How far the developer read their Heph conversation
properties:
at:
type: string
format: date-time
description: The time of the newest answer the developer saw
required:
- at
MentorSubmission:
type: object
description: A stored question and the turn that answers it
properties:
question:
$ref: "#/components/schemas/MentorEntry"
turn:
$ref: "#/components/schemas/MentorTurn"
required:
- question
- turn
MentorThread:
type: object
description: "A thread: the message it replies to and one page of its replies,\
\ oldest first"
properties:
conversationId:
type: string
format: uuid
description: The thread's conversation; absent until the first reply opens
it
earlierBefore:
type: integer
format: int64
description: Pass as before to read the older replies; absent when there
are none
entries:
type: array
items:
$ref: "#/components/schemas/MentorEntry"
parent:
$ref: "#/components/schemas/MentorEntry"
required:
- entries
- parent
MentorThreadSummary:
type: object
description: The thread on a top-level message
properties:
conversationId:
type: string
format: uuid
description: The thread's own conversation
lastReplyAt:
type: string
format: date-time
latestSeq:
type: integer
format: int64
description: Sequence number of the thread's newest shown message; 0 when
it has none
parentEntryId:
type: string
format: uuid
description: The message the thread replies to
replyCount:
type: integer
format: int64
description: Messages in the thread; can count a Heph message without text
whose feedback is no longer shown
required:
- conversationId
- latestSeq
- parentEntryId
- replyCount
MentorTurn:
type: object
description: One question to Heph and the work to answer it
properties:
attempt:
type: integer
format: int32
description: "Attempts started so far; 0 while the turn waits for its first\
\ start. A lost lease queues the turn again with the same attempt, and\
\ the next start counts up. Thus, with the same attempt, RUNNING comes\
\ before QUEUED or an end."
conversationId:
type: string
format: uuid
createdAt:
type: string
format: date-time
error:
type: string
description: "Why the turn failed, worded for the developer; only on a failed\
\ turn"
finishedAt:
type: string
format: date-time
id:
type: string
format: uuid
parentEntryId:
type: string
format: uuid
description: "Set when the turn runs in a thread: the top-level message\
\ the thread replies to"
partial:
$ref: "#/components/schemas/MentorTurnPartial"
description: Heph's answer in progress; only while the turn runs
requestId:
type: string
description: The submission that asked; the question's entry carries the
same value
status:
type: string
enum:
- QUEUED
- RUNNING
- DONE
- FAILED
- STOPPED
surface:
type: string
enum:
- APP
- SLACK
required:
- attempt
- conversationId
- createdAt
- id
- requestId
- status
- surface
MentorTurnPartial:
type: object
description: What Heph is doing in a running turn
properties:
activity:
type: string
enum:
- THINKING
- WRITING
- TOOL
stage:
type: string
description: "What Heph is doing, in the developer's words, for example\
\ \"Reading your practice feedback…\""
text:
type: string
description: The text Heph has written in this turn so far
tool:
type: string
description: "The tool Heph runs, while the activity is TOOL"
required:
- activity
- stage
- text
MentorTurnRequest:
type: object
description: A question to Heph from the app
properties:
pageContext:
type: string
description: "The page the developer asks from, for example \"Pull request\
\ #421 in acme/web\""
maxLength: 500
minLength: 0
parentEntryId:
type: string
format: uuid
description: Ask in the thread on this top-level message; the first reply
opens the thread
requestId:
type: string
format: uuid
description: "Chosen by the app for each message. Sending the same id again\
\ returns the first submission, so a retried request never asks twice."
text:
type: string
description: The developer's words
minLength: 1
required:
- requestId
- text
MentorTurnStatusRequest:
type: object
description: A status change the developer asks for on a turn
properties:
status:
type: string
description: STOPPED stops a queued or running turn. Heph keeps what it
already wrote.
enum:
- STOPPED
required:
- status
MentorVoteRequest:
type: object
description: The developer's vote on one of Heph's messages
properties:
vote:
type: string
enum:
- HELPFUL
- NOT_HELPFUL
required:
- vote
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
weeklyDigest:
type: boolean
description: The weekly digest is on
weeklyDigestAvailable:
type: boolean
description: "Heph can answer in at least one of your workspaces, so a weekly\
\ digest can be written"
workspaceAlerts:
type: boolean
required:
- deliveryConfigured
- emailAvailable
- etag
- productFeedback
- productSurveys
- researchSurveys
- surveySummaries
- weeklyDigest
- weeklyDigestAvailable
- 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
PasskeyCredential:
type: object
properties:
createdAt:
type: string
format: date-time
id:
type: string
label:
type: string
lastUsedAt:
type: string
format: date-time
required:
- id
- label
PasskeyOptions:
type: object
properties:
challengeId:
type: string
format: uuid
optionsJson:
type: string
required:
- challengeId
- optionsJson
PasskeyProtectionRequest:
type: object
properties:
enabled:
type: boolean
required:
- enabled
PasskeyRecoveryCodes:
type: object
properties:
codes:
type: array
items:
type: string
required:
- codes
PasskeyStatus:
type: object
properties:
credentials:
type: array
items:
$ref: "#/components/schemas/PasskeyCredential"
instanceAdminRequired:
type: boolean
protectionEnabled:
type: boolean
recoveryRequired:
type: boolean
verified:
type: boolean
workspaceAdminRequired:
type: boolean
required:
- credentials
- instanceAdminRequired
- protectionEnabled
- recoveryRequired
- verified
- workspaceAdminRequired
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:
basis:
type:
- string
- "null"
description: The weakest basis among the practice verdicts the group standing
averages. Absent without a verdict
enum:
- CURRENT_REVIEWS
- EARLIER_REVIEWS
- EARLIER_REVIEWS_CRITERIA_UNKNOWN
- null
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:
- basis
- 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  credential
properties:
apiKey:
type: string
description: API key used only for this probe
apiProtocol:
type: string
description: Wire protocol
enum:
- openai-completions
- openai-responses
- openai-decisions
- openai-embeddings
- cohere-rerank
authMode:
type: string
description: Credential shape (default BEARER)
enum:
- BEARER
- API_KEY
baseUrl:
type: string
description: Provider base URL
minLength: 1
required:
- apiProtocol
- baseUrl
Problem:
type: object
properties:
basis:
anyOf:
- oneOf:
- $ref: "#/components/schemas/DutyBasis"
- $ref: "#/components/schemas/IntroducedBasis"
- $ref: "#/components/schemas/StateBasis"
- $ref: "#/components/schemas/WorsenedBasis"
- type: "null"
citations:
type: array
items:
$ref: "#/components/schemas/EvidenceCitation"
explanation:
type:
- string
- "null"
id:
type: string
format: uuid
key:
type:
- string
- "null"
nextStep:
type:
- string
- "null"
position:
type: integer
format: int32
resultId:
type: string
format: uuid
severity:
type: string
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
summary:
type: string
required:
- basis
- citations
- explanation
- id
- key
- nextStep
- position
- resultId
- severity
- summary
ProblemChanges:
type: object
properties:
absent:
type: integer
format: int32
new:
type: integer
format: int32
unchanged:
type: integer
format: int32
updated:
type: integer
format: int32
required:
- absent
- unchanged
- updated
ProblemDetail:
type: object
properties:
detail:
type: string
instance:
type: string
format: uri
properties:
type: object
additionalProperties: {}
status:
type: integer
format: int32
title:
type: string
type:
type: string
format: uri
ProblemSummary:
type: object
properties:
id:
type: string
format: uuid
severity:
type: string
enum:
- CRITICAL
- MAJOR
- MINOR
- TRIVIAL
summary:
type: string
required:
- id
- severity
- summary
ProfileChange:
type: object
properties:
at:
type: string
format: date-time
cleanNeeded:
type:
- "null"
- integer
format: int32
direction:
type:
- string
- "null"
enum:
- UP
- DOWN
- null
evidence:
type: array
items:
$ref: "#/components/schemas/ItemRef"
feedbackId:
type:
- string
- "null"
format: uuid
from:
type:
- string
- "null"
groupName:
type:
- string
- "null"
groupSlug:
type:
- string
- "null"
practiceName:
type:
- string
- "null"
practiceSlug:
type:
- string
- "null"
resolvedBy:
type:
- string
- "null"
enum:
- WORK
- DEVELOPER
- null
to:
type:
- string
- "null"
type:
type: string
enum:
- FEEDBACK_NEW
- FEEDBACK_RESOLVED
- FEEDBACK_RESET
- STANDING_MOVED
- TREND_TURNED
- GROUP_MOVED
- FIRST_RECORDED
required:
- at
- cleanNeeded
- direction
- evidence
- feedbackId
- from
- groupName
- groupSlug
- practiceName
- practiceSlug
- resolvedBy
- to
- type
ProfileReview:
type: object
properties:
feedback:
type: array
items:
$ref: "#/components/schemas/OwnFeedbackRef"
results:
type: array
items:
$ref: "#/components/schemas/ResultList"
review:
$ref: "#/components/schemas/ReviewRef"
required:
- feedback
- results
- review
ProfileReviewDetail:
type: object
properties:
feedback:
type: array
items:
$ref: "#/components/schemas/OwnFeedbackRef"
practiceOutcomes:
$ref: "#/components/schemas/OutcomeVector"
results:
type: array
items:
$ref: "#/components/schemas/ResultList"
review:
$ref: "#/components/schemas/ReviewRef"
trace:
$ref: "#/components/schemas/OwnItemTrace"
required:
- feedback
- practiceOutcomes
- results
- review
- trace
ProfileReviewRef:
type: object
properties:
at:
type: string
format: date-time
item:
$ref: "#/components/schemas/ItemRef"
reviewId:
type: string
format: uuid
status:
type:
- string
- "null"
enum:
- QUEUED
- RUNNING
- COMPLETE
- PARTIAL
- FAILED
- CANCELLED
- null
required:
- at
- item
- reviewId
- status
ProjectedCitation:
type: object
properties:
anchorable:
type: boolean
commit:
type:
- string
- "null"
endLine:
type:
- "null"
- integer
format: int32
index:
type: 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/CitationProof"
- type: "null"
required:
- anchorable
- commit
- endLine
- index
- path
- quote
- side
- sourceKind
- sourcePath
- startLine
- verification
ProviderIdentityRef:
type: object
properties:
avatarUrl:
type:
- string
- "null"
displayName:
type:
- string
- "null"
login:
type:
- string
- "null"
provider:
type: string
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
required:
- avatarUrl
- displayName
- login
- provider
PublicActivity:
type: object
description: "The public contract excludes account details, teams, automation\
\ and private activity."
properties:
allowSearchEngines:
type: boolean
coverage:
$ref: "#/components/schemas/ActivityCoverage"
from:
type: string
format: date-time
highlights:
$ref: "#/components/schemas/PublicActivityHighlights"
people:
type: array
items:
$ref: "#/components/schemas/PublicActivityPerson"
providerType:
type: string
description: The source-control provider the repositories and people belong
to
enum:
- GITHUB
- GITLAB
- SLACK
- OUTLINE
repositories:
type: array
items:
$ref: "#/components/schemas/PublicActivityRepository"
to:
type: string
format: date-time
workspaceName:
type: string
required:
- allowSearchEngines
- coverage
- from
- highlights
- people
- repositories
- to
- workspaceName
PublicActivityChoice:
type: object
properties:
visible:
type: boolean
required:
- visible
PublicActivityCounts:
type: object
properties:
activeWeeks:
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
- contributions
- issuesOpened
- peopleHelped
- pullRequestsMerged
- pullRequestsOpened
- pullRequestsReviewed
PublicActivityHiddenCount:
type: object
properties:
hiddenPeople:
type: integer
format: int64
required:
- hiddenPeople
PublicActivityHighlights:
type: object
properties:
firstContributors:
type: array
items:
type: string
mostPeopleHelped:
type: array
items:
type: string
required:
- firstContributors
- mostPeopleHelped
PublicActivityOnboarding:
type: object
properties:
seen:
type: boolean
visible:
type: boolean
required:
- seen
- visible
PublicActivityOnboardingRequest:
type: object
properties:
visible:
type: boolean
required:
- visible
PublicActivityPerson:
type: object
properties:
avatarUrl:
type: string
counts:
$ref: "#/components/schemas/PublicActivityCounts"
firstContributionAt:
type: string
format: date-time
login:
type: string
name:
type: string
profileUrl:
type: string
weeks:
type: array
items:
$ref: "#/components/schemas/ActivitySparklineWeek"
required:
- avatarUrl
- counts
- login
- name
- profileUrl
- weeks
PublicActivityPersonDetail:
type: object
description: "One published person's public contributions. Excludes account\
\ details, teams, automation and private activity."
properties:
breakdown:
$ref: "#/components/schemas/PublicActivityReviewBreakdown"
counts:
$ref: "#/components/schemas/PublicActivityCounts"
firstContributionAt:
type: string
format: date-time
from:
type: string
format: date-time
person:
$ref: "#/components/schemas/PublicActivityPersonIdentity"
repositories:
type: array
items:
$ref: "#/components/schemas/PublicActivityPersonRepository"
supportedKinds:
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
to:
type: string
format: date-time
weeks:
type: array
items:
$ref: "#/components/schemas/PublicActivityPersonWeek"
required:
- breakdown
- counts
- from
- person
- repositories
- supportedKinds
- to
- weeks
PublicActivityPersonIdentity:
type: object
properties:
avatarUrl:
type: string
htmlUrl:
type: string
login:
type: string
name:
type: string
required:
- avatarUrl
- htmlUrl
- login
- name
PublicActivityPersonRepository:
type: object
properties:
counts:
$ref: "#/components/schemas/PublicActivityCounts"
repository:
$ref: "#/components/schemas/PublicActivityRepository"
rowKey:
type: string
required:
- counts
- repository
- rowKey
PublicActivityPersonWeek:
type: object
properties:
breakdown:
$ref: "#/components/schemas/PublicActivityReviewBreakdown"
counts:
$ref: "#/components/schemas/PublicActivityCounts"
start:
type: string
format: date-time
required:
- breakdown
- counts
- start
PublicActivityPolicy:
type: object
properties:
allowed:
type: boolean
required:
- allowed
PublicActivityRepository:
type: object
properties:
key:
type: string
name:
type: string
required:
- key
- name
PublicActivityReviewBreakdown:
type: object
properties:
approvals:
type: integer
format: int64
changeRequests:
type: integer
format: int64
commentReviews:
type: integer
format: int64
required:
- approvals
- changeRequests
- commentReviews
PublicActivityWork:
type: object
properties:
actions:
type: array
items:
$ref: "#/components/schemas/ActivityAction"
id:
type: string
lastOccurredAt:
type: string
format: date-time
work:
$ref: "#/components/schemas/PublicActivityWorkSummary"
required:
- actions
- id
- lastOccurredAt
- work
PublicActivityWorkPage:
type: object
description: "One page of the selected person's published work; no account,\
\ author or other participant data."
properties:
content:
type: array
items:
$ref: "#/components/schemas/PublicActivityWork"
nextCursor:
type: string
required:
- content
PublicActivityWorkSummary:
type: object
properties:
htmlUrl:
type: string
isDraft:
type: boolean
number:
type: integer
format: int32
repository:
$ref: "#/components/schemas/PublicActivityRepository"
state:
type: string
enum:
- OPEN
- CLOSED
- MERGED
title:
type: string
type:
type: string
enum:
- PULL_REQUEST
- ISSUE
required:
- htmlUrl
- isDraft
- number
- repository
- state
- title
- type
PublicActivityWorkspaceSettings:
type: object
properties:
allowSearchEngines:
type: boolean
enabled:
type: boolean
required:
- allowSearchEngines
- enabled
PublicFeedbackHistory:
type: object
description: |-
One authorized history read. publicationContext names this exact response: preparation of a public piece
composed from it must send it back unchanged.
properties:
contractVersion:
type: integer
format: int32
history:
$ref: "#/components/schemas/History"
publicationContext:
type:
- string
- "null"
readAt:
type: string
format: date-time
required:
- contractVersion
- history
- publicationContext
- readAt
Question:
type: object
properties:
allowOther:
type: boolean
description: a choice question also takes one free-text answer; false when
a stored question omits it
highLabel:
type: string
maxLength: 60
minLength: 0
id:
type: string
maxLength: 80
minLength: 0
pattern: "[A-Za-z0-9_-]+"
lowLabel:
type: string
maxLength: 60
minLength: 0
options:
type: array
items:
type: string
maxLength: 200
minLength: 0
maxItems: 20
minItems: 0
prompt:
type: string
maxLength: 300
minLength: 0
required:
type: boolean
type:
type: string
enum:
- TEXT
- SINGLE_CHOICE
- MULTIPLE_CHOICE
- RATING
- NPS
required:
- allowOther
- id
- options
- prompt
- required
- type
QuestionSummary:
type: object
properties:
answered:
type: integer
format: int64
average:
type: number
format: double
counts:
type: array
items:
$ref: "#/components/schemas/OptionCount"
other:
type: integer
format: int64
description: responses whose choices include a free-text answer; present
for choice questions only
questionId:
type: string
score:
type: integer
format: int32
description: "Net Promoter Score, −100…100, for an NPS question"
required:
- answered
- counts
- questionId
Queued:
type: object
description: Conversation feedback not yet delivered that a new piece on practiceSlug
may replace.
properties:
basedOn:
type: array
items:
$ref: "#/components/schemas/PrivateFeedbackHistoryBasis"
body:
type:
- string
- "null"
bodyRole:
type:
- string
- "null"
enum:
- PRACTICE_PAGE_CARD
- CONVERSATION_WORDS
- MENTOR_NOTES
- null
destination:
type: string
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
feedbackId:
type: string
format: uuid
practiceSlug:
type: string
preparedAt:
type: string
format: date-time
recordedClaimCurrentness:
type: string
enum:
- CURRENT
- STALE
- UNVERIFIABLE
threadKey:
type: string
required:
- basedOn
- body
- bodyRole
- destination
- feedbackId
- practiceSlug
- preparedAt
- recordedClaimCurrentness
- threadKey
QuietDecision:
type: object
properties:
basedOn:
type: array
items:
$ref: "#/components/schemas/Support"
reason:
type: string
witnessIds:
type: array
items:
type: string
RateLimitSnapshot:
type: object
description: "Vendor API rate-limit observation, read from in-memory trackers\
\ (not persisted across restarts). 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
RecordResearchRemovals:
type: object
properties:
participantKeys:
type: array
items:
type: string
minLength: 1
minItems: 1
required:
- participantKeys
RecoverPasskeyRequest:
type: object
properties:
code:
type: string
maxLength: 256
minLength: 0
required:
- code
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
RegisterPasskeyRequest:
type: object
properties:
challengeId:
type: string
format: uuid
credentialJson:
type: string
maxLength: 65536
minLength: 0
label:
type: string
maxLength: 100
minLength: 0
required:
- challengeId
- credentialJson
- label
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
ReleaseResearchDataset:
type: object
properties:
firstDay:
type: string
format: date
lastDay:
type: string
format: date
useUntil:
type: string
format: date-time
workspaceId:
type: string
minLength: 1
pattern: "[1-9][0-9]{0,18}"
required:
- firstDay
- lastDay
- useUntil
- workspaceId
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
ResearchRemovalDisclosure:
type: object
properties:
createdAt:
type: string
format: date-time
datasetId:
type: string
removals:
type: array
items:
$ref: "#/components/schemas/ResearchRemovalObligation"
useExpired:
type: boolean
useUntil:
type: string
format: date-time
workspaceId:
type: string
required:
- createdAt
- datasetId
- removals
- useExpired
- useUntil
- workspaceId
ResearchRemovalObligation:
type: object
properties:
participantKey:
type: string
reason:
type: string
enum:
- CONSENT_WITHDRAWN
- CONSENT_SUPERSEDED
- QUESTION_CHANGED
- ACCOUNT_ERASED
requiredAt:
type: string
format: date-time
required:
- participantKey
- reason
- requiredAt
ResearchRemovalReceipt:
type: object
properties:
recorded:
type: integer
format: int32
required:
- recorded
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
- OCCASION_EVIDENCE_UNAVAILABLE
- 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
weeklyDigest:
type: boolean
description: "The weekly digest in your Heph conversation, with one note\
\ in Slack or email that it is ready"
workspaceAlerts:
type: boolean
required:
- productFeedback
- productSurveys
- researchSurveys
- surveySummaries
- weeklyDigest
- 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
UpdateWorkspacePasskeyPolicy:
type: object
properties:
required:
type: boolean
required:
- required
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"
timeZone:
type:
- string
- "null"
description: "The account's IANA time zone, such as Europe/Berlin. The weekly\
\ digest follows the developer's week in it. Absent means UTC."
maxLength: 64
minLength: 0
required:
- practiceFeedbackDeliveryEnabled
- timeZone
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
VerifyPasskeyRequest:
type: object
properties:
challengeId:
type: string
format: uuid
credentialJson:
type: string
maxLength: 65536
minLength: 0
required:
- challengeId
- credentialJson
WeeklyDigest:
type: object
description: "A weekly digest as it reads now, from the live facts"
properties:
changes:
type: array
description: "What changed on the Practice profile in the week; never a\
\ change of Practice page feedback, which the waiting count covers"
items:
$ref: "#/components/schemas/ProfileChange"
feedback:
type: array
description: "Feedback delivered to the developer on the work or in conversation\
\ in the week, by practice group and practice order"
items:
$ref: "#/components/schemas/WeeklyDigestFeedback"
timeZone:
type: string
description: The IANA time zone the week was read in
waiting:
type: integer
format: int32
description: Pieces of Practice page feedback prepared in the week that
still wait unread now
weekStart:
type: string
format: date
description: "The Monday the week starts on, in the developer's time zone"
windowEnd:
type: string
format: date-time
description: The next Monday 00:00 in the developer's time zone
windowStart:
type: string
format: date-time
description: Monday 00:00 of the week in the developer's time zone
required:
- changes
- feedback
- timeZone
- waiting
- weekStart
- windowEnd
- windowStart
WeeklyDigestFeedback:
type: object
description: "One piece of feedback that reached the developer in the week,\
\ and where it was delivered"
properties:
deliveredAt:
type: string
format: date-time
destination:
type: string
description: "Where it was delivered: on the work (ON_WORK) or in the conversation\
\ with Heph (CONVERSATION). Practice page feedback is never listed; the\
\ waiting count covers it"
enum:
- ON_WORK
- PRACTICE_PAGE
- CONVERSATION
feedbackId:
type: string
format: uuid
groupName:
type: string
groupSlug:
type: string
item:
$ref: "#/components/schemas/ItemRef"
description: "The item it was delivered on; only for ON_WORK, and never\
\ when withdrawn"
mentorEntryId:
type: string
format: uuid
description: "The Heph message it appeared in; only for CONVERSATION, and\
\ never when withdrawn"
mentorParentEntryId:
type: string
format: uuid
description: "The top-level message whose thread holds that Heph message;\
\ only for CONVERSATION, and absent when the message is not in a thread"
practiceName:
type: string
practiceSlug:
type: string
replaced:
type: boolean
description: Newer feedback replaced it since; the link opens the current
feedback
withdrawn:
type: boolean
description: A workspace admin withdrew it; only the practice is shown
required:
- deliveredAt
- destination
- feedbackId
- practiceName
- practiceSlug
- replaced
- withdrawn
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
WorkspaceGroupSplit:
type: object
description: "One practice group: how the developers with a standing split across\
\ it, and where the reader is"
properties:
groupColor:
type:
- string
- "null"
description: Group colour name
groupIcon:
type:
- string
- "null"
description: Group icon name
groupName:
type: string
description: Group name
groupSlug:
type: string
description: Group slug
practices:
type: array
description: "The group's practices review is admitted for, the same for\
\ every reader, each split on its own, in catalog order"
items:
$ref: "#/components/schemas/WorkspacePracticeSplit"
split:
$ref: "#/components/schemas/WorkspaceSplit"
description: How the developers with a standing split across the group
yourBasis:
type:
- string
- "null"
description: "What the reader's group verdict was read from, as their practice\
\ profile says. Absent without one"
enum:
- CURRENT_REVIEWS
- EARLIER_REVIEWS
- EARLIER_REVIEWS_CRITERIA_UNKNOWN
- null
yourStanding:
type:
- string
- "null"
description: "The reader's current standing in the group, the one their\
\ practice profile shows: the part they are marked in. Absent unless the\
\ split counts the reader"
enum:
- DEVELOPING
- STRENGTH
- MIXED
- NOT_OBSERVED
- NO_OPPORTUNITY
- null
required:
- groupColor
- groupIcon
- groupName
- groupSlug
- practices
- split
- yourBasis
- yourStanding
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. mentorRefusal is this member's own answer from Heph's admission.
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"
mentorRefusal:
type: string
description: "Why Heph declines this member here, by the rule that admits\
\ each question; null when Heph can answer"
enum:
- PERSON_ERASED
- NO_AI
- CHOICE_REQUIRED
- UNAVAILABLE
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
WorkspacePasskeyPolicy:
type: object
properties:
instanceRequired:
type: boolean
required:
type: boolean
required:
- instanceRequired
- required
WorkspacePracticeSplit:
type: object
description: "One practice of a group: how the developers with a standing split,\
\ and where the reader is"
properties:
practiceName:
type: string
description: Practice name
practiceSlug:
type: string
description: Practice slug
split:
$ref: "#/components/schemas/WorkspaceSplit"
description: How the developers with a standing split across the practice
yourBasis:
type:
- string
- "null"
description: "What the reader's verdict was read from, as their practice\
\ profile says. Absent without one"
enum:
- CURRENT_REVIEWS
- EARLIER_REVIEWS
- EARLIER_REVIEWS_CRITERIA_UNKNOWN
- null
yourStanding:
type:
- string
- "null"
description: "The reader's current standing in the practice, the one their\
\ practice profile shows: the part they are marked in. Absent unless the\
\ split counts the reader"
enum:
- DEVELOPING
- STRENGTH
- MIXED
- NOT_OBSERVED
- NO_OPPORTUNITY
- null
required:
- practiceName
- practiceSlug
- split
- yourBasis
- yourStanding
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"
WorkspaceRange:
type: object
description: "The middle half of the developers counted: the 25th to the 75th\
\ percentile"
properties:
high:
type: integer
format: int32
description: The 75th percentile
low:
type: integer
format: int32
description: The 25th percentile
required:
- high
- low
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
WorkspaceSplit:
type: object
description: "How the developers with a standing split across one practice group\
\ or one practice, counted in developers: a part per verdict, none yet, and\
\ their total"
properties:
developers:
type: integer
format: int32
description: "Every developer the split counts, the parts and none yet together,\
\ the reader included when counted"
noneYet:
type: integer
format: int32
description: Developers with a standing in a group shown but none here
parts:
type: array
description: "Developers at each verdict, Needs attention, Mixed feedback\
\ and Going well in that order"
items:
$ref: "#/components/schemas/WorkspaceSplitPart"
required:
- developers
- noneYet
- parts
WorkspaceSplitPart:
type: object
description: The developers at one verdict in a split
properties:
developers:
type: integer
format: int32
description: "Developers at the verdict, the reader included when counted"
standing:
type: string
description: The verdict the part counts
enum:
- DEVELOPING
- MIXED
- STRENGTH
required:
- developers
- standing
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
WorkspaceTile:
type: object
description: "One figure: the reader's own value, then the middle half of the\
\ developers counted"
properties:
middle:
anyOf:
- $ref: "#/components/schemas/WorkspaceRange"
description: The workspace's middle half; absent while no developer is
counted
- type: "null"
description: The workspace's middle half; absent while no developer is counted
yours:
type: integer
format: int32
description: The reader's own value
required:
- middle
- yours
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