# Post

URL: /business/nouns/post · Id: `noun:post`

> A Post is something a Handle publishes, such as a thread or a short video, with the reach and replies it earns.

A Post is something a [Handle](/business/nouns/handle) publishes, such as a thread or a short video, with the reach and replies it earns.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `format` | `string` | Yes | The venue’s format, such as `shortVideo` or `thread`. |
| `publishAt` | `datetime` | No | When it goes out. |
| `status` | `string` | Yes | Where it stands; a withdrawn Post is kept with its reach and replies. |
| `claims` | `json` | No | The facts it states, each resolving to a record. |
| `reach` | `integer` | No | How many people saw it, as the venue reports. |

## Object
```json
{
  "$id": "https://api.sb/quietcopy.com/posts/post_1",
  "$type": "Post",
  "format": "Example format",
  "publishAt": "2026-10-22T12:00:00Z",
  "status": "draft",
  "claims": {},
  "reach": 1
}
```

## Relationships
- <a id="rel-handle"></a>A Post **has** one [Handle](/business/nouns/handle): every Post goes out from one [Handle](/business/nouns/handle), so its reach and replies count toward that Handle. `handle`, inverse [`publishes`](/business/nouns/handle#rel-publishes).

## Lifecycle

| State | Meaning | Moves to |
| --- | --- | --- |
| `draft` (first) | Written and not on its Handle’s calendar. | `scheduled` by [Post.schedule](/business/nouns/post/schedule); `published` by [Post.publish](/business/nouns/post/publish) |
| `scheduled` | On its Handle’s calendar for `publishAt`. | `published` by [Post.publish](/business/nouns/post/publish) |
| `published` | Live on its venue, earning reach and replies. | `withdrawn` by [Post.withdraw](/business/nouns/post/withdraw) |
| `withdrawn` | Taken down from its venue, with its record, reach and replies kept. | None: it ends here. |

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| [Post.publish](/business/nouns/post/publish) | Publish sends a Post out through its Handle once every claim it states resolves to a live record. | [Content Lead](/agents/marketing/content-lead) | [`Post.published`](/business/events/Post.published) | One-way (brand): `send`, `do` |
| [Post.schedule](/business/nouns/post/schedule) | Schedule puts a drafted Post on its Handle’s calendar for a set time. | [Content Lead](/agents/marketing/content-lead) | [`Post.scheduled`](/business/events/Post.scheduled) | Two-way: `try`, `send`, `do` |
| [Post.withdraw](/business/nouns/post/withdraw) | Withdraw takes a published Post down from its venue and keeps the record, its reach and its replies. | [Content Lead](/agents/marketing/content-lead) | [`Post.withdrawn`](/business/events/Post.withdrawn) | One-way: `send`, `do` |
| <a id="create"></a>[Post.create](/business/nouns/post/create) | Creates a Post. Inherited from [Noun](/business/nouns/noun). | None. | `Post.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Post.get](/business/nouns/post/get) | Returns one Post by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Post.list](/business/nouns/post/list) | Returns Posts, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="update"></a>[Post.update](/business/nouns/post/update) | Changes the given properties of a Post. Inherited from [Noun](/business/nouns/noun). | None. | `Post.updated` | Two-way: `try`, `send`, `do` |

A Post is never deleted: it ends by [Post.withdraw](/business/nouns/post/withdraw), and its records stay.

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Post.create` | Yes | Yes | Yes | No |
| `Post.get` | Yes | Yes | Yes | Yes |
| `Post.list` | Yes | Yes | Yes | Yes |
| `Post.update` | Yes | Yes | Yes | No |
| `Post.publish` | Yes | No | No | No |
| `Post.schedule` | Yes | Yes | Yes | No |
| `Post.withdraw` | Yes | No | No | No |

## Call it

**Ask**

```text
Schedule the latest post.
```

**API**

```bash
curl -X POST https://api.sb/ledgerlark.com/posts/post_1/schedule \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"at":"2026-10-22T12:00:00Z"}'
```

```json
{
  "api": "https://api.sb/ledgerlark.com",
  "post": {
    "$id": "https://api.sb/ledgerlark.com/posts/post_1",
    "$type": "Post",
    "format": "Example format",
    "status": "draft"
  },
  "action": {
    "$id": "https://api.sb/ledgerlark.com/actions/action_1",
    "operation": "Post.schedule",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/ledgerlark.com/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const post = await $.Post.schedule({ post: 'post_1', at: '2026-10-22T12:00:00Z' })
```

**CLI**

```bash
npx startup-builder do Post.schedule --json '{"post":"post_1","at":"2026-10-22T12:00:00Z"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Post.schedule({ post: 'post_1', at: '2026-10-22T12:00:00Z' })"
  }
}
```

## Example
A gardening app's [Handle](/business/nouns/handle) publishes a `thread` on frost dates at 7 a.m. Its one claim resolves to a dataset record, and it reaches 12,000 people with 40 replies.