{ }
GET
OpenAPI 3.1 · REST API · API Design · YAML · Dokumentation
OpenAPI 3.1 von Grund auf
Die wichtigsten Bausteine praktisch erklärt

OpenAPI 3.1 ist der Industriestandard für REST API Dokumentation – aber viele Teams nutzen nur einen Bruchteil seiner Möglichkeiten. Dieser Guide erklärt alle wesentlichen Bausteine: von Info und Paths über Components und Schemas bis zu Security und Callbacks, mit vollständigen praxisnahen YAML-Beispielen.

22 Min. Lesezeit Paths · Components · Schemas · Security · Parameters · Responses OpenAPI 3.1 · JSON Schema 2020-12 · YAML

1. OpenAPI 3.1 vs. 3.0 – was sich geändert hat

OpenAPI 3.1 wurde im Februar 2021 veröffentlicht und brachte die wichtigste Änderung seit Version 2.0: volle Kompatibilität mit JSON Schema 2020-12. In OpenAPI 3.0 war das Schema-Objekt eine angepasste Teilmenge von JSON Schema Draft 7 mit proprietären Erweiterungen wie nullable. Diese Abweichungen führten zu Tooling-Problemen und semantischen Widersprüchen. OpenAPI 3.1 ersetzt diese Teilmenge durch vollständige JSON Schema 2020-12 Kompatibilität: type kann jetzt ein Array sein (type: [string, null] statt nullable: true), $ref darf mit anderen Schlüsseln kombiniert werden, und alle JSON Schema Keywords sind valide.

Die zweite wichtige Änderung betrifft Webhooks: OpenAPI 3.1 hat ein neues Top-Level-Feld webhooks, das Callbacks dokumentiert die ein API-Anbieter an seine Konsumenten sendet. In 3.0 musste man Webhooks in callbacks innerhalb von Operations vergraben. Das neue Feld macht asynchrone Benachrichtigungen zu einem First-Class-Citizen der API-Spezifikation. Dritte wichtige Neuerung: info.license unterstützt jetzt ein identifier-Feld nach SPDX-Standard statt nur einer URL.

Für die Praxis bedeutet die Migration von 3.0 auf 3.1 hauptsächlich: alle nullable: true durch type: [string, null] oder oneOf: [{type: string}, {type: 'null'}] ersetzen, exclusiveMinimum/exclusiveMaximum anpassen (in 3.1 sind diese jetzt Zahlen statt Booleans, wie in JSON Schema 2020-12 definiert) und die openapi-Version auf 3.1.0 setzen. Tooling-Support für 3.1 ist seit 2023 breit verfügbar – Swagger UI, Redoc, Stoplight, und die meisten Code-Generatoren unterstützen 3.1 vollständig.

2. Info, Servers und das Root-Objekt

Jede OpenAPI 3.1 Spezifikation beginnt mit dem Root-Objekt, das die Version, Metadaten und die verfügbaren Server definiert. Das info-Objekt ist Pflicht und enthält mindestens title und version. Die version ist die API-Version, nicht die OpenAPI-Spezifikationsversion – ein häufiger Fehler bei Einsteigern. Das servers-Array definiert die Basis-URLs der API für verschiedene Umgebungen. Ohne servers nehmen Clients an, dass der Server relativ zum Speicherort der Spezifikation ist.

Das externalDocs-Feld ermöglicht, auf weiterführende Dokumentation zu verlinken. tags auf Root-Ebene definieren Gruppen mit Beschreibungen, die dann in Operations referenziert werden – das ist wichtig für eine saubere Dokumentationsstruktur. Das info.contact-Objekt mit Name, E-Mail und URL ist für öffentliche APIs unverzichtbar. Das info.termsOfService-Feld verlinkt die Nutzungsbedingungen. All diese Felder sind für automatisch generierte Dokumentationsseiten und Developer Portals relevante Metadaten.


# openapi.yaml — Root Object, vollständiges Beispiel OpenAPI 3.1
openapi: 3.1.0

info:
  title: Mironsoft Commerce API
  version: "2.0.0"
  description: |
    REST API für den Mironsoft Commerce-Stack.
    Unterstützte Authentifizierung: Bearer JWT, OAuth 2.0 (Authorization Code).
  contact:
    name: Mironsoft API Support
    email: api@mironsoft.de
    url: https://mironsoft.de/support
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary

servers:
  - url: https://api.mironsoft.de/v2
    description: Production
  - url: https://api-staging.mironsoft.de/v2
    description: Staging
  - url: http://localhost:8080/v2
    description: Local Development

tags:
  - name: orders
    description: Bestellungen anlegen, lesen und verwalten
    externalDocs:
      description: Order-Lifecycle Dokumentation
      url: https://docs.mironsoft.de/orders
  - name: products
    description: Produktkatalog und Lagerbestand
  - name: auth
    description: Authentifizierung und Token-Management

externalDocs:
  description: Vollständige Mironsoft Developer Docs
  url: https://docs.mironsoft.de

3. Paths und Operations: der Kern der API

Das paths-Objekt ist das Herzstück jeder OpenAPI-Spezifikation. Jeder Schlüssel ist ein URL-Pfad-Template, jeder Wert ein Path Item Object das die HTTP-Methoden und deren Operationen definiert. Eine Operation hat mindestens ein responses-Objekt, sollte aber auch operationId, summary, description und tags enthalten. Die operationId ist besonders wichtig: Code-Generatoren verwenden sie als Funktionsname, daher muss sie eindeutig, sprechend und konventionskonform sein – z.B. getOrderById, createOrder, updateOrderStatus.

Pfad-Templates nutzen geschweifte Klammern für Pfad-Parameter: /orders/{orderId}. Jeder in geschweiften Klammern definierte Parameter muss im parameters-Array der Operation (oder des Path Items) mit in: path deklariert werden. Path-Parameter sind immer required: true – das schreibt die Spezifikation vor. Auf Path-Item-Ebene definierte Parameter gelten für alle Operationen des Pfades und können in einzelnen Operationen überschrieben werden. Dieses Muster eignet sich für Auth-Parameter die für alle Methoden eines Endpoints gelten.


# Paths und Operations — vollständiges Beispiel für /orders/{orderId}
paths:
  /orders:
    post:
      operationId: createOrder
      summary: Neue Bestellung anlegen
      tags: [orders]
      security:
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrderRequest'
            examples:
              standard_order:
                $ref: '#/components/examples/StandardOrder'
      responses:
        '201':
          description: Bestellung erfolgreich angelegt
          headers:
            Location:
              description: URL der neuen Ressource
              schema:
                type: string
                format: uri
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'

  /orders/{orderId}:
    parameters:
      - name: orderId
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Eindeutige ID der Bestellung (UUID v4)

    get:
      operationId: getOrderById
      summary: Bestellung abrufen
      tags: [orders]
      security:
        - BearerAuth: []
      responses:
        '200':
          description: Bestellung gefunden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
        '404':
          $ref: '#/components/responses/NotFound'

4. Parameters: Path, Query, Header und Cookie

OpenAPI unterscheidet vier Arten von Parametern anhand des in-Feldes: path, query, header und cookie. Path-Parameter sind Bestandteile des URL-Pfades und immer required. Query-Parameter erscheinen nach dem ? und sind typischerweise optional für Filterung, Sortierung und Paginierung. Header-Parameter dokumentieren benutzerdefinierte HTTP-Header (Standard-Header wie Authorization werden über security definiert). Cookie-Parameter dokumentieren Werte, die über Cookies übertragen werden.

Jeder Parameter hat ein schema-Objekt, das den Datentyp und Validierungsregeln definiert. Für Query-Parameter mit komplexen Datenstrukturen ist das style-Feld wichtig: form (Standard), spaceDelimited, pipeDelimited oder deepObject steuern, wie Arrays und Objekte serialisiert werden. Das Feld explode: true (Standard für form) erzeugt separate Parameter pro Array-Element (?tag=a&tag=b), explode: false kombiniert sie (?tag=a,b). Diese Details sind entscheidend für die Kompatibilität mit automatisch generiertem Client-Code.

5. Schemas mit JSON Schema 2020-12

In OpenAPI 3.1 sind Schemas vollständige JSON Schema 2020-12 Objekte. Das bedeutet voller Zugriff auf alle JSON Schema Keywords: type als Array, if/then/else für bedingte Validierung, $defs für lokale Definitionen, unevaluatedProperties für strenge Schemas und prefixItems für typisierte Tuple-Arrays. Die wichtigste praktische Änderung gegenüber OpenAPI 3.0: nullable: true existiert nicht mehr. Stattdessen wird type: [string, "null"] oder ein oneOf mit einem Null-Type verwendet.

Gut designte Schemas nutzen description, example (oder examples), default, minimum/maximum, minLength/maxLength, pattern und enum wo sinnvoll. Diese Felder sind nicht nur für Dokumentation wichtig – sie steuern die Validierung in Mock-Servern, die Codegenerierung in Client-SDKs und die Validierungslogik in serverseitigen Middleware-Layern. Ein Schema ohne Beschreibungen und Beispiele ist technisch korrekt, aber für Konsumenten weitgehend nutzlos.


# Schemas mit JSON Schema 2020-12 — OpenAPI 3.1 Beispiel
components:
  schemas:
    Order:
      type: object
      required: [id, status, items, total, createdAt]
      description: Vollständige Bestellrepräsentation
      properties:
        id:
          type: string
          format: uuid
          description: Eindeutige Bestellungs-ID
          examples: ["550e8400-e29b-41d4-a716-446655440000"]
          readOnly: true
        status:
          type: string
          enum: [pending, confirmed, shipped, delivered, cancelled]
          description: Aktueller Status der Bestellung
        items:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/OrderItem'
        total:
          type: object
          required: [amount, currency]
          properties:
            amount:
              type: number
              format: decimal
              minimum: 0
              exclusiveMinimum: true
              description: Gesamtbetrag in der angegebenen Währung
            currency:
              type: string
              pattern: '^[A-Z]{3}$'
              description: ISO 4217 Währungscode
              examples: ["EUR", "USD"]
        note:
          type: ["string", "null"]
          maxLength: 500
          description: Optionale Bestellnotiz (null wenn nicht gesetzt)
        createdAt:
          type: string
          format: date-time
          readOnly: true
      additionalProperties: false

6. Components: Wiederverwendung ohne Duplikate

Das components-Objekt ist das Bibliotheks-System von OpenAPI. Es enthält wiederverwendbare Definitionen, auf die mit $ref verwiesen werden kann. Verfügbare Sektionen: schemas, responses, parameters, examples, requestBodies, headers, securitySchemes, links, callbacks und – neu in 3.1 – pathItems. Die konsequente Nutzung von components ist der wichtigste Faktor für eine wartbare OpenAPI-Spezifikation. Wer Schemas inline in Operationen definiert, erzeugt Duplikate die bei Änderungen an vielen Stellen angepasst werden müssen.

Für gemeinsame Fehlerresponses lohnt sich ein standardisiertes Error-Schema. Eine RFC 9457 Problem Details-kompatible Fehlerstruktur mit type, title, status, detail und instance ist in components/schemas definiert und wird von allen Fehler-Responses in components/responses referenziert. So haben alle 4xx- und 5xx-Antworten automatisch ein einheitliches Format, das in einer einzigen Änderung aktualisiert werden kann.

7. Security Schemes: Bearer, OAuth2 und API-Key

OpenAPI 3.1 unterstützt vier Security-Scheme-Typen: http (für Basic und Bearer), apiKey, oauth2 und openIdConnect. Security-Schemes werden in components/securitySchemes definiert und können dann auf Root-Ebene als Standard oder auf Operations-Ebene gezielt angewendet werden. Ein leeres Array security: [] in einer Operation überschreibt die globale Security und markiert den Endpoint als öffentlich zugänglich.

OAuth 2.0 in OpenAPI ist besonders komplex: Das oauth2-Schema enthält für jeden Flow (authorizationCode, clientCredentials, implicit, password) separate Konfigurationen mit Authorization-URL, Token-URL und Scope-Definitionen. Scopes werden in der Operation im Security-Array als String-Array angegeben. Die Scope-Definitionen müssen vollständig und sprechend sein – Swagger UI generiert daraus die OAuth-Consent-UI in der interaktiven Dokumentation.


# Security Schemes — Bearer JWT + OAuth 2.0 in OpenAPI 3.1
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: |
        JWT Bearer Token. Abrufen via POST /auth/token.
        Header: Authorization: Bearer <token>

    OAuth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://auth.mironsoft.de/oauth/authorize
          tokenUrl: https://auth.mironsoft.de/oauth/token
          refreshUrl: https://auth.mironsoft.de/oauth/token/refresh
          scopes:
            orders:read: Bestellungen lesen
            orders:write: Bestellungen erstellen und aktualisieren
            products:read: Produktkatalog lesen
            admin: Administrativer Zugriff auf alle Ressourcen

    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: API-Key für Server-zu-Server Kommunikation

# Global security — gilt für alle Operationen
security:
  - BearerAuth: []

# Öffentlicher Endpoint — überschreibt globale Security
paths:
  /products:
    get:
      operationId: listProducts
      security: []  # Public endpoint, no auth required
      summary: Produkte öffentlich abrufen
      tags: [products]
      responses:
        '200':
          description: Produktliste

8. OpenAPI 3.0 vs. 3.1 im direkten Vergleich

Der Wechsel von OpenAPI 3.0 auf 3.1 ist für die meisten APIs keine Breaking Change auf API-Ebene, erfordert aber Anpassungen in der Spezifikationsdatei. Die folgende Tabelle zeigt die wichtigsten Unterschiede und Migrationsschritte für Teams, die eine bestehende 3.0 Spezifikation aktualisieren wollen.

Feature OpenAPI 3.0 OpenAPI 3.1 Migration
Nullable Felder nullable: true type: [string, "null"] Suchen & Ersetzen + Typ anpassen
JSON Schema Version Subset von Draft 7 Vollständig 2020-12 Alle neuen Keywords verfügbar
Webhooks In callbacks nested Top-Level webhooks In eigene Section auslagern
$ref mit Siblings Nicht erlaubt Vollständig unterstützt Kein allOf-Wrapper mehr nötig
exclusiveMin/Max Boolean Numerischer Wert Wert direkt angeben

9. Zusammenfassung

OpenAPI 3.1 ist ein vollständig durchdachter Standard, der alle Aspekte einer REST API beschreiben kann – von einfachen CRUD-Endpoints bis zu komplexen OAuth-Flows und asynchronen Webhooks. Die wichtigsten Bausteine: Das Root-Objekt mit Info und Servers, das Paths-Objekt mit Operationen und operationId, das Parameters-System mit den vier Typen, JSON Schema 2020-12 für Schemas, Components für Wiederverwendung und Security Schemes für Authentifizierung. Wer alle diese Bausteine konsequent einsetzt, erhält eine Spezifikation, die Codegenerierung, Mock-Server, Validierung und interaktive Dokumentation ohne Nacharbeit unterstützt.

Der größte Hebel für neue Teams: Die operationId konsequent und sprechend benennen, alle Fehlerresponses in components/responses zentralisieren und Schemas immer in components/schemas definieren – niemals inline. Diese drei Entscheidungen verhindern die häufigsten Wartungsprobleme und machen die Spezifikation für Code-Generatoren optimal nutzbar.

OpenAPI 3.1 Bausteine — Das Wichtigste auf einen Blick

Root & Paths

info, servers, tags auf Root-Ebene. Paths mit Path Items und Operationen. operationId eindeutig und sprechend benennen – wird Funktionsname in SDKs.

Schemas (JSON Schema 2020-12)

type als Array für nullable Felder. if/then/else für bedingte Validierung. additionalProperties: false für strenge Schemas. Immer description und examples.

Components

Schemas, Responses, Parameters, Examples, RequestBodies zentral definieren. $ref für Wiederverwendung. Kein Inline-Schema in Operationen für wartbare Specs.

Security

BearerAuth für JWT, OAuth2 für Authorization Code Flow, ApiKey für Server-zu-Server. Globale Security auf Root-Ebene, security: [] für öffentliche Endpoints.

Mironsoft

OpenAPI Design, API-Dokumentation und Codegenerierung

OpenAPI-Spezifikation professionell aufsetzen?

Wir erstellen vollständige OpenAPI 3.1 Spezifikationen für REST APIs – von der Schema-Architektur über Security-Konfiguration bis zu generierten Client-SDKs und Mock-Servern.

Schema-Design

JSON Schema 2020-12 Schemas für alle API-Objekte

API Review

Bestehende Specs auf OpenAPI 3.1 Qualität prüfen

Codegenerierung

Client-SDKs und Server-Stubs aus der Spec generieren

10. FAQ: OpenAPI 3.1 Bausteine

1Größter Unterschied 3.0 vs. 3.1?
Vollständige JSON Schema 2020-12 Kompatibilität. nullable: true wird durch type: [string, null] ersetzt. $ref darf mit anderen Keywords kombiniert werden. Neues webhooks Top-Level-Feld.
2Wozu dient die operationId?
Eindeutiger Bezeichner, der von Code-Generatoren als Funktionsname verwendet wird. Muss eindeutig und sprechend sein: getOrderById, createOrder, updateOrderStatus.
3$ref vs. inline Schemas?
$ref verweist auf components/schemas, inline Schemas sind direkt in der Operation. Immer $ref bevorzugen – verhindert Duplikate und erleichtert Wartung.
4Öffentlicher Endpoint ohne Auth?
security: [] auf Operations-Ebene. Das leere Array überschreibt die globale Security und markiert den Endpoint als öffentlich zugänglich.
5Nullable in OpenAPI 3.1?
type: [string, "null"] – type als Array statt nullable: true. Entspricht dem JSON Schema 2020-12 Standard.
6Was gehört in components/responses?
Alle wiederverwendbaren Fehlerresponses: ValidationError, Unauthorized, Forbidden, NotFound, InternalServerError – mit einheitlichem RFC 9457 Error-Schema.
7style: form vs. deepObject?
form: ?filter=value (flach). deepObject: ?filter[status]=active (verschachtelt). deepObject für komplexe Filter-Parameter in REST APIs.
8readOnly vs. writeOnly?
readOnly: nur in Responses (id, createdAt). writeOnly: nur in Requests (password). Beide steuern Codegenerierung und Schema-Validierung.
9Externe YAML-Dateien referenzieren?
$ref: './schemas/order.yaml#/Order' – relative Pfade zu YAML oder JSON. Redocly CLI kann Dateien vor Deployment zusammenführen (bundle).
10Tooling-Unterstützung für OpenAPI 3.1?
Seit 2023 breit verfügbar: Swagger UI 5+, Redoc 2.1+, openapi-generator 7+, Redocly CLI, Spectral. Alle gängigen API-Gateways unterstützen 3.1.