{
  "openapi": "3.1.0",
  "info": {
    "title": "Thinkdigital GmbH – Anfrage",
    "version": "2.0.0",
    "description": "KI-Strategie, KI-Schulungen, Einführung von KI-Tools und individuelle KI-Lösungen für den Mittelstand. Über diese Schnittstelle können KI-Assistenten im Auftrag einer Person eine Anfrage an Thinkdigital GmbH senden. Nur im Auftrag und mit ausdrücklicher Zustimmung der Person senden, mit ihrer echten E-Mail-Adresse.\n\n- Erfolg (200, `\"status\": \"sent\"`): Die Anfrage wurde dem E-Mail-Dienst zur Zustellung an Thinkdigital übergeben. Das bestätigt die Annahme, nicht die Zustellung oder eine Antwortzeit.\n- Wiederholungen: Gleicher Inhalt — oder gleicher Header `Idempotency-Key` bei gleicher E-Mail-Adresse — innerhalb von 24 Stunden liefert dieselbe `requestId` und löst keine weitere E-Mail aus.\n- Begrenzung: höchstens 5 neue Anfragen pro 60 Minuten von derselben Adresse; Wiederholungen zählen nicht."
  },
  "servers": [
    {
      "url": "https://www.thinkdigital.com"
    }
  ],
  "paths": {
    "/api/anfrage": {
      "post": {
        "operationId": "anfrageSenden",
        "summary": "Anfrage an Thinkdigital senden",
        "description": "Übermittelt eine Anfrage per E-Mail an info@thinkdigital.com. Nur im Auftrag und mit ausdrücklicher Zustimmung der Person senden, mit ihrer echten E-Mail-Adresse.",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optionaler eigener Schlüssel für Wiederholungsversuche (1–200 sichtbare ASCII-Zeichen). Ohne Header wird der Inhalt der Anfrage als Schlüssel verwendet.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Anfrage"
              },
              "example": {
                "name": "Erika Mustermann",
                "email": "erika@beispiel.de",
                "company": "Beispiel GmbH",
                "topic": "schulungen",
                "message": "Wir möchten unser Vertriebsteam (12 Personen) im Umgang mit KI schulen.",
                "assistant": "ChatGPT"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/Anfrage"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Erfolg (200, `\"status\": \"sent\"`): Die Anfrage wurde dem E-Mail-Dienst zur Zustellung an Thinkdigital übergeben. Das bestätigt die Annahme, nicht die Zustellung oder eine Antwortzeit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erfolg"
                },
                "example": {
                  "ok": true,
                  "requestId": "anf_3cbed206faa170bd17b8",
                  "status": "sent",
                  "message": "Die Anfrage wurde dem E-Mail-Dienst zur Zustellung an Thinkdigital übergeben. Das bestätigt die Annahme, nicht die Zustellung oder eine Antwortzeit. Die Antwort kommt an erika@beispiel.de."
                }
              }
            }
          },
          "400": {
            "description": "`invalid_json`: Der Request-Body ist kein gültiges JSON-Objekt. `validation_error`: Ein Feld fehlt oder ist ungültig; `field` nennt das Feld. `idempotency_key_invalid`: Der Header Idempotency-Key ist leer, länger als 200 Zeichen oder enthält unzulässige Zeichen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fehler"
                },
                "examples": {
                  "invalid_json": {
                    "value": {
                      "ok": false,
                      "code": "invalid_json",
                      "error": "Der Request-Body ist kein gültiges JSON-Objekt."
                    }
                  },
                  "validation_error": {
                    "value": {
                      "ok": false,
                      "code": "validation_error",
                      "error": "Die E-Mail-Adresse ist ungültig.",
                      "field": "email"
                    }
                  },
                  "idempotency_key_invalid": {
                    "value": {
                      "ok": false,
                      "code": "idempotency_key_invalid",
                      "error": "Der Header Idempotency-Key ist leer, länger als 200 Zeichen oder enthält unzulässige Zeichen."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`idempotency_conflict`: Derselbe Idempotency-Key wurde bereits mit anderem Inhalt verwendet. `idempotency_in_progress`: Eine Anfrage mit demselben Schlüssel wird gerade verarbeitet; später erneut versuchen (Retry-After).",
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum nächsten Versuch",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fehler"
                },
                "examples": {
                  "idempotency_conflict": {
                    "value": {
                      "ok": false,
                      "code": "idempotency_conflict",
                      "error": "Derselbe Idempotency-Key wurde bereits mit anderem Inhalt verwendet."
                    }
                  },
                  "idempotency_in_progress": {
                    "value": {
                      "ok": false,
                      "code": "idempotency_in_progress",
                      "error": "Eine Anfrage mit demselben Schlüssel wird gerade verarbeitet; später erneut versuchen (Retry-After)."
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "`payload_too_large`: Der Request-Body ist größer als 20 KB.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fehler"
                },
                "examples": {
                  "payload_too_large": {
                    "value": {
                      "ok": false,
                      "code": "payload_too_large",
                      "error": "Der Request-Body ist größer als 20 KB."
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "`unsupported_media_type`: Nur application/json, application/x-www-form-urlencoded oder multipart/form-data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fehler"
                },
                "examples": {
                  "unsupported_media_type": {
                    "value": {
                      "ok": false,
                      "code": "unsupported_media_type",
                      "error": "Nur application/json, application/x-www-form-urlencoded oder multipart/form-data."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "`rate_limited`: Mehr als 5 neue Anfragen innerhalb von 60 Minuten von derselben Adresse; Retry-After beachten.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum nächsten Versuch",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fehler"
                },
                "examples": {
                  "rate_limited": {
                    "value": {
                      "ok": false,
                      "code": "rate_limited",
                      "error": "Mehr als 5 neue Anfragen innerhalb von 60 Minuten von derselben Adresse; Retry-After beachten."
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "`send_failed`: Der E-Mail-Dienst hat die Nachricht nicht angenommen; später erneut versuchen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fehler"
                },
                "examples": {
                  "send_failed": {
                    "value": {
                      "ok": false,
                      "code": "send_failed",
                      "error": "Der E-Mail-Dienst hat die Nachricht nicht angenommen; später erneut versuchen."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "`not_configured`: Der E-Mail-Versand ist derzeit nicht eingerichtet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fehler"
                },
                "examples": {
                  "not_configured": {
                    "value": {
                      "ok": false,
                      "code": "not_configured",
                      "error": "Der E-Mail-Versand ist derzeit nicht eingerichtet."
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Anfrage": {
        "type": "object",
        "required": [
          "name",
          "email",
          "message"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name der anfragenden Person",
            "minLength": 2,
            "maxLength": 200
          },
          "email": {
            "type": "string",
            "description": "E-Mail-Adresse der anfragenden Person für die Antwort",
            "maxLength": 254,
            "format": "email"
          },
          "company": {
            "type": "string",
            "description": "Unternehmen",
            "maxLength": 200
          },
          "topic": {
            "type": "string",
            "description": "Thema der Anfrage",
            "maxLength": 40,
            "enum": [
              "strategie",
              "schulungen",
              "ki-tools",
              "assistenten",
              "agenten",
              "integration",
              "modernisierung",
              "sonstiges"
            ]
          },
          "message": {
            "type": "string",
            "description": "Anliegen in eigenen Worten",
            "minLength": 10,
            "maxLength": 5000
          },
          "assistant": {
            "type": "string",
            "description": "Name des KI-Assistenten, der die Anfrage übermittelt, z. B. ChatGPT",
            "maxLength": 100
          }
        },
        "additionalProperties": true
      },
      "Erfolg": {
        "type": "object",
        "required": [
          "ok",
          "requestId",
          "status",
          "message"
        ],
        "properties": {
          "ok": {
            "const": true
          },
          "requestId": {
            "type": "string",
            "pattern": "^anf_[0-9a-f]{20}$",
            "description": "Gleich bei Wiederholungen derselben Anfrage"
          },
          "status": {
            "const": "sent",
            "description": "Dem E-Mail-Dienst zur Zustellung übergeben"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "Fehler": {
        "type": "object",
        "required": [
          "ok",
          "code",
          "error"
        ],
        "properties": {
          "ok": {
            "const": false
          },
          "code": {
            "type": "string",
            "enum": [
              "invalid_json",
              "validation_error",
              "idempotency_key_invalid",
              "idempotency_conflict",
              "idempotency_in_progress",
              "payload_too_large",
              "unsupported_media_type",
              "rate_limited",
              "send_failed",
              "not_configured"
            ]
          },
          "error": {
            "type": "string",
            "description": "Lesbare Fehlermeldung (Deutsch)"
          },
          "field": {
            "type": "string",
            "enum": [
              "name",
              "email",
              "company",
              "topic",
              "message",
              "assistant"
            ],
            "description": "Nur bei validation_error"
          }
        }
      }
    }
  }
}