The ELITEDOMAINS API allows you to manage domains, handles, and catcher orders programmatically through a simple REST API.
This documentation provides all the information you need to work with the ELITEDOMAINS API.
To use the API, please contact our support team to enable API access for your account. Once activated, you can manage personal access tokens in your account settings.
All API requests must include your personal access token as a Bearer token:
Authorization: Bearer {YOUR_TOKEN}
All API requests should be made to: https://api.elitedomains.de
The API supports all TLDs offered by ELITEDOMAINS — the full list including prices is available via GET /domains/prices. Requests for unsupported TLDs are rejected with a dedicated error message.
DENIC specific features (catcher backorders, AuthInfo2, transit) remain limited to .de domains.
Paid actions (registration, transfer) are billed like in the web app: accounts with monthly invoicing for a TLD are billed via the collective invoice; all other orders are charged instantly to the stored payment method (credit card or PayPal). Orders are rejected when no instant payment method is available or the payment cannot be authorized. Use GET /domains/order/check to preview costs, available periods and billing for a domain before ordering.
Every API request can be run in Sandbox mode by adding ?sandbox=1 to the URL. In Sandbox mode, no actual changes are performed (no database writes or registry calls).
Endpoints that can execute a registry operation — domain registration/transfer, update, delete/transit,
AuthInfo/AuthInfo2, domain status checks, creating or updating a handle, and adding a domain to the
catcher — count against your main limit. This applies per endpoint, not per request: every call to such
an endpoint counts, even one that only touches local data (e.g. a PATCH /domains call that only
changes redirector settings, or updating a handle field that a registry does not track).
All other endpoints (listing domains/handles/offers/catcher orders, prices, offer management, removing a domain from the catcher, ...) fall under a separate, much looser limit intended only to prevent abuse: 600 requests/minute, 20,000 requests/day, not reduced during droptime.
Each endpoint's description above states whether it counts against the main (registry) limit.
These limits are shared between the REST API and the MCP server (below): requests to either interface count against the same per-account counters.
Every API operation is also available to AI agents through a Model Context Protocol (MCP) server. Any MCP-compatible client (for example Claude) can manage your domains, handles, offers and catcher orders directly.
https://mcp.elitedomains.de (Streamable HTTP transport)default ability.Point your MCP client at the endpoint and provide your token in the Authorization header. Example client configuration:
{
"mcpServers": {
"elitedomains": {
"type": "http",
"url": "https://mcp.elitedomains.de",
"headers": {
"Authorization": "Bearer {YOUR_TOKEN}"
}
}
}
}
The server exposes the same operations documented below: domains (list, list filter options, check availability, check order options, prices, register/transfer, update, delete, tags, authinfo), handles (list, create, update), offers (list, list filter options, create, update, update price, delete), leads (list, send counter-offer, accept price suggestion), journal (list), transactions (list), invoices (list, get with line items, list service records) and catcher backorders (list, list filter options, info, create, delete). As with the REST API, all offered TLDs are supported (catcher and AuthInfo2 remain .de only).
To authenticate requests, include an Authorization header with the value "Bearer {YOUR_TOKEN}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can retrieve your personal access token by visiting your account settings page in the ELITEDOMAINS dashboard. Contact support to enable API access for your account.
Retrieve a paginated list of all domain catcher orders in your account.
The page number for pagination.
Number of results per page. Default: 500, Max: 500.
Filter by tags (comma-separated tag names, e.g. priority,short). An order must have all listed tags.
Filter by TLD (comma-separated, e.g. de,com).
Field to order by. created_at sorts by when this catch cycle started (kept as the default for backward compatibility). queued_at sorts by when you personally added the domain to your catcher — the same value the listing returns as created_at. Default: created_at. Options: created_at, queued_at, price, status, dropdate_at, tags.
created_atqueued_atpricestatusdropdate_attagsOrder direction. Default: desc. Options: asc, desc.
ascdesccurl --request GET \
--get "https://api.elitedomains.de/catcher?page=1&per_page=500&tags=priority&tld=de&order_by=dropdate_at&order_direction=desc" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"current_page": 1,
"per_page": 500,
"data": [
{
"name": "example.de",
"status": "rgp",
"users": 3,
"price": 5,
"dropdate_at": "2024-03-15",
"created_at": "2024-03-10 14:30:00",
"tags": [
"tag1",
"tag2"
]
}
]
}
Retrieve the tags and TLDs your catcher orders can be filtered by via GET /catcher, along with how many orders currently match each option.
curl --request GET \
--get "https://api.elitedomains.de/catcher/filters" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"tags": [
{
"name": "Priority",
"slug": "priority",
"count": 3
}
],
"tlds": [
{
"tld": "de",
"count": 12
}
]
}
Retrieve status information for any domain in the catcher, including the number of users competing for it, the current status and the expected drop date. The domain does not need to be in your own catcher orders.
The domain name.
curl --request GET \
--get "https://api.elitedomains.de/catcher/info?name=example.de" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"name": "example.de",
"status": "rgp",
"users": 3,
"dropdate_at": "2024-03-15 00:00:00"
}
Add a new domain to the RGP (Redemption Grace Period) catcher. Successfully caught domains will be registered using your default handle configuration.
If the domain is already in your catcher orders, the price can be updated instead by passing a different price value.
This endpoint may execute registry operations and counts against your API rate limit.
curl --request POST \
"https://api.elitedomains.de/catcher" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"price\": 10
}"
{
"message": "Domain added to catcher",
"name": "example.de"
}
Remove a domain from your catcher order list.
curl --request DELETE \
"https://api.elitedomains.de/catcher" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\"
}"
{
"message": "Domain deleted",
"name": "example.de"
}
Retrieve a paginated list of all domains in your account.
The page number for pagination.
Number of results per page. Default: 500, Max: 500.
Filter by tags (comma-separated tag names, e.g. premium,aged). A domain must have all listed tags.
Filter by TLD (comma-separated, e.g. de,com).
Field to order by. Default: created_at. Options: created_at, name, paid_until, expires_at, auto_expire, handle, tags.
created_atnamepaid_untilexpires_atauto_expirehandletagsOrder direction. Default: desc. Options: asc, desc.
ascdesccurl --request GET \
--get "https://api.elitedomains.de/domains?page=1&per_page=500&tags=premium%2Caged&tld=de&order_by=created_at&order_direction=desc" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"current_page": 1,
"per_page": 500,
"data": [
{
"name": "example.de",
"redirector_settings": {
"type": "landing",
"method": "redirect_sale_page"
},
"authinfo": "E-Hc$f3xx",
"auto_expire": "2024-12-31",
"paid_until": "2024-12-31",
"expires_at": "2025-01-01T00:00:00.000000Z",
"created_at": "2023-01-15T10:30:00.000000Z"
}
]
}
Retrieve the tags and TLDs your domains can be filtered by via GET /domains, along with how many domains currently match each option.
curl --request GET \
--get "https://api.elitedomains.de/domains/filters" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"tags": [
{
"name": "Premium",
"slug": "premium",
"count": 12
},
{
"name": "Aged",
"slug": "aged",
"count": 4
}
],
"tlds": [
{
"tld": "de",
"count": 340
},
{
"tld": "com",
"count": 58
}
]
}
Retrieve the prices for all top-level domains (TLDs) available for registration. All prices are net (excluding VAT) in EUR and rounded to up to 3 decimal places.
The price object holds the price currently valid for your account. It may be lower than the standard price because of an active promotion or because an individual price has been negotiated for your account. The interval object states the billing interval each price value is quoted for: yearly, monthly (e.g. some accounts are billed monthly for .de) or one_time. The original_price object holds the standard yearly list price without any promotions or individual pricing — it is always yearly, even when interval reports a different cadence for price (e.g. a negotiated monthly .de renew price), so do not divide price by original_price to derive a discount unless interval is yearly. The custom object indicates, per price type, whether an individual price is configured for your account that deviates from the standard price.
A price may be null when the corresponding action is not offered for a TLD.
Filter the result by a single TLD. The leading dot is optional.
curl --request GET \
--get "https://api.elitedomains.de/domains/prices?tld=de" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"tld": "de",
"price": {
"reg": 5,
"transfer": 5,
"renew": 5,
"restore": 80
},
"interval": {
"reg": "yearly",
"transfer": "yearly",
"renew": "yearly",
"restore": "yearly"
},
"original_price": {
"reg": 5,
"transfer": 5,
"renew": 5,
"restore": 80
},
"custom": {
"reg": false,
"transfer": false,
"renew": false,
"restore": false
}
}
]
}
Register a new domain or transfer an existing domain to your account. Domains will be created using your default redirector and handle configuration.
All TLDs from the price list (GET /domains/prices) are supported. Use GET /domains/order/check
to preview the required action, available periods and costs for a domain beforehand.
Paid actions are charged instantly to your stored payment method (credit card or PayPal) unless your
account uses monthly invoicing for the TLD. If the payment cannot be authorized the order is rejected.
For instantly billed orders the response contains a payment field: captured (charged), authorized
(the order succeeded but the charge is still pending — no action required), canceled (the order
failed, nothing was charged) or not_required (free of charge, e.g. fully discounted).
Transfers of some TLDs (e.g. most gTLDs) do not complete immediately; in that case the response is
Domain transfer initiated and the transfer continues in the background.
This endpoint may execute registry operations and counts against your API rate limit.
curl --request POST \
"https://api.elitedomains.de/domains" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"authinfo\": \"E-Hc$f3xx\",
\"handle_id\": 123,
\"period\": 12,
\"redirector_settings\": {
\"type\": \"landing\",
\"method\": \"redirect_sale_page\",
\"url\": \"https:\\/\\/example.com\",
\"ns\": [
\"ns1.example.com\",
\"ns2.example.com\"
],
\"dns\": [
{
\"type\": \"A\",
\"name\": \"@\",
\"value\": \"192.168.1.1\",
\"prio\": 10,
\"ttl\": 3600
}
],
\"options\": {
\"dnssec-active\": \"false\",
\"dnssec-key\": \"AwEAAa...\",
\"dnssec-algorithm\": \"13\",
\"dnssec-flags\": \"257\"
}
}
}"
{
"message": "Domain registered successfully",
"name": "example.de",
"period": 12,
"payment": "captured"
}
Add or update tags for a specific domain in your portfolio. Tags help organize and categorize your domains.
curl --request POST \
"https://api.elitedomains.de/domains/tags" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"tags\": [
\"premium\",
\"aged\",
\"brandable\"
]
}"
Check the registry status of a domain. The message field contains the
current status. The most common values are free (available for registration)
and connect (already registered). Other registry statuses such as
redemptionPeriod, transfer_lock or transit may also be returned.
All TLDs from the price list (GET /domains/prices) are supported.
The response additionally contains the same order preview fields as
GET /domains/order/check (action, periods, price, billing, ...);
see that endpoint for their documentation. message always contains the
plain registry status.
This endpoint may execute registry operations and counts against your API rate limit.
The domain name to check.
curl --request GET \
--get "https://api.elitedomains.de/domains/check?name=example.de" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"name": "example.de",
"message": "free",
"tld": "de",
"status": "free",
"action": "register",
"periods": [
{
"months": 12,
"price": 5,
"price_gross": 5.95
}
],
"default_period": 12,
"price": 5,
"price_gross": 5.95,
"tax_rate": 19,
"billing": "instant",
"instant_payment_method_available": true
}
Preview what an order for a domain would look like before placing it via POST /domains:
the current registry status, the resulting action (register or transfer), the available
periods with their cost and how the order would be billed.
price values are net in EUR; price_gross includes VAT at your account's tax_rate
and is the amount an instant payment actually charges.
billing is instant when the order is charged immediately to your stored payment
method (credit card or PayPal) and monthly_invoice when it is added to your collective
invoice. For instant billing, instant_payment_method_available indicates whether a
payment method is stored in your account's billing settings.
For transfers the price is independent of the period; the period only determines the
added runtime (some TLDs do not allow choosing a period on transfer, then periods is empty).
This endpoint may execute registry operations and counts against your API rate limit.
The domain name to check.
curl --request GET \
--get "https://api.elitedomains.de/domains/order/check?name=example.com" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"name": "example.com",
"message": "Domain can be registered",
"tld": "com",
"status": "free",
"action": "register",
"periods": [
{
"months": 12,
"price": 9.5,
"price_gross": 11.31
},
{
"months": 24,
"price": 19,
"price_gross": 22.61
}
],
"default_period": 12,
"price": 9.5,
"price_gross": 11.31,
"tax_rate": 19,
"billing": "instant",
"instant_payment_method_available": true
}
Update domain settings such as redirector configuration or handle assignment.
This endpoint may execute registry operations and counts against your API rate limit.
curl --request PATCH \
"https://api.elitedomains.de/domains" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"redirector_settings\": {
\"type\": \"landing\",
\"method\": \"redirect_sale_page\",
\"url\": \"https:\\/\\/example.com\",
\"ns\": [
\"ns1.example.com\",
\"ns2.example.com\"
],
\"dns\": [
{
\"type\": \"A\",
\"name\": \"@\",
\"value\": \"192.168.1.1\",
\"prio\": 10,
\"ttl\": 3600
}
],
\"options\": {
\"dnssec-active\": \"false\",
\"dnssec-key\": \"AwEAAa...\",
\"dnssec-algorithm\": \"13\",
\"dnssec-flags\": \"257\"
}
},
\"handle_id\": 1234
}"
{
"message": "Domain updated"
}
Delete a domain from your account or put it into DENIC transit state.
Transit is a DENIC concept and therefore only available for .de domains.
This endpoint may execute registry operations and counts against your API rate limit.
curl --request DELETE \
"https://api.elitedomains.de/domains" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"transit\": 0
}"
{
"message": "Domain deleted",
"name": "example.de"
}
Retrieve the AuthInfo/transfer code for a domain. If none exists, a new one will be generated.
This endpoint may execute registry operations and counts against your API rate limit.
The domain name.
curl --request GET \
--get "https://api.elitedomains.de/domains/authinfo?name=example.de" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"message": "Authcode exists",
"name": "example.de",
"authinfo": "EDxHc$f3xx",
"expires_at": "07.04.2024 21:34:35"
}
Check if an AuthInfo2 letter can be ordered for a .de domain via DENIC. Only available for accounts
that use monthly invoicing (Sammelrechnung). AuthInfo2 is a DENIC concept and therefore only
available for .de domains.
This endpoint may execute registry operations and counts against your API rate limit.
The domain name to check.
curl --request GET \
--get "https://api.elitedomains.de/domains/authinfo2/check?name=example.de" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"name": "example.de",
"available": true,
"message": "AuthInfo2 can be ordered"
}
Order an AuthInfo2 letter from DENIC for a .de domain. Only available for accounts that use monthly
invoicing (Sammelrechnung); the order is added to the next collective invoice. A confirmation email
is sent on success. AuthInfo2 is a DENIC concept and therefore only available for .de domains.
This endpoint may execute registry operations and counts against your API rate limit.
curl --request POST \
"https://api.elitedomains.de/domains/authinfo2" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"sandbox\": \"0\"
}"
{
"name": "example.de",
"message": "AuthInfo2 letter for example.de has been ordered and will be sent within 1-2 business days."
}
List a domain on the Sedo marketplace with a specified price. The domain will be configured for Paynow transactions.
curl --request POST \
"https://api.elitedomains.de/domains/sedo" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"price\": 1500
}"
{
"message": "SEDO-Domain added or updated successfully",
"name": "example.de"
}
Retrieve a paginated list of all sale pages (domain offers) in your account with relevant data including status, pricing, visitors, leads, and template information.
The page number for pagination.
Number of results per page. Default: 50, Max: 500.
Filter by offer type. Options: paynow, 4sale.
paynow4saleFilter by status. Options: verified, hold, not_configured, unverified, inactive, deconnect.
verifiedholdnot_configuredunverifiedinactivedeconnectFilter by internal domains (true) or external domains (false).
Filter by template name.
Minimum price filter.
Maximum price filter.
Minimum visitors in the last 30 days.
Filter by tags (comma-separated tag names, e.g. premium,short). An offer must have all listed tags.
Filter by TLD (comma-separated, e.g. de,com).
Field to order by. Default: created_at. Options: created_at, name, price, visitors, leads, trend, color, template, status, tags.
created_atnamepricevisitorsleadstrendcolortemplatestatustagsOrder direction. Default: desc. Options: asc, desc.
ascdesccurl --request GET \
--get "https://api.elitedomains.de/offers?page=1&per_page=50&type=paynow&status=verified&is_internal=1&template=slim&min_price=99&max_price=5000&min_visitors=10&tags=premium%2Cshort&tld=de&order_by=visitors&order_direction=desc" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"current_page": 1,
"per_page": 50,
"total": 125,
"last_page": 3,
"data": [
{
"name": "example.de",
"type": "paynow",
"status": "verified",
"price": 2999,
"template": "slim",
"created_at": "2023-01-15T10:30:00.000000Z",
"is_internal": true,
"redirect_status": true,
"hide_on_marketplace": false,
"visitors": {
"last_30_days": 142,
"last_7_days": 35,
"referrer_30_days": 12
},
"template_data": {
"theme-color": "blue",
"price-suggest": "true"
},
"tags": [
"premium",
"short"
]
}
]
}
Retrieve the tags and TLDs your sale pages can be filtered by via GET /offers, along with how many sale pages currently match each option.
curl --request GET \
--get "https://api.elitedomains.de/offers/filters" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"tags": [
{
"name": "Premium",
"slug": "premium",
"count": 8
},
{
"name": "Short",
"slug": "short",
"count": 3
}
],
"tlds": [
{
"tld": "de",
"count": 90
},
{
"tld": "com",
"count": 35
}
]
}
Create a sale page (domain offer) for a domain, identified by its domain name. Domains you manage with
ELITEDOMAINS become an internal sale page (status: verified right away); any other domain becomes an
external sale page and stays unverified until its nameservers are pointed at ELITEDOMAINS, unless your
account is set up to skip that verification.
For an external domain, the sale page is saved before the DNS records that carry out its verification are
set up; if a 500 is returned for an external domain, the sale page may already exist in a partially set
up state. Retrying the request will then fail with 409 rather than completing the setup — check
GET /offers for the domain's status, or use PATCH /offers to adjust its configuration, instead of
retrying POST /offers.
curl --request POST \
"https://api.elitedomains.de/offers" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"use_default_config\": false,
\"template\": \"slim\",
\"price\": 2999,
\"price_suggest\": true,
\"qualified_leads\": false,
\"theme_color\": \"blue\",
\"hide_on_marketplace\": false,
\"route_domain\": true,
\"status\": \"activate\",
\"display_name\": \"Example.de\",
\"headline\": \"This domain is for sale\",
\"text\": \"Contact us to make an offer.\"
}"
{
"message": "Sale page created",
"name": "example.de",
"status": "verified",
"is_internal": true
}
Update the configuration of a sale page (domain offer), identified by its domain name. Only the fields provided in the request are changed; any field left out keeps its current value. Setting status to deactivate also stops the domain from routing to the sale page, if it was.
curl --request PATCH \
"https://api.elitedomains.de/offers" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"template\": \"slim\",
\"price\": 2999,
\"price_suggest\": true,
\"qualified_leads\": false,
\"theme_color\": \"blue\",
\"hide_on_marketplace\": false,
\"route_domain\": true,
\"status\": \"activate\",
\"display_name\": \"Example.de\",
\"headline\": \"This domain is for sale\",
\"text\": \"Contact us to make an offer.\"
}"
{
"message": "Sale page updated",
"name": "example.de"
}
Update the asking price of a sale page (domain offer), identified by its domain name.
curl --request PATCH \
"https://api.elitedomains.de/offers/price" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\",
\"price\": 2999
}"
{
"message": "Sale price updated",
"name": "example.de",
"price": 2999
}
Delete a sale page (domain offer), identified by its domain name. This only removes the sale page; the domain itself is not affected.
curl --request DELETE \
"https://api.elitedomains.de/offers" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"example.de\"
}"
{
"message": "Sale page deleted",
"name": "example.de"
}
Retrieve a paginated list of all contact handles in your account.
The page number for pagination.
Number of results per page. Default: 500, Max: 500.
curl --request GET \
--get "https://api.elitedomains.de/handles?page=1&per_page=500" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"current_page": 1,
"per_page": 500,
"data": [
{
"id": 123,
"alias": "JohnPrivate",
"type": "PERSON",
"handle_name": "John Doe",
"contact_person": null,
"street_name": "Unter den Linden",
"street_number": "12",
"address_addition": null,
"postalcode": "12345",
"city": "Berlin",
"state": null,
"country_id": 276,
"country_iso": "DE",
"email": "[email protected]",
"phone": "+49.16094751251",
"created_at": "2023-01-15T10:30:00.000000Z"
}
]
}
Add a new contact handle to your account. Handles are used for domain contact information at the registry.
This endpoint may execute registry operations and counts against your API rate limit.
curl --request POST \
"https://api.elitedomains.de/handles" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"alias\": \"JohnPrivate\",
\"type\": \"PERSON\",
\"handle_name\": \"John Doe\",
\"contact_person\": \"John Doe\",
\"street_name\": \"Unter den Linden\",
\"street_number\": \"12\",
\"address_addition\": \"3rd floor\",
\"postalcode\": \"12345\",
\"city\": \"Berlin\",
\"state\": \"Berlin\",
\"country_iso\": \"DE\",
\"country_id\": 276,
\"email\": \"[email protected]\",
\"phone\": \"+49.16094751251\",
\"general_request\": \"[email protected]\",
\"abuse_contact\": \"[email protected]\"
}"
{
"id": 123,
"alias": "JohnPrivate",
"type": "PERSON",
"handle_name": "John Doe",
"contact_person": null,
"street_name": "Unter den Linden",
"street_number": "12",
"address_addition": null,
"postalcode": "12345",
"city": "Berlin",
"state": null,
"country_id": 276,
"country_iso": "DE",
"email": "[email protected]",
"phone": "+49.16094751251",
"created_at": "2023-01-15T10:30:00.000000Z"
}
Update an existing contact handle. Only include fields you want to update.
This endpoint may execute registry operations and counts against your API rate limit.
The handle ID.
curl --request PATCH \
"https://api.elitedomains.de/handles/123" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"alias\": \"JohnPrivate\",
\"contact_person\": \"John Doe\",
\"street_name\": \"Unter den Linden\",
\"street_number\": \"12\",
\"address_addition\": \"3rd floor\",
\"postalcode\": \"12345\",
\"city\": \"Berlin\",
\"state\": \"Berlin\",
\"country_iso\": \"DE\",
\"country_id\": 276,
\"email\": \"[email protected]\",
\"phone\": \"+49.16094751251\",
\"general_request\": \"[email protected]\",
\"abuse_contact\": \"[email protected]\"
}"
{
"id": 123,
"alias": "JohnPrivate",
"type": "PERSON",
"handle_name": "John Doe",
"contact_person": null,
"street_name": "Unter den Linden",
"street_number": "12",
"address_addition": null,
"postalcode": "12345",
"city": "Berlin",
"state": null,
"country_id": 276,
"country_iso": "DE",
"email": "[email protected]",
"phone": "+49.16094751251",
"created_at": "2023-01-15T10:30:00.000000Z"
}
Retrieve a paginated list of your invoices, most recent first. Amounts are in EUR.
The page number for pagination.
Number of results per page. Default: 50, Max: 500.
Filter by status. Accepts a comma-separated list of statuses (draft, pending, complete, failed, dispute, incomplete, inkasso, lost, cancelled).
Only invoices created on or after this date (YYYY-MM-DD).
Only invoices created on or before this date (YYYY-MM-DD).
Sort direction by invoice date. Default: desc (newest first). Options: asc, desc.
ascdesccurl --request GET \
--get "https://api.elitedomains.de/invoices?page=1&per_page=50&status=complete&from=2026-01-01&to=2026-06-30&order_direction=desc" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"from\": \"2026-07-17T13:46:18\",
\"to\": \"2026-07-17T13:46:18\"
}"
{
"current_page": 1,
"per_page": 50,
"total": 1,
"last_page": 1,
"data": [
{
"id": 123,
"number": "R202600123",
"date": "2026-03-01T04:30:00.000000Z",
"status": "complete",
"payment_method": "card",
"instant_payment": true,
"amounts": {
"net_amount": 100,
"tax_percentage": 19,
"tax_amount": 19,
"gross_amount": 119,
"warning_fee_amount": 0,
"total_amount": 119,
"paid_amount": 119,
"open_amount": 0
},
"discounts": []
}
]
}
Retrieve a single invoice including its line items (positions), as printed on the invoice document. Amounts are in EUR.
The invoice ID, as returned by GET /invoices.
curl --request GET \
--get "https://api.elitedomains.de/invoices/123" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"id": 123,
"number": "R202600123",
"date": "2026-03-01T04:30:00.000000Z",
"status": "complete",
"payment_method": "card",
"instant_payment": true,
"amounts": {
"net_amount": 100,
"tax_percentage": 19,
"tax_amount": 19,
"gross_amount": 119,
"warning_fee_amount": 0,
"total_amount": 119,
"paid_amount": 119,
"open_amount": 0
},
"discounts": [],
"positions": [
{
"label": "Verlängerung .de, 1 Jahr",
"count": 20,
"single_price": 5,
"total": 100
}
]
}
Retrieve the service records (Leistungsnachweis) of an invoice: one record per billed domain or service, mirroring the invoice's service record document/CSV. Type and period values match the document (German). Prices are net, in EUR.
The invoice ID, as returned by GET /invoices.
curl --request GET \
--get "https://api.elitedomains.de/invoices/123/services" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"invoice": {
"id": 123,
"number": "R202600123"
},
"data": [
{
"name": "example.de",
"type": "Verlängerung",
"period": "01.06.2026 - 30.06.2026",
"price": 5
}
]
}
Retrieve a paginated list of journal entries recording changes made to your domains (registrations, transfers, renewals, handle/redirector changes, deletions, ...), most recent first.
The page number for pagination.
Number of results per page. Default: 50, Max: 500.
Filter by domain name (matches domains containing this value).
Filter by type of change. Comma-separated for multiple values.
Filter by where the change originated. Comma-separated for multiple values. Options: interface, api, mcp, customer_service, system, paynow.
interfaceapimcpcustomer_servicesystempaynowcurl --request GET \
--get "https://api.elitedomains.de/journal?page=1&per_page=50&domain=example.de&type=domain-renewed%2Cdomain-transfer&source=interface" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"current_page": 1,
"per_page": 50,
"total": 1,
"last_page": 1,
"data": [
{
"date": "2024-03-10T14:30:00.000000Z",
"domain": "example.de",
"type": "domain-renewed",
"message": "Laufzeit verlängert",
"source": "interface"
}
]
}
Retrieve a paginated list of leads (interested buyers) across all your sale pages: buyer price suggestions, contact requests and abandoned checkouts that turned into a negotiation. Draft and in-progress checkout entries that have not become an actual lead yet are not included.
The page number for pagination.
Number of results per page. Default: 50, Max: 500.
Filter by domain name (matches domains containing this value).
Field to order by. Default: last_interaction_at. Options: last_interaction_at, first_contact_at, domain, current_price.
last_interaction_atfirst_contact_atdomaincurrent_priceOrder direction. Default: desc. Options: asc, desc.
ascdesccurl --request GET \
--get "https://api.elitedomains.de/leads?page=1&per_page=50&domain=example.de&order_by=last_interaction_at&order_direction=desc" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"current_page": 1,
"per_page": 50,
"total": 1,
"last_page": 1,
"data": [
{
"id": 123,
"domain": "example.de",
"source": "buyer_price_suggestion",
"original_price": 2999,
"current_price": 2500,
"first_contact_at": "2024-03-08T09:15:00.000000Z",
"last_interaction_at": "2024-03-10T14:30:00.000000Z",
"metadata": {
"timezone": "Europe/Berlin",
"city": "Berlin",
"country": "Germany",
"device_type": "Desktop"
}
}
]
}
Set a new asking price for a lead, identified by its lead ID from GET /leads. Use this both to send the seller's first price to a lead that only made contact (no price on the table yet), and to counter a buyer's pending price suggestion. The buyer receives an email with the new price and a checkout link, valid for 72 hours.
The lead ID, as returned by GET /leads.
curl --request POST \
"https://api.elitedomains.de/leads/123/counter-offer" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"price\": 2500
}"
{
"message": "Counter-offer sent",
"id": 123,
"price": 2500
}
Accept a lead's pending buyer price suggestion, identified by its lead ID from GET /leads. The buyer receives an email confirming their price and a checkout link to complete the purchase, valid for 72 hours.
The lead ID, as returned by GET /leads.
curl --request POST \
"https://api.elitedomains.de/leads/123/accept" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"message": "Price suggestion accepted",
"id": 123,
"price": 2500
}
Retrieve a paginated list of your domain sale transactions (purchases made by buyers through Paynow), most recent first. Buyer personal data is never included.
The page number for pagination.
Number of results per page. Default: 50, Max: 500.
Filter by domain name (matches domains containing this value).
Field to sort by. Default: purchase_date. Options: purchase_date, completion_date, domain, net_price, gross_price, payout_amount.
purchase_datecompletion_datedomainnet_pricegross_pricepayout_amountSort direction. Default: desc. Options: asc, desc.
ascdesccurl --request GET \
--get "https://api.elitedomains.de/transactions?page=1&per_page=50&domain=example.de&order_by=purchase_date&order_direction=desc" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"current_page": 1,
"per_page": 50,
"total": 1,
"last_page": 1,
"data": [
{
"id": 123,
"domain": "example.de",
"status": {
"payment": "success",
"transfer": "transferred",
"payout": "done"
},
"price": {
"net_price": 1000,
"gross_price": 1190,
"tax_percentage": 19,
"tax_amount": 190,
"fee_percentage": 8,
"fee_amount": 80,
"payout_amount": 1110
},
"payment_method": "paypal",
"purchase_date": "2024-03-10T14:30:00.000000Z",
"completion_date": "2024-03-15T09:00:00.000000Z",
"documents": {
"invoice": "https://app.elitedomains.de/example.de/invoice/MTIz/9b1f2c3a-...",
"provision": "https://app.elitedomains.de/example.de/provision/MTIz/9b1f2c3a-..."
}
}
]
}