---
title: "Plan how to adopt an existing domain"
method: GET
path: "/api/domains/adoption-plan"
tags: ["Domains"]
---

# Plan how to adopt an existing domain

`GET /api/domains/adoption-plan`

## Request

- Base URL: `https://domani.run`
- URL: `https://domani.run/api/domains/adoption-plan`
- Auth: `bearerAuth` (a scheme the document does not define)

Read-only inspection of an existing domain before connecting or transferring it. Returns the current registrar, authoritative nameservers, DNS provider, DNSSEC state, account state, transfer price, safety invariants, and exact next API actions. Call this before requesting an EPP code. Connecting leaves registrar and DNS unchanged. Transferring preserves nameservers and does not migrate DNS.

## Query parameters

- `domain` string, required

## Response `200`

Versioned domain adoption plan

- object
  - `version` 1, required
  - `domain` string, required
  - `registered` boolean, required
  - `account_state` 'untracked' | 'connected' | 'managed' | 'owned_by_another', required
  - `recommended_action` 'acquire' | 'connect' | 'transfer_preserving_dns' | 'none', required
  - `current` object, required
    - `registrar` string, nullable, required
    - `registrar_url` string, nullable, required
    - `expires_at` string, date-time, nullable, required
    - `status` string[], required
    - `nameservers` string[], required
    - `dns_provider` string, required
    - `dnssec_enabled` boolean, required
    - `checked_at` string, date-time, nullable, required: When the registry data was actually read. Cached readings keep their original timestamp, so compare against now to judge freshness (registry data may be cached up to 1 hour).
  - `options` object, required
    - `connect` object
      - `available` boolean
      - `price` 0
      - `currency` string
      - `changes_registrar` false
      - `changes_nameservers` false
      - `next_action` object
        - `method` string
        - `path` string
    - `transfer` object
      - `available` boolean
      - `eligible` boolean
      - `price` number, nullable
      - `currency` string
      - `includes_renewal` true
      - `preserves_nameservers` true
      - `migrates_dns` false
      - `reason` string
      - `code` string
      - `eligible_at` string, date
      - `guidance` object: Exit playbook for the current registrar: where the transfer-lock toggle and the auth code actually live. Present when the registrar (or the reseller actually managing the domain, detected from nameservers) is recognized.
        - `managed_via` string, required: Slug of the console that actually manages the domain; may differ from the registrar of record for resold domains.
        - `unlock` string, required: Where to disable the transfer lock.
        - `auth_code` string, required: Where the EPP/auth code appears.
        - `notes` string[], required: Known quirks worth knowing before starting.
      - `next_action` object
        - `method` string
        - `path` string
  - `invariants` string[], required
  - `warnings` string[], required

## Other responses

- `400`: Invalid request parameters
- `401`: Missing or invalid API key
- `429`: Rate limit exceeded - wait and retry

---

[API](https://skmtc.dev/domani/apis/domani-run-api.md) · [All operations](https://skmtc.dev/domani/apis/domani-run-api/llms.txt) · [OpenAPI document](https://skmtc.dev/domani/apis/domani-run-api/revisions/7679f8159533?raw)
