DNS-API: Domains und Kontakte
Diese Seite beschreibt die Endpunkte für Domains und Kontakte (Handles). Grundlagen wie Basis-URL, Authentifizierung und Fehlerformat findest du im API-Überblick. Domain-Endpunkte erfordern einen Token mit Zugriff auf den Bereich Domains, Kontakt-Endpunkte Zugriff auf den Bereich Kontakte.
Die Beispiele verwenden folgende Variablen:
export XCLOUD_DNS_TOKEN='xcdns_...'
export XCLOUD_DNS_API='https://app.xcloud.eu/api/dns/v1'
Kontakte (Handles)
Kontakte enthalten die Inhaber- und Kontaktdaten, die bei der Registry für eine Domain hinterlegt sind. Eine Domain verweist auf Kontakte in vier Rollen: Inhaber, Admin-Kontakt, technischer Kontakt und Zonenverwalter (siehe Kontakte im Benutzerhandbuch).
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/handles |
Alle Kontakte auflisten |
GET |
/handles/{id} |
Einen Kontakt anzeigen |
POST |
/handles |
Einen Kontakt anlegen |
PATCH |
/handles/{id} |
Einen Kontakt ändern |
DELETE |
/handles/{id} |
Einen Kontakt löschen |
Attribute eines Kontakts
| Attribut | Pflicht | Beschreibung |
|---|---|---|
firstname |
ja | Vorname |
lastname |
ja | Nachname |
company |
nein | Organisation (Firma, Verein oder Behörde) |
street |
ja | Straße und Hausnummer |
pcode |
ja | Postleitzahl |
city |
ja | Ort |
country |
ja | Zweistelliger Ländercode (ISO 3166-1), z. B. DE |
phone |
ja | Telefonnummer im Format +49 421 000000 |
fax |
nein | Faxnummer, gleiches Format wie phone |
email |
ja | E-Mail-Adresse |
Antworten enthalten zusätzlich:
| Attribut | Beschreibung |
|---|---|
id |
ID des Kontakts |
registrar_handle |
Referenz des Kontakts bei der Registry |
in_use |
Ob eine Domain den Kontakt verwendet |
created_at |
Zeitpunkt der Erstellung |
Telefon- und Faxnummern müssen das Format +<Ländervorwahl> <Ortsvorwahl> <Rufnummer>
haben, getrennt durch einzelne Leerzeichen. Andere Formate lehnt die Registry ab.
Alle Kontakte abrufen:
curl "$XCLOUD_DNS_API/handles" \
-H "Authorization: Bearer $XCLOUD_DNS_TOKEN"
{
"data": [
{
"id": "3f1e2d4c-5b6a-4789-8a0b-1c2d3e4f5a61",
"registrar_handle": "MM12345-XCLOUD",
"firstname": "Max",
"lastname": "Muster",
"company": "Example GmbH",
"street": "Musterstr. 1",
"pcode": "28217",
"city": "Bremen",
"country": "DE",
"phone": "+49 421 000000",
"fax": "",
"email": "domains@example.com",
"in_use": true,
"created_at": "2026-09-14T10:12:48+02:00"
}
]
}
Ohne Wert kommen company und fax in Antworten als leerer String.
Kontakt anlegen
POST /handles legt einen Kontakt an und übermittelt ihn an die Registry:
curl -X POST "$XCLOUD_DNS_API/handles" \
-H "Authorization: Bearer $XCLOUD_DNS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"handle": {
"firstname": "Max",
"lastname": "Muster",
"company": "Example GmbH",
"street": "Musterstr. 1",
"pcode": "28217",
"city": "Bremen",
"country": "DE",
"phone": "+49 421 000000",
"email": "domains@example.com"
}
}'
Die Antwort enthält den angelegten Kontakt in data; du kannst ihn sofort einer Domain
zuweisen. Lehnt die Registry die Daten ab, schlägt die Anfrage mit 422 fehl.
Kontakt ändern
PATCH /handles/{id} ändert die angegebenen Attribute; Attribute, die du weglässt,
bleiben unverändert. Solange eine Domain den Kontakt verwendet (in_use: true), lassen
sich firstname, lastname und company nicht ändern; die Anfrage schlägt dann mit
422 fehl. Um den Inhaber einer Domain zu wechseln, legst du einen neuen Kontakt an und
weist ihn der Domain zu (siehe Domain ändern).
Kontakt löschen
DELETE /handles/{id} entfernt den Kontakt aus deinem Projekt. Einen Kontakt, den eine
Domain noch verwendet, kannst du nicht löschen (422).
Domains
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/domains |
Alle Domains auflisten |
GET |
/domains/{id} |
Eine Domain anzeigen |
POST |
/domains/check |
Prüfen, ob eine Domain verfügbar ist |
POST |
/domains |
Eine Domain registrieren |
POST |
/domains/transfer |
Domains zu xCloud transferieren |
PATCH |
/domains/{id} |
Kontakte oder Nameserver ändern |
DELETE |
/domains/{id} |
Eine Domain kündigen |
POST |
/domains/{id}/auto_renew |
Auto-Renew einschalten (Kündigung zurücknehmen) |
DELETE |
/domains/{id}/auto_renew |
Auto-Renew ausschalten (kündigen) |
POST |
/domains/bulk_auto_renew |
Auto-Renew für mehrere Domains einschalten |
DELETE |
/domains/bulk_auto_renew |
Auto-Renew für mehrere Domains ausschalten |
POST |
/domains/bulk_destroy |
Mehrere Domains kündigen |
POST |
/domains/{id}/transfer_lock |
Den Transfer-Lock setzen |
DELETE |
/domains/{id}/transfer_lock |
Den Transfer-Lock entfernen |
POST |
/domains/{id}/auth_code |
Den Auth-Code für einen Wegzug abrufen |
Attribute einer Domain
| Attribut | Beschreibung |
|---|---|
id |
ID der Domain |
name |
Domainname, z. B. example.com |
state |
Zustand der Domain, siehe unten |
state_detail |
Zusätzliche Informationen zum Zustand, z. B. ein Fehler, oder null |
order_number |
Auftragsnummer bei der Registry oder null |
nameserver_mode |
zone oder custom, siehe unten |
nameservers |
Die eigenen Nameserver der Domain im Modus custom |
zone_id |
ID der verknüpften xCloud-Zone oder null |
owner_handle |
Inhaber: Objekt mit id, registrar_handle und label |
admin_handle |
Admin-Kontakt, gleiche Struktur |
tech_handle |
Technischer Kontakt, gleiche Struktur |
zone_handle |
Zonenverwalter, gleiche Struktur |
registered_at |
Zeitpunkt der Registrierung oder null |
paid_until |
Ende der bezahlten Laufzeit oder null |
auto_renew |
true, solange keine Kündigung vorgemerkt ist |
to_be_deleted_date |
Datum, an dem die gekündigte Domain freigegeben wird, oder null |
transfer_lock |
Ob der Transfer-Lock gesetzt ist; null, solange das unbekannt ist |
lock_synced_at |
Zeitpunkt des letzten Abgleichs des Transfer-Locks oder null |
created_at |
Zeitpunkt der Erstellung |
Eine Domain abrufen (GET /domains liefert alle Domains in derselben Form):
curl "$XCLOUD_DNS_API/domains/$DOMAIN_ID" \
-H "Authorization: Bearer $XCLOUD_DNS_TOKEN"
{
"data": {
"id": "1d2e3f4a-5b6c-4d7e-8f9a-0b1c2d3e4f51",
"name": "example.com",
"state": "registered",
"state_detail": null,
"order_number": "4711",
"nameserver_mode": "zone",
"nameservers": [],
"zone_id": "0b7c4f0e-2a51-4c4e-9a7f-5d3c1e8b9f10",
"owner_handle": {
"id": "3f1e2d4c-5b6a-4789-8a0b-1c2d3e4f5a61",
"registrar_handle": "MM12345-XCLOUD",
"label": "Example GmbH"
},
"admin_handle": {
"id": "3f1e2d4c-5b6a-4789-8a0b-1c2d3e4f5a61",
"registrar_handle": "MM12345-XCLOUD",
"label": "Example GmbH"
},
"tech_handle": {
"id": "7c8d9e0f-1a2b-4c3d-8e4f-5a6b7c8d9e02",
"registrar_handle": "EM67890-XCLOUD",
"label": "Erika Mustermann"
},
"zone_handle": {
"id": "3f1e2d4c-5b6a-4789-8a0b-1c2d3e4f5a61",
"registrar_handle": "MM12345-XCLOUD",
"label": "Example GmbH"
},
"registered_at": "2026-09-14T10:31:22+02:00",
"paid_until": "2027-09-14",
"auto_renew": true,
"to_be_deleted_date": null,
"transfer_lock": true,
"lock_synced_at": "2026-10-20T03:30:41+02:00",
"created_at": "2026-09-14T10:29:05+02:00"
}
}
label ist der Name der Organisation oder, ohne Organisation, Vor- und Nachname.
Das Attribut state zeigt den Fortschritt von Bestellungen und Änderungen:
| Zustand | Bedeutung |
|---|---|
ordering |
Die Registrierung ist bestellt und läuft |
transfer_pending |
Der Transfer zu xCloud läuft |
registered |
Die Domain ist aktiv |
update_pending |
Eine Änderung von Kontakten oder Nameservern läuft |
deleting |
Die Domain wird gelöscht |
deleted |
Die Domain wurde freigegeben |
failed |
Die Registry hat Bestellung oder Änderung abgelehnt, siehe state_detail |
Nameserver-Modus
Beim Registrieren, Transferieren oder Ändern einer Domain legt nameserver_mode fest,
welche Nameserver die Registry für die Domain einträgt:
zone: Die Domain nutzt die Nameserver ihrer xCloud-Zone. Schick beim Registrieren oder Transferieren zusätzlich"create_zone": truemit: xCloud legt dann eine Zone mit dem Domainnamen an oder verknüpft eine bereits vorhandene gleichnamige Zone in deinem Projekt.custom: Die Domain nutzt deine eigenen Nameserver. Gib innameserversmindestens zwei Hostnamen an.
Verfügbarkeit prüfen
POST /domains/check prüft, ob sich eine Domain registrieren lässt. Der Name wird ohne
äußeres Objekt geschickt:
curl -X POST "$XCLOUD_DNS_API/domains/check" \
-H "Authorization: Bearer $XCLOUD_DNS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "example.com"}'
Die Antwort enthält name, available (true oder false) und den von der Registry
gemeldeten status. Ergebnisse werden kurz zwischengespeichert.
Domain registrieren
POST /domains bestellt eine Domain bei der Registry.
| Attribut | Pflicht | Beschreibung |
|---|---|---|
name |
ja | Domainname |
owner_handle_id |
ja | ID des Inhaber-Kontakts |
admin_handle_id |
nein | ID des Admin-Kontakts; Standard: der Inhaber |
tech_handle_id |
nein | ID des technischen Kontakts; Standard: der Inhaber |
zone_handle_id |
nein | ID des Zonenverwalters; Standard: der Inhaber |
nameserver_mode |
ja | zone oder custom, siehe oben |
nameservers |
bei custom |
Mindestens zwei Nameserver-Hostnamen |
create_zone |
nein | true legt die xCloud-Zone der Domain an oder verknüpft sie |
Eine Domain mit eigener xCloud-Zone und einem separaten technischen Kontakt registrieren:
curl -X POST "$XCLOUD_DNS_API/domains" \
-H "Authorization: Bearer $XCLOUD_DNS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"domain": {
"name": "example.com",
"owner_handle_id": "3f1e2d4c-5b6a-4789-8a0b-1c2d3e4f5a61",
"tech_handle_id": "7c8d9e0f-1a2b-4c3d-8e4f-5a6b7c8d9e02",
"nameserver_mode": "zone",
"create_zone": true
}
}'
Die Bestellung läuft im Hintergrund: Die Antwort zeigt die Domain im Zustand ordering.
Sobald die Registry die Registrierung bestätigt hat, wechselt der Zustand zu
registered; lehnt die Registry sie ab, zu failed. Mit create_zone enthält zone_id
bereits die ID der neuen oder verknüpften Zone, in der du sofort Records anlegen kannst.
Domains transferieren
POST /domains/transfer transferiert eine oder mehrere Domains von einem anderen
Anbieter zu xCloud. Für jede Domain brauchst du den Auth-Code des bisherigen Anbieters;
der Transfer-Lock muss dort entfernt sein. Die Attribute sind dieselben wie bei einer
Registrierung, aber statt name schickst du eine Liste transfers mit name und
auth_code pro Domain, höchstens 40 Domains pro Anfrage. Kontakte und
Nameserver-Einstellungen gelten für alle Domains der Anfrage.
Zwei Domains transferieren, die weiterhin ihre eigenen Nameserver nutzen:
curl -X POST "$XCLOUD_DNS_API/domains/transfer" \
-H "Authorization: Bearer $XCLOUD_DNS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"domain": {
"transfers": [
{ "name": "example.com", "auth_code": "Xy7#kL9!pQ2r" },
{ "name": "example.net", "auth_code": "Ab3$dE6&fG8h" }
],
"owner_handle_id": "3f1e2d4c-5b6a-4789-8a0b-1c2d3e4f5a61",
"nameserver_mode": "custom",
"nameservers": ["ns1.example.org", "ns2.example.org"]
}
}'
Eine Transfer-Anfrage gilt ganz oder gar nicht: Ist eine einzige Domain ungültig, wird
kein Transfer gestartet und die Anfrage schlägt mit 422 fehl. Die Fehlermeldungen
nennen die betroffene Domain, sodass du die Anfrage korrigieren und als Ganzes erneut
schicken kannst. Bei Erfolg listet die Antwort alle Domains im Zustand
transfer_pending.
Domain ändern
PATCH /domains/{id} ändert die Kontakte oder Nameserver einer registrierten Domain. Du
kannst die Attribute owner_handle_id, admin_handle_id, tech_handle_id,
zone_handle_id, nameserver_mode und nameservers schicken; Attribute, die du
weglässt, bleiben unverändert. Eine Rolle lässt sich nicht auf „Wie Inhaber“
zurücksetzen; weise stattdessen ausdrücklich die Kontakt-ID des Inhabers zu.
Eine Domain auf eigene Nameserver umstellen:
curl -X PATCH "$XCLOUD_DNS_API/domains/$DOMAIN_ID" \
-H "Authorization: Bearer $XCLOUD_DNS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"domain": {
"nameserver_mode": "custom",
"nameservers": ["ns1.example.org", "ns2.example.org"]
}
}'
Die Änderung läuft im Hintergrund (Zustand update_pending). Änderungen sind nur im
Zustand registered möglich; sonst schlägt die Anfrage mit 422 fehl. Ein
Inhaberwechsel löst je nach TLD einen Owner-Change aus, der erneut bestätigt werden muss.
Domain kündigen und Auto-Renew
Domains verlängern sich automatisch, solange auto_renew true ist. DELETE
/domains/{id} kündigt eine Domain zum Ende ihrer bezahlten Laufzeit, genau wie DELETE
/domains/{id}/auto_renew. Beide liefern die geänderte Domain in data:
- Die Domain bleibt bis
paid_untilim Zustandregisteredund nutzbar.to_be_deleted_datezeigt das Datum, an dem sie freigegeben wird, undauto_renewwirdfalse. POST /domains/{id}/auto_renewnimmt die Kündigung zurück. In den letzten fünf Tagen vorto_be_deleted_dateist das nicht mehr möglich (422).- Eine Domain im Zustand
failed(eine abgelehnte Bestellung) wird durchDELETE /domains/{id}sofort gelöscht.
Ist das Laufzeitende noch nicht bekannt (paid_until ist null), wird die Kündigung mit
422 abgelehnt; versuch es später erneut.
Sammelaktionen
Drei Endpunkte wirken auf mehrere Domains gleichzeitig, höchstens 40 pro Anfrage:
POST /domains/bulk_destroykündigt die Domains (wieDELETE /domains/{id})DELETE /domains/bulk_auto_renewschaltet Auto-Renew ausPOST /domains/bulk_auto_renewschaltet Auto-Renew wieder ein
Alle drei nehmen denselben Body an:
curl -X POST "$XCLOUD_DNS_API/domains/bulk_destroy" \
-H "Authorization: Bearer $XCLOUD_DNS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"domain": {
"ids": [
"1d2e3f4a-5b6c-4d7e-8f9a-0b1c2d3e4f51",
"6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c92"
]
}
}'
Zuerst prüft xCloud, ob die Aktion für jede Domain möglich ist. Ist sie auch nur für eine
Domain nicht möglich, wird nichts ausgeführt und die Anfrage schlägt mit 422 fehl,
wobei die betroffenen Domains aufgeführt werden. Andernfalls wird die Aktion für jede
Domain einzeln ausgeführt. Die Antwort enthält die Domains in data und in errors die
Domains, für die die Registry die Aktion abgelehnt hat, mit name und message:
{
"data": [ { "id": "1d2e3f4a-...", "name": "example.com", "...": "..." } ],
"errors": [ { "name": "example.net", "message": "..." } ]
}
Transfer-Lock
POST /domains/{id}/transfer_lock setzt den Transfer-Lock bei der Registry, DELETE
/domains/{id}/transfer_lock entfernt ihn. Solange der Lock gesetzt ist, kann die Domain
nicht zu einem anderen Anbieter transferiert werden. Beide Anfragen wirken sofort und
sind nur für Domains im Zustand registered möglich.
Auth-Code
POST /domains/{id}/auth_code liefert den Auth-Code, den du für den Transfer der Domain
zu einem anderen Anbieter brauchst:
{ "data": { "auth_code": "..." } }
Bei .de-Domains erzeugt jede Anfrage einen neuen Auth-Code. Die Anfrage ist nur für
Domains im Zustand registered möglich. Gib den Auth-Code nur an deinen neuen Anbieter
weiter und entferne vor dem Transfer den Transfer-Lock.