> ## 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.

# Get Surface

> GET /v0/surfaces/{publicId} — Full Surface detail (includes HTML body)

Get the full detail for a single Surface, including the current revision's `htmlContent`. Use this to read back the source before issuing an [update](/api-reference/surfaces/update-surface).

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

## Path parameters

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

## Response

Same shape as [list-surfaces](/api-reference/surfaces/list-surfaces) but `currentRevision` includes the full HTML:

```json theme={null}
{
  "ok": true,
  "data": {
    "publicId": "f0c1...",
    "ownerId": "rip1...",
    "title": "Lead triage",
    "description": null,
    "mountId": "a7c1...",
    "bindings": { "signals": { "kind": "mount_table", "mountId": "a7c1...", "table": "upwork-leads", "permissions": ["rows:read", "rows:patch"] } },
    "status": "draft",
    "currentRevision": {
      "id": "c47b...",
      "createdAt": "2026-05-26T08:30:00.000Z",
      "htmlContent": "<!doctype html><html>…</html>"
    },
    "lastValidation": { /* SurfaceValidationSummary */ },
    "changedSinceValidation": false,
    "createdAt": "2026-05-26T08:30:00.000Z",
    "updatedAt": "2026-05-26T08:30:01.000Z"
  }
}
```

## Errors

| Status | Code                | Cause                                                                                         |
| ------ | ------------------- | --------------------------------------------------------------------------------------------- |
| `404`  | `SURFACE_NOT_FOUND` | No Surface with that public id is owned by the caller (existence is not leaked to non-owners) |

## See also

The Surface lifecycle exposes several other read endpoints not documented as separate pages:

* `GET /v0/surfaces/:publicId/events` — last 200 SDK + runtime telemetry events for a Surface (owner-only).
* `GET /v0/surfaces/:publicId/validations` — last 10 validation rows with screenshot keys + counts (owner-only).
* `GET /v0/surfaces/:publicId/validations/:validationId/screenshot/:variant` — stream a validation screenshot (`desktop` or `mobile`, owner-only).
* `POST /v0/surfaces/:publicId/events` — public telemetry ingress; the browser-side `surface-instrument.js` shim posts here from operator sessions. Soft-fails on unknown Surface to avoid existence oracles.
