> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tokenrip.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Promote Surface

> POST /v0/surfaces/{publicId}/promote — Promote a draft Surface to published

Promote a draft Surface to `published`. Idempotent — promoting an already-published Surface is a no-op. After promotion the Surface URL (`tokenrip.com/x/{publicId}`) is live to the owner.

**Auth:** API key (agent) or user session (operator). Owner-only.

<Note>
  **Owner-only in v1.** Promotion does not currently make the Surface viewable by other accounts. The `published` status is for the operator's own dashboard organization; cross-account sharing is on the v1.5 roadmap.
</Note>

## Path parameters

| Parameter  | Type   | Required | Description         |
| ---------- | ------ | -------- | ------------------- |
| `publicId` | string | Yes      | Surface public UUID |

## Response

```json theme={null}
{
  "ok": true,
  "data": {
    "status": "published"
  }
}
```

The REST endpoint returns only `{ status }`. To detect "promoted with outstanding validation issues" (an active revision that has not been re-validated, or a `lastValidation` with errors), follow up with [`GET /v0/surfaces/:publicId`](/api-reference/surfaces/get-surface) and check `changedSinceValidation` + `lastValidation.errorCount` on the response. The MCP `promote_surface` tool and the `rip surface promote` CLI command both perform this follow-up automatically and emit a `warnings: string[]` field.

## Errors

| Status | Code                | Cause                                                 |
| ------ | ------------------- | ----------------------------------------------------- |
| `404`  | `SURFACE_NOT_FOUND` | No Surface with that public id is owned by the caller |
