# Site

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

> A Site is a website as a Thing: its Pages, navigation, and Brand, served on one or more Domains.

A Site is a website as a [Thing](/business/nouns/thing): its [Pages](/business/nouns/page), navigation, and [Brand](/business/nouns/brand), served on one or more [Domains](/business/nouns/domain).

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `navigation` | `json` | No | The menus that link its Pages. |

<details>
<summary>Inherited from [Interface](/business/nouns/interface): 3 properties</summary>

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | `string` | Yes | One of `api`, `mcp`, `cli`, `sdk`, `site`, `app`, `docs`, or `webhooks`. |
| `path` | `string` | No | Where it is mounted on its Domain, such as `/api`. |
| `conformsTo` | `json` | No | The Standards it also speaks, each mapping the Standard’s operations onto the Product’s Verbs. |

</details>

## Object
```json
{
  "$id": "https://api.sb/shiftnote.app/sites/site_1",
  "$type": "Site",
  "kind": "api",
  "path": "/",
  "conformsTo": {
    "standard": "openai-chat",
    "operations": {
      "chat.completions.create": "Listing.write"
    }
  },
  "navigation": {}
}
```

## Relationships
- <a id="rel-contains"></a>A Site **contains** many [Pages](/business/nouns/page): a Site serves its [Pages](/business/nouns/page), each at its own path. `contains`, inverse [`containedIn`](/business/nouns/page#rel-contained-in).
- <a id="rel-hosted-at"></a>A Site **is hosted at** many [Domains](/business/nouns/domain): a Site answers on one or more [Domains](/business/nouns/domain); each Domain serves one Site. `hostedAt`, inverse [`hosts`](/business/nouns/domain#rel-hosts).
- <a id="rel-includes"></a>A Site **includes** one [Portal](/business/nouns/portal): a Site includes one [Portal](/business/nouns/portal), the signed-in part where each [Customer](/business/nouns/customer) sees only their own records. `includes`, inverse [`includedIn`](/business/nouns/portal#rel-included-in).
- <a id="rel-styled-by"></a>A Site **is styled by** one [Brand](/business/nouns/brand): a Site renders one [Brand](/business/nouns/brand)’s name, voice and [Theme](/business/nouns/theme). `styledBy`, inverse [`styles`](/business/nouns/brand#rel-styles).
- <a id="rel-visits"></a>A Site **has** many [Visits](/business/nouns/visit): each [Visit](/business/nouns/visit) arrives on one Site. `visits`, inverse [`lands`](/business/nouns/visit#rel-lands).

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| [Site.publish](/business/nouns/site/publish) | Publish puts a Site’s current Pages live on its Domains, under its Brand. | [Designer](/agents/product/designer) | [`Site.published`](/business/events/Site.published) | None. |
| <a id="create"></a>[Site.create](/business/nouns/site/create) | Creates a Site. Inherited from [Noun](/business/nouns/noun). | None. | `Site.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Site.get](/business/nouns/site/get) | Returns one Site by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Site.list](/business/nouns/site/list) | Returns Sites, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="update"></a>[Site.update](/business/nouns/site/update) | Changes the given properties of a Site. Inherited from [Noun](/business/nouns/noun). | None. | `Site.updated` | Two-way: `try`, `send`, `do` |
| <a id="delete"></a>[Site.delete](/business/nouns/site/delete) | Deletes a Site; its history is kept. Inherited from [Noun](/business/nouns/noun). | None. | `Site.deleted` | One-way: `send`, `do` |

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

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Site.create` | Yes | Yes | Yes | No |
| `Site.get` | Yes | Yes | Yes | Yes |
| `Site.list` | Yes | Yes | Yes | Yes |
| `Site.update` | Yes | Yes | Yes | No |
| `Site.delete` | Yes | Yes | Yes | No |
| `Site.publish` | Yes | Yes | Yes | No |

## Call it

**Ask**

```text
Publish the site “Algebra session”.
```

**API**

```bash
curl -X POST https://api.sb/tutorloop.com/sites/site_1/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

```json
{
  "api": "https://api.sb/tutorloop.com",
  "site": {
    "$id": "https://api.sb/tutorloop.com/sites/site_1",
    "$type": "Site",
    "kind": "api"
  },
  "action": {
    "$id": "https://api.sb/tutorloop.com/actions/action_1",
    "operation": "Site.publish",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/tutorloop.com/actions/action_1"
  }
}
```

**SDK**

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

const site = await $.Site.publish({ site: 'site_1' })
```

**CLI**

```bash
npx startup-builder do Site.publish --json '{"site":"site_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Site.publish({ site: 'site_1' })"
  }
}
```

## Example
A home-inspector directory is a Site with home, city, inspector, and pricing [Pages](/business/nouns/page) under one [Brand](/business/nouns/brand), served on `inspectfinder.com` and `www.inspectfinder.com`.