Three surfaces, one contract.
The API is the product. The CLI and the MCP server are generated from the same route table, so every operation exists on all three or on none of them — this page is generated from it too.
Authentication
One bearer token, issued by whydot login and stored by the CLI. It is shown once and never retrievable afterwards. There is no password and no web login form.
Spending money is explicit
Every call that can spend requires an idempotency key you choose. Send the same key twice and you get the first answer back, not a second domain and a second charge. The registrar's own API accepts no such token, so this is the only thing standing between a retry and a double purchase — which is why it is required rather than optional.
Operations
| Route | What it does | Scope |
|---|---|---|
| POST /v1/tenants | Create an account and its first API key. writes | any key |
| GET /v1/keys | List the API keys on this account, by prefix. | keys:manage |
| POST /v1/keys | Issue a new API key. writes | keys:manage |
| DELETE /v1/keys/:id | Revoke an API key immediately. writes | keys:manage |
| GET /v1/domains | List the domains in this account. | domains:read |
| GET /v1/domains/:id | Fetch one domain by id or by name. | domains:read |
| POST /v1/domains | Track a domain in this account. Spends nothing; registration is a separate call. writes | domains:write |
| POST /v1/registrant-contacts | Create a registrant contact for this account. writes | domains:write |
| GET /v1/availability | Is a domain available, and what would it cost. | domains:read |
| GET /v1/prices | Per-TLD registration prices. | domains:read |
| POST /v1/domains/:id/register | Register a tracked domain with the registrar. Spends money; requires an idempotency key. writes | domains:write |
| GET /v1/billing | The account balance and its ledger. Every charge and credit, with its cause. | billing:read |
| POST /v1/billing/topup | Start a top-up. Returns a Checkout URL for a human to open; no card touches this API. writes | billing:write |
MCP
Every operation above is also an MCP tool. Point your agent at whydot-mcp and it gets the same surface with the same scopes.