# ELITEDOMAINS MCP Server — 20 tools via DADL

The ELITEDOMAINS DADL turns ELITEDOMAINS's API into an MCP server that Claude, GPT or any MCP-compatible agent can consume directly. One YAML file declares all 20 tools — domain, catcher, handle, offer, address, authinfo, and more — and ToolMesh serves them at runtime. No Python boilerplate, no per-endpoint code, no separate MCP server process.

Below: the endpoint coverage matrix, a two-block ToolMesh setup, the full tool reference grouped by ELITEDOMAINS feature area.

**Source:** [ELITEDOMAINS API](https://app.elitedomains.de/docs)

**Updated:** 2026-07-05

**Tags:** dns, crud, e-commerce, automation, user-management, security, auth:bearer

## Which ELITEDOMAINS endpoints are covered?

**100%** (20 of ~20 endpoints).

**Focus:** Beta — REST API not yet stable. ELITEDOMAINS .de domain reseller: domains (register, transfer, AuthInfo, redirector, DNS records, tags), handles (PERSON, ORG, address validation), catcher (RGP backorders, dropdate, max bid), offers (Sedo marketplace, sale pages, visitor stats).

**Missing:** no standalone DNS-record CRUD (records are managed inline via redirector_settings), no transfer-status polling endpoint, no billing/invoice endpoint (though list_tld_prices covers TLD pricing), no get_domain and no single-handle GET (both list-only) -- and list_domains omits handle_id, so a domain's assigned owner handle cannot be read back; handles cannot be deleted

*Last reviewed: 2026-07-05*

## How do you configure the ELITEDOMAINS DADL?

1. Ask ELITEDOMAINS support to enable API access for your account (the API is opt-in and off by default).
2. Log in to the dashboard at https://app.elitedomains.de
3. Open account settings and go to the API / Personal Access Tokens section.
4. Create a new personal access token and copy it immediately (it is shown only once).
5. Store it in the ToolMesh credential store under the name 'elitedomains_token'.

**Environment variable:** `CREDENTIAL_ELITEDOMAINS_TOKEN`

[Authentication docs](https://app.elitedomains.de/docs)

*Personal access tokens are account-scoped (no granular scopes). Append ?sandbox=1 to any request to test without registry writes. Standard rate limit is 100 req/min and 1000 req/day; during droptime (02:00-04:00 UTC) it drops to 10 req/min and catcher add/remove is rejected with HTTP 405. Ordering an AuthInfo2 letter requires an account on monthly invoicing (Sammelrechnung).*

## How do you install the ELITEDOMAINS MCP server with ToolMesh?

Add to your `backends.yaml`:

```yaml
- name: elitedomains
  transport: rest
  dadl: elitedomains.dadl
  url: "https://api.elitedomains.de"

```

Set the credential:

```
CREDENTIAL_ELITEDOMAINS_TOKEN=your-token-here
```

## What 20 tools does the ELITEDOMAINS DADL expose?

- **GET** `list_domains` — List all domains in the account (paginated). Each row includes `name`, `redirector_settings`, `authinfo`, `auto_expire`, `paid_until`, `expires_at`, `tags` and `created_at`. Domains are keyed by `name` -- use it for every other domain operation.
- **GET** `check_domain` — Check a single domain's availability AND its pricing / transfer terms -- the response is far richer than a yes/no. Core fields: `name`, `message` (a.k.a. status) "free" (registrable) or "connect" (registered, transfer-only) -- but also other registry statuses like "transfer_lock", "redemptionPeriod" or "transit" -- plus `tld`. For a registrable/transferable name it additionally returns `action` (e.g. "transfer"), `authinfo_required` (whether an AuthInfo/transfer code is needed), `billing` (e.g. "instant"), `instant_payment_method_available`, `default_period` (months), a `periods` array of { months, price, price_gross } term/price options, the headline `price` / `price_gross` (net/gross EUR) and `tax_rate`. Use it for transfer feasibility and a single domain's price quote; for the full per-TLD price table use list_tld_prices, and for a focused order preview use check_domain_order.
- **GET** `check_domain_order` — Preview what ordering a domain via register_domain would do, BEFORE placing it: returns `name`, `status`, `action` ("register" or "transfer"), the available `periods` [{ months, price, price_gross }], the headline `price`/`price_gross` (net / incl. VAT at your `tax_rate`) and `billing` ("instant" = charged to your stored payment method, or "monthly_invoice"), plus `instant_payment_method_available`. For transfers the price is independent of the period (and some TLDs allow no period on transfer -> `periods` empty). check_domain already folds in these same preview fields; this is the focused variant.
- **GET** `list_tld_prices` — List the per-year, net (excl. VAT) prices for all registrable TLDs. Each row: `tld`, a `price` object with `reg`/`transfer`/`renew`/`restore` (the price CURRENTLY valid for your account -- may be lower than list due to a promotion or an individually negotiated rate), an `original_price` object with the standard list price, and a `custom` object flagging per-action whether an individual price is configured. A price is null when that action is not offered for the TLD. This IS the account price-list endpoint; for a single domain's quote use check_domain / check_domain_order.
- **POST** `register_domain` — Register a new domain OR transfer an existing one into the account. For a TRANSFER, supply `authinfo` (the transfer code from the losing registrar); for a fresh REGISTRATION omit it. `period` is the term in MONTHS (default 12). Optionally set the owner contact via `handle_id` and initial hosting via `redirector_settings` (the redirector can be configured on the transfer request itself). A successful inbound transfer responds { message: "Domain transfer initiated", name, payment: "captured", period } -- but the transfer is NOT yet complete: a gTLD transfer stays pending until the losing registrar ACKs (or ~5 days auto-ACK). While pending, the domain already shows in list_domains with `redirector_settings` set but `expires_at`/`paid_until` still null; poll list_domains and treat a non-null `expires_at` as "transfer done" (there is no transfer-status endpoint). Errors: 400 invalid input, 403 registry rejection, 409 already registered/owned.
- **PATCH** `update_domain` — Update an existing domain's settings: change its hosting/redirect via `redirector_settings` and/or reassign the owner contact via `handle_id`. Identify the domain by `name`. Errors: 400 validation, 404 not found.
- **DELETE** `delete_domain` — Delete (give up) a domain, or put it into TRANSIT for an outbound transfer. With `transit`=1 the domain is moved to the transit/KK-out state instead of being deleted. A plain delete returns the domain to the registry and is irreversible. Errors: 400 missing name, 403 registry error, 404 not found.
- **POST** `add_domain_tags` — Set/replace the internal organizational tags on a domain. Returns the updated `tags` array and a confirmation `message`. Errors: 400 invalid domain, 404 not found.
- **GET** `get_domain_authinfo` — Get or generate the outbound AuthInfo (KK / transfer) code for a domain you own -- needed to transfer it to another registrar. Returns { message, name, authinfo, expires_at }. The code is time-limited; note `expires_at` here is German format "DD.MM.YYYY HH:mm:ss" (unlike the ISO 8601 timestamps elsewhere). Errors: 400 missing name, 403 registry error, 404 not found.
- **GET** `check_domain_authinfo2` — Check whether a DENIC AuthInfo2 letter can be ordered for a .de domain. Returns { name, available, message }. AuthInfo2 is the paper-letter fallback used when an AuthInfo1 code is not obtainable. Only relevant for monthly-invoice (Sammelrechnung) accounts. Call this before order_domain_authinfo2.
- **POST** `order_domain_authinfo2` — Order a DENIC AuthInfo2 letter for a .de domain (added to the next collective invoice; confirmation arrives by email). Requires an account on monthly invoicing. Errors: 400 not orderable, 403 account restriction.
- **POST** `add_domain_to_sedo` — List a domain for sale on the external Sedo marketplace at a fixed price. `price` is a EUR amount greater than 0. Errors: 400 invalid input, 404 domain not found, 500 processing error.
- **GET** `list_catcher_orders` — List all RGP catcher (backorder) orders (paginated). Each row includes `name`, `status`, `users` (number of competing backorderers), `price` (your max bid), `dropdate_at` (expected drop) and `created_at`.
- **GET** `get_catcher_info` — Get RGP catcher status for ANY dropping domain (it need not be in your own catcher orders): returns `name`, `status` (e.g. "rgp"), `users` (how many parties are backordering it) and `dropdate_at` (expected drop, format "YYYY-MM-DD HH:mm:ss"). Use it to gauge competition and timing before placing an add_catcher_order. Errors: 400 missing name.
- **POST** `add_catcher_order` — Place an RGP catcher (backorder) on a dropping domain. `price` is your MAXIMUM bid in EUR (minimum 2). Requires a valid contact handle on the account. Errors: 400 missing/ invalid domain or missing handle, 405 droptime restriction (02:00-04:00 UTC), 409 already added.
- **DELETE** `delete_catcher_order` — Cancel a catcher (backorder) order for a domain. This only removes your backorder; it is reversible by re-adding. Errors: 400 missing name, 404 not found, 405 droptime restriction (02:00-04:00 UTC).
- **GET** `list_offers` — List the account's domain offers / sale pages (paginated, richly filterable). Each row includes `name`, `type` (paynow|4sale), `status`, `price`, `template`, `is_internal`, `redirect_status`, `hide_on_marketplace`, `visitors` (last_30_days/last_7_days/referrer_30_days), `template_data` and `tags`. Use the filters to narrow by type, status, price band, traffic and template, and sort with order_by/order_direction. This endpoint returns `total` and `last_page` for paging.
- **GET** `list_handles` — List all contact handles in the account (paginated). Each row includes `id`, `alias`, `type` (PERSON|ORG), `handle_name`, address fields (`street_name`, `street_number`, `postalcode`, `city`, `country_id`), `email`, `phone` and `created_at`. Use a handle's `id` as `handle_id` when registering/updating a domain. The country field is `country_id` (ISO 3166-1 numeric string, e.g. "276" for Germany) for both read and write.
- **POST** `create_handle` — Create a new contact handle (domain owner/admin contact). `type` is PERSON or ORG. For an ORG handle put the company name in `handle_name` and the responsible individual in `contact_person` (Ansprechpartner) -- `contact_person` is REQUIRED for type=ORG (at least for non-.de domains) and is exactly what a bare company name lacks; PERSON handles omit it. Set `address_suggest` to "keep" to bypass address auto-correction. Returns the full handle object including the assigned `id`. NOTE: there is no delete_handle -- handles cannot be removed via the API, so avoid throwaway/test handles. Errors: 400 validation (see `error.<field>` for the offending fields), 500 unknown error.
- **PATCH** `update_handle` — Update an existing contact handle by numeric id. Any subset of the writable fields may be supplied. (`type` cannot be changed after creation.) For ORG handles the same `contact_person` (Ansprechpartner) rule as create_handle applies. Returns the updated handle object. Errors: 400 validation (see `error.<field>`), 404 handle not found.

## Which DADLs are related to ELITEDOMAINS?

- [Billomat](https://www.dadl.ai/d/billomat/) — Billomat REST API — German cloud invoicing & accounting: invoices, estimates, credit notes, recurring invoices, delivery notes, order confirmations, dunning reminders, clients, contacts, articles, payments, expenses, taxes
- [Zammad](https://www.dadl.ai/d/zammad/) — Zammad helpdesk REST API -- tickets, articles, users, organizations, groups, roles, knowledge base, SLAs, calendars, object manager (custom fields), macros, triggers, overviews, reports, time accounting, and full admin surface. Supports X-On-Behalf-Of impersonation on every endpoint.
- [Cloudflare](https://www.dadl.ai/d/cloudflare/) — Cloudflare API -- DNS, Pages, Workers, KV, R2, D1, Zones, SSL/TLS, Cache, Load Balancers, Firewall/WAF, Page Rules, Access (Zero Trust), and account management
- [Graylog](https://www.dadl.ai/d/graylog/) — Graylog REST API -- log search (Views/Search + legacy universal), streams, pipelines, inputs, alerts, events, dashboards, users, roles, sidecars, index management, and cluster administration. Targets Graylog 6.x.
- [Stripe](https://www.dadl.ai/d/stripe/) — Stripe REST API — payment processing, billing, subscriptions, invoices, products, and financial infrastructure
- [Tailscale](https://www.dadl.ai/d/tailscale/) — Tailscale API -- devices, users, auth keys, DNS, ACL/policy, webhooks, contacts, posture integrations, log streaming, and tailnet settings

---

**Canonical URL:** https://www.dadl.ai/d/elitedomains/
**Raw DADL:** https://github.com/DunkelCloud/dadl-registry/blob/main/elitedomains.dadl
