The domains/ folder: one file and what it compiles to
What one domains/ file holds, what each key compiles to, and the checks that read it.
One domains/ file is one Domain and what it does: the site, or the email it sends from. SiteBuilder compiles it; the pages here read what it makes.
---
role: email
email: { mailboxes: [dana] }
---
Mail sends from dana@leaseline.app.$ npx startup-builder show domains/leaseline.app.mdx
role email domains/leaseline.app.mdx:2
email { mailboxes: [dana] } domains/leaseline.app.mdx:3
owner SiteBuilderleaseline.app/
├── plays/
│ ├── cold-email.mdx
│ ├── warm-intros.mdx
│ ├── signup-interviews.mdx
│ ├── lead-reactivation.mdx
│ └── events-and-webinars.mdx
├── audiences/
│ ├── small-property-managers.mdx
│ ├── lapsed-leads.mdx
│ └── renewal-season.mdx
├── sequences/
│ └── cold-email-thread-founder.mdx
├── funnels/
│ └── signup.mdx
├── workflows/
│ └── outbound.mdx
├── agents/
│ ├── sales/prospector.mdx
│ └── marketing/content-lead.mdx
├── systems/
│ └── sequences.mdx
├── domains/ ← this folder
│ └── leaseline.app.mdx
├── offers/
│ ├── pro.mdx
│ └── team.mdx
├── content/
│ └── webinars/60-day-notices.mdx
├── metrics/
│ ├── q4.mdx
│ └── positive-reply-rate.mdx
└── startups.lockThe file
| Key | On the page | Compiles to | Checked by |
|---|---|---|---|
role | Used for | what the Domain serves; email adds its sending records (POST /{namespace}/domains/{domain}/authenticate) | — |
email | Inboxes | one Mailbox per name, each warmed before its first cold email | — |
Checks
| Check | It holds | What dev prints |
|---|---|---|
| S2 | Every send passes a code-tier Check before it goes. | sequences/ |
Refusals
| Code | Fix, then the call that clears it |
|---|---|
claim | Cut the line, or cite the Offer term that grants it. Then POST /{namespace}/conversations/{conversation}/answer. |
customer-collision | Send it to their CSM instead: the Contact leaves the List. Then POST /{namespace}/leads/{lead}/assign. |
domain-authenticated | Add the 3 DNS records shown; it passes once they resolve, often within an hour. Then POST /{namespace}/domains/{domain}/authenticate. |
mailbox-warm | Wait for the warm-up to finish, 14 days from day 0; warm intros keep running. Then POST /{namespace}/mailboxes/{mailbox}/warm. |
owned-by-a-person | Leave it to the person who owns it: the draft waits in their queue. Then POST /{namespace}/tasks/{task}/assign. |
price | Get the discount approved, or quote at the floor. Then POST /{namespace}/approvals/{approval}/approve. |
spam-brake | Send to a smaller List, or wait an hour for the rate to fall. Then POST /{namespace}/messages/{message}/broadcast. |
visit-capture | Serve your Site from your Domain and publish the visitor notice; lookups start when both pass. Then POST /{namespace}/domains/connect. |
Calls
You, to your agent
Set up leaseline.app for email and check its records, as a dry run.
curl -X POST "https://api.sb/leaseline.app/domains/domain_1/authenticate?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
curl -X POST "https://api.sb/leaseline.app/domains/domain_1/verify?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"import { $ } from 'startup-builder'
await $.Domain.authenticate({ domain: 'domain_1' }, { mode: 'try' }) // domains/ leaseline.app.mdx
return await $.Domain.verify({ domain: 'domain_1' }, { mode: 'try' }) // passes once the records resolve
npx startup-builder do Domain.authenticate --json '{"domain":"domain_1"}' --try
npx startup-builder do Domain.verify --json '{"domain":"domain_1"}' --try{
"name": "do",
"arguments": {
"code": "await $.Domain.authenticate({ domain: 'domain_1' }, { mode: 'try' }) // domains/leaseline.app.mdx\nreturn await $.Domain.verify({ domain: 'domain_1' }, { mode: 'try' }) // passes once the records resolve",
"mode": "try"
}
}Response200
application/json{
"checks": {},
"domain": {
"$id": "https: //api.sb/ leaseline.app/ domains/ domain_1",
"$type": "Domain",
"hostname": "leaseline.app",
"role": "canonical",
"state": "verifying"
},
"action": {
"$id": "https: //api.sb/ leaseline.app/ actions/ action_1",
"operation": "Domain.verify",
"status": "done"
}
}
sample| Call | What it does |
|---|---|
POST /{namespace}/domains/{domain}/authenticate | Authenticate writes a Domain’s SPF, DKIM and DMARC records and verifies them before its first send. Emits Domain.authenticated. |
POST /{namespace}/domains/{domain}/verify | Verify checks a Domain’s DNS, ownership and certificate again and records each result, with the fix for any failure. Emits Domain.verified. |
POST /{namespace}/domains/connect | Connect attaches a hostname a Startup already holds and verifies ownership through DNS. Emits Domain.connected. |
POST /{namespace}/mailboxes/{mailbox}/warm | Warm ramps a new Mailbox from a few sends a day to its cap over two to four weeks. Emits Mailbox.warmed. |
Compiled, not written: edit the records it reads (compile table; cap), then regenerate. Every step runs from a sentence or a line of code. In your words: the CRM words you know, and where each lives here.