{"data":{"external_id":3574,"slug":"dns-records-per-api-verwalten","title":"DNS-Records per API verwalten","content":"So liest, setzt und pflegst du DNS-Eintr\u00e4ge per API. Im Mittelpunkt steht der Upsert, mit dem du einen Record in einem einzigen Aufruf anlegst oder aktualisierst. Am Ende steht ein fertiges DynDNS-Skript zum Kopieren.\nRecords auflisten und einzeln pflegen\nUpsert: anlegen oder aktualisieren in einem Schritt\nGanze Zonen exportieren und importieren\nIn allen Beispielen steht deine-domain.de f\u00fcr deine Domain und sk_live_XXXX f\u00fcr deinen Token. Als IDs kannst du \u00fcberall die Domain oder ihre numerische ID verwenden.\nRecords auflisten\ncurl --request GET \\\n  --url https:\/\/api.pph.systems\/api\/domains\/deine-domain.de\/records \\\n  --header 'Accept: application\/json' \\\n  --header 'Authorization: Bearer sk_live_XXXX'\nJeder Record kommt mit id, name, full_name, type, content, ttl und priority. Wichtig ist das Feld editable. Systemrecords wie NS und SOA stehen zwar in der Liste, sind aber nicht editierbar.\n{\n  \"data\": {\n    \"domain\": \"deine-domain.de\",\n    \"records\": &#91;\n      {\n        \"id\": 101,\n        \"name\": \"www\",\n        \"full_name\": \"www.deine-domain.de\",\n        \"type\": \"A\",\n        \"content\": \"192.0.2.1\",\n        \"ttl\": 300,\n        \"editable\": true,\n        \"priority\": null\n      }\n    ],\n    \"total\": 1\n  }\n}\nMit dem Parameter name filterst du auf einen bestimmten Recordnamen, mit editable=true blendest du die Systemrecords aus.\nUpsert: anlegen oder aktualisieren\nDer Upsert ist das n\u00fctzlichste Werkzeug f\u00fcr Automatisierung. Du gibst Name, Typ und Wert an. Existiert bereits ein Record mit diesem Namen und Typ, wird er aktualisiert. Wenn nicht, wird er angelegt. Du musst also vorher nicht pr\u00fcfen, ob der Record schon da ist.\ncurl --request PATCH \\\n  --url https:\/\/api.pph.systems\/api\/domains\/deine-domain.de\/record\/upsert \\\n  --header 'Accept: application\/json' \\\n  --header 'Authorization: Bearer sk_live_XXXX' \\\n  --header 'Content-Type: application\/json' \\\n  --data '{ \"record_name\": \"home\", \"record_type\": \"A\", \"record_content\": \"192.0.2.10\" }'\nBeim ersten Aufruf wird der Record angelegt:\n{\n  \"data\": { \"updated\": &#91; { \"id\": 456439, \"type\": \"A\", \"content\": \"192.0.2.10\", \"ttl\": 43200 } ] },\n  \"message\": \"DNS record created successfully.\"\n}\nRufst du dieselbe Kombination aus Name und Typ mit einem neuen Wert erneut auf, bleibt die id gleich und nur der Inhalt \u00e4ndert sich. Der Text in message wechselt auf \u201eupdated\u201c:\n{\n  \"data\": { \"updated\": &#91; { \"id\": 456439, \"type\": \"A\", \"content\": \"192.0.2.20\", \"ttl\": 43200 } ] },\n  \"message\": \"DNS record(s) updated successfully.\"\n}\nOptional kannst du record_ttl mitgeben, und bei MX&#8211; oder SRV-Records record_prio.\nEinzelne Records gezielt bearbeiten\nWenn du einen bestimmten Record \u00fcber seine ID ansprechen willst, gibt es drei weitere Routen:\nAnlegen: POST \/domains\/deine-domain.de\/records. Mit replace_existing=true ersetzt du einen gleichnamigen Record, statt einen Fehler zu bekommen.\n\u00c4ndern: \u00dcber die Record-ID \u00e4nderst du gezielt Wert, Name, Typ, TTL oder Priorit\u00e4t eines einzelnen Records.\nL\u00f6schen: \u00dcber die Record-ID entfernst du einen einzelnen Record.\nF\u00fcr die meisten Automatisierungen reicht der Upsert. Die ID-basierten Routen brauchst du, wenn du mehrere gleichnamige Records desselben Typs getrennt verwalten musst.\nDie ganze Zone exportieren\nF\u00fcr Backups, Versionierung oder eine Migration exportierst du die komplette Zone als BIND-Zonefile.\ncurl --request GET \\\n  --url https:\/\/api.pph.systems\/api\/domains\/deine-domain.de\/records\/export \\\n  --header 'Accept: text\/plain' \\\n  --header 'Authorization: Bearer sk_live_XXXX'\nDu erh\u00e4ltst ein Standard-Zonefile. Jeder Eintrag ist mit seiner Record-ID als Kommentar versehen.\n$ORIGIN deine-domain.de.\n$TTL 300\n; #101\nwww\tIN\tA\t192.0.2.1\n; #102\n@\tIN\tMX\t10 mail.deine-domain.de.\n; #103\n@\tIN\tTXT\t\"v=spf1 mx -all\"\nOhne den Header Accept: text\/plain bekommst du dieselbe Zone als JSON zur\u00fcck.\nEine ganze Zone importieren\nMit dem Import spielst du eine komplette Zone aus einem Zonefile ein. Achtung: Der Import ist ein vollst\u00e4ndiger Ersatz. Records, die nicht im Zonefile stehen, werden entfernt.\nDeshalb l\u00e4uft der Import standardm\u00e4\u00dfig als Testlauf (dry). Dabei wird nichts ge\u00e4ndert, sondern nur gepr\u00fcft, was passieren w\u00fcrde.\ncurl --request POST \\\n  --url https:\/\/api.pph.systems\/api\/domains\/deine-domain.de\/records\/import \\\n  --header 'Accept: application\/json' \\\n  --header 'Authorization: Bearer sk_live_XXXX' \\\n  --header 'Content-Type: application\/json' \\\n  --data '{\n    \"dry\": true,\n    \"zonefile\": \"$ORIGIN deine-domain.de.\\n$TTL 300\\n@ IN A 192.0.2.1\\nwww IN A 192.0.2.1\\n\"\n  }'\nDie Antwort zeigt dir die geparsten Records und best\u00e4tigt mit dry_run: true, dass noch nichts ge\u00e4ndert wurde. Pr\u00fcfe dieses Ergebnis. Erst wenn es passt, wiederholst du den Aufruf mit \"dry\": false, um die Zone tats\u00e4chlich zu ersetzen.\nDNSSEC (in Entwicklung)\n\u00dcber die Registry-Routen kannst du die DNSSEC-Konfiguration einer Domain abfragen und die DS-Records am Registrar setzen. Der aktuelle Zustand sieht so aus:\n{\n  \"dnssec\": false,\n  \"dnssecData\": &#91;],\n  \"dnssec_available\": false\n}\ndnssec_available zeigt, ob DNSSEC f\u00fcr die Domain nutzbar ist. Das setzt einen externen Nameserver-Setup voraus. Mit den Standard-Nameservern steht das Feld auf false.\nDiese Routen sind noch nicht final dokumentiert und ihr Antwortformat kann sich \u00e4ndern. Wenn du DNSSEC produktiv nutzen m\u00f6chtest, sprich uns am besten kurz an.\nPraxisbeispiel: ein DynDNS-Skript\nDer Upsert eignet sich ideal f\u00fcr DynDNS. Das folgende Bash-Skript ermittelt deine \u00f6ffentliche IPv4 und IPv6 und schreibt sie in einen A&#8211; und AAAA-Record. Da Upsert anlegt oder aktualisiert, l\u00e4uft es beim ersten wie bei jedem weiteren Durchlauf gleich.\n#!\/bin\/bash\nset -euo pipefail\nAPI_HOST=\"api.pph.systems\"\nAPI_TOKEN=\"sk_live_XXXX\"\nDOMAIN=\"deine-domain.de\"\nSUBDOMAIN=\"home\"\nupdateRecord() {\n  local type=\"$1\" content=\"$2\"\n  local payload\n  payload=$(jq -n \\\n    --arg name \"$SUBDOMAIN\" --arg type \"$type\" --arg content \"$content\" \\\n    '{record_name: $name, record_type: $type, record_content: $content}')\n  curl -s --request PATCH \\\n    --url \"https:\/\/${API_HOST}\/api\/domains\/${DOMAIN}\/record\/upsert\" \\\n    --header 'Accept: application\/json' \\\n    --header \"Authorization: Bearer ${API_TOKEN}\" \\\n    --header 'Content-Type: application\/json' \\\n    --data \"$payload\"\n}\nIPV4=$(curl --max-time 3 -4 -sL https:\/\/pph.sh\/ip.php || true)\nIPV6=$(curl --max-time 3 -6 -sL https:\/\/pph.sh\/ip.php || true)\nif &#91; -z \"$IPV4\" ] &amp;&amp; &#91; -z \"$IPV6\" ]; then\n  echo \"Weder IPv4 noch IPv6 gefunden.\" &gt;&amp;2\n  exit 1\nfi\n&#91; -n \"$IPV4\" ] &amp;&amp; updateRecord \"A\" \"$IPV4\"\n&#91; -n \"$IPV6\" ] &amp;&amp; updateRecord \"AAAA\" \"$IPV6\"\nLeg das Skript in einen Cronjob, und deine Subdomain zeigt immer auf deine aktuelle Anschluss-IP. Nutze daf\u00fcr einen Token mit Schreibrechten, den du am besten per Gated Route nur auf die Upsert-Route und diese eine Domain einschr\u00e4nkst.\nWie geht es weiter?\nWie du deinen Token passend absicherst, steht in Wie ist die API abgesichert?.\nFehlermeldungen erkl\u00e4rt API-Antworten und Fehler verstehen.\nNoch Fragen?\nTechnische Fragen zur API beantworten dir unsere Entwickler direkt in unserem Discord. Stell deine Frage im Entwickler-Channel und pinge das Dev-Team an.","schema":null,"facts":[],"links":[{"type":"faq","url":"https:\/\/support.prepaid-hoster.de\/faq\/de\/api\/wie-ist-die-prepaid-hoster-api-abgesichert.html","data":{"post_id":"56859","post_slug":"wie-ist-die-prepaid-hoster-api-abgesichert","post_cat_id":"24"}},{"type":"faq","url":"https:\/\/support.prepaid-hoster.de\/faq\/de\/api\/api-antworten-und-fehler-verstehen.html","data":{"post_id":"56862","post_slug":"api-antworten-und-fehler-verstehen","post_cat_id":"24"}}]}}