Get an artifact
Read an artifact's metadata together with the HTML of its current version.
Requires the Applets feature and the workspace admin or owner role. See Artifacts overview. Unlike dashboards in the app, artifacts are not readable by ordinary members.
Path parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.
artifact_id:requiredstring (uuid)The artifact to read, as a UUID. This route has no human-readable key.
Only the current version is readable
The response contains the HTML of current_version. The server keeps earlier versions, but v2 has no way to read them and no ?version= parameter. If you need version history, keep your own copy as you append.
Scopes
workspaces.artifacts:read
Errors
| Status | Code | Cause |
|---|---|---|
401 | unauthorized | Missing or invalid credentials. |
402 | payment_required | The Applets feature isn't enabled on your plan. |
403 | forbidden | You are not a workspace admin or owner, or your token lacks the scope. |
404 | not_found | No such artifact in this workspace, or the workspace is outside your tenant. |
406 | not_acceptable | The Accept header asks for a representation the API can't produce. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
An artifact id that belongs to a different workspace returns 404, not 403. This matches the rest of v2, which never reveals that a resource you cannot see exists.
curl -X GET \
"https://api.plane.so/api/v2/workspaces/my-team/artifacts/b7e42a19-3c5d-4f80-9a26-8d1c0f4e7b53/" \
-H "X-Api-Key: $PLANE_API_KEY"import requests
response = requests.get(
"https://api.plane.so/api/v2/workspaces/my-team/artifacts/b7e42a19-3c5d-4f80-9a26-8d1c0f4e7b53/",
headers={"X-Api-Key": "your-api-key"},
)
print(response.json())const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/artifacts/b7e42a19-3c5d-4f80-9a26-8d1c0f4e7b53/",
{
method: "GET",
headers: { "X-Api-Key": "your-api-key" },
},
);
const data = await response.json();{
"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>"
}{
"type": "not_found",
"code": "not_found",
"detail": "Artifact not found."
}What this response does not include
The detail read has a different shape from the create response. It adds description and html, and it omits is_published and anchor, so this endpoint cannot tell you whether an artifact is published or what its anchor is. Those two fields come back only from create and publish. Store the anchor when you publish, because you cannot read it back later.

