Artifacts overview
An artifact is a versioned HTML document stored against a workspace. Artifacts are the storage and hosting layer behind Plane's AI-generated dashboards. Each artifact has a name, an optional project scope, a data mode, and an append-only chain of HTML versions.
Proof-of-concept endpoints
These endpoints exist so Plane Intelligence can host the dashboards it generates. They are not a general integration surface. Before you build on them, know that:
- The scope is narrow: create, read, append a version, and publish. There is no list endpoint, no delete, no way to read an older version, and no way to unpublish.
- The shape may still change. Unlike the rest of v2, these endpoints have not been through a public API review, so treat them as unstable.
These endpoints do not return the dashboards a workspace already has.
Requirements
Every artifact endpoint enforces both of these:
| Requirement | Failure |
|---|---|
| The Applets feature enabled on your plan | 402 payment_required |
| Workspace admin or owner | 403 forbidden |
This permission requirement is stricter than most of Plane. Every member can view dashboards, but only workspace admins and owners can read or write artifacts.
The artifact object
Attributes
idstring (uuid)Unique identifier for the artifact.
namestringDisplay name. Maximum 255 characters. Defaults to
Untitled dashboardwhen created without one.descriptionstringFree-form description. Maximum 2000 characters. Returned on the detail read only.
htmlstringThe rendered HTML of the current version. Returned on the detail read only.
current_versionintegerWhich version is current. Starts at
1and increments by one each time you append a version.data_modestringHow the artifact's data is sourced:
snapshot(data frozen at generation time) orlive(re-read on view). Defaults tosnapshot.is_publishedbooleanWhether the artifact has a public anchor. Returned on create.
anchorstringThe public anchor once published, otherwise
null. Returned on create and publish.
Versions are append-only
Updating an artifact does not overwrite its HTML. It creates version current_version + 1 and makes that version current. The server keeps earlier versions, but v2 has no endpoint to read them.
{
"id": "b7e42a19-3c5d-4f80-9a26-8d1c0f4e7b53",
"name": "Q1 velocity by squad",
"description": "Throughput and cycle time, split by squad.",
"current_version": 3,
"data_mode": "snapshot",
"html": "<section><h1>Q1 velocity by squad</h1>…</section>"
}Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v2/workspaces/{slug}/artifacts/{artifact_id}/ | Get an artifact |
POST | /api/v2/workspaces/{slug}/artifacts/ | Create an artifact |
PATCH | /api/v2/workspaces/{slug}/artifacts/{artifact_id}/update/ | Append a new version |
POST | /api/v2/workspaces/{slug}/artifacts/{artifact_id}/publish/ | Publish an artifact |
Two of these routes end in a verb segment. Appending a version is PATCH …/{artifact_id}/update/, not PATCH …/{artifact_id}/, and publishing is a POST to …/{artifact_id}/publish/.
The generate-and-host flow
These endpoints are built for this sequence:
- Create the artifact with its first HTML version:
POST …/artifacts/. - Publish it to get a shareable anchor:
POST …/artifacts/{id}/publish/. - Append a new version whenever the content is regenerated:
PATCH …/artifacts/{id}/update/. The anchor always points at the current version, so you only need to publish once.
Response shaping
These are APIView endpoints. Like current user and workspace features, they do not accept ?fields= or ?expand=, and each returns its own fixed shape.
Errors otherwise follow the shared problem+json contract, with one exception noted on the write pages: the html-missing and data_mode-invalid validation failures return a bare {"detail": "…"} body rather than the standard {type, code, detail} envelope.

