# domain (https://lazyfrog.dev/docs/tools/domain)

{/* Generated by scripts/generate-docs.ts from the gateway's registered tools. Do not edit. */}

**{"Custom domains"}** · Can change or delete · actions: `add`, `verify`, `remove`, `set_canonical`, `set_role`, `check`, `status`

<p>{"For reading use domain_read, which is read-only and needs no approval: \"check\", \"status\" here are deprecated (still works). Connect the user's own domain to the published site (paid plans: Hobby 1 per project, Pro 5, Business 10; a bare domain with its www counts once, each other hostname such as portal.example.com as one). action \"add\" (name: example.com connects www.example.com as the main address and the bare domain as a redirect to it; shop.example.com adds just that): returns the DNS records the user creates at their DNS provider, which it names: per hostname one ownership TXT, the certificate TXT records listed (usually two; more may appear within a minute, shown by domain verify) and a CNAME to customers.lazyfrog.app (on the bare domain an ALIAS or flattening, where the provider is known to have one). At a provider that can only forward the bare domain, or one LazyFrog doesn't recognise, only www is connected: the user forwards the bare domain (301) to https://www.<domain> at the provider (it never shows as live, as expected), or, if the provider allows a CNAME or ALIAS on it, \"add\" with the bare domain again connects it as a redirect. Tell them to keep their MX and email TXT records. Each hostname has a role: main (exactly one: the site's address and SITE_URL), redirect (308 to main, path and query kept: the bare domain and <slug>.lazyfrog.app) or entry (served by the same app as it is, no redirect; the app reads the Host header or SITE_HOSTS). A hostname other than the bare domain and www added after the main one is an entry. \"set_role\" (name, role: \"entry\" | \"redirect\"): change one; \"set_canonical\" (name): make it the main address (the old main one then redirects). \"verify\": check now (it is also checked every minute in its first hour, then regularly). States: waiting for DNS → ownership → certificate → live. \"remove\" (name; confirm: true). \"check\" (names: up to 10, the first the one wanted and the rest alternatives you propose; or name; no project needed): whether each is available, taken (and whether it already points to LazyFrog) or can't be told for its extension, from the registry and DNS. LazyFrog doesn't sell domains: the user buys the name at any registrar they like (or uses one they own), then \"add\". \"status\": the records as public DNS sees them now, each one in place or exactly what is missing or wrong (a CNAME pointing elsewhere, an A or AAAA record in the way, a CAA record blocking the certificate), with the email records to keep; changes nothing."}</p>
