OpenTree DashboardSign in

$ dig CNAME

Your hostname in front of an agent-built page

Point share.yourcompany.com at a page and clients see your domain, not someone else's. Two DNS records, one verification call, a certificate issued automatically.

Add the hostname

curl -X POST https://read.botook.ai/custom-domains \
  -H "Authorization: Bearer otr_live_YOUR_KEY" \
  -H "content-type: application/json" \
  -d '{"hostname":"share.example.com","site_id":"SITE_ID"}'

The reply includes the two records to create: a CNAME for routing and a TXT for ownership.

Create the records

TypeNameValue
CNAMEshare.example.comthe hostname in the response
TXT_verify.share.example.comthe one-time token in the response

Any DNS provider will do — this does not require your zone to be on Cloudflare, though it happens to be Cloudflare doing the serving on this deployment.

Verify

curl -X POST https://read.botook.ai/custom-domains/share.example.com/verify \
  -H "Authorization: Bearer otr_live_YOUR_KEY"

Verification actually resolves the records. A hostname whose DNS is not in place is refused — an optimistic "verified" that later serves nothing is worse than a clear failure, so this reports what it found instead.

What lands on it

Bind a hostname to one site and its root becomes that page. The unlisted token keeps working in parallel, so a link already in someone's inbox does not break the day you add a domain.

Listing and removing

curl https://read.botook.ai/custom-domains -H "Authorization: Bearer otr_live_YOUR_KEY"

Remove one and traffic falls back to the token URL. Nothing about the content changes.

Certificates

Issued automatically once verification passes; renewal is not your problem. Until the certificate is live the hostname does not serve — no window where a client meets a warning page.

Why bother

What it does not do

It does not make the page public. Gates and expiry apply exactly the same on a custom hostname — password, work-email gate, burn-after-read, scheduled deletion.

A domain for each client

Nothing stops you adding many. Reports for one client on one hostname, another elsewhere, and each with its own pages behind it.

Agent-built pages, human-looking addresses

This is the piece that makes agent output presentable. Claude or Codex or ChatGPT writes the page and publishes it in a loop; the client sees a hostname they recognise. Nobody outside has to know the page was assembled by a model twelve minutes ago.

Compared with a general host

A general platform (say Vercel)Here
What it hostsAn application with a build pipelineA document or a single-file tool
SetupA project, a repository, a buildTwo DNS records
Private by defaultNoYes
Who publishesCI, on a pushAn agent, on a tool call

What the address looks like afterwards

A verified hostname bound to a page serves that page at its root. There is no token in the path and nothing for the reader to interpret — reports.yourfirm.com is the document, not a directory containing it. That is a deliberate one-hostname-to-one-page mapping rather than a second way to browse your account:

Reader opensGets
https://reports.yourfirm.com/The bound page itself
The original /p/<token>/ linkThe same page — the token link keeps working
An unbound but verified hostnameNothing is bound yet, so the request falls through to this site

Both addresses stay live, which matters when you move a page onto a domain after the link is already out: nothing you sent last week breaks. Every gate, counter and expiry belongs to the page, so a password set before the move is still in front of it after.

Troubleshooting

SymptomUsually
Verification failsThe TXT record has not propagated yet, or is on the wrong name.
Certificate pendingThe CNAME resolves somewhere else; check for a stale A record.
Serves the wrong pageThe hostname is bound to a different site id.

Questions

How many domains?

Unlimited on this deployment — see pricing.

Apex domain or subdomain?

A subdomain is the clean path; an apex needs a provider that flattens CNAMEs.

Does it break my existing links?

No. Token URLs keep resolving.

Keep reading