buildd
Features

Artifacts

Non-code deliverables that agents produce — reports, data exports, summaries, and shareable links

Artifacts

Artifacts are non-code deliverables that agents produce during task execution. While code changes land in pull requests, artifacts capture everything else: analysis reports, data exports, executive summaries, curated links, and rich content.

Artifacts are private when created. The create routes insert shareToken: null, visibility: 'private' and return shareUrl: null; over MCP you get Visibility: private (not shared) instead of a URL. A public link exists only after an explicit share action — POST /api/artifacts/{id}/share, or the Share button on the artifact page. See Sharing an artifact.

Once shared, an artifact gets a URL that works without authentication — hand a report to stakeholders who don't have a Buildd account, embed a data export link in a Slack thread, or bookmark a summary for later reference.

Artifact Types

Types that work everywhere

TypePurposeExample
contentRich markdown content — articles, documentation drafts, design specsA blog post draft generated from research
reportStructured analysis with findings and recommendationsSecurity audit results, performance benchmarks
dataStructured data — JSON, CSV, or tabular outputAPI response analysis, metrics aggregation
linkCurated external URL with contextA deployed preview URL, a relevant GitHub issue
summaryConcise executive summary of work performedSprint recap, task completion digest
fileAn uploaded file; use upload_artifact rather than create_artifactA screenshot, a CSV export

Types accepted only at mission or initiative level

TypePurpose
analysisDeep-dive analysis with structured findings
recommendationDecision support with options and reasoning

These are accepted by POST /api/missions/{id}/artifacts and POST /api/initiatives/{id}/artifacts, but rejected by the worker route with 400 Invalid type. Over MCP that means you must pass missionId or initiativeId; a plain worker-scoped create_artifact with type: "analysis" fails.

Types the MCP tool advertises but no route accepts

email_draft, social_post, alert and calendar_event cannot be created. The create_artifact MCP action validates against a list of twelve types and then POSTs to a route whose allowlist is six (worker) or eight (mission/initiative). These four are in neither, so the request returns 400 Invalid type. Must be one of: … after passing MCP validation.

There is no workaround short of using one of the working types above — content for a draft, report for an alert write-up.

All types except link store their content directly in the content field. The link type requires a url parameter, stored in metadata, with optional content for descriptive context.

Artifact Templates

Templates provide JSON schemas for structured artifact output. Workers can discover available templates and use them to produce consistently formatted deliverables.

Available Templates

TemplateTypeSchema
research_reportreportfindings (array with title/detail/confidence), sources, summary
decision_recommendationrecommendationoptions (array with name/pros/cons), recommendation, reasoning
content_draftcontenttitle, body, targetPlatform, metadata
monitoring_alertalertseverity (critical/high/medium/low/info), description, suggestedAction, source

Two of these four templates cannot be used as-is:

  • monitoring_alert declares type: "alert", which every artifact route rejects. Use its schema with type: "report" instead.
  • decision_recommendation declares type: "recommendation", which only the mission and initiative routes accept — pass missionId or initiativeId.

research_report (report) and content_draft (content) work anywhere.

Discovering Templates

Workers can list available templates via MCP:

buildd action=list_artifact_templates

This returns all template definitions with their JSON schemas, enabling agents to produce structured output that matches the expected format.

Creating Artifacts

From Claude Code (MCP)

With the Buildd MCP server connected, agents create artifacts using the create_artifact action on the buildd tool:

> Summarize the findings from the security audit and create a shareable report

The agent calls buildd with action: "create_artifact" behind the scenes. Because the artifact is private, the MCP server reports its visibility rather than a URL:

Artifact created: "Security Audit Report" (report)
ID: a1b2c3d4-...
Visibility: private (not shared)

A Share URL: line appears here only when the artifact already has a token — for example when an upsert by key matched a previously shared artifact.

MCP Parameters

ParameterRequiredDescription
workerIdNoAuto-resolved from the active task context; pass it to override
missionIdNoCreate a mission-level artifact, with no worker context
initiativeIdNoCreate an initiative-level artifact, with no worker context
typeYesSee Artifact Types — the MCP tool accepts twelve, but the routes accept six or eight
titleYesHuman-readable title for the artifact
contentNoMarkdown body, JSON data, or descriptive text
urlNoRequired for link type — the target URL
metadataNoArbitrary JSON metadata to attach
keyNoStable per-workspace key; a repeat create with the same key updates the existing artifact and preserves its share token

From the REST API

Create an artifact by POSTing to the worker's artifacts endpoint:

curl -X POST https://buildd.dev/api/workers/{worker-id}/artifacts \
  -H "Authorization: Bearer bld_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "report",
    "title": "Weekly Performance Report",
    "content": "# Performance Summary\n\n## Key Metrics\n- P95 latency: 142ms (down 12%)\n- Error rate: 0.03%\n- Throughput: 2,400 req/s"
  }'

Response:

{
  "artifact": {
    "id": "a1b2c3d4-...",
    "workerId": "w1x2y3z4-...",
    "type": "report",
    "title": "Weekly Performance Report",
    "content": "# Performance Summary\n\n...",
    "shareToken": null,
    "visibility": "private",
    "metadata": {},
    "createdAt": "2026-02-20T10:30:00Z",
    "shareUrl": null
  }
}

shareToken and shareUrl are null on every fresh create. To get a link, call the share endpoint below with the returned id.

Link artifacts require the url field:

curl -X POST https://buildd.dev/api/workers/{worker-id}/artifacts \
  -H "Authorization: Bearer bld_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "link",
    "title": "Staging Preview",
    "url": "https://staging.example.com/preview/abc123",
    "content": "Deploy preview for the new checkout flow"
  }'

The url is stored in the artifact's metadata.url field and rendered as a clickable link on the share page.

Sharing an artifact

Sharing is a deliberate, separate step. Nothing is public until you take it.

From the dashboard

Open the artifact's page and click Share. The button mints a token, flips visibility to public, and copies the URL. Clicking again after that revokes.

From the API

curl -X POST https://buildd.dev/api/artifacts/{artifact-id}/share \
  -H "Authorization: Bearer bld_xxx"

Response:

{ "shareUrl": "https://buildd.dev/share/xK9mP2qR7vLnW3..." }

The token is a cryptographically random URL-safe string. It is generated once and reused if the artifact is shared again after being revoked, so a previously distributed link starts working again.

Auth accepts either a logged-in dashboard user who is a member of the artifact's workspace, or an API key that owns the artifact (via its worker) or has workspace access. Anything else gets 401 or 403.

Revoking

curl -X DELETE https://buildd.dev/api/artifacts/{artifact-id}/share \
  -H "Authorization: Bearer bld_xxx"

This sets visibility back to private and nulls the token, so the old URL 404s permanently — a later re-share mints a new one.

The share page

https://buildd.dev/share/xK9mP2qR7vLnW3...

The share page renders differently based on artifact type:

  • content / report / summary — Rendered as formatted markdown with full styling
  • data — Displayed as formatted JSON in a monospace code block (with pretty-printing)
  • link — Shown as a clickable URL with optional description text

Each share page includes the artifact title, the associated task name (if available), creation date, and a link back to buildd.dev.

Programmatic Access

Share tokens also work via the API for programmatic consumption:

curl https://buildd.dev/api/share/{token}

The lookup requires both a matching token and visibility = 'public', so a revoked artifact returns 404 Not found even with the correct token.

Response:

{
  "artifact": {
    "id": "a1b2c3d4-...",
    "type": "report",
    "title": "Weekly Performance Report",
    "content": "# Performance Summary\n\n...",
    "metadata": {},
    "createdAt": "2026-02-20T10:30:00Z"
  },
  "task": {
    "title": "Generate weekly performance report",
    "status": "completed"
  }
}

The dashboard provides two views for browsing artifacts:

Workspace Artifacts

Navigate to a workspace and click Artifacts in the header. This shows all artifacts produced by workers in that workspace, sorted by creation date (newest first). Each artifact displays its type, title, associated task, and a link to its share page.

Artifacts of type impl_plan are filtered out of both gallery views, so you only see deliverable artifacts. No other type is hidden.

Global Artifacts

Navigate to Artifacts in the main navigation to see artifacts across all workspaces you have access to. This cross-workspace view includes the workspace name on each artifact for context.

Realtime Updates

When an artifact is created, Buildd pushes two realtime events via Pusher:

  • Worker channel — worker:progress with { workerId, taskId, status, updatedAt }
  • Workspace channel — worker:artifact with { workerId, taskId }

Both payloads are deliberately thin — they carry no artifact content and no share URL. They are refresh signals; the client refetches. Don't build anything that expects artifact data on the wire.

Use Cases

Automated Reports

Schedule a recurring task that analyzes data and produces a report artifact:

Task: "Generate weekly security scan report"
→ Agent runs analysis
→ Creates artifact (type: report) with findings
→ Calls POST /api/artifacts/{id}/share to publish it
→ Share URL posted to Slack via webhook

Data Exports

Agents working with APIs or databases can export structured results:

Task: "Audit API endpoints for deprecated fields"
→ Agent scans OpenAPI spec
→ Creates artifact (type: data) with JSON findings
→ Shares it, then stakeholders access formatted data via the share link

Executive Summaries

After completing complex multi-step tasks, agents can produce a summary:

Task: "Migrate auth module to new provider"
→ Agent completes migration, creates PR
→ Creates artifact (type: summary) with migration recap
→ Tech lead reviews summary without reading every commit

Agents that trigger deployments can capture the preview URL:

Task: "Deploy feature branch to staging"
→ Agent pushes and triggers deploy
→ Creates artifact (type: link) with staging URL
→ QA team opens it from the workspace gallery (no share needed for team members)

API Reference

Endpoints

MethodEndpointAuthDescription
POST/api/workers/{id}/artifactsAPI keyCreate (or upsert by key) an artifact for a worker
GET/api/workers/{id}/artifactsAPI keyList all artifacts for a worker
POST/api/missions/{id}/artifactsAPI key or sessionCreate a mission-level artifact (no worker needed)
POST/api/initiatives/{id}/artifactsAPI key or sessionCreate an initiative-level artifact
GET/api/artifacts/{id}API key or sessionFetch a single artifact
PATCH/api/artifacts/{id}API key or sessionUpdate title, content, metadata
POST/api/artifacts/{id}/shareAPI key or sessionMake public; returns shareUrl
DELETE/api/artifacts/{id}/shareAPI key or sessionMake private and null the token
GET/api/share/{token}None (public)Fetch artifact by share token — requires visibility: public

Create Artifact Request

POST /api/workers/{id}/artifacts
Authorization: Bearer bld_xxx
Content-Type: application/json
FieldTypeRequiredDescription
typestringYescontent, report, data, link, summary, or file
titlestringYesDisplay title
contentstringNoMarkdown, JSON, or plain text body
urlstringNoTarget URL (required for link type)
metadataobjectNoArbitrary key-value metadata
keystringNoStable per-workspace key; upserts instead of appending
storageKeystringNoExisting object key for a stored file; must resolve inside the worker's own workspace prefix

Validation rules:

  • type must be one of the six types the worker route accepts (the mission and initiative routes add analysis and recommendation)
  • title is required and must be a string
  • url is required when type is link
  • a caller-supplied storageKey must belong to the worker's workspace, or the request is rejected with 400
  • in a workspace whose data class is sensitive, content and storageKey are forced to null — only a metadata stub row is stored

Artifact Object

{
  "id": "uuid",
  "workerId": "uuid",
  "type": "report",
  "title": "Security Audit Report",
  "content": "# Findings\n\n...",
  "storageKey": null,
  "shareToken": null,
  "visibility": "private",
  "metadata": {},
  "createdAt": "2026-02-20T10:30:00Z",
  "shareUrl": null
}

shareUrl is computed at response time from shareToken — it is null until the artifact is shared, and null again after a revoke.

storageKey is not reserved for future use. It is the live object key for file-backed artifacts: upload_artifact (and POST /api/artifacts/upload-url) derives one under the workspace's prefix, and GET /api/artifacts/{id}/download turns it into a signed download URL. You may also pass an existing key on create, but it must resolve inside the worker's own workspace prefix.

MCP Tool

ToolActionAccessDescription
builddcreate_artifactall token levelsCreate a private artifact
builddlist_artifactsall token levelsList artifacts for a workspace, mission, or initiative
builddget_artifactall token levelsFetch full artifact content by ID
builddupdate_artifactworker, adminUpdate title, content, metadata
builddupload_artifactworker, adminGet a signed upload URL for a file artifact
builddlist_artifact_templatesall token levelsList templates with their JSON schemas

create_artifact returns the artifact ID, title, type, and either a share URL (if one already exists) or Visibility: private (not shared).

There is no MCP action that shares an artifact. Publishing requires POST /api/artifacts/{id}/share over HTTP, or the dashboard button. An agent that needs to hand out a public link has to make that call itself.

upload_artifact is the one exception, and not a useful one. It mints a shareToken for the new file row but leaves visibility at private, then prints both a Share URL: and a Download URL (permanent…). Neither works: /share/{token} requires visibility: public, and the download route rejects a token unless the artifact is public. Call POST /api/artifacts/{id}/share on the returned artifactId before handing either URL to anyone.

On this page