{
  "components": {
    "schemas": {
      "BulkBatchResponse": {
        "properties": {
          "data": {
            "description": "Ergebnis einer Sammelbestellung. TEILERFOLG: Fehlerhafte Zeilen blockieren andere nicht; nur `done`-Zeilen werden belastet. Kein LPA/QR; je `order_id` über GET /v1/orders/{id} abrufen.",
            "properties": {
              "created_at": {
                "format": "date-time",
                "type": "string"
              },
              "external_ref": {
                "example": "batch-2026-001",
                "nullable": true,
                "type": "string"
              },
              "failed_lines": {
                "type": "integer"
              },
              "id": {
                "format": "uuid",
                "type": "string"
              },
              "items": {
                "items": {
                  "$ref": "#/components/schemas/BulkLineResult"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "status": {
                "description": "`pending`: Nach einer Unterbrechung sind noch Zeilen offen. Rufen Sie mit demselben `Idempotency-Key` erneut auf, um sie abzuschließen.",
                "enum": [
                  "pending",
                  "completed",
                  "partial",
                  "failed"
                ],
                "type": "string"
              },
              "succeeded_lines": {
                "type": "integer"
              },
              "total_charged": {
                "$ref": "#/components/schemas/Money"
              },
              "total_lines": {
                "type": "integer"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "BulkLineResult": {
        "properties": {
          "charged": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Money"
              }
            ],
            "nullable": true
          },
          "error": {
            "description": "Echter Fehlercode `domain.reason`, z. B. `wallet.insufficient_balance`, `esim.out_of_stock`, `order.package_not_allowed`, `wallet.velocity_exceeded`.",
            "nullable": true,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "external_ref": {
            "example": "po-1001",
            "nullable": true,
            "type": "string"
          },
          "line_no": {
            "description": "Ab 1, genau in der eingereichten Reihenfolge.",
            "type": "integer"
          },
          "order_id": {
            "format": "uuid",
            "nullable": true,
            "type": "string"
          },
          "package_code": {
            "type": "string"
          },
          "quantity": {
            "type": "integer"
          },
          "status": {
            "enum": [
              "pending",
              "done",
              "failed"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "BulkRequest": {
        "properties": {
          "external_ref": {
            "description": "Referenz für den GESAMTEN Auftrag, in der Auftragsantwort zurückgegeben.",
            "example": "batch-2026-001",
            "nullable": true,
            "type": "string"
          },
          "items": {
            "description": "Jeder Eintrag erstellt eine unabhängige Bestellung. Konfigurierbares Zeilenlimit (Standard 100); Überschreitung: `internal.limit_exceeded` (422).",
            "items": {
              "properties": {
                "external_ref": {
                  "description": "Referenz nur für DIESE Zeile, unverändert im Zeilenergebnis zurückgegeben.",
                  "example": "po-1001",
                  "nullable": true,
                  "type": "string"
                },
                "package_code": {
                  "description": "Paketcode aus IHREM Katalog, also `public_sku`. Pro Paket UNVERÄNDERLICH, auch bei Anbieterwechsel, daher als Abgleichschlüssel geeignet. Der Beispielwert hat das richtige Format, funktioniert aber NICHT; echten Code aus `GET /v1/catalog/packages` abrufen.",
                  "example": "TKE-VN-30D-X3K9F",
                  "type": "string"
                },
                "quantity": {
                  "example": 5,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "required": [
                "package_code",
                "quantity"
              ],
              "type": "object"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "CancelResponse": {
        "properties": {
          "data": {
            "properties": {
              "cancelled_at": {
                "format": "date-time",
                "type": "string"
              },
              "esim_id": {
                "format": "uuid",
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "refund_suggested": {
                "description": "`true`: Erstattung wartet auf manuelle Freigabe; es wurde noch kein Geld bewegt. `refunded.amount = 0` bedeutet nicht, dass keine Erstattung vorgesehen ist.",
                "type": "boolean"
              },
              "refunded": {
                "$ref": "#/components/schemas/Money",
                "description": "Bei dieser Stornierung tatsächlich in Ihr Wallet ZURÜCKGEFLOSSENER Betrag. Im Live-Betrieb meist `0`; prüfen Sie zuerst `refund_suggested`."
              },
              "status": {
                "example": "cancelled",
                "type": "string"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "Cancellable": {
        "description": "Stornierbarkeit der eSIM und Ablehnungsgrund; vor `POST /v1/esims/{order_item_id}/cancel` prüfen. Dieser Block ist immer vorhanden, nie `null`: Er ist die Antwort.",
        "properties": {
          "allowed": {
            "type": "boolean"
          },
          "disclosed_at": {
            "description": "Zeitpunkt, zu dem der Code unser System verlassen hat (ISO-8601 UTC); `null`, solange niemand ihn gesehen hat. Nachweis bei strittiger Offenlegung und verweigerter Stornierung.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "reason": {
            "description": "Stornierungsgrund: `code_disclosed` (Code versendet oder angezeigt), `wrong_status` (falscher Zustand), `expired` (Tarif abgelaufen), `not_supported` (Funktion nicht angegeben). `null` bei `allowed = true`. Wie `meta.reason` bei `esim.not_cancellable`.",
            "enum": [
              "code_disclosed",
              "wrong_status",
              "expired",
              "not_supported",
              null
            ],
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "ChangePlanRequest": {
        "properties": {
          "package_code": {
            "description": "Paketcode aus IHREM Katalog, also `public_sku`. Pro Paket UNVERÄNDERLICH, auch bei Anbieterwechsel, daher als Abgleichschlüssel geeignet. Der Beispielwert hat das richtige Format, funktioniert aber NICHT; echten Code aus `GET /v1/catalog/packages` abrufen.",
            "example": "TKE-VN-7D-P4M2Q",
            "type": "string"
          }
        },
        "required": [
          "package_code"
        ],
        "type": "object"
      },
      "ChangePlanResponse": {
        "properties": {
          "data": {
            "description": "Ergebnis des eSIM-Paketwechsels.",
            "properties": {
              "charged": {
                "$ref": "#/components/schemas/Money"
              },
              "current_plan": {
                "properties": {
                  "code": {
                    "type": "string"
                  },
                  "expires_at": {
                    "format": "date-time",
                    "nullable": true,
                    "type": "string"
                  },
                  "started_at": {
                    "format": "date-time",
                    "nullable": true,
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "esim_id": {
                "format": "uuid",
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "order_id": {
                "format": "uuid",
                "type": "string"
              },
              "previous_plan": {
                "nullable": true,
                "properties": {
                  "cancelled_at": {
                    "format": "date-time",
                    "nullable": true,
                    "type": "string"
                  },
                  "code": {
                    "type": "string"
                  },
                  "remaining_bytes_forfeited": {
                    "format": "int64",
                    "nullable": true,
                    "type": "integer"
                  }
                },
                "type": "object"
              },
              "warning": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "CreateOrderRequest": {
        "properties": {
          "external_ref": {
            "description": "Ihre eigene Referenz, unverändert in Antwort und Webhooks zurückgegeben.",
            "example": "po-1001",
            "nullable": true,
            "type": "string"
          },
          "include": {
            "description": "Zusatzblöcke: `[\"lpa\"]` oder `[\"lpa\",\"qr\"]`. Ohne Angabe bleibt `items[].install` `null` und jede eSIM stornierbar. **DIE AUSGABE DES CODES IST SEINE OFFENLEGUNG**: `lpa` schließt das Stornierungsfenster bereits bei Bestellung.",
            "example": [
              "lpa"
            ],
            "items": {
              "enum": [
                "lpa",
                "qr"
              ],
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "invoice_buyer": {
            "$ref": "#/components/schemas/MemberInvoiceBuyer"
          },
          "items": {
            "description": "Zu kaufende Pakete und Mengen (höchstens 50 eSIMs).",
            "items": {
              "properties": {
                "package_code": {
                  "description": "Paketcode aus IHREM Katalog, also `public_sku`. Pro Paket UNVERÄNDERLICH, auch bei Anbieterwechsel, daher als Abgleichschlüssel geeignet. Der Beispielwert hat das richtige Format, funktioniert aber NICHT; echten Code aus `GET /v1/catalog/packages` abrufen.",
                  "example": "TKE-VN-30D-X3K9F",
                  "type": "string"
                },
                "quantity": {
                  "description": "Anzahl der für dieses Paket zu kaufenden eSIMs (≥ 1).",
                  "example": 2,
                  "type": "integer"
                }
              },
              "required": [
                "package_code",
                "quantity"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "CreateWebhookResponse": {
        "properties": {
          "data": {
            "properties": {
              "active": {
                "description": "`false`: Keine neuen Ereignisse nach Pausierung im Dashboard oder Schlüsselwiderruf (Abschaltung in derselben Transaktion). Ein erfolgreicher CHECK_HEALTH bei `PUT /v1/webhooks/{id}` aktiviert den Endpunkt wieder.",
                "type": "boolean"
              },
              "created_at": {
                "format": "date-time",
                "type": "string"
              },
              "events": {
                "description": "Leer = alles empfangen.",
                "items": {
                  "enum": [
                    "order.completed",
                    "order.failed",
                    "esim.delivered",
                    "esim.activated",
                    "esim.usage_threshold",
                    "esim.expiring",
                    "wallet.low_balance",
                    "catalog.updated"
                  ],
                  "type": "string"
                },
                "type": "array"
              },
              "health_check": {
                "enum": [
                  "passed"
                ],
                "type": "string"
              },
              "id": {
                "description": "Endpoint-ID für `/v1/webhooks/{id}`. Jede Erstellung erzeugt eine NEUE ID. Löschen und Neuanlegen erzeugt einen anderen Endpoint, keine Wiederherstellung des alten.",
                "format": "uuid",
                "type": "string"
              },
              "last_delivery_at": {
                "description": "Letzte Zustellung über diesen Endpoint. `null` = nie zugestellt, nicht fehlgeschlagen. Erster Prüfpunkt, wenn ein Partner keine Webhooks erhält.",
                "format": "date-time",
                "nullable": true,
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "secret_last4": {
                "description": "Letzte vier Zeichen des Webhook-Geheimnisses, um den verwendeten Signierschlüssel zu prüfen, ohne das Geheimnis erneut offenzulegen. Vollständig nur EINMAL bei Erstellung sichtbar.",
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "webhook_secret": {
                "description": "NUR EINMAL bei Erstellung angezeigt (Präfix `whsec_`).",
                "type": "string"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "DeleteWebhookResponse": {
        "properties": {
          "data": {
            "properties": {
              "deleted_at": {
                "format": "date-time",
                "type": "string"
              },
              "id": {
                "format": "uuid",
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "Delivery": {
        "properties": {
          "attempts": {
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "event_id": {
            "description": "Kennung des EREIGNISSES. Wiederholung erzeugt eine NEUE Zustellung mit GLEICHER `event_id`. Zur Duplikaterkennung `event_id`, nicht die Zustell-`id` verwenden.",
            "format": "uuid",
            "type": "string"
          },
          "event_type": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "last_attempt_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "next_retry_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "response_code": {
            "nullable": true,
            "type": "integer"
          },
          "status": {
            "enum": [
              "pending",
              "delivered",
              "failed"
            ],
            "type": "string"
          },
          "webhook_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "type": "object"
      },
      "DeliveryListResponse": {
        "properties": {
          "data": {
            "properties": {
              "items": {
                "items": {
                  "$ref": "#/components/schemas/Delivery"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "next_cursor": {
                "description": "Für die nächste Seite UNVERÄNDERT zurücksenden. `null` ist das EINZIGE Endsignal. Auch auf eine Seite mit weniger als `page_size` Einträgen können weitere folgen.",
                "nullable": true,
                "type": "string"
              },
              "page_size": {
                "description": "MAXIMALE Datensatzanzahl, die der Server für diese Seite verwendet hat, bereits begrenzt. Nicht die tatsächliche Anzahl in `items`.",
                "nullable": true,
                "type": "integer"
              },
              "total": {
                "description": "Anzahl der zum Filter passenden Zeilen. `null`, wenn das Zählen zu aufwendig ist. Nicht zur Erkennung des Endes verwenden; dafür dient `next_cursor`.",
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "warnings": {
                "description": "Erklärung der Liste; leer ohne Besonderheiten. Geschlossene Codes: `filtered_by_key_package_filters`, `filtered_by_provider_scope`, `no_price_for_org`, `price_filter_removed_rows`, `provider_disabled`, `capability_missing`. Sie stehen für Schlüsselregeln, Anbieterumfang, fehlende Preise, Preisfilter, deaktivierte Anbieter oder fehlende Fähigkeiten. `count` ist die betroffene Zeilenzahl, sonst `null`.",
                "example": [],
                "items": {
                  "$ref": "#/components/schemas/ListWarning"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "DeliveryReplayResponse": {
        "properties": {
          "data": {
            "properties": {
              "attempts": {
                "type": "integer"
              },
              "created_at": {
                "format": "date-time",
                "type": "string"
              },
              "event_id": {
                "description": "Kennung des EREIGNISSES. Wiederholung erzeugt eine NEUE Zustellung mit GLEICHER `event_id`. Zur Duplikaterkennung `event_id`, nicht die Zustell-`id` verwenden.",
                "format": "uuid",
                "type": "string"
              },
              "event_type": {
                "type": "string"
              },
              "id": {
                "format": "uuid",
                "type": "string"
              },
              "last_attempt_at": {
                "format": "date-time",
                "nullable": true,
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "next_retry_at": {
                "format": "date-time",
                "nullable": true,
                "type": "string"
              },
              "response_code": {
                "nullable": true,
                "type": "integer"
              },
              "status": {
                "enum": [
                  "pending",
                  "delivered",
                  "failed"
                ],
                "type": "string"
              },
              "webhook_id": {
                "format": "uuid",
                "type": "string"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "ErrorEnvelope": {
        "properties": {
          "error": {
            "properties": {
              "code": {
                "description": "Code im Format `domain.reason` (siehe Fehlertabelle).",
                "type": "string"
              },
              "field": {
                "nullable": true,
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "meta": {
                "nullable": true,
                "type": "object"
              },
              "request_id": {
                "type": "string"
              }
            },
            "required": [
              "code",
              "message",
              "request_id"
            ],
            "type": "object"
          },
          "ok": {
            "enum": [
              false
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "error"
        ],
        "type": "object"
      },
      "Esim": {
        "properties": {
          "data": {
            "properties": {
              "cancellable": {
                "$ref": "#/components/schemas/Cancellable"
              },
              "external_ref": {
                "description": "Ihre Bestellreferenz (`external_ref` beim Kauf), zur Zuordnung der eSIM zu Ihrer Bestellung. `null`, wenn nicht angegeben.",
                "nullable": true,
                "type": "string"
              },
              "iccid": {
                "example": "8984012345678901234",
                "nullable": true,
                "type": "string"
              },
              "id": {
                "description": "eSIM-ID für alle `/v1/esims/{id}/…`-Pfade, zugleich `order_item_id` in Webhooks. Liegt nur die ICCID vor, `GET /v1/esims?iccid=…` aufrufen, um die `id` zu erhalten.",
                "format": "uuid",
                "type": "string"
              },
              "install": {
                "$ref": "#/components/schemas/Install"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "msisdn": {
                "nullable": true,
                "type": "string"
              },
              "order_id": {
                "format": "uuid",
                "type": "string"
              },
              "package_code": {
                "description": "Paket-CODE aus dem Katalog als Zuordnungsschlüssel für diese eSIM. Nur `null`, wenn das Ursprungspaket aus dem Katalog entfernt wurde.",
                "nullable": true,
                "type": "string"
              },
              "package_name": {
                "description": "Lesbarer Anzeigename, der sich ändern kann. NICHT als Abgleichschlüssel verwenden.",
                "type": "string"
              },
              "plan": {
                "$ref": "#/components/schemas/PlanView"
              },
              "smdp_status": {
                "example": "released",
                "nullable": true,
                "type": "string"
              },
              "status": {
                "example": "delivered",
                "type": "string"
              },
              "updated_at": {
                "format": "date-time",
                "type": "string"
              },
              "usage": {
                "$ref": "#/components/schemas/Usage"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "EsimItem": {
        "properties": {
          "cancellable": {
            "$ref": "#/components/schemas/Cancellable"
          },
          "external_ref": {
            "description": "Ihre Bestellreferenz (`external_ref` beim Kauf), zur Zuordnung der eSIM zu Ihrer Bestellung. `null`, wenn nicht angegeben.",
            "nullable": true,
            "type": "string"
          },
          "iccid": {
            "example": "8984012345678901234",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "eSIM-ID für alle `/v1/esims/{id}/…`-Pfade, zugleich `order_item_id` in Webhooks. Liegt nur die ICCID vor, `GET /v1/esims?iccid=…` aufrufen, um die `id` zu erhalten.",
            "format": "uuid",
            "type": "string"
          },
          "install": {
            "$ref": "#/components/schemas/Install"
          },
          "msisdn": {
            "nullable": true,
            "type": "string"
          },
          "order_id": {
            "format": "uuid",
            "type": "string"
          },
          "package_code": {
            "description": "Paket-CODE aus dem Katalog als Zuordnungsschlüssel für diese eSIM. Nur `null`, wenn das Ursprungspaket aus dem Katalog entfernt wurde.",
            "nullable": true,
            "type": "string"
          },
          "package_name": {
            "description": "Lesbarer Anzeigename, der sich ändern kann. NICHT als Abgleichschlüssel verwenden.",
            "type": "string"
          },
          "plan": {
            "$ref": "#/components/schemas/PlanView"
          },
          "smdp_status": {
            "example": "released",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "example": "delivered",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "usage": {
            "$ref": "#/components/schemas/Usage"
          }
        },
        "type": "object"
      },
      "EsimListResponse": {
        "properties": {
          "data": {
            "properties": {
              "items": {
                "items": {
                  "$ref": "#/components/schemas/EsimItem"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "next_cursor": {
                "description": "Für die nächste Seite UNVERÄNDERT zurücksenden. `null` ist das EINZIGE Endsignal. Auch auf eine Seite mit weniger als `page_size` Einträgen können weitere folgen.",
                "nullable": true,
                "type": "string"
              },
              "page_size": {
                "description": "MAXIMALE Datensatzanzahl, die der Server für diese Seite verwendet hat, bereits begrenzt. Nicht die tatsächliche Anzahl in `items`.",
                "nullable": true,
                "type": "integer"
              },
              "total": {
                "description": "Anzahl der zum Filter passenden Zeilen. `null`, wenn das Zählen zu aufwendig ist. Nicht zur Erkennung des Endes verwenden; dafür dient `next_cursor`.",
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "warnings": {
                "description": "Erklärung der Liste; leer ohne Besonderheiten. Geschlossene Codes: `filtered_by_key_package_filters`, `filtered_by_provider_scope`, `no_price_for_org`, `price_filter_removed_rows`, `provider_disabled`, `capability_missing`. Sie stehen für Schlüsselregeln, Anbieterumfang, fehlende Preise, Preisfilter, deaktivierte Anbieter oder fehlende Fähigkeiten. `count` ist die betroffene Zeilenzahl, sonst `null`.",
                "example": [],
                "items": {
                  "$ref": "#/components/schemas/ListWarning"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "EsimUsage": {
        "properties": {
          "data": {
            "properties": {
              "esim_id": {
                "format": "uuid",
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "usage": {
                "$ref": "#/components/schemas/Usage"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "Install": {
        "description": "Alle zur INSTALLATION dieser eSIM benötigten Daten. `null` bedeutet NICHT ANGEFORDERT (ohne `include=lpa`). Hat die eSIM noch keinen Code, ist der Block dagegen mit `lpa: null` vorhanden.\n\nEine Antwort mit diesem Block hat immer `Cache-Control: no-store`.",
        "nullable": true,
        "properties": {
          "android_url": {
            "nullable": true,
            "type": "string"
          },
          "apn": {
            "description": "Zugangspunktname (APN), falls die automatische Einrichtung nicht erfolgt. In dieser Version IMMER `null`: unbekannt, nicht unnötig.",
            "nullable": true,
            "type": "string"
          },
          "ios_url": {
            "nullable": true,
            "type": "string"
          },
          "lpa": {
            "description": "Aktivierungscode der eSIM, ein verkäufliches Geheimnis. Diese Zeichenfolge genügt zum Erzeugen des QR-Codes.",
            "example": "LPA:1$smdp.example.com$MATCH-ABC123",
            "nullable": true,
            "type": "string"
          },
          "matching_id": {
            "example": "MATCH-ABC123",
            "nullable": true,
            "type": "string"
          },
          "qr_code_base64": {
            "description": "QR-Code als PNG-Daten-URI. Nur mit `include=qr` auf einem DETAIL-Endpunkt vorhanden, NIE in Listen (ca. 11 KB pro Zeile, also ca. 1,1 MB bei 100 Zeilen). QR-Code stattdessen aus `lpa` erzeugen.",
            "nullable": true,
            "type": "string"
          },
          "smdp_address": {
            "example": "smdp.example.com",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "ListWarning": {
        "description": "Erklärung der Liste; leer ohne Besonderheiten. Geschlossene Codes: `filtered_by_key_package_filters`, `filtered_by_provider_scope`, `no_price_for_org`, `price_filter_removed_rows`, `provider_disabled`, `capability_missing`. Sie stehen für Schlüsselregeln, Anbieterumfang, fehlende Preise, Preisfilter, deaktivierte Anbieter oder fehlende Fähigkeiten. `count` ist die betroffene Zeilenzahl, sonst `null`.",
        "properties": {
          "code": {
            "enum": [
              "filtered_by_key_package_filters",
              "filtered_by_provider_scope",
              "no_price_for_org",
              "price_filter_removed_rows",
              "provider_disabled",
              "capability_missing"
            ],
            "example": "no_price_for_org",
            "type": "string"
          },
          "count": {
            "example": 12,
            "format": "int64",
            "nullable": true,
            "type": "integer"
          },
          "message": {
            "example": "12 gói bị lược vì tổ chức bạn chưa có giá.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "MemberInvoiceBuyer": {
        "description": "Nur Mitgliederschlüssel. Ohne Angaben gilt der Verbraucherablauf ohne Organisation oder vietnamesische juristische Person. Angaben folgen der Personenprüfung: full_name, persönliche 12-stellige tax_code und Checkout-Regeln für address/email. Geschäftsrechnungen werden nach dem Kauf beantragt. Im Testmodus wird nur der Snapshot geprüft, keine MISA-Rechnung ausgestellt.",
        "nullable": true,
        "properties": {
          "address": {
            "nullable": true,
            "type": "string"
          },
          "email": {
            "nullable": true,
            "type": "string"
          },
          "full_name": {
            "nullable": true,
            "type": "string"
          },
          "legal_name": {
            "nullable": true,
            "type": "string"
          },
          "tax_code": {
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "MemberRefundRequest": {
        "properties": {
          "decided_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "decision_note": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "order_id": {
            "format": "uuid",
            "type": "string"
          },
          "order_item_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "refunded": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Money"
              }
            ],
            "nullable": true
          },
          "requested_at": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "enum": [
              "pending",
              "approved",
              "rejected"
            ],
            "type": "string"
          },
          "suggested": {
            "$ref": "#/components/schemas/Money"
          }
        },
        "type": "object"
      },
      "MemberRefundRequestInput": {
        "properties": {
          "reason": {
            "description": "Erstattungsgrund mit 5 bis 1000 Zeichen nach Entfernen führender und nachfolgender Leerzeichen.",
            "maxLength": 1000,
            "minLength": 5,
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "type": "object"
      },
      "MemberRefundRequestListResponse": {
        "properties": {
          "data": {
            "properties": {
              "has_open_request": {
                "type": "boolean"
              },
              "items": {
                "items": {
                  "$ref": "#/components/schemas/MemberRefundRequest"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "next_cursor": {
                "description": "Für die nächste Seite UNVERÄNDERT zurücksenden. `null` ist das EINZIGE Endsignal. Auch auf eine Seite mit weniger als `page_size` Einträgen können weitere folgen.",
                "nullable": true,
                "type": "string"
              },
              "page_size": {
                "description": "MAXIMALE Datensatzanzahl, die der Server für diese Seite verwendet hat, bereits begrenzt. Nicht die tatsächliche Anzahl in `items`.",
                "nullable": true,
                "type": "integer"
              },
              "total": {
                "description": "Anzahl der zum Filter passenden Zeilen. `null`, wenn das Zählen zu aufwendig ist. Nicht zur Erkennung des Endes verwenden; dafür dient `next_cursor`.",
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "warnings": {
                "description": "Erklärung der Liste; leer ohne Besonderheiten. Geschlossene Codes: `filtered_by_key_package_filters`, `filtered_by_provider_scope`, `no_price_for_org`, `price_filter_removed_rows`, `provider_disabled`, `capability_missing`. Sie stehen für Schlüsselregeln, Anbieterumfang, fehlende Preise, Preisfilter, deaktivierte Anbieter oder fehlende Fähigkeiten. `count` ist die betroffene Zeilenzahl, sonst `null`.",
                "example": [],
                "items": {
                  "$ref": "#/components/schemas/ListWarning"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "MemberRefundRequestResponse": {
        "properties": {
          "data": {
            "properties": {
              "decided_at": {
                "format": "date-time",
                "nullable": true,
                "type": "string"
              },
              "decision_note": {
                "nullable": true,
                "type": "string"
              },
              "id": {
                "format": "uuid",
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "order_id": {
                "format": "uuid",
                "type": "string"
              },
              "order_item_id": {
                "format": "uuid",
                "type": "string"
              },
              "reason": {
                "type": "string"
              },
              "refunded": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  }
                ],
                "nullable": true
              },
              "requested_at": {
                "format": "date-time",
                "type": "string"
              },
              "status": {
                "enum": [
                  "pending",
                  "approved",
                  "rejected"
                ],
                "type": "string"
              },
              "suggested": {
                "$ref": "#/components/schemas/Money"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "ModeEcho": {
        "description": "Umgebung des aufrufenden Schlüssels, entsprechend X-TKE-Mode. Organisationen verwenden tke_live_/tke_test_, Mitglieder tke_member_live_/tke_member_test_. Live- und Test-Hosts erzwingen den Schlüsselmodus.",
        "enum": [
          "test",
          "live"
        ],
        "example": "live",
        "type": "string"
      },
      "Money": {
        "description": "Geldbetrag: Einheitliches Format überall auf `/v1`; kein Wechsel zwischen Objekt und bloßer Zahl.",
        "properties": {
          "amount": {
            "description": "Ganzzahl in der kleinsten Einheit von `currency` (VND hat keine Untereinheit).",
            "example": 273000,
            "format": "int64",
            "type": "integer"
          },
          "currency": {
            "example": "VND",
            "type": "string"
          }
        },
        "type": "object"
      },
      "OkEnvelope": {
        "properties": {
          "data": {
            "description": "Die Nutzlast hängt vom Endpunkt ab.",
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "OrderItem": {
        "properties": {
          "cancellable": {
            "$ref": "#/components/schemas/Cancellable"
          },
          "external_ref": {
            "description": "Ihre Bestellreferenz (`external_ref` beim Kauf), zur Zuordnung der eSIM zu Ihrer Bestellung. `null`, wenn nicht angegeben.",
            "nullable": true,
            "type": "string"
          },
          "iccid": {
            "example": "8984012345678901234",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "eSIM-ID für alle `/v1/esims/{id}/…`-Pfade, zugleich `order_item_id` in Webhooks. Liegt nur die ICCID vor, `GET /v1/esims?iccid=…` aufrufen, um die `id` zu erhalten.",
            "format": "uuid",
            "type": "string"
          },
          "install": {
            "$ref": "#/components/schemas/Install"
          },
          "msisdn": {
            "nullable": true,
            "type": "string"
          },
          "order_id": {
            "format": "uuid",
            "type": "string"
          },
          "package_code": {
            "description": "Paket-CODE aus dem Katalog als Zuordnungsschlüssel für diese eSIM. Nur `null`, wenn das Ursprungspaket aus dem Katalog entfernt wurde.",
            "nullable": true,
            "type": "string"
          },
          "package_name": {
            "description": "Lesbarer Anzeigename, der sich ändern kann. NICHT als Abgleichschlüssel verwenden.",
            "type": "string"
          },
          "plan": {
            "$ref": "#/components/schemas/PlanView"
          },
          "smdp_status": {
            "example": "released",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "example": "delivered",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "usage": {
            "$ref": "#/components/schemas/Usage"
          }
        },
        "type": "object"
      },
      "OrderListItem": {
        "properties": {
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "external_ref": {
            "example": "po-1001",
            "nullable": true,
            "type": "string"
          },
          "fulfillment_status": {
            "enum": [
              "fulfilled",
              "partially_fulfilled",
              "unfulfilled"
            ],
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "item_count": {
            "format": "int64",
            "type": "integer"
          },
          "net": {
            "$ref": "#/components/schemas/Money"
          },
          "public_ref": {
            "example": "TKE-DH-2A4C7Q",
            "nullable": true,
            "type": "string"
          },
          "refunded": {
            "$ref": "#/components/schemas/Money"
          },
          "status": {
            "type": "string"
          },
          "total": {
            "$ref": "#/components/schemas/Money"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "type": "object"
      },
      "OrderListResponse": {
        "properties": {
          "data": {
            "properties": {
              "items": {
                "items": {
                  "$ref": "#/components/schemas/OrderListItem"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "next_cursor": {
                "description": "Für die nächste Seite UNVERÄNDERT zurücksenden. `null` ist das EINZIGE Endsignal. Auch auf eine Seite mit weniger als `page_size` Einträgen können weitere folgen.",
                "nullable": true,
                "type": "string"
              },
              "page_size": {
                "description": "MAXIMALE Datensatzanzahl, die der Server für diese Seite verwendet hat, bereits begrenzt. Nicht die tatsächliche Anzahl in `items`.",
                "nullable": true,
                "type": "integer"
              },
              "total": {
                "description": "Anzahl der zum Filter passenden Zeilen. `null`, wenn das Zählen zu aufwendig ist. Nicht zur Erkennung des Endes verwenden; dafür dient `next_cursor`.",
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "warnings": {
                "description": "Erklärung der Liste; leer ohne Besonderheiten. Geschlossene Codes: `filtered_by_key_package_filters`, `filtered_by_provider_scope`, `no_price_for_org`, `price_filter_removed_rows`, `provider_disabled`, `capability_missing`. Sie stehen für Schlüsselregeln, Anbieterumfang, fehlende Preise, Preisfilter, deaktivierte Anbieter oder fehlende Fähigkeiten. `count` ist die betroffene Zeilenzahl, sonst `null`.",
                "example": [],
                "items": {
                  "$ref": "#/components/schemas/ListWarning"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "OrderResponse": {
        "properties": {
          "data": {
            "description": "Partnerbestellung.",
            "properties": {
              "created_at": {
                "format": "date-time",
                "type": "string"
              },
              "external_ref": {
                "example": "po-1001",
                "nullable": true,
                "type": "string"
              },
              "fulfillment_status": {
                "description": "Tatsächlich gelieferter Umfang, GETRENNT von `status`. Bei 3 eSIMs, davon 2 geliefert und 1 fehlgeschlagen, bleibt `status=completed`, mit `fulfillment_status=partially_fulfilled` und `refunded_amount > 0`.",
                "enum": [
                  "fulfilled",
                  "partially_fulfilled",
                  "unfulfilled"
                ],
                "type": "string"
              },
              "id": {
                "description": "Bestell-ID (UUID).",
                "format": "uuid",
                "type": "string"
              },
              "idempotent_replay": {
                "description": "Wahr, wenn diese Anfrage einen früheren Erfolg idempotent wiederholt.",
                "nullable": true,
                "type": "boolean"
              },
              "invoice_no": {
                "description": "Rechnungsnummer nach Ausstellung.",
                "nullable": true,
                "type": "string"
              },
              "invoice_status": {
                "description": "Status der Mehrwertsteuerrechnung zur Bestellung. `none` = noch nicht ausgestellt.",
                "enum": [
                  "none",
                  "pending",
                  "issuing",
                  "issued",
                  "failed",
                  "cancelled"
                ],
                "type": "string"
              },
              "items": {
                "items": {
                  "$ref": "#/components/schemas/OrderItem"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "money_settled": {
                "description": "Ob die Bestellung vollständig abgerechnet ist, ohne laufende Erstattung. Bei `false` kann keine Rechnung ausgestellt werden.",
                "type": "boolean"
              },
              "net": {
                "$ref": "#/components/schemas/Money"
              },
              "public_ref": {
                "description": "Kurzer lesbarer Bestellcode für Supportanfragen.",
                "example": "TKE-DH-2A4C7Q",
                "nullable": true,
                "type": "string"
              },
              "refunded": {
                "$ref": "#/components/schemas/Money"
              },
              "status": {
                "enum": [
                  "completed",
                  "pending_provider",
                  "provider_failed",
                  "cancelled"
                ],
                "type": "string"
              },
              "total": {
                "$ref": "#/components/schemas/Money"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "Package": {
        "description": "**`null` bedeutet UNBEKANNT, weder ja noch nein.** Leere Felder sind keine Zusage. Nur `true`/`false` und vorhandene Einträge in `features.apps[]` sind Anbieterangaben.",
        "properties": {
          "capabilities": {
            "$ref": "#/components/schemas/PackageCapabilities"
          },
          "code": {
            "description": "Paketcode aus IHREM Katalog, also `public_sku`. Pro Paket UNVERÄNDERLICH, auch bei Anbieterwechsel, daher als Abgleichschlüssel geeignet. Der Beispielwert hat das richtige Format, funktioniert aber NICHT; echten Code aus `GET /v1/catalog/packages` abrufen.",
            "example": "TKE-VN-30D-X3K9F",
            "type": "string"
          },
          "coverage": {
            "description": "Nutzungsgebiete des Pakets.",
            "properties": {
              "countries": {
                "description": "ISO-3166-Alpha-2-Codes. Leer für globale Pakete (keine Aufzählung von 200 Ländern) und Pakete ohne deklarierte Abdeckung.",
                "example": [
                  "CN"
                ],
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "country_count": {
                "description": "Anzahl abgedeckter Länder, um Mehrländerpakete ohne vollständigen Abruf und eigenes Zählen zu sortieren oder zu filtern.",
                "example": 1,
                "type": "integer"
              },
              "group": {
                "description": "Abdeckung: Länder (`country`), Region (`region`) oder weltweit (`global`). Offene Aufzählung: Unbekannte Werte ignorieren.",
                "example": "country",
                "type": "string"
              },
              "region": {
                "description": "Immer `null`: Regionen gehören zu Ländern, nicht zu Paketen. Der Filter `?region=` funktioniert weiterhin.",
                "nullable": true,
                "type": "string"
              }
            },
            "type": "object"
          },
          "data": {
            "description": "Datenvolumen des Pakets. Alle Werte in **BYTES**, nicht MB/GB, um doppelte Rundung zu vermeiden.",
            "properties": {
              "daily_bytes": {
                "description": "TAGESDATENVOLUMEN in Bytes. `null` bei `fixed`- oder `unlimited`-Paketen.",
                "example": 1073741824,
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "label": {
                "description": "Lesbare Bezeichnung aus derselben Funktion wie auf allen unseren Oberflächen.",
                "example": "1GB/ngày",
                "type": "string"
              },
              "model": {
                "description": "Berechnungsart: `daily` (Tagesvolumen), `fixed` (Gesamtvolumen im Zeitraum), `unlimited`. OFFENE ENUMERATION: Clients MÜSSEN unbekannte Werte ignorieren.",
                "enum": [
                  "daily",
                  "fixed",
                  "unlimited"
                ],
                "example": "daily",
                "type": "string"
              },
              "reset": {
                "description": "Rücksetzzeit des Tagesvolumens, wichtig beim Kauf spät am Tag. `null` = nicht angegeben.",
                "nullable": true,
                "properties": {
                  "at": {
                    "description": "Zurücksetzzeit in der lokalen Zeitzone `timezone` (`00:00`, `00:00:01`).",
                    "example": "00:00",
                    "nullable": true,
                    "type": "string"
                  },
                  "note": {
                    "nullable": true,
                    "type": "string"
                  },
                  "timezone": {
                    "description": "Zeitzone der Rücksetzung (`UTC+8`, `UTC+7`).",
                    "example": "UTC+8",
                    "nullable": true,
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "total_bytes": {
                "description": "Gesamtvolumen des Zeitraums in Bytes. `null` für `daily` oder `unlimited`: Tagesvolumen mal Tage ist keine vom Anbieter zugesicherte Gesamtmenge.",
                "example": null,
                "format": "int64",
                "nullable": true,
                "type": "integer"
              }
            },
            "type": "object"
          },
          "description": {
            "description": "Verkaufsbeschreibung des Pakets. `null`, wenn noch nicht verfasst.",
            "nullable": true,
            "type": "string"
          },
          "description_en": {
            "description": "Englische Beschreibung; `null`, wenn nicht angegeben.",
            "nullable": true,
            "type": "string"
          },
          "features": {
            "description": "Paketfunktionen als typisiertes Objekt statt Codeliste: `false` und `null` unterscheiden fehlendes Tethering von unbekannter Information; `[]` kann das nicht.",
            "properties": {
              "apps": {
                "description": "App-Unterstützung nach BETRIEBSSYSTEM.\n\n**Eine NICHT im Array vorhandene App bedeutet UNBEKANNT, nicht „funktioniert“.** Nur gelistete Einträge sind Anbieterzusagen; derzeit ist nur TikTok angegeben.\n\nEs gibt bewusst kein zusammengefasstes Feld: Im echten Katalog unterstützen 2.465 Pakete TikTok auf dem iPhone, aber NICHT auf Android. Ein einziges Flag würde sie auf „nein“ reduzieren und fast ein Drittel des Katalogs falsch darstellen.",
                "items": {
                  "properties": {
                    "android": {
                      "description": "`supported` (Unterstützung erklärt), `blocked` (Nichtunterstützung erklärt), `unknown` (Betriebssystem nicht abgedeckt). Offene Aufzählung.",
                      "enum": [
                        "supported",
                        "blocked",
                        "unknown"
                      ],
                      "example": "blocked",
                      "type": "string"
                    },
                    "app": {
                      "description": "App-Code in Kleinbuchstaben (z. B. `tiktok`).",
                      "example": "tiktok",
                      "type": "string"
                    },
                    "ios": {
                      "description": "`supported` (Unterstützung erklärt), `blocked` (Nichtunterstützung erklärt), `unknown` (Betriebssystem nicht abgedeckt). Offene Aufzählung.",
                      "enum": [
                        "supported",
                        "blocked",
                        "unknown"
                      ],
                      "example": "supported",
                      "type": "string"
                    },
                    "note": {
                      "nullable": true,
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "type": "array"
              },
              "hotspot": {
                "description": "WLAN-Tethering für andere Geräte. `null` = unbekannt, nicht `false`.",
                "example": true,
                "nullable": true,
                "type": "boolean"
              },
              "kyc_required": {
                "description": "Vor Nutzung ist eine Identitätsprüfung (KYC) erforderlich. `null` = nicht angegeben.",
                "example": false,
                "nullable": true,
                "type": "boolean"
              },
              "sms": {
                "description": "SMS. `false` bedeutet KEIN SMS-Empfang, somit auch keine Bank-OTPs. `null` = nicht angegeben.",
                "example": false,
                "nullable": true,
                "type": "boolean"
              },
              "voice": {
                "description": "Sprachanrufe. `false` bedeutet ausdrücklich keine Telefonie: Eine reine Datenleitung empfängt keine Anrufe. `null` = unbekannt.",
                "example": false,
                "nullable": true,
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "fup": {
            "description": "Verhalten nach Verbrauch des Hochgeschwindigkeitsvolumens. `null` = keine Drosselungsangabe.",
            "nullable": true,
            "properties": {
              "behavior": {
                "description": "`throttle` (gedrosselt), `cutoff` (getrennt) oder `null` (nicht angegeben). Offene Aufzählung.",
                "enum": [
                  "throttle",
                  "cutoff",
                  null
                ],
                "nullable": true,
                "type": "string"
              },
              "high_speed_bytes": {
                "description": "Bytes bei voller Geschwindigkeit vor der Drosselung.",
                "example": 1048576,
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "note": {
                "nullable": true,
                "type": "string"
              },
              "speed_kbps": {
                "description": "Geschwindigkeit NACH Verbrauch des schnellen Datenvolumens (kbps). `null` bei Abschaltung oder fehlender Angabe. Nicht dasselbe wie `network.speed_cap_kbps`, das Limit des gesamten Pakets.",
                "example": 128,
                "nullable": true,
                "type": "integer"
              }
            },
            "type": "object"
          },
          "market": {
            "description": "VERSORGUNGSSYSTEM des Pakets, OFFENE Enumeration: unbekannte Werte ignorieren. Bestimmt Bestandsmodell und Nachverkaufsfunktionen. `domestic` verkauft Kits mit Aufladung, Stornierung und Verbrauchsabfrage; `international` wird bei Bedarf beim Anbieter bestellt, ohne Bestand.",
            "enum": [
              "domestic",
              "international"
            ],
            "example": "international",
            "type": "string"
          },
          "name": {
            "example": "eSIM Trung Quốc Mainland Multi - 1GB/ngày - 24 ngày",
            "type": "string"
          },
          "name_en": {
            "description": "Englischer Name; `null`, wenn nicht angegeben.",
            "nullable": true,
            "type": "string"
          },
          "network": {
            "description": "Netze, die das Paket nutzen kann.",
            "properties": {
              "apn": {
                "description": "APN zur manuellen Eingabe auf bestimmten Android-Geräten ohne automatische Konfiguration. Für vollständige Installationshinweise und weniger Supportfälle erforderlich. `null` = nicht angegeben.",
                "example": "e-ideas",
                "nullable": true,
                "type": "string"
              },
              "carriers": {
                "description": "Mobilfunkbetreiber, deren Netze das Paket nutzt. eSIM-Eigenschaft (Funknetz), nicht der Lieferant.",
                "items": {
                  "properties": {
                    "name": {
                      "example": "China Unicom",
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "type": "array"
              },
              "generations": {
                "description": "Nutzbare Mobilfunkgenerationen (`[\"4g\", \"5g\"]`). `null` = nicht angegeben, NICHT „nur 2G“.",
                "example": [
                  "4g",
                  "5g"
                ],
                "items": {
                  "type": "string"
                },
                "nullable": true,
                "type": "array"
              },
              "speed_cap_kbps": {
                "description": "Geschwindigkeitslimit für das GESAMTE Paket (kbps), anders als `fup.speed_kbps` nach Verbrauch des schnellen Volumens.",
                "nullable": true,
                "type": "integer"
              }
            },
            "type": "object"
          },
          "price": {
            "$ref": "#/components/schemas/Money",
            "description": "Ihr Organisationspreis über die API, genau der von `POST /v1/orders` abgebuchte Betrag. Immer `{amount, currency}`, nie eine bloße Zahl. Einkaufskosten werden nicht offengelegt."
          },
          "tags": {
            "description": "Normalisierte kommerzielle Tags (Kleinbuchstaben, Bindestriche), auch Grundlage der Katalogbeschränkungen Ihres Schlüssels. Derzeit trägt kein Paket Tags; `?tag=` liefert daher eine leere Liste, bis der Verkäufer Tags vergibt.",
            "example": [],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "validity": {
            "description": "Gültigkeitsdauer des Pakets und Beginn der Laufzeit.",
            "properties": {
              "days": {
                "example": 24,
                "type": "integer"
              },
              "install_by_days": {
                "description": "Tage nach Kauf zum Scannen des QR-Codes bzw. Installieren der eSIM. `null` = nicht angegeben, NICHT „jederzeit installierbar“.",
                "example": 365,
                "nullable": true,
                "type": "integer"
              },
              "label": {
                "example": "24 ngày",
                "type": "string"
              },
              "reclaim_on_expiry": {
                "description": "Der Anbieter zieht das Abonnement bei Ablauf zurück; Aufladen und Tarifwechsel sind danach unmöglich. Wichtig bei Verlängerungen. `null` = nicht angegeben.",
                "example": true,
                "nullable": true,
                "type": "boolean"
              },
              "starts_when": {
                "description": "Beginn der Laufzeit: `on_install` (Installation), `on_purchase` (Kauf) oder `null`. Entscheidend für das Ablaufdatum: Bei `null` kein genaues Datum zusagen.",
                "enum": [
                  "on_install",
                  "on_purchase",
                  null
                ],
                "example": "on_install",
                "nullable": true,
                "type": "string"
              },
              "unused_valid_days": {
                "description": "Anzahl der Tage, die ein Paket ungenutzt aufbewahrt werden kann, bevor es abläuft. `null` = nicht angegeben, NICHT unbegrenzt. Bewusst getrennt von `install_by_days`: LAGERDAUER und INSTALLATIONSFRIST sind verschieden.",
                "nullable": true,
                "type": "integer"
              }
            },
            "type": "object"
          }
        },
        "type": "object"
      },
      "PackageCapabilities": {
        "description": "Nachverkaufsfunktionen aus der tatsächlichen Paketdeklaration, nie vom Anbietertyp abgeleitet. Ohne Angaben sind alle Werte `false`, um keine Aktion zu versprechen, die sicher `422 capability.not_supported` ergibt.",
        "properties": {
          "cancel": {
            "properties": {
              "restriction": {
                "description": "`code_not_disclosed`: Stornierung nur, wenn niemand den Code gesehen hat (weder Kunde noch Dashboard noch `?include=lpa`). Das ist die echte Bedingung, unabhängig von einer Installation, die das System nicht kennt. Die alte Bezeichnung `unused_only` war irreführend.",
                "enum": [
                  "code_not_disclosed",
                  null
                ],
                "nullable": true,
                "type": "string"
              },
              "supported": {
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "plan_change": {
            "properties": {
              "policy": {
                "$ref": "#/components/schemas/PlanChangePolicy"
              },
              "supported": {
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "usage_check": {
            "properties": {
              "supported": {
                "type": "boolean"
              }
            },
            "type": "object"
          }
        },
        "type": "object"
      },
      "PackageDetail": {
        "properties": {
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Package"
              },
              {
                "properties": {
                  "mode": {
                    "$ref": "#/components/schemas/ModeEcho"
                  }
                },
                "type": "object"
              }
            ]
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "PackageListResponse": {
        "properties": {
          "data": {
            "properties": {
              "items": {
                "items": {
                  "$ref": "#/components/schemas/Package"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "next_cursor": {
                "description": "Für die nächste Seite UNVERÄNDERT zurücksenden. `null` ist das EINZIGE Endsignal. Auch auf eine Seite mit weniger als `page_size` Einträgen können weitere folgen.",
                "nullable": true,
                "type": "string"
              },
              "page_size": {
                "description": "MAXIMALE Datensatzanzahl, die der Server für diese Seite verwendet hat, bereits begrenzt. Nicht die tatsächliche Anzahl in `items`.",
                "nullable": true,
                "type": "integer"
              },
              "total": {
                "description": "Anzahl passender Pakete; `null` bei teurer Zählung (international oder ohne `market`). Vor Schlüsselbeschränkungen und Organisationspreisen berechnet: Katalogtreffer, nicht kaufbare Pakete.",
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "warnings": {
                "description": "Erklärung der Liste; leer ohne Besonderheiten. Geschlossene Codes: `filtered_by_key_package_filters`, `filtered_by_provider_scope`, `no_price_for_org`, `price_filter_removed_rows`, `provider_disabled`, `capability_missing`. Sie stehen für Schlüsselregeln, Anbieterumfang, fehlende Preise, Preisfilter, deaktivierte Anbieter oder fehlende Fähigkeiten. `count` ist die betroffene Zeilenzahl, sonst `null`.",
                "example": [],
                "items": {
                  "$ref": "#/components/schemas/ListWarning"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "PlanChangePolicy": {
        "description": "Verhalten des Anbieters beim AUFLADEN EINES NEUEN PAKETS. `null` bedeutet: nicht aufladbar ODER Anbieterrichtlinie noch nicht ermittelt. `null` verbietet Annahmen; ein Objekt nur mit `false` würde dagegen garantieren, dass nichts storniert wird.",
        "nullable": true,
        "properties": {
          "note": {
            "nullable": true,
            "type": "string"
          },
          "requires_cancel_first": {
            "description": "Das LAUFENDE Paket wird vor Bestellung des neuen storniert, da dieser Anbieter Pakete nicht stapelt. Informieren Sie Kunden VOR dem Aufladen eines neuen Pakets.",
            "type": "boolean"
          },
          "stacking": {
            "description": "Ob Laufzeit und Volumen des neuen Pakets zum laufenden addiert werden.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "PlanOptionsResponse": {
        "properties": {
          "data": {
            "description": "Für diese eSIM verfügbare Aufladepakete, nach ihrem Anbieter gefiltert. Jeder Eintrag ist ein vollständiges `Package` wie im Katalog. `policy` beschreibt den aktuellen Anbieter; `null` heißt unbekannte Richtlinie, nicht „keine Stornierung“.",
            "properties": {
              "items": {
                "items": {
                  "$ref": "#/components/schemas/Package"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "next_cursor": {
                "description": "Für die nächste Seite UNVERÄNDERT zurücksenden. `null` ist das EINZIGE Endsignal. Auch auf eine Seite mit weniger als `page_size` Einträgen können weitere folgen.",
                "nullable": true,
                "type": "string"
              },
              "page_size": {
                "description": "MAXIMALE Datensatzanzahl, die der Server für diese Seite verwendet hat, bereits begrenzt. Nicht die tatsächliche Anzahl in `items`.",
                "type": "integer"
              },
              "policy": {
                "$ref": "#/components/schemas/PlanChangePolicy"
              },
              "total": {
                "description": "Anzahl passender Pakete; `null` bei teurer Zählung (international oder ohne `market`). Vor Schlüsselbeschränkungen und Organisationspreisen berechnet: Katalogtreffer, nicht kaufbare Pakete.",
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "warnings": {
                "description": "Erklärung der Liste; leer ohne Besonderheiten. Geschlossene Codes: `filtered_by_key_package_filters`, `filtered_by_provider_scope`, `no_price_for_org`, `price_filter_removed_rows`, `provider_disabled`, `capability_missing`. Sie stehen für Schlüsselregeln, Anbieterumfang, fehlende Preise, Preisfilter, deaktivierte Anbieter oder fehlende Fähigkeiten. `count` ist die betroffene Zeilenzahl, sonst `null`.",
                "example": [],
                "items": {
                  "$ref": "#/components/schemas/ListWarning"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "PlanView": {
        "description": "Der aktuell für diese eSIM geltende Tarif.",
        "nullable": true,
        "properties": {
          "current_code": {
            "type": "string"
          },
          "expires_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "started_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "ResendResponse": {
        "properties": {
          "data": {
            "properties": {
              "id": {
                "description": "ID der soeben erneut gesendeten Bestellung.",
                "format": "uuid",
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "resent_at": {
                "format": "date-time",
                "type": "string"
              },
              "resent_to": {
                "description": "Teilweise maskierte Empfängeradresse; die Partneroberfläche gibt die vollständige Kundenadresse nie erneut aus.",
                "example": "ab***@x.com",
                "type": "string"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "SimulateRequest": {
        "properties": {
          "data": {
            "description": "Das Feld `data` der Beispielnutzlast teilweise überschreiben.",
            "type": "object"
          }
        },
        "type": "object"
      },
      "SimulateResponse": {
        "properties": {
          "data": {
            "properties": {
              "delivery_id": {
                "format": "uuid",
                "type": "string"
              },
              "event_id": {
                "format": "uuid",
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "TestModeEsimState": {
        "properties": {
          "data": {
            "properties": {
              "cancellable": {
                "$ref": "#/components/schemas/Cancellable"
              },
              "external_ref": {
                "description": "Ihre Bestellreferenz (`external_ref` beim Kauf), zur Zuordnung der eSIM zu Ihrer Bestellung. `null`, wenn nicht angegeben.",
                "nullable": true,
                "type": "string"
              },
              "iccid": {
                "example": "8984012345678901234",
                "nullable": true,
                "type": "string"
              },
              "id": {
                "description": "eSIM-ID für alle `/v1/esims/{id}/…`-Pfade, zugleich `order_item_id` in Webhooks. Liegt nur die ICCID vor, `GET /v1/esims?iccid=…` aufrufen, um die `id` zu erhalten.",
                "format": "uuid",
                "type": "string"
              },
              "install": {
                "$ref": "#/components/schemas/Install"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "msisdn": {
                "nullable": true,
                "type": "string"
              },
              "order_id": {
                "format": "uuid",
                "type": "string"
              },
              "package_code": {
                "description": "Paket-CODE aus dem Katalog als Zuordnungsschlüssel für diese eSIM. Nur `null`, wenn das Ursprungspaket aus dem Katalog entfernt wurde.",
                "nullable": true,
                "type": "string"
              },
              "package_name": {
                "description": "Lesbarer Anzeigename, der sich ändern kann. NICHT als Abgleichschlüssel verwenden.",
                "type": "string"
              },
              "plan": {
                "$ref": "#/components/schemas/PlanView"
              },
              "simulated": {
                "description": "Simulierter Zustand nach Anwendung des Szenarios.",
                "properties": {
                  "esim_state": {
                    "description": "TECHNISCHER Lebenszyklus der Test-eSIM. Live stammt er aus `smdp_status`; eine Test-eSIM hat kein SM-DP+-Profil, daher steht er hier bei den Testmodus-Feldern.",
                    "enum": [
                      "released",
                      "installed",
                      "enabled",
                      "disabled"
                    ],
                    "type": "string"
                  },
                  "last_via": {
                    "description": "Ablauf, der sie zuletzt GEÄNDERT hat.",
                    "enum": [
                      "open_api",
                      "simulate",
                      "seed"
                    ],
                    "type": "string"
                  },
                  "via": {
                    "description": "Ablauf, der diese Test-eSIM ERSTELLT hat.",
                    "enum": [
                      "open_api",
                      "simulate",
                      "seed"
                    ],
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "smdp_status": {
                "example": "released",
                "nullable": true,
                "type": "string"
              },
              "status": {
                "example": "delivered",
                "type": "string"
              },
              "updated_at": {
                "format": "date-time",
                "type": "string"
              },
              "usage": {
                "$ref": "#/components/schemas/Usage"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "TestModeFailNextRequest": {
        "properties": {
          "count": {
            "default": 1,
            "maximum": 5,
            "minimum": 1,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "TestModeFailNextResponse": {
        "properties": {
          "data": {
            "properties": {
              "endpoint_id": {
                "format": "uuid",
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "testmode_fail_next": {
                "type": "integer"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "TestModeReset": {
        "properties": {
          "data": {
            "properties": {
              "esim_states_deleted": {
                "format": "int64",
                "type": "integer"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "order_items_deleted": {
                "format": "int64",
                "type": "integer"
              },
              "orders_deleted": {
                "format": "int64",
                "type": "integer"
              },
              "wallet_balance": {
                "description": "Test-Wallet-Guthaben NACH dem Zurücksetzen, immer 0. Das Hauptbuch wird NICHT gelöscht; eine Gegenbuchung setzt den Saldo auf null.",
                "format": "int64",
                "type": "integer"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "TestModeResetInput": {
        "properties": {
          "reason": {
            "example": "Reset test data",
            "maxLength": 1000,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "TestModeSeed": {
        "properties": {
          "data": {
            "properties": {
              "already_seeded": {
                "type": "boolean"
              },
              "esims_created": {
                "type": "integer"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "orders_created": {
                "type": "integer"
              },
              "seeded": {
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "TestModeSimulateRequest": {
        "description": "Anzuwendendes Szenario: Alle Felder sind optional, aber mindestens eines ist erforderlich. Ein leerer Body ergibt `422 testmode.invalid_scenario` statt eines stillen Erfolgs.",
        "properties": {
          "data_used_mb": {
            "description": "Bereits verbrauchte Daten in MB (binär, 1 MiB). Werte über dem Kontingent werden begrenzt: Das ist das Verbrauchsszenario, kein Fehler.",
            "example": 4096,
            "format": "int64",
            "minimum": 0,
            "type": "integer"
          },
          "expire_at": {
            "description": "Einen genauen Ablaufzeitpunkt festlegen (ISO-8601 UTC).",
            "format": "date-time",
            "type": "string"
          },
          "expire_now": {
            "description": "`true`: Paket sofort ablaufen lassen (`esim_status` wird `expired`).",
            "type": "boolean"
          },
          "provider_reject": {
            "description": "Anbieterablehnung beim nächsten Vorgang simulieren (Aufladung/Stornierung).",
            "type": "boolean"
          },
          "status": {
            "description": "TECHNISCHER Lebenszyklus des eSIM-Profils im Vokabular des Anbieters. Anders als der kommerzielle `esim_status` der eSIM-Endpunkte.",
            "enum": [
              "released",
              "installed",
              "enabled",
              "disabled"
            ],
            "example": "enabled",
            "type": "string"
          },
          "throttled": {
            "description": "`true`: Leitung gedrosselt (unbegrenztes Paket nach Verbrauch des Hochgeschwindigkeitsvolumens).",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "TestModeStatus": {
        "properties": {
          "data": {
            "properties": {
              "base_url_testing": {
                "description": "Host für den Testmodus. Nur Schlüssel mit tke_test_ oder tke_member_test_ verwenden; der Live-Host antwortet mit 403 partner.wrong_host.",
                "type": "string"
              },
              "capabilities": {
                "properties": {
                  "bulk_orders": {
                    "type": "boolean"
                  },
                  "cancel_refund": {
                    "type": "boolean"
                  },
                  "refund_requests": {
                    "type": "boolean"
                  },
                  "webhooks": {
                    "type": "boolean"
                  }
                },
                "type": "object"
              },
              "checklist": {
                "description": "Integrationsschritte werden aus tatsächlichen API-Aufrufen desselben Inhabers im Testmodus abgeleitet. Der Webhook-Schritt gilt nur für Organisationen.",
                "items": {
                  "properties": {
                    "done": {
                      "type": "boolean"
                    },
                    "label": {
                      "type": "string"
                    },
                    "last_at": {
                      "format": "date-time",
                      "nullable": true,
                      "type": "string"
                    },
                    "step": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "type": "array"
              },
              "drift": {
                "description": "Simulation des Datenverbrauchs: Aktivierung, Intervall und letzter Lauf. Schwellenwert-Webhooks werden nur für Organisationen mit Webhook-Unterstützung gesendet.",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "interval_secs": {
                    "format": "int64",
                    "type": "integer"
                  },
                  "last_run_at": {
                    "format": "date-time",
                    "nullable": true,
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "mode": {
                "enum": [
                  "test",
                  "live"
                ],
                "type": "string"
              },
              "ready": {
                "description": "Ob der Schlüsselinhaber alle unterstützten Prüfschritte abgeschlossen hat. Mitglieder benötigen keinen Webhook-Test.",
                "type": "boolean"
              },
              "sample_counts": {
                "properties": {
                  "test_esims": {
                    "format": "int64",
                    "type": "integer"
                  },
                  "test_orders": {
                    "format": "int64",
                    "type": "integer"
                  }
                },
                "type": "object"
              },
              "seeded": {
                "description": "Ob der Schlüsselinhaber bereits Testbestellungen und Test-eSIMs besitzt.",
                "type": "boolean"
              },
              "test_key_count": {
                "format": "int64",
                "type": "integer"
              },
              "wallet_balance": {
                "description": "Testguthaben in virtuellen VND für den Schlüsselinhaber, getrennt vom Live-Wallet.",
                "format": "int64",
                "type": "integer"
              },
              "webhook": {
                "properties": {
                  "endpoint_url": {
                    "nullable": true,
                    "type": "string"
                  },
                  "fail_next": {
                    "type": "integer"
                  },
                  "status": {
                    "nullable": true,
                    "type": "string"
                  }
                },
                "type": "object"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "TestModeWebhookFireRequest": {
        "properties": {
          "data": {
            "description": "Das Feld `data` der Beispielnutzlast teilweise überschreiben.",
            "type": "object"
          },
          "event_type": {
            "description": "Zu simulierender Webhook-Ereignistyp.",
            "enum": [
              "order.completed",
              "order.failed",
              "esim.delivered",
              "esim.activated",
              "esim.usage_threshold",
              "esim.expiring",
              "wallet.low_balance",
              "catalog.updated"
            ],
            "type": "string"
          }
        },
        "required": [
          "event_type"
        ],
        "type": "object"
      },
      "Usage": {
        "description": "Datenverbrauchsstatistik der eSIM. `updated_at = null`, wenn noch nie abgefragt.",
        "nullable": true,
        "properties": {
          "expires_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "remaining_bytes": {
            "format": "int64",
            "nullable": true,
            "type": "integer"
          },
          "source": {
            "enum": [
              "poll",
              "webhook"
            ],
            "nullable": true,
            "type": "string"
          },
          "total_bytes": {
            "format": "int64",
            "nullable": true,
            "type": "integer"
          },
          "updated_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "used_bytes": {
            "format": "int64",
            "nullable": true,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "WalletBalance": {
        "properties": {
          "data": {
            "properties": {
              "available": {
                "$ref": "#/components/schemas/Money"
              },
              "balance": {
                "$ref": "#/components/schemas/Money"
              },
              "credit_limit": {
                "$ref": "#/components/schemas/Money"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "WebhookConfig": {
        "properties": {
          "data": {
            "properties": {
              "active": {
                "description": "`false`: Keine neuen Ereignisse nach Pausierung im Dashboard oder Schlüsselwiderruf (Abschaltung in derselben Transaktion). Ein erfolgreicher CHECK_HEALTH bei `PUT /v1/webhooks/{id}` aktiviert den Endpunkt wieder.",
                "type": "boolean"
              },
              "created_at": {
                "format": "date-time",
                "type": "string"
              },
              "events": {
                "description": "Leer = alles empfangen.",
                "items": {
                  "enum": [
                    "order.completed",
                    "order.failed",
                    "esim.delivered",
                    "esim.activated",
                    "esim.usage_threshold",
                    "esim.expiring",
                    "wallet.low_balance",
                    "catalog.updated"
                  ],
                  "type": "string"
                },
                "type": "array"
              },
              "id": {
                "description": "Endpoint-ID für `/v1/webhooks/{id}`. Jede Erstellung erzeugt eine NEUE ID. Löschen und Neuanlegen erzeugt einen anderen Endpoint, keine Wiederherstellung des alten.",
                "format": "uuid",
                "type": "string"
              },
              "last_delivery_at": {
                "description": "Letzte Zustellung über diesen Endpoint. `null` = nie zugestellt, nicht fehlgeschlagen. Erster Prüfpunkt, wenn ein Partner keine Webhooks erhält.",
                "format": "date-time",
                "nullable": true,
                "type": "string"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "secret_last4": {
                "description": "Letzte vier Zeichen des Webhook-Geheimnisses, um den verwendeten Signierschlüssel zu prüfen, ohne das Geheimnis erneut offenzulegen. Vollständig nur EINMAL bei Erstellung sichtbar.",
                "type": "string"
              },
              "url": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "WebhookEndpoint": {
        "properties": {
          "active": {
            "description": "`false`: Keine neuen Ereignisse nach Pausierung im Dashboard oder Schlüsselwiderruf (Abschaltung in derselben Transaktion). Ein erfolgreicher CHECK_HEALTH bei `PUT /v1/webhooks/{id}` aktiviert den Endpunkt wieder.",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "events": {
            "description": "Leer = alles empfangen.",
            "items": {
              "enum": [
                "order.completed",
                "order.failed",
                "esim.delivered",
                "esim.activated",
                "esim.usage_threshold",
                "esim.expiring",
                "wallet.low_balance",
                "catalog.updated"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "id": {
            "description": "Endpoint-ID für `/v1/webhooks/{id}`. Jede Erstellung erzeugt eine NEUE ID. Löschen und Neuanlegen erzeugt einen anderen Endpoint, keine Wiederherstellung des alten.",
            "format": "uuid",
            "type": "string"
          },
          "last_delivery_at": {
            "description": "Letzte Zustellung über diesen Endpoint. `null` = nie zugestellt, nicht fehlgeschlagen. Erster Prüfpunkt, wenn ein Partner keine Webhooks erhält.",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "secret_last4": {
            "description": "Letzte vier Zeichen des Webhook-Geheimnisses, um den verwendeten Signierschlüssel zu prüfen, ohne das Geheimnis erneut offenzulegen. Vollständig nur EINMAL bei Erstellung sichtbar.",
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "WebhookListResponse": {
        "properties": {
          "data": {
            "properties": {
              "items": {
                "items": {
                  "$ref": "#/components/schemas/WebhookEndpoint"
                },
                "type": "array"
              },
              "mode": {
                "$ref": "#/components/schemas/ModeEcho"
              },
              "next_cursor": {
                "description": "Für die nächste Seite UNVERÄNDERT zurücksenden. `null` ist das EINZIGE Endsignal. Auch auf eine Seite mit weniger als `page_size` Einträgen können weitere folgen.",
                "nullable": true,
                "type": "string"
              },
              "page_size": {
                "description": "MAXIMALE Datensatzanzahl, die der Server für diese Seite verwendet hat, bereits begrenzt. Nicht die tatsächliche Anzahl in `items`.",
                "nullable": true,
                "type": "integer"
              },
              "total": {
                "description": "Anzahl der zum Filter passenden Zeilen. `null`, wenn das Zählen zu aufwendig ist. Nicht zur Erkennung des Endes verwenden; dafür dient `next_cursor`.",
                "format": "int64",
                "nullable": true,
                "type": "integer"
              },
              "warnings": {
                "description": "Erklärung der Liste; leer ohne Besonderheiten. Geschlossene Codes: `filtered_by_key_package_filters`, `filtered_by_provider_scope`, `no_price_for_org`, `price_filter_removed_rows`, `provider_disabled`, `capability_missing`. Sie stehen für Schlüsselregeln, Anbieterumfang, fehlende Preise, Preisfilter, deaktivierte Anbieter oder fehlende Fähigkeiten. `count` ist die betroffene Zeilenzahl, sonst `null`.",
                "example": [],
                "items": {
                  "$ref": "#/components/schemas/ListWarning"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "ok": {
            "enum": [
              true
            ],
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "data"
        ],
        "type": "object"
      },
      "WebhookRequest": {
        "properties": {
          "events": {
            "description": "Leer = alles empfangen. Unbekannter Wert: 400 `internal.validation_failed` (Feld `events`).",
            "items": {
              "enum": [
                "order.completed",
                "order.failed",
                "esim.delivered",
                "esim.activated",
                "esim.usage_threshold",
                "esim.expiring",
                "wallet.low_balance",
                "catalog.updated"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "url": {
            "example": "https://partner.example.com/hooks/tke",
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "TkeHmac": {
        "description": "HMAC-SHA256-Authentifizierung (§4). Vier Header senden: `X-TKE-Key` (öffentliche key_id), `X-TKE-Timestamp` (Epoch in ms), `X-TKE-Nonce` (UUID pro Anfrage), `X-TKE-Signature` (Hex in Kleinbuchstaben). signing_string = method\npath\ntimestamp\nnonce\nbody_hash; body_hash = SHA256(raw_body) als Hex. Vergleich in konstanter Zeit. path ENTHÄLT den Query-String.",
        "in": "header",
        "name": "X-TKE-Signature",
        "type": "apiKey"
      }
    }
  },
  "info": {
    "description": "Open API für Partner mit eSIM-Verkauf (eine Partnerebene). Jeder `/v1/*`-Endpunkt erfordert **HMAC-SHA256** über vier `X-TKE-*`-Header; ein unsignierter Modus existiert nicht. POST für Geld oder Bestellungen erfordert `Idempotency-Key`. `tke_test_`-Schlüssel nutzen den Testhost mit virtuellem Wallet, Bestand und Bereitstellung. REST ist maßgeblich, mit Abgleich über `updated_since` und Cursor; Webhooks sind ergänzend. Primärschlüssel heißen immer `id`, Fremdschlüssel haben Präfixe wie `order_id`.",
    "title": "Tổng Kho eSIM — Open API đối tác",
    "version": "2.4.0"
  },
  "openapi": "3.0.3",
  "paths": {
    "/v1/catalog/packages": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `catalog:read`.\n\nPaketkatalog Ihrer Organisation: eine gemeinsame Oberfläche für beide Versorgungssysteme, gefiltert mit `?market=`.\n\nEs erscheinen nur tatsächlich KAUFBARE Pakete: veröffentlicht, weiterhin beim Anbieter vertrieben, durch den Schlüssel erlaubt UND für Ihre Organisation bepreist. Pakete ohne Preis fehlen, weil sie nicht bestellt werden können.\n\nCursor-Paginierung: zuerst ohne `cursor` aufrufen, dann `next_cursor` unverändert zurückgeben, bis es `null` ist. Eine kürzere Seite als `page_size` bedeutet NICHT das Ende.\n\n`capabilities` stammt aus echten Paketangaben; fehlen diese, sind alle Flags `false`. Ein möglicher Button wird eher weggelassen, als ein sicher mit `422` scheiternder Endpunkt versprochen.\n\nDer Katalog enthält KEINE Bestandsangaben, weder Mengen noch verfügbar/ausverkauft. Kann der Anbieter nicht liefern, meldet `POST /v1/orders` unmittelbar einen klaren Fehler (`esim.out_of_stock`…), statt eine Vorabinterpretation eines Feldes zu verlangen.",
        "operationId": "get_catalog_packages",
        "parameters": [
          {
            "description": "Datensätze pro Seite. Standard 50, höchstens 100. Höhere Werte werden ohne Fehler auf 100 begrenzt.",
            "in": "query",
            "name": "page_size",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 100,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Versorgungssystem: `domestic` | `international`. Unbekannte Werte führen zu `internal.invalid_filter` (400), nicht zum vollständigen Katalog. Ein Tippfehler darf nicht als wirkungsloser Filter erscheinen.",
            "in": "query",
            "name": "market",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Ländercode nach ISO-3166 alpha-2 (z. B. `VN`). Nur Pakete mit Abdeckung dieses Landes.",
            "in": "query",
            "name": "country",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Regionskennung (z. B. `chau-a`). Pakete mit mindestens einem Land dieser Region sowie alle globalen Pakete.",
            "in": "query",
            "name": "region",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Freitextsuche nach öffentlichem Code und Paketname (Teiltreffer, ohne Beachtung der Groß-/Kleinschreibung).",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Nach EINEM kommerziellen Tag filtern. Überflüssige Leerzeichen werden entfernt, Kleinbuchstaben und Bindestriche verwendet: `Ban Le` und `ban-le` sind derselbe Tag.",
            "in": "query",
            "name": "tag",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Datenmodell: `daily` | `fixed` | `unlimited`, ersetzt `supports_topup`. Unbekannte Werte: `internal.invalid_filter` (400).",
            "in": "query",
            "name": "data_model",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Mindestdatenvolumen in **BYTES**. Tagespakete werden anhand ihres TAGESVOLUMENS verglichen; unbegrenzte Pakete erfüllen IMMER eine Untergrenze.",
            "in": "query",
            "name": "data_min_bytes",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Maximales Datenvolumen in **BYTES**. Unbegrenzte Pakete sind AUSGESCHLOSSEN, da eine Obergrenze für unbegrenzte Pakete nicht gilt und sonst bei der Suche nach kleinen Paketen erscheinen würde.",
            "in": "query",
            "name": "data_max_bytes",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Mindestgültigkeitsdauer in Tagen.",
            "in": "query",
            "name": "days_min",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Höchste Gültigkeitsdauer in Tagen.",
            "in": "query",
            "name": "days_max",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Mindestpreis (VND), verglichen mit dem Preis IHRER ORGANISATION. Der Filter wird NACH der serverseitigen Seitenauswahl angewendet. Kürzere Seiten bedeuten daher nicht das Datenende.",
            "in": "query",
            "name": "price_min",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Höchstpreis (VND), gleiche Regeln wie bei `price_min`.",
            "in": "query",
            "name": "price_max",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "description": "Nur Pakete dieser Netzgeneration (`2g` | `3g` | `4g` | `5g`). Unbekannte Werte führen zu `internal.invalid_filter` (400).",
            "in": "query",
            "name": "network_gen",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "`true`: Tethering ausdrücklich unterstützt; `false`: ausdrücklich nicht unterstützt. Ohne Angabe (`features.hotspot = null`) passt keines von beiden. Nur die Zeichenfolgen `true` und `false` sind erlaubt.",
            "in": "query",
            "name": "hotspot",
            "required": false,
            "schema": {
              "enum": [
                "true",
                "false"
              ],
              "type": "string"
            }
          },
          {
            "description": "Nur Pakete, die diese App auf mindestens einem Betriebssystem AUSDRÜCKLICH unterstützen (`app=tiktok`). Fehlende Angaben erfüllen den Filter NICHT. Derzeit ist nur `tiktok` zulässig; andere Codes führen zu `internal.invalid_filter` (400).",
            "in": "query",
            "name": "app",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "`true`: Telefonie ausdrücklich unterstützt; `false`: ausdrücklich nicht unterstützt. Ohne Angabe passt keines von beiden. Nur die Zeichenfolgen `true` und `false` sind erlaubt.",
            "in": "query",
            "name": "voice",
            "required": false,
            "schema": {
              "enum": [
                "true",
                "false"
              ],
              "type": "string"
            }
          },
          {
            "description": "Senden Sie `next_cursor` unverändert zurück. **Stoppen Sie nur bei `null`, nicht bei kurzen Seiten**: Schlüsselregeln, Organisationspreise und Preisfilter greifen nach dem Seitenschnitt. Der Cursor enthält den Filterfingerabdruck: Andere Filter oder beschädigte Daten ergeben `catalog.cursor_mismatch` (400), damit verschiedene Abfragen nicht vermischt werden.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackageListResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`, `internal.invalid_filter`, `catalog.cursor_mismatch`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Pakete auflisten",
        "tags": [
          "catalog"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/catalog/packages/{code}": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `catalog:read`.\n\nDetails GENAU EINES Pakets anhand des öffentlichen Codes. `data` enthält DIESELBEN FELDER wie ein Eintrag von `GET /v1/catalog/packages`, ergänzt um `mode`. Keine exklusiven Detailfelder; ein einziger Typ `Package` genügt.\n\nUnsichtbare Codes führen zu `partner.package_not_visible` (404), unabhängig davon, ob der Code fehlt, außerhalb der Schlüsselbeschränkungen liegt, kein Organisationspreis vorliegt oder die Anbieterzuordnung fehlt. Unterschiedliche Fehler würden Fremden die Katalogaufzählung ermöglichen.",
        "operationId": "get_catalog_packages__code_",
        "parameters": [
          {
            "description": "Paketcode, im Katalog als `code` (`public_sku`). Pro Paket UNVERÄNDERLICH, auch bei Anbieterwechsel, und als Abgleichschlüssel speicherbar. Außerhalb der Schlüsselbeschränkungen oder ohne Organisationspreis: `404 partner.package_not_visible`, wie bei nicht vorhandenem Code.",
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackageDetail"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.package_not_visible`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Ein Paket abrufen",
        "tags": [
          "catalog"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/esims": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:read`.",
        "operationId": "get_esims",
        "parameters": [
          {
            "description": "Datensätze pro Seite. Standard 50, höchstens 200. Höhere Werte werden ohne Fehler auf 200 begrenzt.",
            "in": "query",
            "name": "page_size",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Nach `esim_status` filtern. Unbekannte Werte führen zu `internal.invalid_filter` (400), nicht zu einer leeren Liste. Ein Tippfehler wie `canceled` statt `cancelled` darf nicht als fehlende eSIM missverstanden werden.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "enum": [
                "pending",
                "available",
                "reserved",
                "sold",
                "delivered",
                "in_use",
                "used_up",
                "expired",
                "suspended",
                "cancelled",
                "provider_failed"
              ],
              "type": "string"
            }
          },
          {
            "description": "Nur eSIMs einer Bestellung.",
            "in": "query",
            "name": "order_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Nach ICCID filtern (Zeichenfolge, exakte Übereinstimmung).",
            "in": "query",
            "name": "iccid",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Alle eSIMs der Bestellungen mit Ihrer Referenz `external_ref` (exakte Übereinstimmung).",
            "in": "query",
            "name": "external_ref",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "ISO-8601 UTC. Liefert alle Datensätze mit `updated_at >= updated_since` in aufsteigender Reihenfolge. Dies ist der Standardweg für ABFRAGEBASIERTEN ABGLEICH (§8.5), auch bei verpassten Webhooks. Falsches Format: `internal.invalid_filter` (400).",
            "in": "query",
            "name": "updated_since",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Nächster Cursor: Senden Sie `next_cursor` unverändert zurück. Ein ungültiger Cursor beginnt ohne Fehler am Listenanfang, damit Änderungen der Codierung Integrationen nicht brechen. Prüfen Sie, ob der Cursor wechselt, um Endlosschleifen auf Seite eins zu vermeiden.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Kommagetrennte Zusatzblöcke: `lpa` liefert `install`, `qr` zusätzlich `install.qr_code_base64` (nur Details). **DIE CODEAUSGABE IST OFFENLEGUNG** und beendet die Stornierbarkeit jeder betroffenen eSIM dauerhaft (`cancellable.allowed = false`, `reason = code_disclosed`). Fordern Sie den Code erst zur Lieferung an. Unbekannter Wert: `internal.invalid_filter` (400, `field: \"include\"`).",
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "example": "lpa",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EsimListResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`, `internal.invalid_filter`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "eSIMs auflisten (abfragebasierter Abgleich)",
        "tags": [
          "esims"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/esims/{id}": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:read`.",
        "operationId": "get_esims__id_",
        "parameters": [
          {
            "description": "Stabile ID einer verkauften eSIM, nicht die wiederverwendbare ICCID.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Kommagetrennte Zusatzblöcke: `lpa` liefert `install`, `qr` zusätzlich `install.qr_code_base64` (nur Details). **DIE CODEAUSGABE IST OFFENLEGUNG** und beendet die Stornierbarkeit jeder betroffenen eSIM dauerhaft (`cancellable.allowed = false`, `reason = code_disclosed`). Fordern Sie den Code erst zur Lieferung an. Unbekannter Wert: `internal.invalid_filter` (400, `field: \"include\"`).",
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "example": "lpa",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Esim"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`, `internal.invalid_filter`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.not_found`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Eine eSIM abrufen",
        "tags": [
          "esims"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/esims/{id}/cancel": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:write`.",
        "operationId": "post_esims__id__cancel",
        "parameters": [
          {
            "description": "Stabile ID einer verkauften eSIM, nicht die wiederverwendbare ICCID.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Vom Client erzeugte Zeichenfolge: Gleicher Schlüssel und gleicher Body werden einmal ausgeführt; Wiederholungen liefern das erste Ergebnis. Gilt je `api_key_id` (§11): zwei Schlüssel sind getrennte Befehle.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CancelResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `esim.not_cancellable`, `idempotency.conflict`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `capability.not_supported`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Unbenutzte eSIM stornieren",
        "tags": [
          "esims"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/esims/{id}/change-plan": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:write`.",
        "operationId": "post_esims__id__change-plan",
        "parameters": [
          {
            "description": "Stabile ID einer verkauften eSIM, nicht die wiederverwendbare ICCID.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Vom Client erzeugte Zeichenfolge: Gleicher Schlüssel und gleicher Body werden einmal ausgeführt; Wiederholungen liefern das erste Ergebnis. Gilt je `api_key_id` (§11): zwei Schlüssel sind getrennte Befehle.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangePlanRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangePlanResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `wallet.insufficient_balance`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.package_not_visible`"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `esim.topup_not_supported`, `esim.topup_provider_mismatch`, `esim.not_eligible`, `idempotency.conflict`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `capability.not_supported`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "eSIM aufladen",
        "tags": [
          "esims"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/esims/{id}/plan-options": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:read`.\n\nLiefert nur gültige Aufladepakete für GENAU DIESE eSIM. Der Anbieter wird aus der `id` ermittelt und entsprechend gefiltert. `/v1` zeigt nirgends `provider_id`; der Server verhindert damit strukturell die Wahl eines Pakets eines anderen Anbieters. Ein nicht gelisteter Code bei `POST /v1/esims/{id}/change-plan` führt zu `409 esim.topup_provider_mismatch`.\n\nOhne zugeordneten Anbieter (reiner Import oder fehlende Quelldaten) wird korrekt eine leere Liste (`total: 0`) zurückgegeben, kein Fehler.",
        "operationId": "get_esims__id__plan-options",
        "parameters": [
          {
            "description": "Stabile ID einer verkauften eSIM, nicht die wiederverwendbare ICCID.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Datensätze pro Seite. Standard 50, höchstens 200. Höhere Werte werden ohne Fehler auf 200 begrenzt.",
            "in": "query",
            "name": "page_size",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Nächster Cursor: Senden Sie `next_cursor` unverändert zurück. Ein ungültiger Cursor beginnt ohne Fehler am Listenanfang, damit Änderungen der Codierung Integrationen nicht brechen. Prüfen Sie, ob der Cursor wechselt, um Endlosschleifen auf Seite eins zu vermeiden.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanOptionsResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.not_found`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Gültige Aufladepakete für diese eSIM",
        "tags": [
          "esims"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/esims/{id}/refund-requests": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:read`.\n\nNur freigeschaltete Live-Mitgliederschlüssel. Liefert bis zu 50 aktuelle Anträge für die eigene eSIM, neueste zuerst; next_cursor und total sind null. has_open_request zeigt eine offene Prüfung an. Organisations- und Testschlüssel erhalten capability.not_supported.",
        "operationId": "get_esims__id__refund-requests",
        "parameters": [
          {
            "description": "Stabile ID einer verkauften eSIM, nicht die wiederverwendbare ICCID.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberRefundRequestListResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.not_found`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `capability.not_supported`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Verlauf der eSIM-Erstattungsanträge (nur Mitglieder)",
        "tags": [
          "esims"
        ],
        "x-tke-modes": [
          "live"
        ],
        "x-tke-owner-types": [
          "member"
        ]
      },
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:write`.\n\nNur freigeschaltete Live-Mitgliederschlüssel. Einen Erstattungsantrag für die eigene eSIM mit Idempotency-Key senden; Geld wird erst nach Freigabe übertragen. Organisations- und Testschlüssel erhalten capability.not_supported. Im Testmodus übt die eSIM-Stornierung eine Erstattung ins virtuelle Wallet.",
        "operationId": "post_esims__id__refund-requests",
        "parameters": [
          {
            "description": "Stabile ID einer verkauften eSIM, nicht die wiederverwendbare ICCID.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Vom Client erzeugte Zeichenfolge: Gleicher Schlüssel und gleicher Body werden einmal ausgeführt; Wiederholungen liefern das erste Ergebnis. Gilt je `api_key_id` (§11): zwei Schlüssel sind getrennte Befehle.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemberRefundRequestInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberRefundRequestResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`, `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.not_found`"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `esim.refund_not_eligible`, `esim.refund_request_pending`, `idempotency.conflict`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `capability.not_supported`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "eSIM-Erstattungsantrag erstellen (nur Mitglieder)",
        "tags": [
          "esims"
        ],
        "x-tke-modes": [
          "live"
        ],
        "x-tke-owner-types": [
          "member"
        ]
      }
    },
    "/v1/esims/{id}/usage": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:read`.\n\nLiest das verbrauchte und verbleibende Datenvolumen einer eSIM samt Zeitstempel `updated_at` der Werte (tatsächliche Aktualität). Bei einer eSIM eines Anbieters, der nur auf Anfrage abgefragt wird (derzeit SkyFi), stellt dieser Aufruf einen Scan in die Warteschlange und WARTET bis zu etwa 15 Sekunden auf das Ergebnis; die Antwort kann daher bis zu ~15 Sekunden dauern, und die Werte stammen aus dem soeben beendeten Scan. Schlägt der Scan fehl, liegt der letzte Scan derselben eSIM weniger als 15 Sekunden zurück oder läuft die Wartezeit ab, wird KEIN Fehler zurückgegeben: Es werden die zuletzt gespeicherten Werte geliefert, prüfen Sie `updated_at`. Andere Anbieter liefern gespeicherte Werte, die regelmäßig aktualisiert werden.",
        "operationId": "get_esims__id__usage",
        "parameters": [
          {
            "description": "Stabile ID einer verkauften eSIM, nicht die wiederverwendbare ICCID.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EsimUsage"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `capability.not_supported`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Verbrauchte Daten",
        "tags": [
          "esims"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/orders": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `orders:read`.",
        "operationId": "get_orders",
        "parameters": [
          {
            "description": "Datensätze pro Seite. Standard 50, höchstens 200. Höhere Werte werden ohne Fehler auf 200 begrenzt.",
            "in": "query",
            "name": "page_size",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Nach Bestellstatus filtern. Werte außerhalb der Liste führen zu `internal.invalid_filter` (400).",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "enum": [
                "completed",
                "pending_provider",
                "provider_failed",
                "cancelled"
              ],
              "type": "string"
            }
          },
          {
            "description": "Nach der beim Bestellabschluss gesendeten Referenz filtern (EXAKTE Übereinstimmung).",
            "in": "query",
            "name": "external_ref",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "ISO-8601 UTC. Liefert alle Datensätze mit `updated_at >= updated_since` in aufsteigender Reihenfolge. Dies ist der Standardweg für ABFRAGEBASIERTEN ABGLEICH (§8.5), auch bei verpassten Webhooks. Falsches Format: `internal.invalid_filter` (400).",
            "in": "query",
            "name": "updated_since",
            "required": false,
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Nächster Cursor: Senden Sie `next_cursor` unverändert zurück. Ein ungültiger Cursor beginnt ohne Fehler am Listenanfang, damit Änderungen der Codierung Integrationen nicht brechen. Prüfen Sie, ob der Cursor wechselt, um Endlosschleifen auf Seite eins zu vermeiden.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderListResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`, `internal.invalid_filter`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Bestellungen auflisten (abfragebasierter Abgleich)",
        "tags": [
          "orders"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      },
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `orders:write`.",
        "operationId": "post_orders",
        "parameters": [
          {
            "description": "Vom Client erzeugte Zeichenfolge: Gleicher Schlüssel und gleicher Body werden einmal ausgeführt; Wiederholungen liefern das erste Ergebnis. Gilt je `api_key_id` (§11): zwei Schlüssel sind getrennte Befehle.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderResponse"
                }
              }
            },
            "description": "Wiederholung innerhalb von 24 Stunden mit gleichem `Idempotency-Key` und Body: IDENTISCHER Body, keine zweite Abbuchung, Header `Idempotent-Replayed: true`. Eine neue Ausführung liefert `201`; erkennen Sie Erfolg nicht nur an diesem Status."
          },
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`, `internal.invalid_filter`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `wallet.insufficient_balance`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.package_not_visible`"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `esim.out_of_stock`, `idempotency.conflict`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `invoice.buyer_invalid`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Bestellung erstellen (Direktkauf)",
        "tags": [
          "orders"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/orders/bulk": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `orders:write`.\n\nMehrzeilige Bestellung: Jede Zeile erzeugt eine unabhängige Bestellung mit quote→commit wie `POST /v1/orders`.\n\nTEILERFOLG: Fehler einer Zeile blockieren andere nicht; nur erfolgreiche Zeilen werden belastet. Fachliche Fehler (ausverkauft, Guthabenmangel, nicht kaufbares Paket, Missbrauchsgrenze) stehen in `lines[].error`, ohne den HTTP-Status des Auftrags zu ändern. Nach Guthabenerschöpfung werden weitere Zeilen trotzdem versucht, da günstigere noch bezahlbar sein können.\n\nStatus immer `200`: gemischte Zeilenergebnisse statt einer neu angelegten Einzelressource (`201`); vollständige Verarbeitung innerhalb der Anfrage, kein `202` mit Polling.\n\nGLEICHER `Idempotency-Key` und GLEICHER Body laden den bestehenden Auftrag, liefern fertige Ergebnisse und verarbeiten nur `pending`-Zeilen weiter, ohne Doppelbelastung. Wurde keine Zeile ausgeführt, gilt `Idempotent-Replayed: true`. Gleicher Schlüssel mit anderem Body: `idempotency.conflict`.\n\nZwei inhaltlich identische Aufträge derselben Organisation innerhalb von 10 Minuten gelten auch mit unterschiedlichen Schlüsseln als versehentliches Duplikat: alter Auftrag mit `Idempotent-Replayed: true`, keine erneute Belastung. Für einen echten identischen Neukauf `external_ref` ändern. Es gehört zum signierten Inhalt und unterscheidet die Aufträge auch für den Abgleich. Vollständig fehlgeschlagene Aufträge (keine Bestellung erstellt) werden nie gesperrt; nach 10 Minuten ist eine neue identische Bestellung wieder möglich.\n\nZeilenreferenzen erscheinen in `lines[].external_ref`, die Auftragsreferenz oben in der Antwort.\n\nKein LPA/QR in der Antwort; je Bestellung `GET /v1/orders/{order_id}` abrufen.",
        "operationId": "post_orders_bulk",
        "parameters": [
          {
            "description": "Vom Client erzeugte Zeichenfolge: Gleicher Schlüssel und gleicher Body werden einmal ausgeführt; Wiederholungen liefern das erste Ergebnis. Gilt je `api_key_id` (§11): zwei Schlüssel sind getrennte Befehle.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkBatchResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.package_not_visible`"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `idempotency.conflict`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.limit_exceeded`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Mehrzeiligen Auftrag ausführen (eine Bestellung pro Zeile)",
        "tags": [
          "orders"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      }
    },
    "/v1/orders/bulk/{id}": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `orders:read`.\n\nErgebnisse je Zeile eines bereits abgesendeten Auftrags erneut lesen, um eine verlorene Antwort ohne erneutes Senden des Bodys wiederherzustellen. Aufträge anderer Organisationen oder Umgebungen (Live/Test) führen zu `404`.",
        "operationId": "get_orders_bulk__id_",
        "parameters": [
          {
            "description": "Von POST /v1/orders/bulk zurückgegebene Auftrags-ID (UUID).",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkBatchResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.not_found`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Ergebnis einer Sammelbestellung",
        "tags": [
          "orders"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      }
    },
    "/v1/orders/{id}": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `orders:read`.",
        "operationId": "get_orders__id_",
        "parameters": [
          {
            "description": "Bestell-ID (UUID).",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Kommagetrennte Zusatzblöcke: `lpa` liefert `install`, `qr` zusätzlich `install.qr_code_base64` (nur Details). **DIE CODEAUSGABE IST OFFENLEGUNG** und beendet die Stornierbarkeit jeder betroffenen eSIM dauerhaft (`cancellable.allowed = false`, `reason = code_disclosed`). Fordern Sie den Code erst zur Lieferung an. Unbekannter Wert: `internal.invalid_filter` (400, `field: \"include\"`).",
            "in": "query",
            "name": "include",
            "required": false,
            "schema": {
              "example": "lpa",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`, `internal.invalid_filter`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.not_found`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Bestelldetails und eSIMs",
        "tags": [
          "orders"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/orders/{id}/resend": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `orders:write`.",
        "operationId": "post_orders__id__resend",
        "parameters": [
          {
            "description": "Bestell-ID (UUID).",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResendResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `order.not_deliverable`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "E-Mail bzw. QR-Code der Bestellung erneut senden",
        "tags": [
          "orders"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/testmode/esims/{id}/simulate": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:write`.\n\nNur Testschlüssel tke_test_ oder tke_member_test_. Ein Szenario auf die eigene Test-eSIM anwenden: Verbrauch, Installation, Ablauf, Drosselung oder simulierte Ablehnung des nächsten Vorgangs. Der Body benötigt mindestens ein Feld; leer ergibt 422 testmode.invalid_scenario. Ergebnisse über GET /v1/esims/{id} und /usage wie im Live-Modus lesen. Tarifwechsel- und Stornoregeln werden gemeinsam genutzt; kein echter Lieferant wird aufgerufen.",
        "operationId": "post_testmode_esims__id__simulate",
        "parameters": [
          {
            "description": "Stabile ID einer verkauften eSIM, nicht die wiederverwendbare ICCID.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestModeSimulateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestModeEsimState"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`, `testmode.live_key_forbidden`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.not_found`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `testmode.invalid_scenario`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Lebenszyklus einer Test-eSIM simulieren (nur Testschlüssel)",
        "tags": [
          "testmode"
        ],
        "x-tke-modes": [
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/testmode/reset": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `orders:write`.",
        "operationId": "post_testmode_reset",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestModeResetInput"
              }
            }
          },
          "required": false
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestModeReset"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`, `testmode.live_key_forbidden`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Testdaten zurücksetzen (nur Testschlüssel)",
        "tags": [
          "testmode"
        ],
        "x-tke-idempotency-owner-types": [
          "member"
        ],
        "x-tke-modes": [
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ],
        "x-tke-required-body-owner-types": [
          "member"
        ]
      }
    },
    "/v1/testmode/seed": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `orders:write`.",
        "operationId": "post_testmode_seed",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestModeSeed"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`, `testmode.live_key_forbidden`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `testmode.no_sellable_package`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Beispieldaten im Testmodus anlegen (nur Testschlüssel)",
        "tags": [
          "testmode"
        ],
        "x-tke-idempotency-owner-types": [
          "member"
        ],
        "x-tke-modes": [
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/testmode/status": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `esims:read`.",
        "operationId": "get_testmode_status",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestModeStatus"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`, `testmode.live_key_forbidden`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Testmodus-Übersicht (nur Testschlüssel)",
        "tags": [
          "testmode"
        ],
        "x-tke-modes": [
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/testmode/webhooks/fail-next": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.",
        "operationId": "post_testmode_webhooks_fail-next",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestModeFailNextRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestModeFailNextResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`, `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`, `testmode.live_key_forbidden`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.not_found`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Nächsten Webhook-Fehler simulieren (nur Testschlüssel)",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      }
    },
    "/v1/testmode/webhooks/fire": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.",
        "operationId": "post_testmode_webhooks_fire",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestModeWebhookFireRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SimulateResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`, `testmode.live_key_forbidden`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.not_configured`, `internal.not_found`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Test-Webhook-Ereignis senden (nur Testschlüssel)",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      }
    },
    "/v1/wallet/balance": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `wallet:read`.",
        "operationId": "get_wallet_balance",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletBalance"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Wallet-Guthaben",
        "tags": [
          "wallet"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization",
          "member"
        ]
      }
    },
    "/v1/webhooks": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.\n\nNur Endpoints des aufrufenden Schlüssels. Kein Schlüssel sieht den Endpoint eines anderen, auch nicht innerhalb derselben Organisation (§5.11: Bindung an `api_key_id`, keine gemeinsame Nutzung durch Live und Test).\n\nNoch nicht eingerichtet: `200` mit leerem Array, kein `404`. Die Sammlung existiert immer, auch ohne Einträge.",
        "operationId": "get_webhooks",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookListResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Webhook-Endpunkte auflisten",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      },
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.\n\nEndpoint für den aufrufenden Schlüssel erstellen. Vor dem Speichern sendet der Server ein signiertes POST-`ping` an die URL (CHECK_HEALTH). Ohne 2xx wird nichts gespeichert: `422 webhook.health_check_failed`. Nur öffentliche `https`-URLs; interne oder Metadaten-IP: `422 webhook.url_not_allowed`.\n\n`webhook_secret` wird GENAU EINMAL angezeigt und kann nicht erneut gelesen werden. Bei Verlust im Dashboard rotieren; das alte Geheimnis bleibt 24 Stunden parallel gültig (§8.4).\n\nExistiert bereits ein Endpoint, gilt `409 webhook.already_configured`, auch bei Pause (`is_active: false`). Pause erhält URL, Geheimnis und Protokoll. Für einen Neustart erst `DELETE /v1/webhooks/{id}`, dann neu erstellen.",
        "operationId": "post_webhooks",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateWebhookResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.already_configured`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.health_check_failed`, `webhook.url_not_allowed`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Webhook-Endpunkt erstellen",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      }
    },
    "/v1/webhooks/deliveries": {
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.",
        "operationId": "get_webhooks_deliveries",
        "parameters": [
          {
            "description": "Seitennummer ab 1. Hinter dem Datenende: `items: []` und das echte `total` (200, kein 404).",
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "default": 1,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Datensätze pro Seite. Standard 50, höchstens 200. Höhere Werte werden ohne Fehler auf 200 begrenzt.",
            "in": "query",
            "name": "page_size",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Nach Ereignistyp filtern (siehe Webhook-Ereigniskatalog).",
            "in": "query",
            "name": "event_type",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Nach Zustellstatus filtern. `?status=failed` dient dem abfragebasierten Webhook-Abgleich (§13). Unbekannte Werte werden ohne Fehler IGNORIERT; das vollständige Protokoll wird zurückgegeben.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "enum": [
                "pending",
                "delivered",
                "failed"
              ],
              "type": "string"
            }
          },
          {
            "description": "Alle Zustellversuche eines Ereignisses, einschließlich Wiederholungen.",
            "in": "query",
            "name": "event_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeliveryListResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.not_configured`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Webhook-Zustellprotokoll",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      }
    },
    "/v1/webhooks/deliveries/{id}/replay": {
      "post": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.",
        "operationId": "post_webhooks_deliveries__id__replay",
        "parameters": [
          {
            "description": "ID einer Webhook-Zustellung (`items[].id` aus `GET /v1/webhooks/deliveries`).",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeliveryReplayResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.delivery_not_found`, `webhook.not_configured`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Webhook erneut senden",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      }
    },
    "/v1/webhooks/{id}": {
      "delete": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.\n\nDas Entfernen des Endpoints beendet neue Ereignisse für den aufrufenden Schlüssel.\n\nDas `webhook_secret` geht mit dem Endpoint verloren. Neuanlage mit `POST /v1/webhooks` erzeugt NEUE `id` und NEUES Geheimnis; die Verifikation muss angepasst werden. Für vorübergehende Unterbrechung bei gleichem Geheimnis Pause im Dashboard verwenden.\n\nDas vollständige Zustellprotokoll bleibt zum Abgleich erhalten, die Einträge des entfernten Endpoints können aber nicht erneut gesendet werden.\n\nAuf Wiederholung wartende `pending`-Zustellungen enden mit `endpoint_disabled` und bleiben im Protokoll (§8.5).\n\nFremde oder bereits entfernte `id`: `404 webhook.not_found`, niemals stilles 200.",
        "operationId": "delete_webhooks__id_",
        "parameters": [
          {
            "description": "Webhook-Endpunkt-ID (`id` aus `POST /v1/webhooks` oder `GET /v1/webhooks`).",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteWebhookResponse"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.not_found`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Webhook-Endpunkt entfernen (keine neuen Ereignisse mehr empfangen)",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      },
      "get": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.",
        "operationId": "get_webhooks__id_",
        "parameters": [
          {
            "description": "Webhook-Endpunkt-ID (`id` aus `POST /v1/webhooks` oder `GET /v1/webhooks`).",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookConfig"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.not_found`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Einen Webhook-Endpunkt abrufen",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      },
      "put": {
        "description": "Erforderlicher Berechtigungsbereich: `webhook:manage`.",
        "operationId": "put_webhooks__id_",
        "parameters": [
          {
            "description": "Webhook-Endpunkt-ID (`id` aus `POST /v1/webhooks` oder `GET /v1/webhooks`).",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookConfig"
                }
              }
            },
            "description": "Erfolg"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `internal.validation_failed`"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.invalid_key`, `partner.invalid_signature`, `partner.timestamp_expired`, `partner.nonce_reused`"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.ip_not_allowed`, `partner.scope_denied`, `partner.key_suspended`, `partner.key_revoked`, `org.suspended`"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.not_found`"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `webhook.health_check_failed`, `webhook.url_not_allowed`"
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.rate_limited`"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Fehler: `partner.endpoint_disabled`, `internal.service_unavailable`"
          }
        },
        "summary": "Webhook-Endpunkt aktualisieren",
        "tags": [
          "webhook"
        ],
        "x-tke-modes": [
          "live",
          "test"
        ],
        "x-tke-owner-types": [
          "organization"
        ]
      }
    }
  },
  "security": [
    {
      "TkeHmac": []
    }
  ],
  "servers": [
    {
      "description": "Live",
      "url": "https://api.tongkhoesim.com"
    },
    {
      "description": "Testmodus",
      "url": "https://api-testing.tongkhoesim.com"
    }
  ],
  "tags": [
    {
      "description": "Paketkatalog mit EINER Oberfläche für beide Versorgungssysteme. Das System ist ein FELD (`market`: `domestic` | `international`) und Filter (`?market=`), nicht zwei getrennte Pfade.\n\nKEINE Bestandsangaben: keine Menge oder Stufe `available`/`low`/`out_of_stock`. Pakete erscheinen einfach; bei fehlender Lieferfähigkeit liefert `POST /v1/orders` einen klaren Fehler (`esim.out_of_stock`…), statt vorab im Katalog zu warnen.\n\nEinheitliche Cursor-Paginierung. `total` nur bei günstigem Zählen (Filter auf Inland), sonst `null`.",
      "name": "catalog"
    },
    {
      "description": "Bestellungen aufgeben und abgleichen",
      "name": "orders"
    },
    {
      "description": "eSIM-Datensätze, Verbrauch, Aufladung und Stornierung",
      "name": "esims"
    },
    {
      "description": "Wallet-Guthaben",
      "name": "wallet"
    },
    {
      "description": "Webhook-Konfiguration, Zustellprotokoll und Simulator",
      "name": "webhook"
    },
    {
      "description": "Nur Testschlüssel tke_test_ oder tke_member_test_ auf api-testing verwenden. Eigene Test-eSIMs und Daten ohne echtes Guthaben oder Lieferanten simulieren. Der Mitgliedertestmodus unterstützt keine Webhooks, Sammelbestellungen oder Rückerstattungsanträge zur Prüfung.",
      "name": "testmode"
    }
  ]
}
