---
title: "Publish an artifact"
method: POST
path: "/v1/publish"
tags: ["Publish"]
---

# Publish an artifact

`POST /v1/publish`

Create a new artifact or push a new version of an existing one.

## Request body

- PublishRequest
  - `name` string, required — Display name.
  - `slug` string — URL slug. Auto-generated if omitted.
  - `entrypoint` string
  - `files` FileEntry[], required
    - `path` string, required
    - `content` string, required
    - `mime` string
    - `encoding` 'utf8' | 'base64'
    - `size_bytes` integer
  - `visibility` 'public' | 'workspace' | 'private' — 'unlisted' was retired 2026-07 — still accepted as input and treated as 'public'.
  - `mobile_html` string
  - `pwa` PWAConfig
    - `enabled` boolean
    - `name` string
    - `short_name` string
    - `icon` string — Data URL or absolute URL to a PNG icon.
  - `access_policy` object — Row-level access policy for per-viewer data filtering.
  - `agent` AgentConfig — Turns on the visitor chat agent.
    - `enabled` boolean
    - `systemPrompt` string
    - `model` string
    - `maxTokens` integer
    - `temperature` number
    - `contextJson` boolean
    - `contextTables` string[]

## Response `200`

Published

- PublishResponse
  - `artifact` object
    - `id` string
  - `version` object
    - `id` string
    - `version_no` integer
  - `deployment` object
    - `slug` string
    - `url` string, uri
    - `subdomain_url` string, uri — Preferred share URL for workspace artifacts (https://{workspace}.shareout.site/{slug}/). Omitted for personal artifacts.
    - `mobile_url` string, uri
  - `editor_readiness` object — Advisory HTML editor-readiness profile (HTML artifacts only). Never blocks publishing.
    - `manifest` 'valid' | 'invalid' | 'missing'
    - `outline` boolean
    - `counts` object
      - `pages` integer
      - `bindings` integer
      - `templates` integer
    - `summary` object
      - `errors` integer
      - `warnings` integer
      - `infos` integer
    - `findings` object[]
      - `rule` string
      - `level` string
      - `message` string
      - `suggestion` string
      - `disables` string
  - `pwa` object
    - `manifest_url` string, uri
    - `installable` boolean
  - `notice` string — Human-readable message when publish was adjusted (governance, caps, email gate).
  - `approval_required` object — Present when workspace policy requires teammate approval before going open.
    - `required` integer — Number of approvers the requester must nominate.
    - `artifact_id` string
  - `moderation` object
    - `status` 'approved' | 'pending' | 'blocked'
    - `reason` string
    - `message` string
    - `requested_visibility` 'public' | 'workspace' | 'private'

## Other responses

- `400` — Invalid request
- `401` — Authentication required
- `409` — Slug taken or version conflict

---

[API](https://skmtc.net/shareout/apis/shareout-rest-api.md) · [All operations](https://skmtc.net/shareout/apis/shareout-rest-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/shareout/shareout-rest-api/versions/804359ead65a/schema)
