# Publication

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

> A Publication is the branded package a Startup’s Customers use: Domain, Interfaces, packages, docs and Portal, compiled from its Brand and a Version.

A Publication is the branded package a [Startup](/business/nouns/startup)’s [Customers](/business/nouns/customer) use: [Domain](/business/nouns/domain), [Interfaces](/business/nouns/interface), packages, docs and [Portal](/business/nouns/portal), compiled from its [Brand](/business/nouns/brand) and a [Version](/business/nouns/version). Nothing inside it names the platform.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `brand` | [Brand](/business/nouns/brand) | Yes | The Brand every surface carries. |
| `version` | [Version](/business/nouns/version) | Yes | The Version it compiles from; a restyle compiles a new Publication and leaves the API version alone. |
| `domain` | [Domain](/business/nouns/domain) | Yes | The canonical Domain every surface answers on. |
| `api` | `url` | Yes | Where the API answers: `/api` on the Domain. `api.` on the Domain is an alias that serves the same API. |
| `mcp` | `url` | Yes | Where the MCP server answers: `/mcp` on the Domain. |
| `docs` | `url` | Yes | The docs, with `llms.txt` and Markdown per page. |
| `statusPage` | `url` | No | The status page, with every Incident that touched an Interface. |
| `portal` | `url` | No | The Portal, where a Customer manages keys, usage, billing and Tenant settings. |
| `packages` | `json` | No | The SDK, CLI and MCP package names, one per language and package registry. |
| `keyPrefix` | `string` | No | The Brand prefix on every API key, ahead of the fixed pattern secret scanners match. |
| `envPrefix` | `string` | No | The prefix of the key variable the SDK and CLI read, such as `TRANSCRIBE_API_KEY`. |
| `webhookHeader` | `string` | No | The signature header on every webhook delivery to a Customer. |
| `errorNamespace` | `url` | No | The base of every error `type` a Customer reads, on the Domain. |

## Object
```json
{
  "$id": "https://api.sb/petpantry.shop/publications/publication_1",
  "$type": "Publication",
  "brand": "brand_1",
  "version": "version_1",
  "domain": "domain_1",
  "api": "https://transcribe.fm/api",
  "mcp": "https://transcribe.fm/mcp",
  "docs": "https://transcribe.fm/docs",
  "statusPage": "https://transcribe.fm/status",
  "portal": "https://transcribe.fm/portal",
  "packages": {
    "npm": "transcribe",
    "pypi": "transcribe"
  },
  "keyPrefix": "transcribe_sk_live_",
  "envPrefix": "TRANSCRIBE_",
  "webhookHeader": "Transcribe-Signature",
  "errorNamespace": "https://transcribe.fm/errors"
}
```

## Relationships
- <a id="rel-publishes"></a>A Publication **publishes** one [Product](/business/nouns/product): a [Product](/business/nouns/product) reaches its [Customers](/business/nouns/customer) through one Publication; nothing inside it names the platform. `publishes`, inverse [`publication`](/business/nouns/product#rel-publication).

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| <a id="get"></a>[Publication.get](/business/nouns/publication/get) | Returns one Publication by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Publication.list](/business/nouns/publication/list) | Returns Publications, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |

A Publication is kept forever and never edited: it has no `update` or `delete`.

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

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Publication.get` | Yes | Yes | Yes | Yes |
| `Publication.list` | Yes | Yes | Yes | Yes |

## Call it

**Ask**

```text
Show me the latest publication.
```

**API**

```bash
curl https://api.sb/tutorloop.com/publications/publication_1 \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

```json
{
  "api": "https://api.sb/tutorloop.com",
  "$type": "Publication",
  "$id": "https://api.sb/tutorloop.com/publications/publication_1",
  "publication": {
    "$id": "https://api.sb/tutorloop.com/publications/publication_1",
    "$type": "Publication",
    "brand": "brand_1",
    "version": "version_1",
    "domain": "domain_1",
    "api": "https://transcribe.fm/api"
  },
  "links": {
    "self": "https://api.sb/tutorloop.com/publications/publication_1",
    "up": "https://api.sb/tutorloop.com/publications"
  }
}
```

**SDK**

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

const publication = await $.Publication.get({ id: 'publication_1' })
```

**CLI**

```bash
npx startup-builder do Publication.get --json '{"id":"publication_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Publication.get({ id: 'publication_1' })"
  }
}
```

## Example
```json
{
  "$id": "https://api.sb/transcribe.fm/publications/publication_1",
  "$type": "Publication",
  "domain": "domain_1",
  "api": "https://transcribe.fm/api",
  "mcp": "https://transcribe.fm/mcp",
  "docs": "https://transcribe.fm/docs",
  "statusPage": "https://transcribe.fm/status",
  "portal": "https://transcribe.fm/portal",
  "packages": { "npm": "transcribe", "pypi": "transcribe" },
  "keyPrefix": "transcribe_sk_live_",
  "envPrefix": "TRANSCRIBE_",
  "webhookHeader": "Transcribe-Signature",
  "errorNamespace": "https://transcribe.fm/errors"
}
```