Publish an artifact
const url = 'https://shareout.site/v1/publish';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"name":"My App","slug":"my-app","entrypoint":"index.html","visibility":"public","files":[{"path":"index.html","content":"<!DOCTYPE html><h1>Hello</h1>","mime":"text/html","encoding":"utf8"}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://shareout.site/v1/publish \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "My App", "slug": "my-app", "entrypoint": "index.html", "visibility": "public", "files": [ { "path": "index.html", "content": "<!DOCTYPE html><h1>Hello</h1>", "mime": "text/html", "encoding": "utf8" } ] }'Create a new artifact or push a new version of an existing one. Every files[].path must be a safe relative path (see FileEntry.path); an unsafe one returns 400 INVALID_PATH with a hint naming it.
Authorizations
Section titled βAuthorizationsβRequest Bodyrequired
Section titled βRequest Bodyrequiredβobject
Display name.
URL slug. Auto-generated if omitted.
object
Relative path with β/β between folders. No β..β, no leading β/β, no backslash, no empty or β.β segments (e.g. βa//bβ, β./xβ), no control characters, at most 512 characters. An unsafe path is rejected with 400 INVALID_PATH; the hint names it.
βunlistedβ was retired 2026-07 β still accepted as input and treated as βpublicβ.
object
Data URL or absolute URL to a PNG icon.
Row-level access policy for per-viewer data filtering: { version: 1, field, default, rules, queries? }. queries maps a name to { connection, provider, endpoint, params } β the Data Platform queries scoped viewers may run.
object
Turns on the visitor chat agent.
object
Optional change note for this version, shown in the version history. When a new version is published without one, a short βwhat changedβ note may be generated in the background (message_source: ai), unless the workspace turned off ai.version_summaries.
Examples
Single HTML file
{ "name": "My App", "slug": "my-app", "entrypoint": "index.html", "visibility": "public", "files": [ { "path": "index.html", "content": "<!DOCTYPE html><h1>Hello</h1>", "mime": "text/html", "encoding": "utf8" } ]}Responses
Section titled βResponsesβPublished. Check visibility β when it is more private than asked, visibility_downgraded is true and notice says why; tell the user.
object
object
object
object
Preferred share URL for workspace artifacts (https://{workspace}.shareout.site/{slug}/). Omitted for personal artifacts.
Advisory HTML editor-readiness profile (HTML artifacts only). Never blocks publishing.
object
object
object
object
object
βunlistedβ was retired 2026-07 β still accepted as input and treated as βpublicβ.
True when the page came out more private than requested (instance policy, account without a verified email, public-artifact cap, or a moderation hold). A publish with no visibility counts as asking for public.
Present with visibility_downgraded.
Human-readable reason the publish was adjusted (governance, caps, email gate, instance policy).
Present when workspace policy requires teammate approval before going open.
object
Number of approvers the requester must nominate.
object
Example
{ "editor_readiness": { "manifest": "valid" }, "visibility": "public", "requested_visibility": "public", "moderation": { "status": "approved", "requested_visibility": "public" }}Invalid request
object
Human-readable message.
Machine-readable error code.
Correlation id (also the X-Request-Id header). Quote it in support tickets.
Finer cause under code. For UNAUTHORIZED: missing, invalid, revoked or expired.
What to do next, in plain words.
The request field at fault.
Doc page for this error.
Present on 5xx β how to reach a human.
object
Example
{ "success": false, "support": { "how": "POST /v1/support/tickets", "include": [ "request_id" ] }}Authentication required
object
Human-readable message.
Machine-readable error code.
Correlation id (also the X-Request-Id header). Quote it in support tickets.
Finer cause under code. For UNAUTHORIZED: missing, invalid, revoked or expired.
What to do next, in plain words.
The request field at fault.
Doc page for this error.
Present on 5xx β how to reach a human.
object
Example
{ "success": false, "support": { "how": "POST /v1/support/tickets", "include": [ "request_id" ] }}Access denied
object
Human-readable message.
Machine-readable error code.
Correlation id (also the X-Request-Id header). Quote it in support tickets.
Finer cause under code. For UNAUTHORIZED: missing, invalid, revoked or expired.
What to do next, in plain words.
The request field at fault.
Doc page for this error.
Present on 5xx β how to reach a human.
object
Example
{ "success": false, "support": { "how": "POST /v1/support/tickets", "include": [ "request_id" ] }}Slug taken or version conflict
object
Human-readable message.
Machine-readable error code.
Correlation id (also the X-Request-Id header). Quote it in support tickets.
Finer cause under code. For UNAUTHORIZED: missing, invalid, revoked or expired.
What to do next, in plain words.
The request field at fault.
Doc page for this error.
Present on 5xx β how to reach a human.
object
Example
{ "success": false, "support": { "how": "POST /v1/support/tickets", "include": [ "request_id" ] }}Storage limit reached (STORAGE_LIMIT_EXCEEDED).
object
Human-readable message.
Machine-readable error code.
Correlation id (also the X-Request-Id header). Quote it in support tickets.
Finer cause under code. For UNAUTHORIZED: missing, invalid, revoked or expired.
What to do next, in plain words.
The request field at fault.
Doc page for this error.
Present on 5xx β how to reach a human.
object
Example
{ "success": false, "support": { "how": "POST /v1/support/tickets", "include": [ "request_id" ] }}Rate limit reached (RATE_LIMIT_EXCEEDED on publish / account creation / AI routes, RATE_LIMITED on the data plane). Wait for Retry-After / reset.
object
Human-readable message.
Machine-readable error code.
Correlation id (also the X-Request-Id header). Quote it in support tickets.
Finer cause under code. For UNAUTHORIZED: missing, invalid, revoked or expired.
What to do next, in plain words.
The request field at fault.
Doc page for this error.
Present on 5xx β how to reach a human.
object
Example
{ "success": false, "support": { "how": "POST /v1/support/tickets", "include": [ "request_id" ] }}Unexpected server failure. Retry once; if it fails again, file a ticket with POST /v1/support/tickets quoting request_id.
object
Human-readable message.
Machine-readable error code.
Correlation id (also the X-Request-Id header). Quote it in support tickets.
Finer cause under code. For UNAUTHORIZED: missing, invalid, revoked or expired.
What to do next, in plain words.
The request field at fault.
Doc page for this error.
Present on 5xx β how to reach a human.
object
Example
{ "success": false, "support": { "how": "POST /v1/support/tickets", "include": [ "request_id" ] }}