# DNSHE-Domain-API-Referenz
English · 简体中文 · 繁體中文 · 日本語 · Русский · Bahasa Indonesia · Deutsch · Français · 한국어 · العربية
[Zurück zur Einführung](../README_DE.md) Registrieren Sie Domains, verwalten Sie DNS, aktualisieren Sie dynamische IPs und automatisieren Sie Kontoabläufe. Die Beispiele verwenden den DNSHE-API-Host und Platzhalter. Ersetzen Sie Namen, IDs und Zugangsdaten durch eigene Ressourcen. ## Inhalt - [Erste Schritte](#erste-schritte) - [Authentifizierung und Anfragekonventionen](#authentifizierung-und-anfragekonventionen) - [Domainverwaltung](#domainverwaltung) - [Verwaltung von DNS-Einträgen](#verwaltung-von-dns-einträgen) - [Dynamisches DNS (DDNS)](#dynamisches-dns-ddns) - [API-Schlüsselverwaltung](#api-schlüsselverwaltung) - [Domainübertragungen](#domainübertragungen) - [Kontingente](#kontingente) - [WHOIS](#whois) - [Fehler und Anfragelimits](#fehler-und-anfragelimits) - [Clientbeispiele](#clientbeispiele) - [Sicherheit und häufige Fragen](#sicherheit-und-häufige-fragen) - [Support](#support) ## Erste Schritte ```text https://api005.dnshe.com/index.php?m=domain_hub ``` Die Basis-URL enthält bereits `m=domain_hub`; ergänzen Sie Parameter mit `&`. Anfragen und Antworten verwenden JSON, außer GET-Abfrageparametern. Das allgemeine Limit beträgt standardmäßig 60 Anfragen/Minute und ist konfigurierbar. Funktionen hängen von Konto und Installation ab. Die Shellbeispiele verwenden Bash/sh; setzen Sie zuerst diese Umgebungsvariablen. ```bash export DNSHE_API_KEY='replace-with-your-api-key' export DNSHE_API_SECRET='replace-with-your-api-secret' export DNSHE_DDNS_TOKEN='replace-with-your-ddns-token' ``` ## Authentifizierung und Anfragekonventionen Erstellen Sie den ersten Schlüssel im Kundenbereich → [Domains verwalten](https://my.dnshe.com/index.php?m=domain_hub) → API-Verwaltung. Verwenden Sie `X-API-Key` und `X-API-Secret` als Header; Zugangsdaten in URL oder Anfragekörper sind deaktiviert. GET-Parameter gehören in die Abfrage, Schreibparameter in JSON mit `Content-Type: application/json`. `endpoint` bestimmt die Ressource, `action` die Operation. `quota` und `whois` benötigen kein `action`. DDNS verwendet ein separates Token. ## Domainverwaltung ### 1.1 Domains auflisten `GET` · `endpoint=subdomains` · `action=list` #### Parameter - `page` — `integer`; optional; Standard / Bereich: `1`. - `cursor_id` — `integer`; optional. - `per_page` — `integer`; optional; Standard / Bereich: `200; 1–500`. - `include_total` — `boolean`; optional; Standard / Bereich: `false`. - `search` — `string`; optional. - `rootdomain` — `string`; optional. - `status` — `string`; optional; Standard / Bereich: `active | suspended | expired`. - `created_from / created_to` — `string`; optional; Standard / Bereich: `YYYY-MM-DD`. - `sort_by` — `string`; optional; Standard / Bereich: `id`. - `sort_dir` — `string`; optional; Standard / Bereich: `desc; asc | desc`. - `fields` — `string`; optional; Standard / Bereich: `all`. `page` ist eine kompatible Seitennummer ab 1. Beginnen Sie bei großen Listen mit `cursor_id=0`; verwenden Sie anschließend `pagination.next_cursor_id`, solange `pagination.has_more=true`, und stoppen Sie bei false. Der Cursormodus sortiert nach ID ohne OFFSET. `per_page`: Standard 200, Maximum 500, Einstieg 50–100. `include_total=1` ergänzt eine möglicherweise teure Gesamtzählung. `search` sucht Präfix oder Stammdomain; `rootdomain`, `status`, `created_from`, `created_to` filtern. Datumsformat: YYYY-MM-DD. `sort_by`: `id`, `created_at`, `updated_at`, `expires_at`, `subdomain`; `sort_dir`: `asc` oder `desc`. `fields` ist eine kommaseparierte Auswahl oder `all`: `id`, `subdomain`, `rootdomain`, `full_domain`, `status`, `created_at`, `updated_at`, `expires_at`, `never_expires`, `cloudflare_zone_id`, `provider_account_id`. Eine Auswahl enthält immer `id`. `count` bezeichnet die zurückgegebene Sammlung, nicht zwingend alle Treffer. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=list" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=list&cursor_id=0&per_page=100&fields=id,subdomain,rootdomain,status" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=list&search=test&rootdomain=de5.net&status=active&sort_by=expires_at&sort_dir=asc&per_page=50" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` #### Antwortbeispiele ```json { "success": true, "count": 2, "subdomains": [ { "id": 1, "subdomain": "test", "rootdomain": "de5.net", "full_domain": "test.de5.net", "status": "active", "created_at": "2025-10-19 10:00:00", "updated_at": "2025-10-19 10:00:00" }, { "id": 2, "subdomain": "api", "rootdomain": "de5.net", "full_domain": "api.de5.net", "status": "active", "created_at": "2025-10-19 11:00:00", "updated_at": "2025-10-19 11:00:00" } ] } ``` ```json { "success": true, "count": 1, "subdomains": [ { "id": 901, "subdomain": "test", "rootdomain": "de5.net", "full_domain": "test.de5.net", "status": "active" } ], "pagination": { "mode": "cursor", "page": 1, "per_page": 100, "has_more": true, "cursor_id": 0, "next_cursor_id": 901 } } ``` ### 1.2 Domain registrieren `POST` · `endpoint=subdomains` · `action=create` #### Parameter - `subdomain` — `string`; erforderlich. - `domain` — `string`; erforderlich. `subdomain` ist das Präfix, etwa `myapp`; `domain` die verfügbare Stammdomain, etwa `de5.net`. Registrieren Sie mit `action=create` und `domain`. Das Antwortfeld und der Listenfilter `rootdomain` sind keine Registrierungsfelder. Verfügbarkeit und Kontingente gelten weiterhin. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=create" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "subdomain": "myapp", "domain": "de5.net" }' ``` #### Antwortbeispiele ```json { "success": true, "message": "Subdomain registered successfully", "subdomain_id": 3, "full_domain": "myapp.de5.net" } ``` ### 1.3 Domaindetails abrufen `GET` · `endpoint=subdomains` · `action=get` #### Parameter - `subdomain_id` — `integer`; erforderlich. Verwenden Sie eine Domain-ID des authentifizierten Kontos. Die Antwort enthält Domainobjekt, `dns_records` und `dns_count`. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=get&subdomain_id=1" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` #### Antwortbeispiele ```json { "success": true, "subdomain": { "id": 1, "subdomain": "test", "rootdomain": "de5.net", "full_domain": "test.de5.net", "status": "active", "created_at": "2025-10-19 10:00:00", "updated_at": "2025-10-19 10:00:00" }, "dns_records": [ { "id": 1, "name": "test.de5.net", "type": "A", "content": "203.0.113.10", "ttl": 600, "priority": null, "status": "active", "created_at": "2025-10-19 10:05:00" } ], "dns_count": 1 } ``` ### 1.4 Domain löschen `POST / DELETE` · `endpoint=subdomains` · `action=delete` #### Parameter - `subdomain_id` — `integer`; erforderlich. Löscht die eigene Domain samt zugehörigen DNS-Einträgen. `dns_records_deleted` meldet die Anzahl. Prüfen Sie die Ziel-ID vor dem Senden. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=delete" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "subdomain_id": 1 }' ``` #### Antwortbeispiele ```json { "success": true, "message": "Subdomain deleted successfully", "subdomain_id": 1, "full_domain": "test.de5.net", "dns_records_deleted": 4 } ``` ### 1.5 Domain verlängern `POST / PUT` · `endpoint=subdomains` · `action=renew` #### Parameter - `subdomain_id` — `integer`; erforderlich. Die normale kostenlose DNSHE-Verlängerung bleibt kostenlos; das Beispiel hat `charged_amount=0`. Das allgemeine Plugin erlaubt kostenpflichtige Wiederherstellung. Prüfen Sie in dieser Phase Zustand und Konsolenregeln. Lesen Sie `previous_expires_at`, `new_expires_at`, `never_expires`, `remaining_days`, `charged_amount` aus der tatsächlichen Antwort. Verlängerungsfehler: HTTP 403 `renewal disabled`, `redemption period requires administrator`, `renewal window expired`; HTTP 422 `renewal_not_yet_available`; HTTP 402 `insufficient balance for redemption renewal`; HTTP 404 bei fehlender oder fremder Domain. Prüfen Sie das Zeitfenster oder kontaktieren Sie den Support; vermeiden Sie ununterbrochene Wiederholungen. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=renew" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "subdomain_id": 3 }' ``` #### Antwortbeispiele ```json { "success": true, "message": "Subdomain renewed successfully", "subdomain_id": 3, "subdomain": "myapp", "previous_expires_at": "2027-05-01 00:00:00", "new_expires_at": "2028-05-01 00:00:00", "renewed_at": "2027-04-30 00:00:00", "never_expires": 0, "status": "active", "remaining_days": 367, "charged_amount": 0 } ``` ## Verwaltung von DNS-Einträgen ### 2.1 DNS-Einträge auflisten `GET` · `endpoint=dns_records` · `action=list` #### Parameter - `subdomain_id` — `integer`; erforderlich. Bevorzugen Sie die Modul-`id` aus Liste/Erstellung; neue öffentliche IDs haben 15 Stellen. `record_id` bezeichnet den DNS-Anbietereintrag. Ändern/Löschen benötigt mindestens eine Kennung; beide müssen denselben Eintrag bezeichnen, sonst `dns_record_identifier_mismatch`. Alte interne IDs bleiben kompatibel. Numerische `record_id` sind laut Referenz mindestens bis 2027-06-12 kompatibel; neue Clients senden Modul-IDs in `id`. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=list&subdomain_id=1" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` #### Antwortbeispiele ```json { "success": true, "count": 2, "records": [ { "id": 1, "record_id": "5a0ce6c4d1d4c71bc5e60a2a2a0e4997", "name": "test.de5.net", "type": "A", "content": "203.0.113.10", "ttl": 600, "priority": null, "line": null, "proxied": false, "status": "active", "created_at": "2025-10-19 10:05:00", "updated_at": "2025-10-19 10:05:00" }, { "id": 2, "name": "www.test.de5.net", "type": "CNAME", "content": "test.de5.net", "ttl": 600, "priority": null, "proxied": false, "status": "active", "created_at": "2025-10-19 10:10:00" } ] } ``` ### 2.2 DNS-Eintrag erstellen `POST` · `endpoint=dns_records` · `action=create` #### Parameter - `subdomain_id` — `integer`; erforderlich. - `type` — `string`; erforderlich. - `name` — `string`; optional; Standard / Bereich: `@`. - `content` — `string`; optional. - `ttl` — `integer`; optional; Standard / Bereich: `600`. - `priority` — `integer`; optional; Standard / Bereich: `MX: 10; SRV: 0`. - `line` — `string`; optional. - `record_weight / weight` — `integer`; optional. - `record_port / port` — `integer`; optional; Standard / Bereich: `1–65535`. - `record_target / target` — `string`; optional. - `caa_flag` — `integer`; optional; Standard / Bereich: `0; 0–255`. - `caa_tag` — `string`; optional; Standard / Bereich: `issue; 1–15 [A-Za-z0-9]`. - `caa_value` — `string`; optional. `type` unterstützt A, AAAA, CNAME, MX, TXT, NS, SRV, CAA. `name` ist relativ zur registrierten Domain; fehlend, leer oder `@` bedeutet die Domain selbst. Vollständige Domainnamen werden abgelehnt; `*` ist nur im äußersten linken Label erlaubt. `content` ist erforderlich, außer bei Aufbau aus strukturierten SRV/CAA-Parametern. Standard: `ttl` 600 Sekunden, `priority` 10 für MX und 0 für SRV. SRV verwendet `record_weight`/`weight`, `record_port`/`port` (1–65535), `record_target`/`target`; Ziel `.` bedeutet nicht verfügbar. CAA: `caa_flag` (0–255, Standard 0), `caa_tag` (1–15 alphanumerische Zeichen, Standard `issue`), `caa_value`. `line` gilt nur für AliDNS; andere Anbieter lehnen nicht leere Werte ab. NS-Schreibzugriffe können durch `disable_ns_management` deaktiviert sein. Nach externer DNS-Delegation werden Erstellung/Änderung von Nicht-NS-Einträgen mit `external_dns_delegated` abgelehnt. Löschen alter Einträge, Abgleich und Ablaufbereinigung bleiben möglich. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=create" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "subdomain_id": 1, "type": "A", "content": "203.0.113.10", "ttl": 600 }' ``` #### Antwortbeispiele ```json { "success": true, "message": "DNS record created successfully", "id": 738492016583241, "record_id": "5a0ce6c4d1d4c71bc5e60a2a2a0e4997" } ``` ### 2.3 DNS-Eintrag ändern `POST / PUT / PATCH` · `endpoint=dns_records` · `action=modify` #### Parameter - `id` — `integer`; optional. - `record_id` — `string`; optional. - `type / name / content` — `string`; optional. - `ttl / priority` — `integer`; optional. - `line` — `string`; optional. - `record_weight / weight` — `integer`; optional. - `record_port / port` — `integer`; optional. - `record_target / target` — `string`; optional. - `caa_flag` — `integer`; optional. - `caa_tag / caa_value` — `string`; optional. Senden Sie `id` oder `record_id` sowie zu ändernde Felder. Namensregeln und SRV/CAA-Optionen entsprechen der Erstellung. Beide Kennungen müssen denselben Eintrag bezeichnen. Die Antwort liefert Modul- und Anbieter-ID. Bevorzugen Sie die Modul-`id` aus Liste/Erstellung; neue öffentliche IDs haben 15 Stellen. `record_id` bezeichnet den DNS-Anbietereintrag. Ändern/Löschen benötigt mindestens eine Kennung; beide müssen denselben Eintrag bezeichnen, sonst `dns_record_identifier_mismatch`. Alte interne IDs bleiben kompatibel. Numerische `record_id` sind laut Referenz mindestens bis 2027-06-12 kompatibel; neue Clients senden Modul-IDs in `id`. NS-Schreibzugriffe können durch `disable_ns_management` deaktiviert sein. Nach externer DNS-Delegation werden Erstellung/Änderung von Nicht-NS-Einträgen mit `external_dns_delegated` abgelehnt. Löschen alter Einträge, Abgleich und Ablaufbereinigung bleiben möglich. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=modify" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "id": 738492016583241, "type": "A", "content": "203.0.113.20", "ttl": 600 }' ``` #### Antwortbeispiele ```json { "success": true, "message": "DNS record updated successfully", "id": 738492016583241, "record_id": "5a0ce6c4d1d4c71bc5e60a2a2a0e4997" } ``` ### 2.4 DNS-Eintrag löschen `POST / DELETE` · `endpoint=dns_records` · `action=delete` #### Parameter - `id` — `integer`; optional. - `record_id` — `string`; optional. Bevorzugen Sie die Modul-`id` aus Liste/Erstellung; neue öffentliche IDs haben 15 Stellen. `record_id` bezeichnet den DNS-Anbietereintrag. Ändern/Löschen benötigt mindestens eine Kennung; beide müssen denselben Eintrag bezeichnen, sonst `dns_record_identifier_mismatch`. Alte interne IDs bleiben kompatibel. Numerische `record_id` sind laut Referenz mindestens bis 2027-06-12 kompatibel; neue Clients senden Modul-IDs in `id`. #### Anfragebeispiele ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=delete" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "id": 1 }' ``` ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=delete" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "record_id": "5a0ce6c4d1d4c71bc5e60a2a2a0e4997" }' ``` #### Antwortbeispiele ```json { "success": true, "message": "DNS record deleted successfully" } ``` ## Dynamisches DNS (DDNS) `GET / POST / PUT` · `endpoint=ddns` · `action=update` Erstellen Sie unter Domainverwaltung → DDNS ein Token für einen bestimmten A/AAAA-Eintrag. Senden Sie `Authorization: Bearer