← Production reference

Isolated test contract · 2026-10-15-test-github-archives-release

Plattform test API

Isolierter, persistierter DNS-Test mit synthetischer .test-Domain. Keine Registrar-, Zahlungs- oder echten DNS-Aufrufe.

Current service status ↗

Versioned guides and examples

Published local documents for revision 2026-10-15-test-github-archives-release. SDK guidance describes integration options; no external SDK download is implied.

Overview · overview.md
Download overview.md
# Plattform — isolierter Test

Domains, DNS, Cluster und Objektspeicher haben getrennte Berechtigungen. Die Testumgebung bietet ausschließlich synthetische .test-Domains und DNS-Einträge.

Quelle: d0-api Commit fc447ce3ac35dfa320e273009cb9a3928c3e4690, api/test-openapi.yaml. Diese Dokumentation und der gefilterte OpenAPI-Vertrag sind unveränderliche Snapshots. Quellqualifikation bedeutet keine bestätigte Live-Verfügbarkeit.

Die jeweils andere Umgebung benötigt eigene Clients, Grants, Daten und Signaturschlüssel. OAuth-Issuer: https://auth.d0.eu; Ressource: https://api.test.d0.eu/platform. Maschine: Client Credentials mit private_key_jwt und DPoP. Signaturschlüssel bleiben ausschließlich im Serverprozess.
Quickstart · quickstart.md
Download quickstart.md
# Plattform: Test in vier Schritten

1. Produkt und Organisationsberechtigung in der Console prüfen. Für Test einen eigenen Maschinenclient in d0-auth registrieren; nur die unten genannten Scopes freigeben.
2. Über `https://auth.d0.eu` ein Access Token für `https://api.test.d0.eu/platform` mit `private_key_jwt` und DPoP beziehen. Den DPoP-Proof an genau den Ziel-Request binden; Nonce-Antworten gemäß Auth-Transport behandeln.
3. Mit platform.domains.read GET /platform/v1/domains aufrufen; die isolierte .test-Domain abfragen und mit platform.dns.write einen synthetischen DNS-Eintrag per PUT anlegen. Die Testumgebung enthält keine Cluster-, Registrar- oder Zahlungsoperationen.
4. Nur die im `public-openapi.json` dieser Revision gelisteten Operationen verwenden. Testdaten und Test-Clients nie mit Produktion mischen.

Verfügbare Test-Scopes: `platform.domains.read`, `platform.dns.read`, `platform.dns.write`. Pro Client nur den tatsächlich benötigten Teil beantragen.

Go v0.1.0 ist über den öffentlichen Go-Modul-Proxy installierbar. TypeScript und Python v0.1.0 samt gemeinsamem Auth-Transport sind als geprüfte Archive im [GitHub-Release](https://github.com/dev-null-GmbH/d0-sdk/releases/tag/sdk-2026-10-15) verfügbar; die genauen Installationsschritte stehen in den SDK-Guides. Die drei Beispiele sind Offline-Fixtures ohne Live-Credentials oder Live-Requests.
Examples · examples/typescript.mjs
Download examples/typescript.mjs
import { PlatformClient, resourceFor } from "../dist/index.js";
for (const profile of ["production", "test"]) {
  const transport = { async request(url, options = {}) {
    if (!String(url).startsWith(resourceFor(profile) + "/v1/")) throw new Error("profile crossover");
    const path = new URL(url).pathname;
    if (path.endsWith("/domains") && (options.method ?? "GET") === "GET") return new Response(JSON.stringify({ domains: [{ fqdn: "example.eu", status: "active", created_at: "2026-01-01T00:00:00Z", updated_at: "2026-01-01T00:00:00Z" }] }), { status: 200, headers: { "Content-Type": "application/json" } });
    if (path.endsWith("/dns/records/www/A") && options.method === "PUT") return new Response(JSON.stringify({ name: "www.example.eu", type: "A", ttl: 300, records: ["192.0.2.1"], read_only: false }), { status: 200, headers: { "Content-Type": "application/json" } });
    throw new Error("unexpected route");
  } };
  const sdk = new PlatformClient(profile, transport);
  const domains = await sdk.listDomains({});
  const record = await sdk.upsertDNSRecord({ domain: domains.domains[0].fqdn, name: "www", type: "A", body: { records: ["192.0.2.1"], ttl: 300 } });
  if (record.name !== "www.example.eu") throw new Error("fixture failed");
  console.log(`${profile}: ${record.name}`);
}
Examples · examples/go.go
Download examples/go.go
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"strings"

	platform "github.com/dev-null-GmbH/d0-sdk/platform/go"
	"github.com/dev-null-GmbH/d0-sdk/platform/go/gen"
	"github.com/oapi-codegen/nullable"
)

type fixture struct{ profile platform.Profile }

func (f fixture) RoundTrip(req *http.Request) (*http.Response, error) {
	resource, _ := f.profile.Resource()
	if !strings.HasPrefix(req.URL.String(), resource+"/v1/") {
		return nil, fmt.Errorf("profile crossover")
	}
	var data any
	switch {
	case req.Method == "GET" && strings.HasSuffix(req.URL.Path, "/domains"):
		data = map[string]any{"domains": []any{map[string]any{"fqdn": "example.eu", "status": "active", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z"}}}
	case req.Method == "PUT" && strings.HasSuffix(req.URL.Path, "/dns/records/www/A"):
		data = map[string]any{"name": "www.example.eu", "type": "A", "ttl": 300, "records": []string{"192.0.2.1"}, "read_only": false}
	default:
		return nil, fmt.Errorf("unexpected route")
	}
	raw, _ := json.Marshal(data)
	return &http.Response{StatusCode: 200, Header: http.Header{"Content-Type": []string{"application/json"}}, Body: io.NopCloser(strings.NewReader(string(raw))), Request: req}, nil
}
func main() {
	for _, profile := range []platform.Profile{platform.Production, platform.Test} {
		sdk, err := platform.NewClient(profile, &http.Client{Transport: fixture{profile}})
		if err != nil {
			panic(err)
		}
		domains, err := sdk.ListDomains(context.Background())
		if err != nil || domains.JSON200 == nil {
			panic("list failed")
		}
		got, _ := domains.JSON200.Domains.Get()
		record, err := sdk.UpsertDNSRecord(context.Background(), got[0].Fqdn, "www", "A", gen.RecordUpsertBody{Records: nullable.NewNullableWithValue([]string{"192.0.2.1"})})
		if err != nil || record.JSON200 == nil {
			panic("upsert failed")
		}
		fmt.Printf("%s: %s\n", profile, record.JSON200.Name)
	}
}
Examples · examples/python.py
Download examples/python.py
"""Offline production/test DNS example using the actual Platform client transport API."""
import io
import json
from email.message import Message
from typing import Any

from d0_auth_machine import MachineClient

from d0_platform import PlatformClient, resource_for


class FixtureTransport(MachineClient):
    def __init__(self, profile: str):
        self.resource = resource_for(profile)  # type: ignore[arg-type]

    def request(self, url: str, *, method: str = "GET", headers: Any = None, body: Any = None, cancel: Any = None, timeout: float = 45.0) -> Any:
        assert url.startswith(self.resource + "/v1/")
        if url.endswith("/domains") and method == "GET":
            data: dict[str, Any] = {"domains": [{"fqdn": "example.eu", "status": "active", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z"}]}
        elif url.endswith("/dns/records/www/A") and method == "PUT":
            data = {"name": "www.example.eu", "type": "A", "ttl": 300, "records": ["192.0.2.1"], "read_only": False}
        else:
            raise AssertionError("unexpected route")
        response = io.BytesIO(json.dumps(data).encode())
        response.status = 200  # type: ignore[attr-defined]
        response.headers = Message()  # type: ignore[attr-defined]
        response.headers["Content-Type"] = "application/json"  # type: ignore[attr-defined]
        return response


for profile in ("production", "test"):
    sdk = PlatformClient(profile, FixtureTransport(profile))  # type: ignore[arg-type]
    domain = sdk.list_domains({})["domains"][0]["fqdn"]
    record = sdk.upsert_dns_record({"domain": domain, "name": "www", "type": "A", "body": {"records": ["192.0.2.1"], "ttl": 300}})
    assert record["name"] == "www.example.eu"
    print(f"{profile}: {record['name']}")
Error catalog · errors.md
Download errors.md
# Plattform — Fehler und Wiederholung

Der genaue Fehlerkörper und die operationellen Antworten stehen in `public-openapi.json`. In den öffentlichen Operationen dieser Revision sind die Statuscodes `200`, `204`, `default` deklariert. Nicht jeder Code gilt für jede Operation.

- `400`/`422`: Eingabe und geforderte Header gegen die konkrete Operation prüfen; keinen veränderten Request unter demselben Idempotency-Key wiederholen.
- `401`: Token, DPoP-Proof, Nonce, Audience und Clientprofil prüfen.
- `403`: Scope, Organisationsrolle und fachliche Zuordnung prüfen; keine breiteren Scopes erraten.
- `404`: Pfad, Ressource und Tenant-Kontext prüfen; keine Existenz fremder Ressourcen ableiten.
- `409`/`412`: Konflikt bzw. ETag-Vorbedingung durch erneutes Lesen und fachliche Entscheidung auflösen.
- `429`: technische Limitantwort und Reset-/Retry-Hinweis beachten.
- `5xx` oder Transportabbruch: Bei Mutationen denselben vom Aufrufer vergebenen Idempotency-Key verwenden, sofern die Operation ihn vorsieht; sonst erst den serverseitigen Zustand lesen. Keine blinde Wiederholung einer nicht-idempotenten Operation.

Problemantworten und Request-ID helfen bei der Diagnose. Keine Tokens, Schlüssel, Dokumentinhalte oder personenbezogenen Daten in Support-Logs kopieren.
Changelog · CHANGELOG.md
Download CHANGELOG.md
# Plattform 2026-10-15-test-github-archives-release

- Neue unveränderliche Dokumentationsrevision. Die vorige Revision `2026-10-15-test-go-release` bleibt bytegleich verfügbar; Quell-OpenAPI, öffentlicher Vertrag und klassifizierte Operationen sind unverändert.
- Das [GitHub-Release](https://github.com/dev-null-GmbH/d0-sdk/releases/tag/sdk-2026-10-15) stellt die geprüften TypeScript-Tarballs und Python-Wheels für platform v0.1.0 sowie den Auth-Transport v0.1.0 bereit. Der ZIP-Hash ist `6c11b63a5ce5f24dff79d1f3d33c7879ff48831d66dd9029b37abf073152dd93`; der innere `SHA256SUMS`-Katalog wird vor Installation geprüft. Go v0.1.0 bleibt über den öffentlichen Modul-Proxy verfügbar.
- npm und PyPI sind keine Voraussetzungen für diese Distribution. Die installierten Offline-Beispiele wurden im Release-Build geprüft; Service-Rollout und SDK-Download sind getrennte Nachweise.
SDK guidance · sdk-typescript.md
Download sdk-typescript.md
# Plattform typescript SDK

Paket: `@dev-null-gmbh/platform` v0.1.0, Auth-Transport `@dev-null-gmbh/auth-machine` v0.1.0. MIT-Lizenz; Node.js 24.21 bis unter 27.

Die [qualifizierte GitHub-Release-Datei](https://github.com/dev-null-GmbH/d0-sdk/releases/tag/sdk-2026-10-15) ist die direkte Distribution. Archiv und Prüfsumme herunterladen, dann äußere und innere SHA-256-Werte prüfen (unter Linux kann `sha256sum -c` statt `shasum -a 256 -c` verwendet werden):

```sh
curl -fLO https://github.com/dev-null-GmbH/d0-sdk/releases/download/sdk-2026-10-15/d0-sdk-2026-10-15.zip
curl -fLO https://github.com/dev-null-GmbH/d0-sdk/releases/download/sdk-2026-10-15/d0-sdk-2026-10-15.sha256
shasum -a 256 -c d0-sdk-2026-10-15.sha256
unzip d0-sdk-2026-10-15.zip -d d0-sdk-2026-10-15
(cd d0-sdk-2026-10-15 && shasum -a 256 -c SHA256SUMS)
```

Der äußere ZIP-Hash lautet `6c11b63a5ce5f24dff79d1f3d33c7879ff48831d66dd9029b37abf073152dd93`. Die Archive stammen aus [dem erfolgreichen Main-Build](https://github.com/dev-null-GmbH/d0-sdk/actions/runs/38748901791) bei `d0-sdk@6f2c39612a661ec557e96e5caff093a057e6e1de`. Das Release enthält SDKs und Auth-Transport, keine privaten Services oder Zugangsdaten.

Die beiden geprüften Tarballs lokal im Serverprojekt installieren (keine npm-Registry-Veröffentlichung erforderlich):

```sh
npm install --ignore-scripts --no-audit --no-fund ./d0-sdk-2026-10-15/npm/dev-null-gmbh-auth-machine-0.1.0.tgz ./d0-sdk-2026-10-15/npm/dev-null-gmbh-platform-0.1.0.tgz
```

Das Offline-Beispiel dieser Revision liegt unter `catalog/v1/bundles/platform/2026-10-15-test-github-archives-release/examples/typescript.mjs`. Das Paket ist für vertrauenswürdige Serveranwendungen gedacht; private Signaturschlüssel gehören nicht in Browser-Code. Öffentliche Operationen und Scopes stehen in `public-openapi.json`.
SDK guidance · sdk-go.md
Download sdk-go.md
# Plattform Go SDK

Paket: `github.com/dev-null-GmbH/d0-sdk/platform/go` v0.1.0. Gemeinsamer Maschinen-Auth-Transport: `github.com/dev-null-GmbH/d0-sdk/auth/go` v0.1.0. Beide sind über den öffentlichen Go-Modul-Proxy mit aktivierter Checksum-Datenbank aus frischer, anonymer Umgebung installierbar. Lizenz: MIT.

```sh
go get github.com/dev-null-GmbH/d0-sdk/platform/go@v0.1.0
```

Modul-Tags: `platform/go/v0.1.0` und `auth/go/v0.1.0`, beide auf `d0-sdk@a7b1730310ccd3decafc299382f4e2f48ebefda7`. Die Quellrevision des API-Vertrags bleibt `d0-api@fc447ce3ac35dfa320e273009cb9a3928c3e4690`.

Das unveränderte Offline-Fixture aus `d0-api@fc447ce3ac35dfa320e273009cb9a3928c3e4690:sdk/go/examples/fixture/main.go` liegt unter `catalog/v1/bundles/platform/2026-10-15-test-github-archives-release/examples/go.go` (SHA-256 `b0c3b28099938c9427f7d0e4e3553d328edbc3c8bfa67911db8fe14a85eb15a7`). Es demonstriert den Client mit festem test-Profil ohne Netzaufruf. Öffentliche Operationen und Scopes stehen ausschließlich in public-openapi.json; interne und nicht implementierte Operationen sind kein SDK-Vertrag.

Die übrigen Sprachpakete sind über das [geprüfte GitHub-Release](https://github.com/dev-null-GmbH/d0-sdk/releases/tag/sdk-2026-10-15) verfügbar. Go benötigt nur den oben gezeigten Modulbezug über den öffentlichen Proxy.
SDK guidance · sdk-python.md
Download sdk-python.md
# Plattform python SDK

Paket: `d0-platform` v0.1.0, Auth-Transport `d0-auth-machine` v0.1.0. MIT-Lizenz; Python 3.14.

Die [qualifizierte GitHub-Release-Datei](https://github.com/dev-null-GmbH/d0-sdk/releases/tag/sdk-2026-10-15) ist die direkte Distribution. Archiv und Prüfsumme herunterladen, dann äußere und innere SHA-256-Werte prüfen (unter Linux kann `sha256sum -c` statt `shasum -a 256 -c` verwendet werden):

```sh
curl -fLO https://github.com/dev-null-GmbH/d0-sdk/releases/download/sdk-2026-10-15/d0-sdk-2026-10-15.zip
curl -fLO https://github.com/dev-null-GmbH/d0-sdk/releases/download/sdk-2026-10-15/d0-sdk-2026-10-15.sha256
shasum -a 256 -c d0-sdk-2026-10-15.sha256
unzip d0-sdk-2026-10-15.zip -d d0-sdk-2026-10-15
(cd d0-sdk-2026-10-15 && shasum -a 256 -c SHA256SUMS)
```

Der äußere ZIP-Hash lautet `6c11b63a5ce5f24dff79d1f3d33c7879ff48831d66dd9029b37abf073152dd93`. Die Archive stammen aus [dem erfolgreichen Main-Build](https://github.com/dev-null-GmbH/d0-sdk/actions/runs/38748901791) bei `d0-sdk@6f2c39612a661ec557e96e5caff093a057e6e1de`. Das Release enthält SDKs und Auth-Transport, keine privaten Services oder Zugangsdaten.

Die beiden geprüften Wheels in einer virtuellen Umgebung installieren (keine PyPI-Veröffentlichung erforderlich):

```sh
python3.14 -m venv .venv
.venv/bin/python -m pip install ./d0-sdk-2026-10-15/python/d0_auth_machine-0.1.0-py3-none-any.whl ./d0-sdk-2026-10-15/python/d0_platform-0.1.0-py3-none-any.whl
```

Das Offline-Beispiel dieser Revision liegt unter `catalog/v1/bundles/platform/2026-10-15-test-github-archives-release/examples/python.py`. Das Paket ist für vertrauenswürdige Serveranwendungen gedacht; private Signaturschlüssel gehören nicht in Browser-Code. Öffentliche Operationen und Scopes stehen in `public-openapi.json`.

Test workflow

Use a dedicated test machine client for published API operations or a dedicated human session for the browser Explorer. Production credentials are not accepted.

Open Test Explorer →

Published operations

Only public, implemented operations in this pinned bundle are actionable. Machine DPoP and human Bearer requirements remain separate.

MethodPathOperationReadiness
GET/platform/v1/domainsplatform-listDomainsimplemented
GET/platform/v1/domains/{domain}platform-getDomainimplemented
GET/platform/v1/domains/{domain}/dns/recordsplatform-listDNSRecordsimplemented
DELETE/platform/v1/domains/{domain}/dns/records/{name}/{type}platform-deleteDNSRecordimplemented
PUT/platform/v1/domains/{domain}/dns/records/{name}/{type}platform-upsertDNSRecordimplemented

Operation reference

5 of 5 operations

GET /platform/v1/domainsList managed domains

Lists the caller tenant's managed domains, newest first.

Parameters

DPoP · header · required

Fresh ES256 proof bound to this test resource and access token

{
  "type": "string"
}

Responses

200 · application/json

OK

Required fields: domains

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/ListDomainsOutputBody.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "domains": {
      "description": "The tenant's managed domains, newest first",
      "items": {
        "additionalProperties": false,
        "properties": {
          "$schema": {
            "description": "A URL to the JSON Schema for this object.",
            "examples": [
              "https://api.test.d0.eu/schemas/DomainBody.json"
            ],
            "format": "uri",
            "readOnly": true,
            "type": "string"
          },
          "created_at": {
            "description": "RFC 3339 creation time",
            "type": "string"
          },
          "expires_at": {
            "description": "RFC 3339 expiry, when known",
            "type": "string"
          },
          "fqdn": {
            "description": "The managed domain",
            "type": "string"
          },
          "nameservers": {
            "description": "Delegation nameservers",
            "items": {
              "type": "string"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "status": {
            "description": "Domain status",
            "type": "string"
          },
          "updated_at": {
            "description": "RFC 3339 last-update time",
            "type": "string"
          }
        },
        "required": [
          "fqdn",
          "status",
          "created_at",
          "updated_at"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    }
  },
  "required": [
    "domains"
  ],
  "type": "object"
}

default · application/problem+json

Error

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/ErrorModel.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "detail": {
      "description": "A human-readable explanation specific to this occurrence of the problem.",
      "examples": [
        "Property foo is required but is missing."
      ],
      "type": "string"
    },
    "errors": {
      "description": "Optional list of individual error details",
      "items": {
        "additionalProperties": false,
        "properties": {
          "location": {
            "description": "Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'",
            "type": "string"
          },
          "message": {
            "description": "Error message text",
            "type": "string"
          },
          "value": {
            "description": "The value at the given location"
          }
        },
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "instance": {
      "description": "A URI reference that identifies the specific occurrence of the problem.",
      "examples": [
        "https://example.com/error-log/abc123"
      ],
      "format": "uri",
      "type": "string"
    },
    "status": {
      "description": "HTTP status code",
      "examples": [
        400
      ],
      "format": "int64",
      "type": "integer"
    },
    "title": {
      "description": "A short, human-readable summary of the problem type. This value should not change between occurrences of the error.",
      "examples": [
        "Bad Request"
      ],
      "type": "string"
    },
    "type": {
      "default": "about:blank",
      "description": "A URI reference to human-readable documentation for the error.",
      "examples": [
        "https://example.com/errors/example"
      ],
      "format": "uri",
      "type": "string"
    }
  },
  "type": "object"
}
GET /platform/v1/domains/{domain}Get a managed domain

Returns a managed domain's detail. Scoped to the caller tenant.

Parameters

domain · path · required

The managed domain

{
  "description": "The managed domain",
  "examples": [
    "example.eu"
  ],
  "maxLength": 253,
  "minLength": 3,
  "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)+$",
  "type": "string"
}

DPoP · header · required

Fresh ES256 proof bound to this test resource and access token

{
  "type": "string"
}

Responses

200 · application/json

OK

Required fields: fqdn, status, created_at, updated_at

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/DomainBody.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "created_at": {
      "description": "RFC 3339 creation time",
      "type": "string"
    },
    "expires_at": {
      "description": "RFC 3339 expiry, when known",
      "type": "string"
    },
    "fqdn": {
      "description": "The managed domain",
      "type": "string"
    },
    "nameservers": {
      "description": "Delegation nameservers",
      "items": {
        "type": "string"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "status": {
      "description": "Domain status",
      "type": "string"
    },
    "updated_at": {
      "description": "RFC 3339 last-update time",
      "type": "string"
    }
  },
  "required": [
    "fqdn",
    "status",
    "created_at",
    "updated_at"
  ],
  "type": "object"
}

default · application/problem+json

Error

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/ErrorModel.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "detail": {
      "description": "A human-readable explanation specific to this occurrence of the problem.",
      "examples": [
        "Property foo is required but is missing."
      ],
      "type": "string"
    },
    "errors": {
      "description": "Optional list of individual error details",
      "items": {
        "additionalProperties": false,
        "properties": {
          "location": {
            "description": "Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'",
            "type": "string"
          },
          "message": {
            "description": "Error message text",
            "type": "string"
          },
          "value": {
            "description": "The value at the given location"
          }
        },
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "instance": {
      "description": "A URI reference that identifies the specific occurrence of the problem.",
      "examples": [
        "https://example.com/error-log/abc123"
      ],
      "format": "uri",
      "type": "string"
    },
    "status": {
      "description": "HTTP status code",
      "examples": [
        400
      ],
      "format": "int64",
      "type": "integer"
    },
    "title": {
      "description": "A short, human-readable summary of the problem type. This value should not change between occurrences of the error.",
      "examples": [
        "Bad Request"
      ],
      "type": "string"
    },
    "type": {
      "default": "about:blank",
      "description": "A URI reference to human-readable documentation for the error.",
      "examples": [
        "https://example.com/errors/example"
      ],
      "format": "uri",
      "type": "string"
    }
  },
  "type": "object"
}
GET /platform/v1/domains/{domain}/dns/recordsList DNS records

Lists the domain's zone records. SOA and the apex NS set are flagged read_only. Scoped to the caller tenant.

Parameters

domain · path · required

The managed domain

{
  "description": "The managed domain",
  "examples": [
    "example.eu"
  ],
  "maxLength": 253,
  "minLength": 3,
  "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)+$",
  "type": "string"
}

DPoP · header · required

Fresh ES256 proof bound to this test resource and access token

{
  "type": "string"
}

Responses

200 · application/json

OK

Required fields: records

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/ListRecordsOutputBody.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "records": {
      "description": "The zone's record sets",
      "items": {
        "additionalProperties": false,
        "properties": {
          "$schema": {
            "description": "A URL to the JSON Schema for this object.",
            "examples": [
              "https://api.test.d0.eu/schemas/RecordBody.json"
            ],
            "format": "uri",
            "readOnly": true,
            "type": "string"
          },
          "name": {
            "description": "Record name (FQDN)",
            "type": "string"
          },
          "read_only": {
            "description": "True for platform-managed sets (SOA, apex NS) that cannot be edited",
            "type": "boolean"
          },
          "records": {
            "description": "Record contents",
            "items": {
              "type": "string"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "ttl": {
            "description": "Time-to-live in seconds",
            "format": "int64",
            "type": "integer"
          },
          "type": {
            "description": "Record type",
            "type": "string"
          }
        },
        "required": [
          "name",
          "type",
          "ttl",
          "records",
          "read_only"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    }
  },
  "required": [
    "records"
  ],
  "type": "object"
}

default · application/problem+json

Error

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/ErrorModel.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "detail": {
      "description": "A human-readable explanation specific to this occurrence of the problem.",
      "examples": [
        "Property foo is required but is missing."
      ],
      "type": "string"
    },
    "errors": {
      "description": "Optional list of individual error details",
      "items": {
        "additionalProperties": false,
        "properties": {
          "location": {
            "description": "Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'",
            "type": "string"
          },
          "message": {
            "description": "Error message text",
            "type": "string"
          },
          "value": {
            "description": "The value at the given location"
          }
        },
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "instance": {
      "description": "A URI reference that identifies the specific occurrence of the problem.",
      "examples": [
        "https://example.com/error-log/abc123"
      ],
      "format": "uri",
      "type": "string"
    },
    "status": {
      "description": "HTTP status code",
      "examples": [
        400
      ],
      "format": "int64",
      "type": "integer"
    },
    "title": {
      "description": "A short, human-readable summary of the problem type. This value should not change between occurrences of the error.",
      "examples": [
        "Bad Request"
      ],
      "type": "string"
    },
    "type": {
      "default": "about:blank",
      "description": "A URI reference to human-readable documentation for the error.",
      "examples": [
        "https://example.com/errors/example"
      ],
      "format": "uri",
      "type": "string"
    }
  },
  "type": "object"
}
DELETE /platform/v1/domains/{domain}/dns/records/{name}/{type}Delete a DNS record set

Deletes one RRset (name+type); deleting a missing set is a no-op (204). SOA and the apex NS set are not editable (422). Scoped to the caller tenant.

Parameters

domain · path · required

The managed domain

{
  "description": "The managed domain",
  "examples": [
    "example.eu"
  ],
  "maxLength": 253,
  "minLength": 3,
  "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)+$",
  "type": "string"
}

name · path · required

Record name (relative, '@' for apex, or FQDN)

{
  "description": "Record name (relative, '@' for apex, or FQDN)",
  "examples": [
    "www"
  ],
  "maxLength": 253,
  "type": "string"
}

type · path · required

Record type, e.g. A, AAAA, CNAME, MX, TXT, NS, CAA, SRV

{
  "description": "Record type, e.g. A, AAAA, CNAME, MX, TXT, NS, CAA, SRV",
  "examples": [
    "A"
  ],
  "pattern": "^[A-Za-z]+$",
  "type": "string"
}

DPoP · header · required

Fresh ES256 proof bound to this test resource and access token

{
  "type": "string"
}

Responses

204

No Content

default · application/problem+json

Error

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/ErrorModel.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "detail": {
      "description": "A human-readable explanation specific to this occurrence of the problem.",
      "examples": [
        "Property foo is required but is missing."
      ],
      "type": "string"
    },
    "errors": {
      "description": "Optional list of individual error details",
      "items": {
        "additionalProperties": false,
        "properties": {
          "location": {
            "description": "Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'",
            "type": "string"
          },
          "message": {
            "description": "Error message text",
            "type": "string"
          },
          "value": {
            "description": "The value at the given location"
          }
        },
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "instance": {
      "description": "A URI reference that identifies the specific occurrence of the problem.",
      "examples": [
        "https://example.com/error-log/abc123"
      ],
      "format": "uri",
      "type": "string"
    },
    "status": {
      "description": "HTTP status code",
      "examples": [
        400
      ],
      "format": "int64",
      "type": "integer"
    },
    "title": {
      "description": "A short, human-readable summary of the problem type. This value should not change between occurrences of the error.",
      "examples": [
        "Bad Request"
      ],
      "type": "string"
    },
    "type": {
      "default": "about:blank",
      "description": "A URI reference to human-readable documentation for the error.",
      "examples": [
        "https://example.com/errors/example"
      ],
      "format": "uri",
      "type": "string"
    }
  },
  "type": "object"
}
PUT /platform/v1/domains/{domain}/dns/records/{name}/{type}Create or replace a DNS record set

Upserts one RRset (name+type). Validated for RFC-correct content and zone structure before it reaches the backend. SOA and the apex NS set are not editable (422). Scoped to the caller tenant.

Parameters

domain · path · required

The managed domain

{
  "description": "The managed domain",
  "examples": [
    "example.eu"
  ],
  "maxLength": 253,
  "minLength": 3,
  "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)+$",
  "type": "string"
}

name · path · required

Record name (relative, '@' for apex, or FQDN)

{
  "description": "Record name (relative, '@' for apex, or FQDN)",
  "examples": [
    "www"
  ],
  "maxLength": 253,
  "type": "string"
}

type · path · required

Record type, e.g. A, AAAA, CNAME, MX, TXT, NS, CAA, SRV

{
  "description": "Record type, e.g. A, AAAA, CNAME, MX, TXT, NS, CAA, SRV",
  "examples": [
    "A"
  ],
  "pattern": "^[A-Za-z]+$",
  "type": "string"
}

DPoP · header · required

Fresh ES256 proof bound to this test resource and access token

{
  "type": "string"
}

Request body

application/json · required

Required fields: records

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/RecordUpsertBody.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "records": {
      "description": "Record contents for this name+type",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "type": [
        "array",
        "null"
      ]
    },
    "ttl": {
      "description": "Time-to-live in seconds (default 3600)",
      "format": "int64",
      "maximum": 604800,
      "minimum": 60,
      "type": "integer"
    }
  },
  "required": [
    "records"
  ],
  "type": "object"
}

Responses

200 · application/json

OK

Required fields: name, type, ttl, records, read_only

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/RecordBody.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "name": {
      "description": "Record name (FQDN)",
      "type": "string"
    },
    "read_only": {
      "description": "True for platform-managed sets (SOA, apex NS) that cannot be edited",
      "type": "boolean"
    },
    "records": {
      "description": "Record contents",
      "items": {
        "type": "string"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "ttl": {
      "description": "Time-to-live in seconds",
      "format": "int64",
      "type": "integer"
    },
    "type": {
      "description": "Record type",
      "type": "string"
    }
  },
  "required": [
    "name",
    "type",
    "ttl",
    "records",
    "read_only"
  ],
  "type": "object"
}

default · application/problem+json

Error

{
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "A URL to the JSON Schema for this object.",
      "examples": [
        "https://api.test.d0.eu/schemas/ErrorModel.json"
      ],
      "format": "uri",
      "readOnly": true,
      "type": "string"
    },
    "detail": {
      "description": "A human-readable explanation specific to this occurrence of the problem.",
      "examples": [
        "Property foo is required but is missing."
      ],
      "type": "string"
    },
    "errors": {
      "description": "Optional list of individual error details",
      "items": {
        "additionalProperties": false,
        "properties": {
          "location": {
            "description": "Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'",
            "type": "string"
          },
          "message": {
            "description": "Error message text",
            "type": "string"
          },
          "value": {
            "description": "The value at the given location"
          }
        },
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "instance": {
      "description": "A URI reference that identifies the specific occurrence of the problem.",
      "examples": [
        "https://example.com/error-log/abc123"
      ],
      "format": "uri",
      "type": "string"
    },
    "status": {
      "description": "HTTP status code",
      "examples": [
        400
      ],
      "format": "int64",
      "type": "integer"
    },
    "title": {
      "description": "A short, human-readable summary of the problem type. This value should not change between occurrences of the error.",
      "examples": [
        "Bad Request"
      ],
      "type": "string"
    },
    "type": {
      "default": "about:blank",
      "description": "A URI reference to human-readable documentation for the error.",
      "examples": [
        "https://example.com/errors/example"
      ],
      "format": "uri",
      "type": "string"
    }
  },
  "type": "object"
}