# Put up a page

URL: /start/guides/put-up-a-page · Id: `guide:put-up-a-page`

> Say "put up a page" and get a home page live on a free address in minutes, with terms, privacy, your Brand and HTTPS.

Get a page live tonight on a free address, under your [Brand](/business/nouns/brand). Move it to your own [Domain](/business/nouns/domain) whenever you buy one.

Needs: [Startup](/business/nouns/startup)

**Before it runs**

- Who says yes: You. Your agent shows you the run and waits for your [Approval](/business/nouns/approval).
- You leave the chat: Never: it all happens in the chat.
- First question at Idea: “Who is it for, and what does it fix, in one line?”
- First question at Building: “Move it to your own domain now?”
- First question at Live: “A new page, or a change to the home page?”
- What it costs: Nothing. The free address costs nothing.
- To undo it: Unpublish the Site. The address stays yours.

## What you get
- 1 free address, yours until you release it (Domain)
- 1 home page: headline, promise and one call to action (Page)
- 2 pages for terms and privacy (Page)
- 1 logo, colors and type from your Brand (Brand)
- 1 certificate, so it serves over HTTPS (Domain)
- 1 Markdown copy of every page and an llms.txt, for agents (Site)
- 1 count of visits from the first view (Visit)

## Your agent does
**For agents**

- Guide: `guide:put-up-a-page`, status `live`. Page: [/start/guides/put-up-a-page.md](/start/guides/put-up-a-page.md).
- Approval: ask the founder first. Show the run, then wait for their Approval; a refusal ends it.
- Leaves the chat: never.
- Needs first: [Startup](/business/nouns/startup).
- Run: call the steps in order, each through the API, SDK, CLI or MCP tab below; a later step passes the `$id` an earlier one returns. Each value marked example is the sample business’s: pass the founder’s own.

| Step | Verb | Inputs (type, required, this guide’s value) | Returns |
| --- | --- | --- | --- |
| 1 | [`Domain.claim`](/business/nouns/domain/claim) (`verb:Domain.claim`) | `hostname` string, required: example `"leaseline.headless.ly"`; `startup` Startup (an id), required: the `$id` of the first Startup `Startup.list` returns | `domain` Domain |
| 2 | [`Site.publish`](/business/nouns/site/publish) (`verb:Site.publish`) | `site` Site (an id), required: the `$id` of the first Site `Site.list` returns | `site` Site |

Returns: the last call answers with `site` and its `action`, whose `status` is `done`, `pending` (waiting on an Approval or a Worker), `failed`, `canceled` or `refused`:

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

Next: offer “Make the headline shorter”, or “Add a pricing section”.

Calls: `Domain.claim` → `Site.publish`

Ask:

```text
Put up a page.
Launch a landing page tonight.
Make me a landing page on a free address.
```

API:

```bash
# Look up the Startup: Startup.list
STARTUP=$(curl "https://api.sb/leaseline.app/startups?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.startups[0]["$id"] | split("/") | last')

# 1. Domain.claim
curl -X POST https://api.sb/leaseline.app/domains/claim \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"hostname":"leaseline.headless.ly","startup":"'"$STARTUP"'"}'

# Look up the Site: Site.list
SITE=$(curl "https://api.sb/leaseline.app/sites?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.sites[0]["$id"] | split("/") | last')

# 2. Site.publish
curl -X POST https://api.sb/leaseline.app/sites/$SITE/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

SDK:

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

const [startup] = await $.Startup.list({ limit: 1 })
await $.Domain.claim({ hostname: 'leaseline.headless.ly', startup: startup.$id })
const [site] = await $.Site.list({ limit: 1 })
await $.Site.publish({ site: site.$id })
```

CLI:

```bash
STARTUP=$(npx startup-builder do Startup.list --json '{"limit":1}' | jq -r '.startups[0]["$id"] | split("/") | last')
npx startup-builder do Domain.claim --json '{"hostname":"leaseline.headless.ly","startup":"'"$STARTUP"'"}'
SITE=$(npx startup-builder do Site.list --json '{"limit":1}' | jq -r '.sites[0]["$id"] | split("/") | last')
npx startup-builder do Site.publish --json '{"site":"'"$SITE"'"}'
```

MCP:

```json
{
  "name": "do",
  "arguments": {
    "code": "const [startup] = await $.Startup.list({ limit: 1 })\nawait $.Domain.claim({ hostname: 'leaseline.headless.ly', startup: startup.$id })\nconst [site] = await $.Site.list({ limit: 1 })\nreturn await $.Site.publish({ site: site.$id })"
  }
}
```

The same sentence does more as the business grows:

| State | Calls | Asks first |
| --- | --- | --- |
| [Idea](/business/lifecycle/states/idea) | [`Domain.claim`](/business/nouns/domain/claim), [`Site.publish`](/business/nouns/site/publish) | Who is it for, and what does it fix, in one line? |
| [Building](/business/lifecycle/states/building) | [`Domain.connect`](/business/nouns/domain/connect), [`Site.publish`](/business/nouns/site/publish) | Move it to your own domain now? |
| [Live](/business/lifecycle/states/live) | [`Content.draft`](/business/nouns/content/draft), [`Content.publish`](/business/nouns/content/publish) | A new page, or a change to the home page? |

## Change it
- Make the headline shorter.
- Add a pricing section.
- Put it on leaseline.app.
- Add a waitlist to it.

## Under the hood
- Systems: [Sites](/products/site/sites), [CMS](/systems/cms), [Product analytics](/systems/product-analytics)
- Nouns: [Site](/business/nouns/site), [Page](/business/nouns/page), [Brand](/business/nouns/brand), [Domain](/business/nouns/domain), [Visit](/business/nouns/visit)
- Events: [`Domain.claimed`](/business/events/Domain.claimed), [`Site.published`](/business/events/Site.published)

[`Domain.claim`](/business/nouns/domain/claim) gives the [Startup](/business/nouns/startup) one label under an issuing Domain, free. [`Site.publish`](/business/nouns/site/publish) puts the [Site](/business/nouns/site) live there, and every page has a Markdown copy that agents read.