register_domain
Register a FRESH domain — an available domain that is NOT an existing Atom marketplace listing — directly at the registrar. This SPENDS REAL MONEY and requires the 'domains:register' scope. Use this ONLY when check_domain_availability reported status 'available' for this exact domain. If the domain is instead an Atom marketplace listing (status 'premium'/'taken'), use purchase_domain instead — never this tool; it will reject a marketplace domain with error 'is_marketplace_listing'.
MANDATORY two-step flow — never skip the quote:
Call with confirm=false (default) to get a QUOTE: returns the authoritative price, its breakdown (unit_price, icann_total, vat_amount), term_years (server-derived from the TLD — never assume or pass one), the user's current balance, sufficient_funds, whether a saved card exists (has_saved_card / saved_card), and expires_at.
SHOW THE USER: the exact price breakdown, and state plainly which payment method you are about to use and how much it will charge — e.g. "$19.98 (domain $17.99 + ICANN fee $1.99) from your Atom balance" or "...from your saved Visa ending 4242". Get explicit confirmation before proceeding.
Call again with confirm=true, the SAME idempotency_key, and payment_method set to exactly 'balance' or 'saved_card' (REQUIRED at this step — never omit it or guess): commits the charge and the registration. Returns status='registered', amount_charged, payment_method, and registrar_domain_id — the domain now shows up in the user's Atom account (dashboard → My Domains).
Rules: never assume or pass a price. Reuse one client-generated idempotency_key across both calls (and any retry) to prevent double-charging. If it reports error 'registrant_contact_required' (a registry needs this to complete registration), call create_registrant_contact with the user's name, phone, address, city, zip, and country, then retry with confirm=true. If payment_method='balance' and funds are insufficient, error 'insufficient_funds' reports required/available/top_up_url and whether a saved card exists as an alternative — tell the user both options plainly, do not silently retry with the other method. If payment_method='saved_card' and the charge fails, error 'card_payment_failed' reports why (including if it needs 3D Secure authentication, which cannot be completed here — offer balance or a different card instead).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The fresh domain to register, including extension. | |
| confirm | No | false returns a quote; true commits the charge and registration (payment_method required). | |
| payment_method | No | Which rail to charge. REQUIRED when confirm=true — state this to the user before calling, never picked automatically. Ignored (and unnecessary) at the quote stage. | |
| idempotency_key | Yes | Client-generated unique key; identical across the quote and confirm calls for the same intended registration. Prevents double-charging on retry. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| price | No | Authoritative total price in USD (quote stage). | |
| stage | Yes | 'quote' = price for confirmation; 'committed' = registration completed. | |
| domain | Yes | ||
| status | No | Registration status (committed stage). | |
| balance | No | User's current Atom balance (quote stage). | |
| success | Yes | ||
| currency | No | ||
| breakdown | No | Price components (quote stage): unit_price, icann_total, vat_amount. | |
| next_step | No | How to complete the registration (quote stage). | |
| expires_at | No | Quote expiry (quote stage). | |
| saved_card | No | {brand, last4} of the saved card, if any (quote stage). | |
| term_years | No | Server-derived from the TLD. | |
| amount_charged | No | Amount actually charged in USD (committed stage). | |
| has_saved_card | No | Whether the user has a saved/default card on file (quote stage). | |
| payment_method | No | Which rail was actually charged (committed stage). | |
| idempotency_key | No | ||
| sufficient_funds | No | Whether balance covers the price (quote stage). | |
| registrar_domain_id | No | Registrar domain id (committed stage). |