API reference
39 operations in plugins. Raw spec: openapi.json.
/api/v1/plugins/catalogGET /api/plugins/catalog — the marketplace registry.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/catalogPOST /api/plugins/catalog — publish a catalog entry with its first version. Operator action on a self-hosted core (the catalog is global); audited, and the manifest is validated against the closed capability vocabulary and the pinned interface version BEFORE any row exists.
Request body
PublishCatalogEntryRequest
Responses
| Status | Description |
|---|---|
201 | |
409 |
Security: bearer
/api/v1/plugins/catalog/{slug}GET /api/plugins/catalog/{slug}.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
slug | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 |
Security: bearer
/api/v1/plugins/catalog/{slug}/revokePOST /api/plugins/catalog/{slug}/revoke — the registry kill switch. Denies new installs and marks every existing install revoked (deny-by-default: a revoked plugin never runs); one `plugin.install_revoked` event per affected install.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
slug | path | string | Yes |
Request body
RevokeCatalogEntryRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/catalog/{slug}/versionsPOST /api/plugins/catalog/{slug}/versions — append a version to a live entry (revoked entries accept no new versions).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
slug | path | string | Yes |
Request body
AppendVersionRequest
Responses
| Status | Description |
|---|---|
201 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/distribution/agent-skillsGET /api/plugins/distribution/agent-skills — the ACTIVE version of every org skill, with its provenance.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/distribution/agent-skills/{id}/enabledPOST /api/plugins/distribution/agent-skills/{id}/enabled — the skills half's enable gate (deny-by-default: enable is an explicit owner/admin action on the active version row; version rows other than the active one are never enabled).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
RefuseStagedRequest
Responses
| Status | Description |
|---|---|
204 | |
404 |
Security: bearer
/api/v1/plugins/distribution/publishersGET /api/plugins/distribution/publishers — the org's publisher registry (vouched history included; `verified` = the active badge).
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/distribution/publishersPOST /api/plugins/distribution/publishers — admin vouches a publisher identity on the org's behalf (re-vouch flips a revoked row back; a double-verify conflicts).
Request body
VerifyPublisherRequest
Responses
| Status | Description |
|---|---|
200 | |
409 |
Security: bearer
/api/v1/plugins/distribution/publishers/{id}DELETE /api/plugins/distribution/publishers/{id} — withdraws the vouch; the badge disappears and the row persists as history.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 |
Security: bearer
/api/v1/plugins/distribution/ratingsGET /api/plugins/distribution/ratings — the org's ratings, optionally narrowed to one artifact release.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
source_url | query | string | No | |
artifact_digest | query | string | No |
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/distribution/ratingsPUT /api/plugins/distribution/ratings — upserts the caller's rating on one artifact release (one per user per release; re-rate wins).
Request body
PutRatingRequest
Responses
| Status | Description |
|---|---|
200 | |
400 | |
409 |
Security: bearer
/api/v1/plugins/distribution/stagedGET /api/plugins/distribution/staged — pending + terminal rows. Owners/admins see everything; plain members see only their OWN uploads (the deny-by-default staged visibility).
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/distribution/staged/githubPOST /api/plugins/distribution/staged/github — the pinned GitHub pull: the manifest is fetched AT THE PINNED COMMIT (never HEAD), the digest is computed over the fetched bytes, the pin is recorded on the staged row; a no-pin call is refused.
Request body
StageFromGithubRequest
Responses
| Status | Description |
|---|---|
201 | |
404 | |
422 |
Security: bearer
/api/v1/plugins/distribution/staged/registryPOST /api/plugins/distribution/staged/registry — a public marketplace registry entry (static JSON, git-tag pinned, code-signature/digest shape: the BUILD-PROMPT v1 fixture). The SERVER fetches and the adapter validates BEFORE anything registers.
Request body
StageFromRegistryRequest
Responses
| Status | Description |
|---|---|
201 | |
404 | |
422 |
Security: bearer
/api/v1/plugins/distribution/staged/skillPOST /api/plugins/distribution/staged/skill — skills from free/open community marketplaces/repo APIs (`skill_community`: the server refetches the manifest and digest-verifies it before the row exists) and manual member uploads (`manual_upload`: inline manifest). Skill content is UNTRUSTED RAG-class data — staged, never executed.
Request body
StageSkillRequest
Responses
| Status | Description |
|---|---|
201 | |
404 | |
422 |
Security: bearer
/api/v1/plugins/distribution/staged/zipPOST /api/plugins/distribution/staged/zip — the local zip import. ALL the sandbox validation (manifest schema, artifact digest, size/entry caps, exactly one root manifest.json, traversal safety) runs BEFORE the row exists; the declared capability list rides into the SAME consent screen.
Request body
array<integer>
Responses
| Status | Description |
|---|---|
201 | |
400 | |
413 | |
422 |
Security: bearer
/api/v1/plugins/distribution/staged/{id}/approvePOST /api/plugins/distribution/staged/{id}/approve — the owner/admin review. Approve MINTS but remains deny-by-default: a plugin adopt is created DISABLED (a public-registry source lands the SAME staged pipeline — browsing is help, not bypass); a skill lands disabled until enabled. Grants must subset the staged manifest's declared set.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
ApproveStagedRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/distribution/staged/{id}/consentGET /api/plugins/distribution/staged/{id}/consent — the SAME consent shape for every source: declared capabilities + the manifest's settings JSON-Schema (the typed-registry render source).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 |
Security: bearer
/api/v1/plugins/distribution/staged/{id}/refusePOST /api/plugins/distribution/staged/{id}/refuse — the reviewer declines: terminal for the staged row (the uploader may re-stage a fresh upload). A typed note is required.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
RefuseStagedRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/distribution/theme-packsGET /api/plugins/distribution/theme-packs — the org's installed theme packs (ADR 0009 V1 distribution; restyle-only manifests).
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/distribution/theme-packs/{slug}DELETE /api/plugins/distribution/theme-packs/{slug} — uninstall. Refused while the pack is the org's active theme (repoint the typed `appearance.theme` setting first).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
slug | path | string | Yes | installed pack slug |
Responses
| Status | Description |
|---|---|
204 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/installedGET /api/plugins/installed — this org's adoptions.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/installedPOST /api/plugins/installed — adopt a catalog entry at a pinned version. Created DISABLED (deny-by-default); enabling is a separate explicit admin action.
Request body
InstallPluginRequest
Responses
| Status | Description |
|---|---|
201 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/installed/{id}PATCH /api/plugins/installed/{id} — enable/disable, upgrade the pinned version, or adjust the grant set. Widening grants re-validates against the NEW pinned manifest. Revoked installs are terminal.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
UpdateInstallRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/installed/{id}DELETE /api/plugins/installed/{id} — uninstall (the adoption row goes away; re-install is a fresh adoption).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
204 | |
404 |
Security: bearer
/api/v1/plugins/installed/{id}/consentPOST /api/plugins/installed/{id}/consent — commit the CONSENTED update: the swap IS the consent action (deny-by-default — until the owner/admin consents, the OLD version is what runs). Consent appends the provenance chain and rides the existing update event.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/installed/{id}/discard-updatePOST /api/plugins/installed/{id}/discard-update — abandon the pending re-consent (the OLD version keeps running; the pending columns clear).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
204 | |
404 |
Security: bearer
/api/v1/plugins/installed/{id}/provenanceGET /api/plugins/installed/{id}/provenance — the append-only `{source_kind, source_url, fetched_ref, artifact_digest, uploader}` for one install. The chain SURVIVES terminal uninstalls (no cascade).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 |
Security: bearer
/api/v1/plugins/installed/{id}/revokePOST /api/plugins/installed/{id}/revoke — the org's own kill switch for ONE install.
Distinct from disabling (reversible, grants untouched) and from the catalog-wide revocation (which cascades to every tenant's installs). Revoke is terminal, the reason is required, and execution stops at the parent's gate: `authorize_invocation` refuses a revoked status, and the artifact load path refuses before it reads a byte.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
RevokeInstallRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/installed/{id}/rollbackPOST /api/plugins/installed/{id}/rollback — move the pin back to the previous digest.
A rollback is a POINTER MOVE: version, digest and grants return to what they were before the last update, and no bytes are fetched. The old module is still in the store because keys are content-addressed, so an update wrote a new key rather than overwriting the old one. One step, not a toggle: the parked target is cleared, so a second rollback answers `409` until the update is re-consented. That is deliberate — the operator should say which bytes they want, not ping-pong between two.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/installed/{id}/settingsGET /api/plugins/installed/{id}/settings — the render source: the pinned manifest's declared JSON-Schema + the validated config.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 |
Security: bearer
/api/v1/plugins/installed/{id}/settingsPATCH /api/plugins/installed/{id}/settings — the config is validated against the pinned manifest's schema AT THE WRITE BOUNDARY (the typed-registry doctrine: no hand-authored per-plugin pages, and a plugin with no declared schema gets consent/enable/disable only — this endpoint refuses its config writes). Every write is audited.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
PutInstallSettingsRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 | |
422 |
Security: bearer
/api/v1/plugins/installed/{id}/updateGET /api/plugins/installed/{id}/update — the pending-state read (the consent screen shows exactly what consent would do).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 |
Security: bearer
/api/v1/plugins/installed/{id}/updatePOST /api/plugins/installed/{id}/update — propose the update: the candidate version lands in the pending columns while the OLD version keeps running; the response IS the re-consent diff the consent screen renders.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
ProposeUpdateRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | |
409 |
Security: bearer
/api/v1/plugins/surface/automation-actionsGET /api/plugins/surface/automation-actions — the org's registered plugin automation action kinds (the automations editor lists them alongside the built-ins).
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/surface/field-validatorsGET /api/plugins/surface/field-validators — the org's registered plugin schema validators for board custom fields.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/surface/report-rendersGET /api/plugins/surface/report-renders — the org's registered plugin render kinds for the report builder.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
/api/v1/plugins/surface/widgetsGET /api/plugins/surface/widgets — the org's registered plugin widgets (dashboard + ticket-pane slots), enabled installs only.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer