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
# 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
# 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
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
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
"""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
# 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
# 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
# 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
# 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
# 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.
| Method | Path | Operation | Readiness |
|---|---|---|---|
| GET | /platform/v1/domains | platform-listDomains | implemented |
| GET | /platform/v1/domains/{domain} | platform-getDomain | implemented |
| GET | /platform/v1/domains/{domain}/dns/records | platform-listDNSRecords | implemented |
| DELETE | /platform/v1/domains/{domain}/dns/records/{name}/{type} | platform-deleteDNSRecord | implemented |
| PUT | /platform/v1/domains/{domain}/dns/records/{name}/{type} | platform-upsertDNSRecord | implemented |
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"
}