Skip to content

Make an artifact. kind is doc (the default); slides, designs and dashboards answer that they are not here yet.

POST/workspaces/{workspace}/artifacts

It lands in space (a slug or id you can edit in), under parent_id (a doc you can edit), or, with neither, in your Private, where only you can open it. Start it from markdown, or from a template (template_id), with an optional title and icon. You own it. Returns the artifact.

Left out space and parent_id, it lands in your Private, where only you can open it until you share it. kind is doc until slides, designs and dashboards ship; they answer 422 saying they are not here yet.

  • Authentication: Required. Send an access token as Authorization: Bearer.
  • MCP tool: artifact with action create, and the same inputs
  • Scope: An access token needs artifacts:write.
Name Type Required Description
workspace string Yes The workspace’s slug, e.g. “acme”.

Send a JSON object. Names are snake_case, as in responses; the camelCase spelling is accepted too.

Name Type Required Description
kind string No doc, slides, design or dashboard. One of doc, slides, design, dashboard.
title string No At most 200 characters. Left out: the template’s, or Untitled.
icon string No An emoji.
space string No A space you can edit in: its slug or id. Left out, with no parent_id: your Private.
parent_id string No A doc to put it under, which you can edit: its id. Its space is the doc’s.
markdown string No What a doc starts with, in Markdown.
template_id string No A template to start from (list_workspace_artifact_templates), instead of markdown.
curl -X POST https://api.g1t.sh/workspaces/acme/artifacts \
-H "Authorization: Bearer $G1T_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "doc",
"title": "Release notes",
"markdown": "# Release notes\n\nWhat changed in 2.4.\n"
}'

A successful request answers 200 with:

{
"id": "fol_01kq8d5f7h9k1n3q5s7u9w1y3a",
"kind": "doc",
"title": "Release notes",
"icon": null,
"slug": "release-notes-fol_01kq8d5f7h9k1n3q5s7u9w1y3a",
"space": null,
"parent_id": null,
"has_children": false,
"owner": {
"type": "user",
"id": "usr_01kkntcg1eeb98j62xjm7eh09q",
"username": "ana",
"display_name": "Ana Lima"
},
"created_by": {
"type": "user",
"id": "usr_01kkntcg1eeb98j62xjm7eh09q",
"username": "ana",
"display_name": "Ana Lima"
},
"created_at": "2026-10-09T10:00:00.000Z",
"updated_at": "2026-10-09T10:00:00.000Z",
"edited_by": null,
"edited_at": "2026-10-09T10:00:00.000Z",
"trashed_at": null,
"viewer_role": "manage",
"private": true,
"shared_count": 0,
"general_access": "none",
"general_role": null,
"inherit": true,
"agent_mode": null,
"excerpt": "What changed in 2.4.",
"source": null,
"stale": false,
"html_url": "https://g1t.sh/acme/-/artifacts/release-notes-fol_01kq8d5f7h9k1n3q5s7u9w1y3a"
}

A failed request answers with one of these statuses and a body like {"error": {"code": "not_found", "message": "Repository not found."}}. See errors.

Status Code When
401 unauthenticated A token is required, or the one sent is not valid.
403 forbidden The token is valid but not allowed to do this, such as a member-only change or an agent token outside its repository.
404 not_found It does not exist, or you cannot see it.
409 conflict The request conflicts with the current state.
422 invalid The input is not valid. message says which field and why.