{
  "openapi": "3.1.0",
  "info": {
    "title": "betadomain.de Public API",
    "version": "1.0.0",
    "summary": "Öffentliche, lesende Endpunkte zur Domain-Verfügbarkeit und Preisauskunft.",
    "description": "Öffentliche Read-only-Endpunkte von betadomain.de. Sie liefern Verfügbarkeit und Preis (Registrierung, Verlängerung, Transfer) für Domains über die ~490 gelisteten Endungen. Es sind keine Authentifizierung und kein API-Key nötig. Registrierung, Transfer und Kontoverwaltung sind NICHT Teil dieser API – sie erfordern ein Login und einen menschlichen Checkout im Kundenportal (https://betadomain.de/login). Siehe https://betadomain.de/.well-known/auth.md. Alle Preise sind Jahrespreise in EUR zzgl. der jeweils gültigen gesetzlichen MwSt.",
    "contact": {
      "name": "betadomain Support",
      "email": "info@betadomain.de",
      "url": "https://betadomain.de/kontakt/"
    },
    "termsOfService": "https://betadomain.de/agb/"
  },
  "servers": [
    {
      "url": "https://betadomain.de",
      "description": "Produktion"
    }
  ],
  "paths": {
    "/api/domain/check": {
      "post": {
        "operationId": "checkDomain",
        "summary": "Verfügbarkeit und Preis einer konkreten Domain prüfen",
        "description": "Prüft eine vollständige Domain (inkl. Endung) auf Verfügbarkeit und gibt die Jahrespreise zurück. Ratenbegrenzt pro IP: 30 Anfragen/Minute und 300 Anfragen/6 Stunden.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "properties": {
                  "domain": {
                    "type": "string",
                    "description": "Vollständiger Domainname inkl. Endung, z. B. 'meinefirma.de'.",
                    "examples": [
                      "meinefirma.de"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Ergebnis. Entweder ein Verfügbarkeits-/Preisobjekt oder – falls die Endung nicht geführt wird – ein Objekt mit supported=false.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/CheckResult"
                    },
                    {
                      "$ref": "#/components/schemas/UnsupportedResult"
                    }
                  ]
                },
                "examples": {
                  "verfuegbar": {
                    "value": {
                      "domain": "meinefirma.de",
                      "tld": ".de",
                      "available": true,
                      "registerEur": 2.99,
                      "transferEur": 2.99,
                      "renewEur": 2.99
                    }
                  },
                  "nicht_gefuehrte_endung": {
                    "value": {
                      "domain": "meinefirma.xyzzy",
                      "tld": ".xyzzy",
                      "supported": false
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Anfrage oder ungültiger Domainname.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Ratenlimit überschritten. Header 'Retry-After' nennt die Wartezeit in Sekunden.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Sekunden bis zur nächsten erlaubten Anfrage."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Fehler bei der Upstream-Registry-Abfrage.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/domain/search": {
      "post": {
        "operationId": "searchDomain",
        "summary": "Namen über mehrere Endungen suchen",
        "description": "Sucht einen Namen. Enthält die Anfrage eine Endung (z. B. 'name.io'), wird genau diese geprüft. Ohne Endung werden beliebte Endungen (.de, .com, .eu, .net, .org, .shop, .io, .dev) parallel geprüft.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "query"
                ],
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "Wunschname, mit oder ohne Endung. Beispiele: 'meinefirma' oder 'meinefirma.io'. Der Second-Level-Teil darf nur a–z, 0–9 und Bindestriche enthalten.",
                    "examples": [
                      "meinefirma",
                      "meinefirma.io"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Suchergebnis mit einem Eintrag je geprüfter Endung.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResult"
                },
                "examples": {
                  "ohne_endung": {
                    "value": {
                      "sld": "meinefirma",
                      "results": [
                        {
                          "domain": "meinefirma.de",
                          "tld": ".de",
                          "available": true,
                          "priceEur": 2.99
                        },
                        {
                          "domain": "meinefirma.com",
                          "tld": ".com",
                          "available": false,
                          "priceEur": 14.99
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Leere oder ungültige Anfrage.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/acp/checkout_sessions/{id}/complete": {
      "post": {
        "operationId": "completeAcpCheckout",
        "summary": "ACP-Checkout-Session bezahlen (Domain-Registrierung/-Transfer)",
        "description": "Schließt eine Agentic-Checkout-Session (Agentic Commerce Protocol) ab. Bezahlt wird über Stripe (Delegated Payment / Shared Payment Token); ohne verwendbares Zahlungsmittel liefert die Session einen Stripe-Checkout-Link (payment_url) für den Menschen. Der Betrag ergibt sich aus Endung und Art (Registrierung/Transfer) der Line-Items, daher dynamisch. Requests sind per HMAC-SHA256 signiert (siehe /.well-known/acp.json).",
        "x-payment-info": {
          "intent": "charge",
          "method": "stripe",
          "amount": null,
          "currency": "eur",
          "description": "Jahrespreis der Domain(s) laut Session (EUR, brutto); exakter Betrag in der Session (totals)."
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "buyer": {
                    "type": "object"
                  },
                  "payment_data": {
                    "type": "object",
                    "properties": {
                      "token": {
                        "type": "string",
                        "description": "Stripe Shared Payment Token"
                      },
                      "provider": {
                        "type": "string",
                        "enum": [
                          "stripe"
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Session-Objekt (completed, oder not_ready_for_payment mit Verifizierungs-/Zahlungslink)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "status"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "Payment Required"
          },
          "401": {
            "description": "Signatur fehlt oder ist ungültig"
          },
          "422": {
            "description": "Session nicht bezahlbar (fehlende Registrantendaten oder Domain nicht verfügbar)"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CheckResult": {
        "type": "object",
        "required": [
          "domain",
          "tld",
          "available"
        ],
        "properties": {
          "domain": {
            "type": "string",
            "description": "Geprüfter Domainname (normalisiert, Kleinbuchstaben)."
          },
          "tld": {
            "type": "string",
            "description": "Erkannte Endung inkl. führendem Punkt, z. B. '.de'."
          },
          "available": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "true = frei, false = vergeben, null = nicht ermittelbar."
          },
          "registerEur": {
            "type": "number",
            "description": "Registrierungspreis pro Jahr in EUR (zzgl. gesetzl. MwSt.)."
          },
          "renewEur": {
            "type": "number",
            "description": "Verlängerungspreis pro Jahr in EUR (zzgl. gesetzl. MwSt.)."
          },
          "transferEur": {
            "type": "number",
            "description": "Transferpreis in EUR (zzgl. gesetzl. MwSt.)."
          }
        }
      },
      "UnsupportedResult": {
        "type": "object",
        "required": [
          "domain",
          "tld",
          "supported"
        ],
        "properties": {
          "domain": {
            "type": "string"
          },
          "tld": {
            "type": "string"
          },
          "supported": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "false = diese Endung wird nicht geführt; es erfolgt keine Verfügbarkeitsabfrage."
          }
        }
      },
      "SearchResult": {
        "type": "object",
        "required": [
          "sld",
          "results"
        ],
        "properties": {
          "sld": {
            "type": "string",
            "description": "Geprüfter Second-Level-Name (ohne Endung)."
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "domain",
                "tld",
                "available"
              ],
              "properties": {
                "domain": {
                  "type": "string"
                },
                "tld": {
                  "type": "string"
                },
                "available": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "true = frei, false = vergeben, null = nicht ermittelbar."
                },
                "priceEur": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Registrierungspreis pro Jahr in EUR, oder null wenn unbekannt."
                },
                "error": {
                  "type": "boolean",
                  "description": "true, wenn die Prüfung dieser Endung fehlschlug."
                }
              }
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Menschlich lesbare Fehlermeldung (deutsch)."
          },
          "domain": {
            "type": "string",
            "description": "Nur bei Upstream-Fehlern: die betroffene Domain."
          }
        }
      }
    }
  },
  "x-service-info": {
    "categories": [
      "developer-tools",
      "data"
    ],
    "docs": {
      "homepage": "https://betadomain.de",
      "apiReference": "https://betadomain.de/entwickler/",
      "llms": "https://betadomain.de/llms.txt"
    }
  }
}
