---
title: "Add a surface (tab)"
method: POST
path: "/api/workspaces/{slug}/surfaces"
tags: ["Surfaces"]
---

# Add a surface (tab)

`POST /api/workspaces/{slug}/surfaces`

## Request

- Base URL: `https://trydock.ai`
- URL: `https://trydock.ai/api/workspaces/{slug}/surfaces`
- Auth: HTTP bearer

Append a new surface to the workspace. Editor role required.

## Path parameters

- `slug` string, required

## Request body

- object
  - `kind` 'table' | 'doc', required: Whether this tab is a typed-row table or a TipTap rich-text doc.
  - `name` string: Display name. Auto-generated if omitted.
  - `slug` string: URL slug. Auto-derived from name if omitted.
  - `columns` object[]: Optional initial columns for `kind: 'table'`. Defaults to Title/Status/Notes when omitted. Ignored on doc surfaces.
    - `key` string, required
    - `label` string, required
    - `type` 'text' | 'longtext' | 'number' | 'status' | 'person' | 'date' | 'url' | 'checkbox' | 'select', required
    - `position` integer, required
    - `width` integer
    - `hidden` boolean
    - `wrap` boolean
    - `description` string
    - `options` object[]
      - `value` string, required
      - `label` string, required
      - `color` string

## Response `200`

Created.

- object
  - `surface` object, required
    - `id` string, required
    - `slug` string, required
    - `name` string, required
    - `kind` 'table' | 'doc', required: Whether this tab is a typed-row table or a TipTap rich-text doc.
    - `position` integer, required: Tab order within the workspace, 0-indexed.
    - `columns` object[], nullable: Column schema for table surfaces. `null` on doc/html surfaces.
      - `key` string, required
      - `label` string, required
      - `type` 'text' | 'longtext' | 'number' | 'status' | 'person' | 'date' | 'url' | 'checkbox' | 'select', required
      - `position` integer, required
      - `width` integer
      - `hidden` boolean
      - `wrap` boolean
      - `description` string
      - `options` object[]
        - `value` string, required
        - `label` string, required
        - `color` string

## Other responses

- `403`: Caller lacks editor role.

## Changes

- **2026-11-05** `dd96ae96a412`: 2 info
  - added the new optional request property `columns/items/wrap`
  - added the optional property `surface/columns/items/wrap` to the response with the `200` status
- **2026-11-05** `767beae124a8`: 1 breaking, 1 info
  - the `surface/columns/items/description` response property's maxLength was increased from `280` to `4000` for the response status `200`
  - the `columns/items/description` request property's maxLength was increased from `280` to `4000`

[Operation history](https://skmtc.dev/trydock/apis/dock-rest-api/changes/api/workspaces/:slug/surfaces/post.md)

---

[API](https://skmtc.dev/trydock/apis/dock-rest-api.md) - [All operations](https://skmtc.dev/trydock/apis/dock-rest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/trydock/apis/dock-rest-api/revisions/dd96ae96a412?raw)
